Google Search restore URLs (undo breadcrumbs)

Brings back the full URLs in results.

  1. // ==UserScript==
  2. // @name Google Search restore URLs (undo breadcrumbs)
  3. // @namespace https://gf.qytechs.cn/en/users/27283-mutationobserver
  4. // @version 2023.02.21v15
  5. // @description Brings back the full URLs in results.
  6. // @author MutationObserver
  7. // @match https://*.google.com/search?*
  8. // @include /^https?://(?:www|encrypted|ipv[46])\.google\.[^/]+/(?:$|[#?]|search|webhp)/
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. if (navigator.userAgent.includes("Firefox/")) document.body.classList.add("url-restore-userscript-FIREFOX");
  13. if (document.querySelector('#rso img[src^="data:"][style*=width]')) document.body.classList.add("url-restore-userscript-2023q1");
  14.  
  15. restoreURLs();
  16.  
  17. function restoreURLs() {
  18. var results = document.querySelectorAll(".g");
  19. if (!results) {
  20. var results = document.querySelectorAll(".r");
  21. if (!results) return;
  22. }
  23. var linkFontSize;
  24. var originalWidths = [];
  25. var originalHeights_link = [];
  26. for (i=0; i < results.length; i++) {
  27. try {
  28. if (results[i].querySelector(".g a")) {
  29. var link = results[i].querySelector(".g a").getAttribute("href");
  30. }
  31. else {
  32. var link = results[i].querySelector(".rc a").getAttribute("href");
  33. }
  34.  
  35. // Find options dropdown
  36. var dropdownArrow = results[i].querySelector('[aria-label="Result Options"]');
  37. if (dropdownArrow) {
  38. dropdownArrow.parentElement.parentElement.parentElement.classList.add("url-restore-userscript-dropdownArrow");
  39. }
  40. // Calculate max dimensions
  41. var linkElems = results[i].querySelectorAll("cite");
  42. var oldWidth = results[i].offsetWidth;
  43. var oldHeight_link = linkElems[0].offsetHeight;
  44. // Start replacing breadcrumbs
  45. var linkElem = linkElems[0];
  46. linkElems.forEach(function(e) {
  47. e.innerHTML = link;
  48. });
  49. linkElem.innerHTML = link;
  50. if (!linkFontSize) linkFontSize = window.getComputedStyle(linkElem, null).getPropertyValue('font-size');
  51. linkElem.setAttribute("data-full-link", link);
  52. // Fit to max dimensions
  53. var currentWidth = linkElem.offsetWidth;
  54. var currentHeight_link = linkElem.offsetHeight;
  55. if ( (currentWidth > oldWidth) || (currentHeight_link > oldHeight_link) ) {
  56. var link_truncated = urlTruncate(linkElem.innerHTML)
  57. linkElems.forEach(function(e) {
  58. e.innerHTML = link_truncated;
  59. e.setAttribute("data-trunc-link", link_truncated);
  60. e.parentElement.setAttribute("onmouseover", 'linkTruncationState(this, "off")');
  61. e.parentElement.setAttribute("onmouseout", 'linkTruncationState(this, "on")');
  62. e.classList.add("url-restore-userscript-truncated");
  63. });
  64. results[i].classList.add("url-restore-userscript-truncated");
  65. }
  66. }
  67. catch(e){ console.log("Google Search restore URLs: skipped result #" + i); continue; }
  68. }
  69. document.querySelector("body").insertAdjacentHTML("afterbegin", `
  70. <style id="url-restore-userscript">
  71. .url-restore-userscript-HOVER .url-restore-userscript-dropdownArrow {
  72. position: absolute;
  73. }
  74.  
  75. cite[data-full-link] { color: green; }
  76. .url-restore-userscript-HOVER cite { background: white; }
  77. /* Firefox workaround (issue: some link <cites> are half-width) */
  78. .url-restore-userscript-FIREFOX .url-restore-userscript-dropdownArrow {
  79. position: absolute;
  80. right: -2em;
  81. }
  82. .url-restore-userscript-FIREFOX cite {
  83. display: inline-block;
  84. width: max-content;
  85. }
  86. .url-restore-userscript-2023q1 cite { max-width: unset!important; }
  87. .url-restore-userscript-2023q1 #rso a[data-ved] > div > span { margin-right: 2px; }
  88. </style>
  89. `);
  90. }
  91.  
  92. function urlTruncate(url) {
  93. return url.substr(0, 37) + '...' + url.substr(url.length-37, url.length);
  94. }
  95.  
  96. window.linkTruncationState = function(elem, state) {
  97. elems = elem.parentElement.parentElement.querySelectorAll("cite");
  98. switch(state) {
  99. case "off":
  100. var linkFull = elems[0].getAttribute("data-full-link");
  101. elems.forEach(function(e) {
  102. e.innerHTML = linkFull;
  103. });
  104. break;
  105. case "on":
  106. elems.forEach(function(e) {
  107. e.innerHTML = e.getAttribute("data-trunc-link");
  108. });
  109. break;
  110. }
  111. elems[0].parentElement.parentElement.parentElement.classList.toggle("url-restore-userscript-HOVER");
  112. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址