roosterjs-content-model-core 0.23.1 → 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.
- package/lib/coreApi/addUndoSnapshot.js +9 -6
- package/lib/coreApi/addUndoSnapshot.js.map +1 -1
- package/lib/coreApi/attachDomEvent.js.map +1 -1
- package/lib/coreApi/createContentModel.js +10 -9
- package/lib/coreApi/createContentModel.js.map +1 -1
- package/lib/coreApi/createEditorContext.js +6 -12
- package/lib/coreApi/createEditorContext.js.map +1 -1
- package/lib/coreApi/formatContentModel.js +2 -4
- package/lib/coreApi/formatContentModel.js.map +1 -1
- package/lib/coreApi/getDOMSelection.js +19 -4
- package/lib/coreApi/getDOMSelection.js.map +1 -1
- package/lib/coreApi/getVisibleViewport.js.map +1 -1
- package/lib/coreApi/paste.js +15 -23
- package/lib/coreApi/paste.js.map +1 -1
- package/lib/coreApi/restoreUndoSnapshot.js +2 -2
- package/lib/coreApi/restoreUndoSnapshot.js.map +1 -1
- package/lib/coreApi/setContentModel.js +7 -3
- package/lib/coreApi/setContentModel.js.map +1 -1
- package/lib/coreApi/setDOMSelection.js +3 -4
- package/lib/coreApi/setDOMSelection.js.map +1 -1
- package/lib/coreApi/switchShadowEdit.js +2 -7
- package/lib/coreApi/switchShadowEdit.js.map +1 -1
- package/lib/coreApi/triggerEvent.js +4 -4
- package/lib/coreApi/triggerEvent.js.map +1 -1
- package/lib/corePlugin/ContentModelCachePlugin.d.ts +3 -3
- package/lib/corePlugin/ContentModelCachePlugin.js +39 -51
- package/lib/corePlugin/ContentModelCachePlugin.js.map +1 -1
- package/lib/corePlugin/ContentModelCopyPastePlugin.d.ts +1 -2
- package/lib/corePlugin/ContentModelCopyPastePlugin.js +5 -20
- package/lib/corePlugin/ContentModelCopyPastePlugin.js.map +1 -1
- package/lib/corePlugin/ContentModelFormatPlugin.d.ts +1 -2
- package/lib/corePlugin/ContentModelFormatPlugin.js +5 -6
- package/lib/corePlugin/ContentModelFormatPlugin.js.map +1 -1
- package/lib/corePlugin/ContextMenuPlugin.d.ts +6 -0
- package/lib/corePlugin/ContextMenuPlugin.js +112 -0
- package/lib/corePlugin/ContextMenuPlugin.js.map +1 -0
- package/lib/corePlugin/DOMEventPlugin.d.ts +1 -2
- package/lib/corePlugin/DOMEventPlugin.js +10 -10
- package/lib/corePlugin/DOMEventPlugin.js.map +1 -1
- package/lib/corePlugin/EntityPlugin.d.ts +1 -2
- package/lib/corePlugin/EntityPlugin.js +14 -23
- package/lib/corePlugin/EntityPlugin.js.map +1 -1
- package/lib/corePlugin/LifecyclePlugin.d.ts +1 -2
- package/lib/corePlugin/LifecyclePlugin.js +6 -22
- package/lib/corePlugin/LifecyclePlugin.js.map +1 -1
- package/lib/corePlugin/SelectionPlugin.d.ts +1 -2
- package/lib/corePlugin/SelectionPlugin.js +22 -26
- package/lib/corePlugin/SelectionPlugin.js.map +1 -1
- package/lib/corePlugin/UndoPlugin.d.ts +1 -2
- package/lib/corePlugin/UndoPlugin.js +8 -8
- package/lib/corePlugin/UndoPlugin.js.map +1 -1
- package/lib/corePlugin/createStandaloneEditorCorePlugins.js +3 -1
- package/lib/corePlugin/createStandaloneEditorCorePlugins.js.map +1 -1
- package/lib/corePlugin/utils/addRangeToSelection.d.ts +1 -1
- package/lib/corePlugin/utils/addRangeToSelection.js +8 -2
- package/lib/corePlugin/utils/addRangeToSelection.js.map +1 -1
- package/lib/corePlugin/utils/applyDefaultFormat.js +1 -1
- package/lib/corePlugin/utils/applyDefaultFormat.js.map +1 -1
- package/lib/corePlugin/utils/textMutationObserver.d.ts +5 -0
- package/lib/corePlugin/utils/textMutationObserver.js +43 -0
- package/lib/corePlugin/utils/textMutationObserver.js.map +1 -0
- package/lib/editor/DOMHelperImpl.d.ts +5 -0
- package/lib/editor/DOMHelperImpl.js +32 -0
- package/lib/editor/DOMHelperImpl.js.map +1 -0
- package/lib/editor/DarkColorHandlerImpl.d.ts +2 -53
- package/lib/editor/DarkColorHandlerImpl.js +27 -170
- package/lib/editor/DarkColorHandlerImpl.js.map +1 -1
- package/lib/editor/SnapshotsManagerImpl.d.ts +1 -0
- package/lib/editor/SnapshotsManagerImpl.js +10 -4
- package/lib/editor/SnapshotsManagerImpl.js.map +1 -1
- package/lib/editor/StandaloneEditor.d.ts +26 -28
- package/lib/editor/StandaloneEditor.js +68 -38
- package/lib/editor/StandaloneEditor.js.map +1 -1
- package/lib/editor/createStandaloneEditorCore.js +5 -2
- package/lib/editor/createStandaloneEditorCore.js.map +1 -1
- package/lib/index.d.ts +0 -1
- package/lib/index.js +1 -3
- package/lib/index.js.map +1 -1
- package/{lib-mjs/override/containerWidthFormatParser.d.ts → lib/override/containerSizeFormatParser.d.ts} +1 -1
- package/lib/override/{containerWidthFormatParser.js → containerSizeFormatParser.js} +5 -4
- package/lib/override/containerSizeFormatParser.js.map +1 -0
- package/lib/override/reducedModelChildProcessor.d.ts +21 -0
- package/lib/override/reducedModelChildProcessor.js +66 -0
- package/lib/override/reducedModelChildProcessor.js.map +1 -0
- package/lib/publicApi/color/transformColor.d.ts +2 -2
- package/lib/publicApi/color/transformColor.js +5 -1
- package/lib/publicApi/color/transformColor.js.map +1 -1
- package/lib/publicApi/domUtils/borderValues.js +1 -1
- package/lib/publicApi/domUtils/borderValues.js.map +1 -1
- package/lib/publicApi/model/createModelFromHtml.d.ts +1 -2
- package/lib/publicApi/model/createModelFromHtml.js.map +1 -1
- package/lib/publicApi/selection/deleteBlock.js +3 -0
- package/lib/publicApi/selection/deleteBlock.js.map +1 -1
- package/lib/publicApi/selection/deleteSegment.js +3 -2
- package/lib/publicApi/selection/deleteSegment.js.map +1 -1
- package/lib/publicApi/selection/iterateSelections.js +0 -2
- package/lib/publicApi/selection/iterateSelections.js.map +1 -1
- package/lib/publicApi/table/setTableCellBackgroundColor.d.ts +0 -6
- package/lib/publicApi/table/setTableCellBackgroundColor.js +3 -34
- package/lib/publicApi/table/setTableCellBackgroundColor.js.map +1 -1
- package/lib/utils/createSnapshotSelection.d.ts +2 -2
- package/lib/utils/createSnapshotSelection.js +77 -1
- package/lib/utils/createSnapshotSelection.js.map +1 -1
- package/lib/utils/paste/createPasteFragment.js +1 -4
- package/lib/utils/paste/createPasteFragment.js.map +1 -1
- package/lib/utils/paste/generatePasteOptionFromPlugins.d.ts +2 -2
- package/lib/utils/paste/generatePasteOptionFromPlugins.js +2 -24
- package/lib/utils/paste/generatePasteOptionFromPlugins.js.map +1 -1
- package/lib/utils/paste/mergePasteContent.d.ts +2 -2
- package/lib/utils/paste/mergePasteContent.js +38 -28
- package/lib/utils/paste/mergePasteContent.js.map +1 -1
- package/lib/utils/restoreSnapshotColors.js +2 -5
- package/lib/utils/restoreSnapshotColors.js.map +1 -1
- package/lib/utils/restoreSnapshotSelection.js +1 -0
- package/lib/utils/restoreSnapshotSelection.js.map +1 -1
- package/lib-amd/coreApi/addUndoSnapshot.js +9 -6
- package/lib-amd/coreApi/addUndoSnapshot.js.map +1 -1
- package/lib-amd/coreApi/attachDomEvent.js.map +1 -1
- package/lib-amd/coreApi/createContentModel.js +10 -9
- package/lib-amd/coreApi/createContentModel.js.map +1 -1
- package/lib-amd/coreApi/createEditorContext.js +6 -12
- package/lib-amd/coreApi/createEditorContext.js.map +1 -1
- package/lib-amd/coreApi/formatContentModel.js +2 -4
- package/lib-amd/coreApi/formatContentModel.js.map +1 -1
- package/lib-amd/coreApi/getDOMSelection.js +19 -4
- package/lib-amd/coreApi/getDOMSelection.js.map +1 -1
- package/lib-amd/coreApi/getVisibleViewport.js.map +1 -1
- package/lib-amd/coreApi/paste.js +16 -23
- package/lib-amd/coreApi/paste.js.map +1 -1
- package/lib-amd/coreApi/restoreUndoSnapshot.js +2 -2
- package/lib-amd/coreApi/restoreUndoSnapshot.js.map +1 -1
- package/lib-amd/coreApi/setContentModel.js +7 -3
- package/lib-amd/coreApi/setContentModel.js.map +1 -1
- package/lib-amd/coreApi/setDOMSelection.js +3 -4
- package/lib-amd/coreApi/setDOMSelection.js.map +1 -1
- package/lib-amd/coreApi/switchShadowEdit.js +2 -7
- package/lib-amd/coreApi/switchShadowEdit.js.map +1 -1
- package/lib-amd/coreApi/triggerEvent.js +4 -4
- package/lib-amd/coreApi/triggerEvent.js.map +1 -1
- package/lib-amd/corePlugin/ContentModelCachePlugin.d.ts +3 -3
- package/lib-amd/corePlugin/ContentModelCachePlugin.js +39 -51
- package/lib-amd/corePlugin/ContentModelCachePlugin.js.map +1 -1
- package/lib-amd/corePlugin/ContentModelCopyPastePlugin.d.ts +1 -2
- package/lib-amd/corePlugin/ContentModelCopyPastePlugin.js +6 -19
- package/lib-amd/corePlugin/ContentModelCopyPastePlugin.js.map +1 -1
- package/lib-amd/corePlugin/ContentModelFormatPlugin.d.ts +1 -2
- package/lib-amd/corePlugin/ContentModelFormatPlugin.js +5 -6
- package/lib-amd/corePlugin/ContentModelFormatPlugin.js.map +1 -1
- package/lib-amd/corePlugin/ContextMenuPlugin.d.ts +6 -0
- package/lib-amd/corePlugin/ContextMenuPlugin.js +112 -0
- package/lib-amd/corePlugin/ContextMenuPlugin.js.map +1 -0
- package/lib-amd/corePlugin/DOMEventPlugin.d.ts +1 -2
- package/lib-amd/corePlugin/DOMEventPlugin.js +10 -10
- package/lib-amd/corePlugin/DOMEventPlugin.js.map +1 -1
- package/lib-amd/corePlugin/EntityPlugin.d.ts +1 -2
- package/lib-amd/corePlugin/EntityPlugin.js +14 -23
- package/lib-amd/corePlugin/EntityPlugin.js.map +1 -1
- package/lib-amd/corePlugin/LifecyclePlugin.d.ts +1 -2
- package/lib-amd/corePlugin/LifecyclePlugin.js +6 -22
- package/lib-amd/corePlugin/LifecyclePlugin.js.map +1 -1
- package/lib-amd/corePlugin/SelectionPlugin.d.ts +1 -2
- package/lib-amd/corePlugin/SelectionPlugin.js +22 -26
- package/lib-amd/corePlugin/SelectionPlugin.js.map +1 -1
- package/lib-amd/corePlugin/UndoPlugin.d.ts +1 -2
- package/lib-amd/corePlugin/UndoPlugin.js +8 -8
- package/lib-amd/corePlugin/UndoPlugin.js.map +1 -1
- package/lib-amd/corePlugin/createStandaloneEditorCorePlugins.js +3 -2
- package/lib-amd/corePlugin/createStandaloneEditorCorePlugins.js.map +1 -1
- package/lib-amd/corePlugin/utils/addRangeToSelection.d.ts +1 -1
- package/lib-amd/corePlugin/utils/addRangeToSelection.js +8 -2
- package/lib-amd/corePlugin/utils/addRangeToSelection.js.map +1 -1
- package/lib-amd/corePlugin/utils/applyDefaultFormat.js +1 -1
- package/lib-amd/corePlugin/utils/applyDefaultFormat.js.map +1 -1
- package/lib-amd/corePlugin/utils/textMutationObserver.d.ts +5 -0
- package/lib-amd/corePlugin/utils/textMutationObserver.js +45 -0
- package/lib-amd/corePlugin/utils/textMutationObserver.js.map +1 -0
- package/lib-amd/editor/DOMHelperImpl.d.ts +5 -0
- package/lib-amd/editor/DOMHelperImpl.js +33 -0
- package/lib-amd/editor/DOMHelperImpl.js.map +1 -0
- package/lib-amd/editor/DarkColorHandlerImpl.d.ts +2 -53
- package/lib-amd/editor/DarkColorHandlerImpl.js +28 -170
- package/lib-amd/editor/DarkColorHandlerImpl.js.map +1 -1
- package/lib-amd/editor/SnapshotsManagerImpl.d.ts +1 -0
- package/lib-amd/editor/SnapshotsManagerImpl.js +10 -4
- package/lib-amd/editor/SnapshotsManagerImpl.js.map +1 -1
- package/lib-amd/editor/StandaloneEditor.d.ts +26 -28
- package/lib-amd/editor/StandaloneEditor.js +66 -39
- package/lib-amd/editor/StandaloneEditor.js.map +1 -1
- package/lib-amd/editor/createStandaloneEditorCore.js +5 -3
- package/lib-amd/editor/createStandaloneEditorCore.js.map +1 -1
- package/lib-amd/index.d.ts +0 -1
- package/lib-amd/index.js +2 -3
- package/lib-amd/index.js.map +1 -1
- package/lib-amd/override/{containerWidthFormatParser.d.ts → containerSizeFormatParser.d.ts} +1 -1
- package/lib-amd/override/{containerWidthFormatParser.js → containerSizeFormatParser.js} +5 -4
- package/lib-amd/override/containerSizeFormatParser.js.map +1 -0
- package/lib-amd/override/reducedModelChildProcessor.d.ts +21 -0
- package/lib-amd/override/reducedModelChildProcessor.js +65 -0
- package/lib-amd/override/reducedModelChildProcessor.js.map +1 -0
- package/lib-amd/publicApi/color/transformColor.d.ts +2 -2
- package/lib-amd/publicApi/color/transformColor.js +5 -2
- package/lib-amd/publicApi/color/transformColor.js.map +1 -1
- package/lib-amd/publicApi/domUtils/borderValues.js +1 -1
- package/lib-amd/publicApi/domUtils/borderValues.js.map +1 -1
- package/lib-amd/publicApi/model/createModelFromHtml.d.ts +1 -2
- package/lib-amd/publicApi/model/createModelFromHtml.js.map +1 -1
- package/lib-amd/publicApi/selection/deleteBlock.js +3 -0
- package/lib-amd/publicApi/selection/deleteBlock.js.map +1 -1
- package/lib-amd/publicApi/selection/deleteSegment.js +3 -2
- package/lib-amd/publicApi/selection/deleteSegment.js.map +1 -1
- package/lib-amd/publicApi/selection/iterateSelections.js +0 -2
- package/lib-amd/publicApi/selection/iterateSelections.js.map +1 -1
- package/lib-amd/publicApi/table/setTableCellBackgroundColor.d.ts +0 -6
- package/lib-amd/publicApi/table/setTableCellBackgroundColor.js +3 -35
- package/lib-amd/publicApi/table/setTableCellBackgroundColor.js.map +1 -1
- package/lib-amd/utils/createSnapshotSelection.d.ts +2 -2
- package/lib-amd/utils/createSnapshotSelection.js +77 -1
- package/lib-amd/utils/createSnapshotSelection.js.map +1 -1
- package/lib-amd/utils/paste/createPasteFragment.js +1 -4
- package/lib-amd/utils/paste/createPasteFragment.js.map +1 -1
- package/lib-amd/utils/paste/generatePasteOptionFromPlugins.d.ts +2 -2
- package/lib-amd/utils/paste/generatePasteOptionFromPlugins.js +2 -24
- package/lib-amd/utils/paste/generatePasteOptionFromPlugins.js.map +1 -1
- package/lib-amd/utils/paste/mergePasteContent.d.ts +2 -2
- package/lib-amd/utils/paste/mergePasteContent.js +37 -28
- package/lib-amd/utils/paste/mergePasteContent.js.map +1 -1
- package/lib-amd/utils/restoreSnapshotColors.js +2 -5
- package/lib-amd/utils/restoreSnapshotColors.js.map +1 -1
- package/lib-amd/utils/restoreSnapshotSelection.js +1 -0
- package/lib-amd/utils/restoreSnapshotSelection.js.map +1 -1
- package/lib-mjs/coreApi/addUndoSnapshot.js +9 -6
- package/lib-mjs/coreApi/addUndoSnapshot.js.map +1 -1
- package/lib-mjs/coreApi/attachDomEvent.js.map +1 -1
- package/lib-mjs/coreApi/createContentModel.js +10 -9
- package/lib-mjs/coreApi/createContentModel.js.map +1 -1
- package/lib-mjs/coreApi/createEditorContext.js +6 -12
- package/lib-mjs/coreApi/createEditorContext.js.map +1 -1
- package/lib-mjs/coreApi/formatContentModel.js +2 -4
- package/lib-mjs/coreApi/formatContentModel.js.map +1 -1
- package/lib-mjs/coreApi/getDOMSelection.js +19 -4
- package/lib-mjs/coreApi/getDOMSelection.js.map +1 -1
- package/lib-mjs/coreApi/getVisibleViewport.js.map +1 -1
- package/lib-mjs/coreApi/paste.js +15 -23
- package/lib-mjs/coreApi/paste.js.map +1 -1
- package/lib-mjs/coreApi/restoreUndoSnapshot.js +2 -2
- package/lib-mjs/coreApi/restoreUndoSnapshot.js.map +1 -1
- package/lib-mjs/coreApi/setContentModel.js +7 -3
- package/lib-mjs/coreApi/setContentModel.js.map +1 -1
- package/lib-mjs/coreApi/setDOMSelection.js +3 -4
- package/lib-mjs/coreApi/setDOMSelection.js.map +1 -1
- package/lib-mjs/coreApi/switchShadowEdit.js +2 -7
- package/lib-mjs/coreApi/switchShadowEdit.js.map +1 -1
- package/lib-mjs/coreApi/triggerEvent.js +4 -4
- package/lib-mjs/coreApi/triggerEvent.js.map +1 -1
- package/lib-mjs/corePlugin/ContentModelCachePlugin.d.ts +3 -3
- package/lib-mjs/corePlugin/ContentModelCachePlugin.js +39 -51
- package/lib-mjs/corePlugin/ContentModelCachePlugin.js.map +1 -1
- package/lib-mjs/corePlugin/ContentModelCopyPastePlugin.d.ts +1 -2
- package/lib-mjs/corePlugin/ContentModelCopyPastePlugin.js +5 -20
- package/lib-mjs/corePlugin/ContentModelCopyPastePlugin.js.map +1 -1
- package/lib-mjs/corePlugin/ContentModelFormatPlugin.d.ts +1 -2
- package/lib-mjs/corePlugin/ContentModelFormatPlugin.js +5 -6
- package/lib-mjs/corePlugin/ContentModelFormatPlugin.js.map +1 -1
- package/lib-mjs/corePlugin/ContextMenuPlugin.d.ts +6 -0
- package/lib-mjs/corePlugin/ContextMenuPlugin.js +108 -0
- package/lib-mjs/corePlugin/ContextMenuPlugin.js.map +1 -0
- package/lib-mjs/corePlugin/DOMEventPlugin.d.ts +1 -2
- package/lib-mjs/corePlugin/DOMEventPlugin.js +10 -10
- package/lib-mjs/corePlugin/DOMEventPlugin.js.map +1 -1
- package/lib-mjs/corePlugin/EntityPlugin.d.ts +1 -2
- package/lib-mjs/corePlugin/EntityPlugin.js +14 -23
- package/lib-mjs/corePlugin/EntityPlugin.js.map +1 -1
- package/lib-mjs/corePlugin/LifecyclePlugin.d.ts +1 -2
- package/lib-mjs/corePlugin/LifecyclePlugin.js +7 -23
- package/lib-mjs/corePlugin/LifecyclePlugin.js.map +1 -1
- package/lib-mjs/corePlugin/SelectionPlugin.d.ts +1 -2
- package/lib-mjs/corePlugin/SelectionPlugin.js +22 -26
- package/lib-mjs/corePlugin/SelectionPlugin.js.map +1 -1
- package/lib-mjs/corePlugin/UndoPlugin.d.ts +1 -2
- package/lib-mjs/corePlugin/UndoPlugin.js +8 -8
- package/lib-mjs/corePlugin/UndoPlugin.js.map +1 -1
- package/lib-mjs/corePlugin/createStandaloneEditorCorePlugins.js +3 -1
- package/lib-mjs/corePlugin/createStandaloneEditorCorePlugins.js.map +1 -1
- package/lib-mjs/corePlugin/utils/addRangeToSelection.d.ts +1 -1
- package/lib-mjs/corePlugin/utils/addRangeToSelection.js +8 -2
- package/lib-mjs/corePlugin/utils/addRangeToSelection.js.map +1 -1
- package/lib-mjs/corePlugin/utils/applyDefaultFormat.js +1 -1
- package/lib-mjs/corePlugin/utils/applyDefaultFormat.js.map +1 -1
- package/lib-mjs/corePlugin/utils/textMutationObserver.d.ts +5 -0
- package/lib-mjs/corePlugin/utils/textMutationObserver.js +39 -0
- package/lib-mjs/corePlugin/utils/textMutationObserver.js.map +1 -0
- package/lib-mjs/editor/DOMHelperImpl.d.ts +5 -0
- package/lib-mjs/editor/DOMHelperImpl.js +28 -0
- package/lib-mjs/editor/DOMHelperImpl.js.map +1 -0
- package/lib-mjs/editor/DarkColorHandlerImpl.d.ts +2 -53
- package/lib-mjs/editor/DarkColorHandlerImpl.js +26 -169
- package/lib-mjs/editor/DarkColorHandlerImpl.js.map +1 -1
- package/lib-mjs/editor/SnapshotsManagerImpl.d.ts +1 -0
- package/lib-mjs/editor/SnapshotsManagerImpl.js +10 -4
- package/lib-mjs/editor/SnapshotsManagerImpl.js.map +1 -1
- package/lib-mjs/editor/StandaloneEditor.d.ts +26 -28
- package/lib-mjs/editor/StandaloneEditor.js +68 -38
- package/lib-mjs/editor/StandaloneEditor.js.map +1 -1
- package/lib-mjs/editor/createStandaloneEditorCore.js +5 -2
- package/lib-mjs/editor/createStandaloneEditorCore.js.map +1 -1
- package/lib-mjs/index.d.ts +0 -1
- package/lib-mjs/index.js +0 -1
- package/lib-mjs/index.js.map +1 -1
- package/{lib/override/containerWidthFormatParser.d.ts → lib-mjs/override/containerSizeFormatParser.d.ts} +1 -1
- package/lib-mjs/override/{containerWidthFormatParser.js → containerSizeFormatParser.js} +3 -2
- package/lib-mjs/override/containerSizeFormatParser.js.map +1 -0
- package/lib-mjs/override/reducedModelChildProcessor.d.ts +21 -0
- package/lib-mjs/override/reducedModelChildProcessor.js +62 -0
- package/lib-mjs/override/reducedModelChildProcessor.js.map +1 -0
- package/lib-mjs/publicApi/color/transformColor.d.ts +2 -2
- package/lib-mjs/publicApi/color/transformColor.js +5 -1
- package/lib-mjs/publicApi/color/transformColor.js.map +1 -1
- package/lib-mjs/publicApi/domUtils/borderValues.js +1 -1
- package/lib-mjs/publicApi/domUtils/borderValues.js.map +1 -1
- package/lib-mjs/publicApi/model/createModelFromHtml.d.ts +1 -2
- package/lib-mjs/publicApi/model/createModelFromHtml.js.map +1 -1
- package/lib-mjs/publicApi/selection/deleteBlock.js +3 -0
- package/lib-mjs/publicApi/selection/deleteBlock.js.map +1 -1
- package/lib-mjs/publicApi/selection/deleteSegment.js +3 -2
- package/lib-mjs/publicApi/selection/deleteSegment.js.map +1 -1
- package/lib-mjs/publicApi/selection/iterateSelections.js +0 -2
- package/lib-mjs/publicApi/selection/iterateSelections.js.map +1 -1
- package/lib-mjs/publicApi/table/setTableCellBackgroundColor.d.ts +0 -6
- package/lib-mjs/publicApi/table/setTableCellBackgroundColor.js +1 -31
- package/lib-mjs/publicApi/table/setTableCellBackgroundColor.js.map +1 -1
- package/lib-mjs/utils/createSnapshotSelection.d.ts +2 -2
- package/lib-mjs/utils/createSnapshotSelection.js +78 -2
- package/lib-mjs/utils/createSnapshotSelection.js.map +1 -1
- package/lib-mjs/utils/paste/createPasteFragment.js +1 -4
- package/lib-mjs/utils/paste/createPasteFragment.js.map +1 -1
- package/lib-mjs/utils/paste/generatePasteOptionFromPlugins.d.ts +2 -2
- package/lib-mjs/utils/paste/generatePasteOptionFromPlugins.js +2 -24
- package/lib-mjs/utils/paste/generatePasteOptionFromPlugins.js.map +1 -1
- package/lib-mjs/utils/paste/mergePasteContent.d.ts +2 -2
- package/lib-mjs/utils/paste/mergePasteContent.js +38 -28
- package/lib-mjs/utils/paste/mergePasteContent.js.map +1 -1
- package/lib-mjs/utils/restoreSnapshotColors.js +2 -5
- package/lib-mjs/utils/restoreSnapshotColors.js.map +1 -1
- package/lib-mjs/utils/restoreSnapshotSelection.js +1 -0
- package/lib-mjs/utils/restoreSnapshotSelection.js.map +1 -1
- package/package.json +3 -4
- package/lib/override/containerWidthFormatParser.js.map +0 -1
- package/lib-amd/override/containerWidthFormatParser.js.map +0 -1
- package/lib-mjs/override/containerWidthFormatParser.js.map +0 -1
|
@@ -12,19 +12,22 @@ 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,
|
|
15
|
+
var lifecycle = core.lifecycle, contentDiv = core.contentDiv, undo = core.undo;
|
|
16
|
+
var snapshot = null;
|
|
16
17
|
if (!lifecycle.shadowEditFragment) {
|
|
17
|
-
|
|
18
|
-
var
|
|
19
|
-
|
|
20
|
-
|
|
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;
|
|
21
|
+
snapshot = {
|
|
22
|
+
html: html,
|
|
21
23
|
entityStates: entityStates,
|
|
22
24
|
isDarkMode: !!lifecycle.isDarkMode,
|
|
23
|
-
selection:
|
|
25
|
+
selection: selection,
|
|
24
26
|
};
|
|
25
27
|
undo.snapshotsManager.addSnapshot(snapshot, !!canUndoByBackspace);
|
|
26
28
|
undo.snapshotsManager.hasNewContent = false;
|
|
27
29
|
}
|
|
30
|
+
return snapshot;
|
|
28
31
|
};
|
|
29
32
|
exports.addUndoSnapshot = addUndoSnapshot;
|
|
30
33
|
//# sourceMappingURL=addUndoSnapshot.js.map
|
|
@@ -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,
|
|
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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachDomEvent.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/attachDomEvent.ts"],"names":[],"mappings":";;;AAAA,2EAA4D;
|
|
1
|
+
{"version":3,"file":"attachDomEvent.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/attachDomEvent.ts"],"names":[],"mappings":";;;AAAA,2EAA4D;AAG5D;;;;;;;GAOG;AACI,IAAM,cAAc,GAAmB,UAAC,IAAI,EAAE,QAAQ;IACzD,IAAM,SAAS,GAAG,IAAA,2CAAa,EAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,UAAA,GAAG;QAC7C,IAAA,KAAsC,QAAQ,CAAC,GAAG,CAAC,EAAjD,eAAe,qBAAA,EAAE,cAAc,oBAAkB,CAAC;QAC1D,IAAM,SAAS,GAAG,GAAgC,CAAC;QACnD,IAAM,OAAO,GAAG,UAAC,KAA4C;YACzD,IAAI,cAAc,EAAE;gBAChB,cAAc,CAAC,KAAK,CAAC,CAAC;aACzB;YAED,IAAI,eAAe,IAAI,IAAI,EAAE;gBACzB,IAAI,CAAC,GAAG,CAAC,YAAY,CACjB,IAAI,EACS;oBACT,SAAS,EAAE,eAAe;oBAC1B,QAAQ,EAAE,KAAK;iBAClB,EACD,KAAK,CAAC,aAAa,CACtB,CAAC;aACL;QACL,CAAC,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAErD,OAAO;YACH,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5D,CAAC,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,OAAO,cAAM,OAAA,SAAS,CAAC,OAAO,CAAC,UAAA,SAAS,IAAI,OAAA,SAAS,EAAE,EAAX,CAAW,CAAC,EAA3C,CAA2C,CAAC;AAC7D,CAAC,CAAC;AA7BW,QAAA,cAAc,kBA6BzB","sourcesContent":["import { getObjectKeys } from 'roosterjs-content-model-dom';\nimport type { AttachDomEvent, PluginEvent } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Attach a DOM event to the editor content DIV\n * @param core The StandaloneEditorCore object\n * @param eventName The DOM event name\n * @param pluginEventType Optional event type. When specified, editor will trigger a plugin event with this name when the DOM event is triggered\n * @param beforeDispatch Optional callback function to be invoked when the DOM event is triggered before trigger plugin event\n */\nexport const attachDomEvent: AttachDomEvent = (core, eventMap) => {\n const disposers = getObjectKeys(eventMap || {}).map(key => {\n const { pluginEventType, beforeDispatch } = eventMap[key];\n const eventName = key as keyof HTMLElementEventMap;\n const onEvent = (event: HTMLElementEventMap[typeof eventName]) => {\n if (beforeDispatch) {\n beforeDispatch(event);\n }\n\n if (pluginEventType != null) {\n core.api.triggerEvent(\n core,\n <PluginEvent>{\n eventType: pluginEventType,\n rawEvent: event,\n },\n false /*broadcast*/\n );\n }\n };\n\n core.contentDiv.addEventListener(eventName, onEvent);\n\n return () => {\n core.contentDiv.removeEventListener(eventName, onEvent);\n };\n });\n\n return () => disposers.forEach(disposers => disposers());\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
|
|
25
|
-
|
|
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;
|
|
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,29 +5,23 @@ exports.createEditorContext = void 0;
|
|
|
5
5
|
* @internal
|
|
6
6
|
* Create a EditorContext object used by ContentModel API
|
|
7
7
|
*/
|
|
8
|
-
var createEditorContext = function (core) {
|
|
9
|
-
var
|
|
8
|
+
var createEditorContext = function (core, saveIndex) {
|
|
9
|
+
var _a;
|
|
10
|
+
var lifecycle = core.lifecycle, format = core.format, darkColorHandler = core.darkColorHandler, contentDiv = core.contentDiv, cache = core.cache, domHelper = core.domHelper;
|
|
10
11
|
var context = {
|
|
11
12
|
isDarkMode: lifecycle.isDarkMode,
|
|
12
13
|
defaultFormat: format.defaultFormat,
|
|
14
|
+
pendingFormat: (_a = format.pendingFormat) !== null && _a !== void 0 ? _a : undefined,
|
|
13
15
|
darkColorHandler: darkColorHandler,
|
|
14
16
|
addDelimiterForEntity: true,
|
|
15
17
|
allowCacheElement: true,
|
|
16
|
-
domIndexer: cache.domIndexer,
|
|
18
|
+
domIndexer: saveIndex ? cache.domIndexer : undefined,
|
|
19
|
+
zoomScale: domHelper.calculateZoomScale(),
|
|
17
20
|
};
|
|
18
21
|
checkRootRtl(contentDiv, context);
|
|
19
|
-
checkZoomScale(contentDiv, context);
|
|
20
22
|
return context;
|
|
21
23
|
};
|
|
22
24
|
exports.createEditorContext = createEditorContext;
|
|
23
|
-
function checkZoomScale(element, context) {
|
|
24
|
-
var _a;
|
|
25
|
-
var originalWidth = ((_a = element === null || element === void 0 ? void 0 : element.getBoundingClientRect()) === null || _a === void 0 ? void 0 : _a.width) || 0;
|
|
26
|
-
var visualWidth = element.offsetWidth;
|
|
27
|
-
if (visualWidth > 0 && originalWidth > 0) {
|
|
28
|
-
context.zoomScale = Math.round((originalWidth / visualWidth) * 100) / 100;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
25
|
function checkRootRtl(element, context) {
|
|
32
26
|
var _a;
|
|
33
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,
|
|
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"]}
|
|
@@ -52,14 +52,12 @@ var formatContentModel = function (core, formatter, options) {
|
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
var eventData = {
|
|
55
|
-
eventType:
|
|
55
|
+
eventType: 'contentChanged',
|
|
56
56
|
contentModel: clearModelCache ? undefined : model,
|
|
57
57
|
selection: clearModelCache ? undefined : selection,
|
|
58
58
|
source: changeSource || ChangeSource_1.ChangeSource.Format,
|
|
59
59
|
data: getChangeData === null || getChangeData === void 0 ? void 0 : getChangeData(),
|
|
60
|
-
|
|
61
|
-
formatApiName: apiName,
|
|
62
|
-
},
|
|
60
|
+
formatApiName: apiName,
|
|
63
61
|
changedEntities: getChangedEntities(context, rawEvent),
|
|
64
62
|
};
|
|
65
63
|
core.api.triggerEvent(core, eventData, true /*broadcast*/);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatContentModel.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/formatContentModel.ts"],"names":[],"mappings":";;;;AAAA,0DAAyD;
|
|
1
|
+
{"version":3,"file":"formatContentModel.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/formatContentModel.ts"],"names":[],"mappings":";;;;AAAA,0DAAyD;AAUzD;;;;;;;;;GASG;AACI,IAAM,kBAAkB,GAAuB,UAAC,IAAI,EAAE,SAAS,EAAE,OAAO;;IACrE,IAAA,KACF,OAAO,IAAI,EAAE,EADT,OAAO,aAAA,EAAE,aAAa,mBAAA,EAAE,aAAa,mBAAA,EAAE,YAAY,kBAAA,EAAE,QAAQ,cAAA,EAAE,iBAAiB,uBACvE,CAAC;IAClB,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACzF,IAAM,OAAO,GAAkC;QAC3C,WAAW,EAAE,EAAE;QACf,eAAe,EAAE,EAAE;QACnB,QAAQ,UAAA;QACR,SAAS,EAAE,EAAE;KAChB,CAAC;IAEF,IAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEzC,IAAM,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAClC,IAAA,gBAAgB,GAAwD,OAAO,iBAA/D,EAAE,eAAe,GAAuC,OAAO,gBAA9C,EAAE,YAAY,GAAyB,OAAO,aAAhC,EAAE,kBAAkB,GAAK,OAAO,mBAAZ,CAAa;IAExF,IAAI,OAAO,EAAE;QACT,IAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QACpC,IAAM,iBAAiB,GAAG,CAAC,gBAAgB,IAAI,CAAC,QAAQ,CAAC;QACzD,IAAI,SAAS,SAA0B,CAAC;QAExC,IAAI,iBAAiB,EAAE;YACnB,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YAE1B,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,IAAI,YAAY,EAAE;gBAC1D,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC;aACxD;SACJ;QAED,IAAI;YACA,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAE5B,SAAS;gBACL,MAAA,IAAI,CAAC,GAAG,CAAC,eAAe,CACpB,IAAI,EACJ,KAAK,EACL,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,4EAA4E;gBAC9H,aAAa,CAChB,mCAAI,SAAS,CAAC;YAEnB,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YAE9C,IAAI,iBAAiB,EAAE;gBACnB,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;aACtE;SACJ;gBAAS;YACN,IAAI,CAAC,QAAQ,EAAE;gBACX,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;aAC9B;SACJ;QAED,IAAM,SAAS,GAAwB;YACnC,SAAS,EAAE,gBAAgB;YAC3B,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;YACjD,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YAClD,MAAM,EAAE,YAAY,IAAI,2BAAY,CAAC,MAAM;YAC3C,IAAI,EAAE,aAAa,aAAb,aAAa,uBAAb,aAAa,EAAI;YACvB,aAAa,EAAE,OAAO;YACtB,eAAe,EAAE,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC;SACzD,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAE3D,IAAI,kBAAkB,IAAI,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,KAAI,OAAO,EAAE;YAClD,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,GAAG,KAAK,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC;YACxD,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC;SACrD;KACJ;SAAM;QACH,IAAI,eAAe,EAAE;YACjB,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,SAAS,CAAC;SAC1C;QAED,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;KACtE;AACL,CAAC,CAAC;AA5EW,QAAA,kBAAkB,sBA4E7B;AAEF,SAAS,YAAY,CAAC,IAA0B,EAAE,OAAsC;IACpF,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;QAC9B,IAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAEnD,IAAI,QAAQ,EAAE;YACF,IAAA,IAAI,GAAY,QAAQ,KAApB,EAAE,KAAK,GAAK,QAAQ,MAAb,CAAc;YACjC,IAAM,eAAe,GAAG,EAAE,CAAC;YAC3B,IAAM,UAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,eAAe,CAAC,CAAC;YACzD,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,UAAA,KAAK;gBAC3B,KAAK,CAAC,MAAM,CAAC,QAAQ,GAAM,UAAQ,OAAI,CAAC;YAC5C,CAAC,CAAC,CAAC;SACN;KACJ;AACL,CAAC;AAED,SAAS,mBAAmB,CACxB,IAA0B,EAC1B,OAAsC,EACtC,SAA+B;;IAE/B,IAAM,aAAa,GACf,OAAO,CAAC,gBAAgB,IAAI,UAAU;QAClC,CAAC,CAAC,MAAA,IAAI,CAAC,MAAM,CAAC,aAAa,0CAAE,MAAM;QACnC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;IAEnC,IAAI,aAAa,IAAI,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,KAAI,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE;QAC1E,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG;YACxB,MAAM,4BAAO,aAAa,CAAE;YAC5B,YAAY,EAAE,SAAS,CAAC,KAAK,CAAC,cAAc;YAC5C,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,WAAW;SACzC,CAAC;KACL;AACL,CAAC;AAED,SAAS,kBAAkB,CACvB,OAAsC,EACtC,QAAgB;IAEhB,OAAO,OAAO,CAAC,WAAW;SACrB,GAAG,CACA,UAAC,MAAM,IAAoB,OAAA,CAAC;QACxB,MAAM,QAAA;QACN,SAAS,EAAE,WAAW;QACtB,QAAQ,UAAA;KACX,CAAC,EAJyB,CAIzB,CACL;SACA,MAAM,CACH,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,UAAA,KAAK,IAAI,OAAA,CAAC;QAClC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,UAAA;KACX,CAAC,EAJmC,CAInC,CAAC,CACN,CAAC;AACV,CAAC","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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getVisibleViewport.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/getVisibleViewport.ts"],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"getVisibleViewport.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/getVisibleViewport.ts"],"names":[],"mappings":";;;;AAEA;;;;GAIG;AACI,IAAM,kBAAkB,GAAuB,UAAA,IAAI;IACtD,IAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;IAEtD,OAAO,kBAAkB,CACrB,eAAe,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,CAAC,CAC9F,CAAC;AACN,CAAC,CAAC;AANW,QAAA,kBAAkB,sBAM7B;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,SAAS,kBAAkB,CAAC,QAAuB,EAAE,eAA4B;IAA5B,gCAAA,EAAA,oBAA4B;IAC7E,IAAM,KAAK,GAAG,QAAQ;SACjB,GAAG,CAAC,UAAA,OAAO,IAAI,OAAA,aAAa,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,EAA9C,CAA8C,CAAC;SAC9D,MAAM,CAAC,eAAe,CAAC;SACvB,MAAM,CAAC,UAAC,IAAiB,IAAmB,OAAA,CAAC,CAAC,IAAI,EAAN,CAAM,CAAC,CAAC;IAEzD,IAAM,MAAM,GAAS;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG,OAAR,IAAI,qDAAQ,KAAK,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,GAAG,EAAL,CAAK,CAAC,UAAC;QACvC,MAAM,EAAE,IAAI,CAAC,GAAG,OAAR,IAAI,qDAAQ,KAAK,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,MAAM,EAAR,CAAQ,CAAC,UAAC;QAC7C,IAAI,EAAE,IAAI,CAAC,GAAG,OAAR,IAAI,qDAAQ,KAAK,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,IAAI,EAAN,CAAM,CAAC,UAAC;QACzC,KAAK,EAAE,IAAI,CAAC,GAAG,OAAR,IAAI,qDAAQ,KAAK,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,KAAK,EAAP,CAAO,CAAC,UAAC;KAC9C,CAAC;IAEF,OAAO,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACpF,CAAC;AAED,SAAS,aAAa,CAAC,UAAmB;IAChC,IAAA,KACF,UAAU,IAAa,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAD3D,IAAI,UAAA,EAAE,KAAK,WAAA,EAAE,GAAG,SAAA,EAAE,MAAM,YACmC,CAAC;IACpE,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC;QACzD,CAAC,CAAC,IAAI;QACN,CAAC,CAAC;YACI,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACtB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;YACxB,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YACpB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;SAC7B,CAAC;AACZ,CAAC","sourcesContent":["import type { GetVisibleViewport, Rect } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Retrieves the rect of the visible viewport of the editor.\n * @param core The StandaloneEditorCore object\n */\nexport const getVisibleViewport: GetVisibleViewport = core => {\n const scrollContainer = core.domEvent.scrollContainer;\n\n return getIntersectedRect(\n scrollContainer == core.contentDiv ? [scrollContainer] : [scrollContainer, core.contentDiv]\n );\n};\n\n/**\n * Get the intersected Rect of elements provided\n *\n * @example\n * The result of the following Elements Rects would be:\n {\n top: Element2.top,\n bottom: Element1.bottom,\n left: Element2.left,\n right: Element2.right\n }\n +-------------------------+\n | Element 1 |\n | +-----------------+ |\n | | Element2 | |\n | | | |\n | | | |\n +-------------------------+\n | |\n +-----------------+\n\n * @param elements Elements to use.\n * @param additionalRects additional rects to use\n * @returns If the Rect is valid return the rect, if not, return null.\n */\nfunction getIntersectedRect(elements: HTMLElement[], additionalRects: Rect[] = []): Rect | null {\n const rects = elements\n .map(element => normalizeRect(element.getBoundingClientRect()))\n .concat(additionalRects)\n .filter((rect: Rect | null): rect is Rect => !!rect);\n\n const result: Rect = {\n top: Math.max(...rects.map(r => r.top)),\n bottom: Math.min(...rects.map(r => r.bottom)),\n left: Math.max(...rects.map(r => r.left)),\n right: Math.min(...rects.map(r => r.right)),\n };\n\n return result.top < result.bottom && result.left < result.right ? result : null;\n}\n\nfunction normalizeRect(clientRect: DOMRect): Rect | null {\n const { left, right, top, bottom } =\n clientRect || <DOMRect>{ left: 0, right: 0, top: 0, bottom: 0 };\n return left === 0 && right === 0 && top === 0 && bottom === 0\n ? null\n : {\n left: Math.round(left),\n right: Math.round(right),\n top: Math.round(top),\n bottom: Math.round(bottom),\n };\n}\n"]}
|
package/lib/coreApi/paste.js
CHANGED
|
@@ -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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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) {
|
package/lib/coreApi/paste.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paste.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/paste.ts"],"names":[],"mappings":";;;AAAA,
|
|
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"]}
|
|
@@ -13,7 +13,7 @@ var restoreSnapshotSelection_1 = require("../utils/restoreSnapshotSelection");
|
|
|
13
13
|
*/
|
|
14
14
|
var restoreUndoSnapshot = function (core, snapshot) {
|
|
15
15
|
core.api.triggerEvent(core, {
|
|
16
|
-
eventType:
|
|
16
|
+
eventType: 'beforeSetContent',
|
|
17
17
|
newContent: snapshot.html,
|
|
18
18
|
}, true /*broadcast*/);
|
|
19
19
|
try {
|
|
@@ -22,7 +22,7 @@ var restoreUndoSnapshot = function (core, snapshot) {
|
|
|
22
22
|
(0, restoreSnapshotSelection_1.restoreSnapshotSelection)(core, snapshot);
|
|
23
23
|
(0, restoreSnapshotColors_1.restoreSnapshotColors)(core, snapshot);
|
|
24
24
|
var event_1 = {
|
|
25
|
-
eventType:
|
|
25
|
+
eventType: 'contentChanged',
|
|
26
26
|
entityStates: snapshot.entityStates,
|
|
27
27
|
source: ChangeSource_1.ChangeSource.SetContent,
|
|
28
28
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restoreUndoSnapshot.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/restoreUndoSnapshot.ts"],"names":[],"mappings":";;;AAAA,0DAAyD;
|
|
1
|
+
{"version":3,"file":"restoreUndoSnapshot.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/restoreUndoSnapshot.ts"],"names":[],"mappings":";;;AAAA,0DAAyD;AACzD,wEAAuE;AACvE,oEAAmE;AACnE,8EAA6E;AAG7E;;;;;GAKG;AACI,IAAM,mBAAmB,GAAwB,UAAC,IAAI,EAAE,QAAQ;IACnE,IAAI,CAAC,GAAG,CAAC,YAAY,CACjB,IAAI,EACJ;QACI,SAAS,EAAE,kBAAkB;QAC7B,UAAU,EAAE,QAAQ,CAAC,IAAI;KAC5B,EACD,IAAI,CAAC,aAAa,CACrB,CAAC;IAEF,IAAI;QACA,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAE7B,IAAA,yCAAmB,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACpC,IAAA,mDAAwB,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACzC,IAAA,6CAAqB,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAEtC,IAAM,OAAK,GAAwB;YAC/B,SAAS,EAAE,gBAAgB;YAC3B,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,MAAM,EAAE,2BAAY,CAAC,UAAU;SAClC,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,OAAK,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;KAC3D;YAAS;QACN,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;KACjC;AACL,CAAC,CAAC;AA3BW,QAAA,mBAAmB,uBA2B9B","sourcesContent":["import { ChangeSource } from '../constants/ChangeSource';\nimport { restoreSnapshotColors } from '../utils/restoreSnapshotColors';\nimport { restoreSnapshotHTML } from '../utils/restoreSnapshotHTML';\nimport { restoreSnapshotSelection } from '../utils/restoreSnapshotSelection';\nimport type { ContentChangedEvent, RestoreUndoSnapshot } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Restore an undo snapshot into editor\n * @param core The editor core object\n * @param step Steps to move, can be 0, positive or negative\n */\nexport const restoreUndoSnapshot: RestoreUndoSnapshot = (core, snapshot) => {\n core.api.triggerEvent(\n core,\n {\n eventType: 'beforeSetContent',\n newContent: snapshot.html,\n },\n true /*broadcast*/\n );\n\n try {\n core.undo.isRestoring = true;\n\n restoreSnapshotHTML(core, snapshot);\n restoreSnapshotSelection(core, snapshot);\n restoreSnapshotColors(core, snapshot);\n\n const event: ContentChangedEvent = {\n eventType: 'contentChanged',\n entityStates: snapshot.entityStates,\n source: ChangeSource.SetContent,\n };\n\n core.api.triggerEvent(core, event, false /*broadcast*/);\n } finally {\n core.undo.isRestoring = false;\n }\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
|
|
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
|
-
|
|
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
|
|
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
|
|
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:
|
|
@@ -62,9 +62,8 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
|
|
|
62
62
|
}
|
|
63
63
|
if (!skipSelectionChangedEvent) {
|
|
64
64
|
var eventData = {
|
|
65
|
-
eventType:
|
|
65
|
+
eventType: 'selectionChanged',
|
|
66
66
|
newSelection: selection,
|
|
67
|
-
selectionRangeEx: null,
|
|
68
67
|
};
|
|
69
68
|
core.api.triggerEvent(core, eventData, true /*broadcast*/);
|
|
70
69
|
}
|
|
@@ -145,7 +144,7 @@ function handleTableSelected(rootSelector, selection, cells) {
|
|
|
145
144
|
return selectors;
|
|
146
145
|
}
|
|
147
146
|
function setRangeSelection(doc, element) {
|
|
148
|
-
if (element) {
|
|
147
|
+
if (element && doc.contains(element)) {
|
|
149
148
|
var range = doc.createRange();
|
|
150
149
|
range.selectNode(element);
|
|
151
150
|
range.collapse();
|
|
@@ -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 { PluginEventType } from 'roosterjs-editor-types';\nimport type {\n ContentModelSelectionChangedEvent,\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: ContentModelSelectionChangedEvent = {\n eventType: PluginEventType.SelectionChanged,\n newSelection: selection,\n selectionRangeEx: null,\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) {\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":"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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, 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"]}
|