Fix kbin Code Blocks

Fix for kbin code blocks federated from Lemmy. Strips out the weird <span> tags on each line.

当前为 2023-11-30 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==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 <span> 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
// ==/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.
*/

const testPattern = /\n?<span style="color:#323232;">(.+\n)+<\/span>\n?/;
const startTagPattern = /^\n?<span style="color:#323232;">/g;
const endTagPattern = /<\/span>\n?$/g;
const combinedPattern = /^<\/span><span style="color:#323232;">/gm;

function fixCodeBlock(code) {
    // used to avoid false positives, wouldn't want to strip out end span tags (</span>) 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 });