// ==UserScript== // @name Fix kbin Code Blocks // @namespace pamasich-kbin // @version 1.2 // @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== const testPattern = /\n?(.+\n)+<\/span>\n?/; const startTagPattern = /^\n?/g; const endTagPattern = /<\/span>\n?$/g; const combinedPattern = /^<\/span>/gm; function fixCodeBlock(code) { if (testPattern.test(code.innerText)) { code.innerText = code.innerText .replace(startTagPattern, "") .replaceAll(combinedPattern, "") .replace(endTagPattern, ""); } } // used to ensure the code blocks in the thread body itself, not just the comments, are replaced // unlike the blockquote for comments, it doesn't seem like the MutationObserver is picking up any article elements or anything nearby I could use document.querySelectorAll("pre code").forEach(fixCodeBlock); const observer = new MutationObserver(mutations => { const codeBlocks = mutations.flatMap(mutation => Array.from(mutation.addedNodes)) // only do something if new comments were added (BLOCKQUOTE) or a thread is opened while in turbo mode (BODY) .filter(node => node.nodeName == "BLOCKQUOTE" || node.nodeName == "BODY") .map(node => Array.from(node.querySelectorAll("pre code"))) .flat(1); // 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 });