roosterjs-content-model-core 9.52.0 → 9.53.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 (109) hide show
  1. package/lib/command/cutCopy/getContentForCopy.js +4 -1
  2. package/lib/command/cutCopy/getContentForCopy.js.map +1 -1
  3. package/lib/coreApi/announce/announce.js +1 -0
  4. package/lib/coreApi/announce/announce.js.map +1 -1
  5. package/lib/coreApi/getDOMSelection/getDOMSelection.js +12 -9
  6. package/lib/coreApi/getDOMSelection/getDOMSelection.js.map +1 -1
  7. package/lib/coreApi/setDOMSelection/setDOMSelection.js +7 -8
  8. package/lib/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  9. package/lib/coreApi/setEditorStyle/ensureUniqueId.js +2 -2
  10. package/lib/coreApi/setEditorStyle/ensureUniqueId.js.map +1 -1
  11. package/lib/coreApi/setEditorStyle/setEditorStyle.js +1 -1
  12. package/lib/coreApi/setEditorStyle/setEditorStyle.js.map +1 -1
  13. package/lib/corePlugin/cache/areSameSelections.d.ts +0 -4
  14. package/lib/corePlugin/cache/areSameSelections.js +3 -10
  15. package/lib/corePlugin/cache/areSameSelections.js.map +1 -1
  16. package/lib/corePlugin/cache/domIndexerImpl.js +14 -6
  17. package/lib/corePlugin/cache/domIndexerImpl.js.map +1 -1
  18. package/lib/corePlugin/lifecycle/LifecyclePlugin.js +1 -0
  19. package/lib/corePlugin/lifecycle/LifecyclePlugin.js.map +1 -1
  20. package/lib/corePlugin/selection/SelectionPlugin.js +10 -7
  21. package/lib/corePlugin/selection/SelectionPlugin.js.map +1 -1
  22. package/lib/editor/core/DOMHelperImpl.d.ts +4 -0
  23. package/lib/editor/core/DOMHelperImpl.js +61 -1
  24. package/lib/editor/core/DOMHelperImpl.js.map +1 -1
  25. package/lib/editor/core/createEditorCore.js +4 -1
  26. package/lib/editor/core/createEditorCore.js.map +1 -1
  27. package/lib/override/containerSizeFormatParser.js +2 -0
  28. package/lib/override/containerSizeFormatParser.js.map +1 -1
  29. package/lib/utils/areSameRanges.d.ts +5 -0
  30. package/lib/utils/areSameRanges.js +13 -0
  31. package/lib/utils/areSameRanges.js.map +1 -0
  32. package/lib/utils/createAriaLiveElement.js +0 -1
  33. package/lib/utils/createAriaLiveElement.js.map +1 -1
  34. package/lib-amd/command/cutCopy/getContentForCopy.js +4 -1
  35. package/lib-amd/command/cutCopy/getContentForCopy.js.map +1 -1
  36. package/lib-amd/coreApi/announce/announce.js +1 -0
  37. package/lib-amd/coreApi/announce/announce.js.map +1 -1
  38. package/lib-amd/coreApi/getDOMSelection/getDOMSelection.js +12 -9
  39. package/lib-amd/coreApi/getDOMSelection/getDOMSelection.js.map +1 -1
  40. package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js +8 -8
  41. package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  42. package/lib-amd/coreApi/setEditorStyle/ensureUniqueId.js +2 -2
  43. package/lib-amd/coreApi/setEditorStyle/ensureUniqueId.js.map +1 -1
  44. package/lib-amd/coreApi/setEditorStyle/setEditorStyle.js +1 -1
  45. package/lib-amd/coreApi/setEditorStyle/setEditorStyle.js.map +1 -1
  46. package/lib-amd/corePlugin/cache/areSameSelections.d.ts +0 -4
  47. package/lib-amd/corePlugin/cache/areSameSelections.js +3 -11
  48. package/lib-amd/corePlugin/cache/areSameSelections.js.map +1 -1
  49. package/lib-amd/corePlugin/cache/domIndexerImpl.js +14 -6
  50. package/lib-amd/corePlugin/cache/domIndexerImpl.js.map +1 -1
  51. package/lib-amd/corePlugin/lifecycle/LifecyclePlugin.js +1 -0
  52. package/lib-amd/corePlugin/lifecycle/LifecyclePlugin.js.map +1 -1
  53. package/lib-amd/corePlugin/selection/SelectionPlugin.js +10 -7
  54. package/lib-amd/corePlugin/selection/SelectionPlugin.js.map +1 -1
  55. package/lib-amd/editor/core/DOMHelperImpl.d.ts +4 -0
  56. package/lib-amd/editor/core/DOMHelperImpl.js +61 -2
  57. package/lib-amd/editor/core/DOMHelperImpl.js.map +1 -1
  58. package/lib-amd/editor/core/createEditorCore.js +4 -1
  59. package/lib-amd/editor/core/createEditorCore.js.map +1 -1
  60. package/lib-amd/override/containerSizeFormatParser.js +2 -0
  61. package/lib-amd/override/containerSizeFormatParser.js.map +1 -1
  62. package/lib-amd/utils/areSameRanges.d.ts +5 -0
  63. package/lib-amd/utils/areSameRanges.js +15 -0
  64. package/lib-amd/utils/areSameRanges.js.map +1 -0
  65. package/lib-amd/utils/createAriaLiveElement.js +0 -1
  66. package/lib-amd/utils/createAriaLiveElement.js.map +1 -1
  67. package/lib-mjs/command/cutCopy/getContentForCopy.js +5 -2
  68. package/lib-mjs/command/cutCopy/getContentForCopy.js.map +1 -1
  69. package/lib-mjs/coreApi/announce/announce.js +1 -0
  70. package/lib-mjs/coreApi/announce/announce.js.map +1 -1
  71. package/lib-mjs/coreApi/getDOMSelection/getDOMSelection.js +12 -9
  72. package/lib-mjs/coreApi/getDOMSelection/getDOMSelection.js.map +1 -1
  73. package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js +7 -8
  74. package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  75. package/lib-mjs/coreApi/setEditorStyle/ensureUniqueId.js +2 -2
  76. package/lib-mjs/coreApi/setEditorStyle/ensureUniqueId.js.map +1 -1
  77. package/lib-mjs/coreApi/setEditorStyle/setEditorStyle.js +1 -1
  78. package/lib-mjs/coreApi/setEditorStyle/setEditorStyle.js.map +1 -1
  79. package/lib-mjs/corePlugin/cache/areSameSelections.d.ts +0 -4
  80. package/lib-mjs/corePlugin/cache/areSameSelections.js +1 -7
  81. package/lib-mjs/corePlugin/cache/areSameSelections.js.map +1 -1
  82. package/lib-mjs/corePlugin/cache/domIndexerImpl.js +14 -6
  83. package/lib-mjs/corePlugin/cache/domIndexerImpl.js.map +1 -1
  84. package/lib-mjs/corePlugin/lifecycle/LifecyclePlugin.js +1 -0
  85. package/lib-mjs/corePlugin/lifecycle/LifecyclePlugin.js.map +1 -1
  86. package/lib-mjs/corePlugin/selection/SelectionPlugin.js +10 -7
  87. package/lib-mjs/corePlugin/selection/SelectionPlugin.js.map +1 -1
  88. package/lib-mjs/editor/core/DOMHelperImpl.d.ts +4 -0
  89. package/lib-mjs/editor/core/DOMHelperImpl.js +61 -1
  90. package/lib-mjs/editor/core/DOMHelperImpl.js.map +1 -1
  91. package/lib-mjs/editor/core/createEditorCore.js +4 -1
  92. package/lib-mjs/editor/core/createEditorCore.js.map +1 -1
  93. package/lib-mjs/override/containerSizeFormatParser.js +2 -0
  94. package/lib-mjs/override/containerSizeFormatParser.js.map +1 -1
  95. package/lib-mjs/utils/areSameRanges.d.ts +5 -0
  96. package/lib-mjs/utils/areSameRanges.js +9 -0
  97. package/lib-mjs/utils/areSameRanges.js.map +1 -0
  98. package/lib-mjs/utils/createAriaLiveElement.js +0 -1
  99. package/lib-mjs/utils/createAriaLiveElement.js.map +1 -1
  100. package/package.json +3 -3
  101. package/lib/coreApi/setDOMSelection/addRangeToSelection.d.ts +0 -4
  102. package/lib/coreApi/setDOMSelection/addRangeToSelection.js +0 -27
  103. package/lib/coreApi/setDOMSelection/addRangeToSelection.js.map +0 -1
  104. package/lib-amd/coreApi/setDOMSelection/addRangeToSelection.d.ts +0 -4
  105. package/lib-amd/coreApi/setDOMSelection/addRangeToSelection.js +0 -28
  106. package/lib-amd/coreApi/setDOMSelection/addRangeToSelection.js.map +0 -1
  107. package/lib-mjs/coreApi/setDOMSelection/addRangeToSelection.d.ts +0 -4
  108. package/lib-mjs/coreApi/setDOMSelection/addRangeToSelection.js +0 -23
  109. package/lib-mjs/coreApi/setDOMSelection/addRangeToSelection.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"domIndexerImpl.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/cache/domIndexerImpl.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EmptySegmentFormat,\n addCode,\n addLink,\n createParagraph,\n createSelectionMarker,\n createText,\n getObjectKeys,\n isElementOfType,\n isEntityDelimiter,\n isNodeOfType,\n setSelection,\n} from 'roosterjs-content-model-dom';\nimport type {\n CacheSelection,\n ContentModelBlockGroup,\n ContentModelDocument,\n ContentModelEntity,\n ContentModelParagraph,\n ContentModelSegment,\n ContentModelSegmentFormat,\n ContentModelSelectionMarker,\n ContentModelTable,\n ContentModelText,\n DomIndexer,\n DOMSelection,\n RangeSelectionForCache,\n Selectable,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal Export for test only\n */\nexport interface SegmentItem {\n paragraph: ContentModelParagraph;\n segments: ContentModelSegment[];\n}\n\n/**\n * @internal Export for test only\n */\nexport interface TableItem {\n table: ContentModelTable;\n}\n\n/**\n * @internal Export for test only\n */\nexport interface BlockEntityDelimiterItem {\n entity: ContentModelEntity;\n parent: ContentModelBlockGroup;\n}\n\n/**\n * @internal Export for test only\n */\nexport interface IndexedSegmentNode extends Node {\n __roosterjsContentModel: SegmentItem;\n}\n\n/**\n * @internal Export for test only\n */\nexport interface IndexedTableElement extends HTMLTableElement {\n __roosterjsContentModel: TableItem;\n}\n\n/**\n * @internal Export for test only\n */\nexport interface IndexedEntityDelimiter extends Text {\n __roosterjsContentModel: BlockEntityDelimiterItem;\n}\n\n/**\n * Context object used by DomIndexer when reconcile mutations with child list\n */\ninterface ReconcileChildListContext {\n /**\n * Index of segment in current paragraph\n */\n segIndex: number;\n\n /**\n * The current paragraph that we are handling\n */\n paragraph?: ContentModelParagraph;\n\n /**\n * Text node that is added from mutation but has not been handled. This can happen when we first see an added node then later we see a removed one.\n * e.g. Type text in an empty paragraph (&lt;div&gt;&lt;br&gt;&lt;/div&gt;), so a text node will be added and &lt;BR&gt; will be removed.\n * Set to a valid text node means we need to handle it later. If it is finally not handled, that means we need to clear cache\n * Set to undefined (initial value) means no pending text node is hit yet (valid case)\n * Set to null means there was a pending text node which is already handled, so if we see another pending text node,\n * we should clear cache since we don't know how to handle it\n */\n pendingTextNode?: Text | null;\n\n /**\n * Format of the removed segment, this will be used as the format for newly created segment\n */\n format?: ContentModelSegmentFormat;\n}\n\nfunction isIndexedSegment(node: Node): node is IndexedSegmentNode {\n const { paragraph, segments } = (node as IndexedSegmentNode).__roosterjsContentModel ?? {};\n\n return (\n paragraph &&\n paragraph.blockType == 'Paragraph' &&\n Array.isArray(paragraph.segments) &&\n Array.isArray(segments) &&\n segments.every(segment => paragraph.segments.includes(segment))\n );\n}\n\nfunction isIndexedDelimiter(node: Node): node is IndexedEntityDelimiter {\n const { entity, parent } = (node as IndexedEntityDelimiter).__roosterjsContentModel ?? {};\n\n return (\n entity?.blockType == 'Entity' &&\n entity.wrapper &&\n parent?.blockGroupType &&\n Array.isArray(parent.blocks)\n );\n}\n\nfunction getIndexedSegmentItem(node: Node | null): SegmentItem | null {\n return node && isIndexedSegment(node) ? node.__roosterjsContentModel : null;\n}\n\nfunction getIndexedTableItem(element: HTMLTableElement): TableItem | null {\n const index = (element as IndexedTableElement).__roosterjsContentModel;\n const table = index?.table;\n\n if (\n table?.blockType == 'Table' &&\n Array.isArray(table.rows) &&\n table.rows.every(\n x => Array.isArray(x?.cells) && x.cells.every(y => y?.blockGroupType == 'TableCell')\n )\n ) {\n return index;\n } else {\n return null;\n }\n}\n\n// Make a node not indexed. Do not export this function since we should not let code outside here know this detail\nfunction unindex(node: Partial<IndexedSegmentNode>) {\n delete node.__roosterjsContentModel;\n}\n\n/**\n * @internal\n * Implementation of DomIndexer\n */\nexport class DomIndexerImpl implements DomIndexer {\n constructor(private readonly keepSelectionMarkerWhenEnteringTextNode?: boolean) {}\n\n onSegment(segmentNode: Node, paragraph: ContentModelParagraph, segment: ContentModelSegment[]) {\n const indexedText = segmentNode as IndexedSegmentNode;\n indexedText.__roosterjsContentModel = {\n paragraph,\n segments: segment,\n };\n }\n\n onParagraph(paragraphElement: HTMLElement) {\n let previousText: Text | null = null;\n\n for (let child = paragraphElement.firstChild; child; child = child.nextSibling) {\n if (isNodeOfType(child, 'TEXT_NODE')) {\n if (!previousText) {\n previousText = child;\n } else {\n const item = getIndexedSegmentItem(previousText);\n\n if (item && isIndexedSegment(child)) {\n item.segments = item.segments.concat(\n child.__roosterjsContentModel.segments\n );\n child.__roosterjsContentModel.segments = [];\n }\n }\n } else if (isNodeOfType(child, 'ELEMENT_NODE')) {\n previousText = null;\n\n this.onParagraph(child);\n } else {\n previousText = null;\n }\n }\n }\n\n onTable(tableElement: HTMLTableElement, table: ContentModelTable) {\n const indexedTable = tableElement as IndexedTableElement;\n indexedTable.__roosterjsContentModel = { table };\n }\n\n onBlockEntity(entity: ContentModelEntity, group: ContentModelBlockGroup) {\n this.onBlockEntityDelimiter(entity.wrapper.previousSibling, entity, group);\n this.onBlockEntityDelimiter(entity.wrapper.nextSibling, entity, group);\n }\n\n onMergeText(targetText: Text, sourceText: Text) {\n if (isIndexedSegment(targetText) && isIndexedSegment(sourceText)) {\n if (targetText.nextSibling == sourceText) {\n targetText.__roosterjsContentModel.segments.push(\n ...sourceText.__roosterjsContentModel.segments\n );\n\n unindex(sourceText);\n }\n } else {\n unindex(sourceText);\n unindex(targetText);\n }\n }\n\n clearIndex(container: Node) {\n internalClearIndex(container);\n }\n\n reconcileSelection(\n model: ContentModelDocument,\n newSelection: DOMSelection,\n oldSelection?: CacheSelection\n ): boolean {\n let selectionMarker: ContentModelSelectionMarker | undefined;\n if (oldSelection) {\n let startNode: Node | undefined;\n\n if (\n oldSelection.type == 'range' &&\n this.isCollapsed(oldSelection) &&\n (startNode = oldSelection.start.node) &&\n isNodeOfType(startNode, 'TEXT_NODE') &&\n isIndexedSegment(startNode) &&\n startNode.__roosterjsContentModel.segments.length > 0\n ) {\n this.reconcileTextSelection(startNode);\n } else {\n selectionMarker = this.selectionMarkerToKeepWhenEnteringTextNode(\n oldSelection,\n newSelection\n );\n\n setSelection(model);\n }\n }\n\n switch (newSelection.type) {\n case 'image':\n const indexedImage = getIndexedSegmentItem(newSelection.image);\n const image = indexedImage?.segments[0];\n\n if (image) {\n image.isSelected = true;\n setSelection(model, image);\n\n return true;\n } else {\n return false;\n }\n\n case 'table':\n const indexedTable = getIndexedTableItem(newSelection.table);\n\n if (indexedTable) {\n const firstCell =\n indexedTable.table.rows[newSelection.firstRow]?.cells[\n newSelection.firstColumn\n ];\n const lastCell =\n indexedTable.table.rows[newSelection.lastRow]?.cells[\n newSelection.lastColumn\n ];\n\n if (firstCell && lastCell) {\n setSelection(model, firstCell, lastCell);\n\n return true;\n }\n }\n\n return false;\n\n case 'range':\n const newRange = newSelection.range;\n if (newRange) {\n const {\n startContainer,\n startOffset,\n endContainer,\n endOffset,\n collapsed,\n } = newRange;\n\n delete model.hasRevertedRangeSelection;\n\n if (collapsed) {\n return !!this.reconcileNodeSelection(\n startContainer,\n startOffset,\n model.format,\n selectionMarker\n );\n } else if (\n startContainer == endContainer &&\n isNodeOfType(startContainer, 'TEXT_NODE')\n ) {\n if (newSelection.isReverted) {\n model.hasRevertedRangeSelection = true;\n }\n\n return (\n isIndexedSegment(startContainer) &&\n !!this.reconcileTextSelection(\n startContainer,\n startOffset,\n endOffset,\n selectionMarker\n )\n );\n } else {\n const marker1 = this.reconcileNodeSelection(startContainer, startOffset);\n const marker2 = this.reconcileNodeSelection(endContainer, endOffset);\n\n if (marker1 && marker2) {\n if (newSelection.isReverted) {\n model.hasRevertedRangeSelection = true;\n }\n\n setSelection(model, marker1, marker2);\n return true;\n } else {\n return false;\n }\n }\n }\n\n break;\n }\n\n return false;\n }\n\n reconcileChildList(addedNodes: ArrayLike<Node>, removedNodes: ArrayLike<Node>): boolean {\n let canHandle = true;\n const context: ReconcileChildListContext = {\n segIndex: -1,\n };\n\n // First process added nodes\n const addedNode = addedNodes[0];\n\n if (addedNodes.length == 1 && isNodeOfType(addedNode, 'TEXT_NODE')) {\n canHandle = this.reconcileAddedNode(addedNode, context);\n } else if (addedNodes.length > 0) {\n canHandle = false;\n }\n\n // Second, process removed nodes\n const removedNode = removedNodes[0];\n\n if (canHandle && removedNodes.length == 1) {\n canHandle = this.reconcileRemovedNode(removedNode, context);\n } else if (removedNodes.length > 0) {\n canHandle = false;\n }\n\n return canHandle && !context.pendingTextNode;\n }\n\n reconcileElementId(element: HTMLElement) {\n if (isElementOfType(element, 'img')) {\n const indexedImg = getIndexedSegmentItem(element);\n\n if (indexedImg?.segments[0]?.segmentType == 'Image') {\n indexedImg.segments[0].format.id = element.id;\n\n return true;\n } else {\n return false;\n }\n } else if (isElementOfType(element, 'table')) {\n const indexedTable = getIndexedTableItem(element);\n\n if (indexedTable) {\n indexedTable.table.format.id = element.id;\n\n return true;\n } else {\n return false;\n }\n } else {\n return false;\n }\n }\n\n private onBlockEntityDelimiter(\n node: Node | null,\n entity: ContentModelEntity,\n parent: ContentModelBlockGroup\n ) {\n if (isNodeOfType(node, 'ELEMENT_NODE') && isEntityDelimiter(node) && node.firstChild) {\n const indexedDelimiter = node.firstChild as IndexedEntityDelimiter;\n\n indexedDelimiter.__roosterjsContentModel = { entity, parent };\n }\n }\n\n private isCollapsed(selection: RangeSelectionForCache): boolean {\n const { start, end } = selection;\n\n return start.node == end.node && start.offset == end.offset;\n }\n\n private reconcileNodeSelection(\n node: Node,\n offset: number,\n defaultFormat?: ContentModelSegmentFormat,\n selectionMarker?: ContentModelSelectionMarker\n ): Selectable | undefined {\n if (isNodeOfType(node, 'TEXT_NODE')) {\n if (isIndexedSegment(node)) {\n return this.reconcileTextSelection(node, offset, undefined, selectionMarker);\n } else if (isIndexedDelimiter(node)) {\n return this.reconcileDelimiterSelection(node, defaultFormat);\n } else {\n return undefined;\n }\n } else if (offset >= node.childNodes.length) {\n return this.insertMarker(node.lastChild, true /*isAfter*/);\n } else {\n return this.insertMarker(node.childNodes[offset], false /*isAfter*/);\n }\n }\n\n private insertMarker(node: Node | null, isAfter: boolean): Selectable | undefined {\n let marker: ContentModelSelectionMarker | undefined;\n const segmentItem = node && getIndexedSegmentItem(node);\n\n if (segmentItem) {\n const { paragraph, segments } = segmentItem;\n const index = paragraph.segments.indexOf(segments[0]);\n\n if (index >= 0) {\n const formatSegment =\n (!isAfter && paragraph.segments[index - 1]) || paragraph.segments[index];\n marker = createSelectionMarker(formatSegment.format);\n\n paragraph.segments.splice(isAfter ? index + 1 : index, 0, marker);\n }\n }\n\n return marker;\n }\n\n private reconcileTextSelection(\n textNode: IndexedSegmentNode,\n startOffset?: number,\n endOffset?: number,\n selectionMarker?: ContentModelSelectionMarker\n ) {\n const { paragraph, segments } = textNode.__roosterjsContentModel;\n const first = segments[0];\n const last = segments[segments.length - 1];\n let selectable: Selectable | undefined;\n\n if (first?.segmentType == 'Text' && last?.segmentType == 'Text') {\n const newSegments: ContentModelSegment[] = [];\n const txt = textNode.nodeValue || '';\n const textSegments: ContentModelText[] = [];\n\n if (startOffset === undefined) {\n first.text = txt;\n newSegments.push(first);\n textSegments.push(first);\n } else {\n if (startOffset > 0) {\n first.text = txt.substring(0, startOffset);\n newSegments.push(first);\n textSegments.push(first);\n }\n\n if (endOffset === undefined) {\n const marker = createSelectionMarker(selectionMarker?.format ?? first.format);\n newSegments.push(marker);\n\n if (startOffset < (textNode.nodeValue ?? '').length) {\n if (first.link) {\n addLink(marker, first.link);\n }\n\n if (first.code) {\n addCode(marker, first.code);\n }\n }\n\n selectable = marker;\n endOffset = startOffset;\n } else if (endOffset > startOffset) {\n const middle = createText(\n txt.substring(startOffset, endOffset),\n selectionMarker?.format ?? first.format,\n first.link,\n first.code\n );\n\n middle.isSelected = true;\n newSegments.push(middle);\n textSegments.push(middle);\n selectable = middle;\n }\n\n if (endOffset < txt.length) {\n const newLast = createText(\n txt.substring(endOffset),\n selectionMarker?.format ?? first.format,\n first.link,\n first.code\n );\n newSegments.push(newLast);\n textSegments.push(newLast);\n }\n }\n\n let firstIndex = paragraph.segments.indexOf(first);\n let lastIndex = paragraph.segments.indexOf(last);\n\n if (firstIndex >= 0 && lastIndex >= 0) {\n while (\n firstIndex > 0 &&\n paragraph.segments[firstIndex - 1].segmentType == 'SelectionMarker'\n ) {\n firstIndex--;\n }\n\n while (\n lastIndex < paragraph.segments.length - 1 &&\n paragraph.segments[lastIndex + 1].segmentType == 'SelectionMarker'\n ) {\n lastIndex++;\n }\n\n paragraph.segments.splice(firstIndex, lastIndex - firstIndex + 1, ...newSegments);\n }\n\n this.onSegment(textNode, paragraph, textSegments);\n } else if (first?.segmentType == 'Entity' && first == last) {\n const wrapper = first.wrapper;\n const index = paragraph.segments.indexOf(first);\n const delimiter = textNode.parentElement;\n const isBefore = wrapper.previousSibling == delimiter;\n const isAfter = wrapper.nextSibling == delimiter;\n\n if (index >= 0 && delimiter && isEntityDelimiter(delimiter) && (isBefore || isAfter)) {\n const marker = createSelectionMarker(\n selectionMarker?.format ??\n (paragraph.segments[isAfter ? index + 1 : index - 1] ?? first).format\n );\n\n paragraph.segments.splice(isAfter ? index + 1 : index, 0, marker);\n\n selectable = marker;\n }\n }\n\n return selectable;\n }\n\n private reconcileDelimiterSelection(\n node: IndexedEntityDelimiter,\n defaultFormat?: ContentModelSegmentFormat\n ) {\n let marker: ContentModelSelectionMarker | undefined;\n\n const { entity, parent } = node.__roosterjsContentModel;\n const index = parent.blocks.indexOf(entity);\n const delimiter = node.parentElement;\n const wrapper = entity.wrapper;\n const isBefore = wrapper.previousSibling == delimiter;\n const isAfter = wrapper.nextSibling == delimiter;\n\n if (index >= 0 && delimiter && isEntityDelimiter(delimiter) && (isBefore || isAfter)) {\n marker = createSelectionMarker(defaultFormat);\n\n const para = createParagraph(\n true /*isImplicit*/,\n undefined /*blockFormat*/,\n defaultFormat\n );\n\n para.segments.push(marker);\n parent.blocks.splice(isBefore ? index : index + 1, 0, para);\n }\n\n return marker;\n }\n\n private reconcileAddedNode(node: Text, context: ReconcileChildListContext): boolean {\n let segmentItem: SegmentItem | null = null;\n let index = -1;\n let existingSegment: ContentModelSegment;\n const { previousSibling, nextSibling } = node;\n\n if (\n (segmentItem = getIndexedSegmentItem(getLastLeaf(previousSibling))) &&\n (existingSegment = segmentItem.segments[segmentItem.segments.length - 1]) &&\n (index = segmentItem.paragraph.segments.indexOf(existingSegment)) >= 0\n ) {\n // When we can find indexed segment before current one, use it as the insert index\n this.indexNode(segmentItem.paragraph, index + 1, node, existingSegment.format);\n } else if (\n (segmentItem = getIndexedSegmentItem(getFirstLeaf(nextSibling))) &&\n (existingSegment = segmentItem.segments[0]) &&\n (index = segmentItem.paragraph.segments.indexOf(existingSegment)) >= 0\n ) {\n // When we can find indexed segment after current one, use it as the insert index\n this.indexNode(segmentItem.paragraph, index, node, existingSegment.format);\n } else if (context.paragraph && context.segIndex >= 0) {\n // When there is indexed paragraph from removed nodes, we can use it as the insert index\n this.indexNode(context.paragraph, context.segIndex, node, context.format);\n } else if (context.pendingTextNode === undefined) {\n // When we can't find the insert index, set current node as pending node\n // so later we can pick it up when we have enough info when processing removed node\n // Only do this when pendingTextNode is undefined. If it is null it means there was already a pending node before\n // and in that case we should return false since we can't handle two pending text node\n context.pendingTextNode = node;\n } else {\n return false;\n }\n\n return true;\n }\n\n private reconcileRemovedNode(node: Node, context: ReconcileChildListContext): boolean {\n let segmentItem: SegmentItem | null = null;\n let removingSegment: ContentModelSegment;\n\n if (\n context.segIndex < 0 &&\n !context.paragraph && // No previous removed segment or related paragraph found, and\n (segmentItem = getIndexedSegmentItem(node)) && // The removed node is indexed, and\n (removingSegment = segmentItem.segments[0]) // There is at least one related segment\n ) {\n // Now we can remove the indexed segment from the paragraph, and remember it, later we may need to use it\n context.format = removingSegment.format;\n context.paragraph = segmentItem.paragraph;\n context.segIndex = segmentItem.paragraph.segments.indexOf(segmentItem.segments[0]);\n\n if (context.segIndex < 0) {\n // Indexed segment is not under paragraph, something wrong happens, we cannot keep handling\n return false;\n }\n\n for (let i = 0; i < segmentItem.segments.length; i++) {\n const index = segmentItem.paragraph.segments.indexOf(segmentItem.segments[i]);\n\n if (index >= 0) {\n segmentItem.paragraph.segments.splice(index, 1);\n }\n }\n\n if (context.pendingTextNode) {\n // If we have pending text node added but not indexed, do it now\n this.indexNode(\n context.paragraph,\n context.segIndex,\n context.pendingTextNode,\n segmentItem.segments[0].format\n );\n\n // Set to null since we have processed it.\n // Next time we see a pending node we know we have already processed one so it is a situation we cannot handle\n context.pendingTextNode = null;\n }\n\n return true;\n } else {\n return false;\n }\n }\n\n private indexNode(\n paragraph: ContentModelParagraph,\n index: number,\n textNode: Text,\n format?: ContentModelSegmentFormat\n ) {\n const copiedFormat = format ? { ...format } : undefined;\n\n if (copiedFormat) {\n getObjectKeys(copiedFormat).forEach(key => {\n if (EmptySegmentFormat[key] === undefined) {\n delete copiedFormat[key];\n }\n });\n }\n\n const text = createText(textNode.textContent ?? '', copiedFormat);\n\n paragraph.segments.splice(index, 0, text);\n this.onSegment(textNode, paragraph, [text]);\n }\n\n private selectionMarkerToKeepWhenEnteringTextNode(\n oldSelection: CacheSelection,\n newSelection: DOMSelection\n ): ContentModelSelectionMarker | undefined {\n // For CJK keyboard input on mobile, we may have a situation like this:\n // User toggle bold/italic/underline on an empty div, the pending format will be applied on the selection marker\n // then type some text, the selection move to the text node and the selection marker will be recreated during the reconciliation and lose its original formatting\n // In this case, we need to keep the original formatting of the selection marker to match the pending format\n\n if (\n this.keepSelectionMarkerWhenEnteringTextNode &&\n oldSelection.type == 'range' &&\n this.isCollapsed(oldSelection) &&\n newSelection.type == 'range' &&\n isNodeOfType(newSelection.range.commonAncestorContainer, 'TEXT_NODE') &&\n newSelection.range.commonAncestorContainer.parentElement == oldSelection.start.node &&\n isIndexedSegment(newSelection.range.commonAncestorContainer) &&\n newSelection.range.commonAncestorContainer.__roosterjsContentModel.paragraph.segments[0]\n .segmentType == 'SelectionMarker'\n ) {\n return newSelection.range.commonAncestorContainer.__roosterjsContentModel.paragraph\n .segments[0];\n }\n return undefined;\n }\n}\n\nfunction getLastLeaf(node: Node | null): Node | null {\n while (node?.lastChild) {\n node = node.lastChild;\n }\n\n return node;\n}\n\nfunction getFirstLeaf(node: Node | null): Node | null {\n while (node?.firstChild) {\n node = node.firstChild;\n }\n\n return node;\n}\n\nfunction internalClearIndex(container: Node) {\n unindex(container as IndexedSegmentNode);\n\n for (let node = container.firstChild; node; node = node.nextSibling) {\n internalClearIndex(node);\n }\n}\n"]}
