roosterjs-content-model-core 9.45.1 → 9.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/lib/command/cutCopy/getContentForCopy.js +4 -15
  2. package/lib/command/cutCopy/getContentForCopy.js.map +1 -1
  3. package/lib/coreApi/setDOMSelection/setDOMSelection.js +5 -58
  4. package/lib/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  5. package/lib/coreApi/setDOMSelection/setTableCellsStyle.d.ts +17 -0
  6. package/lib/coreApi/setDOMSelection/setTableCellsStyle.js +85 -0
  7. package/lib/coreApi/setDOMSelection/setTableCellsStyle.js.map +1 -0
  8. package/lib/coreApi/setDOMSelection/toggleTableSelection.d.ts +8 -0
  9. package/lib/coreApi/setDOMSelection/toggleTableSelection.js +34 -0
  10. package/lib/coreApi/setDOMSelection/toggleTableSelection.js.map +1 -0
  11. package/lib/coreApi/switchShadowEdit/switchShadowEdit.js +3 -0
  12. package/lib/coreApi/switchShadowEdit/switchShadowEdit.js.map +1 -1
  13. package/lib/corePlugin/selection/SelectionPlugin.js +3 -0
  14. package/lib/corePlugin/selection/SelectionPlugin.js.map +1 -1
  15. package/lib/editor/Editor.js +1 -1
  16. package/lib/editor/Editor.js.map +1 -1
  17. package/lib-amd/command/cutCopy/getContentForCopy.js +5 -14
  18. package/lib-amd/command/cutCopy/getContentForCopy.js.map +1 -1
  19. package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js +4 -58
  20. package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  21. package/lib-amd/coreApi/setDOMSelection/setTableCellsStyle.d.ts +17 -0
  22. package/lib-amd/coreApi/setDOMSelection/setTableCellsStyle.js +85 -0
  23. package/lib-amd/coreApi/setDOMSelection/setTableCellsStyle.js.map +1 -0
  24. package/lib-amd/coreApi/setDOMSelection/toggleTableSelection.d.ts +8 -0
  25. package/lib-amd/coreApi/setDOMSelection/toggleTableSelection.js +34 -0
  26. package/lib-amd/coreApi/setDOMSelection/toggleTableSelection.js.map +1 -0
  27. package/lib-amd/coreApi/switchShadowEdit/switchShadowEdit.js +3 -1
  28. package/lib-amd/coreApi/switchShadowEdit/switchShadowEdit.js.map +1 -1
  29. package/lib-amd/corePlugin/selection/SelectionPlugin.js +3 -0
  30. package/lib-amd/corePlugin/selection/SelectionPlugin.js.map +1 -1
  31. package/lib-amd/editor/Editor.js +1 -1
  32. package/lib-amd/editor/Editor.js.map +1 -1
  33. package/lib-mjs/command/cutCopy/getContentForCopy.js +5 -16
  34. package/lib-mjs/command/cutCopy/getContentForCopy.js.map +1 -1
  35. package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js +5 -58
  36. package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  37. package/lib-mjs/coreApi/setDOMSelection/setTableCellsStyle.d.ts +17 -0
  38. package/lib-mjs/coreApi/setDOMSelection/setTableCellsStyle.js +80 -0
  39. package/lib-mjs/coreApi/setDOMSelection/setTableCellsStyle.js.map +1 -0
  40. package/lib-mjs/coreApi/setDOMSelection/toggleTableSelection.d.ts +8 -0
  41. package/lib-mjs/coreApi/setDOMSelection/toggleTableSelection.js +30 -0
  42. package/lib-mjs/coreApi/setDOMSelection/toggleTableSelection.js.map +1 -0
  43. package/lib-mjs/coreApi/switchShadowEdit/switchShadowEdit.js +3 -0
  44. package/lib-mjs/coreApi/switchShadowEdit/switchShadowEdit.js.map +1 -1
  45. package/lib-mjs/corePlugin/selection/SelectionPlugin.js +3 -0
  46. package/lib-mjs/corePlugin/selection/SelectionPlugin.js.map +1 -1
  47. package/lib-mjs/editor/Editor.js +1 -1
  48. package/lib-mjs/editor/Editor.js.map +1 -1
  49. package/package.json +4 -4
  50. package/lib/command/cutCopy/preprocessTable.d.ts +0 -5
  51. package/lib/command/cutCopy/preprocessTable.js +0 -22
  52. package/lib/command/cutCopy/preprocessTable.js.map +0 -1
  53. package/lib/command/cutCopy/pruneUnselectedModel.d.ts +0 -5
  54. package/lib/command/cutCopy/pruneUnselectedModel.js +0 -135
  55. package/lib/command/cutCopy/pruneUnselectedModel.js.map +0 -1
  56. package/lib-amd/command/cutCopy/preprocessTable.d.ts +0 -5
  57. package/lib-amd/command/cutCopy/preprocessTable.js +0 -22
  58. package/lib-amd/command/cutCopy/preprocessTable.js.map +0 -1
  59. package/lib-amd/command/cutCopy/pruneUnselectedModel.d.ts +0 -5
  60. package/lib-amd/command/cutCopy/pruneUnselectedModel.js +0 -136
  61. package/lib-amd/command/cutCopy/pruneUnselectedModel.js.map +0 -1
  62. package/lib-mjs/command/cutCopy/preprocessTable.d.ts +0 -5
  63. package/lib-mjs/command/cutCopy/preprocessTable.js +0 -18
  64. package/lib-mjs/command/cutCopy/preprocessTable.js.map +0 -1
  65. package/lib-mjs/command/cutCopy/pruneUnselectedModel.d.ts +0 -5
  66. package/lib-mjs/command/cutCopy/pruneUnselectedModel.js +0 -131
  67. package/lib-mjs/command/cutCopy/pruneUnselectedModel.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionPlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/selection/SelectionPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { findCoordinate } from './findCoordinate';\nimport { findTableCellElement } from '../../coreApi/setDOMSelection/findTableCellElement';\nimport { isSingleImageInSelection } from './isSingleImageInSelection';\nimport { normalizePos } from './normalizePos';\nimport {\n isCharacterValue,\n isElementOfType,\n isModifierKey,\n isNodeOfType,\n parseTableCells,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMSelection,\n IEditor,\n PluginEvent,\n PluginWithState,\n SelectionPluginState,\n EditorOptions,\n DOMHelper,\n ParsedTable,\n TableSelectionInfo,\n TableCellCoordinate,\n} from 'roosterjs-content-model-types';\n\nconst MouseLeftButton = 0;\nconst MouseRightButton = 2;\nconst Up = 'ArrowUp';\nconst Down = 'ArrowDown';\nconst Left = 'ArrowLeft';\nconst Right = 'ArrowRight';\nconst Tab = 'Tab';\n\n/**\n * @internal\n */\nexport const DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\n/**\n * @internal\n */\nexport const DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR = '#C6C6C6';\n\nclass SelectionPlugin implements PluginWithState<SelectionPluginState> {\n private editor: IEditor | null = null;\n private state: SelectionPluginState;\n private disposer: (() => void) | null = null;\n private logicalRootDisposer: (() => void) | null = null;\n private isSafari = false;\n private isMac = false;\n private scrollTopCache: number = 0;\n\n constructor(options: EditorOptions) {\n this.state = {\n selection: null,\n tableSelection: null,\n imageSelectionBorderColor:\n options.imageSelectionBorderColor ?? DEFAULT_SELECTION_BORDER_COLOR,\n imageSelectionBorderColorDark: options.imageSelectionBorderColor\n ? undefined\n : DEFAULT_SELECTION_BORDER_COLOR,\n tableCellSelectionBackgroundColor:\n options.tableCellSelectionBackgroundColor ??\n DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n tableCellSelectionBackgroundColorDark: options.tableCellSelectionBackgroundColor\n ? undefined\n : DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n };\n }\n\n getName() {\n return 'Selection';\n }\n\n initialize(editor: IEditor) {\n this.editor = editor;\n\n if (!this.state.imageSelectionBorderColorDark && this.state.imageSelectionBorderColor) {\n this.state.imageSelectionBorderColorDark = editor\n .getColorManager()\n .getDarkColor(this.state.imageSelectionBorderColor, undefined, 'border');\n }\n\n if (\n !this.state.tableCellSelectionBackgroundColorDark &&\n this.state.tableCellSelectionBackgroundColor\n ) {\n this.state.tableCellSelectionBackgroundColorDark = editor\n .getColorManager()\n .getDarkColor(\n this.state.tableCellSelectionBackgroundColor,\n undefined,\n 'background'\n );\n }\n\n const env = this.editor.getEnvironment();\n const document = this.editor.getDocument();\n\n this.isSafari = !!env.isSafari;\n this.isMac = !!env.isMac;\n document.addEventListener('selectionchange', this.onSelectionChange);\n if (this.isSafari) {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n }\n\n dispose() {\n this.editor?.getDocument().removeEventListener('selectionchange', this.onSelectionChange);\n\n if (this.disposer) {\n this.disposer();\n this.disposer = null;\n }\n\n this.logicalRootDisposer?.();\n this.logicalRootDisposer = null;\n\n this.detachMouseEvent();\n this.editor = null;\n }\n\n getState(): SelectionPluginState {\n return this.state;\n }\n\n onPluginEvent(event: PluginEvent) {\n if (!this.editor) {\n return;\n }\n\n switch (event.eventType) {\n case 'mouseDown':\n this.onMouseDown(this.editor, event.rawEvent);\n break;\n\n case 'mouseUp':\n this.onMouseUp();\n break;\n\n case 'keyDown':\n this.onKeyDown(this.editor, event.rawEvent);\n break;\n\n case 'contentChanged':\n this.state.tableSelection = null;\n break;\n\n case 'scroll':\n if (!this.editor.hasFocus()) {\n this.scrollTopCache = event.scrollContainer.scrollTop;\n }\n break;\n\n case 'logicalRootChanged':\n this.logicalRootDisposer?.();\n if (this.isSafari) {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n break;\n }\n }\n\n private onMouseDown(editor: IEditor, rawEvent: MouseEvent) {\n const selection = editor.getDOMSelection();\n let image: HTMLImageElement | null;\n\n // Image selection\n if (\n selection?.type == 'image' &&\n (rawEvent.button == MouseLeftButton ||\n (rawEvent.button == MouseRightButton &&\n !this.getClickingImage(rawEvent) &&\n !this.getContainedTargetImage(rawEvent, selection)))\n ) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n if (\n (image =\n this.getClickingImage(rawEvent) ??\n this.getContainedTargetImage(rawEvent, selection)) &&\n image.isContentEditable\n ) {\n this.setDOMSelection(\n {\n type: 'image',\n image: image,\n },\n null\n );\n return;\n }\n\n // Table selection\n if (selection?.type == 'table' && rawEvent.button == MouseLeftButton) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n let tableSelection: TableSelectionInfo | null;\n const target = rawEvent.target as Node;\n\n if (\n target &&\n rawEvent.button == MouseLeftButton &&\n (tableSelection = this.parseTableSelection(target, target, editor.getDOMHelper()))\n ) {\n this.state.tableSelection = tableSelection;\n\n if (rawEvent.detail >= 3) {\n const lastCo = findCoordinate(\n tableSelection.parsedTable,\n rawEvent.target as Node,\n editor.getDOMHelper()\n );\n\n if (lastCo) {\n // Triple click, select the current cell\n tableSelection.lastCo = lastCo;\n this.updateTableSelection(lastCo);\n rawEvent.preventDefault();\n }\n }\n\n this.state.mouseDisposer?.();\n this.state.mouseDisposer = editor.attachDomEvent({\n mousemove: {\n beforeDispatch: this.onMouseMove,\n },\n });\n }\n }\n\n private onMouseMove = (event: Event) => {\n if (this.editor && this.state.tableSelection) {\n const hasTableSelection = !!this.state.tableSelection.lastCo;\n const currentNode = event.target as Node;\n const domHelper = this.editor.getDOMHelper();\n\n const range = this.editor.getDocument().createRange();\n const startNode = this.state.tableSelection.startNode;\n const isReverted =\n currentNode.compareDocumentPosition(startNode) == Node.DOCUMENT_POSITION_FOLLOWING;\n\n if (isReverted) {\n range.setStart(currentNode, 0);\n range.setEnd(\n startNode,\n isNodeOfType(startNode, 'TEXT_NODE')\n ? startNode.nodeValue?.length ?? 0\n : startNode.childNodes.length\n );\n } else {\n range.setStart(startNode, 0);\n range.setEnd(currentNode, 0);\n }\n\n // Use common container of the range to search a common table that covers both start and end node\n const tableStart = range.commonAncestorContainer;\n const newTableSelection = this.parseTableSelection(tableStart, startNode, domHelper);\n\n if (newTableSelection) {\n const lastCo = findCoordinate(\n newTableSelection.parsedTable,\n currentNode,\n domHelper\n );\n\n if (newTableSelection.table != this.state.tableSelection.table) {\n // Move mouse into another table (nest table scenario)\n this.state.tableSelection = newTableSelection;\n this.state.tableSelection.lastCo = lastCo ?? undefined;\n }\n\n const updated = lastCo && this.updateTableSelection(lastCo);\n\n if (hasTableSelection || updated) {\n event.preventDefault();\n }\n } else if (this.editor.getDOMSelection()?.type == 'table') {\n // Move mouse out of table\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted,\n },\n this.state.tableSelection\n );\n }\n }\n };\n\n private onMouseUp() {\n this.detachMouseEvent();\n }\n\n private onDrop = () => {\n this.detachMouseEvent();\n };\n\n private onKeyDown(editor: IEditor, rawEvent: KeyboardEvent) {\n const key = rawEvent.key;\n const selection = editor.getDOMSelection();\n const win = editor.getDocument().defaultView;\n\n switch (selection?.type) {\n case 'image':\n if (!isModifierKey(rawEvent) && !rawEvent.shiftKey && selection.image.parentNode) {\n if (key === 'Escape') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n rawEvent.stopPropagation();\n } else if (key !== 'Delete' && key !== 'Backspace') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n }\n }\n\n if (\n (isModifierKey(rawEvent) || rawEvent.shiftKey) &&\n selection.image &&\n !this.isSafari\n ) {\n const range = selection.image.ownerDocument.createRange();\n range.selectNode(selection.image);\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /* tableSelection */\n );\n }\n break;\n\n case 'range':\n if (key == Up || key == Down || key == Left || key == Right || key == Tab) {\n const start = selection.range.startContainer;\n this.state.tableSelection = this.parseTableSelection(\n start,\n start,\n editor.getDOMHelper()\n );\n\n if (this.state.tableSelection && !rawEvent.defaultPrevented) {\n if (key == Tab) {\n this.handleSelectionInTable(this.getTabKey(rawEvent));\n rawEvent.preventDefault();\n } else {\n win?.requestAnimationFrame(() => this.handleSelectionInTable(key));\n }\n }\n }\n break;\n\n case 'table':\n // After a content change event is handled tableSelection state is reset to null\n // Since we have table selection from DOMSelection, we can use it to re-create the tableSelection state\n if (this.state.tableSelection == null) {\n const { table, firstRow, firstColumn, lastRow, lastColumn } = selection;\n\n const parsedTable = parseTableCells(table);\n if (parsedTable) {\n const firstCo = { row: firstRow, col: firstColumn };\n const lastCo = { row: lastRow, col: lastColumn };\n\n // Create the tableSelection with current table info\n this.state.tableSelection = {\n table,\n parsedTable,\n firstCo,\n lastCo,\n startNode: findTableCellElement(parsedTable, firstCo)?.cell || table,\n };\n }\n }\n if (this.state.tableSelection?.lastCo) {\n const { shiftKey, key } = rawEvent;\n\n if (shiftKey && (key == Left || key == Right)) {\n const isRtl =\n win?.getComputedStyle(this.state.tableSelection.table).direction ==\n 'rtl';\n\n this.updateTableSelectionFromKeyboard(\n 0,\n (key == Left ? -1 : 1) * (isRtl ? -1 : 1)\n );\n rawEvent.preventDefault();\n } else if (shiftKey && (key == Up || key == Down)) {\n this.updateTableSelectionFromKeyboard(key == Up ? -1 : 1, 0);\n rawEvent.preventDefault();\n } else if (key != 'Shift' && !isCharacterValue(rawEvent)) {\n if (key == Up || key == Down || key == Left || key == Right) {\n this.setDOMSelection(null /*domSelection*/, this.state.tableSelection);\n win?.requestAnimationFrame(() => this.handleSelectionInTable(key));\n }\n }\n }\n break;\n }\n }\n\n private getTabKey(rawEvent: KeyboardEvent) {\n return rawEvent.shiftKey ? 'TabLeft' : 'TabRight';\n }\n\n private handleSelectionInTable(\n key: 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight' | 'TabLeft' | 'TabRight'\n ) {\n if (!this.editor || !this.state.tableSelection) {\n return;\n }\n\n const selection = this.editor.getDOMSelection();\n const domHelper = this.editor.getDOMHelper();\n\n if (selection?.type == 'range') {\n const {\n range: { collapsed, startContainer, endContainer, commonAncestorContainer },\n isReverted,\n } = selection;\n const start = isReverted ? endContainer : startContainer;\n const end: Node | null = isReverted ? startContainer : endContainer;\n const tableSel = this.parseTableSelection(commonAncestorContainer, start, domHelper);\n\n if (!tableSel) {\n return;\n }\n\n let lastCo = findCoordinate(tableSel?.parsedTable, end, domHelper);\n let tabMove = false;\n const { parsedTable, firstCo: oldCo, table } = this.state.tableSelection;\n\n if (lastCo && tableSel.table == table) {\n if (lastCo.col != oldCo.col && (key == Up || key == Down)) {\n const change = key == Up ? -1 : 1;\n const originalTd = findTableCellElement(parsedTable, oldCo)?.cell;\n let td: HTMLTableCellElement | null = null;\n\n lastCo = { row: oldCo.row + change, col: oldCo.col };\n\n while (lastCo.row >= 0 && lastCo.row < parsedTable.length) {\n td = findTableCellElement(parsedTable, lastCo)?.cell || null;\n\n if (td == originalTd) {\n lastCo.row += change;\n } else {\n break;\n }\n }\n\n if (collapsed && td) {\n this.setRangeSelectionInTable(\n td,\n key == Up ? td.childNodes.length : 0,\n this.editor\n );\n } else if (!td && (lastCo.row == -1 || lastCo.row <= parsedTable.length)) {\n this.selectBeforeOrAfterElement(\n this.editor,\n table,\n change == 1 /* after */,\n change != 1 /* setSelectionInNextSiblingElement */\n );\n }\n } else if (key == 'TabLeft' || key == 'TabRight') {\n const reverse = key == 'TabLeft';\n for (\n let step = reverse ? -1 : 1,\n row = lastCo.row ?? 0,\n col = (lastCo.col ?? 0) + step;\n ;\n col += step\n ) {\n if (col < 0 || col >= parsedTable[row].length) {\n row += step;\n if (row < 0) {\n this.selectBeforeOrAfterElement(this.editor, tableSel.table);\n break;\n } else if (row >= parsedTable.length) {\n this.selectBeforeOrAfterElement(\n this.editor,\n tableSel.table,\n true /*after*/\n );\n break;\n }\n col = reverse ? parsedTable[row].length - 1 : 0;\n }\n const cell = parsedTable[row][col];\n\n if (typeof cell != 'string') {\n tabMove = true;\n this.setRangeSelectionInTable(\n cell,\n 0,\n this.editor,\n true /* selectAll */\n );\n lastCo.row = row;\n lastCo.col = col;\n break;\n }\n }\n } else {\n this.state.tableSelection = null;\n }\n\n if (\n collapsed &&\n (lastCo.col != oldCo.col || lastCo.row != oldCo.row) &&\n lastCo.row >= 0 &&\n lastCo.row == parsedTable.length - 1 &&\n lastCo.col == parsedTable[lastCo.row]?.length - 1\n ) {\n this.editor?.announce({ defaultStrings: 'announceOnFocusLastCell' });\n }\n }\n\n if (!collapsed && lastCo && !tabMove) {\n this.state.tableSelection = tableSel;\n this.updateTableSelection(lastCo);\n }\n }\n }\n\n private setRangeSelectionInTable(\n cell: Node,\n nodeOffset: number,\n editor: IEditor,\n selectAll?: boolean\n ) {\n const range = editor.getDocument().createRange();\n if (selectAll && cell.firstChild && cell.lastChild) {\n const cellStart = cell.firstChild;\n const cellEnd = cell.lastChild;\n // Get first deepest editable position in the cell\n const posStart = normalizePos(cellStart, 0);\n // Get last deepest editable position in the cell\n const posEnd = normalizePos(cellEnd, cellEnd.childNodes.length);\n\n range.setStart(posStart.node, posStart.offset);\n range.setEnd(posEnd.node, posEnd.offset);\n\n if (range.toString() === '') {\n range.collapse(true /* toStart */);\n }\n } else {\n // Get deepest editable position in the cell\n const { node, offset } = normalizePos(cell, nodeOffset);\n\n range.setStart(node, offset);\n range.collapse(true /* toStart */);\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n\n private updateTableSelectionFromKeyboard(rowChange: number, colChange: number) {\n if (this.state.tableSelection?.lastCo && this.editor) {\n const { lastCo, parsedTable } = this.state.tableSelection;\n const row = lastCo.row + rowChange;\n const col = lastCo.col + colChange;\n\n if (row >= 0 && row < parsedTable.length && col >= 0 && col < parsedTable[row].length) {\n this.updateTableSelection({ row, col });\n }\n }\n }\n\n private selectBeforeOrAfterElement(\n editor: IEditor,\n element: HTMLElement,\n after?: boolean,\n setSelectionInNextSiblingElement?: boolean\n ) {\n const doc = editor.getDocument();\n const parent = element.parentNode;\n const index = parent && toArray(parent.childNodes).indexOf(element);\n let sibling: Element | undefined | null;\n\n if (parent && index !== null && index >= 0) {\n const range = doc.createRange();\n if (\n setSelectionInNextSiblingElement &&\n (sibling = after ? element.nextElementSibling : element.previousElementSibling) &&\n isNodeOfType(sibling, 'ELEMENT_NODE')\n ) {\n range.selectNodeContents(sibling);\n range.collapse(false /* toStart */);\n } else {\n range.setStart(parent, index + (after ? 1 : 0));\n range.collapse();\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range: range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n }\n\n private getClickingImage(event: UIEvent): HTMLImageElement | null {\n const target = event.target as Node;\n\n return isNodeOfType(target, 'ELEMENT_NODE') && isElementOfType(target, 'img')\n ? target\n : null;\n }\n\n // MacOS will not create a mouseUp event if contextMenu event is not prevent defaulted.\n // Make sure we capture image target even if image is wrapped\n private getContainedTargetImage = (\n event: MouseEvent,\n previousSelection: DOMSelection | null\n ): HTMLImageElement | null => {\n if (!this.isMac || !previousSelection || previousSelection.type !== 'image') {\n return null;\n }\n\n const target = event.target as Node;\n if (\n isNodeOfType(target, 'ELEMENT_NODE') &&\n isElementOfType(target, 'span') &&\n target.firstChild === previousSelection.image\n ) {\n return previousSelection.image;\n }\n return null;\n };\n\n private onFocus = () => {\n if (!this.state.skipReselectOnFocus && this.state.selection) {\n this.setDOMSelection(this.state.selection, this.state.tableSelection);\n }\n\n if (this.state.selection?.type == 'range' && !this.isSafari) {\n // Editor is focused, now we can get live selection. So no need to keep a selection if the selection type is range.\n this.state.selection = null;\n }\n\n if (this.scrollTopCache && this.editor) {\n const sc = this.editor.getScrollContainer();\n sc.scrollTop = this.scrollTopCache;\n this.scrollTopCache = 0;\n }\n };\n\n private onBlur = () => {\n if (this.editor) {\n if (!this.state.selection) {\n this.state.selection = this.editor.getDOMSelection();\n }\n const sc = this.editor.getScrollContainer();\n this.scrollTopCache = sc.scrollTop;\n }\n };\n\n private onSelectionChange = () => {\n if (this.editor?.hasFocus() && !this.editor.isInShadowEdit()) {\n const newSelection = this.editor.getDOMSelection();\n\n //If am image selection changed to a wider range due a keyboard event, we should update the selection\n const selection = this.editor.getDocument().getSelection();\n if (selection && selection.focusNode) {\n const image = isSingleImageInSelection(selection);\n if (newSelection?.type == 'image' && !image) {\n const range = selection.getRangeAt(0);\n this.editor.setDOMSelection({\n type: 'range',\n range,\n isReverted:\n selection.focusNode != range.endContainer ||\n selection.focusOffset != range.endOffset,\n });\n } else if (newSelection?.type !== 'image' && image) {\n this.editor.setDOMSelection({\n type: 'image',\n image,\n });\n }\n }\n\n // Safari has problem to handle onBlur event. When blur, we cannot get the original selection from editor.\n // So we always save a selection whenever editor has focus. Then after blur, we can still use this cached selection.\n if (newSelection?.type == 'range') {\n if (this.isSafari) {\n this.state.selection = newSelection;\n }\n }\n }\n };\n\n private parseTableSelection(\n tableStart: Node,\n tdStart: Node,\n domHelper: DOMHelper\n ): TableSelectionInfo | null {\n let table: HTMLTableElement | null;\n let parsedTable: ParsedTable | null;\n let firstCo: TableCellCoordinate | null;\n\n if (\n (table = domHelper.findClosestElementAncestor(tableStart, 'table')) &&\n table.isContentEditable &&\n (parsedTable = parseTableCells(table)) &&\n (firstCo = findCoordinate(parsedTable, tdStart, domHelper))\n ) {\n return { table, parsedTable, firstCo, startNode: tdStart };\n } else {\n return null;\n }\n }\n\n private updateTableSelection(lastCo: TableCellCoordinate) {\n if (this.state.tableSelection && this.editor) {\n const {\n table,\n firstCo,\n parsedTable,\n startNode,\n lastCo: oldCo,\n } = this.state.tableSelection;\n\n if (oldCo || firstCo.row != lastCo.row || firstCo.col != lastCo.col) {\n this.state.tableSelection.lastCo = lastCo;\n this.setDOMSelection(\n {\n type: 'table',\n table,\n firstRow: firstCo.row,\n firstColumn: firstCo.col,\n lastRow: lastCo.row,\n lastColumn: lastCo.col,\n tableSelectionInfo: this.state.tableSelection,\n },\n { table, firstCo, lastCo, parsedTable, startNode }\n );\n\n return true;\n }\n }\n\n return false;\n }\n\n private setDOMSelection(\n selection: DOMSelection | null,\n tableSelection: TableSelectionInfo | null\n ) {\n this.editor?.setDOMSelection(selection);\n this.state.tableSelection = tableSelection;\n }\n\n private detachMouseEvent() {\n if (this.state.mouseDisposer) {\n this.state.mouseDisposer();\n this.state.mouseDisposer = undefined;\n }\n }\n}\n\n/**\n * @internal\n * Create a new instance of SelectionPlugin.\n * @param option The editor option\n */\nexport function createSelectionPlugin(\n options: EditorOptions\n): PluginWithState<SelectionPluginState> {\n return new SelectionPlugin(options);\n}\n"]}
1
+ {"version":3,"file":"SelectionPlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/selection/SelectionPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { findCoordinate } from './findCoordinate';\nimport { findTableCellElement } from '../../coreApi/setDOMSelection/findTableCellElement';\nimport { isSingleImageInSelection } from './isSingleImageInSelection';\nimport { normalizePos } from './normalizePos';\nimport {\n isCharacterValue,\n isElementOfType,\n isModifierKey,\n isNodeOfType,\n parseTableCells,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMSelection,\n IEditor,\n PluginEvent,\n PluginWithState,\n SelectionPluginState,\n EditorOptions,\n DOMHelper,\n ParsedTable,\n TableSelectionInfo,\n TableCellCoordinate,\n} from 'roosterjs-content-model-types';\n\nconst MouseLeftButton = 0;\nconst MouseRightButton = 2;\nconst Up = 'ArrowUp';\nconst Down = 'ArrowDown';\nconst Left = 'ArrowLeft';\nconst Right = 'ArrowRight';\nconst Tab = 'Tab';\n\n/**\n * @internal\n */\nexport const DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\n/**\n * @internal\n */\nexport const DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR = '#C6C6C6';\n\nclass SelectionPlugin implements PluginWithState<SelectionPluginState> {\n private editor: IEditor | null = null;\n private state: SelectionPluginState;\n private disposer: (() => void) | null = null;\n private logicalRootDisposer: (() => void) | null = null;\n private isSafari = false;\n private isMac = false;\n private scrollTopCache: number = 0;\n\n constructor(options: EditorOptions) {\n this.state = {\n selection: null,\n tableSelection: null,\n imageSelectionBorderColor:\n options.imageSelectionBorderColor ?? DEFAULT_SELECTION_BORDER_COLOR,\n imageSelectionBorderColorDark: options.imageSelectionBorderColor\n ? undefined\n : DEFAULT_SELECTION_BORDER_COLOR,\n tableCellSelectionBackgroundColor:\n options.tableCellSelectionBackgroundColor ??\n DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n tableCellSelectionBackgroundColorDark: options.tableCellSelectionBackgroundColor\n ? undefined\n : DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n };\n }\n\n getName() {\n return 'Selection';\n }\n\n initialize(editor: IEditor) {\n this.editor = editor;\n\n if (!this.state.imageSelectionBorderColorDark && this.state.imageSelectionBorderColor) {\n this.state.imageSelectionBorderColorDark = editor\n .getColorManager()\n .getDarkColor(this.state.imageSelectionBorderColor, undefined, 'border');\n }\n\n if (\n !this.state.tableCellSelectionBackgroundColorDark &&\n this.state.tableCellSelectionBackgroundColor\n ) {\n this.state.tableCellSelectionBackgroundColorDark = editor\n .getColorManager()\n .getDarkColor(\n this.state.tableCellSelectionBackgroundColor,\n undefined,\n 'background'\n );\n }\n\n const env = this.editor.getEnvironment();\n const document = this.editor.getDocument();\n\n this.isSafari = !!env.isSafari;\n this.isMac = !!env.isMac;\n document.addEventListener('selectionchange', this.onSelectionChange);\n if (this.isSafari) {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n }\n\n dispose() {\n this.editor?.getDocument().removeEventListener('selectionchange', this.onSelectionChange);\n\n if (this.disposer) {\n this.disposer();\n this.disposer = null;\n }\n\n this.logicalRootDisposer?.();\n this.logicalRootDisposer = null;\n\n this.detachMouseEvent();\n this.editor = null;\n }\n\n getState(): SelectionPluginState {\n return this.state;\n }\n\n onPluginEvent(event: PluginEvent) {\n if (!this.editor) {\n return;\n }\n\n switch (event.eventType) {\n case 'mouseDown':\n this.onMouseDown(this.editor, event.rawEvent);\n break;\n\n case 'mouseUp':\n this.onMouseUp();\n break;\n\n case 'keyDown':\n this.onKeyDown(this.editor, event.rawEvent);\n break;\n\n case 'contentChanged':\n this.state.tableSelection = null;\n break;\n\n case 'scroll':\n if (!this.editor.hasFocus()) {\n this.scrollTopCache = event.scrollContainer.scrollTop;\n }\n break;\n\n case 'logicalRootChanged':\n this.logicalRootDisposer?.();\n if (this.isSafari) {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n break;\n }\n }\n\n private onMouseDown(editor: IEditor, rawEvent: MouseEvent) {\n const selection = editor.getDOMSelection();\n let image: HTMLImageElement | null;\n\n // Image selection\n if (\n selection?.type == 'image' &&\n (rawEvent.button == MouseLeftButton ||\n (rawEvent.button == MouseRightButton &&\n !this.getClickingImage(rawEvent) &&\n !this.getContainedTargetImage(rawEvent, selection)))\n ) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n if (\n (image =\n this.getClickingImage(rawEvent) ??\n this.getContainedTargetImage(rawEvent, selection)) &&\n image.isContentEditable\n ) {\n this.setDOMSelection(\n {\n type: 'image',\n image: image,\n },\n null\n );\n return;\n }\n\n // Table selection\n if (selection?.type == 'table' && rawEvent.button == MouseLeftButton) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n let tableSelection: TableSelectionInfo | null;\n const target = rawEvent.target as Node;\n\n if (\n target &&\n rawEvent.button == MouseLeftButton &&\n (tableSelection = this.parseTableSelection(target, target, editor.getDOMHelper()))\n ) {\n this.state.tableSelection = tableSelection;\n\n if (rawEvent.detail >= 3) {\n const lastCo = findCoordinate(\n tableSelection.parsedTable,\n rawEvent.target as Node,\n editor.getDOMHelper()\n );\n\n if (lastCo) {\n // Triple click, select the current cell\n tableSelection.lastCo = lastCo;\n this.updateTableSelection(lastCo);\n rawEvent.preventDefault();\n }\n }\n\n this.state.mouseDisposer?.();\n this.state.mouseDisposer = editor.attachDomEvent({\n mousemove: {\n beforeDispatch: this.onMouseMove,\n },\n });\n }\n }\n\n private onMouseMove = (event: Event) => {\n if (this.editor && this.state.tableSelection) {\n const hasTableSelection = !!this.state.tableSelection.lastCo;\n const currentNode = event.target as Node;\n const domHelper = this.editor.getDOMHelper();\n\n const range = this.editor.getDocument().createRange();\n const startNode = this.state.tableSelection.startNode;\n const isReverted =\n currentNode.compareDocumentPosition(startNode) == Node.DOCUMENT_POSITION_FOLLOWING;\n\n if (isReverted) {\n range.setStart(currentNode, 0);\n range.setEnd(\n startNode,\n isNodeOfType(startNode, 'TEXT_NODE')\n ? startNode.nodeValue?.length ?? 0\n : startNode.childNodes.length\n );\n } else {\n range.setStart(startNode, 0);\n range.setEnd(currentNode, 0);\n }\n\n // Use common container of the range to search a common table that covers both start and end node\n const tableStart = range.commonAncestorContainer;\n const newTableSelection = this.parseTableSelection(tableStart, startNode, domHelper);\n\n if (newTableSelection) {\n const lastCo = findCoordinate(\n newTableSelection.parsedTable,\n currentNode,\n domHelper\n );\n\n if (newTableSelection.table != this.state.tableSelection.table) {\n // Move mouse into another table (nest table scenario)\n this.state.tableSelection = newTableSelection;\n this.state.tableSelection.lastCo = lastCo ?? undefined;\n }\n\n const updated = lastCo && this.updateTableSelection(lastCo);\n\n if (hasTableSelection || updated) {\n event.preventDefault();\n }\n } else if (this.editor.getDOMSelection()?.type == 'table') {\n // Move mouse out of table\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted,\n },\n this.state.tableSelection\n );\n }\n }\n };\n\n private onMouseUp() {\n this.detachMouseEvent();\n }\n\n private onDrop = () => {\n this.detachMouseEvent();\n };\n\n private onKeyDown(editor: IEditor, rawEvent: KeyboardEvent) {\n const key = rawEvent.key;\n const selection = editor.getDOMSelection();\n const win = editor.getDocument().defaultView;\n\n switch (selection?.type) {\n case 'image':\n if (!isModifierKey(rawEvent) && !rawEvent.shiftKey && selection.image.parentNode) {\n if (key === 'Escape') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n rawEvent.stopPropagation();\n } else if (key !== 'Delete' && key !== 'Backspace') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n }\n }\n\n if (\n (isModifierKey(rawEvent) || rawEvent.shiftKey) &&\n selection.image &&\n !this.isSafari\n ) {\n const range = selection.image.ownerDocument.createRange();\n range.selectNode(selection.image);\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /* tableSelection */\n );\n }\n break;\n\n case 'range':\n if (key == Up || key == Down || key == Left || key == Right || key == Tab) {\n const start = selection.range.startContainer;\n this.state.tableSelection = this.parseTableSelection(\n start,\n start,\n editor.getDOMHelper()\n );\n\n if (this.state.tableSelection && !rawEvent.defaultPrevented) {\n if (key == Tab) {\n this.handleSelectionInTable(this.getTabKey(rawEvent));\n rawEvent.preventDefault();\n } else {\n win?.requestAnimationFrame(() => this.handleSelectionInTable(key));\n }\n }\n }\n break;\n\n case 'table':\n // After a content change event is handled tableSelection state is reset to null\n // Since we have table selection from DOMSelection, we can use it to re-create the tableSelection state\n if (this.state.tableSelection == null) {\n const { table, firstRow, firstColumn, lastRow, lastColumn } = selection;\n\n const parsedTable = parseTableCells(table);\n if (parsedTable) {\n const firstCo = { row: firstRow, col: firstColumn };\n const lastCo = { row: lastRow, col: lastColumn };\n\n // Create the tableSelection with current table info\n this.state.tableSelection = {\n table,\n parsedTable,\n firstCo,\n lastCo,\n startNode: findTableCellElement(parsedTable, firstCo)?.cell || table,\n };\n }\n }\n if (this.state.tableSelection?.lastCo) {\n const { shiftKey, key } = rawEvent;\n\n if (shiftKey && (key == Left || key == Right)) {\n const isRtl =\n win?.getComputedStyle(this.state.tableSelection.table).direction ==\n 'rtl';\n\n this.updateTableSelectionFromKeyboard(\n 0,\n (key == Left ? -1 : 1) * (isRtl ? -1 : 1)\n );\n rawEvent.preventDefault();\n } else if (shiftKey && (key == Up || key == Down)) {\n this.updateTableSelectionFromKeyboard(key == Up ? -1 : 1, 0);\n rawEvent.preventDefault();\n } else if (key != 'Shift' && !isCharacterValue(rawEvent)) {\n if (key == Up || key == Down || key == Left || key == Right) {\n this.setDOMSelection(null /*domSelection*/, this.state.tableSelection);\n win?.requestAnimationFrame(() => this.handleSelectionInTable(key));\n }\n }\n }\n break;\n }\n }\n\n private getTabKey(rawEvent: KeyboardEvent) {\n return rawEvent.shiftKey ? 'TabLeft' : 'TabRight';\n }\n\n private handleSelectionInTable(\n key: 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight' | 'TabLeft' | 'TabRight'\n ) {\n if (!this.editor || !this.state.tableSelection) {\n return;\n }\n\n const selection = this.editor.getDOMSelection();\n const domHelper = this.editor.getDOMHelper();\n\n if (selection?.type == 'range') {\n const {\n range: { collapsed, startContainer, endContainer, commonAncestorContainer },\n isReverted,\n } = selection;\n const start = isReverted ? endContainer : startContainer;\n const end: Node | null = isReverted ? startContainer : endContainer;\n const tableSel = this.parseTableSelection(commonAncestorContainer, start, domHelper);\n\n if (!tableSel) {\n return;\n }\n\n let lastCo = findCoordinate(tableSel?.parsedTable, end, domHelper);\n let tabMove = false;\n const { parsedTable, firstCo: oldCo, table } = this.state.tableSelection;\n\n if (lastCo && tableSel.table == table) {\n if (lastCo.col != oldCo.col && (key == Up || key == Down)) {\n const change = key == Up ? -1 : 1;\n const originalTd = findTableCellElement(parsedTable, oldCo)?.cell;\n let td: HTMLTableCellElement | null = null;\n\n lastCo = { row: oldCo.row + change, col: oldCo.col };\n\n while (lastCo.row >= 0 && lastCo.row < parsedTable.length) {\n td = findTableCellElement(parsedTable, lastCo)?.cell || null;\n\n if (td == originalTd) {\n lastCo.row += change;\n } else {\n break;\n }\n }\n\n if (collapsed && td) {\n this.setRangeSelectionInTable(\n td,\n key == Up ? td.childNodes.length : 0,\n this.editor\n );\n } else if (!td && (lastCo.row == -1 || lastCo.row <= parsedTable.length)) {\n this.selectBeforeOrAfterElement(\n this.editor,\n table,\n change == 1 /* after */,\n change != 1 /* setSelectionInNextSiblingElement */\n );\n }\n } else if (key == 'TabLeft' || key == 'TabRight') {\n const reverse = key == 'TabLeft';\n for (\n let step = reverse ? -1 : 1,\n row = lastCo.row ?? 0,\n col = (lastCo.col ?? 0) + step;\n ;\n col += step\n ) {\n if (col < 0 || col >= parsedTable[row].length) {\n row += step;\n if (row < 0) {\n this.selectBeforeOrAfterElement(this.editor, tableSel.table);\n break;\n } else if (row >= parsedTable.length) {\n this.selectBeforeOrAfterElement(\n this.editor,\n tableSel.table,\n true /*after*/\n );\n break;\n }\n col = reverse ? parsedTable[row].length - 1 : 0;\n }\n const cell = parsedTable[row][col];\n\n if (typeof cell != 'string') {\n tabMove = true;\n this.setRangeSelectionInTable(\n cell,\n 0,\n this.editor,\n true /* selectAll */\n );\n lastCo.row = row;\n lastCo.col = col;\n break;\n }\n }\n if (this.editor.getSnapshotsManager().hasNewContent) {\n this.editor.takeSnapshot();\n }\n } else {\n this.state.tableSelection = null;\n }\n\n if (\n collapsed &&\n (lastCo.col != oldCo.col || lastCo.row != oldCo.row) &&\n lastCo.row >= 0 &&\n lastCo.row == parsedTable.length - 1 &&\n lastCo.col == parsedTable[lastCo.row]?.length - 1\n ) {\n this.editor?.announce({ defaultStrings: 'announceOnFocusLastCell' });\n }\n }\n\n if (!collapsed && lastCo && !tabMove) {\n this.state.tableSelection = tableSel;\n this.updateTableSelection(lastCo);\n }\n }\n }\n\n private setRangeSelectionInTable(\n cell: Node,\n nodeOffset: number,\n editor: IEditor,\n selectAll?: boolean\n ) {\n const range = editor.getDocument().createRange();\n if (selectAll && cell.firstChild && cell.lastChild) {\n const cellStart = cell.firstChild;\n const cellEnd = cell.lastChild;\n // Get first deepest editable position in the cell\n const posStart = normalizePos(cellStart, 0);\n // Get last deepest editable position in the cell\n const posEnd = normalizePos(cellEnd, cellEnd.childNodes.length);\n\n range.setStart(posStart.node, posStart.offset);\n range.setEnd(posEnd.node, posEnd.offset);\n\n if (range.toString() === '') {\n range.collapse(true /* toStart */);\n }\n } else {\n // Get deepest editable position in the cell\n const { node, offset } = normalizePos(cell, nodeOffset);\n\n range.setStart(node, offset);\n range.collapse(true /* toStart */);\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n\n private updateTableSelectionFromKeyboard(rowChange: number, colChange: number) {\n if (this.state.tableSelection?.lastCo && this.editor) {\n const { lastCo, parsedTable } = this.state.tableSelection;\n const row = lastCo.row + rowChange;\n const col = lastCo.col + colChange;\n\n if (row >= 0 && row < parsedTable.length && col >= 0 && col < parsedTable[row].length) {\n this.updateTableSelection({ row, col });\n }\n }\n }\n\n private selectBeforeOrAfterElement(\n editor: IEditor,\n element: HTMLElement,\n after?: boolean,\n setSelectionInNextSiblingElement?: boolean\n ) {\n const doc = editor.getDocument();\n const parent = element.parentNode;\n const index = parent && toArray(parent.childNodes).indexOf(element);\n let sibling: Element | undefined | null;\n\n if (parent && index !== null && index >= 0) {\n const range = doc.createRange();\n if (\n setSelectionInNextSiblingElement &&\n (sibling = after ? element.nextElementSibling : element.previousElementSibling) &&\n isNodeOfType(sibling, 'ELEMENT_NODE')\n ) {\n range.selectNodeContents(sibling);\n range.collapse(false /* toStart */);\n } else {\n range.setStart(parent, index + (after ? 1 : 0));\n range.collapse();\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range: range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n }\n\n private getClickingImage(event: UIEvent): HTMLImageElement | null {\n const target = event.target as Node;\n\n return isNodeOfType(target, 'ELEMENT_NODE') && isElementOfType(target, 'img')\n ? target\n : null;\n }\n\n // MacOS will not create a mouseUp event if contextMenu event is not prevent defaulted.\n // Make sure we capture image target even if image is wrapped\n private getContainedTargetImage = (\n event: MouseEvent,\n previousSelection: DOMSelection | null\n ): HTMLImageElement | null => {\n if (!this.isMac || !previousSelection || previousSelection.type !== 'image') {\n return null;\n }\n\n const target = event.target as Node;\n if (\n isNodeOfType(target, 'ELEMENT_NODE') &&\n isElementOfType(target, 'span') &&\n target.firstChild === previousSelection.image\n ) {\n return previousSelection.image;\n }\n return null;\n };\n\n private onFocus = () => {\n if (!this.state.skipReselectOnFocus && this.state.selection) {\n this.setDOMSelection(this.state.selection, this.state.tableSelection);\n }\n\n if (this.state.selection?.type == 'range' && !this.isSafari) {\n // Editor is focused, now we can get live selection. So no need to keep a selection if the selection type is range.\n this.state.selection = null;\n }\n\n if (this.scrollTopCache && this.editor) {\n const sc = this.editor.getScrollContainer();\n sc.scrollTop = this.scrollTopCache;\n this.scrollTopCache = 0;\n }\n };\n\n private onBlur = () => {\n if (this.editor) {\n if (!this.state.selection) {\n this.state.selection = this.editor.getDOMSelection();\n }\n const sc = this.editor.getScrollContainer();\n this.scrollTopCache = sc.scrollTop;\n }\n };\n\n private onSelectionChange = () => {\n if (this.editor?.hasFocus() && !this.editor.isInShadowEdit()) {\n const newSelection = this.editor.getDOMSelection();\n\n //If am image selection changed to a wider range due a keyboard event, we should update the selection\n const selection = this.editor.getDocument().getSelection();\n if (selection && selection.focusNode) {\n const image = isSingleImageInSelection(selection);\n if (newSelection?.type == 'image' && !image) {\n const range = selection.getRangeAt(0);\n this.editor.setDOMSelection({\n type: 'range',\n range,\n isReverted:\n selection.focusNode != range.endContainer ||\n selection.focusOffset != range.endOffset,\n });\n } else if (newSelection?.type !== 'image' && image) {\n this.editor.setDOMSelection({\n type: 'image',\n image,\n });\n }\n }\n\n // Safari has problem to handle onBlur event. When blur, we cannot get the original selection from editor.\n // So we always save a selection whenever editor has focus. Then after blur, we can still use this cached selection.\n if (newSelection?.type == 'range') {\n if (this.isSafari) {\n this.state.selection = newSelection;\n }\n }\n }\n };\n\n private parseTableSelection(\n tableStart: Node,\n tdStart: Node,\n domHelper: DOMHelper\n ): TableSelectionInfo | null {\n let table: HTMLTableElement | null;\n let parsedTable: ParsedTable | null;\n let firstCo: TableCellCoordinate | null;\n\n if (\n (table = domHelper.findClosestElementAncestor(tableStart, 'table')) &&\n table.isContentEditable &&\n (parsedTable = parseTableCells(table)) &&\n (firstCo = findCoordinate(parsedTable, tdStart, domHelper))\n ) {\n return { table, parsedTable, firstCo, startNode: tdStart };\n } else {\n return null;\n }\n }\n\n private updateTableSelection(lastCo: TableCellCoordinate) {\n if (this.state.tableSelection && this.editor) {\n const {\n table,\n firstCo,\n parsedTable,\n startNode,\n lastCo: oldCo,\n } = this.state.tableSelection;\n\n if (oldCo || firstCo.row != lastCo.row || firstCo.col != lastCo.col) {\n this.state.tableSelection.lastCo = lastCo;\n this.setDOMSelection(\n {\n type: 'table',\n table,\n firstRow: firstCo.row,\n firstColumn: firstCo.col,\n lastRow: lastCo.row,\n lastColumn: lastCo.col,\n tableSelectionInfo: this.state.tableSelection,\n },\n { table, firstCo, lastCo, parsedTable, startNode }\n );\n\n return true;\n }\n }\n\n return false;\n }\n\n private setDOMSelection(\n selection: DOMSelection | null,\n tableSelection: TableSelectionInfo | null\n ) {\n this.editor?.setDOMSelection(selection);\n this.state.tableSelection = tableSelection;\n }\n\n private detachMouseEvent() {\n if (this.state.mouseDisposer) {\n this.state.mouseDisposer();\n this.state.mouseDisposer = undefined;\n }\n }\n}\n\n/**\n * @internal\n * Create a new instance of SelectionPlugin.\n * @param option The editor option\n */\nexport function createSelectionPlugin(\n options: EditorOptions\n): PluginWithState<SelectionPluginState> {\n return new SelectionPlugin(options);\n}\n"]}
@@ -229,7 +229,7 @@ var Editor = /** @class */ (function () {
229
229
  if (!!isDarkMode != core.lifecycle.isDarkMode) {
230
230
  (0, roosterjs_content_model_dom_1.transformColor)(core.physicalRoot, false /*includeSelf*/, isDarkMode ? 'lightToDark' : 'darkToLight', core.darkColorHandler, {
231
231
  tableBorders: this.isExperimentalFeatureEnabled('TransformTableBorderColors'),
232
- });
232
+ }, core.format.defaultFormat.textColor);
233
233
  core.lifecycle.isDarkMode = !!isDarkMode;
234
234
  core.api.triggerEvent(core, {
235
235
  eventType: 'contentChanged',
@@ -1 +1 @@
1
- {"version":3,"file":"Editor.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-core/lib/editor/Editor.ts"],"names":[],"mappings":"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","sourcesContent":["import { createEditorCore } from './core/createEditorCore';\nimport {\n createEmptyModel,\n ChangeSource,\n cloneModel,\n transformColor,\n createDomToModelContextWithConfig,\n domToContentModel,\n} from 'roosterjs-content-model-dom';\nimport type {\n ContentModelDocument,\n ContentModelFormatter,\n ContentModelSegmentFormat,\n DarkColorHandler,\n DOMEventRecord,\n DOMHelper,\n DOMSelection,\n EditorEnvironment,\n FormatContentModelOptions,\n IEditor,\n PluginEventData,\n PluginEventFromType,\n PluginEventType,\n Snapshot,\n SnapshotsManager,\n EditorCore,\n EditorOptions,\n Rect,\n EntityState,\n CachedElementHandler,\n DomToModelOptionForCreateModel,\n AnnounceData,\n ExperimentalFeature,\n LegacyTrustedHTMLHandler,\n DOMCreator,\n} from 'roosterjs-content-model-types';\n\n/**\n * The main editor class based on Content Model\n */\nexport class Editor implements IEditor {\n private core: EditorCore | null = null;\n\n /**\n * Creates an instance of Editor\n * @param contentDiv The DIV HTML element which will be the container element of editor\n * @param options An optional options object to customize the editor\n */\n constructor(contentDiv: HTMLDivElement, options: EditorOptions = {}) {\n this.core = createEditorCore(contentDiv, options);\n\n const initialModel =\n options.initialModel ?? createEmptyModel(this.core.format.defaultFormat);\n\n this.core.api.setContentModel(\n this.core,\n initialModel,\n { ignoreSelection: true },\n undefined /*onNodeCreated*/,\n true /*isInitializing*/\n );\n this.core.plugins.forEach(plugin => plugin.initialize(this));\n }\n\n /**\n * Dispose this editor, dispose all plugins and custom data\n */\n dispose() {\n const core = this.getCore();\n\n for (let i = core.plugins.length - 1; i >= 0; i--) {\n const plugin = core.plugins[i];\n\n try {\n plugin.dispose();\n } catch (e) {\n // Cache the error and pass it out, then keep going since dispose should always succeed\n core.disposeErrorHandler?.(plugin, e as Error);\n }\n }\n\n core.darkColorHandler.reset();\n\n this.core = null;\n }\n\n /**\n * Get whether this editor is disposed\n * @returns True if editor is disposed, otherwise false\n */\n isDisposed(): boolean {\n return !this.core;\n }\n\n /**\n * Create Content Model from DOM tree in this editor\n * @param mode What kind of Content Model we want. Currently we support the following values:\n * - disconnected: Returns a disconnected clone of Content Model from editor which you can do any change on it and it won't impact the editor content.\n * If there is any entity in editor, the returned object will contain cloned copy of entity wrapper element.\n * If editor is in dark mode, the cloned entity will be converted back to light mode.\n * - clean: Similar with disconnected, this will return a disconnected model, the difference is \"clean\" mode will not include any selection info.\n * This is usually used for exporting content\n */\n getContentModelCopy(mode: 'connected' | 'disconnected' | 'clean'): ContentModelDocument {\n const core = this.getCore();\n\n switch (mode) {\n case 'connected': // Get a connected model is deprecated. Now we will always return disconnected model\n case 'disconnected':\n return cloneModel(\n core.api.createContentModel(core, {\n tryGetFromCache: false,\n }),\n {\n includeCachedElement: this.cloneOptionCallback,\n }\n );\n\n case 'clean':\n const domToModelContext = createDomToModelContextWithConfig(\n core.environment.domToModelSettings.calculated,\n core.api.createEditorContext(core, false /*saveIndex*/)\n );\n\n return cloneModel(domToContentModel(core.physicalRoot, domToModelContext), {\n includeCachedElement: this.cloneOptionCallback,\n });\n }\n }\n\n /**\n * Get current running environment, such as if editor is running on Mac\n */\n getEnvironment(): EditorEnvironment {\n return this.getCore().environment;\n }\n\n /**\n * Get current DOM selection\n */\n getDOMSelection(): DOMSelection | null {\n const core = this.getCore();\n\n return core.api.getDOMSelection(core);\n }\n\n /**\n * Set DOMSelection into editor content.\n * @param selection The selection to set\n */\n setDOMSelection(selection: DOMSelection | null) {\n const core = this.getCore();\n\n core.api.setDOMSelection(core, selection);\n }\n\n /**\n * Set a new logical root (most likely due to focus change)\n * @param logicalRoot The new logical root (has to be child of physicalRoot)\n */\n setLogicalRoot(logicalRoot: HTMLDivElement) {\n const core = this.getCore();\n\n core.api.setLogicalRoot(core, logicalRoot);\n }\n\n /**\n * The general API to do format change with Content Model\n * It will grab a Content Model for current editor content, and invoke a callback function\n * to do format change. Then according to the return value, write back the modified content model into editor.\n * If there is cached model, it will be used and updated.\n * @param formatter Formatter function, see ContentModelFormatter\n * @param options More options, see FormatContentModelOptions\n */\n formatContentModel(\n formatter: ContentModelFormatter,\n options?: FormatContentModelOptions,\n domToModelOptions?: DomToModelOptionForCreateModel\n ): void {\n const core = this.getCore();\n\n core.api.formatContentModel(core, formatter, options, domToModelOptions);\n }\n\n /**\n * Get pending format of editor if any, or return null\n */\n getPendingFormat(): ContentModelSegmentFormat | null {\n return this.getCore().format.pendingFormat?.format ?? null;\n }\n\n /**\n * Get a DOM Helper object to help access DOM tree in editor\n */\n getDOMHelper(): DOMHelper {\n return this.getCore().domHelper;\n }\n\n /**\n * Add a single undo snapshot to undo stack\n * @param entityState @optional State for entity if we want to add entity state for this snapshot\n */\n takeSnapshot(entityState?: EntityState): Snapshot | null {\n const core = this.getCore();\n\n return core.api.addUndoSnapshot(\n core,\n false /*canUndoByBackspace*/,\n entityState ? [entityState] : undefined\n );\n }\n\n /**\n * Restore an undo snapshot into editor\n * @param snapshot The snapshot to restore\n */\n restoreSnapshot(snapshot: Snapshot): void {\n const core = this.getCore();\n\n core.api.restoreUndoSnapshot(core, snapshot);\n }\n\n /**\n * Get document which contains this editor\n * @returns The HTML document which contains this editor\n */\n getDocument(): Document {\n return this.getCore().environment.document;\n }\n\n /**\n * Focus to this editor, the selection was restored to where it was before, no unexpected scroll.\n */\n focus() {\n const core = this.getCore();\n core.api.focus(core);\n }\n\n /**\n * Check if focus is in editor now\n * @returns true if focus is in editor, otherwise false\n */\n hasFocus(): boolean {\n const core = this.getCore();\n return core.domHelper.hasFocus();\n }\n\n /**\n * Trigger an event to be dispatched to all plugins\n * @param eventType Type of the event\n * @param data data of the event with given type, this is the rest part of PluginEvent with the given type\n * @param broadcast indicates if the event needs to be dispatched to all plugins\n * True means to all, false means to allow exclusive handling from one plugin unless no one wants that\n * @returns the event object which is really passed into plugins. Some plugin may modify the event object so\n * the result of this function provides a chance to read the modified result\n */\n triggerEvent<T extends PluginEventType>(\n eventType: T,\n data: PluginEventData<T>,\n broadcast: boolean = false\n ): PluginEventFromType<T> {\n const core = this.getCore();\n const event = ({\n eventType,\n ...data,\n } as any) as PluginEventFromType<T>;\n core.api.triggerEvent(core, event, broadcast);\n\n return event;\n }\n\n /**\n * Attach a DOM event to the editor content DIV\n * @param eventMap A map from event name to its handler\n */\n attachDomEvent(eventMap: Record<string, DOMEventRecord>): () => void {\n const core = this.getCore();\n return core.api.attachDomEvent(core, eventMap);\n }\n\n /**\n * Get undo snapshots manager\n */\n getSnapshotsManager(): SnapshotsManager {\n const core = this.getCore();\n\n return core.undo.snapshotsManager;\n }\n\n /**\n * Check if the editor is in dark mode\n * @returns True if the editor is in dark mode, otherwise false\n */\n isDarkMode(): boolean {\n return this.getCore().lifecycle.isDarkMode;\n }\n\n /**\n * Set the dark mode state and transforms the content to match the new state.\n * @param isDarkMode The next status of dark mode. True if the editor should be in dark mode, false if not.\n */\n setDarkModeState(isDarkMode?: boolean) {\n const core = this.getCore();\n\n if (!!isDarkMode != core.lifecycle.isDarkMode) {\n transformColor(\n core.physicalRoot,\n false /*includeSelf*/,\n isDarkMode ? 'lightToDark' : 'darkToLight',\n core.darkColorHandler,\n {\n tableBorders: this.isExperimentalFeatureEnabled('TransformTableBorderColors'),\n }\n );\n\n core.lifecycle.isDarkMode = !!isDarkMode;\n\n core.api.triggerEvent(\n core,\n {\n eventType: 'contentChanged',\n source: isDarkMode\n ? ChangeSource.SwitchToDarkMode\n : ChangeSource.SwitchToLightMode,\n skipUndo: true,\n },\n true\n );\n }\n }\n\n /**\n * Check if editor is in Shadow Edit mode\n */\n isInShadowEdit() {\n return !!this.getCore().lifecycle.shadowEditFragment;\n }\n\n /**\n * Make the editor in \"Shadow Edit\" mode.\n * In Shadow Edit mode, all format change will finally be ignored.\n * This can be used for building a live preview feature for format button, to allow user\n * see format result without really apply it.\n * This function can be called repeated. If editor is already in shadow edit mode, we can still\n * use this function to do more shadow edit operation.\n */\n startShadowEdit() {\n const core = this.getCore();\n core.api.switchShadowEdit(core, true /*isOn*/);\n }\n\n /**\n * Leave \"Shadow Edit\" mode, all changes made during shadow edit will be discarded\n */\n stopShadowEdit() {\n const core = this.getCore();\n core.api.switchShadowEdit(core, false /*isOn*/);\n }\n\n /**\n * Get a color manager object for this editor.\n */\n getColorManager(): DarkColorHandler {\n return this.getCore().darkColorHandler;\n }\n\n /**\n * @deprecated\n * Get a function to convert HTML string to trusted HTML string.\n * By default it will just return the input HTML directly. To override this behavior,\n * pass your own trusted HTML handler to EditorOptions.trustedHTMLHandler\n * See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/trusted-types\n */\n getTrustedHTMLHandler(): LegacyTrustedHTMLHandler {\n return this.getCore().trustedHTMLHandler;\n }\n\n /**\n * Get a function to convert HTML string to a trust Document.\n * By default it will just convert the original HTML string into a Document object directly.\n * To override, pass your own trusted HTML handler to EditorOptions.trustedHTMLHandler\n * See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/trusted-types\n */\n getDOMCreator(): DOMCreator {\n return this.getCore().domCreator;\n }\n\n /**\n * Get the scroll container of the editor\n */\n getScrollContainer(): HTMLElement {\n return this.getCore().domEvent.scrollContainer;\n }\n\n /**\n * Retrieves the rect of the visible viewport of the editor.\n */\n getVisibleViewport(): Rect | null {\n return this.getCore().api.getVisibleViewport(this.getCore());\n }\n\n /**\n * Add CSS rules for editor\n * @param key A string to identify the CSS rule type. When set CSS rules with the same key again, existing rules with the same key will be replaced.\n * @param cssRule The CSS rule string, must be a valid CSS rule string, or browser may throw exception. Pass null to clear existing rules\n * @param subSelectors @optional If the rule is used for child element under editor, use this parameter to specify the child elements. Each item will be\n * combined with root selector together to build a separate rule.\n */\n setEditorStyle(\n key: string,\n cssRule: string | null,\n subSelectors?: 'before' | 'after' | string[]\n ): void {\n const core = this.getCore();\n\n core.api.setEditorStyle(core, key, cssRule, subSelectors);\n }\n\n /**\n * Announce the given data\n * @param announceData Data to announce\n */\n announce(announceData: AnnounceData): void {\n const core = this.getCore();\n\n core.api.announce(core, announceData);\n }\n\n /**\n * Check if a given feature is enabled\n * @param featureName The name of feature to check\n */\n isExperimentalFeatureEnabled(featureName: ExperimentalFeature | string): boolean {\n return this.getCore().experimentalFeatures.indexOf(featureName) >= 0;\n }\n\n /**\n * @returns the current EditorCore object\n * @throws a standard Error if there's no core object\n */\n protected getCore(): EditorCore {\n if (!this.core) {\n throw new Error('Editor is already disposed');\n }\n return this.core;\n }\n\n private cloneOptionCallback: CachedElementHandler = (node, type) => {\n if (type == 'cache') {\n return undefined;\n }\n\n const result = node.cloneNode(true /*deep*/) as HTMLElement;\n\n if (this.isDarkMode()) {\n const colorHandler = this.getColorManager();\n\n transformColor(result, true /*includeSelf*/, 'darkToLight', colorHandler, {\n tableBorders: this.isExperimentalFeatureEnabled('TransformTableBorderColors'),\n });\n\n result.style.color = result.style.color || 'inherit';\n result.style.backgroundColor = result.style.backgroundColor || 'inherit';\n }\n\n return result;\n };\n}\n"]}
1
+ {"version":3,"file":"Editor.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-core/lib/editor/Editor.ts"],"names":[],"mappings":"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","sourcesContent":["import { createEditorCore } from './core/createEditorCore';\nimport {\n createEmptyModel,\n ChangeSource,\n cloneModel,\n transformColor,\n createDomToModelContextWithConfig,\n domToContentModel,\n} from 'roosterjs-content-model-dom';\nimport type {\n ContentModelDocument,\n ContentModelFormatter,\n ContentModelSegmentFormat,\n DarkColorHandler,\n DOMEventRecord,\n DOMHelper,\n DOMSelection,\n EditorEnvironment,\n FormatContentModelOptions,\n IEditor,\n PluginEventData,\n PluginEventFromType,\n PluginEventType,\n Snapshot,\n SnapshotsManager,\n EditorCore,\n EditorOptions,\n Rect,\n EntityState,\n CachedElementHandler,\n DomToModelOptionForCreateModel,\n AnnounceData,\n ExperimentalFeature,\n LegacyTrustedHTMLHandler,\n DOMCreator,\n} from 'roosterjs-content-model-types';\n\n/**\n * The main editor class based on Content Model\n */\nexport class Editor implements IEditor {\n private core: EditorCore | null = null;\n\n /**\n * Creates an instance of Editor\n * @param contentDiv The DIV HTML element which will be the container element of editor\n * @param options An optional options object to customize the editor\n */\n constructor(contentDiv: HTMLDivElement, options: EditorOptions = {}) {\n this.core = createEditorCore(contentDiv, options);\n\n const initialModel =\n options.initialModel ?? createEmptyModel(this.core.format.defaultFormat);\n\n this.core.api.setContentModel(\n this.core,\n initialModel,\n { ignoreSelection: true },\n undefined /*onNodeCreated*/,\n true /*isInitializing*/\n );\n this.core.plugins.forEach(plugin => plugin.initialize(this));\n }\n\n /**\n * Dispose this editor, dispose all plugins and custom data\n */\n dispose() {\n const core = this.getCore();\n\n for (let i = core.plugins.length - 1; i >= 0; i--) {\n const plugin = core.plugins[i];\n\n try {\n plugin.dispose();\n } catch (e) {\n // Cache the error and pass it out, then keep going since dispose should always succeed\n core.disposeErrorHandler?.(plugin, e as Error);\n }\n }\n\n core.darkColorHandler.reset();\n\n this.core = null;\n }\n\n /**\n * Get whether this editor is disposed\n * @returns True if editor is disposed, otherwise false\n */\n isDisposed(): boolean {\n return !this.core;\n }\n\n /**\n * Create Content Model from DOM tree in this editor\n * @param mode What kind of Content Model we want. Currently we support the following values:\n * - disconnected: Returns a disconnected clone of Content Model from editor which you can do any change on it and it won't impact the editor content.\n * If there is any entity in editor, the returned object will contain cloned copy of entity wrapper element.\n * If editor is in dark mode, the cloned entity will be converted back to light mode.\n * - clean: Similar with disconnected, this will return a disconnected model, the difference is \"clean\" mode will not include any selection info.\n * This is usually used for exporting content\n */\n getContentModelCopy(mode: 'connected' | 'disconnected' | 'clean'): ContentModelDocument {\n const core = this.getCore();\n\n switch (mode) {\n case 'connected': // Get a connected model is deprecated. Now we will always return disconnected model\n case 'disconnected':\n return cloneModel(\n core.api.createContentModel(core, {\n tryGetFromCache: false,\n }),\n {\n includeCachedElement: this.cloneOptionCallback,\n }\n );\n\n case 'clean':\n const domToModelContext = createDomToModelContextWithConfig(\n core.environment.domToModelSettings.calculated,\n core.api.createEditorContext(core, false /*saveIndex*/)\n );\n\n return cloneModel(domToContentModel(core.physicalRoot, domToModelContext), {\n includeCachedElement: this.cloneOptionCallback,\n });\n }\n }\n\n /**\n * Get current running environment, such as if editor is running on Mac\n */\n getEnvironment(): EditorEnvironment {\n return this.getCore().environment;\n }\n\n /**\n * Get current DOM selection\n */\n getDOMSelection(): DOMSelection | null {\n const core = this.getCore();\n\n return core.api.getDOMSelection(core);\n }\n\n /**\n * Set DOMSelection into editor content.\n * @param selection The selection to set\n */\n setDOMSelection(selection: DOMSelection | null) {\n const core = this.getCore();\n\n core.api.setDOMSelection(core, selection);\n }\n\n /**\n * Set a new logical root (most likely due to focus change)\n * @param logicalRoot The new logical root (has to be child of physicalRoot)\n */\n setLogicalRoot(logicalRoot: HTMLDivElement) {\n const core = this.getCore();\n\n core.api.setLogicalRoot(core, logicalRoot);\n }\n\n /**\n * The general API to do format change with Content Model\n * It will grab a Content Model for current editor content, and invoke a callback function\n * to do format change. Then according to the return value, write back the modified content model into editor.\n * If there is cached model, it will be used and updated.\n * @param formatter Formatter function, see ContentModelFormatter\n * @param options More options, see FormatContentModelOptions\n */\n formatContentModel(\n formatter: ContentModelFormatter,\n options?: FormatContentModelOptions,\n domToModelOptions?: DomToModelOptionForCreateModel\n ): void {\n const core = this.getCore();\n\n core.api.formatContentModel(core, formatter, options, domToModelOptions);\n }\n\n /**\n * Get pending format of editor if any, or return null\n */\n getPendingFormat(): ContentModelSegmentFormat | null {\n return this.getCore().format.pendingFormat?.format ?? null;\n }\n\n /**\n * Get a DOM Helper object to help access DOM tree in editor\n */\n getDOMHelper(): DOMHelper {\n return this.getCore().domHelper;\n }\n\n /**\n * Add a single undo snapshot to undo stack\n * @param entityState @optional State for entity if we want to add entity state for this snapshot\n */\n takeSnapshot(entityState?: EntityState): Snapshot | null {\n const core = this.getCore();\n\n return core.api.addUndoSnapshot(\n core,\n false /*canUndoByBackspace*/,\n entityState ? [entityState] : undefined\n );\n }\n\n /**\n * Restore an undo snapshot into editor\n * @param snapshot The snapshot to restore\n */\n restoreSnapshot(snapshot: Snapshot): void {\n const core = this.getCore();\n\n core.api.restoreUndoSnapshot(core, snapshot);\n }\n\n /**\n * Get document which contains this editor\n * @returns The HTML document which contains this editor\n */\n getDocument(): Document {\n return this.getCore().environment.document;\n }\n\n /**\n * Focus to this editor, the selection was restored to where it was before, no unexpected scroll.\n */\n focus() {\n const core = this.getCore();\n core.api.focus(core);\n }\n\n /**\n * Check if focus is in editor now\n * @returns true if focus is in editor, otherwise false\n */\n hasFocus(): boolean {\n const core = this.getCore();\n return core.domHelper.hasFocus();\n }\n\n /**\n * Trigger an event to be dispatched to all plugins\n * @param eventType Type of the event\n * @param data data of the event with given type, this is the rest part of PluginEvent with the given type\n * @param broadcast indicates if the event needs to be dispatched to all plugins\n * True means to all, false means to allow exclusive handling from one plugin unless no one wants that\n * @returns the event object which is really passed into plugins. Some plugin may modify the event object so\n * the result of this function provides a chance to read the modified result\n */\n triggerEvent<T extends PluginEventType>(\n eventType: T,\n data: PluginEventData<T>,\n broadcast: boolean = false\n ): PluginEventFromType<T> {\n const core = this.getCore();\n const event = ({\n eventType,\n ...data,\n } as any) as PluginEventFromType<T>;\n core.api.triggerEvent(core, event, broadcast);\n\n return event;\n }\n\n /**\n * Attach a DOM event to the editor content DIV\n * @param eventMap A map from event name to its handler\n */\n attachDomEvent(eventMap: Record<string, DOMEventRecord>): () => void {\n const core = this.getCore();\n return core.api.attachDomEvent(core, eventMap);\n }\n\n /**\n * Get undo snapshots manager\n */\n getSnapshotsManager(): SnapshotsManager {\n const core = this.getCore();\n\n return core.undo.snapshotsManager;\n }\n\n /**\n * Check if the editor is in dark mode\n * @returns True if the editor is in dark mode, otherwise false\n */\n isDarkMode(): boolean {\n return this.getCore().lifecycle.isDarkMode;\n }\n\n /**\n * Set the dark mode state and transforms the content to match the new state.\n * @param isDarkMode The next status of dark mode. True if the editor should be in dark mode, false if not.\n */\n setDarkModeState(isDarkMode?: boolean) {\n const core = this.getCore();\n\n if (!!isDarkMode != core.lifecycle.isDarkMode) {\n transformColor(\n core.physicalRoot,\n false /*includeSelf*/,\n isDarkMode ? 'lightToDark' : 'darkToLight',\n core.darkColorHandler,\n {\n tableBorders: this.isExperimentalFeatureEnabled('TransformTableBorderColors'),\n },\n core.format.defaultFormat.textColor\n );\n\n core.lifecycle.isDarkMode = !!isDarkMode;\n\n core.api.triggerEvent(\n core,\n {\n eventType: 'contentChanged',\n source: isDarkMode\n ? ChangeSource.SwitchToDarkMode\n : ChangeSource.SwitchToLightMode,\n skipUndo: true,\n },\n true\n );\n }\n }\n\n /**\n * Check if editor is in Shadow Edit mode\n */\n isInShadowEdit() {\n return !!this.getCore().lifecycle.shadowEditFragment;\n }\n\n /**\n * Make the editor in \"Shadow Edit\" mode.\n * In Shadow Edit mode, all format change will finally be ignored.\n * This can be used for building a live preview feature for format button, to allow user\n * see format result without really apply it.\n * This function can be called repeated. If editor is already in shadow edit mode, we can still\n * use this function to do more shadow edit operation.\n */\n startShadowEdit() {\n const core = this.getCore();\n core.api.switchShadowEdit(core, true /*isOn*/);\n }\n\n /**\n * Leave \"Shadow Edit\" mode, all changes made during shadow edit will be discarded\n */\n stopShadowEdit() {\n const core = this.getCore();\n core.api.switchShadowEdit(core, false /*isOn*/);\n }\n\n /**\n * Get a color manager object for this editor.\n */\n getColorManager(): DarkColorHandler {\n return this.getCore().darkColorHandler;\n }\n\n /**\n * @deprecated\n * Get a function to convert HTML string to trusted HTML string.\n * By default it will just return the input HTML directly. To override this behavior,\n * pass your own trusted HTML handler to EditorOptions.trustedHTMLHandler\n * See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/trusted-types\n */\n getTrustedHTMLHandler(): LegacyTrustedHTMLHandler {\n return this.getCore().trustedHTMLHandler;\n }\n\n /**\n * Get a function to convert HTML string to a trust Document.\n * By default it will just convert the original HTML string into a Document object directly.\n * To override, pass your own trusted HTML handler to EditorOptions.trustedHTMLHandler\n * See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/trusted-types\n */\n getDOMCreator(): DOMCreator {\n return this.getCore().domCreator;\n }\n\n /**\n * Get the scroll container of the editor\n */\n getScrollContainer(): HTMLElement {\n return this.getCore().domEvent.scrollContainer;\n }\n\n /**\n * Retrieves the rect of the visible viewport of the editor.\n */\n getVisibleViewport(): Rect | null {\n return this.getCore().api.getVisibleViewport(this.getCore());\n }\n\n /**\n * Add CSS rules for editor\n * @param key A string to identify the CSS rule type. When set CSS rules with the same key again, existing rules with the same key will be replaced.\n * @param cssRule The CSS rule string, must be a valid CSS rule string, or browser may throw exception. Pass null to clear existing rules\n * @param subSelectors @optional If the rule is used for child element under editor, use this parameter to specify the child elements. Each item will be\n * combined with root selector together to build a separate rule.\n */\n setEditorStyle(\n key: string,\n cssRule: string | null,\n subSelectors?: 'before' | 'after' | string[]\n ): void {\n const core = this.getCore();\n\n core.api.setEditorStyle(core, key, cssRule, subSelectors);\n }\n\n /**\n * Announce the given data\n * @param announceData Data to announce\n */\n announce(announceData: AnnounceData): void {\n const core = this.getCore();\n\n core.api.announce(core, announceData);\n }\n\n /**\n * Check if a given feature is enabled\n * @param featureName The name of feature to check\n */\n isExperimentalFeatureEnabled(featureName: ExperimentalFeature | string): boolean {\n return this.getCore().experimentalFeatures.indexOf(featureName) >= 0;\n }\n\n /**\n * @returns the current EditorCore object\n * @throws a standard Error if there's no core object\n */\n protected getCore(): EditorCore {\n if (!this.core) {\n throw new Error('Editor is already disposed');\n }\n return this.core;\n }\n\n private cloneOptionCallback: CachedElementHandler = (node, type) => {\n if (type == 'cache') {\n return undefined;\n }\n\n const result = node.cloneNode(true /*deep*/) as HTMLElement;\n\n if (this.isDarkMode()) {\n const colorHandler = this.getColorManager();\n\n transformColor(result, true /*includeSelf*/, 'darkToLight', colorHandler, {\n tableBorders: this.isExperimentalFeatureEnabled('TransformTableBorderColors'),\n });\n\n result.style.color = result.style.color || 'inherit';\n result.style.backgroundColor = result.style.backgroundColor || 'inherit';\n }\n\n return result;\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- define(["require", "exports", "./adjustImageSelectionOnSafari", "./adjustSelectionForCopyCut", "../../override/pasteCopyBlockEntityParser", "./preprocessTable", "./pruneUnselectedModel", "roosterjs-content-model-dom"], function (require, exports, adjustImageSelectionOnSafari_1, adjustSelectionForCopyCut_1, pasteCopyBlockEntityParser_1, preprocessTable_1, pruneUnselectedModel_1, roosterjs_content_model_dom_1) {
1
+ define(["require", "exports", "./adjustImageSelectionOnSafari", "./adjustSelectionForCopyCut", "../../override/pasteCopyBlockEntityParser", "roosterjs-content-model-dom"], function (require, exports, adjustImageSelectionOnSafari_1, adjustSelectionForCopyCut_1, pasteCopyBlockEntityParser_1, roosterjs_content_model_dom_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.getContentForCopy = exports.onNodeCreated = void 0;
@@ -26,22 +26,13 @@ define(["require", "exports", "./adjustImageSelectionOnSafari", "./adjustSelecti
26
26
  function getContentForCopy(editor, isCut, event) {
27
27
  var selection = editor.getDOMSelection();
28
28
  (0, adjustImageSelectionOnSafari_1.adjustImageSelectionOnSafari)(editor, selection);
29
- if (selection && (selection.type != 'range' || !selection.range.collapsed)) {
29
+ if (selection && (selection.type !== 'range' || !selection.range.collapsed)) {
30
30
  var pasteModel = editor.getContentModelCopy('disconnected');
31
- (0, pruneUnselectedModel_1.pruneUnselectedModel)(pasteModel);
32
- if (selection.type === 'table') {
33
- (0, roosterjs_content_model_dom_1.iterateSelections)(pasteModel, function (_, tableContext) {
34
- if (tableContext === null || tableContext === void 0 ? void 0 : tableContext.table) {
35
- (0, preprocessTable_1.preprocessTable)(tableContext.table);
36
- return true;
37
- }
38
- return false;
39
- });
40
- }
41
- else if (selection.type === 'range') {
31
+ var context = (0, roosterjs_content_model_dom_1.createModelToDomContext)();
32
+ (0, roosterjs_content_model_dom_1.trimModelForSelection)(pasteModel, selection);
33
+ if (selection.type === 'range') {
42
34
  (0, adjustSelectionForCopyCut_1.adjustSelectionForCopyCut)(pasteModel);
43
35
  }
44
- var context = (0, roosterjs_content_model_dom_1.createModelToDomContext)();
45
36
  context.onNodeCreated = exports.onNodeCreated;
46
37
  var doc = editor.getDocument();
47
38
  var tempDiv = doc.createElement('div');
@@ -1 +1 @@
1
- {"version":3,"file":"getContentForCopy.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/cutCopy/getContentForCopy.ts"],"names":[],"mappings":";;;;IAqBA;;;OAGG;IACI,IAAM,aAAa,GAAkB,UAAC,YAAY,EAAE,IAAI;QAC3D,IAAI,IAAA,0CAAY,EAAC,IAAI,EAAE,cAAc,CAAC,IAAI,IAAA,6CAAe,EAAC,IAAI,EAAE,OAAO,CAAC,EAAE;YACtE,IAAA,kCAAI,EAAC,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;SACzC;QACD,IAAI,IAAA,0CAAY,EAAC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAC/D,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;SAC3C;QACD,IAAA,mDAAsB,EAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC;IARW,QAAA,aAAa,iBAQxB;IAEF;;;;;;OAMG;IACH,SAAgB,iBAAiB,CAC7B,MAAe,EACf,KAAc,EACd,KAAqB;QAErB,IAAM,SAAS,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3C,IAAA,2DAA4B,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAChD,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;YACxE,IAAM,UAAU,GAAG,MAAM,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;YAC9D,IAAA,2CAAoB,EAAC,UAAU,CAAC,CAAC;YAEjC,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE;gBAC5B,IAAA,+CAAiB,EAAC,UAAU,EAAE,UAAC,CAAC,EAAE,YAAY;oBAC1C,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,EAAE;wBACrB,IAAA,iCAAe,EAAC,YAAY,CAAC,KAAK,CAAC,CAAC;wBAEpC,OAAO,IAAI,CAAC;qBACf;oBACD,OAAO,KAAK,CAAC;gBACjB,CAAC,CAAC,CAAC;aACN;iBAAM,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE;gBACnC,IAAA,qDAAyB,EAAC,UAAU,CAAC,CAAC;aACzC;YACD,IAAM,OAAO,GAAG,IAAA,qDAAuB,GAAE,CAAC;YAE1C,OAAO,CAAC,aAAa,GAAG,qBAAa,CAAC;YACtC,IAAM,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;YACjC,IAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAEzC,IAAM,gBAAgB,GAAG,IAAA,+CAAiB,EAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAC9E,IAAM,QAAQ,GAAG,gBAAgB,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACtF,IAAI,QAAQ,EAAE;gBACF,IAAA,UAAU,GAAK,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE;oBACxD,UAAU,EAAE,OAAO;oBACnB,KAAK,EAAE,QAAQ;oBACf,QAAQ,EAAE,KAAK;oBACf,KAAK,OAAA;iBACR,CAAC,WALgB,CAKf;gBAEH,OAAO;oBACH,WAAW,EAAE,UAAU;oBACvB,WAAW,EAAE,IAAA,gDAAkB,EAAC,UAAU,CAAC;iBAC9C,CAAC;aACL;SACJ;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IA9CD,8CA8CC;IAED,SAAS,mBAAmB,CAAC,GAAa,EAAE,SAAuB;;QAC/D,IAAI,QAAQ,GAAiB,IAAI,CAAC;QAElC,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE;YAC5B,IAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;YAC9B,IAAM,eAAe,GACjB,CAAA,MAAA,KAAK,CAAC,aAAa,0CAAE,iBAAiB,KAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;YAE9E,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YAC7B,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;SACxC;aAAM,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE;YACnC,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YAC7B,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;SACxC;aAAM;YACH,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC;SAC9B;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC","sourcesContent":["import { adjustImageSelectionOnSafari } from './adjustImageSelectionOnSafari';\nimport { adjustSelectionForCopyCut } from './adjustSelectionForCopyCut';\nimport { onCreateCopyEntityNode } from '../../override/pasteCopyBlockEntityParser';\nimport { preprocessTable } from './preprocessTable';\nimport { pruneUnselectedModel } from './pruneUnselectedModel';\nimport type {\n DOMSelection,\n IEditor,\n OnNodeCreated,\n TextAndHtmlContentForCopy,\n} from 'roosterjs-content-model-types';\nimport {\n contentModelToDom,\n contentModelToText,\n createModelToDomContext,\n isElementOfType,\n isNodeOfType,\n iterateSelections,\n wrap,\n} from 'roosterjs-content-model-dom';\n\n/**\n * @internal\n * Exported only for unit testing\n */\nexport const onNodeCreated: OnNodeCreated = (modelElement, node): void => {\n if (isNodeOfType(node, 'ELEMENT_NODE') && isElementOfType(node, 'table')) {\n wrap(node.ownerDocument, node, 'div');\n }\n if (isNodeOfType(node, 'ELEMENT_NODE') && !node.isContentEditable) {\n node.removeAttribute('contenteditable');\n }\n onCreateCopyEntityNode(modelElement, node);\n};\n\n/**\n * Get the content for the copy event\n * @param editor The editor object\n * @param isCut if the event cut the content.\n * @param event the clipboard event that triggered the copy/cut\n * @returns\n */\nexport function getContentForCopy(\n editor: IEditor,\n isCut: boolean,\n event: ClipboardEvent\n): TextAndHtmlContentForCopy | null {\n const selection = editor.getDOMSelection();\n adjustImageSelectionOnSafari(editor, selection);\n if (selection && (selection.type != 'range' || !selection.range.collapsed)) {\n const pasteModel = editor.getContentModelCopy('disconnected');\n pruneUnselectedModel(pasteModel);\n\n if (selection.type === 'table') {\n iterateSelections(pasteModel, (_, tableContext) => {\n if (tableContext?.table) {\n preprocessTable(tableContext.table);\n\n return true;\n }\n return false;\n });\n } else if (selection.type === 'range') {\n adjustSelectionForCopyCut(pasteModel);\n }\n const context = createModelToDomContext();\n\n context.onNodeCreated = onNodeCreated;\n const doc = editor.getDocument();\n const tempDiv = doc.createElement('div');\n\n const selectionForCopy = contentModelToDom(doc, tempDiv, pasteModel, context);\n const newRange = selectionForCopy ? domSelectionToRange(doc, selectionForCopy) : null;\n if (newRange) {\n const { clonedRoot } = editor.triggerEvent('beforeCutCopy', {\n clonedRoot: tempDiv,\n range: newRange,\n rawEvent: event,\n isCut,\n });\n\n return {\n htmlContent: clonedRoot,\n textContent: contentModelToText(pasteModel),\n };\n }\n }\n return null;\n}\n\nfunction domSelectionToRange(doc: Document, selection: DOMSelection): Range | null {\n let newRange: Range | null = null;\n\n if (selection.type === 'table') {\n const table = selection.table;\n const elementToSelect =\n table.parentElement?.childElementCount == 1 ? table.parentElement : table;\n\n newRange = doc.createRange();\n newRange.selectNode(elementToSelect);\n } else if (selection.type === 'image') {\n newRange = doc.createRange();\n newRange.selectNode(selection.image);\n } else {\n newRange = selection.range;\n }\n\n return newRange;\n}\n"]}
1
+ {"version":3,"file":"getContentForCopy.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/cutCopy/getContentForCopy.ts"],"names":[],"mappings":"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","sourcesContent":["import { adjustImageSelectionOnSafari } from './adjustImageSelectionOnSafari';\nimport { adjustSelectionForCopyCut } from './adjustSelectionForCopyCut';\nimport { onCreateCopyEntityNode } from '../../override/pasteCopyBlockEntityParser';\nimport {\n contentModelToDom,\n contentModelToText,\n createModelToDomContext,\n trimModelForSelection,\n isElementOfType,\n isNodeOfType,\n wrap,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMSelection,\n IEditor,\n OnNodeCreated,\n TextAndHtmlContentForCopy,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Exported only for unit testing\n */\nexport const onNodeCreated: OnNodeCreated = (modelElement, node): void => {\n if (isNodeOfType(node, 'ELEMENT_NODE') && isElementOfType(node, 'table')) {\n wrap(node.ownerDocument, node, 'div');\n }\n if (isNodeOfType(node, 'ELEMENT_NODE') && !node.isContentEditable) {\n node.removeAttribute('contenteditable');\n }\n onCreateCopyEntityNode(modelElement, node);\n};\n\n/**\n * Get the content for the copy event\n * @param editor The editor object\n * @param isCut if the event cut the content.\n * @param event the clipboard event that triggered the copy/cut\n * @returns\n */\nexport function getContentForCopy(\n editor: IEditor,\n isCut: boolean,\n event: ClipboardEvent\n): TextAndHtmlContentForCopy | null {\n const selection = editor.getDOMSelection();\n adjustImageSelectionOnSafari(editor, selection);\n\n if (selection && (selection.type !== 'range' || !selection.range.collapsed)) {\n const pasteModel = editor.getContentModelCopy('disconnected');\n const context = createModelToDomContext();\n trimModelForSelection(pasteModel, selection);\n\n if (selection.type === 'range') {\n adjustSelectionForCopyCut(pasteModel);\n }\n\n context.onNodeCreated = onNodeCreated;\n const doc = editor.getDocument();\n const tempDiv = doc.createElement('div');\n\n const selectionForCopy = contentModelToDom(doc, tempDiv, pasteModel, context);\n const newRange = selectionForCopy ? domSelectionToRange(doc, selectionForCopy) : null;\n if (newRange) {\n const { clonedRoot } = editor.triggerEvent('beforeCutCopy', {\n clonedRoot: tempDiv,\n range: newRange,\n rawEvent: event,\n isCut,\n });\n\n return {\n htmlContent: clonedRoot,\n textContent: contentModelToText(pasteModel),\n };\n }\n }\n return null;\n}\n\nfunction domSelectionToRange(doc: Document, selection: DOMSelection): Range | null {\n let newRange: Range | null = null;\n\n if (selection.type === 'table') {\n const table = selection.table;\n const elementToSelect =\n table.parentElement?.childElementCount == 1 ? table.parentElement : table;\n\n newRange = doc.createRange();\n newRange.selectNode(elementToSelect);\n } else if (selection.type === 'image') {\n newRange = doc.createRange();\n newRange.selectNode(selection.image);\n } else {\n newRange = selection.range;\n }\n\n return newRange;\n}\n"]}
@@ -1,11 +1,10 @@
1
- define(["require", "exports", "./addRangeToSelection", "../../corePlugin/cache/areSameSelections", "../setEditorStyle/ensureUniqueId", "./findLastedCoInMergedCell", "./findTableCellElement", "./toggleCaret", "roosterjs-content-model-dom"], function (require, exports, addRangeToSelection_1, areSameSelections_1, ensureUniqueId_1, findLastedCoInMergedCell_1, findTableCellElement_1, toggleCaret_1, roosterjs_content_model_dom_1) {
1
+ define(["require", "exports", "./addRangeToSelection", "../../corePlugin/cache/areSameSelections", "../setEditorStyle/ensureUniqueId", "./findLastedCoInMergedCell", "./findTableCellElement", "roosterjs-content-model-dom", "./setTableCellsStyle", "./toggleCaret"], function (require, exports, addRangeToSelection_1, areSameSelections_1, ensureUniqueId_1, findLastedCoInMergedCell_1, findTableCellElement_1, roosterjs_content_model_dom_1, setTableCellsStyle_1, toggleCaret_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.setDOMSelection = void 0;
5
5
  var DOM_SELECTION_CSS_KEY = '_DOMSelection';
6
6
  var HIDE_SELECTION_CSS_KEY = '_DOMSelectionHideSelection';
7
7
  var IMAGE_ID = 'image';
8
- var TABLE_ID = 'table';
9
8
  var TRANSPARENT_SELECTION_CSS_RULE = 'background-color: transparent !important;';
10
9
  var SELECTION_SELECTOR = '*::selection';
11
10
  var DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';
@@ -13,7 +12,7 @@ define(["require", "exports", "./addRangeToSelection", "../../corePlugin/cache/a
13
12
  * @internal
14
13
  */
15
14
  var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
16
- var _a, _b, _c;
15
+ var _a;
17
16
  var existingSelection = core.api.getDOMSelection(core);
18
17
  if (existingSelection && selection && (0, areSameSelections_1.areSameSelections)(existingSelection, selection)) {
19
18
  return;
@@ -68,22 +67,11 @@ define(["require", "exports", "./addRangeToSelection", "../../corePlugin/cache/a
68
67
  lastColumn: lastCell.col,
69
68
  tableSelectionInfo: selection.tableSelectionInfo,
70
69
  };
71
- var tableId = (0, ensureUniqueId_1.ensureUniqueId)(table, TABLE_ID);
72
- var tableSelector = (0, roosterjs_content_model_dom_1.getSafeIdSelector)(tableId);
73
- var tableSelectors = firstCell.row == 0 &&
74
- firstCell.col == 0 &&
75
- lastCell.row == parsedTable.length - 1 &&
76
- lastCell.col == ((_b = (_a = parsedTable[lastCell.row]) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) - 1
77
- ? [tableSelector, tableSelector + " *"]
78
- : handleTableSelected(parsedTable, tableSelector, table, firstCell, lastCell);
79
70
  core.selection.selection = selection;
80
- var tableSelectionColor = isDarkMode
81
- ? core.selection.tableCellSelectionBackgroundColorDark
82
- : core.selection.tableCellSelectionBackgroundColor;
83
- core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, "background-color:" + tableSelectionColor + "!important;", tableSelectors);
71
+ (0, setTableCellsStyle_1.setTableCellsStyle)(core, table, parsedTable, firstCell, lastCell);
84
72
  core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, TRANSPARENT_SELECTION_CSS_RULE, [SELECTION_SELECTOR]);
85
73
  (0, toggleCaret_1.toggleCaret)(core, true /* hide */);
86
- var nodeToSelect = ((_c = firstCell.cell) === null || _c === void 0 ? void 0 : _c.firstElementChild) || firstCell.cell;
74
+ var nodeToSelect = ((_a = firstCell.cell) === null || _a === void 0 ? void 0 : _a.firstElementChild) || firstCell.cell;
87
75
  if (nodeToSelect) {
88
76
  setRangeSelection(doc, nodeToSelect || undefined, true /* collapse */);
89
77
  }
@@ -109,48 +97,6 @@ define(["require", "exports", "./addRangeToSelection", "../../corePlugin/cache/a
109
97
  }
110
98
  };
111
99
  exports.setDOMSelection = setDOMSelection;
112
- function handleTableSelected(parsedTable, tableSelector, table, firstCell, lastCell) {
113
- var selectors = [];
114
- // Get whether table has thead, tbody or tfoot, then Set the start and end of each of the table children,
115
- // so we can build the selector according the element between the table and the row.
116
- var cont = 0;
117
- var indexes = (0, roosterjs_content_model_dom_1.toArray)(table.childNodes)
118
- .filter(function (node) {
119
- return ['THEAD', 'TBODY', 'TFOOT'].indexOf((0, roosterjs_content_model_dom_1.isNodeOfType)(node, 'ELEMENT_NODE') ? node.tagName : '') > -1;
120
- })
121
- .map(function (node) {
122
- var result = {
123
- el: node.tagName,
124
- start: cont,
125
- end: node.childNodes.length + cont,
126
- };
127
- cont = result.end;
128
- return result;
129
- });
130
- parsedTable.forEach(function (row, rowIndex) {
131
- var tdCount = 0;
132
- //Get current TBODY/THEAD/TFOOT
133
- var midElement = indexes.filter(function (ind) { return ind.start <= rowIndex && ind.end > rowIndex; })[0];
134
- var middleElSelector = midElement ? '>' + midElement.el + '>' : '>';
135
- var currentRow = midElement && rowIndex + 1 >= midElement.start
136
- ? rowIndex + 1 - midElement.start
137
- : rowIndex + 1;
138
- for (var cellIndex = 0; cellIndex < row.length; cellIndex++) {
139
- var cell = row[cellIndex];
140
- if (typeof cell == 'object') {
141
- tdCount++;
142
- if (rowIndex >= firstCell.row &&
143
- rowIndex <= lastCell.row &&
144
- cellIndex >= firstCell.col &&
145
- cellIndex <= lastCell.col) {
146
- var selector = "" + tableSelector + middleElSelector + " tr:nth-child(" + currentRow + ")>" + cell.tagName + ":nth-child(" + tdCount + ")";
147
- selectors.push(selector, selector + ' *');
148
- }
149
- }
150
- }
151
- });
152
- return selectors;
153
- }
154
100
  function setRangeSelection(doc, element, collapse) {
155
101
  var _a;
156
102
  if (element && doc.contains(element)) {