Textarea to P on characterhub.org

将characterhub.org上的Textarea元素转换成P元素, 使得翻译器能翻译其内容(我用的是TWP)

当前为 2024-06-23 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name        Textarea to P on characterhub.org
// @namespace   https://greasyfork.org/users/1202784-az689
// @match       https://www.characterhub.org/characters*
// @grant       GM_addStyle
// @grant       GM_registerMenuCommand
// @version     0.1.0
// @author      az689
// @license     CC Attribution-ShareAlike 4.0 International; http://creativecommons.org/licenses/by-sa/4.0/
// @description Convert Textarea elements on characterhub.org into P elements, so that the translator can translate their content. (I use TWP)
// @description:zh-CN  将characterhub.org上的Textarea元素转换成P元素, 使得翻译器能翻译其内容(我用的是TWP)
// @description:fr  Convertir les éléments Textarea sur characterhub.org en éléments P, afin que les traducteurs puissent traduire leur contenu (j'utilise TWP)
// @description:es  Convertir los elementos Textarea en characterhub.org a elementos P, para que los traductores puedan traducir su contenido (uso TWP)
// @description:de  Konvertiere die Textarea-Elemente auf characterhub.org in P-Elemente, damit Übersetzer deren Inhalt übersetzen können (ich benutze TWP)
// @description:pt  Converta os elementos Textarea em characterhub.org para elementos P, para que os tradutores possam traduzir seu conteúdo (eu uso TWP)
// @description:ru  Преобразовать элементы Textarea на characterhub.org в элементы P, чтобы переводчики могли переводить их содержимое (я использую TWP)
// @description:zh-TW  將characterhub.org上的Textarea元素轉換成P元素, 使得翻譯器能翻譯其內容(我用的是TWP)
// @description:ja  characterhub.orgでTextarea要素をP要素に変換し、翻訳ツール(私はTWPを使用)でその内容を翻訳できるようにします。
// ==/UserScript==

let dict = {
    "&": "&",
    "<": "&lt;",
    ">": "&gt;",
    '"': "&quot;",
    "'": "&#39;",
    "/": "&#x2F;",
    "\n": "<br>",
    "\r": "",
    "\t": "&nbsp;&nbsp;&nbsp;&nbsp;",
    " ": "&nbsp;",
};
let regex = new RegExp(
    Object.keys(dict)
    .map(key => key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"))//转义dict键中的正则表达式特殊字符
    .join("|"), "gi");//并联所有键构建正则表达式
let t2p = function() {
    //遍历所有textarea
    Array.from(document.getElementsByTagName("textarea")).forEach(
        function (aTag) {
            let pTag = document.createElement("p");
            pTag.className = aTag.className + " pformtextarea";
            pTag.innerHTML = aTag.value.replace(regex, (char => dict[char] || char));
            //使用dict对textarea内的html进行转义
            aTag.parentNode.replaceChild(pTag, aTag);
        }
    );
};

GM_registerMenuCommand('Textarea to P', t2p);

let css = `#t2p_button {
    display: block;
    border: 2px solid;
    margin-inline: 25px;
}

#t2p_button > div {
    background-color: var(--lighter-almost-black);
    padding: 2px;
    text-align: center;
}

#t2p_button > div:active {
    filter: invert(100%);
}

.pformtextarea {
    padding-inline: 12px;
    background-color: var(--almost-black-color);
}
`;
GM_addStyle(css);

let add_t2p_button = function() {
    let cc = document.getElementById("spec_v2_card_container");
    if (cc && !cc?.querySelector("#t2p_button")) {//spec_v2_card_container容器存在且未添加按钮
        cc.insertAdjacentHTML("afterbegin", "<div id='t2p_button'><div>Textarea to P</div></div>");
        cc.addEventListener("click", t2p);
    };
};
(new MutationObserver(add_t2p_button))
    .observe(document.body, { childList: true, subtree: true });