// ==UserScript== // @name Fix kbin Code Blocks // @namespace pamasich-kbin // @version 1.2.1 // @description Fix for kbin code blocks federated from Lemmy. Strips out the weird tags on each line. // @author Pamasich // @match https://kbin.social/* // @icon https://www.google.com/s2/favicons?sz=64&domain=kbin.social // @license MIT // @grant none // @downloadURL none // ==/UserScript== /* This script fixes code blocks on kbin that originate from Lemmy. When federating code blocks, Lemmy includes additional tags which kbin currently does not expect, so it just renders them in plaintext. The script removes those tags from code blocks. */ const testPattern = /\n?(.+\n)+<\/span>\n?/; const startTagPattern = /^\n?/g; const endTagPattern = /<\/span>\n?$/g; const combinedPattern = /^<\/span>/gm; function fixCodeBlock(code) { // used to avoid false positives, wouldn't want to strip out end span tags () from legit HTML code blocks if (testPattern.test(code.innerText)) { code.innerText = code.innerText .replace(startTagPattern, "") .replaceAll(combinedPattern, "") .replace(endTagPattern, ""); } } // the MutationObserver doesn't work well when the page is loaded from scratch (without navigating from another kbin page with turbo mode) document.querySelectorAll("pre code").forEach(fixCodeBlock); 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(fixCodeBlock); }); // observing the entire document because of turbo mode observer.observe(document, { childList: true, subtree: true });