From 938c12341228c64dbaddae219b91f8ed5a4c81ce Mon Sep 17 00:00:00 2001 From: Gabe Yuan Date: Fri, 15 Sep 2023 17:25:58 +0800 Subject: [PATCH] input box trans --- src/config/index.js | 1 - src/config/rules.js | 1 - src/libs/svg.js | 2 +- src/libs/translator.js | 232 ++++++++++++++++++++++++------------- src/views/Options/Rules.js | 12 -- 5 files changed, 153 insertions(+), 95 deletions(-) diff --git a/src/config/index.js b/src/config/index.js index a748525..5fef63e 100644 --- a/src/config/index.js +++ b/src/config/index.js @@ -190,7 +190,6 @@ export const DEFAULT_COLOR = "#209CEE"; // 默认高亮背景色/线条颜色 export const GLOBLA_RULE = { pattern: "*", selector: DEFAULT_SELECTOR, - inputSelector: "", translator: OPT_TRANS_MICROSOFT, fromLang: "auto", toLang: "zh-CN", diff --git a/src/config/rules.js b/src/config/rules.js index d15fdb8..4e65439 100644 --- a/src/config/rules.js +++ b/src/config/rules.js @@ -10,7 +10,6 @@ export const SHADOW_KEY = ">>>"; export const DEFAULT_RULE = { pattern: "", selector: "", - inputSelector: "", translator: GLOBAL_KEY, fromLang: GLOBAL_KEY, toLang: GLOBAL_KEY, diff --git a/src/libs/svg.js b/src/libs/svg.js index 13c44d3..9a335dd 100644 --- a/src/libs/svg.js +++ b/src/libs/svg.js @@ -1,5 +1,5 @@ export const loadingSvg = ` - + { - document.querySelectorAll(selector).forEach(async (node) => { - let text = ""; - let num = 0; - let timer; + async () => { + const node = document.activeElement; + if (!node || !(isInputNode(node) || isEditAbleNode(node))) { + return; + } - if (this._inputNodeNames.includes(node.nodeName)) { - text = node.value || ""; - } else { - text = node.textContent || ""; + let text = getNodeText(node); + const loadingId = "kiss-" + genEventName(); + + // todo: remove multiple char + if (triggerShortcut.length === 1 && triggerShortcut[0].length === 1) { + text = removeEndchar(text, triggerShortcut[0], triggerCount); + } + + if (!text.trim()) { + return; + } + + if (transSign) { + const res = matchInputStr(text, transSign); + if (res) { + let lang = res[1]; + if (lang === "zh" || lang === "cn") { + lang = "zh-CN"; + } else if (lang === "tw" || lang === "hk") { + lang = "zh-TW"; + } + if (lang && OPT_LANGS_LIST.includes(lang)) { + toLang = lang; + } + text = res[2]; } + } - // todo: remove multiple char - if (triggerShortcut.length === 1 && triggerShortcut[0].length === 1) { - text = removeEndchar(text, triggerShortcut[0], triggerCount); - } + // console.log("input -->", text); - if (!text.trim()) { + try { + addLoading(node, loadingId); + + await sleep(2000); + + const deLang = await tryDetectLang(text); + if (deLang && toLang.includes(deLang)) { return; } - if (transSign) { - const res = matchInputStr(text, transSign); - if (res) { - let lang = res[1]; - if (lang === "zh" || lang === "cn") { - lang = "zh-CN"; - } else if (lang === "tw" || lang === "hk") { - lang = "zh-TW"; - } - if (lang && OPT_LANGS_LIST.includes(lang)) { - toLang = lang; - } - text = res[2]; - } + const [trText, isSame] = await apiTranslate({ + translator, + text, + fromLang, + toLang, + apiSetting, + }); + if (!trText || isSame) { + return; } - // console.log("input -->", text); - - try { - const deLang = await tryDetectLang(text); - if (deLang && toLang.includes(deLang)) { - return; - } - - timer = setInterval(() => { - const loadingText = `${text} ${"-\\|/"[++num % 4]} `; - if (this._inputNodeNames.includes(node.nodeName)) { - node.value = loadingText; - } else { - node.textContent = loadingText; - } - }, 200); - - const [trText, isSame] = await apiTranslate({ - translator, - text, - fromLang, - toLang, - apiSetting, - }); - if (!trText || isSame) { - throw new Error("same lang or no res"); - } - - clearInterval(timer); - if (this._inputNodeNames.includes(node.nodeName)) { - node.value = trText; - node.dispatchEvent( - new Event("input", { bubbles: true, cancelable: true }) - ); - } else { - node.textContent = trText; - } - } catch (err) { - console.log("[translate input]", err.message); - timer && clearInterval(timer); - if (this._inputNodeNames.includes(node.nodeName)) { - node.value = text; - } else { - node.textContent = text; - } + if (isInputNode(node)) { + node.value = trText; + node.dispatchEvent( + new Event("input", { bubbles: true, cancelable: true }) + ); + return; } - }); + + selectContent(node); + await sleep(200); + + pasteContentEvent(node, trText); + await sleep(200); + + if (getNodeText(node).startsWith(text)) { + pasteContentCommand(node, trText); + await sleep(100); + } else { + collapseToEnd(node); + } + } catch (err) { + console.log("[translate input]", err.message); + } finally { + removeLoading(loadingId); + } }, triggerCount ); diff --git a/src/views/Options/Rules.js b/src/views/Options/Rules.js index 02db939..d53de57 100644 --- a/src/views/Options/Rules.js +++ b/src/views/Options/Rules.js @@ -64,7 +64,6 @@ function RuleFields({ rule, rules, setShow, setKeyword }) { const { pattern, selector, - inputSelector = "", translator, fromLang, toLang, @@ -179,17 +178,6 @@ function RuleFields({ rule, rules, setShow, setKeyword }) { onFocus={handleFocus} multiline /> -