roosterjs-content-model-core 0.24.0 → 0.25.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 (211) hide show
  1. package/lib/coreApi/addUndoSnapshot.js +6 -4
  2. package/lib/coreApi/addUndoSnapshot.js.map +1 -1
  3. package/lib/coreApi/createContentModel.js +10 -9
  4. package/lib/coreApi/createContentModel.js.map +1 -1
  5. package/lib/coreApi/createEditorContext.js +4 -12
  6. package/lib/coreApi/createEditorContext.js.map +1 -1
  7. package/lib/coreApi/formatContentModel.js.map +1 -1
  8. package/lib/coreApi/getDOMSelection.js +19 -4
  9. package/lib/coreApi/getDOMSelection.js.map +1 -1
  10. package/lib/coreApi/paste.js +15 -23
  11. package/lib/coreApi/paste.js.map +1 -1
  12. package/lib/coreApi/setContentModel.js +7 -3
  13. package/lib/coreApi/setContentModel.js.map +1 -1
  14. package/lib/coreApi/setDOMSelection.js +1 -1
  15. package/lib/coreApi/setDOMSelection.js.map +1 -1
  16. package/lib/coreApi/switchShadowEdit.js +0 -3
  17. package/lib/coreApi/switchShadowEdit.js.map +1 -1
  18. package/lib/corePlugin/ContentModelCachePlugin.d.ts +2 -1
  19. package/lib/corePlugin/ContentModelCachePlugin.js +36 -48
  20. package/lib/corePlugin/ContentModelCachePlugin.js.map +1 -1
  21. package/lib/corePlugin/ContentModelCopyPastePlugin.js +4 -19
  22. package/lib/corePlugin/ContentModelCopyPastePlugin.js.map +1 -1
  23. package/lib/corePlugin/ContentModelFormatPlugin.js +0 -1
  24. package/lib/corePlugin/ContentModelFormatPlugin.js.map +1 -1
  25. package/lib/corePlugin/ContextMenuPlugin.d.ts +6 -0
  26. package/lib/corePlugin/ContextMenuPlugin.js +112 -0
  27. package/lib/corePlugin/ContextMenuPlugin.js.map +1 -0
  28. package/lib/corePlugin/EntityPlugin.js +5 -2
  29. package/lib/corePlugin/EntityPlugin.js.map +1 -1
  30. package/lib/corePlugin/LifecyclePlugin.js +0 -14
  31. package/lib/corePlugin/LifecyclePlugin.js.map +1 -1
  32. package/lib/corePlugin/SelectionPlugin.js +19 -23
  33. package/lib/corePlugin/SelectionPlugin.js.map +1 -1
  34. package/lib/corePlugin/createStandaloneEditorCorePlugins.js +3 -1
  35. package/lib/corePlugin/createStandaloneEditorCorePlugins.js.map +1 -1
  36. package/lib/corePlugin/utils/addRangeToSelection.d.ts +1 -1
  37. package/lib/corePlugin/utils/addRangeToSelection.js +8 -2
  38. package/lib/corePlugin/utils/addRangeToSelection.js.map +1 -1
  39. package/lib/corePlugin/utils/applyDefaultFormat.js +1 -1
  40. package/lib/corePlugin/utils/applyDefaultFormat.js.map +1 -1
  41. package/lib/corePlugin/utils/textMutationObserver.d.ts +5 -0
  42. package/lib/corePlugin/utils/textMutationObserver.js +43 -0
  43. package/lib/corePlugin/utils/textMutationObserver.js.map +1 -0
  44. package/lib/editor/DOMHelperImpl.d.ts +5 -0
  45. package/lib/editor/DOMHelperImpl.js +32 -0
  46. package/lib/editor/DOMHelperImpl.js.map +1 -0
  47. package/lib/editor/StandaloneEditor.d.ts +17 -30
  48. package/lib/editor/StandaloneEditor.js +54 -50
  49. package/lib/editor/StandaloneEditor.js.map +1 -1
  50. package/lib/editor/createStandaloneEditorCore.js +5 -2
  51. package/lib/editor/createStandaloneEditorCore.js.map +1 -1
  52. package/lib/override/reducedModelChildProcessor.d.ts +21 -0
  53. package/lib/override/reducedModelChildProcessor.js +66 -0
  54. package/lib/override/reducedModelChildProcessor.js.map +1 -0
  55. package/lib/publicApi/domUtils/borderValues.js +1 -1
  56. package/lib/publicApi/domUtils/borderValues.js.map +1 -1
  57. package/lib/publicApi/selection/deleteBlock.js +3 -0
  58. package/lib/publicApi/selection/deleteBlock.js.map +1 -1
  59. package/lib/publicApi/selection/deleteSegment.js +3 -2
  60. package/lib/publicApi/selection/deleteSegment.js.map +1 -1
  61. package/lib/publicApi/selection/iterateSelections.js +0 -2
  62. package/lib/publicApi/selection/iterateSelections.js.map +1 -1
  63. package/lib/utils/createSnapshotSelection.d.ts +2 -2
  64. package/lib/utils/createSnapshotSelection.js +77 -1
  65. package/lib/utils/createSnapshotSelection.js.map +1 -1
  66. package/lib/utils/paste/mergePasteContent.d.ts +2 -2
  67. package/lib/utils/paste/mergePasteContent.js +37 -27
  68. package/lib/utils/paste/mergePasteContent.js.map +1 -1
  69. package/lib/utils/restoreSnapshotSelection.js +1 -0
  70. package/lib/utils/restoreSnapshotSelection.js.map +1 -1
  71. package/lib-amd/coreApi/addUndoSnapshot.js +6 -4
  72. package/lib-amd/coreApi/addUndoSnapshot.js.map +1 -1
  73. package/lib-amd/coreApi/createContentModel.js +10 -9
  74. package/lib-amd/coreApi/createContentModel.js.map +1 -1
  75. package/lib-amd/coreApi/createEditorContext.js +4 -12
  76. package/lib-amd/coreApi/createEditorContext.js.map +1 -1
  77. package/lib-amd/coreApi/formatContentModel.js.map +1 -1
  78. package/lib-amd/coreApi/getDOMSelection.js +19 -4
  79. package/lib-amd/coreApi/getDOMSelection.js.map +1 -1
  80. package/lib-amd/coreApi/paste.js +16 -23
  81. package/lib-amd/coreApi/paste.js.map +1 -1
  82. package/lib-amd/coreApi/setContentModel.js +7 -3
  83. package/lib-amd/coreApi/setContentModel.js.map +1 -1
  84. package/lib-amd/coreApi/setDOMSelection.js +1 -1
  85. package/lib-amd/coreApi/setDOMSelection.js.map +1 -1
  86. package/lib-amd/coreApi/switchShadowEdit.js +0 -3
  87. package/lib-amd/coreApi/switchShadowEdit.js.map +1 -1
  88. package/lib-amd/corePlugin/ContentModelCachePlugin.d.ts +2 -1
  89. package/lib-amd/corePlugin/ContentModelCachePlugin.js +36 -48
  90. package/lib-amd/corePlugin/ContentModelCachePlugin.js.map +1 -1
  91. package/lib-amd/corePlugin/ContentModelCopyPastePlugin.js +5 -18
  92. package/lib-amd/corePlugin/ContentModelCopyPastePlugin.js.map +1 -1
  93. package/lib-amd/corePlugin/ContentModelFormatPlugin.js +0 -1
  94. package/lib-amd/corePlugin/ContentModelFormatPlugin.js.map +1 -1
  95. package/lib-amd/corePlugin/ContextMenuPlugin.d.ts +6 -0
  96. package/lib-amd/corePlugin/ContextMenuPlugin.js +112 -0
  97. package/lib-amd/corePlugin/ContextMenuPlugin.js.map +1 -0
  98. package/lib-amd/corePlugin/EntityPlugin.js +5 -2
  99. package/lib-amd/corePlugin/EntityPlugin.js.map +1 -1
  100. package/lib-amd/corePlugin/LifecyclePlugin.js +0 -14
  101. package/lib-amd/corePlugin/LifecyclePlugin.js.map +1 -1
  102. package/lib-amd/corePlugin/SelectionPlugin.js +19 -23
  103. package/lib-amd/corePlugin/SelectionPlugin.js.map +1 -1
  104. package/lib-amd/corePlugin/createStandaloneEditorCorePlugins.js +3 -2
  105. package/lib-amd/corePlugin/createStandaloneEditorCorePlugins.js.map +1 -1
  106. package/lib-amd/corePlugin/utils/addRangeToSelection.d.ts +1 -1
  107. package/lib-amd/corePlugin/utils/addRangeToSelection.js +8 -2
  108. package/lib-amd/corePlugin/utils/addRangeToSelection.js.map +1 -1
  109. package/lib-amd/corePlugin/utils/applyDefaultFormat.js +1 -1
  110. package/lib-amd/corePlugin/utils/applyDefaultFormat.js.map +1 -1
  111. package/lib-amd/corePlugin/utils/textMutationObserver.d.ts +5 -0
  112. package/lib-amd/corePlugin/utils/textMutationObserver.js +45 -0
  113. package/lib-amd/corePlugin/utils/textMutationObserver.js.map +1 -0
  114. package/lib-amd/editor/DOMHelperImpl.d.ts +5 -0
  115. package/lib-amd/editor/DOMHelperImpl.js +33 -0
  116. package/lib-amd/editor/DOMHelperImpl.js.map +1 -0
  117. package/lib-amd/editor/StandaloneEditor.d.ts +17 -30
  118. package/lib-amd/editor/StandaloneEditor.js +52 -51
  119. package/lib-amd/editor/StandaloneEditor.js.map +1 -1
  120. package/lib-amd/editor/createStandaloneEditorCore.js +5 -3
  121. package/lib-amd/editor/createStandaloneEditorCore.js.map +1 -1
  122. package/lib-amd/override/reducedModelChildProcessor.d.ts +21 -0
  123. package/lib-amd/override/reducedModelChildProcessor.js +65 -0
  124. package/lib-amd/override/reducedModelChildProcessor.js.map +1 -0
  125. package/lib-amd/publicApi/domUtils/borderValues.js +1 -1
  126. package/lib-amd/publicApi/domUtils/borderValues.js.map +1 -1
  127. package/lib-amd/publicApi/selection/deleteBlock.js +3 -0
  128. package/lib-amd/publicApi/selection/deleteBlock.js.map +1 -1
  129. package/lib-amd/publicApi/selection/deleteSegment.js +3 -2
  130. package/lib-amd/publicApi/selection/deleteSegment.js.map +1 -1
  131. package/lib-amd/publicApi/selection/iterateSelections.js +0 -2
  132. package/lib-amd/publicApi/selection/iterateSelections.js.map +1 -1
  133. package/lib-amd/utils/createSnapshotSelection.d.ts +2 -2
  134. package/lib-amd/utils/createSnapshotSelection.js +77 -1
  135. package/lib-amd/utils/createSnapshotSelection.js.map +1 -1
  136. package/lib-amd/utils/paste/mergePasteContent.d.ts +2 -2
  137. package/lib-amd/utils/paste/mergePasteContent.js +37 -28
  138. package/lib-amd/utils/paste/mergePasteContent.js.map +1 -1
  139. package/lib-amd/utils/restoreSnapshotSelection.js +1 -0
  140. package/lib-amd/utils/restoreSnapshotSelection.js.map +1 -1
  141. package/lib-mjs/coreApi/addUndoSnapshot.js +6 -4
  142. package/lib-mjs/coreApi/addUndoSnapshot.js.map +1 -1
  143. package/lib-mjs/coreApi/createContentModel.js +10 -9
  144. package/lib-mjs/coreApi/createContentModel.js.map +1 -1
  145. package/lib-mjs/coreApi/createEditorContext.js +4 -12
  146. package/lib-mjs/coreApi/createEditorContext.js.map +1 -1
  147. package/lib-mjs/coreApi/formatContentModel.js.map +1 -1
  148. package/lib-mjs/coreApi/getDOMSelection.js +19 -4
  149. package/lib-mjs/coreApi/getDOMSelection.js.map +1 -1
  150. package/lib-mjs/coreApi/paste.js +15 -23
  151. package/lib-mjs/coreApi/paste.js.map +1 -1
  152. package/lib-mjs/coreApi/setContentModel.js +7 -3
  153. package/lib-mjs/coreApi/setContentModel.js.map +1 -1
  154. package/lib-mjs/coreApi/setDOMSelection.js +1 -1
  155. package/lib-mjs/coreApi/setDOMSelection.js.map +1 -1
  156. package/lib-mjs/coreApi/switchShadowEdit.js +0 -3
  157. package/lib-mjs/coreApi/switchShadowEdit.js.map +1 -1
  158. package/lib-mjs/corePlugin/ContentModelCachePlugin.d.ts +2 -1
  159. package/lib-mjs/corePlugin/ContentModelCachePlugin.js +36 -48
  160. package/lib-mjs/corePlugin/ContentModelCachePlugin.js.map +1 -1
  161. package/lib-mjs/corePlugin/ContentModelCopyPastePlugin.js +4 -19
  162. package/lib-mjs/corePlugin/ContentModelCopyPastePlugin.js.map +1 -1
  163. package/lib-mjs/corePlugin/ContentModelFormatPlugin.js +0 -1
  164. package/lib-mjs/corePlugin/ContentModelFormatPlugin.js.map +1 -1
  165. package/lib-mjs/corePlugin/ContextMenuPlugin.d.ts +6 -0
  166. package/lib-mjs/corePlugin/ContextMenuPlugin.js +108 -0
  167. package/lib-mjs/corePlugin/ContextMenuPlugin.js.map +1 -0
  168. package/lib-mjs/corePlugin/EntityPlugin.js +5 -2
  169. package/lib-mjs/corePlugin/EntityPlugin.js.map +1 -1
  170. package/lib-mjs/corePlugin/LifecyclePlugin.js +1 -15
  171. package/lib-mjs/corePlugin/LifecyclePlugin.js.map +1 -1
  172. package/lib-mjs/corePlugin/SelectionPlugin.js +19 -23
  173. package/lib-mjs/corePlugin/SelectionPlugin.js.map +1 -1
  174. package/lib-mjs/corePlugin/createStandaloneEditorCorePlugins.js +3 -1
  175. package/lib-mjs/corePlugin/createStandaloneEditorCorePlugins.js.map +1 -1
  176. package/lib-mjs/corePlugin/utils/addRangeToSelection.d.ts +1 -1
  177. package/lib-mjs/corePlugin/utils/addRangeToSelection.js +8 -2
  178. package/lib-mjs/corePlugin/utils/addRangeToSelection.js.map +1 -1
  179. package/lib-mjs/corePlugin/utils/applyDefaultFormat.js +1 -1
  180. package/lib-mjs/corePlugin/utils/applyDefaultFormat.js.map +1 -1
  181. package/lib-mjs/corePlugin/utils/textMutationObserver.d.ts +5 -0
  182. package/lib-mjs/corePlugin/utils/textMutationObserver.js +39 -0
  183. package/lib-mjs/corePlugin/utils/textMutationObserver.js.map +1 -0
  184. package/lib-mjs/editor/DOMHelperImpl.d.ts +5 -0
  185. package/lib-mjs/editor/DOMHelperImpl.js +28 -0
  186. package/lib-mjs/editor/DOMHelperImpl.js.map +1 -0
  187. package/lib-mjs/editor/StandaloneEditor.d.ts +17 -30
  188. package/lib-mjs/editor/StandaloneEditor.js +54 -50
  189. package/lib-mjs/editor/StandaloneEditor.js.map +1 -1
  190. package/lib-mjs/editor/createStandaloneEditorCore.js +5 -2
  191. package/lib-mjs/editor/createStandaloneEditorCore.js.map +1 -1
  192. package/lib-mjs/override/reducedModelChildProcessor.d.ts +21 -0
  193. package/lib-mjs/override/reducedModelChildProcessor.js +62 -0
  194. package/lib-mjs/override/reducedModelChildProcessor.js.map +1 -0
  195. package/lib-mjs/publicApi/domUtils/borderValues.js +1 -1
  196. package/lib-mjs/publicApi/domUtils/borderValues.js.map +1 -1
  197. package/lib-mjs/publicApi/selection/deleteBlock.js +3 -0
  198. package/lib-mjs/publicApi/selection/deleteBlock.js.map +1 -1
  199. package/lib-mjs/publicApi/selection/deleteSegment.js +3 -2
  200. package/lib-mjs/publicApi/selection/deleteSegment.js.map +1 -1
  201. package/lib-mjs/publicApi/selection/iterateSelections.js +0 -2
  202. package/lib-mjs/publicApi/selection/iterateSelections.js.map +1 -1
  203. package/lib-mjs/utils/createSnapshotSelection.d.ts +2 -2
  204. package/lib-mjs/utils/createSnapshotSelection.js +78 -2
  205. package/lib-mjs/utils/createSnapshotSelection.js.map +1 -1
  206. package/lib-mjs/utils/paste/mergePasteContent.d.ts +2 -2
  207. package/lib-mjs/utils/paste/mergePasteContent.js +37 -27
  208. package/lib-mjs/utils/paste/mergePasteContent.js.map +1 -1
  209. package/lib-mjs/utils/restoreSnapshotSelection.js +1 -0
  210. package/lib-mjs/utils/restoreSnapshotSelection.js.map +1 -1
  211. package/package.json +3 -3
