From 595d0078985cde2d9cf5556303758a1b7d2ec800 Mon Sep 17 00:00:00 2001 From: Vanessa Date: Wed, 28 Sep 2022 10:59:12 +0800 Subject: [PATCH] :children_crossing: https://github.com/siyuan-note/siyuan/issues/5955 3&4 --- app/src/protyle/util/table.ts | 48 +++++++++++++++++++++++++++++++- app/src/protyle/wysiwyg/enter.ts | 27 ------------------ 2 files changed, 47 insertions(+), 28 deletions(-) diff --git a/app/src/protyle/util/table.ts b/app/src/protyle/util/table.ts index 9546620a2..cda4ea7b9 100644 --- a/app/src/protyle/util/table.ts +++ b/app/src/protyle/util/table.ts @@ -46,7 +46,7 @@ export const setTableAlign = (protyle: IProtyle, cellElements: HTMLElement[], no const tableElement = nodeElement.querySelector("table"); const columnCnt = tableElement.rows[0].cells.length; const rowCnt = tableElement.rows.length; - const currentColumns:number[] = []; + const currentColumns: number[] = []; for (let i = 0; i < rowCnt; i++) { for (let j = 0; j < columnCnt; j++) { @@ -311,6 +311,52 @@ export const fixTable = (protyle: IProtyle, event: KeyboardEvent, range: Range) return false; } + // shift+enter 软换行 + if (event.key === "Enter" && event.shiftKey && !isCtrl(event) && !event.altKey) { + const wbrElement = document.createElement("wbr"); + range.insertNode(wbrElement); + const oldHTML = nodeElement.outerHTML; + wbrElement.remove(); + if (cellElement && !cellElement.innerHTML.endsWith("
")) { + cellElement.insertAdjacentHTML("beforeend", "
"); + } + range.extractContents(); + const types = protyle.toolbar.getCurrentType(range); + if (types.includes("code") && range.startContainer.nodeType !== 3) { + // https://github.com/siyuan-note/siyuan/issues/4169 + const brElement = document.createElement("br"); + (range.startContainer as HTMLElement).after(brElement); + range.setStartAfter(brElement); + } else { + range.insertNode(document.createElement("br")); + } + range.collapse(false); + scrollCenter(protyle); + updateTransaction(protyle, nodeElement.getAttribute("data-node-id"), nodeElement.outerHTML, oldHTML); + event.preventDefault(); + return true; + } + // enter 光标跳转到下一行同列 + if (!isCtrl(event) && !event.shiftKey && !event.altKey &&event.key === "Enter") { + event.preventDefault(); + const trElement = cellElement.parentElement as HTMLTableRowElement; + if ((!trElement.nextElementSibling && trElement.parentElement.tagName === "TBODY") || + (trElement.parentElement.tagName === "THEAD" && !trElement.parentElement.nextElementSibling)) { + return true; + } + let nextElement = trElement.nextElementSibling as HTMLTableRowElement; + if (!nextElement) { + nextElement = trElement.parentElement.nextElementSibling.firstChild as HTMLTableRowElement; + } + if (!nextElement) { + return true; + } + range.selectNodeContents(nextElement.cells[getColIndex(cellElement)]); + range.collapse(true); + scrollCenter(protyle); + return true; + } + // tab:光标移向下一个 cell if (event.key === "Tab" && !event.ctrlKey) { if (event.shiftKey) { diff --git a/app/src/protyle/wysiwyg/enter.ts b/app/src/protyle/wysiwyg/enter.ts index c6ce67a7d..e64348690 100644 --- a/app/src/protyle/wysiwyg/enter.ts +++ b/app/src/protyle/wysiwyg/enter.ts @@ -272,33 +272,6 @@ export const enter = (blockElement: HTMLElement, range: Range, protyle: IProtyle return true; } - // table - if (blockElement.getAttribute("data-type") === "NodeTable" && - (hasClosestByMatchTag(range.startContainer, "TD") || hasClosestByMatchTag(range.startContainer, "TH"))) { - const wbrElement = document.createElement("wbr"); - range.insertNode(wbrElement); - const oldHTML = blockElement.outerHTML; - wbrElement.remove(); - const cellElement = hasClosestByMatchTag(range.startContainer, "TD") || hasClosestByMatchTag(range.startContainer, "TH"); - if (cellElement && !cellElement.innerHTML.endsWith("
")) { - cellElement.insertAdjacentHTML("beforeend", "
"); - } - range.extractContents(); - const types = protyle.toolbar.getCurrentType(range); - if (types.includes("code") && range.startContainer.nodeType !== 3) { - // https://github.com/siyuan-note/siyuan/issues/4169 - const brElement = document.createElement("br"); - (range.startContainer as HTMLElement).after(brElement); - range.setStartAfter(brElement); - } else { - range.insertNode(document.createElement("br")); - } - range.collapse(false); - scrollCenter(protyle); - updateTransaction(protyle, blockElement.getAttribute("data-node-id"), blockElement.outerHTML, oldHTML); - return true; - } - // bq if (editableElement.textContent.replace(Constants.ZWSP, "").replace("\n", "") === "" && blockElement.nextElementSibling && blockElement.nextElementSibling.classList.contains("protyle-attr") && blockElement.parentElement.getAttribute("data-type") === "NodeBlockquote") {