Punctuation: English<->Chinese
// ==UserScript==
// @name punctuation_convert
// @name:zh-CN 中英标点转换
// @name:zh-TW 中英標點轉換
// @namespace punctuation_convert
// @description Punctuation: English<->Chinese
// @description:zh-CN Punctuation: English<->Chinese
// @description:zh-TW Punctuation: English<->Chinese
// @include http://*
// @include https://*
// @run-at document-end
// @grant GM_registerMenuCommand
// @grant GM_setValue
// @grant GM_getValue
// @author zhuzemin
// @version 1.01
// ==/UserScript==
//config
let config = {
'debug': false,
'mode': GM_getValue('mode') || 1
}
let debug = config.debug ? console.log.bind(console) : function () {
};
// prepare UserPrefs
setUserPref(
'mode',
config.mode,
'Punctuation: English<->Chinese',
`English->Chinese: "1"; Chinese->English: "0"`,
);
let init = function () {
try {
document.title = convert(document.title);
findTextNode(document.documentElement);
debug(document.title);
} catch (e) {
debug(e);
}
}
window.addEventListener('load', init);
function findTextNode(o) {
let obj = o.childNodes;
let olen = obj.length;
for (let i = 0; i < olen; i++) {
if (obj[i].splitText)
obj[i].data = convert(obj[i].data);
else if (obj[i].childNodes)
findTextNode(obj[i]);
}
}
function convert(cc) {
let E_pun = ',.!?[]()<>"\'';
let C_pun = ',。!?【】()《》“‘';
let str = "";
let find;
let clen = cc.length;
let src = null;
let dest = null;
let pattern = null;
if (config.mode == 1) {
src = E_pun;
dest = C_pun;
pattern = '[/x00-xff]';
}
else if (config.mode == 0) {
src = C_pun;
dest = E_pun;
pattern = "[^\x00-\xff]";
}
for (let i = 0; i < clen; i++) {
let ch = cc.charAt(i);
let rerr = new RegExp(pattern);
if (ch.search(rerr) == -1)
find = -1;
else
find = src.indexOf(ch);
if (find != -1)
str += dest.charAt(find);
else
str += ch;
}
return str
}
/**
* Create a user setting prompt
* @param {string} varName
* @param {any} defaultVal
* @param {string} menuText
* @param {string} promtText
* @param {function} func
*/
function setUserPref(varName, defaultVal, menuText, promtText, func = null) {
GM_registerMenuCommand(menuText, function () {
let val = prompt(promtText, GM_getValue(varName, defaultVal));
if (val === null) { return; } // end execution if clicked CANCEL
GM_setValue(varName, val);
if (func != null) {
func(val);
}
});
}