1
+ {"version":3,"file":"domIndexerImpl.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/cache/domIndexerImpl.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EmptySegmentFormat,\n addCode,\n addLink,\n createParagraph,\n createSelectionMarker,\n createText,\n getObjectKeys,\n isElementOfType,\n isEntityDelimiter,\n isNodeOfType,\n setSelection,\n} from 'roosterjs-content-model-dom';\nimport type {\n CacheSelection,\n ContentModelBlockGroup,\n ContentModelDocument,\n ContentModelEntity,\n ContentModelParagraph,\n ContentModelSegment,\n ContentModelSegmentFormat,\n ContentModelSelectionMarker,\n ContentModelTable,\n ContentModelText,\n DomIndexer,\n DOMSelection,\n RangeSelectionForCache,\n Selectable,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal Export for test only\n */\nexport interface SegmentItem {\n paragraph: ContentModelParagraph;\n segments: ContentModelSegment[];\n}\n\n/**\n * @internal Export for test only\n */\nexport interface TableItem {\n table: ContentModelTable;\n}\n\n/**\n * @internal Export for test only\n */\nexport interface BlockEntityDelimiterItem {\n entity: ContentModelEntity;\n parent: ContentModelBlockGroup;\n}\n\n/**\n * @internal Export for test only\n */\nexport interface IndexedSegmentNode extends Node {\n __roosterjsContentModel: SegmentItem;\n}\n\n/**\n * @internal Export for test only\n */\nexport interface IndexedTableElement extends HTMLTableElement {\n __roosterjsContentModel: TableItem;\n}\n\n/**\n * @internal Export for test only\n */\nexport interface IndexedEntityDelimiter extends Text {\n __roosterjsContentModel: BlockEntityDelimiterItem;\n}\n\n/**\n * Context object used by DomIndexer when reconcile mutations with child list\n */\ninterface ReconcileChildListContext {\n /**\n * Index of segment in current paragraph\n */\n segIndex: number;\n\n /**\n * The current paragraph that we are handling\n */\n paragraph?: ContentModelParagraph;\n\n /**\n * Text node that is added from mutation but has not been handled. This can happen when we first see an added node then later we see a removed one.\n * e.g. Type text in an empty paragraph (&lt;div&gt;&lt;br&gt;&lt;/div&gt;), so a text node will be added and &lt;BR&gt; will be removed.\n * Set to a valid text node means we need to handle it later. If it is finally not handled, that means we need to clear cache\n * Set to undefined (initial value) means no pending text node is hit yet (valid case)\n * Set to null means there was a pending text node which is already handled, so if we see another pending text node,\n * we should clear cache since we don't know how to handle it\n */\n pendingTextNode?: Text | null;\n\n /**\n * Format of the removed segment, this will be used as the format for newly created segment\n */\n format?: ContentModelSegmentFormat;\n}\n\nfunction isIndexedSegment(node: Node): node is IndexedSegmentNode {\n const { paragraph, segments } = (node as IndexedSegmentNode).__roosterjsContentModel ?? {};\n\n return (\n paragraph &&\n paragraph.blockType == 'Paragraph' &&\n Array.isArray(paragraph.segments) &&\n Array.isArray(segments) &&\n segments.every(segment => paragraph.segments.includes(segment))\n );\n}\n\nfunction isIndexedDelimiter(node: Node): node is IndexedEntityDelimiter {\n const { entity, parent } = (node as IndexedEntityDelimiter).__roosterjsContentModel ?? {};\n\n return (\n entity?.blockType == 'Entity' &&\n entity.wrapper &&\n parent?.blockGroupType &&\n Array.isArray(parent.blocks)\n );\n}\n\nfunction getIndexedSegmentItem(node: Node | null): SegmentItem | null {\n return node && isIndexedSegment(node) ? node.__roosterjsContentModel : null;\n}\n\nfunction getIndexedTableItem(element: HTMLTableElement): TableItem | null {\n const index = (element as IndexedTableElement).__roosterjsContentModel;\n const table = index?.table;\n\n if (\n table?.blockType == 'Table' &&\n Array.isArray(table.rows) &&\n table.rows.every(\n x => Array.isArray(x?.cells) && x.cells.every(y => y?.blockGroupType == 'TableCell')\n )\n ) {\n return index;\n } else {\n return null;\n }\n}\n\n// Make a node not indexed. Do not export this function since we should not let code outside here know this detail\nfunction unindex(node: Partial<IndexedSegmentNode>) {\n delete node.__roosterjsContentModel;\n}\n\n/**\n * @internal\n * Implementation of DomIndexer\n */\nexport class DomIndexerImpl implements DomIndexer {\n constructor(private readonly keepSelectionMarkerWhenEnteringTextNode?: boolean) {}\n\n onSegment(segmentNode: Node, paragraph: ContentModelParagraph, segment: ContentModelSegment[]) {\n const indexedText = segmentNode as IndexedSegmentNode;\n indexedText.__roosterjsContentModel = {\n paragraph,\n segments: segment,\n };\n }\n\n onParagraph(paragraphElement: HTMLElement) {\n let previousText: Text | null = null;\n\n for (let child = paragraphElement.firstChild; child; child = child.nextSibling) {\n if (isNodeOfType(child, 'TEXT_NODE')) {\n if (!previousText) {\n previousText = child;\n } else {\n const item = getIndexedSegmentItem(previousText);\n\n if (item && isIndexedSegment(child)) {\n item.segments = item.segments.concat(\n child.__roosterjsContentModel.segments\n );\n child.__roosterjsContentModel.segments = [];\n }\n }\n } else if (isNodeOfType(child, 'ELEMENT_NODE')) {\n previousText = null;\n\n this.onParagraph(child);\n } else {\n previousText = null;\n }\n }\n }\n\n onTable(tableElement: HTMLTableElement, table: ContentModelTable) {\n const indexedTable = tableElement as IndexedTableElement;\n indexedTable.__roosterjsContentModel = { table };\n }\n\n onBlockEntity(entity: ContentModelEntity, group: ContentModelBlockGroup) {\n this.onBlockEntityDelimiter(entity.wrapper.previousSibling, entity, group);\n this.onBlockEntityDelimiter(entity.wrapper.nextSibling, entity, group);\n }\n\n onMergeText(targetText: Text, sourceText: Text) {\n if (isIndexedSegment(targetText) && isIndexedSegment(sourceText)) {\n if (targetText.nextSibling == sourceText) {\n targetText.__roosterjsContentModel.segments.push(\n ...sourceText.__roosterjsContentModel.segments\n );\n\n unindex(sourceText);\n }\n } else {\n unindex(sourceText);\n unindex(targetText);\n }\n }\n\n clearIndex(container: Node) {\n internalClearIndex(container);\n }\n\n reconcileSelection(\n model: ContentModelDocument,\n newSelection: DOMSelection,\n oldSelection?: CacheSelection\n ): boolean {\n let selectionMarker: ContentModelSelectionMarker | undefined;\n if (oldSelection) {\n let startNode: Node | undefined;\n\n if (\n oldSelection.type == 'range' &&\n this.isCollapsed(oldSelection) &&\n (startNode = oldSelection.start.node) &&\n isNodeOfType(startNode, 'TEXT_NODE') &&\n isIndexedSegment(startNode) &&\n startNode.__roosterjsContentModel.segments.length > 0\n ) {\n this.reconcileTextSelection(startNode);\n } else {\n selectionMarker = this.selectionMarkerToKeepWhenEnteringTextNode(\n oldSelection,\n newSelection\n );\n\n setSelection(model);\n }\n }\n\n switch (newSelection.type) {\n case 'image':\n const indexedImage = getIndexedSegmentItem(newSelection.image);\n const image = indexedImage?.segments[0];\n\n if (image) {\n image.isSelected = true;\n setSelection(model, image);\n\n return true;\n } else {\n return false;\n }\n\n case 'table':\n const indexedTable = getIndexedTableItem(newSelection.table);\n\n if (indexedTable) {\n const firstCell =\n indexedTable.table.rows[newSelection.firstRow]?.cells[\n newSelection.firstColumn\n ];\n const lastCell =\n indexedTable.table.rows[newSelection.lastRow]?.cells[\n newSelection.lastColumn\n ];\n\n if (firstCell && lastCell) {\n setSelection(model, firstCell, lastCell);\n\n return true;\n }\n }\n\n return false;\n\n case 'range':\n const newRange = newSelection.range;\n if (newRange) {\n const {\n startContainer,\n startOffset,\n endContainer,\n endOffset,\n collapsed,\n } = newRange;\n\n delete model.hasRevertedRangeSelection;\n\n if (collapsed) {\n return !!this.reconcileNodeSelection(\n startContainer,\n startOffset,\n model.format,\n selectionMarker\n );\n } else if (\n startContainer == endContainer &&\n isNodeOfType(startContainer, 'TEXT_NODE')\n ) {\n if (newSelection.isReverted) {\n model.hasRevertedRangeSelection = true;\n }\n\n return (\n isIndexedSegment(startContainer) &&\n !!this.reconcileTextSelection(\n startContainer,\n startOffset,\n endOffset,\n selectionMarker\n )\n );\n } else {\n const marker1 = this.reconcileNodeSelection(startContainer, startOffset);\n // Pass marker1 to the second call so its adjacent-marker cleanup\n // does not consume the SelectionMarker we just inserted. Without\n // this guard, when marker1 lands directly next to endContainer's\n // segment in paragraph.segments (e.g. startOffset == startContainer\n // text length), the second splice would absorb marker1 and leave\n // setSelection with a dangling reference. See issue #3341.\n const marker2 = this.reconcileNodeSelection(\n endContainer,\n endOffset,\n undefined,\n undefined,\n marker1\n );\n\n if (marker1 && marker2) {\n if (newSelection.isReverted) {\n model.hasRevertedRangeSelection = true;\n }\n\n setSelection(model, marker1, marker2);\n return true;\n } else {\n return false;\n }\n }\n }\n\n break;\n }\n\n return false;\n }\n\n reconcileChildList(addedNodes: ArrayLike<Node>, removedNodes: ArrayLike<Node>): boolean {\n let canHandle = true;\n const context: ReconcileChildListContext = {\n segIndex: -1,\n };\n\n // First process added nodes\n const addedNode = addedNodes[0];\n\n if (addedNodes.length == 1 && isNodeOfType(addedNode, 'TEXT_NODE')) {\n canHandle = this.reconcileAddedNode(addedNode, context);\n } else if (addedNodes.length > 0) {\n canHandle = false;\n }\n\n // Second, process removed nodes\n const removedNode = removedNodes[0];\n\n if (canHandle && removedNodes.length == 1) {\n canHandle = this.reconcileRemovedNode(removedNode, context);\n } else if (removedNodes.length > 0) {\n canHandle = false;\n }\n\n return canHandle && !context.pendingTextNode;\n }\n\n reconcileElementId(element: HTMLElement) {\n if (isElementOfType(element, 'img')) {\n const indexedImg = getIndexedSegmentItem(element);\n\n if (indexedImg?.segments[0]?.segmentType == 'Image') {\n indexedImg.segments[0].format.id = element.id;\n\n return true;\n } else {\n return false;\n }\n } else if (isElementOfType(element, 'table')) {\n const indexedTable = getIndexedTableItem(element);\n\n if (indexedTable) {\n indexedTable.table.format.id = element.id;\n\n return true;\n } else {\n return false;\n }\n } else {\n return false;\n }\n }\n\n private onBlockEntityDelimiter(\n node: Node | null,\n entity: ContentModelEntity,\n parent: ContentModelBlockGroup\n ) {\n if (isNodeOfType(node, 'ELEMENT_NODE') && isEntityDelimiter(node) && node.firstChild) {\n const indexedDelimiter = node.firstChild as IndexedEntityDelimiter;\n\n indexedDelimiter.__roosterjsContentModel = { entity, parent };\n }\n }\n\n private isCollapsed(selection: RangeSelectionForCache): boolean {\n const { start, end } = selection;\n\n return start.node == end.node && start.offset == end.offset;\n }\n\n private reconcileNodeSelection(\n node: Node,\n offset: number,\n defaultFormat?: ContentModelSegmentFormat,\n selectionMarker?: ContentModelSelectionMarker,\n preserveMarker?: Selectable\n ): Selectable | undefined {\n if (isNodeOfType(node, 'TEXT_NODE')) {\n if (isIndexedSegment(node)) {\n return this.reconcileTextSelection(\n node,\n offset,\n undefined,\n selectionMarker,\n preserveMarker\n );\n } else if (isIndexedDelimiter(node)) {\n return this.reconcileDelimiterSelection(node, defaultFormat);\n } else {\n return undefined;\n }\n } else if (offset >= node.childNodes.length) {\n return this.insertMarker(node.lastChild, true /*isAfter*/);\n } else {\n return this.insertMarker(node.childNodes[offset], false /*isAfter*/);\n }\n }\n\n private insertMarker(node: Node | null, isAfter: boolean): Selectable | undefined {\n let marker: ContentModelSelectionMarker | undefined;\n const segmentItem = node && getIndexedSegmentItem(node);\n\n if (segmentItem) {\n const { paragraph, segments } = segmentItem;\n const index = paragraph.segments.indexOf(segments[0]);\n\n if (index >= 0) {\n const formatSegment =\n (!isAfter && paragraph.segments[index - 1]) || paragraph.segments[index];\n marker = createSelectionMarker(formatSegment.format);\n\n paragraph.segments.splice(isAfter ? index + 1 : index, 0, marker);\n }\n }\n\n return marker;\n }\n\n private reconcileTextSelection(\n textNode: IndexedSegmentNode,\n startOffset?: number,\n endOffset?: number,\n selectionMarker?: ContentModelSelectionMarker,\n preserveMarker?: Selectable\n ) {\n const { paragraph, segments } = textNode.__roosterjsContentModel;\n const first = segments[0];\n const last = segments[segments.length - 1];\n let selectable: Selectable | undefined;\n\n if (first?.segmentType == 'Text' && last?.segmentType == 'Text') {\n const newSegments: ContentModelSegment[] = [];\n const txt = textNode.nodeValue || '';\n const textSegments: ContentModelText[] = [];\n\n if (startOffset === undefined) {\n first.text = txt;\n newSegments.push(first);\n textSegments.push(first);\n } else {\n if (startOffset > 0) {\n first.text = txt.substring(0, startOffset);\n newSegments.push(first);\n textSegments.push(first);\n }\n\n if (endOffset === undefined) {\n const marker = createSelectionMarker(selectionMarker?.format ?? first.format);\n newSegments.push(marker);\n\n if (startOffset < (textNode.nodeValue ?? '').length) {\n if (first.link) {\n addLink(marker, first.link);\n }\n\n if (first.code) {\n addCode(marker, first.code);\n }\n }\n\n selectable = marker;\n endOffset = startOffset;\n } else if (endOffset > startOffset) {\n const middle = createText(\n txt.substring(startOffset, endOffset),\n selectionMarker?.format ?? first.format,\n first.link,\n first.code\n );\n\n middle.isSelected = true;\n newSegments.push(middle);\n textSegments.push(middle);\n selectable = middle;\n }\n\n if (endOffset < txt.length) {\n const newLast = createText(\n txt.substring(endOffset),\n selectionMarker?.format ?? first.format,\n first.link,\n first.code\n );\n newSegments.push(newLast);\n textSegments.push(newLast);\n }\n }\n\n let firstIndex = paragraph.segments.indexOf(first);\n let lastIndex = paragraph.segments.indexOf(last);\n\n if (firstIndex >= 0 && lastIndex >= 0) {\n while (\n firstIndex > 0 &&\n paragraph.segments[firstIndex - 1].segmentType == 'SelectionMarker' &&\n paragraph.segments[firstIndex - 1] !== preserveMarker\n ) {\n firstIndex--;\n }\n\n while (\n lastIndex < paragraph.segments.length - 1 &&\n paragraph.segments[lastIndex + 1].segmentType == 'SelectionMarker' &&\n paragraph.segments[lastIndex + 1] !== preserveMarker\n ) {\n lastIndex++;\n }\n\n paragraph.segments.splice(firstIndex, lastIndex - firstIndex + 1, ...newSegments);\n }\n\n this.onSegment(textNode, paragraph, textSegments);\n } else if (first?.segmentType == 'Entity' && first == last) {\n const wrapper = first.wrapper;\n const index = paragraph.segments.indexOf(first);\n const delimiter = textNode.parentElement;\n const isBefore = wrapper.previousSibling == delimiter;\n const isAfter = wrapper.nextSibling == delimiter;\n\n if (index >= 0 && delimiter && isEntityDelimiter(delimiter) && (isBefore || isAfter)) {\n const marker = createSelectionMarker(\n selectionMarker?.format ??\n (paragraph.segments[isAfter ? index + 1 : index - 1] ?? first).format\n );\n\n paragraph.segments.splice(isAfter ? index + 1 : index, 0, marker);\n\n selectable = marker;\n }\n }\n\n return selectable;\n }\n\n private reconcileDelimiterSelection(\n node: IndexedEntityDelimiter,\n defaultFormat?: ContentModelSegmentFormat\n ) {\n let marker: ContentModelSelectionMarker | undefined;\n\n const { entity, parent } = node.__roosterjsContentModel;\n const index = parent.blocks.indexOf(entity);\n const delimiter = node.parentElement;\n const wrapper = entity.wrapper;\n const isBefore = wrapper.previousSibling == delimiter;\n const isAfter = wrapper.nextSibling == delimiter;\n\n if (index >= 0 && delimiter && isEntityDelimiter(delimiter) && (isBefore || isAfter)) {\n marker = createSelectionMarker(defaultFormat);\n\n const para = createParagraph(\n true /*isImplicit*/,\n undefined /*blockFormat*/,\n defaultFormat\n );\n\n para.segments.push(marker);\n parent.blocks.splice(isBefore ? index : index + 1, 0, para);\n }\n\n return marker;\n }\n\n private reconcileAddedNode(node: Text, context: ReconcileChildListContext): boolean {\n let segmentItem: SegmentItem | null = null;\n let index = -1;\n let existingSegment: ContentModelSegment;\n const { previousSibling, nextSibling } = node;\n\n if (\n (segmentItem = getIndexedSegmentItem(getLastLeaf(previousSibling))) &&\n (existingSegment = segmentItem.segments[segmentItem.segments.length - 1]) &&\n (index = segmentItem.paragraph.segments.indexOf(existingSegment)) >= 0\n ) {\n // When we can find indexed segment before current one, use it as the insert index\n this.indexNode(segmentItem.paragraph, index + 1, node, existingSegment.format);\n } else if (\n (segmentItem = getIndexedSegmentItem(getFirstLeaf(nextSibling))) &&\n (existingSegment = segmentItem.segments[0]) &&\n (index = segmentItem.paragraph.segments.indexOf(existingSegment)) >= 0\n ) {\n // When we can find indexed segment after current one, use it as the insert index\n this.indexNode(segmentItem.paragraph, index, node, existingSegment.format);\n } else if (context.paragraph && context.segIndex >= 0) {\n // When there is indexed paragraph from removed nodes, we can use it as the insert index\n this.indexNode(context.paragraph, context.segIndex, node, context.format);\n } else if (context.pendingTextNode === undefined) {\n // When we can't find the insert index, set current node as pending node\n // so later we can pick it up when we have enough info when processing removed node\n // Only do this when pendingTextNode is undefined. If it is null it means there was already a pending node before\n // and in that case we should return false since we can't handle two pending text node\n context.pendingTextNode = node;\n } else {\n return false;\n }\n\n return true;\n }\n\n private reconcileRemovedNode(node: Node, context: ReconcileChildListContext): boolean {\n let segmentItem: SegmentItem | null = null;\n let removingSegment: ContentModelSegment;\n\n if (\n context.segIndex < 0 &&\n !context.paragraph && // No previous removed segment or related paragraph found, and\n (segmentItem = getIndexedSegmentItem(node)) && // The removed node is indexed, and\n (removingSegment = segmentItem.segments[0]) // There is at least one related segment\n ) {\n // Now we can remove the indexed segment from the paragraph, and remember it, later we may need to use it\n context.format = removingSegment.format;\n context.paragraph = segmentItem.paragraph;\n context.segIndex = segmentItem.paragraph.segments.indexOf(segmentItem.segments[0]);\n\n if (context.segIndex < 0) {\n // Indexed segment is not under paragraph, something wrong happens, we cannot keep handling\n return false;\n }\n\n for (let i = 0; i < segmentItem.segments.length; i++) {\n const index = segmentItem.paragraph.segments.indexOf(segmentItem.segments[i]);\n\n if (index >= 0) {\n segmentItem.paragraph.segments.splice(index, 1);\n }\n }\n\n if (context.pendingTextNode) {\n // If we have pending text node added but not indexed, do it now\n this.indexNode(\n context.paragraph,\n context.segIndex,\n context.pendingTextNode,\n segmentItem.segments[0].format\n );\n\n // Set to null since we have processed it.\n // Next time we see a pending node we know we have already processed one so it is a situation we cannot handle\n context.pendingTextNode = null;\n }\n\n return true;\n } else {\n return false;\n }\n }\n\n private indexNode(\n paragraph: ContentModelParagraph,\n index: number,\n textNode: Text,\n format?: ContentModelSegmentFormat\n ) {\n const copiedFormat = format ? { ...format } : undefined;\n\n if (copiedFormat) {\n getObjectKeys(copiedFormat).forEach(key => {\n if (EmptySegmentFormat[key] === undefined) {\n delete copiedFormat[key];\n }\n });\n }\n\n const text = createText(textNode.textContent ?? '', copiedFormat);\n\n paragraph.segments.splice(index, 0, text);\n this.onSegment(textNode, paragraph, [text]);\n }\n\n private selectionMarkerToKeepWhenEnteringTextNode(\n oldSelection: CacheSelection,\n newSelection: DOMSelection\n ): ContentModelSelectionMarker | undefined {\n // For CJK keyboard input on mobile, we may have a situation like this:\n // User toggle bold/italic/underline on an empty div, the pending format will be applied on the selection marker\n // then type some text, the selection move to the text node and the selection marker will be recreated during the reconciliation and lose its original formatting\n // In this case, we need to keep the original formatting of the selection marker to match the pending format\n\n if (\n this.keepSelectionMarkerWhenEnteringTextNode &&\n oldSelection.type == 'range' &&\n this.isCollapsed(oldSelection) &&\n newSelection.type == 'range' &&\n isNodeOfType(newSelection.range.commonAncestorContainer, 'TEXT_NODE') &&\n newSelection.range.commonAncestorContainer.parentElement == oldSelection.start.node &&\n isIndexedSegment(newSelection.range.commonAncestorContainer) &&\n newSelection.range.commonAncestorContainer.__roosterjsContentModel.paragraph.segments[0]\n .segmentType == 'SelectionMarker'\n ) {\n return newSelection.range.commonAncestorContainer.__roosterjsContentModel.paragraph\n .segments[0];\n }\n return undefined;\n }\n}\n\nfunction getLastLeaf(node: Node | null): Node | null {\n while (node?.lastChild) {\n node = node.lastChild;\n }\n\n return node;\n}\n\nfunction getFirstLeaf(node: Node | null): Node | null {\n while (node?.firstChild) {\n node = node.firstChild;\n }\n\n return node;\n}\n\nfunction internalClearIndex(container: Node) {\n unindex(container as IndexedSegmentNode);\n\n for (let node = container.firstChild; node; node = node.nextSibling) {\n internalClearIndex(node);\n }\n}\n"]}
@@ -69,6 +69,7 @@ var LifecyclePlugin = /** @class */ (function () {
69
69
  delete this.state.rewriteFromModel;
70
70
  // Initialize the Announce container.
71
71
  this.state.announceContainer = (0, createAriaLiveElement_1.createAriaLiveElement)(editor.getDocument());
72
+ editor.getDOMHelper().appendToRoot(this.state.announceContainer);
72
73
  };
73
74
  /**
74
75
  * Dispose this plugin
@@ -1 +1 @@
1
- {"version":3,"file":"LifecyclePlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/lifecycle/LifecyclePlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeSource, getObjectKeys, setColor } from 'roosterjs-content-model-dom';\nimport { createAriaLiveElement } from '../../utils/createAriaLiveElement';\nimport type {\n IEditor,\n LifecyclePluginState,\n PluginEvent,\n PluginWithState,\n EditorOptions,\n RewriteFromModel,\n} from 'roosterjs-content-model-types';\n\nconst ContentEditableAttributeName = 'contenteditable';\nconst DefaultTextColor = '#000000';\nconst DefaultBackColor = '#ffffff';\n\n/**\n * Lifecycle plugin handles editor initialization and disposing\n */\nclass LifecyclePlugin implements PluginWithState<LifecyclePluginState> {\n private editor: IEditor | null = null;\n private state: LifecyclePluginState;\n private initializer: (() => void) | null = null;\n private disposer: (() => void) | null = null;\n private adjustColor: () => void;\n\n /**\n * Construct a new instance of LifecyclePlugin\n * @param options The editor options\n * @param contentDiv The editor content DIV\n */\n constructor(options: EditorOptions, contentDiv: HTMLDivElement) {\n // Make the container editable and set its selection styles\n if (contentDiv.getAttribute(ContentEditableAttributeName) === null) {\n this.initializer = () => {\n contentDiv.contentEditable = 'true';\n contentDiv.style.userSelect = 'text';\n };\n this.disposer = () => {\n contentDiv.style.userSelect = '';\n contentDiv.removeAttribute(ContentEditableAttributeName);\n };\n }\n this.adjustColor = options.doNotAdjustEditorColor\n ? () => {}\n : () => {\n this.adjustContainerColor(contentDiv);\n };\n\n this.state = {\n isDarkMode: !!options.inDarkMode,\n shadowEditFragment: null,\n styleElements: {},\n announcerStringGetter: options.announcerStringGetter,\n };\n }\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'Lifecycle';\n }\n\n /**\n * Initialize this plugin. This should only be called from Editor\n * @param editor Editor instance\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n\n // Set content DIV to be editable\n this.initializer?.();\n\n // Set editor background color for dark mode\n this.adjustColor();\n\n // Let other plugins know that we are ready\n const rewriteFromModel: RewriteFromModel = this.state.rewriteFromModel ?? {\n addedBlockElements: [],\n removedBlockElements: [],\n };\n\n this.editor.triggerEvent('editorReady', rewriteFromModel, true /*broadcast*/);\n delete this.state.rewriteFromModel;\n\n // Initialize the Announce container.\n this.state.announceContainer = createAriaLiveElement(editor.getDocument());\n }\n\n /**\n * Dispose this plugin\n */\n dispose() {\n this.editor?.triggerEvent('beforeDispose', {}, true /*broadcast*/);\n\n getObjectKeys(this.state.styleElements).forEach(key => {\n const element = this.state.styleElements[key];\n\n element.parentElement?.removeChild(element);\n delete this.state.styleElements[key];\n });\n\n const announceContainer = this.state.announceContainer;\n\n if (announceContainer) {\n announceContainer.parentElement?.removeChild(announceContainer);\n delete this.state.announceContainer;\n }\n\n if (this.disposer) {\n this.disposer();\n this.disposer = null;\n this.initializer = null;\n }\n\n this.editor = null;\n }\n\n /**\n * Get plugin state object\n */\n getState() {\n return this.state;\n }\n\n /**\n * Handle events triggered from editor\n * @param event PluginEvent object\n */\n onPluginEvent(event: PluginEvent) {\n if (\n event.eventType == 'contentChanged' &&\n (event.source == ChangeSource.SwitchToDarkMode ||\n event.source == ChangeSource.SwitchToLightMode)\n ) {\n this.adjustColor();\n }\n }\n\n private adjustContainerColor(contentDiv: HTMLElement) {\n if (this.editor) {\n const { isDarkMode } = this.state;\n const darkColorHandler = this.editor.getColorManager();\n\n setColor(\n contentDiv,\n DefaultTextColor,\n false /*isBackground*/,\n isDarkMode,\n darkColorHandler\n );\n setColor(\n contentDiv,\n DefaultBackColor,\n true /*isBackground*/,\n isDarkMode,\n darkColorHandler\n );\n }\n }\n}\n\n/**\n * @internal\n * Create a new instance of LifecyclePlugin.\n * @param option The editor option\n * @param contentDiv The editor content DIV element\n */\nexport function createLifecyclePlugin(\n option: EditorOptions,\n contentDiv: HTMLDivElement\n): PluginWithState<LifecyclePluginState> {\n return new LifecyclePlugin(option, contentDiv);\n}\n"]}
1
+ {"version":3,"file":"LifecyclePlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/lifecycle/LifecyclePlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeSource, getObjectKeys, setColor } from 'roosterjs-content-model-dom';\nimport { createAriaLiveElement } from '../../utils/createAriaLiveElement';\nimport type {\n IEditor,\n LifecyclePluginState,\n PluginEvent,\n PluginWithState,\n EditorOptions,\n RewriteFromModel,\n} from 'roosterjs-content-model-types';\n\nconst ContentEditableAttributeName = 'contenteditable';\nconst DefaultTextColor = '#000000';\nconst DefaultBackColor = '#ffffff';\n\n/**\n * Lifecycle plugin handles editor initialization and disposing\n */\nclass LifecyclePlugin implements PluginWithState<LifecyclePluginState> {\n private editor: IEditor | null = null;\n private state: LifecyclePluginState;\n private initializer: (() => void) | null = null;\n private disposer: (() => void) | null = null;\n private adjustColor: () => void;\n\n /**\n * Construct a new instance of LifecyclePlugin\n * @param options The editor options\n * @param contentDiv The editor content DIV\n */\n constructor(options: EditorOptions, contentDiv: HTMLDivElement) {\n // Make the container editable and set its selection styles\n if (contentDiv.getAttribute(ContentEditableAttributeName) === null) {\n this.initializer = () => {\n contentDiv.contentEditable = 'true';\n contentDiv.style.userSelect = 'text';\n };\n this.disposer = () => {\n contentDiv.style.userSelect = '';\n contentDiv.removeAttribute(ContentEditableAttributeName);\n };\n }\n this.adjustColor = options.doNotAdjustEditorColor\n ? () => {}\n : () => {\n this.adjustContainerColor(contentDiv);\n };\n\n this.state = {\n isDarkMode: !!options.inDarkMode,\n shadowEditFragment: null,\n styleElements: {},\n announcerStringGetter: options.announcerStringGetter,\n };\n }\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'Lifecycle';\n }\n\n /**\n * Initialize this plugin. This should only be called from Editor\n * @param editor Editor instance\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n\n // Set content DIV to be editable\n this.initializer?.();\n\n // Set editor background color for dark mode\n this.adjustColor();\n\n // Let other plugins know that we are ready\n const rewriteFromModel: RewriteFromModel = this.state.rewriteFromModel ?? {\n addedBlockElements: [],\n removedBlockElements: [],\n };\n\n this.editor.triggerEvent('editorReady', rewriteFromModel, true /*broadcast*/);\n delete this.state.rewriteFromModel;\n\n // Initialize the Announce container.\n this.state.announceContainer = createAriaLiveElement(editor.getDocument());\n editor.getDOMHelper().appendToRoot(this.state.announceContainer);\n }\n\n /**\n * Dispose this plugin\n */\n dispose() {\n this.editor?.triggerEvent('beforeDispose', {}, true /*broadcast*/);\n\n getObjectKeys(this.state.styleElements).forEach(key => {\n const element = this.state.styleElements[key];\n\n element.parentElement?.removeChild(element);\n delete this.state.styleElements[key];\n });\n\n const announceContainer = this.state.announceContainer;\n\n if (announceContainer) {\n announceContainer.parentElement?.removeChild(announceContainer);\n delete this.state.announceContainer;\n }\n\n if (this.disposer) {\n this.disposer();\n this.disposer = null;\n this.initializer = null;\n }\n\n this.editor = null;\n }\n\n /**\n * Get plugin state object\n */\n getState() {\n return this.state;\n }\n\n /**\n * Handle events triggered from editor\n * @param event PluginEvent object\n */\n onPluginEvent(event: PluginEvent) {\n if (\n event.eventType == 'contentChanged' &&\n (event.source == ChangeSource.SwitchToDarkMode ||\n event.source == ChangeSource.SwitchToLightMode)\n ) {\n this.adjustColor();\n }\n }\n\n private adjustContainerColor(contentDiv: HTMLElement) {\n if (this.editor) {\n const { isDarkMode } = this.state;\n const darkColorHandler = this.editor.getColorManager();\n\n setColor(\n contentDiv,\n DefaultTextColor,\n false /*isBackground*/,\n isDarkMode,\n darkColorHandler\n );\n setColor(\n contentDiv,\n DefaultBackColor,\n true /*isBackground*/,\n isDarkMode,\n darkColorHandler\n );\n }\n }\n}\n\n/**\n * @internal\n * Create a new instance of LifecyclePlugin.\n * @param option The editor option\n * @param contentDiv The editor content DIV element\n */\nexport function createLifecyclePlugin(\n option: EditorOptions,\n contentDiv: HTMLDivElement\n): PluginWithState<LifecyclePluginState> {\n return new LifecyclePlugin(option, contentDiv);\n}\n"]}
@@ -117,20 +117,23 @@ var SelectionPlugin = /** @class */ (function () {
117
117
  }
118
118
  };
119
119
  this.onSelectionChange = function () {
120
- var _a;
120
+ var _a, _b;
121
121
  if (((_a = _this.editor) === null || _a === void 0 ? void 0 : _a.hasFocus()) && !_this.editor.isInShadowEdit()) {
122
122
  var newSelection = _this.editor.getDOMSelection();
123
+ var domHelper = _this.editor.getDOMHelper();
123
124
  //If am image selection changed to a wider range due a keyboard event, we should update the selection
124
- var selection = _this.editor.getDocument().getSelection();
125
- if (selection && selection.focusNode) {
126
- var image = (0, isSingleImageInSelection_1.isSingleImageInSelection)(selection);
125
+ var range = domHelper.getSelectionRange();
126
+ if (range) {
127
+ var image = (0, isSingleImageInSelection_1.isSingleImageInSelection)(range);
127
128
  if ((newSelection === null || newSelection === void 0 ? void 0 : newSelection.type) == 'image' && !image) {
128
- var range = selection.getRangeAt(0);
129
+ var sel = (_b = _this.editor.getDocument().defaultView) === null || _b === void 0 ? void 0 : _b.getSelection();
130
+ var isReverted = sel
131
+ ? sel.focusNode != range.endContainer || sel.focusOffset != range.endOffset
132
+ : false;
129
133
  _this.editor.setDOMSelection({
130
134
  type: 'range',
131
135
  range: range,
132
- isReverted: selection.focusNode != range.endContainer ||
133
- selection.focusOffset != range.endOffset,
136
+ isReverted: isReverted,
134
137
  });
135
138
  }
136
139
  else if ((newSelection === null || newSelection === void 0 ? void 0 : newSelection.type) !== 'image' && image) {
@@ -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 getDOMInsertPointRect,\n getNodePositionFromEvent,\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(() =>\n this.handleSelectionInTable(key, selection.range)\n );\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 rangeBeforeChange?: Range\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 const textOffset =\n (key == 'ArrowUp' || key == 'ArrowDown') && rangeBeforeChange\n ? this.getTextOffset(\n this.editor,\n rangeBeforeChange,\n td,\n key == 'ArrowUp'\n )\n : null;\n if (textOffset) {\n this.setRangeSelectionInTable(\n textOffset.node,\n textOffset.offset,\n this.editor,\n false /* selectAll */\n );\n } else {\n this.setRangeSelectionInTable(\n td,\n 0,\n this.editor,\n false /* selectAll */\n );\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 getTextOffset(editor: IEditor, range: Range, td: HTMLElement, isKeyUp: boolean) {\n const doc = editor.getDocument();\n const cursorRect = range\n ? getDOMInsertPointRect(doc, {\n node: range.startContainer,\n offset: range.startOffset,\n })\n : undefined;\n const rect = td?.getBoundingClientRect();\n const textOffset =\n cursorRect && rect\n ? getNodePositionFromEvent(\n doc,\n editor.getDOMHelper(),\n cursorRect.left,\n isKeyUp ? rect.top : rect.top + 1\n )\n : null;\n return textOffset;\n }\n\n private setRangeSelectionInTable(\n cell: Node,\n nodeOffset: number,\n editor: IEditor,\n selectAll?: boolean\n ) {\n const doc = editor.getDocument();\n const range = doc.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 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 getDOMInsertPointRect,\n getNodePositionFromEvent,\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(() =>\n this.handleSelectionInTable(key, selection.range)\n );\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 rangeBeforeChange?: Range\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 const textOffset =\n (key == 'ArrowUp' || key == 'ArrowDown') && rangeBeforeChange\n ? this.getTextOffset(\n this.editor,\n rangeBeforeChange,\n td,\n key == 'ArrowUp'\n )\n : null;\n if (textOffset) {\n this.setRangeSelectionInTable(\n textOffset.node,\n textOffset.offset,\n this.editor,\n false /* selectAll */\n );\n } else {\n this.setRangeSelectionInTable(\n td,\n 0,\n this.editor,\n false /* selectAll */\n );\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 getTextOffset(editor: IEditor, range: Range, td: HTMLElement, isKeyUp: boolean) {\n const doc = editor.getDocument();\n const cursorRect = range\n ? getDOMInsertPointRect(doc, {\n node: range.startContainer,\n offset: range.startOffset,\n })\n : undefined;\n const rect = td?.getBoundingClientRect();\n const textOffset =\n cursorRect && rect\n ? getNodePositionFromEvent(\n doc,\n editor.getDOMHelper(),\n cursorRect.left,\n isKeyUp ? rect.top : rect.top + 1\n )\n : null;\n return textOffset;\n }\n\n private setRangeSelectionInTable(\n cell: Node,\n nodeOffset: number,\n editor: IEditor,\n selectAll?: boolean\n ) {\n const doc = editor.getDocument();\n const range = doc.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 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 const domHelper = this.editor.getDOMHelper();\n\n //If am image selection changed to a wider range due a keyboard event, we should update the selection\n const range = domHelper.getSelectionRange();\n if (range) {\n const image = isSingleImageInSelection(range);\n if (newSelection?.type == 'image' && !image) {\n const sel = this.editor.getDocument().defaultView?.getSelection();\n const isReverted = sel\n ? sel.focusNode != range.endContainer || sel.focusOffset != range.endOffset\n : false;\n this.editor.setDOMSelection({\n type: 'range',\n range,\n isReverted,\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"]}
@@ -7,6 +7,10 @@ export interface DOMHelperImplOption {
7
7
  * @deprecated This is always treated as true now
8
8
  */
9
9
  cloneIndependentRoot?: boolean;
10
+ /**
11
+ * When true, enable shadow root detection so the editor works inside a Shadow DOM.
12
+ */
13
+ useShadowDom?: boolean;
10
14
  }
11
15
  /**
12
16
  * @internal Create new instance of DOMHelper