Interesting Wikipedia userscript

Does evil things to wikipedia articles

当前为 2024-01-28 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        Interesting Wikipedia userscript
// @namespace   roxwize
// @match       *://*.wikipedia.org/*
// @grant       none
// @version     1.2.1
// @author      roxwize
// @description Does evil things to wikipedia articles
// @license     GPL-3.0-or-later
// @homepageURL https://greasyfork.org/en/scripts/479665-interesting-wikipedia-userscript
// ==/UserScript==

const images = [
  "https://cdn.discordapp.com/attachments/862154953295396884/1173367948249927720/anim9.gif",
  "https://media.tenor.com/MBkt9DXPaUYAAAAd/ddostumka%C3%A7.gif",
  "https://media.discordapp.net/attachments/836622752735690792/892543216514117662/ezgif.com-gif-maker.gif",
  "https://media.discordapp.net/attachments/203413905865834496/625861266988335115/flanders_fucking_dies.gif",
  "https://media.discordapp.net/attachments/1114953713153486968/1166939127942500523/vivaldi10807_1698290357.gif",
  "https://media.discordapp.net/attachments/816133227508662292/1172693664171040829/anim2.gif",
  "https://media.discordapp.net/attachments/972366344983031838/1028865879343120454/Ut3Yx38fp4.gif",
  "https://media.discordapp.net/attachments/600630338795995136/1144468663467003924/Untitled-2.gif",
  "https://media.tenor.com/C8aEDgYC1y4AAAAd/aphex-twin-come-to-daddy.gif",
  "https://cdn.discordapp.com/attachments/1099111307380277331/1125686366668341298/download_8.gif",
  "https://media.discordapp.net/attachments/846920921599836180/983072664023363655/FILE0319.gif",
  "https://media.tenor.com/4i00_7OrisUAAAAC/sandoz-canu-sandoz.gif",
  "https://media.tenor.com/hrNDlz8yD3UAAAAC/harley-quinn-margot-robbie.gif",
  "https://cdn.discordapp.com/attachments/800044401501798403/942883938978914354/caption-17-1.gif",
  "https://media.tenor.com/s1w-Sc5ahpEAAAAd/paz-pazzin.gif",
  "https://media.discordapp.net/attachments/907403580011601931/908189601888354384/image0-2.gif",
  "https://media.discordapp.net/attachments/862154953295396884/1168344353014562816/anim8.gif",
  "https://cdn.discordapp.com/attachments/862154953295396884/1173407665305690172/1D1cW2Ntai.gif",
  "https://media.tenor.com/dWS427mpAZAAAAAd/secu-rity-meme.gif",
  "https://media.tenor.com/XUFDsSt48GYAAAAd/eminem.gif",
  "https://media.tenor.com/QgphpoWrjaAAAAAd/retro-retro-dev.gif",
  "https://media.tenor.com/uSo4lQu9dVgAAAAC/homer-smile.gif",
  "https://media.tenor.com/QMpyBmPBlhoAAAAC/wtf-roblox.gif",
  "https://media.tenor.com/47hdAGX-uAwAAAAC/charjabug-weegee.gif",
  "https://cdn.discordapp.com/attachments/862154953295396884/1176264387883974716/IMG_7766.gif",
  "https://cdn.discordapp.com/attachments/862154953295396884/1176264385795207300/5D5A47EA-FD2A-4F96-AAE0-EC24DFF85E9E.gif",
  "https://cdn.discordapp.com/attachments/862154953295396884/1176264384977326221/253mof.gif",
  "https://media.discordapp.net/attachments/847904283142651964/910315898575917076/allo_balling.gif",
  "https://media.tenor.com/HcQ44DFmPccAAAAC/video-gaming.gif",
  "https://media.tenor.com/79djON9nNhMAAAAC/0001.gif",
  "https://media.tenor.com/U2ilbVQ-DAwAAAAC/jameis-winston-crab.gif",
  "https://media.discordapp.net/attachments/810597667091644427/1023288366059499620/ezgif.com-gif-maker.gif",
  "https://media.discordapp.net/attachments/862154953295396884/1188233304370065509/GwvzAonc89.gif",
  "https://media.discordapp.net/attachments/831015313365270528/1146956684707762197/sad.gif",
  "https://media.discordapp.net/attachments/862154953295396884/1186850455419101244/farmer.gif",
  "https://media.discordapp.net/attachments/862154953295396884/1177824053713703013/CiEIEGrarE.gif",
  "https://media.discordapp.net/attachments/862154953295396884/1183912305885466767/KADLBkzqrL.gif",
  "https://media.discordapp.net/attachments/1054852621191610499/1055176904153497631/1671563280861164.gif",
  "https://cdn.discordapp.com/attachments/862154953295396884/1200958970924384266/markiplier-dancing.gif",
  "https://cdn.discordapp.com/attachments/862154953295396884/1200958971352195245/mechanic.gif",
  "https://cdn.discordapp.com/attachments/862154953295396884/1200958970173604052/gotohell.gif",
  "https://cdn.discordapp.com/attachments/862154953295396884/1200958971788406834/not_cooking_shit.gif",
  "https://cdn.discordapp.com/attachments/862154953295396884/1200958968655261818/kitty_kitty_cat_cat.gif",
  "https://cdn.discordapp.com/attachments/862154953295396884/1200958970924384266/markiplier-dancing.gif"
];
let words = [];

const config = {
  styleModifications: {
    label: "Modify page style",
    current: false
  },
  linkModifications: {
    label: "Modify links",
    current: true
  },
  figCaptions: {
    label: "Modify image captions",
    current: false
  },
  textualModifications: {
    label: "Screw up text nodes",
    current: true
  },
  forbidRepetition: {
    label: "If a word is used more than once on the page,",
    vals: [
      "Redact it",
      "Remove it",
      "Do nothing"
    ],
    current: 2
  }
};