@@ -12,15 +12,17 @@ var createSnapshotSelection_1 = require("../utils/createSnapshotSelection");
12
12
  * when undo/redo to this snapshot
13
13
  */
14
14
  var addUndoSnapshot = function (core, canUndoByBackspace, entityStates) {
15
- var lifecycle = core.lifecycle, api = core.api, contentDiv = core.contentDiv, undo = core.undo;
15
+ var lifecycle = core.lifecycle, contentDiv = core.contentDiv, undo = core.undo;
16
16
  var snapshot = null;
17
17
  if (!lifecycle.shadowEditFragment) {
18
- var selection = api.getDOMSelection(core);
18
+ // Need to create snapshot selection before retrieve innerHTML since HTML can be changed during creating selection when normalize table
19
+ var selection = (0, createSnapshotSelection_1.createSnapshotSelection)(core);
20
+ var html = contentDiv.innerHTML;
19
21
  snapshot = {
20
- html: contentDiv.innerHTML,
22
+ html: html,
21
23
  entityStates: entityStates,
22
24
  isDarkMode: !!lifecycle.isDarkMode,
23
- selection: (0, createSnapshotSelection_1.createSnapshotSelection)(contentDiv, selection),
25
+ selection: selection,
24
26
  };
25
27
  undo.snapshotsManager.addSnapshot(snapshot, !!canUndoByBackspace);
26
28
  undo.snapshotsManager.hasNewContent = false;
@@ -1 +1 @@
1
- {"version":3,"file":"addUndoSnapshot.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/addUndoSnapshot.ts"],"names":[],"mappings":";;;AAAA,4EAA2E;AAG3E;;;;;;;;GAQG;AACI,IAAM,eAAe,GAAoB,UAAC,IAAI,EAAE,kBAAkB,EAAE,YAAY;IAC3E,IAAA,SAAS,GAA4B,IAAI,UAAhC,EAAE,GAAG,GAAuB,IAAI,IAA3B,EAAE,UAAU,GAAW,IAAI,WAAf,EAAE,IAAI,GAAK,IAAI,KAAT,CAAU;IAClD,IAAI,QAAQ,GAAoB,IAAI,CAAC;IAErC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;QAC/B,IAAM,SAAS,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE5C,QAAQ,GAAG;YACP,IAAI,EAAE,UAAU,CAAC,SAAS;YAC1B,YAAY,cAAA;YACZ,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU;YAClC,SAAS,EAAE,IAAA,iDAAuB,EAAC,UAAU,EAAE,SAAS,CAAC;SAC5D,CAAC;QAEF,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAClE,IAAI,CAAC,gBAAgB,CAAC,aAAa,GAAG,KAAK,CAAC;KAC/C;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAnBW,QAAA,eAAe,mBAmB1B","sourcesContent":["import { createSnapshotSelection } from '../utils/createSnapshotSelection';\nimport type { AddUndoSnapshot, Snapshot } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Add an undo snapshot to current undo snapshot stack\n * @param core The StandaloneEditorCore object\n * @param canUndoByBackspace True if this action can be undone when user press Backspace key (aka Auto Complete).\n * @param entityStates @optional Entity states related to this snapshot.\n * Each entity state will cause an EntityOperation event with operation = EntityOperation.UpdateEntityState\n * when undo/redo to this snapshot\n */\nexport const addUndoSnapshot: AddUndoSnapshot = (core, canUndoByBackspace, entityStates) => {\n const { lifecycle, api, contentDiv, undo } = core;\n let snapshot: Snapshot | null = null;\n\n if (!lifecycle.shadowEditFragment) {\n const selection = api.getDOMSelection(core);\n\n snapshot = {\n html: contentDiv.innerHTML,\n entityStates,\n isDarkMode: !!lifecycle.isDarkMode,\n selection: createSnapshotSelection(contentDiv, selection),\n };\n\n undo.snapshotsManager.addSnapshot(snapshot, !!canUndoByBackspace);\n undo.snapshotsManager.hasNewContent = false;\n }\n\n return snapshot;\n};\n"]}
1
+ {"version":3,"file":"addUndoSnapshot.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/addUndoSnapshot.ts"],"names":[],"mappings":";;;AAAA,4EAA2E;AAG3E;;;;;;;;GAQG;AACI,IAAM,eAAe,GAAoB,UAAC,IAAI,EAAE,kBAAkB,EAAE,YAAY;IAC3E,IAAA,SAAS,GAAuB,IAAI,UAA3B,EAAE,UAAU,GAAW,IAAI,WAAf,EAAE,IAAI,GAAK,IAAI,KAAT,CAAU;IAC7C,IAAI,QAAQ,GAAoB,IAAI,CAAC;IAErC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;QAC/B,uIAAuI;QACvI,IAAM,SAAS,GAAG,IAAA,iDAAuB,EAAC,IAAI,CAAC,CAAC;QAChD,IAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC;QAElC,QAAQ,GAAG;YACP,IAAI,MAAA;YACJ,YAAY,cAAA;YACZ,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU;YAClC,SAAS,WAAA;SACZ,CAAC;QAEF,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAClE,IAAI,CAAC,gBAAgB,CAAC,aAAa,GAAG,KAAK,CAAC;KAC/C;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AArBW,QAAA,eAAe,mBAqB1B","sourcesContent":["import { createSnapshotSelection } from '../utils/createSnapshotSelection';\nimport type { AddUndoSnapshot, Snapshot } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Add an undo snapshot to current undo snapshot stack\n * @param core The StandaloneEditorCore object\n * @param canUndoByBackspace True if this action can be undone when user press Backspace key (aka Auto Complete).\n * @param entityStates @optional Entity states related to this snapshot.\n * Each entity state will cause an EntityOperation event with operation = EntityOperation.UpdateEntityState\n * when undo/redo to this snapshot\n */\nexport const addUndoSnapshot: AddUndoSnapshot = (core, canUndoByBackspace, entityStates) => {\n const { lifecycle, contentDiv, undo } = core;\n let snapshot: Snapshot | null = null;\n\n if (!lifecycle.shadowEditFragment) {\n // Need to create snapshot selection before retrieve innerHTML since HTML can be changed during creating selection when normalize table\n const selection = createSnapshotSelection(core);\n const html = contentDiv.innerHTML;\n\n snapshot = {\n html,\n entityStates,\n isDarkMode: !!lifecycle.isDarkMode,\n selection,\n };\n\n undo.snapshotsManager.addSnapshot(snapshot, !!canUndoByBackspace);\n undo.snapshotsManager.hasNewContent = false;\n }\n\n return snapshot;\n};\n"]}
@@ -11,6 +11,9 @@ var roosterjs_content_model_dom_1 = require("roosterjs-content-model-dom");
11
11
  * @param selectionOverride When passed, use this selection range instead of current selection in editor
12
12
  */
