Google Search Extra Buttons

Add buttons (last 1/2/3 days, weeks, PDF search etc.) to results of search page of Google

目前為 2015-09-09 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name Google Search Extra Buttons
  3. // @name:ru GoogleSearchExtraButtons
  4. // @description Add buttons (last 1/2/3 days, weeks, PDF search etc.) to results of search page of Google
  5. // @description:ru Кнопки вариантов поиска для результатов Google (1-2-3 дня, недели, PDF, ...)
  6. // @version 5.2015.9.9
  7. // @namespace spmbt.github.com
  8. // @include http://www.google.*/*
  9. // @include https://www.google.*/*
  10. // ==/UserScript==
  11.  
  12. (function(lang, yourSite){
  13.  
  14. if(!(yourSite instanceof Array)) yourSite = [yourSite];
  15. var $x = function(el, h){if(h) for(var i in h) el[i] = h[i]; return el;} //===extend===
  16. ,$pd = function(ev){ev.preventDefault();}
  17. ,d = document
  18. ,$e = function(g){ //===create or use existing element=== //g={el|clone,cl,ht,cs,at,atRemove,on,apT}
  19. g.el = g.el || g.clone ||'DIV';
  20. var o = g.o = g.clone && g.clone.cloneNode && g.clone.cloneNode(!0)
  21. || (typeof g.el =='string' ? d.createElement(g.el) : g.el);
  22. if(o){ //execute if exist
  23. if(g.cl)
  24. o.className = g.cl;
  25. if(g.cs)
  26. $x(o.style, g.cs);
  27. if(g.ht || g.at){
  28. var at = g.at ||{}; if(g.ht) at.innerHTML = g.ht;}
  29. if(at)
  30. for(var i in at){
  31. if(i=='innerHTML') o[i] = at[i];
  32. else o.setAttribute(i, at[i]);}
  33. if(g.atRemove)
  34. for(var i in g.atRemove)
  35. o.removeAttribute(g.atRemove[i]);
  36. if(g.on)
  37. for(var i in g.on) if(g.on[i])
  38. o.addEventListener(i, g.on[i],!1);
  39. g.ap && o.appendChild(g.ap);
  40. g.apT && g.apT.appendChild(o);
  41. }
  42. return o;
  43. },
  44. addRules = function(css){
  45. var heads = d.getElementsByTagName('head')
  46. ,node = d.createElement('style');
  47. heads.length && heads[0].appendChild(node);
  48. node.appendChild(d.createTextNode(css));
  49. };
  50. /**
  51. * check occurrence of third-party event with growing interval
  52. * @constructor
  53. * @param{Number} t start period of check
  54. * @param{Number} i number of checks
  55. * @param{Number} m multiplier of period increment
  56. * @param{Function} check event condition
  57. * @param{Function} occur event handler
  58. */
  59. var Tout = function(h){
  60. var th = this;
  61. (function(){
  62. if((h.dat = h.check() )) //wait of positive result, then occurs
  63. h.occur();
  64. else if(h.i-- >0) //next slower step
  65. th.ww = setTimeout(arguments.callee, (h.t *= h.m) );
  66. })();
  67. },
  68. lNull = lang ==null; //if lang == null|undefined, then no hints
  69. lang = lang =='ru'|| !(lang && lang.length && lang.length >1); //hints in ru or en lang
  70. addRules('.siteList:hover button{display: block}' //TODO no effect
  71. +'.gb_Ib >.gb_e{height:47px}.gb_Fb{z-index:1087}.tsf-p{z-index:203}'
  72. +'.lsbb .lsb,.lsbb >.siteList{opacity: 0.64; line-height:14px; width:34px; height:17px; padding:0 2px;'
  73. +'font-size:14px; border:1px solid transparent; background-color:#4485f5; color:#fff}'
  74. +'.lsbb >.siteList{width:32px; height:auto; padding:1px 0 2px; text-align:center}');
  75.  
  76. new Tout({t:120, i:8, m: 1.6
  77. ,check: function(){
  78. return d && d.getElementsByName("q") && d.getElementsByName("q")[0];
  79. },
  80. occur: function(){
  81. var inputSearch = this.dat
  82. ,buttSearch = d.getElementsByName("btnG") && d.getElementsByName("btnG")[0]
  83. ,buttS ={
  84. PDF:['filetype:pdf',lang?'поиск по документам PDF':lNull?'':'search in PDF files']
  85. ,site:['site:'+ yourSite[0],(lang ?'искать по ':lNull?'':'search in ')+ yourSite[0]] //you may comment this line
  86. ,'.. : ..':['',lang?'за период':lNull?'':'from / to']
  87. ,'1D':['&tbs=qdr:d',lang?'за последние сутки':lNull?'':'last day']
  88. ,'2D':['&tbs=qdr:d2',lang?'за последние 2 дня':lNull?'':'last 2 days']
  89. ,'3D':['&tbs=qdr:d3',lang?'за последние 3 дня':lNull?'':'last 3 days']
  90. ,'7D':['&tbs=qdr:w',lang?'за последнюю неделю':lNull?'':'last week']
  91. ,'2W':['&tbs=qdr:w2',lang?'за 2 недели':lNull?'':'last 2 week']
  92. ,'3W':['&tbs=qdr:w3',lang?'за 3 недели':lNull?'':'last 3 week']
  93. ,'1M':['&tbs=qdr:m',lang?'за последний месяц':lNull?'':'last month']
  94. ,'1Y':['&tbs=qdr:y',lang?'за последний год':lNull?'':'last year']
  95. }, j =0, ww =0;
  96. !yourSite && delete buttS.site;
  97. buttSearch.parentNode.style.position ='relative';
  98. if(buttSearch && top == self)
  99. for(var i in buttS)
  100. var bI = buttS[i]
  101. ,butt2 = $e({clone: i=='site'? $e({cl:'siteList',cs:{cursor:'default'}, at:{site: yourSite[0]} }) : buttSearch
  102. ,atRemove:['id','name']
  103. ,at:{value: i
  104. ,innerHTML: i
  105. ,title: bI[1]}
  106. ,cs: {position:'absolute', top:'33px', left: (-132 + 37*j++) +'px'}
  107. ,on:{click: (function(bI,i){return i=='PDF'|| /^site:/.test(bI[0]) ? function(ev){
  108. inputSearch.value = inputSearch.value.replace(/ site\:[\w.]+$/i,'').replace(' filetype:pdf','') +' '+ (i=='PDF'? bI[0] :'site:'+ ev.target.getAttribute('site'));
  109. if(ev.target.className=='siteList') this.form.click();
  110. }: !bI[0] ? function(ev){var el = d.querySelector('#cdrlnk');
  111. if(el){
  112. var evObj = d.createEvent('Events');
  113. evObj.initEvent('click', !0, !1);
  114. el.dispatchEvent(evObj);
  115. }
  116. $pd(ev);}
  117. : function(ev){
  118. location.href ='/search?q='+ encodeURIComponent(inputSearch.value) + bI[0];
  119. $pd(ev);
  120. }})(bI,i),
  121. mouseover: i=='site'? function(ev){clearTimeout(ww); ev.target.querySelector('.list').style.display ='block'}:'',
  122. mouseout: i=='site'? function(ev){var t = ev.target; clearTimeout(ww); ww = setTimeout(function(){t.parentNode.parentNode.querySelector('.list').style.display ='none'},450);}:''
  123. }
  124. ,apT: buttSearch.parentNode
  125. });
  126. var siteList = $e({cl:'list',cs:{display:'none'}, apT: buttSearch.parentNode.querySelector('.siteList')});
  127. if(siteList){
  128. for(var i in yourSite) if(i !=0)
  129. var sI = yourSite[i]
  130. ,butt3 = $e({clone:buttSearch
  131. ,atRemove:['id','name']
  132. ,at:{value: sI
  133. ,site: sI
  134. ,title: (lang ?'искать по ':lNull?'':'search in ')+ sI
  135. ,innerHTML: sI}
  136. ,cs: {display:'block', width:'auto', height:'18px', margin:'2px 0 -1px -16px', padding:0, fontWeight:'normal', opacity:1}
  137. ,apT: siteList
  138. });
  139. siteList.style.height ='auto'; siteList.style.textAlign ='center';}
  140. $e({el:d.querySelector('.gb_Ib > .gb_e'),cs:{height:'47px'}} );
  141. $e({el:d.querySelector('.gb_Fb'),cs:{zIndex:'1087'}} );
  142. $e({el:d.querySelector('.tsf-p'),cs:{zIndex:'203'}} );
  143. }
  144. });
  145.  
  146. })('en' //write '' to remove hints; 'en' for English hints, 'ru' for Russian
  147. ,['slashdot.org','engadget.com','techcrunch.com','habrahabr.ru','geektimes.ru','smashingmagazine.com','maketecheasier.com']); //write your favorite sites