function modify(e, f) {
  const n = e.childNodes;
  for (let d of n) {
    if (d.nodeType === Node.TEXT_NODE) f(d);
    else modify(d, f);
  }
}

const chance = () => Math.random() * 100;
const rand = (a) => a[Math.floor(Math.random() * a.length)];
const screwup = (str) => {
  const s = str.split("");
  let o = "";
  let i = 0;
  for (let l of s) {
    if (chance() > 60) continue;
    if (chance() < 20 && s[i+1]) o += s[i+1];
    if (chance() > 80 && s[i-1]) o += s[i-1];
    if (chance() < 80) o += l;
    if (chance() > 90) o += l;
    i++;
  }
  return o;
}

(function() {
  const rootEl = document.createElement("div");
  rootEl.id = "god";
  rootEl.style = "position:fixed;bottom:1em;left:1em;background:rgba(50,40,80,0.8);padding:1em;color:white;";
  rootEl.innerHTML = `<span style="display:block;font-size:smaller;">iwus v${GM.info.script.version} | <a href="https://greasyfork.org/en/scripts/479665-interesting-wikipedia-userscript" style="color:white;font-weight:bold;text-decoration:underline;">greasyfork</a></span><input type="text" id="bregex" placeholder="regex" /><br/><input type="text" id="breplacement" placeholder="replacement" /><br/><button id="bok" style="cursor:pointer;">ok</button>`;
  document.body.appendChild(rootEl);
  document.getElementById("bok").addEventListener("click", () => {
    words = [];
    const regexp = new RegExp(document.getElementById("bregex").value, "g");
    const replce = document.getElementById("breplacement").value;
    document.querySelectorAll(`p, ${config.figCaptions.current ? "figcaption," : ""} th, td, li, h1, h2, h3, h4, h5, h6`).forEach((e) => {
      modify(e, (node) => {
        node.textContent = node.textContent.replaceAll(regexp, replce); words.push(node.textContent);
        // == TEXTUAL MODIFICATIONS == //
        if (config.textualModifications.current) {
          if (chance() > 90) {
            node.textContent = node.textContent.replaceAll(/[aeiou]/g, "");
          } else if (chance() > 90) {
            node.textContent = screwup(node.textContent);
          }
        }
      });
      // == STYLE MODIFICATIONS == //
      if (config.styleModifications.current) {
        e.style.color = `hsl(${Math.round(Math.random()*360)} 50% 50%)`;
        if (chance() > 75) e.style.backgroundColor = `hsl(${Math.round(Math.random()*360)} 50% 50%)`;
        e.style.textDecoration = chance() > 70 ? "underline" : "normal";
        e.style.fontStyle = chance() > 70 ? "italic" : "normal";
        if (chance() > 30) {
          e.style.transform = `translate(${Math.random()*25}px, ${Math.random()*50}px)`;
        } else {
          e.style.transform = `rotate(${Math.random()*5-2.5}deg)`;
          if (chance() > 45) {
            e.style.transform += ` scale(${Math.random()*2+0.5})`;
          }
        }
        e.style.fontSize = `${9 + Math.floor(Math.random()*10)}pt`;
      }
    });
    document.querySelectorAll("img").forEach((e) => {
      e.src = rand(images);
    });
    // == LINK MODIFICATIONS == //
    if (config.linkModifications.current) {
      document.querySelectorAll("a").forEach((e) => {
        e.setAttribute("href", "https://en.wikipedia.org/wiki/Special:Random");
        modify(e, (node) => {
          e.dataset.original = node.textContent;

          node.textContent = rand(words);
          let _t;
          e.addEventListener("mouseover", () => {
            _t = document.createElement("div");
            _t.innerHTML = `<a href="https://en.wikipedia.org/wiki/${e.dataset.original.replaceAll(/ /g,'_')}">${e.dataset.original}</a>`;
            _t.style = "display:inline;font-size:smaller;background-color:rgba(0,0,0,0.3);padding:0.25rem;margin:0.25rem;";
            e.appendChild(_t);
          });
          e.addEventListener("mouseout", () => {
            if (_t) _t.remove();
          });
        });
      });
    }
  });
  const configEl = document.createElement("div");
  configEl.id = "gantzgraf";
  configEl.style = "position:fixed;bottom:1em;right:1em;background:rgba(50,40,80,0.8);padding:1em;color:white;";
  for (let [k, v] of Object.entries(config)) {
    const e = document.createElement("div");
    e.style = "display:flex;align-items:center;gap:1em;";
    e.innerHTML = `<label for="bo-${k}" style="flex-grow:1;text-align:right;">${v.label}</label>`;
    let o;
    if (typeof v.current === "number" && v.vals != undefined) {
      o = document.createElement("div");
      o.style = "display:block;"
      v.vals.forEach((el, i) => {
        const vO = document.createElement("input");
        vO.type = "radio";
        vO.name = `bo-${k}`;
        vO.id = `ro-${k}-${i}`;
        vO.value = i.toString();
        o.appendChild(vO);
        const vL = document.createElement("label");
        vL.setAttribute("for", vO.id);
        vL.innerHTML = el;
        vL.style.display = "block";
        o.appendChild(vL);
      });
    } else {
      o = document.createElement("input");
      o.type = "checkbox";
      o.checked = config[k].current;
      o.addEventListener("input", () => {
        config[k].current = o.checked;
      });
    }
    o.name = `bo-${k}`;
    o.id = o.name;
    e.appendChild(o);
    configEl.appendChild(e);
  }
  document.body.appendChild(configEl);
})();