From 931f818ca674336821864198524dd46c05ed29a9 Mon Sep 17 00:00:00 2001 From: Vanessa Date: Tue, 8 Aug 2023 16:09:42 +0800 Subject: [PATCH] :art: fix https://github.com/siyuan-note/siyuan/issues/8918 --- app/src/protyle/wysiwyg/index.ts | 23 +++++++++++++++++++++-- app/src/protyle/wysiwyg/keydown.ts | 6 ++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/app/src/protyle/wysiwyg/index.ts b/app/src/protyle/wysiwyg/index.ts index 7c9accdbf..9a0a3803f 100644 --- a/app/src/protyle/wysiwyg/index.ts +++ b/app/src/protyle/wysiwyg/index.ts @@ -1514,12 +1514,12 @@ export class WYSIWYG { this.element.addEventListener("keyup", (event) => { const range = getEditorRange(this.element).cloneRange(); + const nodeElement = hasClosestBlock(range.startContainer); if (event.key !== "PageUp" && event.key !== "PageDown" && event.key !== "Home" && event.key !== "End" && event.key.indexOf("Arrow") === -1 && event.key !== "Alt" && event.key !== "Shift" && event.key !== "CapsLock" && event.key !== "Escape" && event.key !== "Meta" && !/^F\d{1,2}$/.test(event.key) && (!event.isComposing || (event.isComposing && range.toString() !== "")) // https://github.com/siyuan-note/siyuan/issues/4341 ) { // 搜狗输入法不走 keydown,需重新记录历史状态 - const nodeElement = hasClosestBlock(range.startContainer); if (nodeElement && typeof protyle.wysiwyg.lastHTMLs[nodeElement.getAttribute("data-node-id")] === "undefined") { range.insertNode(document.createElement("wbr")); protyle.wysiwyg.lastHTMLs[nodeElement.getAttribute("data-node-id")] = nodeElement.outerHTML; @@ -1540,7 +1540,6 @@ export class WYSIWYG { } if (event.eventPhase !== 3 && !event.shiftKey && (event.key.indexOf("Arrow") > -1 || event.key === "Home" || event.key === "End" || event.key === "PageUp" || event.key === "PageDown") && !event.isComposing) { - const nodeElement = hasClosestBlock(range.startContainer); if (nodeElement) { this.setEmptyOutline(protyle, nodeElement); if (range.toString() === "") { @@ -1549,6 +1548,26 @@ export class WYSIWYG { } event.stopPropagation(); } + + // https://github.com/siyuan-note/siyuan/issues/8918 + if ((event.key === "ArrowLeft" || event.key === "ArrowRight" || + event.key === "Alt" || event.key === "Shift") && // 选中后 alt+shift+arrowRight 会导致光标和选中块不一致 + nodeElement && !nodeElement.classList.contains("protyle-wysiwyg--select")) { + const selectElements = Array.from(protyle.wysiwyg.element.querySelectorAll(".protyle-wysiwyg--select")) + let containRange = false + selectElements.find(item => { + if (item.contains(range.startContainer)) { + containRange = true + return true + } + }) + if (!containRange && selectElements.length > 0) { + selectElements.forEach(item => { + item.classList.remove("protyle-wysiwyg--select") + }) + nodeElement.classList.add("protyle-wysiwyg--select") + } + } }); this.element.addEventListener("dblclick", (event: MouseEvent & { target: HTMLElement }) => { diff --git a/app/src/protyle/wysiwyg/keydown.ts b/app/src/protyle/wysiwyg/keydown.ts index a9ead91a3..7d6ae6226 100644 --- a/app/src/protyle/wysiwyg/keydown.ts +++ b/app/src/protyle/wysiwyg/keydown.ts @@ -466,6 +466,10 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => { (event.shiftKey && !event.altKey && isCtrl(event) && (event.key === "Home" || event.key === "End") && !isMac())) { const topElement = hasTopClosestByAttribute(nodeElement, "data-node-id", null); if (topElement) { + // 超级块内已选中某个块 + topElement.querySelectorAll(".protyle-wysiwyg--select").forEach(item => { + item.classList.remove("protyle-wysiwyg--select"); + }); topElement.classList.add("protyle-wysiwyg--select"); let nextElement = event.key === "Home" ? topElement.previousElementSibling : topElement.nextElementSibling; while (nextElement) { @@ -485,6 +489,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => { // ctrl+home 光标移动到顶 if (!event.altKey && !event.shiftKey && isCtrl(event) && event.key === "Home") { goHome(protyle); + hideElements(["select"], protyle); event.stopPropagation(); event.preventDefault(); return; @@ -492,6 +497,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => { // ctrl+end 光标移动到尾 if (!event.altKey && !event.shiftKey && isCtrl(event) && event.key === "End") { goEnd(protyle); + hideElements(["select"], protyle); event.stopPropagation(); event.preventDefault(); return;