13
13
  var createContentModel = function (core, option, selectionOverride) {
14
+ var _a;
15
+ // Flush all mutations if any, so that we can get an up-to-date Content Model
16
+ (_a = core.cache.textMutationObserver) === null || _a === void 0 ? void 0 : _a.flushMutations();
14
17
  var cachedModel = selectionOverride ? null : core.cache.cachedModel;
15
18
  if (cachedModel && core.lifecycle.shadowEditFragment) {
16
19
  // When in shadow edit, use a cloned model so we won't pollute the cached one
@@ -21,8 +24,13 @@ var createContentModel = function (core, option, selectionOverride) {
21
24
  }
22
25
  else {
23
26
  var selection = selectionOverride || core.api.getDOMSelection(core) || undefined;
24
- var model = internalCreateContentModel(core, selection, option);
25
- if (!option && !selectionOverride) {
27
+ var saveIndex = !option && !selectionOverride;
28
+ var editorContext = core.api.createEditorContext(core, saveIndex);
29
+ var domToModelContext = option
30
+ ? (0, roosterjs_content_model_dom_1.createDomToModelContext)(editorContext, core.domToModelSettings.builtIn, core.domToModelSettings.customized, option)
31
+ : (0, roosterjs_content_model_dom_1.createDomToModelContextWithConfig)(core.domToModelSettings.calculated, editorContext);
32
+ var model = (0, roosterjs_content_model_dom_1.domToContentModel)(core.contentDiv, domToModelContext, selection);
33
+ if (saveIndex) {
26
34
  core.cache.cachedModel = model;
27
35
  core.cache.cachedSelection = selection;
28
36
  }
@@ -30,11 +38,4 @@ var createContentModel = function (core, option, selectionOverride) {
30
38
  }
31
39
  };
32
40
  exports.createContentModel = createContentModel;
33
- function internalCreateContentModel(core, selection, option) {
34
- var editorContext = core.api.createEditorContext(core);
35
- var domToModelContext = option
36
- ? (0, roosterjs_content_model_dom_1.createDomToModelContext)(editorContext, core.domToModelSettings.builtIn, core.domToModelSettings.customized, option)
37
- : (0, roosterjs_content_model_dom_1.createDomToModelContextWithConfig)(core.domToModelSettings.calculated, editorContext);
38
- return (0, roosterjs_content_model_dom_1.domToContentModel)(core.contentDiv, domToModelContext, selection);
39
- }
40
41
  //# sourceMappingURL=createContentModel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createContentModel.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/createContentModel.ts"],"names":[],"mappings":";;;AAAA,4DAA2D;AAC3D,2EAIqC;AAQrC;;;;;;GAMG;AACI,IAAM,kBAAkB,GAAuB,UAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB;IAClF,IAAI,WAAW,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;IAEpE,IAAI,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;QAClD,6EAA6E;QAC7E,WAAW,GAAG,IAAA,uBAAU,EAAC,WAAW,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC;KACzE;IAED,IAAI,WAAW,EAAE;QACb,OAAO,WAAW,CAAC;KACtB;SAAM;QACH,IAAM,SAAS,GAAG,iBAAiB,IAAI,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;QACnF,IAAM,KAAK,GAAG,0BAA0B,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QAElE,IAAI,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE;YAC/B,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,SAAS,CAAC;SAC1C;QAED,OAAO,KAAK,CAAC;KAChB;AACL,CAAC,CAAC;AArBW,QAAA,kBAAkB,sBAqB7B;AAEF,SAAS,0BAA0B,CAC/B,IAA0B,EAC1B,SAAwB,EACxB,MAAyB;IAEzB,IAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACzD,IAAM,iBAAiB,GAAG,MAAM;QAC5B,CAAC,CAAC,IAAA,qDAAuB,EACnB,aAAa,EACb,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAC/B,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAClC,MAAM,CACT;QACH,CAAC,CAAC,IAAA,+DAAiC,EAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAE3F,OAAO,IAAA,+CAAiB,EAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;AAC5E,CAAC","sourcesContent":["import { cloneModel } from '../publicApi/model/cloneModel';\nimport {\n createDomToModelContext,\n createDomToModelContextWithConfig,\n domToContentModel,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMSelection,\n DomToModelOption,\n CreateContentModel,\n StandaloneEditorCore,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Create Content Model from DOM tree in this editor\n * @param core The editor core object\n * @param option The option to customize the behavior of DOM to Content Model conversion\n * @param selectionOverride When passed, use this selection range instead of current selection in editor\n */\nexport const createContentModel: CreateContentModel = (core, option, selectionOverride) => {\n let cachedModel = selectionOverride ? null : core.cache.cachedModel;\n\n if (cachedModel && core.lifecycle.shadowEditFragment) {\n // When in shadow edit, use a cloned model so we won't pollute the cached one\n cachedModel = cloneModel(cachedModel, { includeCachedElement: true });\n }\n\n if (cachedModel) {\n return cachedModel;\n } else {\n const selection = selectionOverride || core.api.getDOMSelection(core) || undefined;\n const model = internalCreateContentModel(core, selection, option);\n\n if (!option && !selectionOverride) {\n core.cache.cachedModel = model;\n core.cache.cachedSelection = selection;\n }\n\n return model;\n }\n};\n\nfunction internalCreateContentModel(\n core: StandaloneEditorCore,\n selection?: DOMSelection,\n option?: DomToModelOption\n) {\n const editorContext = core.api.createEditorContext(core);\n const domToModelContext = option\n ? createDomToModelContext(\n editorContext,\n core.domToModelSettings.builtIn,\n core.domToModelSettings.customized,\n option\n )\n : createDomToModelContextWithConfig(core.domToModelSettings.calculated, editorContext);\n\n return domToContentModel(core.contentDiv, domToModelContext, selection);\n}\n"]}
1
+ {"version":3,"file":"createContentModel.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/createContentModel.ts"],"names":[],"mappings":";;;AAAA,4DAA2D;AAC3D,2EAIqC;AAGrC;;;;;;GAMG;AACI,IAAM,kBAAkB,GAAuB,UAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB;;IAClF,6EAA6E;IAC7E,MAAA,IAAI,CAAC,KAAK,CAAC,oBAAoB,0CAAE,cAAc,EAAE,CAAC;IAElD,IAAI,WAAW,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;IAEpE,IAAI,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;QAClD,6EAA6E;QAC7E,WAAW,GAAG,IAAA,uBAAU,EAAC,WAAW,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC;KACzE;IAED,IAAI,WAAW,EAAE;QACb,OAAO,WAAW,CAAC;KACtB;SAAM;QACH,IAAM,SAAS,GAAG,iBAAiB,IAAI,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;QACnF,IAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC;QAChD,IAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACpE,IAAM,iBAAiB,GAAG,MAAM;YAC5B,CAAC,CAAC,IAAA,qDAAuB,EACnB,aAAa,EACb,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAC/B,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAClC,MAAM,CACT;YACH,CAAC,CAAC,IAAA,+DAAiC,EAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAE3F,IAAM,KAAK,GAAG,IAAA,+CAAiB,EAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;QAE/E,IAAI,SAAS,EAAE;YACX,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,SAAS,CAAC;SAC1C;QAED,OAAO,KAAK,CAAC;KAChB;AACL,CAAC,CAAC;AAnCW,QAAA,kBAAkB,sBAmC7B","sourcesContent":["import { cloneModel } from '../publicApi/model/cloneModel';\nimport {\n createDomToModelContext,\n createDomToModelContextWithConfig,\n domToContentModel,\n} from 'roosterjs-content-model-dom';\nimport type { CreateContentModel } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Create Content Model from DOM tree in this editor\n * @param core The editor core object\n * @param option The option to customize the behavior of DOM to Content Model conversion\n * @param selectionOverride When passed, use this selection range instead of current selection in editor\n */\nexport const createContentModel: CreateContentModel = (core, option, selectionOverride) => {\n // Flush all mutations if any, so that we can get an up-to-date Content Model\n core.cache.textMutationObserver?.flushMutations();\n\n let cachedModel = selectionOverride ? null : core.cache.cachedModel;\n\n if (cachedModel && core.lifecycle.shadowEditFragment) {\n // When in shadow edit, use a cloned model so we won't pollute the cached one\n cachedModel = cloneModel(cachedModel, { includeCachedElement: true });\n }\n\n if (cachedModel) {\n return cachedModel;\n } else {\n const selection = selectionOverride || core.api.getDOMSelection(core) || undefined;\n const saveIndex = !option && !selectionOverride;\n const editorContext = core.api.createEditorContext(core, saveIndex);\n const domToModelContext = option\n ? createDomToModelContext(\n editorContext,\n core.domToModelSettings.builtIn,\n core.domToModelSettings.customized,\n option\n )\n : createDomToModelContextWithConfig(core.domToModelSettings.calculated, editorContext);\n\n const model = domToContentModel(core.contentDiv, domToModelContext, selection);\n\n if (saveIndex) {\n core.cache.cachedModel = model;\n core.cache.cachedSelection = selection;\n }\n\n return model;\n }\n};\n"]}
@@ -5,9 +5,9 @@ exports.createEditorContext = void 0;
5
5
  * @internal
6
6
  * Create a EditorContext object used by ContentModel API
7
7
  */
8
- var createEditorContext = function (core) {
8
+ var createEditorContext = function (core, saveIndex) {
9
9
  var _a;
10
- var lifecycle = core.lifecycle, format = core.format, darkColorHandler = core.darkColorHandler, contentDiv = core.contentDiv, cache = core.cache;
10
+ var lifecycle = core.lifecycle, format = core.format, darkColorHandler = core.darkColorHandler, contentDiv = core.contentDiv, cache = core.cache, domHelper = core.domHelper;
11
11
  var context = {
12
12
  isDarkMode: lifecycle.isDarkMode,
13
13
  defaultFormat: format.defaultFormat,
@@ -15,21 +15,13 @@ var createEditorContext = function (core) {
15
15
  darkColorHandler: darkColorHandler,
16
16
  addDelimiterForEntity: true,
17
17
  allowCacheElement: true,
18
- domIndexer: cache.domIndexer,
18
+ domIndexer: saveIndex ? cache.domIndexer : undefined,
19
+ zoomScale: domHelper.calculateZoomScale(),
19
20
  };
20
21
  checkRootRtl(contentDiv, context);
21
- checkZoomScale(contentDiv, context);
22
22
  return context;
23
23
  };
24
24
  exports.createEditorContext = createEditorContext;
25
- function checkZoomScale(element, context) {
26
- var _a;
27
- var originalWidth = ((_a = element === null || element === void 0 ? void 0 : element.getBoundingClientRect()) === null || _a === void 0 ? void 0 : _a.width) || 0;
28
- var visualWidth = element.offsetWidth;
29
- if (visualWidth > 0 && originalWidth > 0) {
30
- context.zoomScale = Math.round((originalWidth / visualWidth) * 100) / 100;
31
- }
32
- }
33
25
  function checkRootRtl(element, context) {
34
26
  var _a;
35
27
  var style = (_a = element === null || element === void 0 ? void 0 : element.ownerDocument.defaultView) === null || _a === void 0 ? void 0 : _a.getComputedStyle(element);
@@ -1 +1 @@
1
- {"version":3,"file":"createEditorContext.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/createEditorContext.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACI,IAAM,mBAAmB,GAAwB,UAAA,IAAI;;IAChD,IAAA,SAAS,GAAkD,IAAI,UAAtD,EAAE,MAAM,GAA0C,IAAI,OAA9C,EAAE,gBAAgB,GAAwB,IAAI,iBAA5B,EAAE,UAAU,GAAY,IAAI,WAAhB,EAAE,KAAK,GAAK,IAAI,MAAT,CAAU;IAExE,IAAM,OAAO,GAAkB;QAC3B,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,aAAa,EAAE,MAAA,MAAM,CAAC,aAAa,mCAAI,SAAS;QAChD,gBAAgB,EAAE,gBAAgB;QAClC,qBAAqB,EAAE,IAAI;QAC3B,iBAAiB,EAAE,IAAI;QACvB,UAAU,EAAE,KAAK,CAAC,UAAU;KAC/B,CAAC;IAEF,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAClC,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAEpC,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAjBW,QAAA,mBAAmB,uBAiB9B;AAEF,SAAS,cAAc,CAAC,OAAoB,EAAE,OAAsB;;IAChE,IAAM,aAAa,GAAG,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,qBAAqB,EAAE,0CAAE,KAAK,KAAI,CAAC,CAAC;IACnE,IAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAExC,IAAI,WAAW,GAAG,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE;QACtC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;KAC7E;AACL,CAAC;AAED,SAAS,YAAY,CAAC,OAAoB,EAAE,OAAsB;;IAC9D,IAAM,KAAK,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,CAAC,WAAW,0CAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE5E,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,KAAI,KAAK,EAAE;QAC3B,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;KAC5B;AACL,CAAC","sourcesContent":["import type { EditorContext, CreateEditorContext } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Create a EditorContext object used by ContentModel API\n */\nexport const createEditorContext: CreateEditorContext = core => {\n const { lifecycle, format, darkColorHandler, contentDiv, cache } = core;\n\n const context: EditorContext = {\n isDarkMode: lifecycle.isDarkMode,\n defaultFormat: format.defaultFormat,\n pendingFormat: format.pendingFormat ?? undefined,\n darkColorHandler: darkColorHandler,\n addDelimiterForEntity: true,\n allowCacheElement: true,\n domIndexer: cache.domIndexer,\n };\n\n checkRootRtl(contentDiv, context);\n checkZoomScale(contentDiv, context);\n\n return context;\n};\n\nfunction checkZoomScale(element: HTMLElement, context: EditorContext) {\n const originalWidth = element?.getBoundingClientRect()?.width || 0;\n const visualWidth = element.offsetWidth;\n\n if (visualWidth > 0 && originalWidth > 0) {\n context.zoomScale = Math.round((originalWidth / visualWidth) * 100) / 100;\n }\n}\n\nfunction checkRootRtl(element: HTMLElement, context: EditorContext) {\n const style = element?.ownerDocument.defaultView?.getComputedStyle(element);\n\n if (style?.direction == 'rtl') {\n context.isRootRtl = true;\n }\n}\n"]}
1
+ {"version":3,"file":"createEditorContext.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/createEditorContext.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACI,IAAM,mBAAmB,GAAwB,UAAC,IAAI,EAAE,SAAS;;IAC5D,IAAA,SAAS,GAA6D,IAAI,UAAjE,EAAE,MAAM,GAAqD,IAAI,OAAzD,EAAE,gBAAgB,GAAmC,IAAI,iBAAvC,EAAE,UAAU,GAAuB,IAAI,WAA3B,EAAE,KAAK,GAAgB,IAAI,MAApB,EAAE,SAAS,GAAK,IAAI,UAAT,CAAU;IAEnF,IAAM,OAAO,GAAkB;QAC3B,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,aAAa,EAAE,MAAA,MAAM,CAAC,aAAa,mCAAI,SAAS;QAChD,gBAAgB,EAAE,gBAAgB;QAClC,qBAAqB,EAAE,IAAI;QAC3B,iBAAiB,EAAE,IAAI;QACvB,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QACpD,SAAS,EAAE,SAAS,CAAC,kBAAkB,EAAE;KAC5C,CAAC;IAEF,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAElC,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAjBW,QAAA,mBAAmB,uBAiB9B;AAEF,SAAS,YAAY,CAAC,OAAoB,EAAE,OAAsB;;IAC9D,IAAM,KAAK,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,CAAC,WAAW,0CAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE5E,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,KAAI,KAAK,EAAE;QAC3B,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;KAC5B;AACL,CAAC","sourcesContent":["import type { EditorContext, CreateEditorContext } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Create a EditorContext object used by ContentModel API\n */\nexport const createEditorContext: CreateEditorContext = (core, saveIndex) => {\n const { lifecycle, format, darkColorHandler, contentDiv, cache, domHelper } = core;\n\n const context: EditorContext = {\n isDarkMode: lifecycle.isDarkMode,\n defaultFormat: format.defaultFormat,\n pendingFormat: format.pendingFormat ?? undefined,\n darkColorHandler: darkColorHandler,\n addDelimiterForEntity: true,\n allowCacheElement: true,\n domIndexer: saveIndex ? cache.domIndexer : undefined,\n zoomScale: domHelper.calculateZoomScale(),\n };\n\n checkRootRtl(contentDiv, context);\n\n return context;\n};\n\nfunction checkRootRtl(element: HTMLElement, context: EditorContext) {\n const style = element?.ownerDocument.defaultView?.getComputedStyle(element);\n\n if (style?.direction == 'rtl') {\n context.isRootRtl = true;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"formatContentModel.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/formatContentModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeSource } from '../constants/ChangeSource';\nimport type {\n ChangedEntity,\n ContentChangedEvent,\n DOMSelection,\n FormatContentModel,\n FormatWithContentModelContext,\n StandaloneEditorCore,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * The general API to do format change with Content Model\n * It will grab a Content Model for current editor content, and invoke a callback function\n * to do format change. Then according to the return value, write back the modified content model into editor.\n * If there is cached model, it will be used and updated.\n * @param core The StandaloneEditorCore object\n * @param formatter Formatter function, see ContentModelFormatter\n * @param options More options, see FormatWithContentModelOptions\n */\nexport const formatContentModel: FormatContentModel = (core, formatter, options) => {\n const { apiName, onNodeCreated, getChangeData, changeSource, rawEvent, selectionOverride } =\n options || {};\n\n const model = core.api.createContentModel(core, undefined /*option*/, selectionOverride);\n const context: FormatWithContentModelContext = {\n newEntities: [],\n deletedEntities: [],\n rawEvent,\n newImages: [],\n };\n\n const hasFocus = core.api.hasFocus(core);\n\n const changed = formatter(model, context);\n const { skipUndoSnapshot, clearModelCache, entityStates, canUndoByBackspace } = context;\n\n if (changed) {\n const isNested = core.undo.isNested;\n const shouldAddSnapshot = !skipUndoSnapshot && !isNested;\n let selection: DOMSelection | undefined;\n\n if (shouldAddSnapshot) {\n core.undo.isNested = true;\n\n if (core.undo.snapshotsManager.hasNewContent || entityStates) {\n core.api.addUndoSnapshot(core, !!canUndoByBackspace);\n }\n }\n\n try {\n handleImages(core, context);\n\n selection =\n core.api.setContentModel(\n core,\n model,\n hasFocus ? undefined : { ignoreSelection: true }, // If editor did not have focus before format, do not set focus after format\n onNodeCreated\n ) ?? undefined;\n\n handlePendingFormat(core, context, selection);\n\n if (shouldAddSnapshot) {\n core.api.addUndoSnapshot(core, !!canUndoByBackspace, entityStates);\n }\n } finally {\n if (!isNested) {\n core.undo.isNested = false;\n }\n }\n\n const eventData: ContentChangedEvent = {\n eventType: 'contentChanged',\n contentModel: clearModelCache ? undefined : model,\n selection: clearModelCache ? undefined : selection,\n source: changeSource || ChangeSource.Format,\n data: getChangeData?.(),\n formatApiName: apiName,\n changedEntities: getChangedEntities(context, rawEvent),\n };\n\n core.api.triggerEvent(core, eventData, true /*broadcast*/);\n\n if (canUndoByBackspace && selection?.type == 'range') {\n core.undo.snapshotsManager.hasNewContent = false;\n core.undo.posContainer = selection.range.startContainer;\n core.undo.posOffset = selection.range.startOffset;\n }\n } else {\n if (clearModelCache) {\n core.cache.cachedModel = undefined;\n core.cache.cachedSelection = undefined;\n }\n\n handlePendingFormat(core, context, core.api.getDOMSelection(core));\n }\n};\n\nfunction handleImages(core: StandaloneEditorCore, context: FormatWithContentModelContext) {\n if (context.newImages.length > 0) {\n const viewport = core.api.getVisibleViewport(core);\n\n if (viewport) {\n const { left, right } = viewport;\n const minMaxImageSize = 10;\n const maxWidth = Math.max(right - left, minMaxImageSize);\n context.newImages.forEach(image => {\n image.format.maxWidth = `${maxWidth}px`;\n });\n }\n }\n}\n\nfunction handlePendingFormat(\n core: StandaloneEditorCore,\n context: FormatWithContentModelContext,\n selection?: DOMSelection | null\n) {\n const pendingFormat =\n context.newPendingFormat == 'preserve'\n ? core.format.pendingFormat?.format\n : context.newPendingFormat;\n\n if (pendingFormat && selection?.type == 'range' && selection.range.collapsed) {\n core.format.pendingFormat = {\n format: { ...pendingFormat },\n posContainer: selection.range.startContainer,\n posOffset: selection.range.startOffset,\n };\n }\n}\n\nfunction getChangedEntities(\n context: FormatWithContentModelContext,\n rawEvent?: Event\n): ChangedEntity[] {\n return context.newEntities\n .map(\n (entity): ChangedEntity => ({\n entity,\n operation: 'newEntity',\n rawEvent,\n })\n )\n .concat(\n context.deletedEntities.map(entry => ({\n entity: entry.entity,\n operation: entry.operation,\n rawEvent,\n }))\n );\n}\n"]}
1
+ {"version":3,"file":"formatContentModel.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/formatContentModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeSource } from '../constants/ChangeSource';\nimport type {\n ChangedEntity,\n ContentChangedEvent,\n DOMSelection,\n FormatContentModel,\n FormatWithContentModelContext,\n StandaloneEditorCore,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * The general API to do format change with Content Model\n * It will grab a Content Model for current editor content, and invoke a callback function\n * to do format change. Then according to the return value, write back the modified content model into editor.\n * If there is cached model, it will be used and updated.\n * @param core The StandaloneEditorCore object\n * @param formatter Formatter function, see ContentModelFormatter\n * @param options More options, see FormatWithContentModelOptions\n */\nexport const formatContentModel: FormatContentModel = (core, formatter, options) => {\n const { apiName, onNodeCreated, getChangeData, changeSource, rawEvent, selectionOverride } =\n options || {};\n const model = core.api.createContentModel(core, undefined /*option*/, selectionOverride);\n const context: FormatWithContentModelContext = {\n newEntities: [],\n deletedEntities: [],\n rawEvent,\n newImages: [],\n };\n\n const hasFocus = core.api.hasFocus(core);\n\n const changed = formatter(model, context);\n const { skipUndoSnapshot, clearModelCache, entityStates, canUndoByBackspace } = context;\n\n if (changed) {\n const isNested = core.undo.isNested;\n const shouldAddSnapshot = !skipUndoSnapshot && !isNested;\n let selection: DOMSelection | undefined;\n\n if (shouldAddSnapshot) {\n core.undo.isNested = true;\n\n if (core.undo.snapshotsManager.hasNewContent || entityStates) {\n core.api.addUndoSnapshot(core, !!canUndoByBackspace);\n }\n }\n\n try {\n handleImages(core, context);\n\n selection =\n core.api.setContentModel(\n core,\n model,\n hasFocus ? undefined : { ignoreSelection: true }, // If editor did not have focus before format, do not set focus after format\n onNodeCreated\n ) ?? undefined;\n\n handlePendingFormat(core, context, selection);\n\n if (shouldAddSnapshot) {\n core.api.addUndoSnapshot(core, !!canUndoByBackspace, entityStates);\n }\n } finally {\n if (!isNested) {\n core.undo.isNested = false;\n }\n }\n\n const eventData: ContentChangedEvent = {\n eventType: 'contentChanged',\n contentModel: clearModelCache ? undefined : model,\n selection: clearModelCache ? undefined : selection,\n source: changeSource || ChangeSource.Format,\n data: getChangeData?.(),\n formatApiName: apiName,\n changedEntities: getChangedEntities(context, rawEvent),\n };\n\n core.api.triggerEvent(core, eventData, true /*broadcast*/);\n\n if (canUndoByBackspace && selection?.type == 'range') {\n core.undo.snapshotsManager.hasNewContent = false;\n core.undo.posContainer = selection.range.startContainer;\n core.undo.posOffset = selection.range.startOffset;\n }\n } else {\n if (clearModelCache) {\n core.cache.cachedModel = undefined;\n core.cache.cachedSelection = undefined;\n }\n\n handlePendingFormat(core, context, core.api.getDOMSelection(core));\n }\n};\n\nfunction handleImages(core: StandaloneEditorCore, context: FormatWithContentModelContext) {\n if (context.newImages.length > 0) {\n const viewport = core.api.getVisibleViewport(core);\n\n if (viewport) {\n const { left, right } = viewport;\n const minMaxImageSize = 10;\n const maxWidth = Math.max(right - left, minMaxImageSize);\n context.newImages.forEach(image => {\n image.format.maxWidth = `${maxWidth}px`;\n });\n }\n }\n}\n\nfunction handlePendingFormat(\n core: StandaloneEditorCore,\n context: FormatWithContentModelContext,\n selection?: DOMSelection | null\n) {\n const pendingFormat =\n context.newPendingFormat == 'preserve'\n ? core.format.pendingFormat?.format\n : context.newPendingFormat;\n\n if (pendingFormat && selection?.type == 'range' && selection.range.collapsed) {\n core.format.pendingFormat = {\n format: { ...pendingFormat },\n posContainer: selection.range.startContainer,\n posOffset: selection.range.startOffset,\n };\n }\n}\n\nfunction getChangedEntities(\n context: FormatWithContentModelContext,\n rawEvent?: Event\n): ChangedEntity[] {\n return context.newEntities\n .map(\n (entity): ChangedEntity => ({\n entity,\n operation: 'newEntity',\n rawEvent,\n })\n )\n .concat(\n context.deletedEntities.map(entry => ({\n entity: entry.entity,\n operation: entry.operation,\n rawEvent,\n }))\n );\n}\n"]}
@@ -5,10 +5,15 @@ exports.getDOMSelection = void 0;
5
5
  * @internal
6
6
  */
7
7
  var getDOMSelection = function (core) {
8
- var _a;
9
- return core.lifecycle.shadowEditFragment
10
- ? null
11
- : (_a = core.selection.selection) !== null && _a !== void 0 ? _a : getNewSelection(core);
8
+ if (core.lifecycle.shadowEditFragment) {
9
+ return null;
10
+ }
11
+ else {
12
+ var selection = core.selection.selection;
13
+ return selection && (selection.type != 'range' || !core.api.hasFocus(core))
14
+ ? selection
15
+ : getNewSelection(core);
16
+ }
12
17
  };
13
18
  exports.getDOMSelection = getDOMSelection;
14
19
  function getNewSelection(core) {
@@ -19,7 +24,17 @@ function getNewSelection(core) {
19
24
  ? {
20
25
  type: 'range',
21
26
  range: range,
27
+ isReverted: isSelectionReverted(selection),
22
28
  }
23
29
  : null;
24
30
  }
31
+ function isSelectionReverted(selection) {
32
+ if (selection && selection.rangeCount > 0) {
33
+ var range = selection.getRangeAt(0);
34
+ return (!range.collapsed &&
35
+ selection.focusNode != range.endContainer &&
36
+ selection.focusOffset != range.endOffset);
37
+ }
38
+ return false;
39
+ }
25
40
  //# sourceMappingURL=getDOMSelection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getDOMSelection.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/getDOMSelection.ts"],"names":[],"mappings":";;;AAMA;;GAEG;AACI,IAAM,eAAe,GAAoB,UAAA,IAAI;;IAChD,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB;QACpC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,MAAA,IAAI,CAAC,SAAS,CAAC,SAAS,mCAAI,eAAe,CAAC,IAAI,CAAC,CAAC;AAC5D,CAAC,CAAC;AAJW,QAAA,eAAe,mBAI1B;AAEF,SAAS,eAAe,CAAC,IAA0B;;IAC/C,IAAM,SAAS,GAAG,MAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,0CAAE,YAAY,EAAE,CAAC;IAC5E,IAAM,KAAK,GAAG,SAAS,IAAI,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAErF,OAAO,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC;QACnE,CAAC,CAAC;YACI,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,KAAK;SACf;QACH,CAAC,CAAC,IAAI,CAAC;AACf,CAAC","sourcesContent":["import type {\n DOMSelection,\n GetDOMSelection,\n StandaloneEditorCore,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const getDOMSelection: GetDOMSelection = core => {\n return core.lifecycle.shadowEditFragment\n ? null\n : core.selection.selection ?? getNewSelection(core);\n};\n\nfunction getNewSelection(core: StandaloneEditorCore): DOMSelection | null {\n const selection = core.contentDiv.ownerDocument.defaultView?.getSelection();\n const range = selection && selection.rangeCount > 0 ? selection.getRangeAt(0) : null;\n\n return range && core.contentDiv.contains(range.commonAncestorContainer)\n ? {\n type: 'range',\n range: range,\n }\n : null;\n}\n"]}
1
+ {"version":3,"file":"getDOMSelection.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/getDOMSelection.ts"],"names":[],"mappings":";;;AAMA;;GAEG;AACI,IAAM,eAAe,GAAoB,UAAA,IAAI;IAChD,IAAI,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;QACnC,OAAO,IAAI,CAAC;KACf;SAAM;QACH,IAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;QAE3C,OAAO,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACvE,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;KAC/B;AACL,CAAC,CAAC;AAVW,QAAA,eAAe,mBAU1B;AAEF,SAAS,eAAe,CAAC,IAA0B;;IAC/C,IAAM,SAAS,GAAG,MAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,0CAAE,YAAY,EAAE,CAAC;IAC5E,IAAM,KAAK,GAAG,SAAS,IAAI,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAErF,OAAO,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC;QACnE,CAAC,CAAC;YACI,IAAI,EAAE,OAAO;YACb,KAAK,OAAA;YACL,UAAU,EAAE,mBAAmB,CAAC,SAAS,CAAC;SAC7C;QACH,CAAC,CAAC,IAAI,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,SAAuC;IAChE,IAAI,SAAS,IAAI,SAAS,CAAC,UAAU,GAAG,CAAC,EAAE;QACvC,IAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACtC,OAAO,CACH,CAAC,KAAK,CAAC,SAAS;YAChB,SAAS,CAAC,SAAS,IAAI,KAAK,CAAC,YAAY;YACzC,SAAS,CAAC,WAAW,IAAI,KAAK,CAAC,SAAS,CAC3C,CAAC;KACL;IAED,OAAO,KAAK,CAAC;AACjB,CAAC","sourcesContent":["import type {\n DOMSelection,\n GetDOMSelection,\n StandaloneEditorCore,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const getDOMSelection: GetDOMSelection = core => {\n if (core.lifecycle.shadowEditFragment) {\n return null;\n } else {\n const selection = core.selection.selection;\n\n return selection && (selection.type != 'range' || !core.api.hasFocus(core))\n ? selection\n : getNewSelection(core);\n }\n};\n\nfunction getNewSelection(core: StandaloneEditorCore): DOMSelection | null {\n const selection = core.contentDiv.ownerDocument.defaultView?.getSelection();\n const range = selection && selection.rangeCount > 0 ? selection.getRangeAt(0) : null;\n\n return range && core.contentDiv.contains(range.commonAncestorContainer)\n ? {\n type: 'range',\n range,\n isReverted: isSelectionReverted(selection),\n }\n : null;\n}\n\nfunction isSelectionReverted(selection: Selection | null | undefined): boolean {\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n return (\n !range.collapsed &&\n selection.focusNode != range.endContainer &&\n selection.focusOffset != range.endOffset\n );\n }\n\n return false;\n}\n"]}
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.paste = void 0;
4
- var ChangeSource_1 = require("../constants/ChangeSource");
5
4
  var cloneModel_1 = require("../publicApi/model/cloneModel");
6
5
  var convertInlineCss_1 = require("../utils/paste/convertInlineCss");
7
6
  var createPasteFragment_1 = require("../utils/paste/createPasteFragment");
@@ -19,6 +18,7 @@ var CloneOption = {
19
18
  * @param pasteType Type of content to paste. @default normal
20
19
  */
21
20
  var paste = function (core, clipboardData, pasteType) {
21
+ var _a;
22
22
  if (pasteType === void 0) { pasteType = 'normal'; }
23
23
  core.api.focus(core);
24
24
  if (clipboardData.modelBeforePaste) {
@@ -27,28 +27,20 @@ var paste = function (core, clipboardData, pasteType) {
27
27
  else {
28
28
  clipboardData.modelBeforePaste = (0, cloneModel_1.cloneModel)(core.api.createContentModel(core), CloneOption);
29
29
  }
30
- core.api.formatContentModel(core, function (model, context) {
31
- var _a;
32
- // 1. Prepare variables
33
- var doc = createDOMFromHtml(clipboardData.rawHtml, core.trustedHTMLHandler);
34
- // 2. Handle HTML from clipboard
35
- var htmlFromClipboard = (0, retrieveHtmlInfo_1.retrieveHtmlInfo)(doc, clipboardData);
36
- // 3. Create target fragment
37
- var sourceFragment = (0, createPasteFragment_1.createPasteFragment)(core.contentDiv.ownerDocument, clipboardData, pasteType, (_a = (clipboardData.rawHtml == clipboardData.html
38
- ? doc
39
- : createDOMFromHtml(clipboardData.html, core.trustedHTMLHandler))) === null || _a === void 0 ? void 0 : _a.body);
40
- // 4. Trigger BeforePaste event to allow plugins modify the fragment
41
- var eventResult = (0, generatePasteOptionFromPlugins_1.generatePasteOptionFromPlugins)(core, clipboardData, sourceFragment, htmlFromClipboard, pasteType);
42
- // 5. Convert global CSS to inline CSS
43
- (0, convertInlineCss_1.convertInlineCss)(eventResult.fragment, htmlFromClipboard.globalCssRules);
44
- // 6. Merge pasted content into main Content Model
45
- (0, mergePasteContent_1.mergePasteContent)(model, context, eventResult, core.domToModelSettings.customized);
46
- return true;
47
- }, {
48
- changeSource: ChangeSource_1.ChangeSource.Paste,
49
- getChangeData: function () { return clipboardData; },
50
- apiName: 'paste',
51
- });
30
+ // 1. Prepare variables
31
+ var doc = createDOMFromHtml(clipboardData.rawHtml, core.trustedHTMLHandler);
32
+ // 2. Handle HTML from clipboard
33
+ var htmlFromClipboard = (0, retrieveHtmlInfo_1.retrieveHtmlInfo)(doc, clipboardData);
34
+ // 3. Create target fragment
35
+ var sourceFragment = (0, createPasteFragment_1.createPasteFragment)(core.contentDiv.ownerDocument, clipboardData, pasteType, (_a = (clipboardData.rawHtml == clipboardData.html
36
+ ? doc
37
+ : createDOMFromHtml(clipboardData.html, core.trustedHTMLHandler))) === null || _a === void 0 ? void 0 : _a.body);
38
+ // 4. Trigger BeforePaste event to allow plugins modify the fragment
39
+ var eventResult = (0, generatePasteOptionFromPlugins_1.generatePasteOptionFromPlugins)(core, clipboardData, sourceFragment, htmlFromClipboard, pasteType);
40
+ // 5. Convert global CSS to inline CSS
41
+ (0, convertInlineCss_1.convertInlineCss)(eventResult.fragment, htmlFromClipboard.globalCssRules);
42
+ // 6. Merge pasted content into main Content Model
43
+ (0, mergePasteContent_1.mergePasteContent)(core, eventResult, clipboardData);
52
44
  };
53
45
  exports.paste = paste;
54
46
  function createDOMFromHtml(html, trustedHTMLHandler) {
@@ -1 +1 @@
1
- {"version":3,"file":"paste.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/paste.ts"],"names":[],"mappings":";;;AAAA,0DAAyD;AACzD,4DAA2D;AAC3D,oEAAmE;AACnE,0EAAyE;AACzE,gGAA+F;AAC/F,sEAAqE;AACrE,oEAAmE;AAUnE,IAAM,WAAW,GAAsB;IACnC,oBAAoB,EAAE,UAAC,IAAI,EAAE,IAAI,IAAK,OAAA,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAApC,CAAoC;CAC7E,CAAC;AAEF;;;;;;GAMG;AACI,IAAM,KAAK,GAAU,UACxB,IAA0B,EAC1B,aAA4B,EAC5B,SAA+B;IAA/B,0BAAA,EAAA,oBAA+B;IAE/B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAErB,IAAI,aAAa,CAAC,gBAAgB,EAAE;QAChC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,IAAA,uBAAU,EAAC,aAAa,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC,CAAC;KAC3F;SAAM;QACH,aAAa,CAAC,gBAAgB,GAAG,IAAA,uBAAU,EAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC;KAC/F;IAED,IAAI,CAAC,GAAG,CAAC,kBAAkB,CACvB,IAAI,EACJ,UAAC,KAAK,EAAE,OAAO;;QACX,uBAAuB;QACvB,IAAM,GAAG,GAAG,iBAAiB,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAE9E,gCAAgC;QAChC,IAAM,iBAAiB,GAAG,IAAA,mCAAgB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAE/D,4BAA4B;QAC5B,IAAM,cAAc,GAAG,IAAA,yCAAmB,EACtC,IAAI,CAAC,UAAU,CAAC,aAAa,EAC7B,aAAa,EACb,SAAS,EACT,MAAA,CAAC,aAAa,CAAC,OAAO,IAAI,aAAa,CAAC,IAAI;YACxC,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,CACnE,0CAAE,IAAI,CACV,CAAC;QAEF,oEAAoE;QACpE,IAAM,WAAW,GAAG,IAAA,+DAA8B,EAC9C,IAAI,EACJ,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,SAAS,CACZ,CAAC;QAEF,sCAAsC;QACtC,IAAA,mCAAgB,EAAC,WAAW,CAAC,QAAQ,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAEzE,kDAAkD;QAClD,IAAA,qCAAiB,EAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAEnF,OAAO,IAAI,CAAC;IAChB,CAAC,EACD;QACI,YAAY,EAAE,2BAAY,CAAC,KAAK;QAChC,aAAa,EAAE,cAAM,OAAA,aAAa,EAAb,CAAa;QAClC,OAAO,EAAE,OAAO;KACnB,CACJ,CAAC;AACN,CAAC,CAAC;AAxDW,QAAA,KAAK,SAwDhB;AAEF,SAAS,iBAAiB,CACtB,IAA+B,EAC/B,kBAAsC;IAEtC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,eAAe,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChG,CAAC","sourcesContent":["import { ChangeSource } from '../constants/ChangeSource';\nimport { cloneModel } from '../publicApi/model/cloneModel';\nimport { convertInlineCss } from '../utils/paste/convertInlineCss';\nimport { createPasteFragment } from '../utils/paste/createPasteFragment';\nimport { generatePasteOptionFromPlugins } from '../utils/paste/generatePasteOptionFromPlugins';\nimport { mergePasteContent } from '../utils/paste/mergePasteContent';\nimport { retrieveHtmlInfo } from '../utils/paste/retrieveHtmlInfo';\nimport type { CloneModelOptions } from '../publicApi/model/cloneModel';\nimport type {\n PasteType,\n ClipboardData,\n Paste,\n StandaloneEditorCore,\n TrustedHTMLHandler,\n} from 'roosterjs-content-model-types';\n\nconst CloneOption: CloneModelOptions = {\n includeCachedElement: (node, type) => (type == 'cache' ? undefined : node),\n};\n\n/**\n * @internal\n * Paste into editor using a clipboardData object\n * @param core The StandaloneEditorCore object.\n * @param clipboardData Clipboard data retrieved from clipboard\n * @param pasteType Type of content to paste. @default normal\n */\nexport const paste: Paste = (\n core: StandaloneEditorCore,\n clipboardData: ClipboardData,\n pasteType: PasteType = 'normal'\n) => {\n core.api.focus(core);\n\n if (clipboardData.modelBeforePaste) {\n core.api.setContentModel(core, cloneModel(clipboardData.modelBeforePaste, CloneOption));\n } else {\n clipboardData.modelBeforePaste = cloneModel(core.api.createContentModel(core), CloneOption);\n }\n\n core.api.formatContentModel(\n core,\n (model, context) => {\n // 1. Prepare variables\n const doc = createDOMFromHtml(clipboardData.rawHtml, core.trustedHTMLHandler);\n\n // 2. Handle HTML from clipboard\n const htmlFromClipboard = retrieveHtmlInfo(doc, clipboardData);\n\n // 3. Create target fragment\n const sourceFragment = createPasteFragment(\n core.contentDiv.ownerDocument,\n clipboardData,\n pasteType,\n (clipboardData.rawHtml == clipboardData.html\n ? doc\n : createDOMFromHtml(clipboardData.html, core.trustedHTMLHandler)\n )?.body\n );\n\n // 4. Trigger BeforePaste event to allow plugins modify the fragment\n const eventResult = generatePasteOptionFromPlugins(\n core,\n clipboardData,\n sourceFragment,\n htmlFromClipboard,\n pasteType\n );\n\n // 5. Convert global CSS to inline CSS\n convertInlineCss(eventResult.fragment, htmlFromClipboard.globalCssRules);\n\n // 6. Merge pasted content into main Content Model\n mergePasteContent(model, context, eventResult, core.domToModelSettings.customized);\n\n return true;\n },\n {\n changeSource: ChangeSource.Paste,\n getChangeData: () => clipboardData,\n apiName: 'paste',\n }\n );\n};\n\nfunction createDOMFromHtml(\n html: string | null | undefined,\n trustedHTMLHandler: TrustedHTMLHandler\n): Document | null {\n return html ? new DOMParser().parseFromString(trustedHTMLHandler(html), 'text/html') : null;\n}\n"]}
1
+ {"version":3,"file":"paste.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/paste.ts"],"names":[],"mappings":";;;AAAA,4DAA2D;AAC3D,oEAAmE;AACnE,0EAAyE;AACzE,gGAA+F;AAC/F,sEAAqE;AACrE,oEAAmE;AAUnE,IAAM,WAAW,GAAsB;IACnC,oBAAoB,EAAE,UAAC,IAAI,EAAE,IAAI,IAAK,OAAA,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAApC,CAAoC;CAC7E,CAAC;AAEF;;;;;;GAMG;AACI,IAAM,KAAK,GAAU,UACxB,IAA0B,EAC1B,aAA4B,EAC5B,SAA+B;;IAA/B,0BAAA,EAAA,oBAA+B;IAE/B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAErB,IAAI,aAAa,CAAC,gBAAgB,EAAE;QAChC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,IAAA,uBAAU,EAAC,aAAa,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC,CAAC;KAC3F;SAAM;QACH,aAAa,CAAC,gBAAgB,GAAG,IAAA,uBAAU,EAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC;KAC/F;IAED,uBAAuB;IACvB,IAAM,GAAG,GAAG,iBAAiB,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAE9E,gCAAgC;IAChC,IAAM,iBAAiB,GAAG,IAAA,mCAAgB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAE/D,4BAA4B;IAC5B,IAAM,cAAc,GAAG,IAAA,yCAAmB,EACtC,IAAI,CAAC,UAAU,CAAC,aAAa,EAC7B,aAAa,EACb,SAAS,EACT,MAAA,CAAC,aAAa,CAAC,OAAO,IAAI,aAAa,CAAC,IAAI;QACxC,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,CACnE,0CAAE,IAAI,CACV,CAAC;IAEF,oEAAoE;IACpE,IAAM,WAAW,GAAG,IAAA,+DAA8B,EAC9C,IAAI,EACJ,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,SAAS,CACZ,CAAC;IAEF,sCAAsC;IACtC,IAAA,mCAAgB,EAAC,WAAW,CAAC,QAAQ,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC;IAEzE,kDAAkD;IAClD,IAAA,qCAAiB,EAAC,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC,CAAC;AA5CW,QAAA,KAAK,SA4ChB;AAEF,SAAS,iBAAiB,CACtB,IAA+B,EAC/B,kBAAsC;IAEtC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,eAAe,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChG,CAAC","sourcesContent":["import { cloneModel } from '../publicApi/model/cloneModel';\nimport { convertInlineCss } from '../utils/paste/convertInlineCss';\nimport { createPasteFragment } from '../utils/paste/createPasteFragment';\nimport { generatePasteOptionFromPlugins } from '../utils/paste/generatePasteOptionFromPlugins';\nimport { mergePasteContent } from '../utils/paste/mergePasteContent';\nimport { retrieveHtmlInfo } from '../utils/paste/retrieveHtmlInfo';\nimport type { CloneModelOptions } from '../publicApi/model/cloneModel';\nimport type {\n PasteType,\n ClipboardData,\n Paste,\n StandaloneEditorCore,\n TrustedHTMLHandler,\n} from 'roosterjs-content-model-types';\n\nconst CloneOption: CloneModelOptions = {\n includeCachedElement: (node, type) => (type == 'cache' ? undefined : node),\n};\n\n/**\n * @internal\n * Paste into editor using a clipboardData object\n * @param core The StandaloneEditorCore object.\n * @param clipboardData Clipboard data retrieved from clipboard\n * @param pasteType Type of content to paste. @default normal\n */\nexport const paste: Paste = (\n core: StandaloneEditorCore,\n clipboardData: ClipboardData,\n pasteType: PasteType = 'normal'\n) => {\n core.api.focus(core);\n\n if (clipboardData.modelBeforePaste) {\n core.api.setContentModel(core, cloneModel(clipboardData.modelBeforePaste, CloneOption));\n } else {\n clipboardData.modelBeforePaste = cloneModel(core.api.createContentModel(core), CloneOption);\n }\n\n // 1. Prepare variables\n const doc = createDOMFromHtml(clipboardData.rawHtml, core.trustedHTMLHandler);\n\n // 2. Handle HTML from clipboard\n const htmlFromClipboard = retrieveHtmlInfo(doc, clipboardData);\n\n // 3. Create target fragment\n const sourceFragment = createPasteFragment(\n core.contentDiv.ownerDocument,\n clipboardData,\n pasteType,\n (clipboardData.rawHtml == clipboardData.html\n ? doc\n : createDOMFromHtml(clipboardData.html, core.trustedHTMLHandler)\n )?.body\n );\n\n // 4. Trigger BeforePaste event to allow plugins modify the fragment\n const eventResult = generatePasteOptionFromPlugins(\n core,\n clipboardData,\n sourceFragment,\n htmlFromClipboard,\n pasteType\n );\n\n // 5. Convert global CSS to inline CSS\n convertInlineCss(eventResult.fragment, htmlFromClipboard.globalCssRules);\n\n // 6. Merge pasted content into main Content Model\n mergePasteContent(core, eventResult, clipboardData);\n};\n\nfunction createDOMFromHtml(\n html: string | null | undefined,\n trustedHTMLHandler: TrustedHTMLHandler\n): Document | null {\n return html ? new DOMParser().parseFromString(trustedHTMLHandler(html), 'text/html') : null;\n}\n"]}
@@ -10,19 +10,23 @@ var roosterjs_content_model_dom_1 = require("roosterjs-content-model-dom");
10
10
  * @param option Additional options to customize the behavior of Content Model to DOM conversion
11
11
  */
12
12
  var setContentModel = function (core, model, option, onNodeCreated) {
13
- var editorContext = core.api.createEditorContext(core);
13
+ var _a;
14
+ var editorContext = core.api.createEditorContext(core, true /*saveIndex*/);
14
15
  var modelToDomContext = option
15
16
  ? (0, roosterjs_content_model_dom_1.createModelToDomContext)(editorContext, core.modelToDomSettings.builtIn, core.modelToDomSettings.customized, option)
16
17
  : (0, roosterjs_content_model_dom_1.createModelToDomContextWithConfig)(core.modelToDomSettings.calculated, editorContext);
17
- var selection = (0, roosterjs_content_model_dom_1.contentModelToDom)(core.contentDiv.ownerDocument, core.contentDiv, model, modelToDomContext, onNodeCreated);
18
+ modelToDomContext.onNodeCreated = onNodeCreated;
19
+ var selection = (0, roosterjs_content_model_dom_1.contentModelToDom)(core.contentDiv.ownerDocument, core.contentDiv, model, modelToDomContext);
18
20
  if (!core.lifecycle.shadowEditFragment) {
19
21
  core.cache.cachedSelection = selection || undefined;
20
22
  if (!(option === null || option === void 0 ? void 0 : option.ignoreSelection) && selection) {
21
23
  core.api.setDOMSelection(core, selection);
22
24
  }
23
- else if (!selection || selection.type !== 'range') {
25
+ else {
24
26
  core.selection.selection = selection;
25
27
  }
28
+ // Clear pending mutations since we will use our latest model object to replace existing cache
29
+ (_a = core.cache.textMutationObserver) === null || _a === void 0 ? void 0 : _a.flushMutations();
26
30
  core.cache.cachedModel = model;
27
31
  }
28
32
  return selection;
@@ -1 +1 @@
1
- {"version":3,"file":"setContentModel.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/setContentModel.ts"],"names":[],"mappings":";;;AAAA,2EAIqC;AAGrC;;;;;;GAMG;AACI,IAAM,eAAe,GAAoB,UAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa;IAC/E,IAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACzD,IAAM,iBAAiB,GAAG,MAAM;QAC5B,CAAC,CAAC,IAAA,qDAAuB,EACnB,aAAa,EACb,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAC/B,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAClC,MAAM,CACT;QACH,CAAC,CAAC,IAAA,+DAAiC,EAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAE3F,IAAM,SAAS,GAAG,IAAA,+CAAiB,EAC/B,IAAI,CAAC,UAAU,CAAC,aAAa,EAC7B,IAAI,CAAC,UAAU,EACf,KAAK,EACL,iBAAiB,EACjB,aAAa,CAChB,CAAC;IAEF,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;QACpC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,SAAS,IAAI,SAAS,CAAC;QAEpD,IAAI,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,eAAe,CAAA,IAAI,SAAS,EAAE;YACvC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;SAC7C;aAAM,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE;YACjD,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;SACxC;QAED,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;KAClC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC,CAAC;AAhCW,QAAA,eAAe,mBAgC1B","sourcesContent":["import {\n contentModelToDom,\n createModelToDomContext,\n createModelToDomContextWithConfig,\n} from 'roosterjs-content-model-dom';\nimport type { SetContentModel } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Set content with content model\n * @param core The editor core object\n * @param model The content model to set\n * @param option Additional options to customize the behavior of Content Model to DOM conversion\n */\nexport const setContentModel: SetContentModel = (core, model, option, onNodeCreated) => {\n const editorContext = core.api.createEditorContext(core);\n const modelToDomContext = option\n ? createModelToDomContext(\n editorContext,\n core.modelToDomSettings.builtIn,\n core.modelToDomSettings.customized,\n option\n )\n : createModelToDomContextWithConfig(core.modelToDomSettings.calculated, editorContext);\n\n const selection = contentModelToDom(\n core.contentDiv.ownerDocument,\n core.contentDiv,\n model,\n modelToDomContext,\n onNodeCreated\n );\n\n if (!core.lifecycle.shadowEditFragment) {\n core.cache.cachedSelection = selection || undefined;\n\n if (!option?.ignoreSelection && selection) {\n core.api.setDOMSelection(core, selection);\n } else if (!selection || selection.type !== 'range') {\n core.selection.selection = selection;\n }\n\n core.cache.cachedModel = model;\n }\n\n return selection;\n};\n"]}
1
+ {"version":3,"file":"setContentModel.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/setContentModel.ts"],"names":[],"mappings":";;;AAAA,2EAIqC;AAGrC;;;;;;GAMG;AACI,IAAM,eAAe,GAAoB,UAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa;;IAC/E,IAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAC7E,IAAM,iBAAiB,GAAG,MAAM;QAC5B,CAAC,CAAC,IAAA,qDAAuB,EACnB,aAAa,EACb,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAC/B,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAClC,MAAM,CACT;QACH,CAAC,CAAC,IAAA,+DAAiC,EAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAE3F,iBAAiB,CAAC,aAAa,GAAG,aAAa,CAAC;IAEhD,IAAM,SAAS,GAAG,IAAA,+CAAiB,EAC/B,IAAI,CAAC,UAAU,CAAC,aAAa,EAC7B,IAAI,CAAC,UAAU,EACf,KAAK,EACL,iBAAiB,CACpB,CAAC;IAEF,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;QACpC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,SAAS,IAAI,SAAS,CAAC;QAEpD,IAAI,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,eAAe,CAAA,IAAI,SAAS,EAAE;YACvC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;SAC7C;aAAM;YACH,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;SACxC;QAED,8FAA8F;QAC9F,MAAA,IAAI,CAAC,KAAK,CAAC,oBAAoB,0CAAE,cAAc,EAAE,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;KAClC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC,CAAC;AAnCW,QAAA,eAAe,mBAmC1B","sourcesContent":["import {\n contentModelToDom,\n createModelToDomContext,\n createModelToDomContextWithConfig,\n} from 'roosterjs-content-model-dom';\nimport type { SetContentModel } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Set content with content model\n * @param core The editor core object\n * @param model The content model to set\n * @param option Additional options to customize the behavior of Content Model to DOM conversion\n */\nexport const setContentModel: SetContentModel = (core, model, option, onNodeCreated) => {\n const editorContext = core.api.createEditorContext(core, true /*saveIndex*/);\n const modelToDomContext = option\n ? createModelToDomContext(\n editorContext,\n core.modelToDomSettings.builtIn,\n core.modelToDomSettings.customized,\n option\n )\n : createModelToDomContextWithConfig(core.modelToDomSettings.calculated, editorContext);\n\n modelToDomContext.onNodeCreated = onNodeCreated;\n\n const selection = contentModelToDom(\n core.contentDiv.ownerDocument,\n core.contentDiv,\n model,\n modelToDomContext\n );\n\n if (!core.lifecycle.shadowEditFragment) {\n core.cache.cachedSelection = selection || undefined;\n\n if (!option?.ignoreSelection && selection) {\n core.api.setDOMSelection(core, selection);\n } else {\n core.selection.selection = selection;\n }\n\n // Clear pending mutations since we will use our latest model object to replace existing cache\n core.cache.textMutationObserver?.flushMutations();\n core.cache.cachedModel = model;\n }\n\n return selection;\n};\n"]}
@@ -39,7 +39,7 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
39
39
  setRangeSelection(doc, (_b = table.rows[firstRow]) === null || _b === void 0 ? void 0 : _b.cells[firstColumn]);
40
40
  break;
41
41
  case 'range':
42
- (0, addRangeToSelection_1.addRangeToSelection)(doc, selection.range);
42
+ (0, addRangeToSelection_1.addRangeToSelection)(doc, selection.range, selection.isReverted);
43
43
  core.selection.selection = core.api.hasFocus(core) ? null : selection;
44
44
  break;
45
45
  default:
@@ -1 +1 @@
1
- {"version":3,"file":"setDOMSelection.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/setDOMSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { addRangeToSelection } from '../corePlugin/utils/addRangeToSelection';\nimport { isNodeOfType, toArray } from 'roosterjs-content-model-dom';\nimport { parseTableCells } from '../publicApi/domUtils/tableCellUtils';\nimport type {\n SelectionChangedEvent,\n SetDOMSelection,\n TableSelection,\n} from 'roosterjs-content-model-types';\n\nconst IMAGE_ID = 'image';\nconst TABLE_ID = 'table';\nconst CONTENT_DIV_ID = 'contentDiv';\nconst DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\nconst TABLE_CSS_RULE = '{background-color: rgb(198,198,198) !important;}';\nconst CARET_CSS_RULE = '{caret-color: transparent}';\nconst MAX_RULE_SELECTOR_LENGTH = 9000;\n\n/**\n * @internal\n */\nexport const setDOMSelection: SetDOMSelection = (core, selection, skipSelectionChangedEvent) => {\n // We are applying a new selection, so we don't need to apply cached selection in DOMEventPlugin.\n // Set skipReselectOnFocus to skip this behavior\n const skipReselectOnFocus = core.selection.skipReselectOnFocus;\n\n const doc = core.contentDiv.ownerDocument;\n const sheet = core.selection.selectionStyleNode?.sheet;\n\n core.selection.skipReselectOnFocus = true;\n\n try {\n let selectionRules: string[] | undefined;\n const rootSelector = '#' + addUniqueId(core.contentDiv, CONTENT_DIV_ID);\n\n switch (selection?.type) {\n case 'image':\n const image = selection.image;\n\n selectionRules = buildImageCSS(\n rootSelector,\n addUniqueId(image, IMAGE_ID),\n core.selection.imageSelectionBorderColor\n );\n core.selection.selection = selection;\n\n setRangeSelection(doc, image);\n break;\n case 'table':\n const { table, firstColumn, firstRow } = selection;\n\n selectionRules = buildTableCss(\n rootSelector,\n addUniqueId(table, TABLE_ID),\n selection\n );\n core.selection.selection = selection;\n\n setRangeSelection(doc, table.rows[firstRow]?.cells[firstColumn]);\n break;\n case 'range':\n addRangeToSelection(doc, selection.range);\n\n core.selection.selection = core.api.hasFocus(core) ? null : selection;\n break;\n\n default:\n core.selection.selection = null;\n break;\n }\n\n if (sheet) {\n for (let i = sheet.cssRules.length - 1; i >= 0; i--) {\n sheet.deleteRule(i);\n }\n\n if (selectionRules) {\n for (let i = 0; i < selectionRules.length; i++) {\n sheet.insertRule(selectionRules[i]);\n }\n }\n }\n } finally {\n core.selection.skipReselectOnFocus = skipReselectOnFocus;\n }\n\n if (!skipSelectionChangedEvent) {\n const eventData: SelectionChangedEvent = {\n eventType: 'selectionChanged',\n newSelection: selection,\n };\n\n core.api.triggerEvent(core, eventData, true /*broadcast*/);\n }\n};\n\nfunction buildImageCSS(editorSelector: string, imageId: string, borderColor?: string): string[] {\n const color = borderColor || DEFAULT_SELECTION_BORDER_COLOR;\n\n return [\n `${editorSelector} #${imageId} {outline-style:auto!important;outline-color:${color}!important;}`,\n `${editorSelector} ${CARET_CSS_RULE}`,\n ];\n}\n\nfunction buildTableCss(\n editorSelector: string,\n tableId: string,\n selection: TableSelection\n): string[] {\n const { firstColumn, firstRow, lastColumn, lastRow } = selection;\n const cells = parseTableCells(selection.table);\n const isAllTableSelected =\n firstRow == 0 &&\n firstColumn == 0 &&\n lastRow == cells.length - 1 &&\n lastColumn == (cells[lastRow]?.length ?? 0) - 1;\n const rootSelector = editorSelector + ' #' + tableId;\n const selectors = isAllTableSelected\n ? [rootSelector, `${rootSelector} *`]\n : handleTableSelected(rootSelector, selection, cells);\n\n const cssRules: string[] = [`${editorSelector} ${CARET_CSS_RULE}`];\n let currentRules: string = '';\n\n for (let i = 0; i < selectors.length; i++) {\n currentRules += (currentRules.length > 0 ? ',' : '') + selectors[i] || '';\n\n if (\n currentRules.length + (selectors[0]?.length || 0) > MAX_RULE_SELECTOR_LENGTH ||\n i == selectors.length - 1\n ) {\n cssRules.push(currentRules + ' ' + TABLE_CSS_RULE);\n currentRules = '';\n }\n }\n\n return cssRules;\n}\n\nfunction handleTableSelected(\n rootSelector: string,\n selection: TableSelection,\n cells: (HTMLTableCellElement | null)[][]\n) {\n const { firstRow, firstColumn, lastRow, lastColumn, table } = selection;\n const selectors: string[] = [];\n\n // Get whether table has thead, tbody or tfoot, then Set the start and end of each of the table children,\n // so we can build the selector according the element between the table and the row.\n let cont = 0;\n const indexes = toArray(table.childNodes)\n .filter(\n (node): node is HTMLTableSectionElement =>\n ['THEAD', 'TBODY', 'TFOOT'].indexOf(\n isNodeOfType(node, 'ELEMENT_NODE') ? node.tagName : ''\n ) > -1\n )\n .map(node => {\n const result = {\n el: node.tagName,\n start: cont,\n end: node.childNodes.length + cont,\n };\n\n cont = result.end;\n return result;\n });\n\n cells.forEach((row, rowIndex) => {\n let tdCount = 0;\n\n //Get current TBODY/THEAD/TFOOT\n const midElement = indexes.filter(ind => ind.start <= rowIndex && ind.end > rowIndex)[0];\n const middleElSelector = midElement ? '>' + midElement.el + '>' : '>';\n const currentRow =\n midElement && rowIndex + 1 >= midElement.start\n ? rowIndex + 1 - midElement.start\n : rowIndex + 1;\n\n for (let cellIndex = 0; cellIndex < row.length; cellIndex++) {\n const cell = row[cellIndex];\n\n if (cell) {\n tdCount++;\n\n if (\n rowIndex >= firstRow &&\n rowIndex <= lastRow &&\n cellIndex >= firstColumn &&\n cellIndex <= lastColumn\n ) {\n const selector = `${rootSelector}${middleElSelector} tr:nth-child(${currentRow})>${cell.tagName}:nth-child(${tdCount})`;\n\n selectors.push(selector, selector + ' *');\n }\n }\n }\n });\n\n return selectors;\n}\n\nfunction setRangeSelection(doc: Document, element: HTMLElement | undefined) {\n if (element && doc.contains(element)) {\n const range = doc.createRange();\n\n range.selectNode(element);\n range.collapse();\n\n addRangeToSelection(doc, range);\n }\n}\n\nfunction addUniqueId(element: HTMLElement, idPrefix: string): string {\n idPrefix = element.id || idPrefix;\n\n const doc = element.ownerDocument;\n let i = 0;\n\n while (!element.id || doc.querySelectorAll('#' + element.id).length > 1) {\n element.id = idPrefix + '_' + i++;\n }\n\n return element.id;\n}\n"]}
1
+ {"version":3,"file":"setDOMSelection.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/setDOMSelection.ts"],"names":[],"mappings":";;;AAAA,+EAA8E;AAC9E,2EAAoE;AACpE,uEAAuE;AAOvE,IAAM,QAAQ,GAAG,OAAO,CAAC;AACzB,IAAM,QAAQ,GAAG,OAAO,CAAC;AACzB,IAAM,cAAc,GAAG,YAAY,CAAC;AACpC,IAAM,8BAA8B,GAAG,SAAS,CAAC;AACjD,IAAM,cAAc,GAAG,kDAAkD,CAAC;AAC1E,IAAM,cAAc,GAAG,4BAA4B,CAAC;AACpD,IAAM,wBAAwB,GAAG,IAAI,CAAC;AAEtC;;GAEG;AACI,IAAM,eAAe,GAAoB,UAAC,IAAI,EAAE,SAAS,EAAE,yBAAyB;;IACvF,iGAAiG;IACjG,gDAAgD;IAChD,IAAM,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC;IAE/D,IAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;IAC1C,IAAM,KAAK,GAAG,MAAA,IAAI,CAAC,SAAS,CAAC,kBAAkB,0CAAE,KAAK,CAAC;IAEvD,IAAI,CAAC,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAE1C,IAAI;QACA,IAAI,cAAc,SAAsB,CAAC;QACzC,IAAM,YAAY,GAAG,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAExE,QAAQ,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,EAAE;YACrB,KAAK,OAAO;gBACR,IAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;gBAE9B,cAAc,GAAG,aAAa,CAC1B,YAAY,EACZ,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,EAC5B,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAC3C,CAAC;gBACF,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;gBAErC,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC9B,MAAM;YACV,KAAK,OAAO;gBACA,IAAA,KAAK,GAA4B,SAAS,MAArC,EAAE,WAAW,GAAe,SAAS,YAAxB,EAAE,QAAQ,GAAK,SAAS,SAAd,CAAe;gBAEnD,cAAc,GAAG,aAAa,CAC1B,YAAY,EACZ,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,EAC5B,SAAS,CACZ,CAAC;gBACF,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;gBAErC,iBAAiB,CAAC,GAAG,EAAE,MAAA,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,0CAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;gBACjE,MAAM;YACV,KAAK,OAAO;gBACR,IAAA,yCAAmB,EAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;gBAEhE,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;gBACtE,MAAM;YAEV;gBACI,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC;gBAChC,MAAM;SACb;QAED,IAAI,KAAK,EAAE;YACP,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;gBACjD,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;aACvB;YAED,IAAI,cAAc,EAAE;gBAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBAC5C,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;iBACvC;aACJ;SACJ;KACJ;YAAS;QACN,IAAI,CAAC,SAAS,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;KAC5D;IAED,IAAI,CAAC,yBAAyB,EAAE;QAC5B,IAAM,SAAS,GAA0B;YACrC,SAAS,EAAE,kBAAkB;YAC7B,YAAY,EAAE,SAAS;SAC1B,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;KAC9D;AACL,CAAC,CAAC;AAzEW,QAAA,eAAe,mBAyE1B;AAEF,SAAS,aAAa,CAAC,cAAsB,EAAE,OAAe,EAAE,WAAoB;IAChF,IAAM,KAAK,GAAG,WAAW,IAAI,8BAA8B,CAAC;IAE5D,OAAO;QACA,cAAc,UAAK,OAAO,qDAAgD,KAAK,iBAAc;QAC7F,cAAc,SAAI,cAAgB;KACxC,CAAC;AACN,CAAC;AAED,SAAS,aAAa,CAClB,cAAsB,EACtB,OAAe,EACf,SAAyB;;IAEjB,IAAA,WAAW,GAAoC,SAAS,YAA7C,EAAE,QAAQ,GAA0B,SAAS,SAAnC,EAAE,UAAU,GAAc,SAAS,WAAvB,EAAE,OAAO,GAAK,SAAS,QAAd,CAAe;IACjE,IAAM,KAAK,GAAG,IAAA,gCAAe,EAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAM,kBAAkB,GACpB,QAAQ,IAAI,CAAC;QACb,WAAW,IAAI,CAAC;QAChB,OAAO,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAC3B,UAAU,IAAI,CAAC,MAAA,MAAA,KAAK,CAAC,OAAO,CAAC,0CAAE,MAAM,mCAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACpD,IAAM,YAAY,GAAG,cAAc,GAAG,IAAI,GAAG,OAAO,CAAC;IACrD,IAAM,SAAS,GAAG,kBAAkB;QAChC,CAAC,CAAC,CAAC,YAAY,EAAK,YAAY,OAAI,CAAC;QACrC,CAAC,CAAC,mBAAmB,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAE1D,IAAM,QAAQ,GAAa,CAAI,cAAc,SAAI,cAAgB,CAAC,CAAC;IACnE,IAAI,YAAY,GAAW,EAAE,CAAC;IAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACvC,YAAY,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE1E,IACI,YAAY,CAAC,MAAM,GAAG,CAAC,CAAA,MAAA,SAAS,CAAC,CAAC,CAAC,0CAAE,MAAM,KAAI,CAAC,CAAC,GAAG,wBAAwB;YAC5E,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAC3B;YACE,QAAQ,CAAC,IAAI,CAAC,YAAY,GAAG,GAAG,GAAG,cAAc,CAAC,CAAC;YACnD,YAAY,GAAG,EAAE,CAAC;SACrB;KACJ;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,SAAS,mBAAmB,CACxB,YAAoB,EACpB,SAAyB,EACzB,KAAwC;IAEhC,IAAA,QAAQ,GAA8C,SAAS,SAAvD,EAAE,WAAW,GAAiC,SAAS,YAA1C,EAAE,OAAO,GAAwB,SAAS,QAAjC,EAAE,UAAU,GAAY,SAAS,WAArB,EAAE,KAAK,GAAK,SAAS,MAAd,CAAe;IACxE,IAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,yGAAyG;IACzG,oFAAoF;IACpF,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAM,OAAO,GAAG,IAAA,qCAAO,EAAC,KAAK,CAAC,UAAU,CAAC;SACpC,MAAM,CACH,UAAC,IAAI;QACD,OAAA,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,CAC/B,IAAA,0CAAY,EAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CACzD,GAAG,CAAC,CAAC;IAFN,CAEM,CACb;SACA,GAAG,CAAC,UAAA,IAAI;QACL,IAAM,MAAM,GAAG;YACX,EAAE,EAAE,IAAI,CAAC,OAAO;YAChB,KAAK,EAAE,IAAI;YACX,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI;SACrC,CAAC;QAEF,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC;QAClB,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC,CAAC;IAEP,KAAK,CAAC,OAAO,CAAC,UAAC,GAAG,EAAE,QAAQ;QACxB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,+BAA+B;QAC/B,IAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,UAAA,GAAG,IAAI,OAAA,GAAG,CAAC,KAAK,IAAI,QAAQ,IAAI,GAAG,CAAC,GAAG,GAAG,QAAQ,EAA3C,CAA2C,CAAC,CAAC,CAAC,CAAC,CAAC;QACzF,IAAM,gBAAgB,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,UAAU,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACtE,IAAM,UAAU,GACZ,UAAU,IAAI,QAAQ,GAAG,CAAC,IAAI,UAAU,CAAC,KAAK;YAC1C,CAAC,CAAC,QAAQ,GAAG,CAAC,GAAG,UAAU,CAAC,KAAK;YACjC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;QAEvB,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;YACzD,IAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;YAE5B,IAAI,IAAI,EAAE;gBACN,OAAO,EAAE,CAAC;gBAEV,IACI,QAAQ,IAAI,QAAQ;oBACpB,QAAQ,IAAI,OAAO;oBACnB,SAAS,IAAI,WAAW;oBACxB,SAAS,IAAI,UAAU,EACzB;oBACE,IAAM,QAAQ,GAAG,KAAG,YAAY,GAAG,gBAAgB,sBAAiB,UAAU,UAAK,IAAI,CAAC,OAAO,mBAAc,OAAO,MAAG,CAAC;oBAExH,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC,CAAC;iBAC7C;aACJ;SACJ;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAa,EAAE,OAAgC;IACtE,IAAI,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;QAClC,IAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAEhC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC1B,KAAK,CAAC,QAAQ,EAAE,CAAC;QAEjB,IAAA,yCAAmB,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC;KACnC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,OAAoB,EAAE,QAAgB;IACvD,QAAQ,GAAG,OAAO,CAAC,EAAE,IAAI,QAAQ,CAAC;IAElC,IAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC;IAClC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;QACrE,OAAO,CAAC,EAAE,GAAG,QAAQ,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;KACrC;IAED,OAAO,OAAO,CAAC,EAAE,CAAC;AACtB,CAAC","sourcesContent":["import { addRangeToSelection } from '../corePlugin/utils/addRangeToSelection';\nimport { isNodeOfType, toArray } from 'roosterjs-content-model-dom';\nimport { parseTableCells } from '../publicApi/domUtils/tableCellUtils';\nimport type {\n SelectionChangedEvent,\n SetDOMSelection,\n TableSelection,\n} from 'roosterjs-content-model-types';\n\nconst IMAGE_ID = 'image';\nconst TABLE_ID = 'table';\nconst CONTENT_DIV_ID = 'contentDiv';\nconst DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\nconst TABLE_CSS_RULE = '{background-color: rgb(198,198,198) !important;}';\nconst CARET_CSS_RULE = '{caret-color: transparent}';\nconst MAX_RULE_SELECTOR_LENGTH = 9000;\n\n/**\n * @internal\n */\nexport const setDOMSelection: SetDOMSelection = (core, selection, skipSelectionChangedEvent) => {\n // We are applying a new selection, so we don't need to apply cached selection in DOMEventPlugin.\n // Set skipReselectOnFocus to skip this behavior\n const skipReselectOnFocus = core.selection.skipReselectOnFocus;\n\n const doc = core.contentDiv.ownerDocument;\n const sheet = core.selection.selectionStyleNode?.sheet;\n\n core.selection.skipReselectOnFocus = true;\n\n try {\n let selectionRules: string[] | undefined;\n const rootSelector = '#' + addUniqueId(core.contentDiv, CONTENT_DIV_ID);\n\n switch (selection?.type) {\n case 'image':\n const image = selection.image;\n\n selectionRules = buildImageCSS(\n rootSelector,\n addUniqueId(image, IMAGE_ID),\n core.selection.imageSelectionBorderColor\n );\n core.selection.selection = selection;\n\n setRangeSelection(doc, image);\n break;\n case 'table':\n const { table, firstColumn, firstRow } = selection;\n\n selectionRules = buildTableCss(\n rootSelector,\n addUniqueId(table, TABLE_ID),\n selection\n );\n core.selection.selection = selection;\n\n setRangeSelection(doc, table.rows[firstRow]?.cells[firstColumn]);\n break;\n case 'range':\n addRangeToSelection(doc, selection.range, selection.isReverted);\n\n core.selection.selection = core.api.hasFocus(core) ? null : selection;\n break;\n\n default:\n core.selection.selection = null;\n break;\n }\n\n if (sheet) {\n for (let i = sheet.cssRules.length - 1; i >= 0; i--) {\n sheet.deleteRule(i);\n }\n\n if (selectionRules) {\n for (let i = 0; i < selectionRules.length; i++) {\n sheet.insertRule(selectionRules[i]);\n }\n }\n }\n } finally {\n core.selection.skipReselectOnFocus = skipReselectOnFocus;\n }\n\n if (!skipSelectionChangedEvent) {\n const eventData: SelectionChangedEvent = {\n eventType: 'selectionChanged',\n newSelection: selection,\n };\n\n core.api.triggerEvent(core, eventData, true /*broadcast*/);\n }\n};\n\nfunction buildImageCSS(editorSelector: string, imageId: string, borderColor?: string): string[] {\n const color = borderColor || DEFAULT_SELECTION_BORDER_COLOR;\n\n return [\n `${editorSelector} #${imageId} {outline-style:auto!important;outline-color:${color}!important;}`,\n `${editorSelector} ${CARET_CSS_RULE}`,\n ];\n}\n\nfunction buildTableCss(\n editorSelector: string,\n tableId: string,\n selection: TableSelection\n): string[] {\n const { firstColumn, firstRow, lastColumn, lastRow } = selection;\n const cells = parseTableCells(selection.table);\n const isAllTableSelected =\n firstRow == 0 &&\n firstColumn == 0 &&\n lastRow == cells.length - 1 &&\n lastColumn == (cells[lastRow]?.length ?? 0) - 1;\n const rootSelector = editorSelector + ' #' + tableId;\n const selectors = isAllTableSelected\n ? [rootSelector, `${rootSelector} *`]\n : handleTableSelected(rootSelector, selection, cells);\n\n const cssRules: string[] = [`${editorSelector} ${CARET_CSS_RULE}`];\n let currentRules: string = '';\n\n for (let i = 0; i < selectors.length; i++) {\n currentRules += (currentRules.length > 0 ? ',' : '') + selectors[i] || '';\n\n if (\n currentRules.length + (selectors[0]?.length || 0) > MAX_RULE_SELECTOR_LENGTH ||\n i == selectors.length - 1\n ) {\n cssRules.push(currentRules + ' ' + TABLE_CSS_RULE);\n currentRules = '';\n }\n }\n\n return cssRules;\n}\n\nfunction handleTableSelected(\n rootSelector: string,\n selection: TableSelection,\n cells: (HTMLTableCellElement | null)[][]\n) {\n const { firstRow, firstColumn, lastRow, lastColumn, table } = selection;\n const selectors: string[] = [];\n\n // Get whether table has thead, tbody or tfoot, then Set the start and end of each of the table children,\n // so we can build the selector according the element between the table and the row.\n let cont = 0;\n const indexes = toArray(table.childNodes)\n .filter(\n (node): node is HTMLTableSectionElement =>\n ['THEAD', 'TBODY', 'TFOOT'].indexOf(\n isNodeOfType(node, 'ELEMENT_NODE') ? node.tagName : ''\n ) > -1\n )\n .map(node => {\n const result = {\n el: node.tagName,\n start: cont,\n end: node.childNodes.length + cont,\n };\n\n cont = result.end;\n return result;\n });\n\n cells.forEach((row, rowIndex) => {\n let tdCount = 0;\n\n //Get current TBODY/THEAD/TFOOT\n const midElement = indexes.filter(ind => ind.start <= rowIndex && ind.end > rowIndex)[0];\n const middleElSelector = midElement ? '>' + midElement.el + '>' : '>';\n const currentRow =\n midElement && rowIndex + 1 >= midElement.start\n ? rowIndex + 1 - midElement.start\n : rowIndex + 1;\n\n for (let cellIndex = 0; cellIndex < row.length; cellIndex++) {\n const cell = row[cellIndex];\n\n if (cell) {\n tdCount++;\n\n if (\n rowIndex >= firstRow &&\n rowIndex <= lastRow &&\n cellIndex >= firstColumn &&\n cellIndex <= lastColumn\n ) {\n const selector = `${rootSelector}${middleElSelector} tr:nth-child(${currentRow})>${cell.tagName}:nth-child(${tdCount})`;\n\n selectors.push(selector, selector + ' *');\n }\n }\n }\n });\n\n return selectors;\n}\n\nfunction setRangeSelection(doc: Document, element: HTMLElement | undefined) {\n if (element && doc.contains(element)) {\n const range = doc.createRange();\n\n range.selectNode(element);\n range.collapse();\n\n addRangeToSelection(doc, range);\n }\n}\n\nfunction addUniqueId(element: HTMLElement, idPrefix: string): string {\n idPrefix = element.id || idPrefix;\n\n const doc = element.ownerDocument;\n let i = 0;\n\n while (!element.id || doc.querySelectorAll('#' + element.id).length > 1) {\n element.id = idPrefix + '_' + i++;\n }\n\n return element.id;\n}\n"]}
@@ -10,13 +10,10 @@ var roosterjs_content_model_dom_1 = require("roosterjs-content-model-dom");
10
10
  * @param isOn True to switch On, False to switch Off
11
11
  */
12
12
  var switchShadowEdit = function (editorCore, isOn) {
13
- // TODO: Use strong-typed editor core object
14
13
  var core = editorCore;
15
14
  if (isOn != !!core.lifecycle.shadowEditFragment) {
16
15
  if (isOn) {
17
16
  var model = !core.cache.cachedModel ? core.api.createContentModel(core) : null;
18
- // Fake object, not used in Content Model Editor, just to satisfy original editor code
19
- // TODO: we can remove them once we have standalone Content Model Editor
20
17
  var fragment = core.contentDiv.ownerDocument.createDocumentFragment();
21
18
  var clonedRoot = core.contentDiv.cloneNode(true /*deep*/);
22
19
  (0, roosterjs_content_model_dom_1.moveChildNodes)(fragment, clonedRoot);
@@ -1 +1 @@
1
- {"version":3,"file":"switchShadowEdit.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/switchShadowEdit.ts"],"names":[],"mappings":";;;AAAA,8EAA6E;AAC7E,2EAA6D;AAG7D;;;;;GAKG;AACI,IAAM,gBAAgB,GAAqB,UAAC,UAAU,EAAE,IAAI;IAC/D,4CAA4C;IAC5C,IAAM,IAAI,GAAG,UAAU,CAAC;IAExB,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;QAC7C,IAAI,IAAI,EAAE;YACN,IAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAEjF,sFAAsF;YACtF,wEAAwE;YACxE,IAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,sBAAsB,EAAE,CAAC;YACxE,IAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE5D,IAAA,4CAAc,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAErC,IAAI,CAAC,GAAG,CAAC,YAAY,CACjB,IAAI,EACJ;gBACI,SAAS,EAAE,mBAAmB;aACjC,EACD,KAAK,CAAC,aAAa,CACtB,CAAC;YAEF,oIAAoI;YACpI,6DAA6D;YAC7D,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,EAAE;gBAClC,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;aAClC;YAED,IAAI,CAAC,SAAS,CAAC,kBAAkB,GAAG,QAAQ,CAAC;SAChD;aAAM;YACH,IAAI,CAAC,SAAS,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAEzC,IAAI,CAAC,GAAG,CAAC,YAAY,CACjB,IAAI,EACJ;gBACI,SAAS,EAAE,mBAAmB;aACjC,EACD,KAAK,CAAC,aAAa,CACtB,CAAC;YAEF,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBACxB,iDAAiD;gBACjD,IAAA,qCAAiB,EAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,cAAO,CAAC,CAAC,CAAC;gBAEpD,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;oBACnD,eAAe,EAAE,IAAI,EAAE,qGAAqG;iBAC/H,CAAC,CAAC;aACN;SACJ;KACJ;AACL,CAAC,CAAC;AAnDW,QAAA,gBAAgB,oBAmD3B","sourcesContent":["import { iterateSelections } from '../publicApi/selection/iterateSelections';\nimport { moveChildNodes } from 'roosterjs-content-model-dom';\nimport type { SwitchShadowEdit } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Switch the Shadow Edit mode of editor On/Off\n * @param editorCore The StandaloneEditorCore object\n * @param isOn True to switch On, False to switch Off\n */\nexport const switchShadowEdit: SwitchShadowEdit = (editorCore, isOn): void => {\n // TODO: Use strong-typed editor core object\n const core = editorCore;\n\n if (isOn != !!core.lifecycle.shadowEditFragment) {\n if (isOn) {\n const model = !core.cache.cachedModel ? core.api.createContentModel(core) : null;\n\n // Fake object, not used in Content Model Editor, just to satisfy original editor code\n // TODO: we can remove them once we have standalone Content Model Editor\n const fragment = core.contentDiv.ownerDocument.createDocumentFragment();\n const clonedRoot = core.contentDiv.cloneNode(true /*deep*/);\n\n moveChildNodes(fragment, clonedRoot);\n\n core.api.triggerEvent(\n core,\n {\n eventType: 'enteredShadowEdit',\n },\n false /*broadcast*/\n );\n\n // This need to be done after EnteredShadowEdit event is triggered since EnteredShadowEdit event will cause a SelectionChanged event\n // if current selection is table selection or image selection\n if (!core.cache.cachedModel && model) {\n core.cache.cachedModel = model;\n }\n\n core.lifecycle.shadowEditFragment = fragment;\n } else {\n core.lifecycle.shadowEditFragment = null;\n\n core.api.triggerEvent(\n core,\n {\n eventType: 'leavingShadowEdit',\n },\n false /*broadcast*/\n );\n\n if (core.cache.cachedModel) {\n // Force clear cached element from selected block\n iterateSelections(core.cache.cachedModel, () => {});\n\n core.api.setContentModel(core, core.cache.cachedModel, {\n ignoreSelection: true, // Do not set focus and selection when quit shadow edit, focus may remain in UI control (picker, ...)\n });\n }\n }\n }\n};\n"]}
1
+ {"version":3,"file":"switchShadowEdit.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/switchShadowEdit.ts"],"names":[],"mappings":";;;AAAA,8EAA6E;AAC7E,2EAA6D;AAG7D;;;;;GAKG;AACI,IAAM,gBAAgB,GAAqB,UAAC,UAAU,EAAE,IAAI;IAC/D,IAAM,IAAI,GAAG,UAAU,CAAC;IAExB,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;QAC7C,IAAI,IAAI,EAAE;YACN,IAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACjF,IAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,sBAAsB,EAAE,CAAC;YACxE,IAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE5D,IAAA,4CAAc,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAErC,IAAI,CAAC,GAAG,CAAC,YAAY,CACjB,IAAI,EACJ;gBACI,SAAS,EAAE,mBAAmB;aACjC,EACD,KAAK,CAAC,aAAa,CACtB,CAAC;YAEF,oIAAoI;YACpI,6DAA6D;YAC7D,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,EAAE;gBAClC,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;aAClC;YAED,IAAI,CAAC,SAAS,CAAC,kBAAkB,GAAG,QAAQ,CAAC;SAChD;aAAM;YACH,IAAI,CAAC,SAAS,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAEzC,IAAI,CAAC,GAAG,CAAC,YAAY,CACjB,IAAI,EACJ;gBACI,SAAS,EAAE,mBAAmB;aACjC,EACD,KAAK,CAAC,aAAa,CACtB,CAAC;YAEF,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBACxB,iDAAiD;gBACjD,IAAA,qCAAiB,EAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,cAAO,CAAC,CAAC,CAAC;gBAEpD,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;oBACnD,eAAe,EAAE,IAAI,EAAE,qGAAqG;iBAC/H,CAAC,CAAC;aACN;SACJ;KACJ;AACL,CAAC,CAAC;AA/CW,QAAA,gBAAgB,oBA+C3B","sourcesContent":["import { iterateSelections } from '../publicApi/selection/iterateSelections';\nimport { moveChildNodes } from 'roosterjs-content-model-dom';\nimport type { SwitchShadowEdit } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Switch the Shadow Edit mode of editor On/Off\n * @param editorCore The StandaloneEditorCore object\n * @param isOn True to switch On, False to switch Off\n */\nexport const switchShadowEdit: SwitchShadowEdit = (editorCore, isOn): void => {\n const core = editorCore;\n\n if (isOn != !!core.lifecycle.shadowEditFragment) {\n if (isOn) {\n const model = !core.cache.cachedModel ? core.api.createContentModel(core) : null;\n const fragment = core.contentDiv.ownerDocument.createDocumentFragment();\n const clonedRoot = core.contentDiv.cloneNode(true /*deep*/);\n\n moveChildNodes(fragment, clonedRoot);\n\n core.api.triggerEvent(\n core,\n {\n eventType: 'enteredShadowEdit',\n },\n false /*broadcast*/\n );\n\n // This need to be done after EnteredShadowEdit event is triggered since EnteredShadowEdit event will cause a SelectionChanged event\n // if current selection is table selection or image selection\n if (!core.cache.cachedModel && model) {\n core.cache.cachedModel = model;\n }\n\n core.lifecycle.shadowEditFragment = fragment;\n } else {\n core.lifecycle.shadowEditFragment = null;\n\n core.api.triggerEvent(\n core,\n {\n eventType: 'leavingShadowEdit',\n },\n false /*broadcast*/\n );\n\n if (core.cache.cachedModel) {\n // Force clear cached element from selected block\n iterateSelections(core.cache.cachedModel, () => {});\n\n core.api.setContentModel(core, core.cache.cachedModel, {\n ignoreSelection: true, // Do not set focus and selection when quit shadow edit, focus may remain in UI control (picker, ...)\n });\n }\n }\n }\n};\n"]}
@@ -3,5 +3,6 @@ import type { ContentModelCachePluginState, PluginWithState, StandaloneEditorOpt
3
3
  * @internal
4
4
  * Create a new instance of ContentModelCachePlugin class.
5
5
  * @param option The editor option
6
+ * @param contentDiv The editor content DIV
6
7
  */
7
- export declare function createContentModelCachePlugin(option: StandaloneEditorOptions): PluginWithState<ContentModelCachePluginState>;
8
+ export declare function createContentModelCachePlugin(option: StandaloneEditorOptions, contentDiv: HTMLDivElement): PluginWithState<ContentModelCachePluginState>;