roosterjs-content-model-core 9.51.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 (127) hide show
  1. package/lib/command/createModelFromHtml/convertInlineCss.d.ts +1 -7
  2. package/lib/command/createModelFromHtml/convertInlineCss.js.map +1 -1
  3. package/lib/command/cutCopy/getContentForCopy.js +4 -1
  4. package/lib/command/cutCopy/getContentForCopy.js.map +1 -1
  5. package/lib/command/paste/generatePasteOptionFromPlugins.js +1 -0
  6. package/lib/command/paste/generatePasteOptionFromPlugins.js.map +1 -1
  7. package/lib/command/paste/retrieveHtmlInfo.d.ts +1 -2
  8. package/lib/command/paste/retrieveHtmlInfo.js.map +1 -1
  9. package/lib/coreApi/announce/announce.js +1 -0
  10. package/lib/coreApi/announce/announce.js.map +1 -1
  11. package/lib/coreApi/getDOMSelection/getDOMSelection.js +12 -9
  12. package/lib/coreApi/getDOMSelection/getDOMSelection.js.map +1 -1
  13. package/lib/coreApi/setDOMSelection/setDOMSelection.js +7 -8
  14. package/lib/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  15. package/lib/coreApi/setEditorStyle/ensureUniqueId.js +2 -2
  16. package/lib/coreApi/setEditorStyle/ensureUniqueId.js.map +1 -1
  17. package/lib/coreApi/setEditorStyle/setEditorStyle.js +1 -1
  18. package/lib/coreApi/setEditorStyle/setEditorStyle.js.map +1 -1
  19. package/lib/corePlugin/cache/areSameSelections.d.ts +0 -4
  20. package/lib/corePlugin/cache/areSameSelections.js +3 -10
  21. package/lib/corePlugin/cache/areSameSelections.js.map +1 -1
  22. package/lib/corePlugin/cache/domIndexerImpl.js +14 -6
  23. package/lib/corePlugin/cache/domIndexerImpl.js.map +1 -1
  24. package/lib/corePlugin/lifecycle/LifecyclePlugin.js +1 -0
  25. package/lib/corePlugin/lifecycle/LifecyclePlugin.js.map +1 -1
  26. package/lib/corePlugin/selection/SelectionPlugin.js +10 -7
  27. package/lib/corePlugin/selection/SelectionPlugin.js.map +1 -1
  28. package/lib/editor/core/DOMHelperImpl.d.ts +4 -0
  29. package/lib/editor/core/DOMHelperImpl.js +61 -1
  30. package/lib/editor/core/DOMHelperImpl.js.map +1 -1
  31. package/lib/editor/core/createEditorCore.js +4 -1
  32. package/lib/editor/core/createEditorCore.js.map +1 -1
  33. package/lib/override/containerSizeFormatParser.js +2 -0
  34. package/lib/override/containerSizeFormatParser.js.map +1 -1
  35. package/lib/utils/areSameRanges.d.ts +5 -0
  36. package/lib/utils/areSameRanges.js +13 -0
  37. package/lib/utils/areSameRanges.js.map +1 -0
  38. package/lib/utils/createAriaLiveElement.js +0 -1
  39. package/lib/utils/createAriaLiveElement.js.map +1 -1
  40. package/lib-amd/command/createModelFromHtml/convertInlineCss.d.ts +1 -7
  41. package/lib-amd/command/createModelFromHtml/convertInlineCss.js.map +1 -1
  42. package/lib-amd/command/cutCopy/getContentForCopy.js +4 -1
  43. package/lib-amd/command/cutCopy/getContentForCopy.js.map +1 -1
  44. package/lib-amd/command/paste/generatePasteOptionFromPlugins.js +1 -0
  45. package/lib-amd/command/paste/generatePasteOptionFromPlugins.js.map +1 -1
  46. package/lib-amd/command/paste/retrieveHtmlInfo.d.ts +1 -2
  47. package/lib-amd/command/paste/retrieveHtmlInfo.js.map +1 -1
  48. package/lib-amd/coreApi/announce/announce.js +1 -0
  49. package/lib-amd/coreApi/announce/announce.js.map +1 -1
  50. package/lib-amd/coreApi/getDOMSelection/getDOMSelection.js +12 -9
  51. package/lib-amd/coreApi/getDOMSelection/getDOMSelection.js.map +1 -1
  52. package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js +8 -8
  53. package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  54. package/lib-amd/coreApi/setEditorStyle/ensureUniqueId.js +2 -2
  55. package/lib-amd/coreApi/setEditorStyle/ensureUniqueId.js.map +1 -1
  56. package/lib-amd/coreApi/setEditorStyle/setEditorStyle.js +1 -1
  57. package/lib-amd/coreApi/setEditorStyle/setEditorStyle.js.map +1 -1
  58. package/lib-amd/corePlugin/cache/areSameSelections.d.ts +0 -4
  59. package/lib-amd/corePlugin/cache/areSameSelections.js +3 -11
  60. package/lib-amd/corePlugin/cache/areSameSelections.js.map +1 -1
  61. package/lib-amd/corePlugin/cache/domIndexerImpl.js +14 -6
  62. package/lib-amd/corePlugin/cache/domIndexerImpl.js.map +1 -1
  63. package/lib-amd/corePlugin/lifecycle/LifecyclePlugin.js +1 -0
  64. package/lib-amd/corePlugin/lifecycle/LifecyclePlugin.js.map +1 -1
  65. package/lib-amd/corePlugin/selection/SelectionPlugin.js +10 -7
  66. package/lib-amd/corePlugin/selection/SelectionPlugin.js.map +1 -1
  67. package/lib-amd/editor/core/DOMHelperImpl.d.ts +4 -0
  68. package/lib-amd/editor/core/DOMHelperImpl.js +61 -2
  69. package/lib-amd/editor/core/DOMHelperImpl.js.map +1 -1
  70. package/lib-amd/editor/core/createEditorCore.js +4 -1
  71. package/lib-amd/editor/core/createEditorCore.js.map +1 -1
  72. package/lib-amd/override/containerSizeFormatParser.js +2 -0
  73. package/lib-amd/override/containerSizeFormatParser.js.map +1 -1
  74. package/lib-amd/utils/areSameRanges.d.ts +5 -0
  75. package/lib-amd/utils/areSameRanges.js +15 -0
  76. package/lib-amd/utils/areSameRanges.js.map +1 -0
  77. package/lib-amd/utils/createAriaLiveElement.js +0 -1
  78. package/lib-amd/utils/createAriaLiveElement.js.map +1 -1
  79. package/lib-mjs/command/createModelFromHtml/convertInlineCss.d.ts +1 -7
  80. package/lib-mjs/command/createModelFromHtml/convertInlineCss.js.map +1 -1
  81. package/lib-mjs/command/cutCopy/getContentForCopy.js +5 -2
  82. package/lib-mjs/command/cutCopy/getContentForCopy.js.map +1 -1
  83. package/lib-mjs/command/paste/generatePasteOptionFromPlugins.js +1 -0
  84. package/lib-mjs/command/paste/generatePasteOptionFromPlugins.js.map +1 -1
  85. package/lib-mjs/command/paste/retrieveHtmlInfo.d.ts +1 -2
  86. package/lib-mjs/command/paste/retrieveHtmlInfo.js.map +1 -1
  87. package/lib-mjs/coreApi/announce/announce.js +1 -0
  88. package/lib-mjs/coreApi/announce/announce.js.map +1 -1
  89. package/lib-mjs/coreApi/getDOMSelection/getDOMSelection.js +12 -9
  90. package/lib-mjs/coreApi/getDOMSelection/getDOMSelection.js.map +1 -1
  91. package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js +7 -8
  92. package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  93. package/lib-mjs/coreApi/setEditorStyle/ensureUniqueId.js +2 -2
  94. package/lib-mjs/coreApi/setEditorStyle/ensureUniqueId.js.map +1 -1
  95. package/lib-mjs/coreApi/setEditorStyle/setEditorStyle.js +1 -1
  96. package/lib-mjs/coreApi/setEditorStyle/setEditorStyle.js.map +1 -1
  97. package/lib-mjs/corePlugin/cache/areSameSelections.d.ts +0 -4
  98. package/lib-mjs/corePlugin/cache/areSameSelections.js +1 -7
  99. package/lib-mjs/corePlugin/cache/areSameSelections.js.map +1 -1
  100. package/lib-mjs/corePlugin/cache/domIndexerImpl.js +14 -6
  101. package/lib-mjs/corePlugin/cache/domIndexerImpl.js.map +1 -1
  102. package/lib-mjs/corePlugin/lifecycle/LifecyclePlugin.js +1 -0
  103. package/lib-mjs/corePlugin/lifecycle/LifecyclePlugin.js.map +1 -1
  104. package/lib-mjs/corePlugin/selection/SelectionPlugin.js +10 -7
  105. package/lib-mjs/corePlugin/selection/SelectionPlugin.js.map +1 -1
  106. package/lib-mjs/editor/core/DOMHelperImpl.d.ts +4 -0
  107. package/lib-mjs/editor/core/DOMHelperImpl.js +61 -1
  108. package/lib-mjs/editor/core/DOMHelperImpl.js.map +1 -1
  109. package/lib-mjs/editor/core/createEditorCore.js +4 -1
  110. package/lib-mjs/editor/core/createEditorCore.js.map +1 -1
  111. package/lib-mjs/override/containerSizeFormatParser.js +2 -0
  112. package/lib-mjs/override/containerSizeFormatParser.js.map +1 -1
  113. package/lib-mjs/utils/areSameRanges.d.ts +5 -0
  114. package/lib-mjs/utils/areSameRanges.js +9 -0
  115. package/lib-mjs/utils/areSameRanges.js.map +1 -0
  116. package/lib-mjs/utils/createAriaLiveElement.js +0 -1
  117. package/lib-mjs/utils/createAriaLiveElement.js.map +1 -1
  118. package/package.json +3 -3
  119. package/lib/coreApi/setDOMSelection/addRangeToSelection.d.ts +0 -4
  120. package/lib/coreApi/setDOMSelection/addRangeToSelection.js +0 -27
  121. package/lib/coreApi/setDOMSelection/addRangeToSelection.js.map +0 -1
  122. package/lib-amd/coreApi/setDOMSelection/addRangeToSelection.d.ts +0 -4
  123. package/lib-amd/coreApi/setDOMSelection/addRangeToSelection.js +0 -28
  124. package/lib-amd/coreApi/setDOMSelection/addRangeToSelection.js.map +0 -1
  125. package/lib-mjs/coreApi/setDOMSelection/addRangeToSelection.d.ts +0 -4
  126. package/lib-mjs/coreApi/setDOMSelection/addRangeToSelection.js +0 -23
  127. package/lib-mjs/coreApi/setDOMSelection/addRangeToSelection.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionPlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/selection/SelectionPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { findCoordinate } from './findCoordinate';\nimport { findTableCellElement } from '../../coreApi/setDOMSelection/findTableCellElement';\nimport { isSingleImageInSelection } from './isSingleImageInSelection';\nimport { normalizePos } from './normalizePos';\nimport {\n 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
@@ -1,10 +1,22 @@
1
- define(["require", "exports", "roosterjs-content-model-dom"], function (require, exports, roosterjs_content_model_dom_1) {
1
+ define(["require", "exports", "../../utils/areSameRanges", "roosterjs-content-model-dom"], function (require, exports, areSameRanges_1, roosterjs_content_model_dom_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.createDOMHelper = void 0;
5
+ function isSelectionWithComposedRanges(sel) {
6
+ return 'getComposedRanges' in sel;
7
+ }
8
+ function isShadowRoot(node) {
9
+ return 'host' in node;
10
+ }
5
11
  var DOMHelperImpl = /** @class */ (function () {
6
12
  function DOMHelperImpl(contentDiv, options) {
13
+ var _a;
7
14
  this.contentDiv = contentDiv;
15
+ var rootNode = contentDiv.getRootNode();
16
+ this.shadowRoot = (options === null || options === void 0 ? void 0 : options.useShadowDom) && isShadowRoot(rootNode) ? rootNode : null;
17
+ this.doc = contentDiv.ownerDocument;
18
+ var sel = (_a = this.doc.defaultView) === null || _a === void 0 ? void 0 : _a.getSelection();
19
+ this.useComposedRanges = !!(this.shadowRoot && sel && 'getComposedRanges' in sel);
8
20
  }
9
21
  DOMHelperImpl.prototype.queryElements = function (selector) {
10
22
  return (0, roosterjs_content_model_dom_1.toArray)(this.contentDiv.querySelectorAll(selector));
@@ -66,7 +78,9 @@ define(["require", "exports", "roosterjs-content-model-dom"], function (require,
66
78
  return this.contentDiv;
67
79
  };
68
80
  DOMHelperImpl.prototype.hasFocus = function () {
69
- var activeElement = this.contentDiv.ownerDocument.activeElement;
81
+ var activeElement = this.shadowRoot
82
+ ? this.shadowRoot.activeElement
83
+ : this.doc.activeElement;
70
84
  return !!(activeElement && this.contentDiv.contains(activeElement));
71
85
  };
72
86
  /**
@@ -133,6 +147,51 @@ define(["require", "exports", "roosterjs-content-model-dom"], function (require,
133
147
  DOMHelperImpl.prototype.getRangesByText = function (text, matchCase, wholeWord) {
134
148
  return (0, roosterjs_content_model_dom_1.getRangesByText)(this.contentDiv, text, matchCase, wholeWord, true /*editableOnly*/);
135
149
  };
150
+ DOMHelperImpl.prototype.getSelectionRange = function () {
151
+ var _a;
152
+ var sel = (_a = this.doc.defaultView) === null || _a === void 0 ? void 0 : _a.getSelection();
153
+ if (!sel) {
154
+ return null;
155
+ }
156
+ if (this.useComposedRanges && this.shadowRoot && isSelectionWithComposedRanges(sel)) {
157
+ var staticRanges = sel.getComposedRanges({
158
+ shadowRoots: [this.shadowRoot],
159
+ });
160
+ if ((staticRanges === null || staticRanges === void 0 ? void 0 : staticRanges.length) > 0) {
161
+ var sr = staticRanges[0];
162
+ var range = this.doc.createRange();
163
+ range.setStart(sr.startContainer, sr.startOffset);
164
+ range.setEnd(sr.endContainer, sr.endOffset);
165
+ return range;
166
+ }
167
+ return null;
168
+ }
169
+ return sel.rangeCount > 0 ? sel.getRangeAt(0) : null;
170
+ };
171
+ DOMHelperImpl.prototype.setSelectionRange = function (range, isReverted) {
172
+ var _a;
173
+ if (isReverted === void 0) { isReverted = false; }
174
+ var sel = (_a = this.doc.defaultView) === null || _a === void 0 ? void 0 : _a.getSelection();
175
+ var currentRange = this.getSelectionRange();
176
+ if (!sel || (currentRange && (0, areSameRanges_1.areSameRanges)(range, currentRange))) {
177
+ return;
178
+ }
179
+ var startContainer = range.startContainer, startOffset = range.startOffset, endContainer = range.endContainer, endOffset = range.endOffset;
180
+ if (!isReverted) {
181
+ sel.setBaseAndExtent(startContainer, startOffset, endContainer, endOffset);
182
+ }
183
+ else {
184
+ sel.setBaseAndExtent(endContainer, endOffset, startContainer, startOffset);
185
+ }
186
+ };
187
+ DOMHelperImpl.prototype.appendToRoot = function (element) {
188
+ if (this.shadowRoot) {
189
+ this.shadowRoot.appendChild(element);
190
+ }
191
+ else {
192
+ this.doc.body.appendChild(element);
193
+ }
194
+ };
136
195
  return DOMHelperImpl;
137
196
  }());
138
197
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"DOMHelperImpl.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/editor/core/DOMHelperImpl.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getColor,\n getRangesByText,\n isBlockElement,\n isNodeOfType,\n parseValueWithUnit,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type {\n ContentModelSegmentFormat,\n DarkColorHandler,\n DOMHelper,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport interface DOMHelperImplOption {\n /**\n * @deprecated This is always treated as true now\n */\n cloneIndependentRoot?: boolean;\n}\n\nclass DOMHelperImpl implements DOMHelper {\n constructor(private contentDiv: HTMLElement, options?: DOMHelperImplOption) {}\n\n queryElements(selector: string): HTMLElement[] {\n return toArray(this.contentDiv.querySelectorAll(selector)) as HTMLElement[];\n }\n\n getTextContent(): string {\n return this.contentDiv.textContent || '';\n }\n\n isNodeInEditor(node: Node, excludeRoot?: boolean): boolean {\n return excludeRoot && node == this.contentDiv ? false : this.contentDiv.contains(node);\n }\n\n calculateZoomScale(): number {\n const originalWidth = this.contentDiv.getBoundingClientRect()?.width || 0;\n const visualWidth = this.contentDiv.offsetWidth;\n\n return visualWidth > 0 && originalWidth > 0\n ? Math.round((originalWidth / visualWidth) * 100) / 100\n : 1;\n }\n\n setDomAttribute(name: string, value: string | null) {\n if (value === null) {\n this.contentDiv.removeAttribute(name);\n } else {\n this.contentDiv.setAttribute(name, value);\n }\n }\n\n getDomAttribute(name: string): string | null {\n return this.contentDiv.getAttribute(name);\n }\n\n getDomStyle<T extends keyof CSSStyleDeclaration>(style: T): CSSStyleDeclaration[T] {\n return this.contentDiv.style[style];\n }\n\n findClosestElementAncestor(startFrom: Node, selector?: string): HTMLElement | null {\n const startElement = isNodeOfType(startFrom, 'ELEMENT_NODE')\n ? startFrom\n : startFrom.parentElement;\n const closestElement = selector\n ? (startElement?.closest(selector) as HTMLElement | null)\n : startElement;\n\n return closestElement &&\n this.isNodeInEditor(closestElement) &&\n closestElement != this.contentDiv\n ? closestElement\n : null;\n }\n\n /**\n * Find the closest block element ancestor from the given node within current editing scope\n * @param startFrom The node to start the search from\n * @returns The closest block element ancestor\n */\n findClosestBlockElement(startFrom: Node): HTMLElement {\n let node: Node | null = startFrom;\n\n while (node && this.isNodeInEditor(node)) {\n if (isNodeOfType(node, 'ELEMENT_NODE') && isBlockElement(node)) {\n return node;\n }\n\n node = node.parentElement;\n }\n\n return this.contentDiv;\n }\n\n hasFocus(): boolean {\n const activeElement = this.contentDiv.ownerDocument.activeElement;\n return !!(activeElement && this.contentDiv.contains(activeElement));\n }\n\n /**\n * Check if the root element is in RTL mode\n */\n isRightToLeft(): boolean {\n const contentDiv = this.contentDiv;\n const style = contentDiv.ownerDocument.defaultView?.getComputedStyle(contentDiv);\n\n return style?.direction == 'rtl';\n }\n\n /**\n * Get the width of the editable area of the editor content div\n */\n getClientWidth(): number {\n const contentDiv = this.contentDiv;\n const style = contentDiv.ownerDocument.defaultView?.getComputedStyle(contentDiv);\n const paddingLeft = parseValueWithUnit(style?.paddingLeft);\n const paddingRight = parseValueWithUnit(style?.paddingRight);\n return this.contentDiv.clientWidth - (paddingLeft + paddingRight);\n }\n\n /**\n * Get a deep cloned root element\n */\n getClonedRoot(): HTMLElement {\n const doc = this.contentDiv.ownerDocument.implementation.createHTMLDocument();\n const clone = doc.importNode(this.contentDiv, true /*deep*/);\n\n return clone;\n }\n\n /**\n * Get format of the container element\n * @param isInDarkMode Optional flag to indicate if the environment is in dark mode\n * @param darkColorHandler Optional DarkColorHandler to retrieve dark mode colors\n */\n getContainerFormat(\n isInDarkMode?: boolean,\n darkColorHandler?: DarkColorHandler\n ): ContentModelSegmentFormat {\n const window = this.contentDiv.ownerDocument.defaultView;\n\n const style = window?.getComputedStyle(this.contentDiv);\n\n return style\n ? {\n fontSize: style.fontSize,\n fontFamily: style.fontFamily,\n fontWeight: style.fontWeight,\n textColor: getColor(\n this.contentDiv,\n false /*isBackgroundColor*/,\n !!isInDarkMode,\n darkColorHandler,\n style.color\n ),\n backgroundColor: getColor(\n this.contentDiv,\n true /*isBackgroundColor*/,\n !!isInDarkMode,\n darkColorHandler,\n style.backgroundColor\n ),\n italic: style.fontStyle == 'italic',\n letterSpacing: style.letterSpacing,\n lineHeight: style.lineHeight,\n strikethrough: style.textDecoration?.includes('line-through'),\n superOrSubScriptSequence: style.verticalAlign,\n underline: style.textDecoration?.includes('underline'),\n }\n : {};\n }\n\n /**\n * Get text ranges by searching for a specific text, with options to match case and whole word.\n * This will only search within editable elements.\n * @param text The text to search for\n * @param matchCase Whether to match case\n * @param wholeWord Whether to match whole word\n * @returns An array of Ranges that match the search criteria\n */\n getRangesByText(text: string, matchCase: boolean, wholeWord: boolean): Range[] {\n return getRangesByText(this.contentDiv, text, matchCase, wholeWord, true /*editableOnly*/);\n }\n}\n\n/**\n * @internal Create new instance of DOMHelper\n */\nexport function createDOMHelper(\n contentDiv: HTMLElement,\n options: DOMHelperImplOption = {}\n): DOMHelper {\n return new DOMHelperImpl(contentDiv, options);\n}\n"]}
1
+ {"version":3,"file":"DOMHelperImpl.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/editor/core/DOMHelperImpl.ts"],"names":[],"mappings":"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","sourcesContent":["import { areSameRanges } from '../../utils/areSameRanges';\nimport {\n getColor,\n getRangesByText,\n isBlockElement,\n isNodeOfType,\n parseValueWithUnit,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type {\n ContentModelSegmentFormat,\n DarkColorHandler,\n DOMHelper,\n} from 'roosterjs-content-model-types';\n\ninterface SelectionWithComposedRanges extends Selection {\n getComposedRanges(options: { shadowRoots: ShadowRoot[] }): StaticRange[];\n}\n\nfunction isSelectionWithComposedRanges(sel: Selection): sel is SelectionWithComposedRanges {\n return 'getComposedRanges' in sel;\n}\n\nfunction isShadowRoot(node: Node): node is ShadowRoot {\n return 'host' in node;\n}\n\n/**\n * @internal\n */\nexport interface DOMHelperImplOption {\n /**\n * @deprecated This is always treated as true now\n */\n cloneIndependentRoot?: boolean;\n\n /**\n * When true, enable shadow root detection so the editor works inside a Shadow DOM.\n */\n useShadowDom?: boolean;\n}\n\nclass DOMHelperImpl implements DOMHelper {\n private shadowRoot: ShadowRoot | null;\n private doc: Document;\n private useComposedRanges: boolean;\n\n constructor(private contentDiv: HTMLElement, options?: DOMHelperImplOption) {\n const rootNode = contentDiv.getRootNode();\n this.shadowRoot = options?.useShadowDom && isShadowRoot(rootNode) ? rootNode : null;\n this.doc = contentDiv.ownerDocument;\n\n const sel = this.doc.defaultView?.getSelection();\n this.useComposedRanges = !!(this.shadowRoot && sel && 'getComposedRanges' in sel);\n }\n\n queryElements(selector: string): HTMLElement[] {\n return toArray(this.contentDiv.querySelectorAll(selector)) as HTMLElement[];\n }\n\n getTextContent(): string {\n return this.contentDiv.textContent || '';\n }\n\n isNodeInEditor(node: Node, excludeRoot?: boolean): boolean {\n return excludeRoot && node == this.contentDiv ? false : this.contentDiv.contains(node);\n }\n\n calculateZoomScale(): number {\n const originalWidth = this.contentDiv.getBoundingClientRect()?.width || 0;\n const visualWidth = this.contentDiv.offsetWidth;\n\n return visualWidth > 0 && originalWidth > 0\n ? Math.round((originalWidth / visualWidth) * 100) / 100\n : 1;\n }\n\n setDomAttribute(name: string, value: string | null) {\n if (value === null) {\n this.contentDiv.removeAttribute(name);\n } else {\n this.contentDiv.setAttribute(name, value);\n }\n }\n\n getDomAttribute(name: string): string | null {\n return this.contentDiv.getAttribute(name);\n }\n\n getDomStyle<T extends keyof CSSStyleDeclaration>(style: T): CSSStyleDeclaration[T] {\n return this.contentDiv.style[style];\n }\n\n findClosestElementAncestor(startFrom: Node, selector?: string): HTMLElement | null {\n const startElement = isNodeOfType(startFrom, 'ELEMENT_NODE')\n ? startFrom\n : startFrom.parentElement;\n const closestElement = selector\n ? (startElement?.closest(selector) as HTMLElement | null)\n : startElement;\n\n return closestElement &&\n this.isNodeInEditor(closestElement) &&\n closestElement != this.contentDiv\n ? closestElement\n : null;\n }\n\n /**\n * Find the closest block element ancestor from the given node within current editing scope\n * @param startFrom The node to start the search from\n * @returns The closest block element ancestor\n */\n findClosestBlockElement(startFrom: Node): HTMLElement {\n let node: Node | null = startFrom;\n\n while (node && this.isNodeInEditor(node)) {\n if (isNodeOfType(node, 'ELEMENT_NODE') && isBlockElement(node)) {\n return node;\n }\n\n node = node.parentElement;\n }\n\n return this.contentDiv;\n }\n\n hasFocus(): boolean {\n const activeElement = this.shadowRoot\n ? this.shadowRoot.activeElement\n : this.doc.activeElement;\n return !!(activeElement && this.contentDiv.contains(activeElement));\n }\n\n /**\n * Check if the root element is in RTL mode\n */\n isRightToLeft(): boolean {\n const contentDiv = this.contentDiv;\n const style = contentDiv.ownerDocument.defaultView?.getComputedStyle(contentDiv);\n\n return style?.direction == 'rtl';\n }\n\n /**\n * Get the width of the editable area of the editor content div\n */\n getClientWidth(): number {\n const contentDiv = this.contentDiv;\n const style = contentDiv.ownerDocument.defaultView?.getComputedStyle(contentDiv);\n const paddingLeft = parseValueWithUnit(style?.paddingLeft);\n const paddingRight = parseValueWithUnit(style?.paddingRight);\n return this.contentDiv.clientWidth - (paddingLeft + paddingRight);\n }\n\n /**\n * Get a deep cloned root element\n */\n getClonedRoot(): HTMLElement {\n const doc = this.contentDiv.ownerDocument.implementation.createHTMLDocument();\n const clone = doc.importNode(this.contentDiv, true /*deep*/);\n\n return clone;\n }\n\n /**\n * Get format of the container element\n * @param isInDarkMode Optional flag to indicate if the environment is in dark mode\n * @param darkColorHandler Optional DarkColorHandler to retrieve dark mode colors\n */\n getContainerFormat(\n isInDarkMode?: boolean,\n darkColorHandler?: DarkColorHandler\n ): ContentModelSegmentFormat {\n const window = this.contentDiv.ownerDocument.defaultView;\n\n const style = window?.getComputedStyle(this.contentDiv);\n\n return style\n ? {\n fontSize: style.fontSize,\n fontFamily: style.fontFamily,\n fontWeight: style.fontWeight,\n textColor: getColor(\n this.contentDiv,\n false /*isBackgroundColor*/,\n !!isInDarkMode,\n darkColorHandler,\n style.color\n ),\n backgroundColor: getColor(\n this.contentDiv,\n true /*isBackgroundColor*/,\n !!isInDarkMode,\n darkColorHandler,\n style.backgroundColor\n ),\n italic: style.fontStyle == 'italic',\n letterSpacing: style.letterSpacing,\n lineHeight: style.lineHeight,\n strikethrough: style.textDecoration?.includes('line-through'),\n superOrSubScriptSequence: style.verticalAlign,\n underline: style.textDecoration?.includes('underline'),\n }\n : {};\n }\n\n /**\n * Get text ranges by searching for a specific text, with options to match case and whole word.\n * This will only search within editable elements.\n * @param text The text to search for\n * @param matchCase Whether to match case\n * @param wholeWord Whether to match whole word\n * @returns An array of Ranges that match the search criteria\n */\n getRangesByText(text: string, matchCase: boolean, wholeWord: boolean): Range[] {\n return getRangesByText(this.contentDiv, text, matchCase, wholeWord, true /*editableOnly*/);\n }\n\n getSelectionRange(): Range | null {\n const sel = this.doc.defaultView?.getSelection();\n if (!sel) {\n return null;\n }\n\n if (this.useComposedRanges && this.shadowRoot && isSelectionWithComposedRanges(sel)) {\n const staticRanges = sel.getComposedRanges({\n shadowRoots: [this.shadowRoot],\n });\n\n if (staticRanges?.length > 0) {\n const sr = staticRanges[0];\n const range = this.doc.createRange();\n range.setStart(sr.startContainer, sr.startOffset);\n range.setEnd(sr.endContainer, sr.endOffset);\n return range;\n }\n return null;\n }\n\n return sel.rangeCount > 0 ? sel.getRangeAt(0) : null;\n }\n\n setSelectionRange(range: Range, isReverted: boolean = false): void {\n const sel = this.doc.defaultView?.getSelection();\n const currentRange = this.getSelectionRange();\n if (!sel || (currentRange && areSameRanges(range, currentRange))) {\n return;\n }\n\n const { startContainer, startOffset, endContainer, endOffset } = range;\n if (!isReverted) {\n sel.setBaseAndExtent(startContainer, startOffset, endContainer, endOffset);\n } else {\n sel.setBaseAndExtent(endContainer, endOffset, startContainer, startOffset);\n }\n }\n\n appendToRoot(element: HTMLElement): void {\n if (this.shadowRoot) {\n this.shadowRoot.appendChild(element);\n } else {\n this.doc.body.appendChild(element);\n }\n }\n}\n\n/**\n * @internal Create new instance of DOMHelper\n */\nexport function createDOMHelper(\n contentDiv: HTMLElement,\n options: DOMHelperImplOption = {}\n): DOMHelper {\n return new DOMHelperImpl(contentDiv, options);\n}\n"]}
@@ -24,7 +24,10 @@ define(["require", "exports", "tslib", "../../coreApi/coreApiMap", "./DarkColorH
24
24
  corePlugins.lifecycle,
25
25
  ], false), environment: createEditorEnvironment(contentDiv, options), darkColorHandler: (0, DarkColorHandlerImpl_1.createDarkColorHandler)(contentDiv, (_b = options.getDarkColor) !== null && _b !== void 0 ? _b : getDarkColorFallback, options.knownColors, options.generateColorKey), trustedHTMLHandler: options.trustedHTMLHandler && !(0, domCreator_1.isDOMCreator)(options.trustedHTMLHandler)
26
26
  ? options.trustedHTMLHandler
27
- : (0, domCreator_1.createTrustedHTMLHandler)(domCreator), domCreator: domCreator, domHelper: (0, DOMHelperImpl_1.createDOMHelper)(contentDiv) }, getPluginState(corePlugins)), { disposeErrorHandler: options.disposeErrorHandler, onFixUpModel: options.onFixUpModel, experimentalFeatures: options.experimentalFeatures ? (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(options.experimentalFeatures), false) : [] });
27
+ : (0, domCreator_1.createTrustedHTMLHandler)(domCreator), domCreator: domCreator, domHelper: (0, DOMHelperImpl_1.createDOMHelper)(contentDiv, {
28
+ useShadowDom: !!options.experimentalFeatures &&
29
+ options.experimentalFeatures.indexOf('ShadowDom') >= 0,
30
+ }) }, getPluginState(corePlugins)), { disposeErrorHandler: options.disposeErrorHandler, onFixUpModel: options.onFixUpModel, experimentalFeatures: options.experimentalFeatures ? (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(options.experimentalFeatures), false) : [] });
28
31
  }
