From a8347b969eb81370d67569aafb8f45f1f6f48ad9 Mon Sep 17 00:00:00 2001 From: Liyuan Li Date: Thu, 26 Mar 2020 14:17:57 +0800 Subject: [PATCH] :art: #27 table --- src/ts/hint/index.ts | 8 +- src/ts/ir/highlightToolbar.ts | 4 + src/ts/ir/index.ts | 4 +- src/ts/ir/process.ts | 2 +- src/ts/ir/processKeydown.ts | 13 +- src/ts/toolbar/EditMode.ts | 2 +- src/ts/util/processTable.ts | 255 +++++++++++++++++++++++++++++ src/ts/wysiwyg/highlightToolbar.ts | 23 +-- src/ts/wysiwyg/processKeydown.ts | 202 +---------------------- 9 files changed, 281 insertions(+), 232 deletions(-) create mode 100644 src/ts/util/processTable.ts diff --git a/src/ts/hint/index.ts b/src/ts/hint/index.ts index 5de385030..873ea3918 100644 --- a/src/ts/hint/index.ts +++ b/src/ts/hint/index.ts @@ -81,13 +81,7 @@ export class Hint { return; } - let editorElement = vditor.sv.element; - if (vditor.currentMode === "wysiwyg") { - editorElement = vditor.wysiwyg.element; - } else if (vditor.currentMode === "ir") { - editorElement = vditor.ir.element; - } - + const editorElement = vditor[vditor.currentMode].element; const textareaPosition = getCursorPosition(editorElement); const x = textareaPosition.left; const y = textareaPosition.top; diff --git a/src/ts/ir/highlightToolbar.ts b/src/ts/ir/highlightToolbar.ts index 8c661f720..825d665c3 100644 --- a/src/ts/ir/highlightToolbar.ts +++ b/src/ts/ir/highlightToolbar.ts @@ -63,6 +63,10 @@ export const highlightToolbar = (vditor: IVditor) => { "list", "ordered-list", "check", "code", "inline-code", "upload", "link", "table", "record"]); setCurrentToolbar(vditor.toolbar.elements, ["code"]); } + const tableElement = hasClosestByMatchTag(typeElement, "TABLE") as HTMLTableElement; + if (tableElement) { + disableToolbar(vditor.toolbar.elements, ["table"]); + } }, 200); }; diff --git a/src/ts/ir/index.ts b/src/ts/ir/index.ts index 5fee870f4..14443006e 100644 --- a/src/ts/ir/index.ts +++ b/src/ts/ir/index.ts @@ -8,7 +8,7 @@ import { getSelectPosition, insertHTML, setSelectionByPosition, - setSelectionFocus + setSelectionFocus, } from "../util/selection"; import {expandMarker} from "./expandMarker"; import {highlightToolbar} from "./highlightToolbar"; @@ -256,7 +256,7 @@ class IR { // 行内数学公式 if (previewRenderElement.tagName === "SPAN" && (event.key === "ArrowDown" || event.key === "ArrowRight")) { - range.selectNodeContents(previewRenderElement.parentElement.lastElementChild) + range.selectNodeContents(previewRenderElement.parentElement.lastElementChild); range.collapse(false); event.preventDefault(); return true; diff --git a/src/ts/ir/process.ts b/src/ts/ir/process.ts index f726101df..56421ba4d 100644 --- a/src/ts/ir/process.ts +++ b/src/ts/ir/process.ts @@ -178,7 +178,7 @@ export const processToolbar = (vditor: IVditor, actionBtn: Element, prefix: stri } document.execCommand("insertHTML", false, html); } else if (commandName === "italic" || commandName === "bold" || commandName === "strike" - || commandName === "inline-code" || commandName === "code") { + || commandName === "inline-code" || commandName === "code" || commandName === "table") { let html; if (range.toString() === "") { html = `${prefix}${suffix}`; diff --git a/src/ts/ir/processKeydown.ts b/src/ts/ir/processKeydown.ts index 88df6ad92..c653b6c74 100644 --- a/src/ts/ir/processKeydown.ts +++ b/src/ts/ir/processKeydown.ts @@ -2,6 +2,7 @@ import {Constants} from "../constants"; import {isCtrl} from "../util/compatibility"; import {scrollCenter} from "../util/editorCommenEvent"; import {hasClosestByAttribute, hasClosestByClassName, hasClosestByMatchTag} from "../util/hasClosest"; +import {tableHotkey} from "../util/processTable"; import {getSelectPosition, setRangeByWbr} from "../util/selection"; import {processAfterRender} from "./process"; @@ -43,6 +44,7 @@ export const processKeydown = (vditor: IVditor, event: KeyboardEvent) => { } const pElement = hasClosestByMatchTag(startContainer, "P"); + // 代码块 const preRenderElement = hasClosestByClassName(startContainer, "vditor-ir__marker--pre"); if (preRenderElement && preRenderElement.tagName === "PRE") { const codeRenderElement = preRenderElement.firstChild as HTMLElement; @@ -78,7 +80,7 @@ export const processKeydown = (vditor: IVditor, event: KeyboardEvent) => { // Backspace: 光标位于第零个字符,仅删除代码块标签 preRenderElement.parentElement.outerHTML = `

