NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
(function() { "use strict" // ==UserScript== // @name uso - More Pages // @namespace http://userscripts.org/users/37004 // @description Adds a link to the next possible page and if detected alters text on successful xhr with existence check // @copyright 2010+, Marti Martz (http://userscripts.org/users/37004) // @license CC-BY-NC-SA-4.0; https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode // @license GPL-3.0-or-later; http://www.gnu.org/licenses/gpl-3.0.txt // @icon http://www.gravatar.com/avatar.php?gravatar_id=e615596ec6d7191ab628a1f0cec0006d&r=PG&s=48&default=identicon // @version 1.0.12.1eol // @icon https://www.gravatar.com/avatar/e615596ec6d7191ab628a1f0cec0006d?r=PG&s=48&default=identicon // @homepageURL https://github.com/Martii/UserScripts/tree/master/src/uso/More%20Pages // @homepageURL https://openuserjs.org/scripts/Marti/uso_-_More_Pages // @homepageURL http://userscripts.org/scripts/show/385863 // @supportURL http://userscripts.org/topics/190793 // @include /^https?://userscripts\.org(?::\d{1,5})?/?/ // @include http://userscripts.org:8080/* // @include http://userscripts.org/* // @include https://userscripts.org/* // @grant none // ==/UserScript== /** * */ function getQsp(aQs, aName) { aQs = aQs.replace(/^\?/, ""); var qsps = aQs.split("&"); for (var i = 0, qsp; qsp = qsps[i++];) { var qspnv = qsp.split("="); var name = qspnv[0]; var value = qspnv[1]; if (name == aName) return value; } return null; } /** * */ function replaceQsp(aQs, aName, aValue) { aQs = aQs.replace(/^\?/, ""); var newQs = []; var found; var qsps = aQs.split("&"); for (var i = 0, qsp; qsp = qsps[i++];) { var qspnv = qsp.split("="); var name = qspnv[0]; var value = qspnv[1]; if (name == aName) { value = aValue; found = true; } newQs.push(name + "=" + value); } if (!found) newQs.push(aName + "=" + aValue); if (newQs.length > 0) return ("?" + newQs.join("&")); } /** * */ function pageCheck(aUrl, aCb, aAnchorNode, aReferenceNode) { var req = new XMLHttpRequest(); req.open('GET', aUrl); if (authenticated) req.setRequestHeader('Range', 'bytes=0-7168'); else req.setRequestHeader('Range', 'bytes=0-3259'); req.onreadystatechange = function () { if (this.readyState == this.DONE && this.status != 404) aCb(aUrl, aAnchorNode, aReferenceNode, this.responseText); }; req.send(); } /** * */ function paginationCheck(aUrl, aCb, aMorepageNode) { var req = new XMLHttpRequest(); req.open('GET', aUrl); if (authenticated) req.setRequestHeader('Range', 'bytes=0-8192'); // NOTE: Watchpoint else req.setRequestHeader('Range', 'bytes=0-3723'); req.onreadystatechange = function () { if (this.readyState == this.DONE) { switch (this.status) { case 404: aMorepageNode.parentNode.removeChild(aMorepageNode); break; default: aCb(aUrl, aMorepageNode, this.responseText); break; } } }; req.send(); } /** * */ var authenticated = document.querySelector("body.loggedin"); var paginationNodes = document.querySelectorAll("#content .pagination"); for (var i = 0, paginationNode; paginationNode = paginationNodes[i++];) { var lastpageNode = paginationNode.lastChild; var endpageNode = lastpageNode.previousSibling.previousSibling; var matches = endpageNode.textContent.match(/(\d+)/); if (matches) { var morepage = parseInt(matches[1]) + 1; var url = location.pathname + replaceQsp(location.search, "page", morepage); var nodeA = document.createElement("a"); nodeA.href = url; nodeA.textContent = "?"; var morepageNode = paginationNode.insertBefore(nodeA, lastpageNode); paginationNode.insertBefore(document.createTextNode(" "), lastpageNode); paginationCheck(url, function (aUrl, aMorepageNode, aResponseText) { var docfrag = document.createDocumentFragment(); var nodeDiv = document.createElement("div"); nodeDiv.innerHTML = aResponseText; docfrag.appendChild(nodeDiv); var node = docfrag.querySelector("#content > table > tbody > tr td"); // NOTE: Watchpoint if (!node) { aMorepageNode.parentNode.removeChild(aMorepageNode); return; } aMorepageNode.textContent = "\u2026"; var next_pageNodes = document.querySelectorAll('.next_page'); for (var i = 0, next_pageNode; next_pageNode = next_pageNodes[i++];) { if (next_pageNode.classList.contains("disabled")) { var current_pageNode = next_pageNode.parentNode.querySelector('.current'); if (current_pageNode) { var current_page = parseInt(current_pageNode.textContent); var nodeA = document.createElement("a"); nodeA.classList.add("next_page"); nodeA.rel = "next"; nodeA.href = aMorepageNode.pathname + replaceQsp(aMorepageNode.search, "page", current_page + 1) + aMorepageNode.hash; nodeA.textContent = "Next \u00BB"; next_pageNode.parentNode.insertBefore(document.createTextNode(" "), next_pageNode); next_pageNode.parentNode.insertBefore(nodeA, next_pageNode); next_pageNode.parentNode.removeChild(next_pageNode); } } } }, morepageNode); } } var pagesNodes = document.querySelectorAll("#content .pages"); for (var i = 0, pagesNode; pagesNode = pagesNodes[i++];) { var lastpagesNode = pagesNode.lastChild; var endpageNode = lastpagesNode.previousSibling; var matches = endpageNode.textContent.match(/(\d+)/); if (matches) { var morepage = parseInt(matches[1]) + 1; var url = endpageNode.pathname + replaceQsp(endpageNode.search, "page", morepage); pageCheck(url, function (aUrl, aAnchorNode, aReferenceNode, aResponseText) { var nodeA = document.createElement("a"); nodeA.href = aUrl; nodeA.textContent = "\u2026"; aAnchorNode.insertBefore(document.createTextNode(" "), aReferenceNode); aAnchorNode.insertBefore(nodeA, aReferenceNode); // Attempt to correct last detected page using same postid (hash may be incorrect if post(s) removed due to spam flagging) var docfrag = document.createDocumentFragment(); var nodeDiv = document.createElement("div"); nodeDiv.innerHTML = aResponseText; docfrag.appendChild(nodeDiv); var nextpageNode = docfrag.querySelector(".pagination *:last-child"); if (nextpageNode) { var lastpageNode = nextpageNode.previousSibling.previousSibling; if (lastpageNode) { var lastpage = lastpageNode.textContent; var lastpostNode = aAnchorNode.parentNode.parentNode.querySelector(".lastpost"); if (lastpostNode) lastpostNode.search = replaceQsp(lastpostNode.search, "page", lastpage); } } }, pagesNode, lastpagesNode); } } })();