29
32
  exports.createEditorCore = createEditorCore;
30
33
  function createEditorEnvironment(contentDiv, options) {
@@ -1 +1 @@
1
- {"version":3,"file":"createEditorCore.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/editor/core/createEditorCore.ts"],"names":[],"mappings":";;;;IAcA;;;;OAIG;IACH,SAAgB,gBAAgB,CAAC,UAA0B,EAAE,OAAsB;;QAC/E,IAAM,WAAW,GAAG,IAAA,iDAAuB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACjE,IAAM,UAAU,GAAG,IAAA,6BAAgB,EAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAEhE,qDACI,YAAY,EAAE,UAAU,EACxB,WAAW,EAAE,UAAU,EACvB,GAAG,kDAAO,uBAAU,GAAK,OAAO,CAAC,eAAe,GAChD,WAAW,4BAAO,uBAAU,GAC5B,OAAO;gBACH,WAAW,CAAC,KAAK;gBACjB,WAAW,CAAC,MAAM;gBAClB,WAAW,CAAC,SAAS;gBACrB,WAAW,CAAC,QAAQ;gBACpB,WAAW,CAAC,SAAS;gBACrB,WAAW,CAAC,MAAM;mCACf,CAAC,MAAA,OAAO,CAAC,OAAO,mCAAI,EAAE,CAAC,CAAC,MAAM,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,CAAC,EAAH,CAAG,CAAC;gBAC3C,WAAW,CAAC,IAAI;gBAChB,WAAW,CAAC,WAAW;gBACvB,WAAW,CAAC,SAAS;uBAEzB,WAAW,EAAE,uBAAuB,CAAC,UAAU,EAAE,OAAO,CAAC,EACzD,gBAAgB,EAAE,IAAA,6CAAsB,EACpC,UAAU,EACV,MAAA,OAAO,CAAC,YAAY,mCAAI,oBAAoB,EAC5C,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,gBAAgB,CAC3B,EACD,kBAAkB,EACd,OAAO,CAAC,kBAAkB,IAAI,CAAC,IAAA,yBAAY,EAAC,OAAO,CAAC,kBAAkB,CAAC;gBACnE,CAAC,CAAC,OAAO,CAAC,kBAAkB;gBAC5B,CAAC,CAAC,IAAA,qCAAwB,EAAC,UAAU,CAAC,EAC9C,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,IAAA,+BAAe,EAAC,UAAU,CAAC,IACnC,cAAc,CAAC,WAAW,CAAC,KAC9B,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,EAChD,YAAY,EAAE,OAAO,CAAC,YAAY,EAClC,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC,oDAAK,OAAO,CAAC,oBAAoB,UAAE,CAAC,CAAC,EAAE,IAC7F;IACN,CAAC;IAvCD,4CAuCC;IAED,SAAS,uBAAuB,CAC5B,UAAuB,EACvB,OAAsB;;QAEtB,IAAM,SAAS,GAAG,MAAA,UAAU,CAAC,aAAa,CAAC,WAAW,0CAAE,SAAS,CAAC;QAClE,IAAM,SAAS,GAAG,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,SAAS,mCAAI,EAAE,CAAC;QAC7C,IAAM,UAAU,GAAG,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,UAAU,mCAAI,EAAE,CAAC;QAE/C,OAAO;YACH,QAAQ,EAAE,UAAU,CAAC,aAAa;YAClC,kBAAkB,EAAE,IAAA,sDAAwB,EAAC,OAAO,CAAC;YACrD,kBAAkB,EAAE,IAAA,sDAAwB,EAAC,OAAO,CAAC;YACrD,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtC,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;YACrC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;YACpC,QAAQ,EACJ,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC;gBACrC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAC/B,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC;YACpC,gBAAgB,EAAE,mBAAmB,CAAC,SAAS,CAAC;SACnD,CAAC;IACN,CAAC;IAED,SAAS,mBAAmB,CAAC,SAAiB;QAC1C,8CAA8C;QAC9C,4DAA4D;QAC5D,6GAA6G;QAC7G,IACI,qVAAqV,CAAC,IAAI,CACtV,SAAS,CACZ;YACD,ykDAAykD,CAAC,IAAI,CAC1kD,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAC5B,EACH;YACE,OAAO,IAAI,CAAC;SACf;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,SAAS,cAAc,CAAC,WAA8B;QAClD,OAAO;YACH,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,EAAE;YACzC,SAAS,EAAE,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE;YAC3C,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE;YACnC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE;YACrC,SAAS,EAAE,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE;YAC3C,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE;YACrC,SAAS,EAAE,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE;YAC3C,WAAW,EAAE,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE;YAC/C,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE;SACpC,CAAC;IACN,CAAC;IAED;;;OAGG;IACH,SAAgB,oBAAoB,CAAC,KAAa;QAC9C,OAAO,KAAK,CAAC;IACjB,CAAC;IAFD,oDAEC","sourcesContent":["import { coreApiMap } from '../../coreApi/coreApiMap';\nimport { createDarkColorHandler } from './DarkColorHandlerImpl';\nimport { createDOMCreator, createTrustedHTMLHandler, isDOMCreator } from '../../utils/domCreator';\nimport { createDOMHelper } from './DOMHelperImpl';\nimport { createDomToModelSettings, createModelToDomSettings } from './createEditorDefaultSettings';\nimport { createEditorCorePlugins } from '../../corePlugin/createEditorCorePlugins';\nimport type {\n EditorEnvironment,\n PluginState,\n EditorCore,\n EditorCorePlugins,\n EditorOptions,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal Create core object for editor\n * @param contentDiv Editor content DIV\n * @param options Editor options\n */\nexport function createEditorCore(contentDiv: HTMLDivElement, options: EditorOptions): EditorCore {\n const corePlugins = createEditorCorePlugins(options, contentDiv);\n const domCreator = createDOMCreator(options.trustedHTMLHandler);\n\n return {\n physicalRoot: contentDiv,\n logicalRoot: contentDiv,\n api: { ...coreApiMap, ...options.coreApiOverride },\n originalApi: { ...coreApiMap },\n plugins: [\n corePlugins.cache,\n corePlugins.format,\n corePlugins.copyPaste,\n corePlugins.domEvent,\n corePlugins.selection,\n corePlugins.entity,\n ...(options.plugins ?? []).filter(x => !!x),\n corePlugins.undo,\n corePlugins.contextMenu,\n corePlugins.lifecycle,\n ],\n environment: createEditorEnvironment(contentDiv, options),\n darkColorHandler: createDarkColorHandler(\n contentDiv,\n options.getDarkColor ?? getDarkColorFallback,\n options.knownColors,\n options.generateColorKey\n ),\n trustedHTMLHandler:\n options.trustedHTMLHandler && !isDOMCreator(options.trustedHTMLHandler)\n ? options.trustedHTMLHandler\n : createTrustedHTMLHandler(domCreator),\n domCreator: domCreator,\n domHelper: createDOMHelper(contentDiv),\n ...getPluginState(corePlugins),\n disposeErrorHandler: options.disposeErrorHandler,\n onFixUpModel: options.onFixUpModel,\n experimentalFeatures: options.experimentalFeatures ? [...options.experimentalFeatures] : [],\n };\n}\n\nfunction createEditorEnvironment(\n contentDiv: HTMLElement,\n options: EditorOptions\n): EditorEnvironment {\n const navigator = contentDiv.ownerDocument.defaultView?.navigator;\n const userAgent = navigator?.userAgent ?? '';\n const appVersion = navigator?.appVersion ?? '';\n\n return {\n document: contentDiv.ownerDocument,\n domToModelSettings: createDomToModelSettings(options),\n modelToDomSettings: createModelToDomSettings(options),\n isMac: appVersion.indexOf('Mac') != -1,\n isAndroid: /android/i.test(userAgent),\n isIOS: /iPad|iPhone/.test(userAgent),\n isSafari:\n userAgent.indexOf('AppleWebKit') >= 0 &&\n userAgent.indexOf('Chrome') < 0 &&\n userAgent.indexOf('Android') < 0,\n isMobileOrTablet: getIsMobileOrTablet(userAgent),\n };\n}\n\nfunction getIsMobileOrTablet(userAgent: string) {\n // Reference: http://detectmobilebrowsers.com/\n // The default regex on the website doesn't consider tablet.\n // To support tablet, add |android|ipad|playbook|silk to the first regex according to the info in /about page\n if (\n /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(\n userAgent\n ) ||\n /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(\n userAgent.substring(0, 4)\n )\n ) {\n return true;\n }\n return false;\n}\n\nfunction getPluginState(corePlugins: EditorCorePlugins): PluginState {\n return {\n domEvent: corePlugins.domEvent.getState(),\n copyPaste: corePlugins.copyPaste.getState(),\n cache: corePlugins.cache.getState(),\n format: corePlugins.format.getState(),\n lifecycle: corePlugins.lifecycle.getState(),\n entity: corePlugins.entity.getState(),\n selection: corePlugins.selection.getState(),\n contextMenu: corePlugins.contextMenu.getState(),\n undo: corePlugins.undo.getState(),\n };\n}\n\n/**\n * @internal Export for test only\n * A fallback function, always return original color\n */\nexport function getDarkColorFallback(color: string) {\n return color;\n}\n"]}
1
+ {"version":3,"file":"createEditorCore.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/editor/core/createEditorCore.ts"],"names":[],"mappings":"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","sourcesContent":["import { coreApiMap } from '../../coreApi/coreApiMap';\nimport { createDarkColorHandler } from './DarkColorHandlerImpl';\nimport { createDOMCreator, createTrustedHTMLHandler, isDOMCreator } from '../../utils/domCreator';\nimport { createDOMHelper } from './DOMHelperImpl';\nimport { createDomToModelSettings, createModelToDomSettings } from './createEditorDefaultSettings';\nimport { createEditorCorePlugins } from '../../corePlugin/createEditorCorePlugins';\nimport type {\n EditorEnvironment,\n PluginState,\n EditorCore,\n EditorCorePlugins,\n EditorOptions,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal Create core object for editor\n * @param contentDiv Editor content DIV\n * @param options Editor options\n */\nexport function createEditorCore(contentDiv: HTMLDivElement, options: EditorOptions): EditorCore {\n const corePlugins = createEditorCorePlugins(options, contentDiv);\n const domCreator = createDOMCreator(options.trustedHTMLHandler);\n\n return {\n physicalRoot: contentDiv,\n logicalRoot: contentDiv,\n api: { ...coreApiMap, ...options.coreApiOverride },\n originalApi: { ...coreApiMap },\n plugins: [\n corePlugins.cache,\n corePlugins.format,\n corePlugins.copyPaste,\n corePlugins.domEvent,\n corePlugins.selection,\n corePlugins.entity,\n ...(options.plugins ?? []).filter(x => !!x),\n corePlugins.undo,\n corePlugins.contextMenu,\n corePlugins.lifecycle,\n ],\n environment: createEditorEnvironment(contentDiv, options),\n darkColorHandler: createDarkColorHandler(\n contentDiv,\n options.getDarkColor ?? getDarkColorFallback,\n options.knownColors,\n options.generateColorKey\n ),\n trustedHTMLHandler:\n options.trustedHTMLHandler && !isDOMCreator(options.trustedHTMLHandler)\n ? options.trustedHTMLHandler\n : createTrustedHTMLHandler(domCreator),\n domCreator: domCreator,\n domHelper: createDOMHelper(contentDiv, {\n useShadowDom:\n !!options.experimentalFeatures &&\n options.experimentalFeatures.indexOf('ShadowDom') >= 0,\n }),\n ...getPluginState(corePlugins),\n disposeErrorHandler: options.disposeErrorHandler,\n onFixUpModel: options.onFixUpModel,\n experimentalFeatures: options.experimentalFeatures ? [...options.experimentalFeatures] : [],\n };\n}\n\nfunction createEditorEnvironment(\n contentDiv: HTMLElement,\n options: EditorOptions\n): EditorEnvironment {\n const navigator = contentDiv.ownerDocument.defaultView?.navigator;\n const userAgent = navigator?.userAgent ?? '';\n const appVersion = navigator?.appVersion ?? '';\n\n return {\n document: contentDiv.ownerDocument,\n domToModelSettings: createDomToModelSettings(options),\n modelToDomSettings: createModelToDomSettings(options),\n isMac: appVersion.indexOf('Mac') != -1,\n isAndroid: /android/i.test(userAgent),\n isIOS: /iPad|iPhone/.test(userAgent),\n isSafari:\n userAgent.indexOf('AppleWebKit') >= 0 &&\n userAgent.indexOf('Chrome') < 0 &&\n userAgent.indexOf('Android') < 0,\n isMobileOrTablet: getIsMobileOrTablet(userAgent),\n };\n}\n\nfunction getIsMobileOrTablet(userAgent: string) {\n // Reference: http://detectmobilebrowsers.com/\n // The default regex on the website doesn't consider tablet.\n // To support tablet, add |android|ipad|playbook|silk to the first regex according to the info in /about page\n if (\n /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(\n userAgent\n ) ||\n /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(\n userAgent.substring(0, 4)\n )\n ) {\n return true;\n }\n return false;\n}\n\nfunction getPluginState(corePlugins: EditorCorePlugins): PluginState {\n return {\n domEvent: corePlugins.domEvent.getState(),\n copyPaste: corePlugins.copyPaste.getState(),\n cache: corePlugins.cache.getState(),\n format: corePlugins.format.getState(),\n lifecycle: corePlugins.lifecycle.getState(),\n entity: corePlugins.entity.getState(),\n selection: corePlugins.selection.getState(),\n contextMenu: corePlugins.contextMenu.getState(),\n undo: corePlugins.undo.getState(),\n };\n}\n\n/**\n * @internal Export for test only\n * A fallback function, always return original color\n */\nexport function getDarkColorFallback(color: string) {\n return color;\n}\n"]}
@@ -10,6 +10,8 @@ define(["require", "exports"], function (require, exports) {
10
10
  if (element.tagName == 'DIV' || element.tagName == 'P') {
11
11
  delete format.width;
12
12
  delete format.height;
13
+ delete format.maxHeight;
14
+ delete format.maxWidth;
13
15
  }
14
16
  };
15
17
  exports.containerSizeFormatParser = containerSizeFormatParser;
@@ -1 +1 @@
1
- {"version":3,"file":"containerSizeFormatParser.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-core/lib/override/containerSizeFormatParser.ts"],"names":[],"mappings":";;;;IAEA;;OAEG;IACI,IAAM,yBAAyB,GAA6B,UAAC,MAAM,EAAE,OAAO;QAC/E,mHAAmH;QACnH,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,IAAI,OAAO,CAAC,OAAO,IAAI,GAAG,EAAE;YACpD,OAAO,MAAM,CAAC,KAAK,CAAC;YACpB,OAAO,MAAM,CAAC,MAAM,CAAC;SACxB;IACL,CAAC,CAAC;IANW,QAAA,yBAAyB,6BAMpC","sourcesContent":["import type { FormatParser, SizeFormat } from 'roosterjs-content-model-types';\n\n/**\n * @internal Do not paste width for Format Containers since it may be generated by browser according to temp div width\n */\nexport const containerSizeFormatParser: FormatParser<SizeFormat> = (format, element) => {\n // For pasted content, there may be existing width generated by browser from the temp DIV. So we need to remove it.\n if (element.tagName == 'DIV' || element.tagName == 'P') {\n delete format.width;\n delete format.height;\n }\n};\n"]}
1
+ {"version":3,"file":"containerSizeFormatParser.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-core/lib/override/containerSizeFormatParser.ts"],"names":[],"mappings":";;;;IAEA;;OAEG;IACI,IAAM,yBAAyB,GAA6B,UAAC,MAAM,EAAE,OAAO;QAC/E,mHAAmH;QACnH,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,IAAI,OAAO,CAAC,OAAO,IAAI,GAAG,EAAE;YACpD,OAAO,MAAM,CAAC,KAAK,CAAC;YACpB,OAAO,MAAM,CAAC,MAAM,CAAC;YACrB,OAAO,MAAM,CAAC,SAAS,CAAC;YACxB,OAAO,MAAM,CAAC,QAAQ,CAAC;SAC1B;IACL,CAAC,CAAC;IARW,QAAA,yBAAyB,6BAQpC","sourcesContent":["import type { FormatParser, SizeFormat } from 'roosterjs-content-model-types';\n\n/**\n * @internal Do not paste width for Format Containers since it may be generated by browser according to temp div width\n */\nexport const containerSizeFormatParser: FormatParser<SizeFormat> = (format, element) => {\n // For pasted content, there may be existing width generated by browser from the temp DIV. So we need to remove it.\n if (element.tagName == 'DIV' || element.tagName == 'P') {\n delete format.width;\n delete format.height;\n delete format.maxHeight;\n delete format.maxWidth;\n }\n};\n"]}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @internal
3
+ * Check if two ranges have the same start and end positions.
4
+ */
5
+ export declare function areSameRanges(r1: Range, r2: Range): boolean;
@@ -0,0 +1,15 @@
1
+ define(["require", "exports"], function (require, exports) {
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.areSameRanges = void 0;
5
+ var RangeKeys = ['startContainer', 'endContainer', 'startOffset', 'endOffset'];
6
+ /**
7
+ * @internal
8
+ * Check if two ranges have the same start and end positions.
9
+ */
10
+ function areSameRanges(r1, r2) {
11
+ return RangeKeys.every(function (k) { return r1[k] == r2[k]; });
12
+ }
13
+ exports.areSameRanges = areSameRanges;
14
+ });
15
+ //# sourceMappingURL=areSameRanges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"areSameRanges.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-core/lib/utils/areSameRanges.ts"],"names":[],"mappings":";;;;IAAA,IAAM,SAAS,GAAoB,CAAC,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;IAElG;;;OAGG;IACH,SAAgB,aAAa,CAAC,EAAS,EAAE,EAAS;QAC9C,OAAO,SAAS,CAAC,KAAK,CAAC,UAAA,CAAC,IAAI,OAAA,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAd,CAAc,CAAC,CAAC;IAChD,CAAC;IAFD,sCAEC","sourcesContent":["const RangeKeys: (keyof Range)[] = ['startContainer', 'endContainer', 'startOffset', 'endOffset'];\n\n/**\n * @internal\n * Check if two ranges have the same start and end positions.\n */\nexport function areSameRanges(r1: Range, r2: Range): boolean {\n return RangeKeys.every(k => r1[k] == r2[k]);\n}\n"]}
@@ -15,7 +15,6 @@ define(["require", "exports"], function (require, exports) {
15
15
  div.style.whiteSpace = 'nowrap';
16
16
  div.style.width = '1px';
17
17
  div.ariaLive = 'assertive';
18
- document.body.appendChild(div);
19
18
  return div;
20
19
  }
21
20
  exports.createAriaLiveElement = createAriaLiveElement;
@@ -1 +1 @@
1
- {"version":3,"file":"createAriaLiveElement.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-core/lib/utils/createAriaLiveElement.ts"],"names":[],"mappings":";;;;IAAA;;OAEG;IACH,SAAgB,qBAAqB,CAAC,QAAkB;QACpD,IAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAE1C,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,0BAA0B,CAAC;QAC5C,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,aAAa,CAAC;QACnC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;QACzB,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC9B,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;QAChC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;QAChC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACxB,GAAG,CAAC,QAAQ,GAAG,WAAW,CAAC;QAE3B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAE/B,OAAO,GAAG,CAAC;IACf,CAAC;IAfD,sDAeC","sourcesContent":["/**\n * @internal\n */\nexport function createAriaLiveElement(document: Document): HTMLDivElement {\n const div = document.createElement('div');\n\n div.style.clip = 'rect(0px, 0px, 0px, 0px)';\n div.style.clipPath = 'inset(100%)';\n div.style.height = '1px';\n div.style.overflow = 'hidden';\n div.style.position = 'absolute';\n div.style.whiteSpace = 'nowrap';\n div.style.width = '1px';\n div.ariaLive = 'assertive';\n\n document.body.appendChild(div);\n\n return div;\n}\n"]}
1
+ {"version":3,"file":"createAriaLiveElement.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-core/lib/utils/createAriaLiveElement.ts"],"names":[],"mappings":";;;;IAAA;;OAEG;IACH,SAAgB,qBAAqB,CAAC,QAAkB;QACpD,IAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAE1C,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,0BAA0B,CAAC;QAC5C,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,aAAa,CAAC;QACnC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;QACzB,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC9B,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;QAChC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;QAChC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACxB,GAAG,CAAC,QAAQ,GAAG,WAAW,CAAC;QAE3B,OAAO,GAAG,CAAC;IACf,CAAC;IAbD,sDAaC","sourcesContent":["/**\n * @internal\n */\nexport function createAriaLiveElement(document: Document): HTMLDivElement {\n const div = document.createElement('div');\n\n div.style.clip = 'rect(0px, 0px, 0px, 0px)';\n div.style.clipPath = 'inset(100%)';\n div.style.height = '1px';\n div.style.overflow = 'hidden';\n div.style.position = 'absolute';\n div.style.whiteSpace = 'nowrap';\n div.style.width = '1px';\n div.ariaLive = 'assertive';\n\n return div;\n}\n"]}
@@ -1,10 +1,4 @@
1
- /**
2
- * @internal
3
- */
4
- export interface CssRule {
5
- selectors: string[];
6
- text: string;
7
- }
1
+ import type { CssRule } from 'roosterjs-content-model-types';
8
2
  /**
9
3
  * @internal
10
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"convertInlineCss.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/createModelFromHtml/convertInlineCss.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAUtD;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,YAAoB;IACxC,IAAM,KAAK,GAAG,cAAc,CAAC;IAC7B,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,IAAI,EAAE,EAAR,CAAQ,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAa;IAC1C,IAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,IAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,MAAM,CAAC,OAAO,CAAC,UAAA,SAAS;;QACpB,IAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAE9B,IAAI,KAAK,EAAE;YACP,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;gBACpE,IAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAiB,CAAC;gBAEvD,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE;oBACtD,MAAM,CAAC,IAAI,CAAC;wBACR,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC;wBAC5C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;qBAC3B,CAAC,CAAC;iBACN;aACJ;SACJ;QAED,MAAA,SAAS,CAAC,UAAU,0CAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAgB,EAAE,QAAmB;4BACzD,CAAC;;QACA,IAAA,KAAsB,QAAQ,CAAC,CAAC,CAAC,EAA/B,SAAS,eAAA,EAAE,IAAI,UAAgB,CAAC;;YAExC,KAAuB,IAAA,6BAAA,SAAA,SAAS,CAAA,CAAA,oCAAA,2DAAE;gBAA7B,IAAM,QAAQ,sBAAA;gBACf,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;oBAC/B,SAAS;iBACZ;gBAED,IAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAEvD,qEAAqE;gBACrE,+EAA+E;gBAC/E,yCAAyC;gBACzC,KAAK,CAAC,OAAO,CAAC,UAAA,IAAI;oBACd,OAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBAArE,CAAqE,CACxE,CAAC;aACL;;;;;;;;;;IAhBL,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAApC,CAAC;KAiBT;AACL,CAAC","sourcesContent":["import { toArray } from 'roosterjs-content-model-dom';\n\n/**\n * @internal\n */\nexport interface CssRule {\n selectors: string[];\n text: string;\n}\n\n/**\n * @internal\n *\n * Splits CSS selectors, avoiding splits within parentheses\n * @param selectorText The CSS selector string\n * @return Array of trimmed selectors\n */\nfunction splitSelectors(selectorText: string) {\n const regex = /(?![^(]*\\)),/;\n return selectorText.split(regex).map(s => s.trim());\n}\n\n/**\n * @internal\n */\nexport function retrieveCssRules(doc: Document): CssRule[] {\n const styles = toArray(doc.querySelectorAll('style'));\n const result: CssRule[] = [];\n\n styles.forEach(styleNode => {\n const sheet = styleNode.sheet;\n\n if (sheet) {\n for (let ruleIndex = 0; ruleIndex < sheet.cssRules.length; ruleIndex++) {\n const rule = sheet.cssRules[ruleIndex] as CSSStyleRule;\n\n if (rule.type == CSSRule.STYLE_RULE && rule.selectorText) {\n result.push({\n selectors: splitSelectors(rule.selectorText),\n text: rule.style.cssText,\n });\n }\n }\n }\n\n styleNode.parentNode?.removeChild(styleNode);\n });\n\n return result;\n}\n\n/**\n * @internal\n */\nexport function convertInlineCss(root: ParentNode, cssRules: CssRule[]) {\n for (let i = cssRules.length - 1; i >= 0; i--) {\n const { selectors, text } = cssRules[i];\n\n for (const selector of selectors) {\n if (!selector || !selector.trim()) {\n continue;\n }\n\n const nodes = toArray(root.querySelectorAll(selector));\n\n // Always put existing styles after so that they have higher priority\n // Which means if both global style and inline style apply to the same element,\n // inline style will have higher priority\n nodes.forEach(node =>\n node.setAttribute('style', text + (node.getAttribute('style') || ''))\n );\n }\n }\n}\n"]}
1
+ {"version":3,"file":"convertInlineCss.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/createModelFromHtml/convertInlineCss.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAGtD;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,YAAoB;IACxC,IAAM,KAAK,GAAG,cAAc,CAAC;IAC7B,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,IAAI,EAAE,EAAR,CAAQ,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAa;IAC1C,IAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,IAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,MAAM,CAAC,OAAO,CAAC,UAAA,SAAS;;QACpB,IAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAE9B,IAAI,KAAK,EAAE;YACP,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;gBACpE,IAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAiB,CAAC;gBAEvD,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE;oBACtD,MAAM,CAAC,IAAI,CAAC;wBACR,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC;wBAC5C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;qBAC3B,CAAC,CAAC;iBACN;aACJ;SACJ;QAED,MAAA,SAAS,CAAC,UAAU,0CAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAgB,EAAE,QAAmB;4BACzD,CAAC;;QACA,IAAA,KAAsB,QAAQ,CAAC,CAAC,CAAC,EAA/B,SAAS,eAAA,EAAE,IAAI,UAAgB,CAAC;;YAExC,KAAuB,IAAA,6BAAA,SAAA,SAAS,CAAA,CAAA,oCAAA,2DAAE;gBAA7B,IAAM,QAAQ,sBAAA;gBACf,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;oBAC/B,SAAS;iBACZ;gBAED,IAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAEvD,qEAAqE;gBACrE,+EAA+E;gBAC/E,yCAAyC;gBACzC,KAAK,CAAC,OAAO,CAAC,UAAA,IAAI;oBACd,OAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBAArE,CAAqE,CACxE,CAAC;aACL;;;;;;;;;;IAhBL,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAApC,CAAC;KAiBT;AACL,CAAC","sourcesContent":["import { toArray } from 'roosterjs-content-model-dom';\nimport type { CssRule } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n *\n * Splits CSS selectors, avoiding splits within parentheses\n * @param selectorText The CSS selector string\n * @return Array of trimmed selectors\n */\nfunction splitSelectors(selectorText: string) {\n const regex = /(?![^(]*\\)),/;\n return selectorText.split(regex).map(s => s.trim());\n}\n\n/**\n * @internal\n */\nexport function retrieveCssRules(doc: Document): CssRule[] {\n const styles = toArray(doc.querySelectorAll('style'));\n const result: CssRule[] = [];\n\n styles.forEach(styleNode => {\n const sheet = styleNode.sheet;\n\n if (sheet) {\n for (let ruleIndex = 0; ruleIndex < sheet.cssRules.length; ruleIndex++) {\n const rule = sheet.cssRules[ruleIndex] as CSSStyleRule;\n\n if (rule.type == CSSRule.STYLE_RULE && rule.selectorText) {\n result.push({\n selectors: splitSelectors(rule.selectorText),\n text: rule.style.cssText,\n });\n }\n }\n }\n\n styleNode.parentNode?.removeChild(styleNode);\n });\n\n return result;\n}\n\n/**\n * @internal\n */\nexport function convertInlineCss(root: ParentNode, cssRules: CssRule[]) {\n for (let i = cssRules.length - 1; i >= 0; i--) {\n const { selectors, text } = cssRules[i];\n\n for (const selector of selectors) {\n if (!selector || !selector.trim()) {\n continue;\n }\n\n const nodes = toArray(root.querySelectorAll(selector));\n\n // Always put existing styles after so that they have higher priority\n // Which means if both global style and inline style apply to the same element,\n // inline style will have higher priority\n nodes.forEach(node =>\n node.setAttribute('style', text + (node.getAttribute('style') || ''))\n );\n }\n }\n}\n"]}