${codeRenderElement.innerHTML}

`; - setRangeByWbr(vditor.wysiwyg.element, range); + setRangeByWbr(vditor.ir.element, range); processAfterRender(vditor); event.preventDefault(); return true; @@ -100,8 +102,8 @@ export const processKeydown = (vditor: IVditor, event: KeyboardEvent) => { // 代码块下无元素或者为代码块元素,添加空块 if ((event.key === "ArrowDown" && codeRenderElement.textContent.trimRight().substr(codePosition.start).indexOf("\n") === -1) || (event.key === "ArrowRight" && codePosition.start >= codeRenderElement.textContent.trimRight().length)) { - const nextElement = preRenderElement.parentElement.nextElementSibling - if (!nextElement || (nextElement && nextElement.getAttribute('data-type'))) { + const nextElement = preRenderElement.parentElement.nextElementSibling; + if (!nextElement || (nextElement && nextElement.getAttribute("data-type"))) { preRenderElement.parentElement.insertAdjacentHTML("afterend", `

${Constants.ZWSP}

`); setRangeByWbr(vditor.ir.element, range); @@ -174,6 +176,11 @@ export const processKeydown = (vditor: IVditor, event: KeyboardEvent) => { } } + // table + if (tableHotkey(vditor, event, range, processAfterRender)) { + return true; + } + // blockquote const blockquoteElement = hasClosestByMatchTag(startContainer, "BLOCKQUOTE"); if (blockquoteElement && range.toString() === "") { diff --git a/src/ts/toolbar/EditMode.ts b/src/ts/toolbar/EditMode.ts index 5a48bf068..c29418d47 100644 --- a/src/ts/toolbar/EditMode.ts +++ b/src/ts/toolbar/EditMode.ts @@ -27,7 +27,7 @@ export const setEditMode = (vditor: IVditor, type: string, event?: Event) => { enableToolbar(vditor.toolbar.elements, allToolbar); removeCurrentToolbar(vditor.toolbar.elements, allToolbar); - const irUnUsedToolbar = ["list", "ordered-list", "check", "table"]; + const irUnUsedToolbar = ["list", "ordered-list", "check"]; showToolbar(vditor.toolbar.elements, irUnUsedToolbar); if (type === "ir") { hideToolbar(vditor.toolbar.elements, ["format", "both", "preview"].concat(irUnUsedToolbar)); diff --git a/src/ts/util/processTable.ts b/src/ts/util/processTable.ts new file mode 100644 index 000000000..3e35b2a0a --- /dev/null +++ b/src/ts/util/processTable.ts @@ -0,0 +1,255 @@ +import {isCtrl} from "./compatibility"; +import {scrollCenter} from "./editorCommenEvent"; +import {hasClosestByMatchTag} from "./hasClosest"; +import {matchHotKey} from "./hotKey"; +import {setRangeByWbr} from "./selection"; + +// 光标设置到前一个表格中 +const goPreviousCell = (cellElement: HTMLElement, range: Range, isSelected = true) => { + let previousElement = cellElement.previousElementSibling; + if (!previousElement) { + if (cellElement.parentElement.previousElementSibling) { + previousElement = cellElement.parentElement.previousElementSibling.lastElementChild; + } else if (cellElement.parentElement.parentElement.tagName === "TBODY" && + cellElement.parentElement.parentElement.previousElementSibling) { + previousElement = cellElement.parentElement + .parentElement.previousElementSibling.lastElementChild.lastElementChild; + } else { + previousElement = null; + } + } + if (previousElement) { + range.selectNodeContents(previousElement); + if (!isSelected) { + range.collapse(false); + } + } +}; + +export const setTableAlign = (tableElement: HTMLTableElement, type: string) => { + const cell = getSelection().getRangeAt(0).startContainer.parentElement; + + const columnCnt = tableElement.rows[0].cells.length; + const rowCnt = tableElement.rows.length; + let currentColumn = 0; + + for (let i = 0; i < rowCnt; i++) { + for (let j = 0; j < columnCnt; j++) { + if (tableElement.rows[i].cells[j].isEqualNode(cell)) { + currentColumn = j; + break; + } + } + } + for (let k = 0; k < rowCnt; k++) { + tableElement.rows[k].cells[currentColumn].setAttribute("align", type); + } +}; + +export const tableHotkey = (vditor: IVditor, event: KeyboardEvent, range: Range, + afterRenderEvent: (vditor: IVditor) => void) => { + const startContainer = range.startContainer; + const cellElement = hasClosestByMatchTag(startContainer, "TD") || + hasClosestByMatchTag(startContainer, "TH"); + if (cellElement) { + // 换行或软换行:在 cell 中添加 br + if (!isCtrl(event) && !event.altKey && event.key === "Enter") { + if (!cellElement.lastElementChild || + (cellElement.lastElementChild && (!cellElement.lastElementChild.isEqualNode(cellElement.lastChild) || + cellElement.lastElementChild.tagName !== "BR"))) { + cellElement.insertAdjacentHTML("beforeend", "
"); + } + const brElement = document.createElement("br"); + range.insertNode(brElement); + range.setStartAfter(brElement); + afterRenderEvent(vditor); + scrollCenter(vditor[vditor.currentMode].element); + event.preventDefault(); + return true; + } + + // Backspace:光标移动到前一个 cell + if (!isCtrl(event) && !event.shiftKey && !event.altKey && event.key === "Backspace" + && range.startOffset === 0 && range.toString() === "") { + goPreviousCell(cellElement, range, false); + event.preventDefault(); + return true; + } + + // tab:光标移向下一个 cell + if (event.key === "Tab") { + if (event.shiftKey) { + // shift + tab 光标移动到前一个 cell + goPreviousCell(cellElement, range); + event.preventDefault(); + return true; + } + + let nextElement = cellElement.nextElementSibling; + if (!nextElement) { + if (cellElement.parentElement.nextElementSibling) { + nextElement = cellElement.parentElement.nextElementSibling.firstElementChild; + } else if (cellElement.parentElement.parentElement.tagName === "THEAD" && + cellElement.parentElement.parentElement.nextElementSibling) { + nextElement = + cellElement.parentElement.parentElement.nextElementSibling.firstElementChild.firstElementChild; + } else { + nextElement = null; + } + } + if (nextElement) { + range.selectNodeContents(nextElement); + } + event.preventDefault(); + return true; + } + + // 删除当前行 + if (cellElement.tagName === "TD" && matchHotKey("⌘--", event)) { + const tbodyElement = cellElement.parentElement.parentElement; + if (cellElement.parentElement.previousElementSibling) { + range.selectNodeContents(cellElement.parentElement.previousElementSibling.lastElementChild); + } else { + range.selectNodeContents(tbodyElement.previousElementSibling.lastElementChild.lastElementChild); + } + + if (tbodyElement.childElementCount === 1) { + tbodyElement.remove(); + } else { + cellElement.parentElement.remove(); + } + + range.collapse(false); + event.preventDefault(); + afterRenderEvent(vditor); + return true; + } + + // 下方新添加一行 https://github.com/Vanessa219/vditor/issues/46 + if (matchHotKey("⌘-=", event)) { + let rowHTML = ""; + for (let m = 0; m < cellElement.parentElement.childElementCount; m++) { + rowHTML += `${m === 0 ? " " : " "}`; + } + if (cellElement.tagName === "TH") { + cellElement.parentElement.parentElement.insertAdjacentHTML("afterend", + `${rowHTML}`); + } else { + cellElement.parentElement.insertAdjacentHTML("afterend", `${rowHTML}`); + } + + setRangeByWbr(vditor[vditor.currentMode].element, range); + afterRenderEvent(vditor); + scrollCenter(vditor[vditor.currentMode].element); + event.preventDefault(); + return true; + } + + // 后方新添加一列 + const tableElement = cellElement.parentElement.parentElement.parentElement as HTMLTableElement; + if (matchHotKey("⌘-⇧-=", event)) { + let index = 0; + let previousElement = cellElement.previousElementSibling; + while (previousElement) { + index++; + previousElement = previousElement.previousElementSibling; + } + for (let i = 0; i < tableElement.rows.length; i++) { + if (i === 0) { + tableElement.rows[i].cells[index].insertAdjacentHTML("afterend", " "); + } else { + tableElement.rows[i].cells[index].insertAdjacentHTML("afterend", " "); + } + } + + afterRenderEvent(vditor); + event.preventDefault(); + return true; + } + + // 删除当前列 + if (matchHotKey("⌘-⇧--", event)) { + let index = 0; + let previousElement = cellElement.previousElementSibling; + while (previousElement) { + index++; + previousElement = previousElement.previousElementSibling; + } + if (cellElement.previousElementSibling || cellElement.nextElementSibling) { + range.selectNodeContents(cellElement.previousElementSibling || cellElement.nextElementSibling); + range.collapse(true); + } + for (let i = 0; i < tableElement.rows.length; i++) { + if (tableElement.rows.length === 1) { + tableElement.remove(); + } else { + tableElement.rows[i].cells[index].remove(); + } + } + afterRenderEvent(vditor); + event.preventDefault(); + return true; + } + + // 剧左 + if (matchHotKey("⌘-⇧-L", event)) { + if (vditor.currentMode === "ir") { + setTableAlign(tableElement, "left"); + afterRenderEvent(vditor); + event.preventDefault(); + return true; + } else { + const itemElement: HTMLElement = vditor.wysiwyg.popover.querySelector('[data-type="left"]'); + if (itemElement) { + itemElement.click(); + event.preventDefault(); + return true; + } + } + } + + // 剧中 + if (matchHotKey("⌘-⇧-C", event)) { + if (vditor.currentMode === "ir") { + setTableAlign(tableElement, "center"); + afterRenderEvent(vditor); + event.preventDefault(); + return true; + } else { + const itemElement: HTMLElement = vditor.wysiwyg.popover.querySelector('[data-type="center"]'); + if (itemElement) { + itemElement.click(); + event.preventDefault(); + return true; + } + } + } + // 剧右 + if (matchHotKey("⌘-⇧-R", event)) { + if (vditor.currentMode === "ir") { + setTableAlign(tableElement, "right"); + afterRenderEvent(vditor); + event.preventDefault(); + return true; + } else { + const itemElement: HTMLElement = vditor.wysiwyg.popover.querySelector('[data-type="right"]'); + if (itemElement) { + itemElement.click(); + event.preventDefault(); + return true; + } + } + } + + // focus row input + if (vditor.currentMode === "wysiwyg" && + !isCtrl(event) && event.key === "Enter" && !event.shiftKey && event.altKey) { + const inputElement = (vditor.wysiwyg.popover.querySelector(".vditor-input") as HTMLInputElement); + inputElement.focus(); + inputElement.select(); + event.preventDefault(); + return true; + } + } + return false; +}; diff --git a/src/ts/wysiwyg/highlightToolbar.ts b/src/ts/wysiwyg/highlightToolbar.ts index 49219f9af..fbcd423f9 100644 --- a/src/ts/wysiwyg/highlightToolbar.ts +++ b/src/ts/wysiwyg/highlightToolbar.ts @@ -19,6 +19,7 @@ import { hasClosestByTag, hasTopClosestByTag, } from "../util/hasClosest"; +import {setTableAlign} from "../util/processTable"; import {getEditorRange, selectIsEditor, setRangeByWbr, setSelectionFocus} from "../util/selection"; import {afterRenderEvent} from "./afterRenderEvent"; import {nextIsImg} from "./inlineTag"; @@ -271,24 +272,7 @@ export const highlightToolbar = (vditor: IVditor) => { }; const setAlign = (type: string) => { - const cell = getSelection().getRangeAt(0).startContainer.parentElement; - - const columnCnt = tableElement.rows[0].cells.length; - const rowCnt = tableElement.rows.length; - let currentColumn = 0; - - for (let i = 0; i < rowCnt; i++) { - for (let j = 0; j < columnCnt; j++) { - if (tableElement.rows[i].cells[j].isEqualNode(cell)) { - currentColumn = j; - break; - } - } - } - for (let k = 0; k < rowCnt; k++) { - tableElement.rows[k].cells[currentColumn].setAttribute("align", type); - } - + setTableAlign(tableElement, type); if (type === "right") { left.classList.remove("vditor-icon--current"); center.classList.remove("vditor-icon--current"); @@ -766,7 +750,8 @@ const genClose = (popover: HTMLElement, element: HTMLElement, vditor: IVditor) = popover.insertAdjacentElement("beforeend", close); }; -const linkHotkey = (editor: HTMLElement, element: HTMLElement, event: KeyboardEvent, nextInputElement: HTMLInputElement) => { +const linkHotkey = (editor: HTMLElement, element: HTMLElement, event: KeyboardEvent, + nextInputElement: HTMLInputElement) => { if (event.isComposing) { return; } diff --git a/src/ts/wysiwyg/processKeydown.ts b/src/ts/wysiwyg/processKeydown.ts index 2ec7acf0f..133d0fa57 100644 --- a/src/ts/wysiwyg/processKeydown.ts +++ b/src/ts/wysiwyg/processKeydown.ts @@ -8,6 +8,7 @@ import { hasTopClosestByTag, } from "../util/hasClosest"; import {matchHotKey} from "../util/hotKey"; +import {tableHotkey} from "../util/processTable"; import {getSelectPosition, setRangeByWbr, setSelectionFocus} from "../util/selection"; import {afterRenderEvent} from "./afterRenderEvent"; import {listOutdent} from "./highlightToolbar"; @@ -16,27 +17,6 @@ import {processCodeRender, showCode} from "./processCodeRender"; import {isHeadingMD, isHrMD} from "./processMD"; import {removeHeading, setHeading} from "./setHeading"; -const goPreviousCell = (cellElement: HTMLElement, range: Range, isSelected = true) => { - let previousElement = cellElement.previousElementSibling; - if (!previousElement) { - if (cellElement.parentElement.previousElementSibling) { - previousElement = cellElement.parentElement.previousElementSibling.lastElementChild; - } else if (cellElement.parentElement.parentElement.tagName === "TBODY" && - cellElement.parentElement.parentElement.previousElementSibling) { - previousElement = cellElement.parentElement - .parentElement.previousElementSibling.lastElementChild.lastElementChild; - } else { - previousElement = null; - } - } - if (previousElement) { - range.selectNodeContents(previousElement); - if (!isSelected) { - range.collapse(false); - } - } -}; - export const processKeydown = (vditor: IVditor, event: KeyboardEvent) => { // Chrome firefox 触发 compositionend 机制不一致 https://github.com/Vanessa219/vditor/issues/188 vditor.wysiwyg.composingLock = event.isComposing; @@ -125,184 +105,8 @@ export const processKeydown = (vditor: IVditor, event: KeyboardEvent) => { } // table - const cellElement = hasClosestByMatchTag(startContainer, "TD") || - hasClosestByMatchTag(startContainer, "TH"); - if (cellElement) { - // 换行或软换行:在 cell 中添加 br - if (!isCtrl(event) && !event.altKey && event.key === "Enter") { - if (!cellElement.lastElementChild || - (cellElement.lastElementChild && (!cellElement.lastElementChild.isEqualNode(cellElement.lastChild) || - cellElement.lastElementChild.tagName !== "BR"))) { - cellElement.insertAdjacentHTML("beforeend", "
"); - } - const brElement = document.createElement("br"); - range.insertNode(brElement); - range.setStartAfter(brElement); - afterRenderEvent(vditor); - scrollCenter(vditor.wysiwyg.element); - event.preventDefault(); - return true; - } - - // Backspace:光标移动到前一个 cell - if (!isCtrl(event) && !event.shiftKey && !event.altKey && event.key === "Backspace" - && range.startOffset === 0 && range.toString() === "") { - goPreviousCell(cellElement, range, false); - event.preventDefault(); - return true; - } - - // tab:光标移向下一个 cell - if (event.key === "Tab") { - if (event.shiftKey) { - // shift + tab 光标移动到前一个 cell - goPreviousCell(cellElement, range); - event.preventDefault(); - return true; - } - - let nextElement = cellElement.nextElementSibling; - if (!nextElement) { - if (cellElement.parentElement.nextElementSibling) { - nextElement = cellElement.parentElement.nextElementSibling.firstElementChild; - } else if (cellElement.parentElement.parentElement.tagName === "THEAD" && - cellElement.parentElement.parentElement.nextElementSibling) { - nextElement = - cellElement.parentElement.parentElement.nextElementSibling.firstElementChild.firstElementChild; - } else { - nextElement = null; - } - } - if (nextElement) { - range.selectNodeContents(nextElement); - } - event.preventDefault(); - return true; - } - - // 删除当前行 - if (cellElement.tagName === "TD" && matchHotKey("⌘--", event)) { - const tbodyElement = cellElement.parentElement.parentElement; - if (cellElement.parentElement.previousElementSibling) { - range.selectNodeContents(cellElement.parentElement.previousElementSibling.lastElementChild); - } else { - range.selectNodeContents(tbodyElement.previousElementSibling.lastElementChild.lastElementChild); - } - - if (tbodyElement.childElementCount === 1) { - tbodyElement.remove(); - } else { - cellElement.parentElement.remove(); - } - - range.collapse(false); - event.preventDefault(); - afterRenderEvent(vditor); - return true; - } - - // 下方新添加一行 https://github.com/Vanessa219/vditor/issues/46 - if (matchHotKey("⌘-=", event)) { - let rowHTML = ""; - for (let m = 0; m < cellElement.parentElement.childElementCount; m++) { - rowHTML += `${m === 0 ? " " : " "}`; - } - if (cellElement.tagName === "TH") { - cellElement.parentElement.parentElement.insertAdjacentHTML("afterend", - `${rowHTML}`); - } else { - cellElement.parentElement.insertAdjacentHTML("afterend", `${rowHTML}`); - } - setRangeByWbr(vditor.wysiwyg.element, range); - afterRenderEvent(vditor); - scrollCenter(vditor.wysiwyg.element); - event.preventDefault(); - return true; - } - - // 后方新添加一列 - const tableElement = cellElement.parentElement.parentElement.parentElement as HTMLTableElement; - if (matchHotKey("⌘-⇧-=", event)) { - let index = 0; - let previousElement = cellElement.previousElementSibling; - while (previousElement) { - index++; - previousElement = previousElement.previousElementSibling; - } - for (let i = 0; i < tableElement.rows.length; i++) { - if (i === 0) { - tableElement.rows[i].cells[index].insertAdjacentHTML("afterend", " "); - } else { - tableElement.rows[i].cells[index].insertAdjacentHTML("afterend", " "); - } - } - - afterRenderEvent(vditor); - event.preventDefault(); - return true; - } - - // 删除当前列 - if (matchHotKey("⌘-⇧--", event)) { - let index = 0; - let previousElement = cellElement.previousElementSibling; - while (previousElement) { - index++; - previousElement = previousElement.previousElementSibling; - } - if (cellElement.previousElementSibling || cellElement.nextElementSibling) { - range.selectNodeContents(cellElement.previousElementSibling || cellElement.nextElementSibling); - range.collapse(true); - } - for (let i = 0; i < tableElement.rows.length; i++) { - if (tableElement.rows.length === 1) { - tableElement.remove(); - } else { - tableElement.rows[i].cells[index].remove(); - } - } - afterRenderEvent(vditor); - event.preventDefault(); - return true; - } - - // focus row input - if (!isCtrl(event) && event.key === "Enter" && !event.shiftKey && event.altKey) { - const inputElemment = (vditor.wysiwyg.popover.querySelector(".vditor-input") as HTMLInputElement); - inputElemment.focus(); - inputElemment.select(); - event.preventDefault(); - return true; - } - - // 剧左 - if (matchHotKey("⌘-⇧-L", event)) { - const itemElement: HTMLElement = vditor.wysiwyg.popover.querySelector('[data-type="left"]'); - if (itemElement) { - itemElement.click(); - event.preventDefault(); - return true; - } - } - - // 剧中 - if (matchHotKey("⌘-⇧-C", event)) { - const itemElement: HTMLElement = vditor.wysiwyg.popover.querySelector('[data-type="center"]'); - if (itemElement) { - itemElement.click(); - event.preventDefault(); - return true; - } - } - // 剧右 - if (matchHotKey("⌘-⇧-R", event)) { - const itemElement: HTMLElement = vditor.wysiwyg.popover.querySelector('[data-type="right"]'); - if (itemElement) { - itemElement.click(); - event.preventDefault(); - return true; - } - } + if (tableHotkey(vditor, event, range, afterRenderEvent)) { + return true; } // code render