From f441a37d50f2a6116568be087bc12e58b3d80d4d Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Wed, 27 Nov 2024 10:43:54 +0800 Subject: [PATCH] :art: Cannot use the Microsoft Input Method to input Chinese https://github.com/siyuan-note/siyuan/issues/13288 --- app/src/protyle/wysiwyg/index.ts | 13 ++++++++++++- app/src/protyle/wysiwyg/keydown.ts | 4 +++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/src/protyle/wysiwyg/index.ts b/app/src/protyle/wysiwyg/index.ts index 2e766a6ef..b2656dc5a 100644 --- a/app/src/protyle/wysiwyg/index.ts +++ b/app/src/protyle/wysiwyg/index.ts @@ -2009,6 +2009,15 @@ export class WYSIWYG { let isComposition = false; // for iPhone this.element.addEventListener("compositionstart", (event) => { isComposition = true; + // 微软双拼由于 focusByRange 导致无法输入文字,因此不再 keydown 中记录了,但 keyup 会记录拼音字符,因此使用 isComposition 阻止 keyup 记录。 + // 但搜狗输入法选中后继续输入不走 keydown,isComposition 阻止了 keyup 记录,因此需在此记录。 + const range = getEditorRange(protyle.wysiwyg.element); + const nodeElement = hasClosestBlock(range.startContainer); + if (!isMac() && nodeElement) { + range.insertNode(document.createElement("wbr")); + protyle.wysiwyg.lastHTMLs[nodeElement.getAttribute("data-node-id")] = nodeElement.outerHTML; + nodeElement.querySelector("wbr").remove(); + } event.stopPropagation(); }); @@ -2086,8 +2095,10 @@ export class WYSIWYG { event.key !== "Meta" && event.key !== "Alt" && event.key !== "Control" && event.key !== "CapsLock" && !event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey && !/^F\d{1,2}$/.test(event.key)) { - // 搜狗输入法不走 keydown,需重新记录历史状态 + // 搜狗输入法不走 keydown,没有选中字符后不走 compositionstart,需重新记录历史状态 if (!isMac() && nodeElement && + // 微软双拼 keyup 会记录拼音字符,因此在 compositionstart 记录 + !isComposition && (typeof protyle.wysiwyg.lastHTMLs[nodeElement.getAttribute("data-node-id")] === "undefined" || range.toString() !== "" || !this.preventKeyup)) { range.insertNode(document.createElement("wbr")); protyle.wysiwyg.lastHTMLs[nodeElement.getAttribute("data-node-id")] = nodeElement.outerHTML; diff --git a/app/src/protyle/wysiwyg/keydown.ts b/app/src/protyle/wysiwyg/keydown.ts index 847231c1f..ce94a400c 100644 --- a/app/src/protyle/wysiwyg/keydown.ts +++ b/app/src/protyle/wysiwyg/keydown.ts @@ -166,7 +166,9 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => { // 有可能输入 shift+. ,因此需要使用 event.key 来进行判断 if (event.key !== "PageUp" && event.key !== "PageDown" && event.key !== "Home" && event.key !== "End" && event.key.indexOf("Arrow") === -1 && event.key !== "Escape" && event.key !== "Shift" && event.key !== "Meta" && event.key !== "Alt" && event.key !== "Control" && event.key !== "CapsLock" && - !isNotEditBlock(nodeElement) && !/^F\d{1,2}$/.test(event.key)) { + !isNotEditBlock(nodeElement) && !/^F\d{1,2}$/.test(event.key) && + // 微软双拼使用 compositionstart,否则 focusByRange 导致无法输入文字 + event.key !== "Process") { const cloneRange = range.cloneRange(); range.collapse(false); range.insertNode(document.createElement("wbr"));