🏠 Home 

简繁转换(##大陆、##、##、日本新字体)

调用 opencc-rust-wasm 转换中文

// ==UserScript==
// @name	     简繁转换(##大陆、##、##、日本新字体)
// @namespace	 Forbidden Siren
// @version	     0.9.21
// @description  调用 opencc-rust-wasm 转换中文
// @match	  *
// @match     *://*/*
// @grant  	  GM_getResourceText
// @grant	  GM_getResourceURL
// @grant	  GM_registerMenuCommand
// @grant	  GM_unregisterMenuCommand
// @grant	  GM_getValue
// @grant	  GM_setValue
// @grant     GM_xmlhttpRequest
// @license   MIT
// @connect   self
// @require   https://greasyfork.org/scripts/448529-opencc-rust-lib/code/opencc-rust-lib.js?version=1074680
// @require   https://greasyfork.org/scripts/448197-elementgetter/code/ElementGetter.js?version=1126009
// @resource  opencc_wasm https://cdn.jsdelivr.net/gh/polyproline/opencc-wasm@main/opencc_gc.wasm
// @resource  HKVariants	https://cdn.jsdelivr.net/npm/opencc-data/data/HKVariants.txt
// @resource  HKVariantsRev	https://cdn.jsdelivr.net/npm/opencc-data/data/HKVariantsRev.txt
// @resource  HKVariantsRevPhrases	https://cdn.jsdelivr.net/npm/opencc-data/data/HKVariantsRevPhrases.txt
// @resource  JPShinjitaiCharacters	https://cdn.jsdelivr.net/npm/opencc-data/data/JPShinjitaiCharacters.txt
// @resource  JPShinjitaiPhrases	https://cdn.jsdelivr.net/npm/opencc-data/data/JPShinjitaiPhrases.txt
// @resource  JPVariants	https://cdn.jsdelivr.net/npm/opencc-data/data/JPVariants.txt
// @resource  JPVariantsRev	https://cdn.jsdelivr.net/npm/opencc-data/data/JPVariantsRev.txt
// @resource  STCharacters	https://cdn.jsdelivr.net/npm/opencc-data/data/STCharacters.txt
// @resource  STPhrases	https://cdn.jsdelivr.net/npm/opencc-data/data/STPhrases.txt
// @resource  TSCharacters	https://cdn.jsdelivr.net/npm/opencc-data/data/TSCharacters.txt
// @resource  TSPhrases	https://cdn.jsdelivr.net/npm/opencc-data/data/TSPhrases.txt
// @resource  TWPhrasesIT	https://cdn.jsdelivr.net/npm/opencc-data/data/TWPhrasesIT.txt
// @resource  TWPhrasesName	https://cdn.jsdelivr.net/npm/opencc-data/data/TWPhrasesName.txt
// @resource  TWPhrasesOther	https://cdn.jsdelivr.net/npm/opencc-data/data/TWPhrasesOther.txt
// @resource  TWPhrasesRev	https://cdn.jsdelivr.net/npm/opencc-data/data/TWPhrasesRev.txt
// @resource  TWVariants	https://cdn.jsdelivr.net/npm/opencc-data/data/TWVariants.txt
// @resource  TWVariantsRev	https://cdn.jsdelivr.net/npm/opencc-data/data/TWVariantsRev.txt
// @resource  TWVariantsRevPhrases	https://cdn.jsdelivr.net/npm/opencc-data/data/TWVariantsRevPhrases.txt
// ==/UserScript==
"use strict";
const ToSimple = [["HKVariantsRevPhrases", "HKVariantsRev"], ["TWPhrasesRev", "TWVariantsRevPhrases", "TWVariantsRev"], ["TSPhrases", "TSCharacters"]];// to Simple Chinese
const ToTraditional = [["TWVariantsRevPhrases", "TWVariantsRev"], ["HKVariantsRevPhrases", "HKVariantsRev"], ["JPShinjitaiPhrases", "JPShinjitaiCharacters", "JPVariantsRev"], ["STPhrases", "STCharacters"]];
const To###### = [["STPhrases", "STCharacters"], "TWVariants", "TWPhrases"];
const To####Kong = [["STPhrases", "STCharacters"], "HKVariants"];
const ExcludeTag = new RegExp("SCRIPT|TEXTAREA|META|BASE|NOSCRIPT|OBJECT");
const ExcludeType = new RegExp("text|search|hidden");
const Base64 = new RegExp("(?<=base64,).*");
const NODE_DICT = ToSimple;
let AutoTranslate = GM_getValue("AutoTranslate", false);
let ListenEvent = GM_getValue("ListenEvent", false);
let auto_translate = GM_registerMenuCommand((AutoTranslate ? "Disable" : "Enable") + " Auto Translate", set_auto_translate);
if (AutoTranslate) {
load_func();
} else {
let loadid = GM_registerMenuCommand("Start translate", () => {
GM_unregisterMenuCommand(loadid);
load_func();
});
}
function set_auto_translate() {
GM_unregisterMenuCommand(auto_translate);
AutoTranslate = !AutoTranslate;
GM_setValue("AutoTranslate", AutoTranslate);
auto_translate = GM_registerMenuCommand((AutoTranslate ? "Disable" : "Enable") + " Auto Translate", set_auto_translate);
}
function load_func() {
const url = GM_getResourceURL("opencc_wasm", false );
const detail = {
url:url,
method:"GET",
responseType:"arraybuffer",
onload:res=>{
if(res.status == 200){
let arr = res.response;
arr = new Uint8Array(arr);
init(arr).then(init_wasm);
}
}
};
GM_xmlhttpRequest(detail);
}
function init_wasm() {
const elmGetter = new ElementGetter();
let build = ConverterBuild.new();
NODE_DICT.forEach(item => {
if (Array.isArray(item)) {
item.forEach(function (item) {
console.assert(typeof item == "string");
build.adddict(GM_getResourceText(item));
});
} else {
console.assert(typeof item == "string");
build.adddict(GM_getResourceText(item));
}
build.group();
});
const converter = build.build();
const translate_body = () => { elmGetter.get("body").then(translate); };
const translate_head = () => { elmGetter.get("head").then(translate); };
const translate_all = () => { translate_head(); translate_body(); };
translate_all();
GM_registerMenuCommand("Translate", translate_all);
{
const MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
let observer = new MutationObserver(records =>{
records.forEach(record => {
switch (record.type) {
case 'childList':
record.addedNodes.forEach(translate)
break;
case 'characterData':
if (record.target.data) {
converter.convert(record.target.data).then(text => {
if (text != record.target.data) {
record.target.data = text;
}
});
}
break;
}
})
});
const option = {
"childList": true,
"subtree": true,
"characterData": true
};
let id = GM_registerMenuCommand("Listen event", listen_event);
function listen_event() {
GM_unregisterMenuCommand(id);
translate_body();
elmGetter.get("body").then(body => {
observer.observe(document.body, option);
id = GM_registerMenuCommand("Unlisten event", unlisten_event);
});
}
function unlisten_event() {
GM_unregisterMenuCommand(id);
observer.disconnect();
id = GM_registerMenuCommand("Listen event", listen_event);
}
}
function translate(pNode) {
let stack = [];
do {
pNode.childNodes.forEach(child => {
if (child.tagName && ExcludeTag.test(child.tagName))
return;
if (child.title) {
converter.convert(child.title).then(text => {
if (child.title != text) {
child.title = text;
}
});
}
if (child.alt) {
converter.convert(child.alt).then(text => {
if (child.alt != text) {
child.alt = text;
}
});
}
if (child.tagName == "INPUT" && !ExcludeType.test(child.type)) {
if (child.value) {
converter.convert(child.value).then(text => {
if (child.value != text) {
child.value = text;
}
});
}
if (child.placeholder) {
converter.convert(child.placeholder).then(text => {
if (child.placeholder != text) {
child.placeholder = text;
}
});
}
} else if (child.nodeType == 3) {
if (child.data) {
converter.convert(child.data).then(text => {
if (child.data != text) {
child.data = text;
}
});
}
}
if (child.nodeType == 1) {
stack.push(child);
}
});
} while (pNode = stack.pop());
}
};