NoPaste

dfde-singlepage

von TRex

SNIPPET_TEXT:
  1. // ==UserScript==
  2. // @name         dfde-singlepage
  3. // @namespace    de.debianforum
  4. // @version      0.2
  5. // @description  View all pages of a thread on one page
  6. // @author       You
  7. // @match        https://debianforum.de/forum/viewtopic.php*t=*
  8. // @icon         https://www.google.com/s2/favicons?sz=64&domain=debianforum.de
  9. // @grant        none
  10. // ==/UserScript==
  11.  
  12. (function() {
  13.     'use strict';
  14.     const pages = [...document.querySelector(".pagination").querySelectorAll("li")]
  15.     .map((p) => parseInt(p.innerText))
  16.     .filter(n => !isNaN(n))
  17.     .slice(-1)[0];
  18.  
  19.     const thread_id = window.location.search.match(/t=[0-9]+/);
  20.     const unsuitable = window.location.search.match(/p=[0-9]+|start=/);
  21.  
  22.     const pageBody = document.querySelector("#page-body");
  23.     const pageBar = pageBody.querySelector(".action-bar.bar-bottom");
  24.  
  25.     const myButton = document.createElement("li")
  26.     const myButton_a = document.createElement("a")
  27.     myButton_a.className = "button";
  28.     myButton_a.innerText = "∞";
  29.  
  30.     myButton.appendChild(myButton_a)
  31.     document.querySelector(".pagination ul").prepend(myButton);
  32.  
  33.     function clickit() {
  34.         if (unsuitable) { window.location.href= "https://debianforum.de/forum/viewtopic.php?" + thread_id; }
  35.         let promises = []
  36.  
  37.         // async wrapper to fix the order of requests/posts
  38.         const fn = async() => {
  39.             for (var p=1; p<pages; p++) {
  40.                 const url = "https://debianforum.de/forum/viewtopic.php?" + thread_id + "&start=" + p*15;
  41.  
  42.                 promises.push(
  43.                     fetch(url)
  44.                     .then(xhr => xhr.text())
  45.                     .then(htmlstring => {
  46.                         const d = document.createElement('div');
  47.                         d.innerHTML = htmlstring.trim();
  48.                         return d
  49.                     })
  50.                     .then(d => d.querySelectorAll("#page-body .post"))
  51.                 );
  52.  
  53.             }
  54.             await Promise.all(promises)
  55.             .then(nodelist => nodelist.forEach(posts => posts.forEach(post => pageBody.insertBefore(post, pageBar))));
  56.         }
  57.         fn();
  58.  
  59.         document.querySelectorAll(".pagination li a").forEach((pg, idx) => {
  60.             if(idx > 0 && pg.innerHTML.match(/[0-9]+/))
  61.                 pg.style.backgroundColor = "#d70751";
  62.             pg.style.color = "#fff";
  63.         })
  64.     }
  65.     myButton.addEventListener("click", clickit);
  66. })();

Quellcode

Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN