您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Fix for kbin code blocks federated from Lemmy. Strips out the weird <span> tags on each line.
当前为
// ==UserScript== // @name Fix kbin Code Blocks // @namespace pamasich-kbin // @version 2.0.1 // @description Fix for kbin code blocks federated from Lemmy. Strips out the weird <span> tags on each line. // @author Pamasich // @match https://kbin.social/* // @match https://kbin.earth/* // @icon https://www.google.com/s2/favicons?sz=64&domain=kbin.social // @license MIT // @grant none // ==/UserScript== /* This script fixes code blocks on kbin that originate from Lemmy. When federating code blocks, Lemmy includes additional <span> tags which kbin currently does not expect, so it just renders them in plaintext. The script removes those tags from code blocks. */ /** @type {String} */ const STYLEPATTERN = "((font-style:italic|font-weight:bold);)?color:#[0-9a-fA-F]{6};"; function setup () { getCodeBlocks().forEach((code) => fix(code)); } /** * Repairs a given code block. * @param {HTMLElement} original The code block that needs to be fixed */ function fix (original) { if (!isErroneousCode(original)) return; const fixed = document.createElement("code"); original.after(fixed); const start = new RegExp(`^\\n?<span style="${STYLEPATTERN}">`); const end = new RegExp(`\\n<\\/span>\\n?$`); const combined = new RegExp(`<\\/span><span style="${STYLEPATTERN}">`, "g"); fixed.textContent = original.textContent .replace(start, "") .replaceAll(combined, "") .replace(end, ""); original.style.display = "none"; } /** * Checks whether a given code block needs to be fixed. * @param {HTMLElement} code * @returns {Boolean} */ function isErroneousCode (code) { const pattern = new RegExp(`^\\n?<span style="${STYLEPATTERN}">(.+\\n)+<\\/span>\\n?$`); return pattern.test(code.textContent); } /** * @returns {HTMLElement[]} A list of all the code blocks on the page */ function getCodeBlocks () { return Array.from(document.querySelectorAll("pre code")); } setup(); const observer = new MutationObserver((mutations) => { // the filter ensures the script only looks for new code blocks to fix if new comments were added or the user navigated to a different thread const codeBlocks = mutations.flatMap((mutation) => Array.from(mutation.addedNodes)) .filter((node) => node.nodeName == "BLOCKQUOTE" || node.nodeName == "BODY") .flatMap((node) => Array.from(node.querySelectorAll("pre code"))); // codeBlocks at this point might contain the same node twice, so the Set constructor is used to get unique nodes new Set(codeBlocks).forEach(fix); }); // observing the entire document because of turbo mode observer.observe(document, { childList: true, subtree: true });