4chan-restore-deadlinks

restores dead links pointing to deleted posts

  1. // ==UserScript==
  2. // @name 4chan-restore-deadlinks
  3. // @namespace github.com/diegostafa/userscripts
  4. // @match https://boards.4chan.org/*/thread/*
  5. // @match https://boards.4channel.org/*/thread/*
  6. // @version 1.0
  7. // @author Diego <dstafa.dev@gmail.com> (github.com/diegostafa)
  8. // @description restores dead links pointing to deleted posts
  9. // @run-at document-end
  10. // ==/UserScript==
  11.  
  12. const turnObjectInsideOut = (obj) => Object.fromEntries(Object.entries(obj).flatMap(([k, vs]) => vs.map((v) => [v, k])));
  13.  
  14. const archives = turnObjectInsideOut({
  15. "desuarchive.org": ["a", "aco", "an", "c", "cgl", "co", "d", "fit", "g", "his", "int", "k", "m", "mlp", "mu", "q", "qa", "r9k", "tg", "trash", "vr", "wsg"],
  16. "archive.4plebs.org": ["adv", "f", "hr", "o", "pol", "s4s", "sp", "tg", "trv", "tv", "x"],
  17. "archived.moe": ["3", "a", "aco", "adv", "an", "asp", "b", "bant", "biz", "c", "can", "cgl", "ck", "cm", "co", "cock", "con", "d", "diy", "e", "f", "fa", "fap", "fit", "fitlit", "g", "gd", "gif", "h", "hc", "his", "hm", "hr", "i", "ic", "int", "jp", "k", "lgbt", "lit", "m", "mlp", "mlpol", "mo", "mtv", "mu", "n", "news", "o", "out", "outsoc", "p", "po", "pol", "pw", "q", "qa", "qb", "qst", "r", "r9k", "s", "s4s", "sci", "soc", "sp", "spa", "t", "tg", "toy", "trash", "trv", "tv", "u", "v", "vg", "vint", "vip", "vm", "vmg", "vp", "vr", "vrpg", "vst", "vt", "w", "wg", "wsg", "wsr", "x", "xs", "y"],
  18. "warosu.org": ["3", "biz", "cgl", "ck", "diy", "fa", "ic", "jp", "lit", "sci", "vr", "vt"]
  19. });
  20.  
  21. const urlParts = window.location.pathname.split("/").filter((s) => s !== "");
  22. const boardId = urlParts[0];
  23. const threadId = urlParts[2];
  24. const archive = archives[boardId];
  25.  
  26. const addLinkToArchive = (deadlink) => {
  27. let quoteId = deadlink.textContent.split(">>").pop();
  28.  
  29. let archiveLink = `https://${archive}/${boardId}/thread/${threadId}/#q${quoteId}`;
  30. if (archive === "warosu.org") archiveLink = `https://${archive}/${boardId}/thread/${quoteId}`;
  31.  
  32. let deadLinkAnchor = document.createElement('a');
  33. deadLinkAnchor.textContent = deadlink.textContent + " (DEAD)";
  34. deadLinkAnchor.href = archiveLink;
  35. deadLinkAnchor.classList.add("quotelink");
  36. deadLinkAnchor.setAttribute("target", "_blank");
  37.  
  38. deadlink.textContent = "";
  39. deadlink.appendChild(deadLinkAnchor);
  40. };
  41.  
  42. const main = () => {
  43. let deadlinks = document.querySelectorAll(".thread .deadlink");
  44.  
  45. Array
  46. .from(deadlinks)
  47. .forEach(addLinkToArchive);
  48. };
  49.  
  50. main();