roosterjs-content-model-core 0.20.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/LICENSE +25 -0
- package/README.md +262 -0
- package/lib/constants/ChangeSource.d.ts +59 -0
- package/lib/constants/ChangeSource.js +63 -0
- package/lib/constants/ChangeSource.js.map +1 -0
- package/lib/coreApi/createContentModel.d.ts +9 -0
- package/lib/coreApi/createContentModel.js +40 -0
- package/lib/coreApi/createContentModel.js.map +1 -0
- package/lib/coreApi/createEditorContext.d.ts +6 -0
- package/lib/coreApi/createEditorContext.js +38 -0
- package/lib/coreApi/createEditorContext.js.map +1 -0
- package/lib/coreApi/formatContentModel.d.ts +12 -0
- package/lib/coreApi/formatContentModel.js +128 -0
- package/lib/coreApi/formatContentModel.js.map +1 -0
- package/lib/coreApi/getDOMSelection.d.ts +5 -0
- package/lib/coreApi/getDOMSelection.js +41 -0
- package/lib/coreApi/getDOMSelection.js.map +1 -0
- package/lib/coreApi/setContentModel.d.ts +9 -0
- package/lib/coreApi/setContentModel.js +33 -0
- package/lib/coreApi/setContentModel.js.map +1 -0
- package/lib/coreApi/setDOMSelection.d.ts +5 -0
- package/lib/coreApi/setDOMSelection.js +41 -0
- package/lib/coreApi/setDOMSelection.js.map +1 -0
- package/lib/coreApi/switchShadowEdit.d.ts +8 -0
- package/lib/coreApi/switchShadowEdit.js +54 -0
- package/lib/coreApi/switchShadowEdit.js.map +1 -0
- package/lib/corePlugin/ContentModelCachePlugin.d.ts +53 -0
- package/lib/corePlugin/ContentModelCachePlugin.js +169 -0
- package/lib/corePlugin/ContentModelCachePlugin.js.map +1 -0
- package/lib/corePlugin/ContentModelCopyPastePlugin.d.ts +46 -0
- package/lib/corePlugin/ContentModelCopyPastePlugin.js +233 -0
- package/lib/corePlugin/ContentModelCopyPastePlugin.js.map +1 -0
- package/lib/corePlugin/ContentModelFormatPlugin.d.ts +59 -0
- package/lib/corePlugin/ContentModelFormatPlugin.js +147 -0
- package/lib/corePlugin/ContentModelFormatPlugin.js.map +1 -0
- package/lib/corePlugin/ContentModelTypeInContainerPlugin.d.ts +23 -0
- package/lib/corePlugin/ContentModelTypeInContainerPlugin.js +32 -0
- package/lib/corePlugin/ContentModelTypeInContainerPlugin.js.map +1 -0
- package/lib/corePlugin/utils/addRangeToSelection.d.ts +4 -0
- package/lib/corePlugin/utils/addRangeToSelection.js +16 -0
- package/lib/corePlugin/utils/addRangeToSelection.js.map +1 -0
- package/lib/corePlugin/utils/applyDefaultFormat.d.ts +9 -0
- package/lib/corePlugin/utils/applyDefaultFormat.js +79 -0
- package/lib/corePlugin/utils/applyDefaultFormat.js.map +1 -0
- package/lib/corePlugin/utils/applyPendingFormat.d.ts +8 -0
- package/lib/corePlugin/utils/applyPendingFormat.js +51 -0
- package/lib/corePlugin/utils/applyPendingFormat.js.map +1 -0
- package/lib/corePlugin/utils/areSameSelection.d.ts +6 -0
- package/lib/corePlugin/utils/areSameSelection.js +36 -0
- package/lib/corePlugin/utils/areSameSelection.js.map +1 -0
- package/lib/corePlugin/utils/contentModelDomIndexer.d.ts +6 -0
- package/lib/corePlugin/utils/contentModelDomIndexer.js +190 -0
- package/lib/corePlugin/utils/contentModelDomIndexer.js.map +1 -0
- package/lib/editor/createContentModelEditorCore.d.ts +6 -0
- package/lib/editor/createContentModelEditorCore.js +50 -0
- package/lib/editor/createContentModelEditorCore.js.map +1 -0
- package/lib/editor/promoteToContentModelEditorCore.d.ts +8 -0
- package/lib/editor/promoteToContentModelEditorCore.js +72 -0
- package/lib/editor/promoteToContentModelEditorCore.js.map +1 -0
- package/lib/index.d.ts +29 -0
- package/lib/index.js +71 -0
- package/lib/index.js.map +1 -0
- package/lib/metadata/definitionCreators.d.ts +48 -0
- package/lib/metadata/definitionCreators.js +95 -0
- package/lib/metadata/definitionCreators.js.map +1 -0
- package/lib/metadata/updateImageMetadata.d.ts +7 -0
- package/lib/metadata/updateImageMetadata.js +28 -0
- package/lib/metadata/updateImageMetadata.js.map +1 -0
- package/lib/metadata/updateListMetadata.d.ts +15 -0
- package/lib/metadata/updateListMetadata.js +181 -0
- package/lib/metadata/updateListMetadata.js.map +1 -0
- package/lib/metadata/updateTableCellMetadata.d.ts +7 -0
- package/lib/metadata/updateTableCellMetadata.js +20 -0
- package/lib/metadata/updateTableCellMetadata.js.map +1 -0
- package/lib/metadata/updateTableMetadata.d.ts +7 -0
- package/lib/metadata/updateTableMetadata.js +32 -0
- package/lib/metadata/updateTableMetadata.js.map +1 -0
- package/lib/modelApi/edit/deleteExpandedSelection.d.ts +7 -0
- package/lib/modelApi/edit/deleteExpandedSelection.js +99 -0
- package/lib/modelApi/edit/deleteExpandedSelection.js.map +1 -0
- package/lib/modelApi/edit/deleteSingleChar.d.ts +4 -0
- package/lib/modelApi/edit/deleteSingleChar.js +36 -0
- package/lib/modelApi/edit/deleteSingleChar.js.map +1 -0
- package/lib/override/tablePreProcessor.d.ts +5 -0
- package/lib/override/tablePreProcessor.js +25 -0
- package/lib/override/tablePreProcessor.js.map +1 -0
- package/lib/publicApi/domUtils/borderValues.d.ts +13 -0
- package/lib/publicApi/domUtils/borderValues.js +48 -0
- package/lib/publicApi/domUtils/borderValues.js.map +1 -0
- package/lib/publicApi/domUtils/eventUtils.d.ts +13 -0
- package/lib/publicApi/domUtils/eventUtils.js +29 -0
- package/lib/publicApi/domUtils/eventUtils.js.map +1 -0
- package/lib/publicApi/domUtils/stringUtil.d.ts +18 -0
- package/lib/publicApi/domUtils/stringUtil.js +35 -0
- package/lib/publicApi/domUtils/stringUtil.js.map +1 -0
- package/lib/publicApi/model/cloneModel.d.ts +30 -0
- package/lib/publicApi/model/cloneModel.js +207 -0
- package/lib/publicApi/model/cloneModel.js.map +1 -0
- package/lib/publicApi/model/getClosestAncestorBlockGroupIndex.d.ts +12 -0
- package/lib/publicApi/model/getClosestAncestorBlockGroupIndex.js +28 -0
- package/lib/publicApi/model/getClosestAncestorBlockGroupIndex.js.map +1 -0
- package/lib/publicApi/model/isBlockGroupOfType.d.ts +8 -0
- package/lib/publicApi/model/isBlockGroupOfType.js +14 -0
- package/lib/publicApi/model/isBlockGroupOfType.js.map +1 -0
- package/lib/publicApi/model/mergeModel.d.ts +36 -0
- package/lib/publicApi/model/mergeModel.js +262 -0
- package/lib/publicApi/model/mergeModel.js.map +1 -0
- package/lib/publicApi/model/paste.d.ts +14 -0
- package/lib/publicApi/model/paste.js +150 -0
- package/lib/publicApi/model/paste.js.map +1 -0
- package/lib/publicApi/selection/collectSelections.d.ts +50 -0
- package/lib/publicApi/selection/collectSelections.js +182 -0
- package/lib/publicApi/selection/collectSelections.js.map +1 -0
- package/lib/publicApi/selection/deleteBlock.d.ts +11 -0
- package/lib/publicApi/selection/deleteBlock.js +56 -0
- package/lib/publicApi/selection/deleteBlock.js.map +1 -0
- package/lib/publicApi/selection/deleteSegment.d.ts +10 -0
- package/lib/publicApi/selection/deleteSegment.js +88 -0
- package/lib/publicApi/selection/deleteSegment.js.map +1 -0
- package/lib/publicApi/selection/deleteSelection.d.ts +9 -0
- package/lib/publicApi/selection/deleteSelection.js +44 -0
- package/lib/publicApi/selection/deleteSelection.js.map +1 -0
- package/lib/publicApi/selection/getSelectionRootNode.d.ts +9 -0
- package/lib/publicApi/selection/getSelectionRootNode.js +23 -0
- package/lib/publicApi/selection/getSelectionRootNode.js.map +1 -0
- package/lib/publicApi/selection/iterateSelections.d.ts +48 -0
- package/lib/publicApi/selection/iterateSelections.js +147 -0
- package/lib/publicApi/selection/iterateSelections.js.map +1 -0
- package/lib/publicApi/selection/setSelection.d.ts +8 -0
- package/lib/publicApi/selection/setSelection.js +131 -0
- package/lib/publicApi/selection/setSelection.js.map +1 -0
- package/lib/publicApi/table/applyTableFormat.d.ts +8 -0
- package/lib/publicApi/table/applyTableFormat.js +241 -0
- package/lib/publicApi/table/applyTableFormat.js.map +1 -0
- package/lib/publicApi/table/normalizeTable.d.ts +13 -0
- package/lib/publicApi/table/normalizeTable.js +121 -0
- package/lib/publicApi/table/normalizeTable.js.map +1 -0
- package/lib/publicApi/table/setTableCellBackgroundColor.d.ts +15 -0
- package/lib/publicApi/table/setTableCellBackgroundColor.js +105 -0
- package/lib/publicApi/table/setTableCellBackgroundColor.js.map +1 -0
- package/lib-amd/constants/ChangeSource.d.ts +59 -0
- package/lib-amd/constants/ChangeSource.js +65 -0
- package/lib-amd/constants/ChangeSource.js.map +1 -0
- package/lib-amd/coreApi/createContentModel.d.ts +9 -0
- package/lib-amd/coreApi/createContentModel.js +39 -0
- package/lib-amd/coreApi/createContentModel.js.map +1 -0
- package/lib-amd/coreApi/createEditorContext.d.ts +6 -0
- package/lib-amd/coreApi/createEditorContext.js +40 -0
- package/lib-amd/coreApi/createEditorContext.js.map +1 -0
- package/lib-amd/coreApi/formatContentModel.d.ts +12 -0
- package/lib-amd/coreApi/formatContentModel.js +128 -0
- package/lib-amd/coreApi/formatContentModel.js.map +1 -0
- package/lib-amd/coreApi/getDOMSelection.d.ts +5 -0
- package/lib-amd/coreApi/getDOMSelection.js +43 -0
- package/lib-amd/coreApi/getDOMSelection.js.map +1 -0
- package/lib-amd/coreApi/setContentModel.d.ts +9 -0
- package/lib-amd/coreApi/setContentModel.js +33 -0
- package/lib-amd/coreApi/setContentModel.js.map +1 -0
- package/lib-amd/coreApi/setDOMSelection.d.ts +5 -0
- package/lib-amd/coreApi/setDOMSelection.js +43 -0
- package/lib-amd/coreApi/setDOMSelection.js.map +1 -0
- package/lib-amd/coreApi/switchShadowEdit.d.ts +8 -0
- package/lib-amd/coreApi/switchShadowEdit.js +55 -0
- package/lib-amd/coreApi/switchShadowEdit.js.map +1 -0
- package/lib-amd/corePlugin/ContentModelCachePlugin.d.ts +53 -0
- package/lib-amd/corePlugin/ContentModelCachePlugin.js +169 -0
- package/lib-amd/corePlugin/ContentModelCachePlugin.js.map +1 -0
- package/lib-amd/corePlugin/ContentModelCopyPastePlugin.d.ts +46 -0
- package/lib-amd/corePlugin/ContentModelCopyPastePlugin.js +226 -0
- package/lib-amd/corePlugin/ContentModelCopyPastePlugin.js.map +1 -0
- package/lib-amd/corePlugin/ContentModelFormatPlugin.d.ts +59 -0
- package/lib-amd/corePlugin/ContentModelFormatPlugin.js +145 -0
- package/lib-amd/corePlugin/ContentModelFormatPlugin.js.map +1 -0
- package/lib-amd/corePlugin/ContentModelTypeInContainerPlugin.d.ts +23 -0
- package/lib-amd/corePlugin/ContentModelTypeInContainerPlugin.js +34 -0
- package/lib-amd/corePlugin/ContentModelTypeInContainerPlugin.js.map +1 -0
- package/lib-amd/corePlugin/utils/addRangeToSelection.d.ts +4 -0
- package/lib-amd/corePlugin/utils/addRangeToSelection.js +18 -0
- package/lib-amd/corePlugin/utils/addRangeToSelection.js.map +1 -0
- package/lib-amd/corePlugin/utils/applyDefaultFormat.d.ts +9 -0
- package/lib-amd/corePlugin/utils/applyDefaultFormat.js +78 -0
- package/lib-amd/corePlugin/utils/applyDefaultFormat.js.map +1 -0
- package/lib-amd/corePlugin/utils/applyPendingFormat.d.ts +8 -0
- package/lib-amd/corePlugin/utils/applyPendingFormat.js +50 -0
- package/lib-amd/corePlugin/utils/applyPendingFormat.js.map +1 -0
- package/lib-amd/corePlugin/utils/areSameSelection.d.ts +6 -0
- package/lib-amd/corePlugin/utils/areSameSelection.js +38 -0
- package/lib-amd/corePlugin/utils/areSameSelection.js.map +1 -0
- package/lib-amd/corePlugin/utils/contentModelDomIndexer.d.ts +6 -0
- package/lib-amd/corePlugin/utils/contentModelDomIndexer.js +189 -0
- package/lib-amd/corePlugin/utils/contentModelDomIndexer.js.map +1 -0
- package/lib-amd/editor/createContentModelEditorCore.d.ts +6 -0
- package/lib-amd/editor/createContentModelEditorCore.js +44 -0
- package/lib-amd/editor/createContentModelEditorCore.js.map +1 -0
- package/lib-amd/editor/promoteToContentModelEditorCore.d.ts +8 -0
- package/lib-amd/editor/promoteToContentModelEditorCore.js +64 -0
- package/lib-amd/editor/promoteToContentModelEditorCore.js.map +1 -0
- package/lib-amd/index.d.ts +29 -0
- package/lib-amd/index.js +44 -0
- package/lib-amd/index.js.map +1 -0
- package/lib-amd/metadata/definitionCreators.d.ts +48 -0
- package/lib-amd/metadata/definitionCreators.js +97 -0
- package/lib-amd/metadata/definitionCreators.js.map +1 -0
- package/lib-amd/metadata/updateImageMetadata.d.ts +7 -0
- package/lib-amd/metadata/updateImageMetadata.js +28 -0
- package/lib-amd/metadata/updateImageMetadata.js.map +1 -0
- package/lib-amd/metadata/updateListMetadata.d.ts +15 -0
- package/lib-amd/metadata/updateListMetadata.js +179 -0
- package/lib-amd/metadata/updateListMetadata.js.map +1 -0
- package/lib-amd/metadata/updateTableCellMetadata.d.ts +7 -0
- package/lib-amd/metadata/updateTableCellMetadata.js +20 -0
- package/lib-amd/metadata/updateTableCellMetadata.js.map +1 -0
- package/lib-amd/metadata/updateTableMetadata.d.ts +7 -0
- package/lib-amd/metadata/updateTableMetadata.js +31 -0
- package/lib-amd/metadata/updateTableMetadata.js.map +1 -0
- package/lib-amd/modelApi/edit/deleteExpandedSelection.d.ts +7 -0
- package/lib-amd/modelApi/edit/deleteExpandedSelection.js +96 -0
- package/lib-amd/modelApi/edit/deleteExpandedSelection.js.map +1 -0
- package/lib-amd/modelApi/edit/deleteSingleChar.d.ts +4 -0
- package/lib-amd/modelApi/edit/deleteSingleChar.js +37 -0
- package/lib-amd/modelApi/edit/deleteSingleChar.js.map +1 -0
- package/lib-amd/override/tablePreProcessor.d.ts +5 -0
- package/lib-amd/override/tablePreProcessor.js +25 -0
- package/lib-amd/override/tablePreProcessor.js.map +1 -0
- package/lib-amd/publicApi/domUtils/borderValues.d.ts +13 -0
- package/lib-amd/publicApi/domUtils/borderValues.js +50 -0
- package/lib-amd/publicApi/domUtils/borderValues.js.map +1 -0
- package/lib-amd/publicApi/domUtils/eventUtils.d.ts +13 -0
- package/lib-amd/publicApi/domUtils/eventUtils.js +31 -0
- package/lib-amd/publicApi/domUtils/eventUtils.js.map +1 -0
- package/lib-amd/publicApi/domUtils/stringUtil.d.ts +18 -0
- package/lib-amd/publicApi/domUtils/stringUtil.js +37 -0
- package/lib-amd/publicApi/domUtils/stringUtil.js.map +1 -0
- package/lib-amd/publicApi/model/cloneModel.d.ts +30 -0
- package/lib-amd/publicApi/model/cloneModel.js +208 -0
- package/lib-amd/publicApi/model/cloneModel.js.map +1 -0
- package/lib-amd/publicApi/model/getClosestAncestorBlockGroupIndex.d.ts +12 -0
- package/lib-amd/publicApi/model/getClosestAncestorBlockGroupIndex.js +30 -0
- package/lib-amd/publicApi/model/getClosestAncestorBlockGroupIndex.js.map +1 -0
- package/lib-amd/publicApi/model/isBlockGroupOfType.d.ts +8 -0
- package/lib-amd/publicApi/model/isBlockGroupOfType.js +16 -0
- package/lib-amd/publicApi/model/isBlockGroupOfType.js.map +1 -0
- package/lib-amd/publicApi/model/mergeModel.d.ts +36 -0
- package/lib-amd/publicApi/model/mergeModel.js +258 -0
- package/lib-amd/publicApi/model/mergeModel.js.map +1 -0
- package/lib-amd/publicApi/model/paste.d.ts +14 -0
- package/lib-amd/publicApi/model/paste.js +146 -0
- package/lib-amd/publicApi/model/paste.js.map +1 -0
- package/lib-amd/publicApi/selection/collectSelections.d.ts +50 -0
- package/lib-amd/publicApi/selection/collectSelections.js +180 -0
- package/lib-amd/publicApi/selection/collectSelections.js.map +1 -0
- package/lib-amd/publicApi/selection/deleteBlock.d.ts +11 -0
- package/lib-amd/publicApi/selection/deleteBlock.js +58 -0
- package/lib-amd/publicApi/selection/deleteBlock.js.map +1 -0
- package/lib-amd/publicApi/selection/deleteSegment.d.ts +10 -0
- package/lib-amd/publicApi/selection/deleteSegment.js +87 -0
- package/lib-amd/publicApi/selection/deleteSegment.js.map +1 -0
- package/lib-amd/publicApi/selection/deleteSelection.d.ts +9 -0
- package/lib-amd/publicApi/selection/deleteSelection.js +44 -0
- package/lib-amd/publicApi/selection/deleteSelection.js.map +1 -0
- package/lib-amd/publicApi/selection/getSelectionRootNode.d.ts +9 -0
- package/lib-amd/publicApi/selection/getSelectionRootNode.js +25 -0
- package/lib-amd/publicApi/selection/getSelectionRootNode.js.map +1 -0
- package/lib-amd/publicApi/selection/iterateSelections.d.ts +48 -0
- package/lib-amd/publicApi/selection/iterateSelections.js +148 -0
- package/lib-amd/publicApi/selection/iterateSelections.js.map +1 -0
- package/lib-amd/publicApi/selection/setSelection.d.ts +8 -0
- package/lib-amd/publicApi/selection/setSelection.js +132 -0
- package/lib-amd/publicApi/selection/setSelection.js.map +1 -0
- package/lib-amd/publicApi/table/applyTableFormat.d.ts +8 -0
- package/lib-amd/publicApi/table/applyTableFormat.js +236 -0
- package/lib-amd/publicApi/table/applyTableFormat.js.map +1 -0
- package/lib-amd/publicApi/table/normalizeTable.d.ts +13 -0
- package/lib-amd/publicApi/table/normalizeTable.js +121 -0
- package/lib-amd/publicApi/table/normalizeTable.js.map +1 -0
- package/lib-amd/publicApi/table/setTableCellBackgroundColor.d.ts +15 -0
- package/lib-amd/publicApi/table/setTableCellBackgroundColor.js +105 -0
- package/lib-amd/publicApi/table/setTableCellBackgroundColor.js.map +1 -0
- package/lib-mjs/constants/ChangeSource.d.ts +59 -0
- package/lib-mjs/constants/ChangeSource.js +60 -0
- package/lib-mjs/constants/ChangeSource.js.map +1 -0
- package/lib-mjs/coreApi/createContentModel.d.ts +9 -0
- package/lib-mjs/coreApi/createContentModel.js +36 -0
- package/lib-mjs/coreApi/createContentModel.js.map +1 -0
- package/lib-mjs/coreApi/createEditorContext.d.ts +6 -0
- package/lib-mjs/coreApi/createEditorContext.js +34 -0
- package/lib-mjs/coreApi/createEditorContext.js.map +1 -0
- package/lib-mjs/coreApi/formatContentModel.d.ts +12 -0
- package/lib-mjs/coreApi/formatContentModel.js +124 -0
- package/lib-mjs/coreApi/formatContentModel.js.map +1 -0
- package/lib-mjs/coreApi/getDOMSelection.d.ts +5 -0
- package/lib-mjs/coreApi/getDOMSelection.js +37 -0
- package/lib-mjs/coreApi/getDOMSelection.js.map +1 -0
- package/lib-mjs/coreApi/setContentModel.d.ts +9 -0
- package/lib-mjs/coreApi/setContentModel.js +29 -0
- package/lib-mjs/coreApi/setContentModel.js.map +1 -0
- package/lib-mjs/coreApi/setDOMSelection.d.ts +5 -0
- package/lib-mjs/coreApi/setDOMSelection.js +37 -0
- package/lib-mjs/coreApi/setDOMSelection.js.map +1 -0
- package/lib-mjs/coreApi/switchShadowEdit.d.ts +8 -0
- package/lib-mjs/coreApi/switchShadowEdit.js +50 -0
- package/lib-mjs/coreApi/switchShadowEdit.js.map +1 -0
- package/lib-mjs/corePlugin/ContentModelCachePlugin.d.ts +53 -0
- package/lib-mjs/corePlugin/ContentModelCachePlugin.js +165 -0
- package/lib-mjs/corePlugin/ContentModelCachePlugin.js.map +1 -0
- package/lib-mjs/corePlugin/ContentModelCopyPastePlugin.d.ts +46 -0
- package/lib-mjs/corePlugin/ContentModelCopyPastePlugin.js +228 -0
- package/lib-mjs/corePlugin/ContentModelCopyPastePlugin.js.map +1 -0
- package/lib-mjs/corePlugin/ContentModelFormatPlugin.d.ts +59 -0
- package/lib-mjs/corePlugin/ContentModelFormatPlugin.js +143 -0
- package/lib-mjs/corePlugin/ContentModelFormatPlugin.js.map +1 -0
- package/lib-mjs/corePlugin/ContentModelTypeInContainerPlugin.d.ts +23 -0
- package/lib-mjs/corePlugin/ContentModelTypeInContainerPlugin.js +29 -0
- package/lib-mjs/corePlugin/ContentModelTypeInContainerPlugin.js.map +1 -0
- package/lib-mjs/corePlugin/utils/addRangeToSelection.d.ts +4 -0
- package/lib-mjs/corePlugin/utils/addRangeToSelection.js +12 -0
- package/lib-mjs/corePlugin/utils/addRangeToSelection.js.map +1 -0
- package/lib-mjs/corePlugin/utils/applyDefaultFormat.d.ts +9 -0
- package/lib-mjs/corePlugin/utils/applyDefaultFormat.js +75 -0
- package/lib-mjs/corePlugin/utils/applyDefaultFormat.js.map +1 -0
- package/lib-mjs/corePlugin/utils/applyPendingFormat.d.ts +8 -0
- package/lib-mjs/corePlugin/utils/applyPendingFormat.js +47 -0
- package/lib-mjs/corePlugin/utils/applyPendingFormat.js.map +1 -0
- package/lib-mjs/corePlugin/utils/areSameSelection.d.ts +6 -0
- package/lib-mjs/corePlugin/utils/areSameSelection.js +32 -0
- package/lib-mjs/corePlugin/utils/areSameSelection.js.map +1 -0
- package/lib-mjs/corePlugin/utils/contentModelDomIndexer.d.ts +6 -0
- package/lib-mjs/corePlugin/utils/contentModelDomIndexer.js +187 -0
- package/lib-mjs/corePlugin/utils/contentModelDomIndexer.js.map +1 -0
- package/lib-mjs/editor/createContentModelEditorCore.d.ts +6 -0
- package/lib-mjs/editor/createContentModelEditorCore.js +46 -0
- package/lib-mjs/editor/createContentModelEditorCore.js.map +1 -0
- package/lib-mjs/editor/promoteToContentModelEditorCore.d.ts +8 -0
- package/lib-mjs/editor/promoteToContentModelEditorCore.js +68 -0
- package/lib-mjs/editor/promoteToContentModelEditorCore.js.map +1 -0
- package/lib-mjs/index.d.ts +29 -0
- package/lib-mjs/index.js +30 -0
- package/lib-mjs/index.js.map +1 -0
- package/lib-mjs/metadata/definitionCreators.d.ts +48 -0
- package/lib-mjs/metadata/definitionCreators.js +87 -0
- package/lib-mjs/metadata/definitionCreators.js.map +1 -0
- package/lib-mjs/metadata/updateImageMetadata.d.ts +7 -0
- package/lib-mjs/metadata/updateImageMetadata.js +24 -0
- package/lib-mjs/metadata/updateImageMetadata.js.map +1 -0
- package/lib-mjs/metadata/updateListMetadata.d.ts +15 -0
- package/lib-mjs/metadata/updateListMetadata.js +177 -0
- package/lib-mjs/metadata/updateListMetadata.js.map +1 -0
- package/lib-mjs/metadata/updateTableCellMetadata.d.ts +7 -0
- package/lib-mjs/metadata/updateTableCellMetadata.js +16 -0
- package/lib-mjs/metadata/updateTableCellMetadata.js.map +1 -0
- package/lib-mjs/metadata/updateTableMetadata.d.ts +7 -0
- package/lib-mjs/metadata/updateTableMetadata.js +28 -0
- package/lib-mjs/metadata/updateTableMetadata.js.map +1 -0
- package/lib-mjs/modelApi/edit/deleteExpandedSelection.d.ts +7 -0
- package/lib-mjs/modelApi/edit/deleteExpandedSelection.js +95 -0
- package/lib-mjs/modelApi/edit/deleteExpandedSelection.js.map +1 -0
- package/lib-mjs/modelApi/edit/deleteSingleChar.d.ts +4 -0
- package/lib-mjs/modelApi/edit/deleteSingleChar.js +32 -0
- package/lib-mjs/modelApi/edit/deleteSingleChar.js.map +1 -0
- package/lib-mjs/override/tablePreProcessor.d.ts +5 -0
- package/lib-mjs/override/tablePreProcessor.js +21 -0
- package/lib-mjs/override/tablePreProcessor.js.map +1 -0
- package/lib-mjs/publicApi/domUtils/borderValues.d.ts +13 -0
- package/lib-mjs/publicApi/domUtils/borderValues.js +43 -0
- package/lib-mjs/publicApi/domUtils/borderValues.js.map +1 -0
- package/lib-mjs/publicApi/domUtils/eventUtils.d.ts +13 -0
- package/lib-mjs/publicApi/domUtils/eventUtils.js +24 -0
- package/lib-mjs/publicApi/domUtils/eventUtils.js.map +1 -0
- package/lib-mjs/publicApi/domUtils/stringUtil.d.ts +18 -0
- package/lib-mjs/publicApi/domUtils/stringUtil.js +29 -0
- package/lib-mjs/publicApi/domUtils/stringUtil.js.map +1 -0
- package/lib-mjs/publicApi/model/cloneModel.d.ts +30 -0
- package/lib-mjs/publicApi/model/cloneModel.js +203 -0
- package/lib-mjs/publicApi/model/cloneModel.js.map +1 -0
- package/lib-mjs/publicApi/model/getClosestAncestorBlockGroupIndex.d.ts +12 -0
- package/lib-mjs/publicApi/model/getClosestAncestorBlockGroupIndex.js +24 -0
- package/lib-mjs/publicApi/model/getClosestAncestorBlockGroupIndex.js.map +1 -0
- package/lib-mjs/publicApi/model/isBlockGroupOfType.d.ts +8 -0
- package/lib-mjs/publicApi/model/isBlockGroupOfType.js +10 -0
- package/lib-mjs/publicApi/model/isBlockGroupOfType.js.map +1 -0
- package/lib-mjs/publicApi/model/mergeModel.d.ts +36 -0
- package/lib-mjs/publicApi/model/mergeModel.js +258 -0
- package/lib-mjs/publicApi/model/mergeModel.js.map +1 -0
- package/lib-mjs/publicApi/model/paste.d.ts +14 -0
- package/lib-mjs/publicApi/model/paste.js +145 -0
- package/lib-mjs/publicApi/model/paste.js.map +1 -0
- package/lib-mjs/publicApi/selection/collectSelections.d.ts +50 -0
- package/lib-mjs/publicApi/selection/collectSelections.js +173 -0
- package/lib-mjs/publicApi/selection/collectSelections.js.map +1 -0
- package/lib-mjs/publicApi/selection/deleteBlock.d.ts +11 -0
- package/lib-mjs/publicApi/selection/deleteBlock.js +52 -0
- package/lib-mjs/publicApi/selection/deleteBlock.js.map +1 -0
- package/lib-mjs/publicApi/selection/deleteSegment.d.ts +10 -0
- package/lib-mjs/publicApi/selection/deleteSegment.js +84 -0
- package/lib-mjs/publicApi/selection/deleteSegment.js.map +1 -0
- package/lib-mjs/publicApi/selection/deleteSelection.d.ts +9 -0
- package/lib-mjs/publicApi/selection/deleteSelection.js +40 -0
- package/lib-mjs/publicApi/selection/deleteSelection.js.map +1 -0
- package/lib-mjs/publicApi/selection/getSelectionRootNode.d.ts +9 -0
- package/lib-mjs/publicApi/selection/getSelectionRootNode.js +19 -0
- package/lib-mjs/publicApi/selection/getSelectionRootNode.js.map +1 -0
- package/lib-mjs/publicApi/selection/iterateSelections.d.ts +48 -0
- package/lib-mjs/publicApi/selection/iterateSelections.js +143 -0
- package/lib-mjs/publicApi/selection/iterateSelections.js.map +1 -0
- package/lib-mjs/publicApi/selection/setSelection.d.ts +8 -0
- package/lib-mjs/publicApi/selection/setSelection.js +127 -0
- package/lib-mjs/publicApi/selection/setSelection.js.map +1 -0
- package/lib-mjs/publicApi/table/applyTableFormat.d.ts +8 -0
- package/lib-mjs/publicApi/table/applyTableFormat.js +237 -0
- package/lib-mjs/publicApi/table/applyTableFormat.js.map +1 -0
- package/lib-mjs/publicApi/table/normalizeTable.d.ts +13 -0
- package/lib-mjs/publicApi/table/normalizeTable.js +117 -0
- package/lib-mjs/publicApi/table/normalizeTable.js.map +1 -0
- package/lib-mjs/publicApi/table/setTableCellBackgroundColor.d.ts +15 -0
- package/lib-mjs/publicApi/table/setTableCellBackgroundColor.js +100 -0
- package/lib-mjs/publicApi/table/setTableCellBackgroundColor.js.map +1 -0
- package/package.json +21 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { __read, __spreadArray } from "tslib";
|
|
2
|
+
import { deleteBlock } from '../../publicApi/selection/deleteBlock';
|
|
3
|
+
import { deleteSegment } from '../../publicApi/selection/deleteSegment';
|
|
4
|
+
import { iterateSelections } from '../../publicApi/selection/iterateSelections';
|
|
5
|
+
import { createBr, createParagraph, createSelectionMarker, setParagraphNotImplicit, } from 'roosterjs-content-model-dom';
|
|
6
|
+
var DeleteSelectionIteratingOptions = {
|
|
7
|
+
contentUnderSelectedTableCell: 'ignoreForTableOrCell',
|
|
8
|
+
contentUnderSelectedGeneralElement: 'generalElementOnly',
|
|
9
|
+
includeListFormatHolder: 'never',
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* @internal
|
|
13
|
+
* Iterate the model and find all selected content if any, delete them, and keep/create an insert point
|
|
14
|
+
* at the first deleted position so that we know where to put cursor to after delete
|
|
15
|
+
*/
|
|
16
|
+
export function deleteExpandedSelection(model, formatContext) {
|
|
17
|
+
var context = {
|
|
18
|
+
deleteResult: 'notDeleted',
|
|
19
|
+
insertPoint: null,
|
|
20
|
+
formatContext: formatContext,
|
|
21
|
+
};
|
|
22
|
+
iterateSelections(model, function (path, tableContext, block, segments) {
|
|
23
|
+
// Set paragraph, format and index for default position where we will put cursor to.
|
|
24
|
+
// Later we can overwrite these info when process the selections
|
|
25
|
+
var paragraph = createParagraph(true /*implicit*/, undefined /*blockFormat*/, model.format);
|
|
26
|
+
var markerFormat = model.format;
|
|
27
|
+
var insertMarkerIndex = 0;
|
|
28
|
+
if (segments) {
|
|
29
|
+
// Delete segments inside a paragraph
|
|
30
|
+
if (segments[0] && (block === null || block === void 0 ? void 0 : block.blockType) == 'Paragraph') {
|
|
31
|
+
// Now that we have found a paragraph with selections, we can overwrite the default paragraph with this one
|
|
32
|
+
// so we can put cursor here after delete
|
|
33
|
+
paragraph = block;
|
|
34
|
+
insertMarkerIndex = paragraph.segments.indexOf(segments[0]);
|
|
35
|
+
markerFormat = segments[0].format;
|
|
36
|
+
context.lastParagraph = paragraph;
|
|
37
|
+
context.lastTableContext = tableContext;
|
|
38
|
+
segments.forEach(function (segment, i) {
|
|
39
|
+
if (i == 0 &&
|
|
40
|
+
!context.insertPoint &&
|
|
41
|
+
segment.segmentType == 'SelectionMarker') {
|
|
42
|
+
// First time we hit a selection and it is a selection marker, just mark it and not need to delete
|
|
43
|
+
// because this is possible a collapsed selection, then it will be handled later
|
|
44
|
+
context.insertPoint = createInsertPoint(segment, block, path, tableContext);
|
|
45
|
+
}
|
|
46
|
+
else if (deleteSegment(block, segment, context.formatContext)) {
|
|
47
|
+
context.deleteResult = 'range';
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
// Since we are operating on this paragraph and it possible we delete everything from this paragraph,
|
|
51
|
+
// Need to make it "not implicit" so that it will always have a container element, so that when we do normalization
|
|
52
|
+
// of this paragraph, a BR can be added if need
|
|
53
|
+
if (context.deleteResult == 'range') {
|
|
54
|
+
setParagraphNotImplicit(block);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else if (block) {
|
|
59
|
+
// Delete a whole block (divider, table, ...)
|
|
60
|
+
var blocks = path[0].blocks;
|
|
61
|
+
if (deleteBlock(blocks, block, paragraph, context.formatContext)) {
|
|
62
|
+
context.deleteResult = 'range';
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else if (tableContext) {
|
|
66
|
+
// Delete a whole table cell
|
|
67
|
+
var table = tableContext.table, colIndex = tableContext.colIndex, rowIndex = tableContext.rowIndex;
|
|
68
|
+
var row = table.rows[rowIndex];
|
|
69
|
+
var cell = row.cells[colIndex];
|
|
70
|
+
path = __spreadArray([cell], __read(path), false);
|
|
71
|
+
paragraph.segments.push(createBr(model.format));
|
|
72
|
+
cell.blocks = [paragraph];
|
|
73
|
+
delete cell.cachedElement;
|
|
74
|
+
delete row.cachedElement;
|
|
75
|
+
context.deleteResult = 'range';
|
|
76
|
+
}
|
|
77
|
+
if (!context.insertPoint) {
|
|
78
|
+
// If we have not got a insert point after delete and we have a paragraph to put an insert point in, create insert point now
|
|
79
|
+
var marker = createSelectionMarker(markerFormat);
|
|
80
|
+
setParagraphNotImplicit(paragraph);
|
|
81
|
+
paragraph.segments.splice(insertMarkerIndex, 0, marker);
|
|
82
|
+
context.insertPoint = createInsertPoint(marker, paragraph, path, tableContext);
|
|
83
|
+
}
|
|
84
|
+
}, DeleteSelectionIteratingOptions);
|
|
85
|
+
return context;
|
|
86
|
+
}
|
|
87
|
+
function createInsertPoint(marker, paragraph, path, tableContext) {
|
|
88
|
+
return {
|
|
89
|
+
marker: marker,
|
|
90
|
+
paragraph: paragraph,
|
|
91
|
+
path: path,
|
|
92
|
+
tableContext: tableContext,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=deleteExpandedSelection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deleteExpandedSelection.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-core/lib/modelApi/edit/deleteExpandedSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { deleteBlock } from '../../publicApi/selection/deleteBlock';\nimport { deleteSegment } from '../../publicApi/selection/deleteSegment';\nimport { iterateSelections } from '../../publicApi/selection/iterateSelections';\nimport type { IterateSelectionsOption } from '../../publicApi/selection/iterateSelections';\nimport type {\n ContentModelBlockGroup,\n ContentModelDocument,\n ContentModelParagraph,\n ContentModelSelectionMarker,\n DeleteSelectionContext,\n FormatWithContentModelContext,\n InsertPoint,\n TableSelectionContext,\n} from 'roosterjs-content-model-types';\nimport {\n createBr,\n createParagraph,\n createSelectionMarker,\n setParagraphNotImplicit,\n} from 'roosterjs-content-model-dom';\n\nconst DeleteSelectionIteratingOptions: IterateSelectionsOption = {\n contentUnderSelectedTableCell: 'ignoreForTableOrCell', // When a table cell is selected, we replace all content for this cell, so no need to go into its content\n contentUnderSelectedGeneralElement: 'generalElementOnly', // When a general element is selected, we replace the whole element so no need to go into its content\n includeListFormatHolder: 'never',\n};\n\n/**\n * @internal\n * Iterate the model and find all selected content if any, delete them, and keep/create an insert point\n * at the first deleted position so that we know where to put cursor to after delete\n */\nexport function deleteExpandedSelection(\n model: ContentModelDocument,\n formatContext?: FormatWithContentModelContext\n): DeleteSelectionContext {\n const context: DeleteSelectionContext = {\n deleteResult: 'notDeleted',\n insertPoint: null,\n formatContext,\n };\n\n iterateSelections(\n model,\n (path, tableContext, block, segments) => {\n // Set paragraph, format and index for default position where we will put cursor to.\n // Later we can overwrite these info when process the selections\n let paragraph = createParagraph(\n true /*implicit*/,\n undefined /*blockFormat*/,\n model.format\n );\n let markerFormat = model.format;\n let insertMarkerIndex = 0;\n\n if (segments) {\n // Delete segments inside a paragraph\n if (segments[0] && block?.blockType == 'Paragraph') {\n // Now that we have found a paragraph with selections, we can overwrite the default paragraph with this one\n // so we can put cursor here after delete\n paragraph = block;\n insertMarkerIndex = paragraph.segments.indexOf(segments[0]);\n markerFormat = segments[0].format;\n\n context.lastParagraph = paragraph;\n context.lastTableContext = tableContext;\n\n segments.forEach((segment, i) => {\n if (\n i == 0 &&\n !context.insertPoint &&\n segment.segmentType == 'SelectionMarker'\n ) {\n // First time we hit a selection and it is a selection marker, just mark it and not need to delete\n // because this is possible a collapsed selection, then it will be handled later\n context.insertPoint = createInsertPoint(\n segment,\n block,\n path,\n tableContext\n );\n } else if (deleteSegment(block, segment, context.formatContext)) {\n context.deleteResult = 'range';\n }\n });\n\n // Since we are operating on this paragraph and it possible we delete everything from this paragraph,\n // Need to make it \"not implicit\" so that it will always have a container element, so that when we do normalization\n // of this paragraph, a BR can be added if need\n if (context.deleteResult == 'range') {\n setParagraphNotImplicit(block);\n }\n }\n } else if (block) {\n // Delete a whole block (divider, table, ...)\n const blocks = path[0].blocks;\n\n if (deleteBlock(blocks, block, paragraph, context.formatContext)) {\n context.deleteResult = 'range';\n }\n } else if (tableContext) {\n // Delete a whole table cell\n const { table, colIndex, rowIndex } = tableContext;\n const row = table.rows[rowIndex];\n const cell = row.cells[colIndex];\n\n path = [cell, ...path];\n paragraph.segments.push(createBr(model.format));\n cell.blocks = [paragraph];\n\n delete cell.cachedElement;\n delete row.cachedElement;\n context.deleteResult = 'range';\n }\n\n if (!context.insertPoint) {\n // If we have not got a insert point after delete and we have a paragraph to put an insert point in, create insert point now\n const marker = createSelectionMarker(markerFormat);\n\n setParagraphNotImplicit(paragraph);\n paragraph.segments.splice(insertMarkerIndex, 0, marker);\n context.insertPoint = createInsertPoint(marker, paragraph, path, tableContext);\n }\n },\n DeleteSelectionIteratingOptions\n );\n\n return context;\n}\n\nfunction createInsertPoint(\n marker: ContentModelSelectionMarker,\n paragraph: ContentModelParagraph,\n path: ContentModelBlockGroup[],\n tableContext: TableSelectionContext | undefined\n): InsertPoint {\n return {\n marker,\n paragraph,\n path,\n tableContext,\n };\n}\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { __read, __spreadArray } from "tslib";
|
|
2
|
+
/**
|
|
3
|
+
* @internal
|
|
4
|
+
*/
|
|
5
|
+
export function deleteSingleChar(text, isForward) {
|
|
6
|
+
// In case of emoji that occupies multiple characters, we need to delete the whole emoji
|
|
7
|
+
var array = __spreadArray([], __read(text), false);
|
|
8
|
+
var deleteLength = 0;
|
|
9
|
+
for (var i = isForward ? 0 : array.length - 1, deleteState = 'notDeleted'; i >= 0 && i < array.length && deleteState != 'done'; i += isForward ? 1 : -1) {
|
|
10
|
+
switch (array[i]) {
|
|
11
|
+
case '\u200D': // ZERO WIDTH JOINER
|
|
12
|
+
case '\u20E3': // COMBINING ENCLOSING KEYCAP
|
|
13
|
+
case '\uFE0E': // VARIATION SELECTOR-15
|
|
14
|
+
case '\uFE0F': // VARIATION SELECTOR-16
|
|
15
|
+
deleteState = 'notDeleted';
|
|
16
|
+
deleteLength++;
|
|
17
|
+
break;
|
|
18
|
+
default:
|
|
19
|
+
if (deleteState == 'notDeleted') {
|
|
20
|
+
deleteState = 'waiting';
|
|
21
|
+
deleteLength++;
|
|
22
|
+
}
|
|
23
|
+
else if (deleteState == 'waiting') {
|
|
24
|
+
deleteState = 'done';
|
|
25
|
+
}
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
array.splice(isForward ? 0 : array.length - deleteLength, deleteLength);
|
|
30
|
+
return array.join('');
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=deleteSingleChar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deleteSingleChar.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-core/lib/modelApi/edit/deleteSingleChar.ts"],"names":[],"mappings":";AAAA;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,SAAkB;IAC7D,wFAAwF;IACxF,IAAM,KAAK,4BAAO,IAAI,SAAC,CAAC;IACxB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KACI,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EACpC,WAAW,GAAsC,YAAY,EACjE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,WAAW,IAAI,MAAM,EACnD,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACzB;QACE,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE;YACd,KAAK,QAAQ,CAAC,CAAC,oBAAoB;YACnC,KAAK,QAAQ,CAAC,CAAC,6BAA6B;YAC5C,KAAK,QAAQ,CAAC,CAAC,wBAAwB;YACvC,KAAK,QAAQ,EAAE,wBAAwB;gBACnC,WAAW,GAAG,YAAY,CAAC;gBAC3B,YAAY,EAAE,CAAC;gBACf,MAAM;YAEV;gBACI,IAAI,WAAW,IAAI,YAAY,EAAE;oBAC7B,WAAW,GAAG,SAAS,CAAC;oBACxB,YAAY,EAAE,CAAC;iBAClB;qBAAM,IAAI,WAAW,IAAI,SAAS,EAAE;oBACjC,WAAW,GAAG,MAAM,CAAC;iBACxB;gBACD,MAAM;SACb;KACJ;IAED,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,YAAY,EAAE,YAAY,CAAC,CAAC;IAExE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC","sourcesContent":["/**\n * @internal\n */\nexport function deleteSingleChar(text: string, isForward: boolean) {\n // In case of emoji that occupies multiple characters, we need to delete the whole emoji\n const array = [...text];\n let deleteLength = 0;\n\n for (\n let i = isForward ? 0 : array.length - 1,\n deleteState: 'notDeleted' | 'waiting' | 'done' = 'notDeleted';\n i >= 0 && i < array.length && deleteState != 'done';\n i += isForward ? 1 : -1\n ) {\n switch (array[i]) {\n case '\\u200D': // ZERO WIDTH JOINER\n case '\\u20E3': // COMBINING ENCLOSING KEYCAP\n case '\\uFE0E': // VARIATION SELECTOR-15\n case '\\uFE0F': // VARIATION SELECTOR-16\n deleteState = 'notDeleted';\n deleteLength++;\n break;\n\n default:\n if (deleteState == 'notDeleted') {\n deleteState = 'waiting';\n deleteLength++;\n } else if (deleteState == 'waiting') {\n deleteState = 'done';\n }\n break;\n }\n }\n\n array.splice(isForward ? 0 : array.length - deleteLength, deleteLength);\n\n return array.join('');\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { entityProcessor, hasMetadata, tableProcessor } from 'roosterjs-content-model-dom';
|
|
2
|
+
import { getSelectionRootNode } from '../publicApi/selection/getSelectionRootNode';
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export var tablePreProcessor = function (group, element, context) {
|
|
7
|
+
var processor = shouldUseTableProcessor(element, context) ? tableProcessor : entityProcessor;
|
|
8
|
+
processor(group, element, context);
|
|
9
|
+
};
|
|
10
|
+
function shouldUseTableProcessor(element, context) {
|
|
11
|
+
var selectionRoot = getSelectionRootNode(context.selection);
|
|
12
|
+
// Treat table as a real table when:
|
|
13
|
+
// 1. It is a roosterjs table (has metadata)
|
|
14
|
+
// 2. Table is in selection
|
|
15
|
+
// 3. There is selection inside table (or whole table is selected)
|
|
16
|
+
// Otherwise, we treat the table as entity so we will not change it when write back
|
|
17
|
+
return (hasMetadata(element) ||
|
|
18
|
+
context.isInSelection ||
|
|
19
|
+
(selectionRoot && element.contains(selectionRoot)));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=tablePreProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tablePreProcessor.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/override/tablePreProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AAGnF;;GAEG;AACH,MAAM,CAAC,IAAM,iBAAiB,GAAuC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;IACzF,IAAM,SAAS,GAAG,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC;IAE/F,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,SAAS,uBAAuB,CAAC,OAAyB,EAAE,OAA0B;IAClF,IAAM,aAAa,GAAG,oBAAoB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9D,oCAAoC;IACpC,4CAA4C;IAC5C,2BAA2B;IAC3B,kEAAkE;IAClE,mFAAmF;IACnF,OAAO,CACH,WAAW,CAAC,OAAO,CAAC;QACpB,OAAO,CAAC,aAAa;QACrB,CAAC,aAAa,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CACrD,CAAC;AACN,CAAC","sourcesContent":["import { entityProcessor, hasMetadata, tableProcessor } from 'roosterjs-content-model-dom';\nimport { getSelectionRootNode } from '../publicApi/selection/getSelectionRootNode';\nimport type { DomToModelContext, ElementProcessor } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const tablePreProcessor: ElementProcessor<HTMLTableElement> = (group, element, context) => {\n const processor = shouldUseTableProcessor(element, context) ? tableProcessor : entityProcessor;\n\n processor(group, element, context);\n};\n\nfunction shouldUseTableProcessor(element: HTMLTableElement, context: DomToModelContext) {\n const selectionRoot = getSelectionRootNode(context.selection);\n // Treat table as a real table when:\n // 1. It is a roosterjs table (has metadata)\n // 2. Table is in selection\n // 3. There is selection inside table (or whole table is selected)\n // Otherwise, we treat the table as entity so we will not change it when write back\n return (\n hasMetadata(element) ||\n context.isInSelection ||\n (selectionRoot && element.contains(selectionRoot))\n );\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Border } from 'roosterjs-content-model-types';
|
|
2
|
+
/**
|
|
3
|
+
* Extract an integrated border string with border width, style, color to value tuple
|
|
4
|
+
* @param combinedBorder The integrated border style string
|
|
5
|
+
* @returns An array with the splitted values
|
|
6
|
+
*/
|
|
7
|
+
export declare function extractBorderValues(combinedBorder?: string): Border;
|
|
8
|
+
/**
|
|
9
|
+
* Combine border value array back to string
|
|
10
|
+
* @param values Input string values
|
|
11
|
+
* @param initialValue Initial value for those items without valid value
|
|
12
|
+
*/
|
|
13
|
+
export declare function combineBorderValue(value: Border): string;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
var BorderStyles = [
|
|
2
|
+
'none',
|
|
3
|
+
'hidden',
|
|
4
|
+
'dotted',
|
|
5
|
+
'dashed',
|
|
6
|
+
'solid',
|
|
7
|
+
'double',
|
|
8
|
+
'groove',
|
|
9
|
+
'ridge',
|
|
10
|
+
'inset',
|
|
11
|
+
'outset',
|
|
12
|
+
];
|
|
13
|
+
var BorderSizeRegex = /^(thin|medium|thick|[\d\.]+\w*)$/;
|
|
14
|
+
/**
|
|
15
|
+
* Extract an integrated border string with border width, style, color to value tuple
|
|
16
|
+
* @param combinedBorder The integrated border style string
|
|
17
|
+
* @returns An array with the splitted values
|
|
18
|
+
*/
|
|
19
|
+
export function extractBorderValues(combinedBorder) {
|
|
20
|
+
var result = {};
|
|
21
|
+
var values = (combinedBorder || '').replace(/, /g, ',').split(' ');
|
|
22
|
+
values.forEach(function (v) {
|
|
23
|
+
if (BorderStyles.indexOf(v) >= 0 && !result.style) {
|
|
24
|
+
result.style = v;
|
|
25
|
+
}
|
|
26
|
+
else if (BorderSizeRegex.test(v) && !result.width) {
|
|
27
|
+
result.width = v;
|
|
28
|
+
}
|
|
29
|
+
else if (v && !result.color) {
|
|
30
|
+
result.color = v; // TODO: Do we need to use a regex to match all possible colors?
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Combine border value array back to string
|
|
37
|
+
* @param values Input string values
|
|
38
|
+
* @param initialValue Initial value for those items without valid value
|
|
39
|
+
*/
|
|
40
|
+
export function combineBorderValue(value) {
|
|
41
|
+
return [value.width || '', value.style || '', value.color || ''].join(' ').trim() || 'none';
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=borderValues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"borderValues.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-core/lib/publicApi/domUtils/borderValues.ts"],"names":[],"mappings":"AAEA,IAAM,YAAY,GAAG;IACjB,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,OAAO;IACP,QAAQ;CACX,CAAC;AACF,IAAM,eAAe,GAAG,kCAAkC,CAAC;AAE3D;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,cAAuB;IACvD,IAAM,MAAM,GAAW,EAAE,CAAC;IAC1B,IAAM,MAAM,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAErE,MAAM,CAAC,OAAO,CAAC,UAAA,CAAC;QACZ,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YAC/C,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;SACpB;aAAM,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YACjD,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;SACpB;aAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YAC3B,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,gEAAgE;SACrF;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC5C,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC;AAChG,CAAC","sourcesContent":["import type { Border } from 'roosterjs-content-model-types';\n\nconst BorderStyles = [\n 'none',\n 'hidden',\n 'dotted',\n 'dashed',\n 'solid',\n 'double',\n 'groove',\n 'ridge',\n 'inset',\n 'outset',\n];\nconst BorderSizeRegex = /^(thin|medium|thick|[\\d\\.]+\\w*)$/;\n\n/**\n * Extract an integrated border string with border width, style, color to value tuple\n * @param combinedBorder The integrated border style string\n * @returns An array with the splitted values\n */\nexport function extractBorderValues(combinedBorder?: string): Border {\n const result: Border = {};\n const values = (combinedBorder || '').replace(/, /g, ',').split(' ');\n\n values.forEach(v => {\n if (BorderStyles.indexOf(v) >= 0 && !result.style) {\n result.style = v;\n } else if (BorderSizeRegex.test(v) && !result.width) {\n result.width = v;\n } else if (v && !result.color) {\n result.color = v; // TODO: Do we need to use a regex to match all possible colors?\n }\n });\n\n return result;\n}\n\n/**\n * Combine border value array back to string\n * @param values Input string values\n * @param initialValue Initial value for those items without valid value\n */\nexport function combineBorderValue(value: Border): string {\n return [value.width || '', value.style || '', value.color || ''].join(' ').trim() || 'none';\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns true when the event was fired from a modifier key, otherwise false
|
|
3
|
+
* @param event The keyboard event object
|
|
4
|
+
*/
|
|
5
|
+
export declare function isModifierKey(event: KeyboardEvent): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Returns true when the event was fired from a key that produces a character value, otherwise false
|
|
8
|
+
* This detection is not 100% accurate. event.key is not fully supported by all browsers, and in some browsers (e.g. IE),
|
|
9
|
+
* event.key is longer than 1 for num pad input. But here we just want to improve performance as much as possible.
|
|
10
|
+
* So if we missed some case here it is still acceptable.
|
|
11
|
+
* @param event The keyboard event object
|
|
12
|
+
*/
|
|
13
|
+
export declare function isCharacterValue(event: KeyboardEvent): boolean;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
var CTRL_CHAR_CODE = 'Control';
|
|
2
|
+
var ALT_CHAR_CODE = 'Alt';
|
|
3
|
+
var META_CHAR_CODE = 'Meta';
|
|
4
|
+
/**
|
|
5
|
+
* Returns true when the event was fired from a modifier key, otherwise false
|
|
6
|
+
* @param event The keyboard event object
|
|
7
|
+
*/
|
|
8
|
+
export function isModifierKey(event) {
|
|
9
|
+
var isCtrlKey = event.ctrlKey || event.key === CTRL_CHAR_CODE;
|
|
10
|
+
var isAltKey = event.altKey || event.key === ALT_CHAR_CODE;
|
|
11
|
+
var isMetaKey = event.metaKey || event.key === META_CHAR_CODE;
|
|
12
|
+
return isCtrlKey || isAltKey || isMetaKey;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Returns true when the event was fired from a key that produces a character value, otherwise false
|
|
16
|
+
* This detection is not 100% accurate. event.key is not fully supported by all browsers, and in some browsers (e.g. IE),
|
|
17
|
+
* event.key is longer than 1 for num pad input. But here we just want to improve performance as much as possible.
|
|
18
|
+
* So if we missed some case here it is still acceptable.
|
|
19
|
+
* @param event The keyboard event object
|
|
20
|
+
*/
|
|
21
|
+
export function isCharacterValue(event) {
|
|
22
|
+
return !isModifierKey(event) && !!event.key && event.key.length == 1;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=eventUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventUtils.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-core/lib/publicApi/domUtils/eventUtils.ts"],"names":[],"mappings":"AAAA,IAAM,cAAc,GAAG,SAAS,CAAC;AACjC,IAAM,aAAa,GAAG,KAAK,CAAC;AAC5B,IAAM,cAAc,GAAG,MAAM,CAAC;AAE9B;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAoB;IAC9C,IAAM,SAAS,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,cAAc,CAAC;IAChE,IAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,aAAa,CAAC;IAC7D,IAAM,SAAS,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,cAAc,CAAC;IAEhE,OAAO,SAAS,IAAI,QAAQ,IAAI,SAAS,CAAC;AAC9C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAoB;IACjD,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;AACzE,CAAC","sourcesContent":["const CTRL_CHAR_CODE = 'Control';\nconst ALT_CHAR_CODE = 'Alt';\nconst META_CHAR_CODE = 'Meta';\n\n/**\n * Returns true when the event was fired from a modifier key, otherwise false\n * @param event The keyboard event object\n */\nexport function isModifierKey(event: KeyboardEvent): boolean {\n const isCtrlKey = event.ctrlKey || event.key === CTRL_CHAR_CODE;\n const isAltKey = event.altKey || event.key === ALT_CHAR_CODE;\n const isMetaKey = event.metaKey || event.key === META_CHAR_CODE;\n\n return isCtrlKey || isAltKey || isMetaKey;\n}\n\n/**\n * Returns true when the event was fired from a key that produces a character value, otherwise false\n * This detection is not 100% accurate. event.key is not fully supported by all browsers, and in some browsers (e.g. IE),\n * event.key is longer than 1 for num pad input. But here we just want to improve performance as much as possible.\n * So if we missed some case here it is still acceptable.\n * @param event The keyboard event object\n */\nexport function isCharacterValue(event: KeyboardEvent): boolean {\n return !isModifierKey(event) && !!event.key && event.key.length == 1;\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if the given character is punctuation
|
|
3
|
+
* @param char The character to check
|
|
4
|
+
*/
|
|
5
|
+
export declare function isPunctuation(char: string): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Check if the give character is a space. A space can be normal ASCII pace (32) or non-break space (160) or other kinds of spaces
|
|
8
|
+
* such as ZeroWidthSpace, ...
|
|
9
|
+
* @param char The character to check
|
|
10
|
+
*/
|
|
11
|
+
export declare function isSpace(char: string): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Normalize spaces of the given string. After normalization, all leading (for forward) or trailing (for backward) spaces
|
|
14
|
+
* will be replaces with non-break space (160)
|
|
15
|
+
* @param txt The string to normalize
|
|
16
|
+
* @param isForward Whether normalize forward or backward
|
|
17
|
+
*/
|
|
18
|
+
export declare function normalizeText(txt: string, isForward: boolean): string;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
var SPACES_REGEX = /[\u2000\u2009\u200a\u200b\u202f\u205f\u3000\s\t\r\n]/gm;
|
|
2
|
+
var PUNCTUATIONS = '.,?!:"()[]\\/';
|
|
3
|
+
/**
|
|
4
|
+
* Check if the given character is punctuation
|
|
5
|
+
* @param char The character to check
|
|
6
|
+
*/
|
|
7
|
+
export function isPunctuation(char) {
|
|
8
|
+
return PUNCTUATIONS.indexOf(char) >= 0;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Check if the give character is a space. A space can be normal ASCII pace (32) or non-break space (160) or other kinds of spaces
|
|
12
|
+
* such as ZeroWidthSpace, ...
|
|
13
|
+
* @param char The character to check
|
|
14
|
+
*/
|
|
15
|
+
export function isSpace(char) {
|
|
16
|
+
var _a;
|
|
17
|
+
var code = (_a = char === null || char === void 0 ? void 0 : char.charCodeAt(0)) !== null && _a !== void 0 ? _a : 0;
|
|
18
|
+
return code == 160 || code == 32 || SPACES_REGEX.test(char);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Normalize spaces of the given string. After normalization, all leading (for forward) or trailing (for backward) spaces
|
|
22
|
+
* will be replaces with non-break space (160)
|
|
23
|
+
* @param txt The string to normalize
|
|
24
|
+
* @param isForward Whether normalize forward or backward
|
|
25
|
+
*/
|
|
26
|
+
export function normalizeText(txt, isForward) {
|
|
27
|
+
return txt.replace(isForward ? /^\u0020+/ : /\u0020+$/, '\u00A0');
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=stringUtil.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stringUtil.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-core/lib/publicApi/domUtils/stringUtil.ts"],"names":[],"mappings":"AAAA,IAAM,YAAY,GAAG,2DAA2D,CAAC;AACjF,IAAM,YAAY,GAAG,eAAe,CAAC;AAErC;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACtC,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;;IAChC,IAAM,IAAI,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,CAAC,CAAC,CAAC,mCAAI,CAAC,CAAC;IACtC,OAAO,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,SAAkB;IACzD,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AACtE,CAAC","sourcesContent":["const SPACES_REGEX = /[\\u2000\\u2009\\u200a\\u200b\\u202f\\u205f\\u3000\\s\\t\\r\\n]/gm;\nconst PUNCTUATIONS = '.,?!:\"()[]\\\\/';\n\n/**\n * Check if the given character is punctuation\n * @param char The character to check\n */\nexport function isPunctuation(char: string) {\n return PUNCTUATIONS.indexOf(char) >= 0;\n}\n\n/**\n * Check if the give character is a space. A space can be normal ASCII pace (32) or non-break space (160) or other kinds of spaces\n * such as ZeroWidthSpace, ...\n * @param char The character to check\n */\nexport function isSpace(char: string) {\n const code = char?.charCodeAt(0) ?? 0;\n return code == 160 || code == 32 || SPACES_REGEX.test(char);\n}\n\n/**\n * Normalize spaces of the given string. After normalization, all leading (for forward) or trailing (for backward) spaces\n * will be replaces with non-break space (160)\n * @param txt The string to normalize\n * @param isForward Whether normalize forward or backward\n */\nexport function normalizeText(txt: string, isForward: boolean): string {\n return txt.replace(isForward ? /^\\u0020+/ : /\\u0020+$/, '\\u00A0');\n}\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ContentModelDocument } from 'roosterjs-content-model-types';
|
|
2
|
+
/**
|
|
3
|
+
* Function type used for cloneModel API to specify how to handle cached element when clone a model
|
|
4
|
+
* @param node The cached node
|
|
5
|
+
* @param type Type of the node, it can be
|
|
6
|
+
* - general: DOM element of ContentModelGeneralSegment or ContentModelGeneralBlock
|
|
7
|
+
* - entity: Wrapper element in ContentModelEntity
|
|
8
|
+
* - cache: Cached node in other model element that supports cache
|
|
9
|
+
*/
|
|
10
|
+
export declare type CachedElementHandler = (node: HTMLElement, type: 'general' | 'entity' | 'cache') => HTMLElement | undefined;
|
|
11
|
+
/**
|
|
12
|
+
*
|
|
13
|
+
* Options for cloneModel API
|
|
14
|
+
*/
|
|
15
|
+
export interface CloneModelOptions {
|
|
16
|
+
/**
|
|
17
|
+
* Specify how to deal with cached element, including cached block element, element in General Model, and wrapper element in Entity
|
|
18
|
+
* - True: Cloned model will have the same reference to the cached element
|
|
19
|
+
* - False/Not passed: For cached block element, cached element will be undefined. For General Model and Entity, the element will have deep clone and assign to the cloned model
|
|
20
|
+
* - A callback: invoke the callback with the source cached element and a string to specify model type, let the callback return the expected value of cached element.
|
|
21
|
+
* For General Model and Entity, the callback must return a valid element, otherwise there will be exception thrown.
|
|
22
|
+
*/
|
|
23
|
+
includeCachedElement?: boolean | CachedElementHandler;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Clone a content model
|
|
27
|
+
* @param model The content model to clone
|
|
28
|
+
* @param options @optional Options to specify customize the clone behavior
|
|
29
|
+
*/
|
|
30
|
+
export declare function cloneModel(model: ContentModelDocument, options?: CloneModelOptions): ContentModelDocument;
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { __assign } from "tslib";
|
|
2
|
+
/**
|
|
3
|
+
* Clone a content model
|
|
4
|
+
* @param model The content model to clone
|
|
5
|
+
* @param options @optional Options to specify customize the clone behavior
|
|
6
|
+
*/
|
|
7
|
+
export function cloneModel(model, options) {
|
|
8
|
+
var newModel = cloneBlockGroupBase(model, options || {});
|
|
9
|
+
if (model.format) {
|
|
10
|
+
newModel.format = Object.assign({}, model.format);
|
|
11
|
+
}
|
|
12
|
+
return newModel;
|
|
13
|
+
}
|
|
14
|
+
function cloneBlock(block, options) {
|
|
15
|
+
switch (block.blockType) {
|
|
16
|
+
case 'BlockGroup':
|
|
17
|
+
switch (block.blockGroupType) {
|
|
18
|
+
case 'FormatContainer':
|
|
19
|
+
return cloneFormatContainer(block, options);
|
|
20
|
+
case 'General':
|
|
21
|
+
return cloneGeneralBlock(block, options);
|
|
22
|
+
case 'ListItem':
|
|
23
|
+
return cloneListItem(block, options);
|
|
24
|
+
}
|
|
25
|
+
break;
|
|
26
|
+
case 'Divider':
|
|
27
|
+
return cloneDivider(block, options);
|
|
28
|
+
case 'Entity':
|
|
29
|
+
return cloneEntity(block, options);
|
|
30
|
+
case 'Paragraph':
|
|
31
|
+
return cloneParagraph(block, options);
|
|
32
|
+
case 'Table':
|
|
33
|
+
return cloneTable(block, options);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function cloneSegment(segment, options) {
|
|
37
|
+
switch (segment.segmentType) {
|
|
38
|
+
case 'Br':
|
|
39
|
+
return cloneSegmentBase(segment);
|
|
40
|
+
case 'Entity':
|
|
41
|
+
return cloneEntity(segment, options);
|
|
42
|
+
case 'General':
|
|
43
|
+
return cloneGeneralSegment(segment, options);
|
|
44
|
+
case 'Image':
|
|
45
|
+
return cloneImage(segment);
|
|
46
|
+
case 'SelectionMarker':
|
|
47
|
+
return cloneSelectionMarker(segment);
|
|
48
|
+
case 'Text':
|
|
49
|
+
return cloneText(segment);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function cloneModelWithFormat(model) {
|
|
53
|
+
return {
|
|
54
|
+
format: Object.assign({}, model.format),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function cloneModelWithDataset(model) {
|
|
58
|
+
return {
|
|
59
|
+
dataset: Object.assign({}, model.dataset),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function cloneBlockBase(block) {
|
|
63
|
+
var blockType = block.blockType;
|
|
64
|
+
return Object.assign({
|
|
65
|
+
blockType: blockType,
|
|
66
|
+
}, cloneModelWithFormat(block));
|
|
67
|
+
}
|
|
68
|
+
function cloneBlockGroupBase(group, options) {
|
|
69
|
+
var blockGroupType = group.blockGroupType, blocks = group.blocks;
|
|
70
|
+
return {
|
|
71
|
+
blockGroupType: blockGroupType,
|
|
72
|
+
blocks: blocks.map(function (block) { return cloneBlock(block, options); }),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function cloneSegmentBase(segment) {
|
|
76
|
+
var segmentType = segment.segmentType, isSelected = segment.isSelected, code = segment.code, link = segment.link;
|
|
77
|
+
var newSegment = Object.assign({
|
|
78
|
+
segmentType: segmentType,
|
|
79
|
+
isSelected: isSelected,
|
|
80
|
+
}, cloneModelWithFormat(segment));
|
|
81
|
+
if (code) {
|
|
82
|
+
newSegment.code = cloneModelWithFormat(code);
|
|
83
|
+
}
|
|
84
|
+
if (link) {
|
|
85
|
+
newSegment.link = Object.assign(cloneModelWithFormat(link), cloneModelWithDataset(link));
|
|
86
|
+
}
|
|
87
|
+
return newSegment;
|
|
88
|
+
}
|
|
89
|
+
function cloneEntity(entity, options) {
|
|
90
|
+
var wrapper = entity.wrapper, entityFormat = entity.entityFormat;
|
|
91
|
+
return Object.assign({
|
|
92
|
+
wrapper: handleCachedElement(wrapper, 'entity', options),
|
|
93
|
+
entityFormat: __assign({}, entityFormat),
|
|
94
|
+
}, cloneBlockBase(entity), cloneSegmentBase(entity));
|
|
95
|
+
}
|
|
96
|
+
function cloneParagraph(paragraph, options) {
|
|
97
|
+
var cachedElement = paragraph.cachedElement, segments = paragraph.segments, isImplicit = paragraph.isImplicit, decorator = paragraph.decorator, segmentFormat = paragraph.segmentFormat;
|
|
98
|
+
var newParagraph = Object.assign({
|
|
99
|
+
cachedElement: handleCachedElement(cachedElement, 'cache', options),
|
|
100
|
+
isImplicit: isImplicit,
|
|
101
|
+
segments: segments.map(function (segment) { return cloneSegment(segment, options); }),
|
|
102
|
+
segmentFormat: segmentFormat ? __assign({}, segmentFormat) : undefined,
|
|
103
|
+
}, cloneBlockBase(paragraph), cloneModelWithFormat(paragraph));
|
|
104
|
+
if (decorator) {
|
|
105
|
+
newParagraph.decorator = Object.assign({
|
|
106
|
+
tagName: decorator.tagName,
|
|
107
|
+
}, cloneModelWithFormat(decorator));
|
|
108
|
+
}
|
|
109
|
+
return newParagraph;
|
|
110
|
+
}
|
|
111
|
+
function cloneTable(table, options) {
|
|
112
|
+
var cachedElement = table.cachedElement, widths = table.widths, rows = table.rows;
|
|
113
|
+
return Object.assign({
|
|
114
|
+
cachedElement: handleCachedElement(cachedElement, 'cache', options),
|
|
115
|
+
widths: Array.from(widths),
|
|
116
|
+
rows: rows.map(function (row) { return cloneTableRow(row, options); }),
|
|
117
|
+
}, cloneBlockBase(table), cloneModelWithDataset(table));
|
|
118
|
+
}
|
|
119
|
+
function cloneTableRow(row, options) {
|
|
120
|
+
var height = row.height, cells = row.cells, cachedElement = row.cachedElement;
|
|
121
|
+
return Object.assign({
|
|
122
|
+
height: height,
|
|
123
|
+
cachedElement: handleCachedElement(cachedElement, 'cache', options),
|
|
124
|
+
cells: cells.map(function (cell) { return cloneTableCell(cell, options); }),
|
|
125
|
+
}, cloneModelWithFormat(row));
|
|
126
|
+
}
|
|
127
|
+
function cloneTableCell(cell, options) {
|
|
128
|
+
var cachedElement = cell.cachedElement, isSelected = cell.isSelected, spanAbove = cell.spanAbove, spanLeft = cell.spanLeft, isHeader = cell.isHeader;
|
|
129
|
+
return Object.assign({
|
|
130
|
+
cachedElement: handleCachedElement(cachedElement, 'cache', options),
|
|
131
|
+
isSelected: isSelected,
|
|
132
|
+
spanAbove: spanAbove,
|
|
133
|
+
spanLeft: spanLeft,
|
|
134
|
+
isHeader: isHeader,
|
|
135
|
+
}, cloneBlockGroupBase(cell, options), cloneModelWithFormat(cell), cloneModelWithDataset(cell));
|
|
136
|
+
}
|
|
137
|
+
function cloneFormatContainer(container, options) {
|
|
138
|
+
var tagName = container.tagName, cachedElement = container.cachedElement;
|
|
139
|
+
var newContainer = Object.assign({ tagName: tagName, cachedElement: handleCachedElement(cachedElement, 'cache', options) }, cloneBlockBase(container), cloneBlockGroupBase(container, options));
|
|
140
|
+
if (container.zeroFontSize) {
|
|
141
|
+
newContainer.zeroFontSize = true;
|
|
142
|
+
}
|
|
143
|
+
return newContainer;
|
|
144
|
+
}
|
|
145
|
+
function cloneListItem(item, options) {
|
|
146
|
+
var formatHolder = item.formatHolder, levels = item.levels;
|
|
147
|
+
return Object.assign({
|
|
148
|
+
formatHolder: cloneSelectionMarker(formatHolder),
|
|
149
|
+
levels: levels.map(cloneListLevel),
|
|
150
|
+
}, cloneBlockBase(item), cloneBlockGroupBase(item, options));
|
|
151
|
+
}
|
|
152
|
+
function cloneListLevel(level) {
|
|
153
|
+
var listType = level.listType;
|
|
154
|
+
return Object.assign({ listType: listType }, cloneModelWithFormat(level), cloneModelWithDataset(level));
|
|
155
|
+
}
|
|
156
|
+
function cloneDivider(divider, options) {
|
|
157
|
+
var tagName = divider.tagName, isSelected = divider.isSelected, cachedElement = divider.cachedElement;
|
|
158
|
+
return Object.assign({
|
|
159
|
+
isSelected: isSelected,
|
|
160
|
+
tagName: tagName,
|
|
161
|
+
cachedElement: handleCachedElement(cachedElement, 'cache', options),
|
|
162
|
+
}, cloneBlockBase(divider));
|
|
163
|
+
}
|
|
164
|
+
function cloneGeneralBlock(general, options) {
|
|
165
|
+
var element = general.element;
|
|
166
|
+
return Object.assign({
|
|
167
|
+
element: handleCachedElement(element, 'general', options),
|
|
168
|
+
}, cloneBlockBase(general), cloneBlockGroupBase(general, options));
|
|
169
|
+
}
|
|
170
|
+
function cloneSelectionMarker(marker) {
|
|
171
|
+
return Object.assign({ isSelected: marker.isSelected }, cloneSegmentBase(marker));
|
|
172
|
+
}
|
|
173
|
+
function cloneImage(image) {
|
|
174
|
+
var src = image.src, alt = image.alt, title = image.title, isSelectedAsImageSelection = image.isSelectedAsImageSelection;
|
|
175
|
+
return Object.assign({ src: src, alt: alt, title: title, isSelectedAsImageSelection: isSelectedAsImageSelection }, cloneSegmentBase(image), cloneModelWithDataset(image));
|
|
176
|
+
}
|
|
177
|
+
function cloneGeneralSegment(general, options) {
|
|
178
|
+
return Object.assign(cloneGeneralBlock(general, options), cloneSegmentBase(general));
|
|
179
|
+
}
|
|
180
|
+
function cloneText(textSegment) {
|
|
181
|
+
var text = textSegment.text;
|
|
182
|
+
return Object.assign({ text: text }, cloneSegmentBase(textSegment));
|
|
183
|
+
}
|
|
184
|
+
function handleCachedElement(node, type, options) {
|
|
185
|
+
var includeCachedElement = options.includeCachedElement;
|
|
186
|
+
if (!node) {
|
|
187
|
+
return undefined;
|
|
188
|
+
}
|
|
189
|
+
else if (!includeCachedElement) {
|
|
190
|
+
return type == 'cache' ? undefined : node.cloneNode(true /*deep*/);
|
|
191
|
+
}
|
|
192
|
+
else if (includeCachedElement === true) {
|
|
193
|
+
return node;
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
var result = includeCachedElement(node, type);
|
|
197
|
+
if ((type == 'general' || type == 'entity') && !result) {
|
|
198
|
+
throw new Error('Entity and General Model must has wrapper element');
|
|
199
|
+
}
|
|
200
|
+
return result;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=cloneModel.js.map
|