Greasy Fork 还支持 简体中文。

Google Search Various Ranges

Add more time ranges on Google search.

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

  1. // ==UserScript==
  2. // @name Google Search Various Ranges
  3. // @namespace knoa.jp
  4. // @description Add more time ranges on Google search.
  5. // @description Google検索の期間指定の選択肢を増やします。
  6. // @include https://www.google.*/search?*
  7. // @version 1.1
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. (function(){
  12. const SCRIPTNAME = 'GoogleSearchVariousRanges';
  13. console.time(SCRIPTNAME);
  14. const LANGS = {
  15. 'en': 0,
  16. 'ja': 1,
  17. };
  18. const RANGES = {
  19. qdr_h: {
  20. h: ['Past hour', '1 時間以内'],
  21. h2: ['Past 2 hours', '2 時間以内'],
  22. h12:['Past 12 hours','12 時間以内'],
  23. },
  24. qdr_d: {
  25. d: ['Past day', '1 日以内'],
  26. d2: ['Past 2 days', '2 日以内'],
  27. d3: ['Past 3 days', '3 日以内'],
  28. },
  29. qdr_w: {
  30. w: ['Past week', '1 週間以内'],
  31. w2: ['Past 2 weeks', '2 週間以内'],
  32. },
  33. qdr_m: {
  34. m: ['Past month', '1 か月以内'],
  35. m2: ['Past 2 months', '2 か月以内'],
  36. m6: ['Past 6 months', '6 か月以内'],
  37. },
  38. qdr_y: {
  39. y: ['Past year', '1 年以内'],
  40. y2: ['Past 2 years', '2 年以内'],
  41. y5: ['Past 5 years', '5 年以内'],
  42. },
  43. };
  44. const PERIODS = {
  45. // 'Before 2000': ['', '12/31/1999'],
  46. // 'After 2000': ['1/1/2000', ''],
  47. };
  48. window.addEventListener('load', setTimeout.bind(null, function(){
  49. /* Rebuild Ranges */
  50. let lang = document.documentElement.lang;
  51. let lindex = (lang in LANGS) ? LANGS[lang] : LANGS[lang.split('-')[0]] || 0;
  52. let lis = document.querySelectorAll('#hdtb li[id^="qdr_"]');
  53. let tpl = document.querySelector('#hdtb li[id^="qdr_"] a[href*="qdr:"]');
  54. for(let i=1; lis[i]; i++){
  55. if(RANGES[lis[i].id]){
  56. lis[i].innerHTML = '';
  57. for(let range in RANGES[lis[i].id]){
  58. let node = tpl.cloneNode(true);
  59. node.href = node.href.replace(/(qdr:)[a-z][0-9]*/, '$1' + range);
  60. node.textContent = RANGES[lis[i].id][range][lindex];
  61. lis[i].appendChild(node);
  62. }
  63. }else{
  64. lis[i].style.display = 'none';
  65. }
  66. }
  67. /* Add Custom Periods */
  68. let cdr = document.querySelector('#cdrlnk');
  69. for(let key in PERIODS){
  70. let node = tpl.cloneNode(true);
  71. node.href = node.href.replace(/(qdr:)[a-z][0-9]*/, `cdr:1,cd_min:${PERIODS[key][0]},cd_max:${PERIODS[key][1]}`);
  72. node.textContent = key;
  73. cdr.parentNode.appendChild(node);
  74. }
  75. /* Selected Checkmark */
  76. let sel = document.querySelector('#hdtb li[id*="dr_"].hdtbSel');
  77. if(!sel || sel.id === 'qdr_'/*Any time*/) return;
  78. let a, cdruri = location.href.match(/cdr:1,cd_min:[0-9\/]*,cd_max:[0-9\/]*/);
  79. if(cdruri){/*has period*/
  80. a = document.querySelector(`#hdtb li[id^="cdr_"] a[href*="${cdruri[0]}"]`);
  81. }else{
  82. let qdr = sel.id.split('_')[1];
  83. a = document.querySelector(`#hdtb li[id^="qdr_"] a[href*="qdr:${qdr}&"]`);
  84. }
  85. if(a){
  86. a.classList.add('hdtbSel');
  87. sel.classList.remove('hdtbSel');
  88. }
  89. }, 100));
  90. (function(css){
  91. let head = document.querySelector('head');
  92. let style = document.createElement('style');
  93. style.type = 'text/css';
  94. style.textContent = css;
  95. head.appendChild(style);
  96. })(`
  97. #hdtb li[id^="qdr_"].hdtbItm a,
  98. #hdtb li[id^="cdr_"].hdtbItm a{
  99. display: inline-block !important;
  100. width: 80px !important;
  101. padding-right: 20px !important;
  102. }
  103. `);
  104. const log = console.log.bind(null, SCRIPTNAME);
  105. console.timeEnd(SCRIPTNAME);
  106. })();