This commit is contained in:
Vanessa 2023-08-08 16:09:42 +08:00
parent 25dd919cf5
commit 931f818ca6
2 changed files with 27 additions and 2 deletions

View file

@ -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 }) => {

View file

@ -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;