Return Pagination to Google

Makes Google searches break down into separate pages, rather than displaying as one continuous page. (Quick & Dirty)

当前为 2023-06-15 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Return Pagination to Google
  3. // @description Makes Google searches break down into separate pages, rather than displaying as one continuous page. (Quick & Dirty)
  4. // @namespace Violentmonkey Scripts
  5. // @match https://www.google.com/search
  6. // @grant none
  7. // @version 1.3
  8. // @author Jupiter Liar
  9. // @license Attribution CC BY
  10. // @description 6/15/2023, 6:15 PM
  11. // ==/UserScript==
  12.  
  13. // Function to generate links for the page numbers
  14. function generatePageLink(urlWithoutAnchor, startParam, startValue, newStartValue) {
  15. if (newStartValue === 0) {
  16. newStartValue = '0';
  17. }
  18. var linkHref;
  19. if (startIndex === -1) {
  20. linkHref = urlWithoutAnchor + startParam + newStartValue;
  21. } else {
  22. linkHref = urlWithoutAnchor.replace(startParam + startValue, startParam + newStartValue);
  23. }
  24. return linkHref;
  25. }
  26.  
  27. // Check if the page has the required conditions
  28. if (document.getElementById('botstuff') && !document.querySelector('table.AaVjTc')) {
  29. // Create the table element
  30. var table = document.createElement('table');
  31. table.className = 'AaVjTc return-pagination'; // Added 'return-pagination' class to the table
  32. table.style.margin = 'auto';
  33. table.style.marginBottom = '32px';
  34. table.style.scale = '80%';
  35.  
  36. // Create a variable to store the page number
  37. var pageNumber;
  38.  
  39. // Extract the page number from the URL
  40. var startParam = "&start=";
  41. var startIndex = window.location.href.indexOf(startParam);
  42.  
  43. if (startIndex === -1) {
  44. pageNumber = 1;
  45. } else {
  46. var startValue = parseInt(window.location.href.substring(startIndex + startParam.length));
  47. pageNumber = Math.floor(startValue / 10) + 1;
  48. }
  49.  
  50. // Remove the anchor portion from the URL
  51. var urlWithoutAnchor = window.location.href.split("#")[0];
  52.  
  53. // Create the table columns
  54. for (var i = 0; i < 11; i++) {
  55. var column = document.createElement('td');
  56. column.style.textAlign = 'center';
  57. column.style.verticalAlign = 'middle'; // Changed from 'baseline' to 'middle'
  58. column.style.minWidth = '20px';
  59. column.style.fontSize = '20pt';
  60.  
  61. // Add padding to middle columns
  62. if (i > 0 && i < 10) {
  63. column.style.padding = '0 8pt'; // Changed from '0 8px' to '0 8pt'
  64. }
  65.  
  66. // Add padding to previous and next columns
  67. if (i === 0 || i === 10) {
  68. column.style.padding = '0 16pt'; // Changed from '0 16px' to '0 16pt'
  69. }
  70.  
  71. // Add content to the columns
  72. if (i === 0) {
  73. if (pageNumber !== 1) {
  74. var previousLink = document.createElement('a');
  75. previousLink.href = urlWithoutAnchor.replace(startParam + startValue, startParam + (startValue - 10));
  76. var previousSpan = document.createElement('span');
  77. previousSpan.style.padding = '0 16pt'; // Changed from '0 8pt' to '0 16pt'
  78. previousSpan.style.fontSize = '28pt';
  79. previousSpan.style.verticalAlign = 'middle'; // Added vertical-align style
  80. previousSpan.innerText = '<';
  81. previousLink.appendChild(previousSpan);
  82. var previousTextSpan = document.createElement('span');
  83. previousTextSpan.style.verticalAlign = 'middle'; // Added vertical-align style
  84. previousTextSpan.innerText = 'Previous';
  85. previousLink.appendChild(previousTextSpan);
  86. column.appendChild(previousLink);
  87. }
  88. } else if (i === 10) {
  89. var nextLink = document.createElement('a');
  90. var nextStartValue = (pageNumber) * 10;
  91. if (startIndex === -1) {
  92. nextLink.href = urlWithoutAnchor + startParam + nextStartValue;
  93. } else {
  94. nextLink.href = urlWithoutAnchor.replace(startParam + startValue, startParam + nextStartValue);
  95. }
  96. var nextTextSpan = document.createElement('span');
  97. nextTextSpan.style.verticalAlign = 'middle'; // Added vertical-align style
  98. nextTextSpan.innerText = 'Next';
  99. nextLink.appendChild(nextTextSpan);
  100. var nextSpan = document.createElement('span');
  101. nextSpan.style.padding = '0 16pt'; // Changed from '0 8pt' to '0 16pt'
  102. nextSpan.style.fontSize = '28pt';
  103. nextSpan.style.verticalAlign = 'middle'; // Added vertical-align style
  104. nextSpan.innerText = '>';
  105. nextLink.appendChild(nextSpan);
  106. column.appendChild(nextLink);
  107. } else {
  108. // Calculate the page number for the column
  109. var columnNumber;
  110. if (pageNumber < 5) {
  111. columnNumber = i;
  112. } else if (pageNumber >= 5) {
  113. columnNumber = pageNumber - 5 + i;
  114. }
  115.  
  116. if (columnNumber === pageNumber) {
  117. // Add page number without link
  118. column.innerText = columnNumber;
  119. } else {
  120. // Generate links for the page number
  121. var newStartValue = (columnNumber - 1) * 10;
  122. var linkHref = generatePageLink(urlWithoutAnchor, startParam, startValue, newStartValue);
  123.  
  124. // Create the link element
  125. var link = document.createElement('a');
  126. link.href = linkHref;
  127. link.innerText = columnNumber;
  128.  
  129. // Append the link to the column
  130. column.appendChild(link);
  131. }
  132. }
  133.  
  134. // Add class to the column
  135. column.classList.add(`ret-pag-col-${i + 1}`);
  136.  
  137. // Append the column to the table
  138. table.appendChild(column);
  139. }
  140.  
  141. // Check if the first column is empty and delete it
  142. var firstColumn = table.querySelector('td:first-child');
  143. if (firstColumn.innerText === '') {
  144. table.removeChild(firstColumn);
  145. }
  146.  
  147. // Append the table to the 'botstuff' div
  148. var botstuffDiv = document.getElementById('botstuff');
  149. botstuffDiv.appendChild(table);
  150. }
  151.  
  152. // ...
  153.  
  154.  
  155.  
  156. // Check if the page has the required conditions
  157. if (document.getElementById('botstuff')) {
  158. var botstuffDiv = document.getElementById('botstuff');
  159. var divsToHide = botstuffDiv.querySelectorAll('div[jscontroller="ogmBcd"]');
  160. for (var i = 0; i < divsToHide.length; i++) {
  161. divsToHide[i].style.display = "none";
  162. }
  163. }
  164.  
  165.  
  166. // Function to hide elements with class "C4clhf"
  167. function hideElementWithClass(className) {
  168. var elements = document.getElementsByClassName(className);
  169. for (var i = 0; i < elements.length; i++) {
  170. elements[i].style.display = "none";
  171. }
  172. }
  173.  
  174. // Function to handle mutations and hide elements
  175. function handleMutations(mutationsList) {
  176. for (var i = 0; i < mutationsList.length; i++) {
  177. var mutation = mutationsList[i];
  178. var addedNodes = mutation.addedNodes;
  179. for (var j = 0; j < addedNodes.length; j++) {
  180. var addedNode = addedNodes[j];
  181. if (addedNode.classList && addedNode.classList.contains("C4clhf")) {
  182. hideElementWithClass("C4clhf");
  183. }
  184. }
  185. }
  186. }
  187.  
  188. // Create a new mutation observer
  189. var observer = new MutationObserver(handleMutations);
  190.  
  191. // Start observing the 'search' div and its descendants
  192. var searchDiv = document.getElementById('search');
  193. if (searchDiv) {
  194. observer.observe(searchDiv, { childList: true, subtree: true });
  195. }
  196.  
  197. // Hide existing elements with class "C4clhf"
  198. hideElementWithClass("C4clhf");
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206. if ((document.querySelector('div.card-section a[href*="&filter=0"]') !== null) ||
  207. (document.querySelectorAll('div.card-section p, div.card-section li').length > 1) ||
  208. (document.querySelector('div.uzjuFc') !== null)) {
  209.  
  210. if (pageNumber === 1) {
  211. // Remove the 'return-pagination' table if pageNumber is 1
  212. var returnPaginationTable = document.querySelector('table.AaVjTc.return-pagination');
  213. if (returnPaginationTable) {
  214. returnPaginationTable.remove();
  215. }
  216. } else {
  217. // Find and remove the column ret-pag-col-11
  218. var column11 = table.querySelector('.ret-pag-col-11');
  219. if (column11) {
  220. column11.remove();
  221. }
  222.  
  223. // Remove numbers and links from columns ret-pag-col-2 to ret-pag-col-10
  224. for (var i = 2; i <= 10; i++) {
  225. var column = table.querySelector(`.ret-pag-col-${i}`);
  226. column.innerHTML = '';
  227. }
  228.  
  229. // Set the current page number in ret-pag-col-10
  230. var column10 = table.querySelector('.ret-pag-col-10');
  231. column10.innerText = pageNumber;
  232.  
  233. // Generate and set the page numbers in the remaining columns as links
  234. for (var i = 9; i >= 2; i--) {
  235. var column = table.querySelector(`.ret-pag-col-${i}`);
  236. var columnNumber = pageNumber - (10 - i);
  237. if (columnNumber > 0) {
  238. var linkURL = getCurrentPageURL();
  239. var newStartNumber = (columnNumber - 1) * 10;
  240. linkURL = replaceStartNumber(linkURL, newStartNumber);
  241. column.innerHTML = generateLink(columnNumber, linkURL);
  242. } else {
  243. column.remove();
  244. }
  245. }
  246. }
  247.  
  248. // Function to get the current page URL
  249. function getCurrentPageURL() {
  250. return window.location.href.split("#")[0];
  251. }
  252.  
  253. // Function to replace the "start" number in the URL
  254. function replaceStartNumber(url, newStartNumber) {
  255. return url.replace(/([&?])start=\d+/, "$1start=" + newStartNumber);
  256. }
  257.  
  258. // Function to generate a link with the specified page number and URL
  259. function generateLink(pageNumber, url) {
  260. return `<a href="${url}">${pageNumber}</a>`;
  261. }
  262.  
  263. }