Better Google

Don't be evil

目前为 2021-02-26 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Better Google
  3. // @namespace google
  4. // @version 0.1.16.2
  5. // @description Don't be evil
  6. // @author aligo, adambh, tejaslodaya, drwonky
  7. // @license MIT
  8. // @supportURL https://github.com/aligo/better-google
  9. // @match https://*.google.com/search?*
  10. // @include /^https?://(?:www|encrypted|ipv[46])\.google\.[^/]+/(?:$|[#?]|search|webhp)/
  11. // @grant none
  12. // @run-at document-start
  13. // ==/UserScript==
  14.  
  15. (function() {
  16. 'use strict';
  17.  
  18. var betterGoogleRow = function(el) {
  19. var tbwUpd = el.querySelectorAll('.TbwUpd');
  20. if (tbwUpd.length > 0) {
  21. var linkEl = el.querySelector('.yuRUbf > a');
  22. var addEl = linkEl.nextSibling;
  23.  
  24. var betterAddEl = document.createElement('div');
  25. betterAddEl.className = 'btrAdd';
  26.  
  27. if (addEl) {
  28. for (var i = 0; i < addEl.children.length; i++) {
  29. var _el = addEl.children[i];
  30. if (_el.className.indexOf('TbwUpd') == -1) {
  31. betterAddEl.appendChild(_el);
  32. }
  33. }
  34. }
  35.  
  36. var betterEl = document.createElement('div');
  37. betterEl.className = 'btrG';
  38. betterEl.appendChild(betterAddEl);
  39.  
  40. el.appendChild(betterEl);
  41.  
  42. var urlEl = document.createElement('a');
  43. urlEl.href = linkEl.href;
  44. urlEl.target = '_blank';
  45. urlEl.className = 'btrLink';
  46.  
  47. var urlCiteEl = document.createElement('cite');
  48. urlCiteEl.innerText = linkEl.href;
  49. urlCiteEl.className = 'iUh30 bc';
  50. urlEl.appendChild(urlCiteEl);
  51.  
  52.  
  53. var maxWidth = el.clientWidth - betterAddEl.offsetWidth - 10;
  54.  
  55. betterEl.insertBefore(urlEl, betterAddEl);
  56. if (urlEl.offsetWidth > maxWidth) {
  57. urlEl.style.width = maxWidth.toString() + 'px';
  58. }
  59.  
  60. var aboutResult = el.querySelectorAll('.csDOgf');
  61. if (aboutResult.length > 0) {
  62. betterEl.appendChild(aboutResult[0]);
  63. }
  64. tbwUpd.forEach(function(el) { el.remove() });
  65. linkEl.querySelector('br:first-child').remove();
  66. }
  67. }
  68.  
  69. var prevResultCount = 0;
  70. var bettered = false;
  71.  
  72. var runBetterGoogle = function() {
  73. if (prevResultCount != document.querySelectorAll('.g .yuRUbf').length) {
  74. document.querySelectorAll('.g .yuRUbf').forEach(betterGoogleRow);
  75. prevResultCount = document.querySelectorAll('.g .yuRUbf').length;
  76. }
  77. if ( !bettered ) {
  78. if ( MutationObserver != undefined ) {
  79. var searchEl = document.getElementById('rcnt');
  80. var observer = new MutationObserver(runBetterGoogle);
  81. observer.observe(searchEl, {childList: true, subtree: true});
  82. }
  83. bettered = true;
  84. }
  85. };
  86.  
  87. var prepareStyleSheet = function() {
  88. var style = document.createElement('style');
  89. style.setAttribute('media', 'screen');
  90. style.appendChild(document.createTextNode(''));
  91. document.head.appendChild(style);
  92. style.sheet.insertRule('.btrG { word-break: break-all; line-height: 18px; }');
  93. style.sheet.insertRule('.btrG .btrAdd { display: inline-block; vertical-align: top; }');
  94. style.sheet.insertRule('.btrG .btrLink { display: inline-block; vertical-align: top; line-height: 18px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-decoration: none !important; }');
  95. style.sheet.insertRule('.btrG .btrLink cite.iUh30 { color: #006621; font-size: 16px; }');
  96. };
  97.  
  98. var checkElementThenRun = function(selector, func) {
  99. var el = document.querySelector(selector);
  100. if ( el == null ) {
  101. if (window.requestAnimationFrame != undefined) {
  102. window.requestAnimationFrame(function(){ checkElementThenRun(selector, func)});
  103. } else {
  104. document.addEventListener('readystatechange', function(e) {
  105. if (document.readyState == 'complete') {
  106. func();
  107. }
  108. });
  109. }
  110. } else {
  111. func();
  112. }
  113. }
  114.  
  115. checkElementThenRun('head', prepareStyleSheet);
  116. checkElementThenRun('#rcnt', runBetterGoogle);
  117. })();