roosterjs-content-model-dom 9.53.0 → 9.55.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/domToModel/context/createDomToModelContext.d.ts +1 -1
- package/lib/domToModel/context/createDomToModelContext.js.map +1 -1
- package/lib/domToModel/processors/formatContainerProcessor.js +3 -1
- package/lib/domToModel/processors/formatContainerProcessor.js.map +1 -1
- package/lib/domUtils/event/extractClipboardItems.d.ts +1 -1
- package/lib/domUtils/event/extractClipboardItems.js +2 -2
- package/lib/domUtils/event/extractClipboardItems.js.map +1 -1
- package/lib/domUtils/selection/pruneUnselectedModel.js +8 -5
- package/lib/domUtils/selection/pruneUnselectedModel.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +3 -2
- package/lib/index.js.map +1 -1
- package/lib/modelApi/common/normalizeSegment.js +33 -2
- package/lib/modelApi/common/normalizeSegment.js.map +1 -1
- package/lib/modelApi/editing/cloneModel.d.ts +6 -0
- package/lib/modelApi/editing/cloneModel.js +13 -1
- package/lib/modelApi/editing/cloneModel.js.map +1 -1
- package/lib/modelApi/selection/setSelection.js +32 -6
- package/lib/modelApi/selection/setSelection.js.map +1 -1
- package/lib/modelToDom/handlers/handleBlockGroupChildren.js +9 -2
- package/lib/modelToDom/handlers/handleBlockGroupChildren.js.map +1 -1
- package/lib-amd/domToModel/context/createDomToModelContext.d.ts +1 -1
- package/lib-amd/domToModel/context/createDomToModelContext.js.map +1 -1
- package/lib-amd/domToModel/processors/formatContainerProcessor.js +3 -1
- package/lib-amd/domToModel/processors/formatContainerProcessor.js.map +1 -1
- package/lib-amd/domUtils/event/extractClipboardItems.d.ts +1 -1
- package/lib-amd/domUtils/event/extractClipboardItems.js +2 -2
- package/lib-amd/domUtils/event/extractClipboardItems.js.map +1 -1
- package/lib-amd/domUtils/selection/pruneUnselectedModel.js +8 -5
- package/lib-amd/domUtils/selection/pruneUnselectedModel.js.map +1 -1
- package/lib-amd/index.d.ts +1 -1
- package/lib-amd/index.js +2 -1
- package/lib-amd/index.js.map +1 -1
- package/lib-amd/modelApi/common/normalizeSegment.js +33 -2
- package/lib-amd/modelApi/common/normalizeSegment.js.map +1 -1
- package/lib-amd/modelApi/editing/cloneModel.d.ts +6 -0
- package/lib-amd/modelApi/editing/cloneModel.js +13 -1
- package/lib-amd/modelApi/editing/cloneModel.js.map +1 -1
- package/lib-amd/modelApi/selection/setSelection.js +32 -7
- package/lib-amd/modelApi/selection/setSelection.js.map +1 -1
- package/lib-amd/modelToDom/handlers/handleBlockGroupChildren.js +9 -2
- package/lib-amd/modelToDom/handlers/handleBlockGroupChildren.js.map +1 -1
- package/lib-mjs/domToModel/context/createDomToModelContext.d.ts +1 -1
- package/lib-mjs/domToModel/context/createDomToModelContext.js.map +1 -1
- package/lib-mjs/domToModel/processors/formatContainerProcessor.js +3 -1
- package/lib-mjs/domToModel/processors/formatContainerProcessor.js.map +1 -1
- package/lib-mjs/domUtils/event/extractClipboardItems.d.ts +1 -1
- package/lib-mjs/domUtils/event/extractClipboardItems.js +2 -2
- package/lib-mjs/domUtils/event/extractClipboardItems.js.map +1 -1
- package/lib-mjs/domUtils/selection/pruneUnselectedModel.js +8 -5
- package/lib-mjs/domUtils/selection/pruneUnselectedModel.js.map +1 -1
- package/lib-mjs/index.d.ts +1 -1
- package/lib-mjs/index.js +1 -1
- package/lib-mjs/index.js.map +1 -1
- package/lib-mjs/modelApi/common/normalizeSegment.js +33 -2
- package/lib-mjs/modelApi/common/normalizeSegment.js.map +1 -1
- package/lib-mjs/modelApi/editing/cloneModel.d.ts +6 -0
- package/lib-mjs/modelApi/editing/cloneModel.js +11 -0
- package/lib-mjs/modelApi/editing/cloneModel.js.map +1 -1
- package/lib-mjs/modelApi/selection/setSelection.js +32 -6
- package/lib-mjs/modelApi/selection/setSelection.js.map +1 -1
- package/lib-mjs/modelToDom/handlers/handleBlockGroupChildren.js +9 -2
- package/lib-mjs/modelToDom/handlers/handleBlockGroupChildren.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloneModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/cloneModel.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ContentModelBlock,\n ContentModelBlockBase,\n ContentModelBlockGroupBase,\n ContentModelBlockGroupType,\n ContentModelBlockType,\n ContentModelDivider,\n ContentModelDocument,\n ContentModelEntity,\n ContentModelFormatBase,\n ContentModelFormatContainer,\n ContentModelGeneralBlock,\n ContentModelImage,\n ContentModelListItem,\n ContentModelParagraph,\n ContentModelSegment,\n ContentModelSegmentBase,\n ContentModelSegmentType,\n ContentModelSelectionMarker,\n ContentModelTable,\n ContentModelTableCell,\n ContentModelWithDataset,\n ContentModelWithFormat,\n ContentModelGeneralSegment,\n ContentModelText,\n ContentModelTableRow,\n ContentModelListLevel,\n CloneModelOptions,\n ReadonlyContentModelDocument,\n ReadonlyContentModelBlockGroupBase,\n ReadonlyContentModelBlock,\n ReadonlyContentModelFormatContainer,\n ReadonlyContentModelBlockBase,\n ReadonlyContentModelGeneralBlock,\n ReadonlyContentModelListItem,\n ReadonlyContentModelSelectionMarker,\n ReadonlyContentModelSegmentBase,\n ReadonlyContentModelWithDataset,\n ReadonlyContentModelDivider,\n ReadonlyContentModelListLevel,\n ReadonlyContentModelParagraph,\n ReadonlyContentModelSegment,\n ReadonlyContentModelTable,\n ReadonlyContentModelTableRow,\n ReadonlyContentModelTableCell,\n ReadonlyContentModelGeneralSegment,\n ReadonlyContentModelImage,\n ReadonlyContentModelText,\n} from 'roosterjs-content-model-types';\n\n/**\n * Clone a content model\n * @param model The content model to clone\n * @param options @optional Options to specify customize the clone behavior\n */\nexport function cloneModel(\n model: ReadonlyContentModelDocument,\n options?: CloneModelOptions\n): ContentModelDocument {\n const newModel: ContentModelDocument = cloneBlockGroupBase(model, options || {});\n\n if (model.format) {\n newModel.format = Object.assign({}, model.format);\n }\n\n return newModel;\n}\n\nfunction cloneBlock(\n block: ReadonlyContentModelBlock,\n options: CloneModelOptions\n): ContentModelBlock {\n switch (block.blockType) {\n case 'BlockGroup':\n switch (block.blockGroupType) {\n case 'FormatContainer':\n return cloneFormatContainer(block, options);\n case 'General':\n return cloneGeneralBlock(block, options);\n case 'ListItem':\n return cloneListItem(block, options);\n }\n break;\n case 'Divider':\n return cloneDivider(block, options);\n case 'Entity':\n return cloneEntity(block, options);\n case 'Paragraph':\n return cloneParagraph(block, options);\n case 'Table':\n return cloneTable(block, options);\n }\n}\n\nfunction cloneSegment(\n segment: ReadonlyContentModelSegment,\n options: CloneModelOptions\n): ContentModelSegment {\n switch (segment.segmentType) {\n case 'Br':\n return cloneSegmentBase(segment);\n case 'Entity':\n return cloneEntity(segment, options);\n case 'General':\n return cloneGeneralSegment(segment, options);\n case 'Image':\n return cloneImage(segment);\n case 'SelectionMarker':\n return cloneSelectionMarker(segment);\n case 'Text':\n return cloneText(segment);\n }\n}\n\nfunction cloneModelWithFormat<T extends ContentModelFormatBase>(\n model: ContentModelWithFormat<T>\n): ContentModelWithFormat<T> {\n return {\n format: Object.assign({}, model.format),\n };\n}\n\nfunction cloneModelWithDataset<T>(\n model: ReadonlyContentModelWithDataset<T>\n): ContentModelWithDataset<T> {\n return {\n dataset: Object.assign({}, model.dataset),\n };\n}\n\nfunction cloneBlockBase<T extends ContentModelBlockType>(\n block: ReadonlyContentModelBlockBase<T>\n): ContentModelBlockBase<T> {\n const { blockType } = block;\n\n return Object.assign(\n {\n blockType,\n },\n cloneModelWithFormat(block)\n );\n}\n\nfunction cloneBlockGroupBase<T extends ContentModelBlockGroupType>(\n group: ReadonlyContentModelBlockGroupBase<T>,\n options: CloneModelOptions\n): ContentModelBlockGroupBase<T> {\n const { blockGroupType, blocks } = group;\n\n return {\n blockGroupType: blockGroupType,\n blocks: blocks.map(block => cloneBlock(block, options)),\n };\n}\n\nfunction cloneSegmentBase<T extends ContentModelSegmentType>(\n segment: ReadonlyContentModelSegmentBase<T>\n): ContentModelSegmentBase<T> {\n const { segmentType, isSelected, code, link } = segment;\n\n const newSegment: ContentModelSegmentBase<T> = Object.assign(\n {\n segmentType,\n isSelected,\n },\n cloneModelWithFormat(segment)\n );\n\n if (code) {\n newSegment.code = cloneModelWithFormat(code);\n }\n if (link) {\n newSegment.link = Object.assign(cloneModelWithFormat(link), cloneModelWithDataset(link));\n }\n\n return newSegment;\n}\n\nfunction cloneEntity(entity: ContentModelEntity, options: CloneModelOptions): ContentModelEntity {\n const { wrapper, entityFormat } = entity;\n\n return Object.assign(\n {\n wrapper: handleCachedElement(wrapper, 'entity', options),\n entityFormat: { ...entityFormat },\n },\n cloneBlockBase(entity),\n cloneSegmentBase(entity)\n );\n}\n\nfunction cloneParagraph(\n paragraph: ReadonlyContentModelParagraph,\n options: CloneModelOptions\n): ContentModelParagraph {\n const { cachedElement, segments, isImplicit, decorator, segmentFormat } = paragraph;\n\n const newParagraph: ContentModelParagraph = Object.assign(\n {\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n isImplicit,\n segments: segments.map(segment => cloneSegment(segment, options)),\n segmentFormat: segmentFormat ? { ...segmentFormat } : undefined,\n },\n cloneBlockBase(paragraph),\n cloneModelWithFormat(paragraph)\n );\n\n if (decorator) {\n newParagraph.decorator = Object.assign(\n {\n tagName: decorator.tagName,\n },\n cloneModelWithFormat(decorator)\n );\n }\n\n return newParagraph;\n}\n\nfunction cloneTable(\n table: ReadonlyContentModelTable,\n options: CloneModelOptions\n): ContentModelTable {\n const { cachedElement, widths, rows } = table;\n\n return Object.assign(\n {\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n widths: Array.from(widths),\n rows: rows.map(row => cloneTableRow(row, options)),\n },\n cloneBlockBase(table),\n cloneModelWithDataset(table)\n );\n}\n\nfunction cloneTableRow(\n row: ReadonlyContentModelTableRow,\n options: CloneModelOptions\n): ContentModelTableRow {\n const { height, cells, cachedElement } = row;\n\n return Object.assign(\n {\n height,\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n cells: cells.map(cell => cloneTableCell(cell, options)),\n },\n cloneModelWithFormat(row)\n );\n}\n\nfunction cloneTableCell(\n cell: ReadonlyContentModelTableCell,\n options: CloneModelOptions\n): ContentModelTableCell {\n const { cachedElement, isSelected, spanAbove, spanLeft, isHeader } = cell;\n\n return Object.assign(\n {\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n isSelected,\n spanAbove,\n spanLeft,\n isHeader,\n },\n cloneBlockGroupBase(cell, options),\n cloneModelWithFormat(cell),\n cloneModelWithDataset(cell)\n );\n}\n\nfunction cloneFormatContainer(\n container: ReadonlyContentModelFormatContainer,\n options: CloneModelOptions\n): ContentModelFormatContainer {\n const { tagName, cachedElement } = container;\n const newContainer: ContentModelFormatContainer = Object.assign(\n { tagName, cachedElement: handleCachedElement(cachedElement, 'cache', options) },\n cloneBlockBase(container),\n cloneBlockGroupBase(container, options)\n );\n\n if (container.zeroFontSize) {\n newContainer.zeroFontSize = true;\n }\n\n return newContainer;\n}\n\nfunction cloneListItem(\n item: ReadonlyContentModelListItem,\n options: CloneModelOptions\n): ContentModelListItem {\n const { formatHolder, levels, cachedElement } = item;\n\n return Object.assign(\n {\n formatHolder: cloneSelectionMarker(formatHolder),\n levels: levels.map(cloneListLevel),\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n },\n cloneBlockBase(item),\n cloneBlockGroupBase(item, options)\n );\n}\n\nfunction cloneListLevel(level: ReadonlyContentModelListLevel): ContentModelListLevel {\n const { listType } = level;\n\n return Object.assign({ listType }, cloneModelWithFormat(level), cloneModelWithDataset(level));\n}\nfunction cloneDivider(\n divider: ReadonlyContentModelDivider,\n options: CloneModelOptions\n): ContentModelDivider {\n const { tagName, isSelected, cachedElement } = divider;\n\n return Object.assign(\n {\n isSelected,\n tagName,\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n },\n cloneBlockBase(divider)\n );\n}\n\nfunction cloneGeneralBlock(\n general: ReadonlyContentModelGeneralBlock,\n options: CloneModelOptions\n): ContentModelGeneralBlock {\n const { element } = general;\n\n return Object.assign(\n {\n element: handleCachedElement(element, 'general', options),\n },\n cloneBlockBase(general),\n cloneBlockGroupBase(general, options)\n );\n}\n\nfunction cloneSelectionMarker(\n marker: ReadonlyContentModelSelectionMarker\n): ContentModelSelectionMarker {\n return Object.assign({ isSelected: marker.isSelected }, cloneSegmentBase(marker));\n}\n\nfunction cloneImage(image: ReadonlyContentModelImage): ContentModelImage {\n const { src, alt, title, isSelectedAsImageSelection } = image;\n\n return Object.assign(\n { src, alt, title, isSelectedAsImageSelection },\n cloneSegmentBase(image),\n cloneModelWithDataset(image)\n );\n}\n\nfunction cloneGeneralSegment(\n general: ReadonlyContentModelGeneralSegment,\n options: CloneModelOptions\n): ContentModelGeneralSegment {\n return Object.assign(cloneGeneralBlock(general, options), cloneSegmentBase(general));\n}\n\nfunction cloneText(textSegment: ReadonlyContentModelText): ContentModelText {\n const { text } = textSegment;\n return Object.assign({ text }, cloneSegmentBase(textSegment));\n}\n\nfunction handleCachedElement<T extends HTMLElement>(\n node: T,\n type: 'general' | 'entity',\n options: CloneModelOptions\n): T;\n\nfunction handleCachedElement<T extends HTMLElement>(\n node: T | undefined,\n type: 'cache',\n options: CloneModelOptions\n): T | undefined;\n\nfunction handleCachedElement<T extends HTMLElement>(\n node: T | undefined,\n type: 'general' | 'entity' | 'cache',\n options: CloneModelOptions\n): T | undefined {\n const { includeCachedElement } = options;\n\n if (!node) {\n return undefined;\n } else if (!includeCachedElement) {\n return type == 'cache' ? undefined : (node.cloneNode(true /*deep*/) as T);\n } else if (includeCachedElement === true) {\n return node;\n } else {\n const result = includeCachedElement(node, type) as T | undefined;\n\n if ((type == 'general' || type == 'entity') && !result) {\n throw new Error('Entity and General Model must has wrapper element');\n }\n\n return result;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"cloneModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/cloneModel.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ContentModelBlock,\n ContentModelBlockBase,\n ContentModelBlockGroupBase,\n ContentModelBlockGroupType,\n ContentModelBlockType,\n ContentModelDivider,\n ContentModelDocument,\n ContentModelEntity,\n ContentModelFormatBase,\n ContentModelFormatContainer,\n ContentModelGeneralBlock,\n ContentModelImage,\n ContentModelListItem,\n ContentModelParagraph,\n ContentModelSegment,\n ContentModelSegmentBase,\n ContentModelSegmentType,\n ContentModelSelectionMarker,\n ContentModelTable,\n ContentModelTableCell,\n ContentModelWithDataset,\n ContentModelWithFormat,\n ContentModelGeneralSegment,\n ContentModelText,\n ContentModelTableRow,\n ContentModelListLevel,\n CloneModelOptions,\n ReadonlyContentModelDocument,\n ReadonlyContentModelBlockGroupBase,\n ReadonlyContentModelBlock,\n ReadonlyContentModelFormatContainer,\n ReadonlyContentModelBlockBase,\n ReadonlyContentModelGeneralBlock,\n ReadonlyContentModelListItem,\n ReadonlyContentModelSelectionMarker,\n ReadonlyContentModelSegmentBase,\n ReadonlyContentModelWithDataset,\n ReadonlyContentModelDivider,\n ReadonlyContentModelListLevel,\n ReadonlyContentModelParagraph,\n ReadonlyContentModelSegment,\n ReadonlyContentModelTable,\n ReadonlyContentModelTableRow,\n ReadonlyContentModelTableCell,\n ReadonlyContentModelGeneralSegment,\n ReadonlyContentModelImage,\n ReadonlyContentModelText,\n} from 'roosterjs-content-model-types';\n\nconst CloneOption: CloneModelOptions = {\n includeCachedElement: (node, type) => (type == 'cache' ? undefined : node),\n};\n\n/**\n * Clone a content model for paste operations, ensuring that cached elements are handled appropriately.\n * @param model The content model to clone\n * @returns A cloned content model suitable for paste operations\n */\nexport function cloneModelForPaste(model: ReadonlyContentModelDocument) {\n return cloneModel(model, CloneOption);\n}\n\n/**\n * Clone a content model\n * @param model The content model to clone\n * @param options @optional Options to specify customize the clone behavior\n */\nexport function cloneModel(\n model: ReadonlyContentModelDocument,\n options?: CloneModelOptions\n): ContentModelDocument {\n const newModel: ContentModelDocument = cloneBlockGroupBase(model, options || {});\n\n if (model.format) {\n newModel.format = Object.assign({}, model.format);\n }\n\n return newModel;\n}\n\nfunction cloneBlock(\n block: ReadonlyContentModelBlock,\n options: CloneModelOptions\n): ContentModelBlock {\n switch (block.blockType) {\n case 'BlockGroup':\n switch (block.blockGroupType) {\n case 'FormatContainer':\n return cloneFormatContainer(block, options);\n case 'General':\n return cloneGeneralBlock(block, options);\n case 'ListItem':\n return cloneListItem(block, options);\n }\n break;\n case 'Divider':\n return cloneDivider(block, options);\n case 'Entity':\n return cloneEntity(block, options);\n case 'Paragraph':\n return cloneParagraph(block, options);\n case 'Table':\n return cloneTable(block, options);\n }\n}\n\nfunction cloneSegment(\n segment: ReadonlyContentModelSegment,\n options: CloneModelOptions\n): ContentModelSegment {\n switch (segment.segmentType) {\n case 'Br':\n return cloneSegmentBase(segment);\n case 'Entity':\n return cloneEntity(segment, options);\n case 'General':\n return cloneGeneralSegment(segment, options);\n case 'Image':\n return cloneImage(segment);\n case 'SelectionMarker':\n return cloneSelectionMarker(segment);\n case 'Text':\n return cloneText(segment);\n }\n}\n\nfunction cloneModelWithFormat<T extends ContentModelFormatBase>(\n model: ContentModelWithFormat<T>\n): ContentModelWithFormat<T> {\n return {\n format: Object.assign({}, model.format),\n };\n}\n\nfunction cloneModelWithDataset<T>(\n model: ReadonlyContentModelWithDataset<T>\n): ContentModelWithDataset<T> {\n return {\n dataset: Object.assign({}, model.dataset),\n };\n}\n\nfunction cloneBlockBase<T extends ContentModelBlockType>(\n block: ReadonlyContentModelBlockBase<T>\n): ContentModelBlockBase<T> {\n const { blockType } = block;\n\n return Object.assign(\n {\n blockType,\n },\n cloneModelWithFormat(block)\n );\n}\n\nfunction cloneBlockGroupBase<T extends ContentModelBlockGroupType>(\n group: ReadonlyContentModelBlockGroupBase<T>,\n options: CloneModelOptions\n): ContentModelBlockGroupBase<T> {\n const { blockGroupType, blocks } = group;\n\n return {\n blockGroupType: blockGroupType,\n blocks: blocks.map(block => cloneBlock(block, options)),\n };\n}\n\nfunction cloneSegmentBase<T extends ContentModelSegmentType>(\n segment: ReadonlyContentModelSegmentBase<T>\n): ContentModelSegmentBase<T> {\n const { segmentType, isSelected, code, link } = segment;\n\n const newSegment: ContentModelSegmentBase<T> = Object.assign(\n {\n segmentType,\n isSelected,\n },\n cloneModelWithFormat(segment)\n );\n\n if (code) {\n newSegment.code = cloneModelWithFormat(code);\n }\n if (link) {\n newSegment.link = Object.assign(cloneModelWithFormat(link), cloneModelWithDataset(link));\n }\n\n return newSegment;\n}\n\nfunction cloneEntity(entity: ContentModelEntity, options: CloneModelOptions): ContentModelEntity {\n const { wrapper, entityFormat } = entity;\n\n return Object.assign(\n {\n wrapper: handleCachedElement(wrapper, 'entity', options),\n entityFormat: { ...entityFormat },\n },\n cloneBlockBase(entity),\n cloneSegmentBase(entity)\n );\n}\n\nfunction cloneParagraph(\n paragraph: ReadonlyContentModelParagraph,\n options: CloneModelOptions\n): ContentModelParagraph {\n const { cachedElement, segments, isImplicit, decorator, segmentFormat } = paragraph;\n\n const newParagraph: ContentModelParagraph = Object.assign(\n {\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n isImplicit,\n segments: segments.map(segment => cloneSegment(segment, options)),\n segmentFormat: segmentFormat ? { ...segmentFormat } : undefined,\n },\n cloneBlockBase(paragraph),\n cloneModelWithFormat(paragraph)\n );\n\n if (decorator) {\n newParagraph.decorator = Object.assign(\n {\n tagName: decorator.tagName,\n },\n cloneModelWithFormat(decorator)\n );\n }\n\n return newParagraph;\n}\n\nfunction cloneTable(\n table: ReadonlyContentModelTable,\n options: CloneModelOptions\n): ContentModelTable {\n const { cachedElement, widths, rows } = table;\n\n return Object.assign(\n {\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n widths: Array.from(widths),\n rows: rows.map(row => cloneTableRow(row, options)),\n },\n cloneBlockBase(table),\n cloneModelWithDataset(table)\n );\n}\n\nfunction cloneTableRow(\n row: ReadonlyContentModelTableRow,\n options: CloneModelOptions\n): ContentModelTableRow {\n const { height, cells, cachedElement } = row;\n\n return Object.assign(\n {\n height,\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n cells: cells.map(cell => cloneTableCell(cell, options)),\n },\n cloneModelWithFormat(row)\n );\n}\n\nfunction cloneTableCell(\n cell: ReadonlyContentModelTableCell,\n options: CloneModelOptions\n): ContentModelTableCell {\n const { cachedElement, isSelected, spanAbove, spanLeft, isHeader } = cell;\n\n return Object.assign(\n {\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n isSelected,\n spanAbove,\n spanLeft,\n isHeader,\n },\n cloneBlockGroupBase(cell, options),\n cloneModelWithFormat(cell),\n cloneModelWithDataset(cell)\n );\n}\n\nfunction cloneFormatContainer(\n container: ReadonlyContentModelFormatContainer,\n options: CloneModelOptions\n): ContentModelFormatContainer {\n const { tagName, cachedElement } = container;\n const newContainer: ContentModelFormatContainer = Object.assign(\n { tagName, cachedElement: handleCachedElement(cachedElement, 'cache', options) },\n cloneBlockBase(container),\n cloneBlockGroupBase(container, options)\n );\n\n if (container.zeroFontSize) {\n newContainer.zeroFontSize = true;\n }\n\n return newContainer;\n}\n\nfunction cloneListItem(\n item: ReadonlyContentModelListItem,\n options: CloneModelOptions\n): ContentModelListItem {\n const { formatHolder, levels, cachedElement } = item;\n\n return Object.assign(\n {\n formatHolder: cloneSelectionMarker(formatHolder),\n levels: levels.map(cloneListLevel),\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n },\n cloneBlockBase(item),\n cloneBlockGroupBase(item, options)\n );\n}\n\nfunction cloneListLevel(level: ReadonlyContentModelListLevel): ContentModelListLevel {\n const { listType } = level;\n\n return Object.assign({ listType }, cloneModelWithFormat(level), cloneModelWithDataset(level));\n}\nfunction cloneDivider(\n divider: ReadonlyContentModelDivider,\n options: CloneModelOptions\n): ContentModelDivider {\n const { tagName, isSelected, cachedElement } = divider;\n\n return Object.assign(\n {\n isSelected,\n tagName,\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n },\n cloneBlockBase(divider)\n );\n}\n\nfunction cloneGeneralBlock(\n general: ReadonlyContentModelGeneralBlock,\n options: CloneModelOptions\n): ContentModelGeneralBlock {\n const { element } = general;\n\n return Object.assign(\n {\n element: handleCachedElement(element, 'general', options),\n },\n cloneBlockBase(general),\n cloneBlockGroupBase(general, options)\n );\n}\n\nfunction cloneSelectionMarker(\n marker: ReadonlyContentModelSelectionMarker\n): ContentModelSelectionMarker {\n return Object.assign({ isSelected: marker.isSelected }, cloneSegmentBase(marker));\n}\n\nfunction cloneImage(image: ReadonlyContentModelImage): ContentModelImage {\n const { src, alt, title, isSelectedAsImageSelection } = image;\n\n return Object.assign(\n { src, alt, title, isSelectedAsImageSelection },\n cloneSegmentBase(image),\n cloneModelWithDataset(image)\n );\n}\n\nfunction cloneGeneralSegment(\n general: ReadonlyContentModelGeneralSegment,\n options: CloneModelOptions\n): ContentModelGeneralSegment {\n return Object.assign(cloneGeneralBlock(general, options), cloneSegmentBase(general));\n}\n\nfunction cloneText(textSegment: ReadonlyContentModelText): ContentModelText {\n const { text } = textSegment;\n return Object.assign({ text }, cloneSegmentBase(textSegment));\n}\n\nfunction handleCachedElement<T extends HTMLElement>(\n node: T,\n type: 'general' | 'entity',\n options: CloneModelOptions\n): T;\n\nfunction handleCachedElement<T extends HTMLElement>(\n node: T | undefined,\n type: 'cache',\n options: CloneModelOptions\n): T | undefined;\n\nfunction handleCachedElement<T extends HTMLElement>(\n node: T | undefined,\n type: 'general' | 'entity' | 'cache',\n options: CloneModelOptions\n): T | undefined {\n const { includeCachedElement } = options;\n\n if (!node) {\n return undefined;\n } else if (!includeCachedElement) {\n return type == 'cache' ? undefined : (node.cloneNode(true /*deep*/) as T);\n } else if (includeCachedElement === true) {\n return node;\n } else {\n const result = includeCachedElement(node, type) as T | undefined;\n\n if ((type == 'general' || type == 'entity') && !result) {\n throw new Error('Entity and General Model must has wrapper element');\n }\n\n return result;\n }\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.setSelection = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
4
5
|
var isGeneralSegment_1 = require("../typeCheck/isGeneralSegment");
|
|
5
6
|
var mutate_1 = require("../common/mutate");
|
|
6
7
|
/**
|
|
@@ -38,6 +39,7 @@ function setSelectionToBlockGroup(group, isInSelection, start, end) {
|
|
|
38
39
|
});
|
|
39
40
|
}
|
|
40
41
|
function setSelectionToBlock(block, isInSelection, start, end) {
|
|
42
|
+
var _a;
|
|
41
43
|
switch (block.blockType) {
|
|
42
44
|
case 'BlockGroup':
|
|
43
45
|
return setSelectionToBlockGroup(block, isInSelection, start, end);
|
|
@@ -58,16 +60,31 @@ function setSelectionToBlock(block, isInSelection, start, end) {
|
|
|
58
60
|
return isInSelection;
|
|
59
61
|
});
|
|
60
62
|
case 'Paragraph':
|
|
61
|
-
var
|
|
63
|
+
var state_1 = {
|
|
64
|
+
segmentsToDelete: [],
|
|
65
|
+
boundaryMarkers: [],
|
|
66
|
+
hasSelectedNonMarker: false,
|
|
67
|
+
};
|
|
62
68
|
block.segments.forEach(function (segment, i) {
|
|
63
69
|
isInSelection = handleSelection(isInSelection, segment, start, end, function (isInSelection) {
|
|
64
|
-
return setSelectionToSegment(block, segment, isInSelection,
|
|
70
|
+
return setSelectionToSegment(block, segment, isInSelection, state_1, start, end, i);
|
|
65
71
|
});
|
|
66
72
|
});
|
|
67
|
-
if (
|
|
73
|
+
if (state_1.hasSelectedNonMarker) {
|
|
74
|
+
// This paragraph contains a real (non-marker) selected segment, so any leading/trailing
|
|
75
|
+
// selection marker of the range is redundant within this paragraph and can be removed.
|
|
76
|
+
// We only do this within the same paragraph: a boundary marker at a paragraph edge must be
|
|
77
|
+
// kept to distinguish "selection starts at the beginning of this line" from "selection
|
|
78
|
+
// starts at the end of the previous line".
|
|
79
|
+
(_a = state_1.segmentsToDelete).push.apply(_a, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(state_1.boundaryMarkers), false));
|
|
80
|
+
}
|
|
81
|
+
if (state_1.segmentsToDelete.length > 0) {
|
|
68
82
|
var mutablePara = (0, mutate_1.mutateBlock)(block);
|
|
69
83
|
var index = void 0;
|
|
70
|
-
|
|
84
|
+
// Sort ascending so the pop()-based splice below always removes the highest index first,
|
|
85
|
+
// keeping the remaining indices valid (boundary markers may sit before queued deletions).
|
|
86
|
+
state_1.segmentsToDelete.sort(function (a, b) { return a - b; });
|
|
87
|
+
while ((index = state_1.segmentsToDelete.pop()) !== undefined) {
|
|
71
88
|
if (index >= 0) {
|
|
72
89
|
mutablePara.segments.splice(index, 1);
|
|
73
90
|
}
|
|
@@ -116,14 +133,23 @@ function findCell(table, cell) {
|
|
|
116
133
|
: -1;
|
|
117
134
|
return { row: row, col: col };
|
|
118
135
|
}
|
|
119
|
-
function setSelectionToSegment(paragraph, segment, isInSelection,
|
|
136
|
+
function setSelectionToSegment(paragraph, segment, isInSelection, state, start, end, i) {
|
|
137
|
+
if (segment.segmentType != 'SelectionMarker' && isInSelection) {
|
|
138
|
+
state.hasSelectedNonMarker = true;
|
|
139
|
+
}
|
|
120
140
|
switch (segment.segmentType) {
|
|
121
141
|
case 'SelectionMarker':
|
|
122
142
|
if (!isInSelection || (segment != start && segment != end)) {
|
|
123
143
|
// Delete the selection marker when
|
|
124
144
|
// 1. It is not in selection any more. Or
|
|
125
145
|
// 2. It is in middle of selection, so no need to have it
|
|
126
|
-
segmentsToDelete.push(i);
|
|
146
|
+
state.segmentsToDelete.push(i);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
// It is a leading/trailing selection marker of a range selection. Keep it for now, but
|
|
150
|
+
// remember it so it can be removed later if this same paragraph also contains a real
|
|
151
|
+
// (non-marker) selected segment, in which case the marker is redundant.
|
|
152
|
+
state.boundaryMarkers.push(i);
|
|
127
153
|
}
|
|
128
154
|
return isInSelection;
|
|
129
155
|
case 'General':
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/selection/setSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { isGeneralSegment } from '../typeCheck/isGeneralSegment';\nimport { mutateBlock, mutateSegment } from '../common/mutate';\nimport type {\n MutableType,\n ReadonlyContentModelBlock,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelParagraph,\n ReadonlyContentModelSegment,\n ReadonlyContentModelTable,\n ReadonlySelectable,\n ShallowMutableSelectable,\n TableCellCoordinate,\n} from 'roosterjs-content-model-types';\n\n/**\n * Set selection into Content Model. If the Content Model already has selection, existing selection will be overwritten by the new one.\n * @param group The root level group of Content Model\n * @param start The start selected element. If not passed, existing selection of content model will be cleared\n * @param end The end selected element. If not passed, only the start element will be selected. If passed, all elements between start and end elements will be selected\n */\nexport function setSelection(\n group: ReadonlyContentModelBlockGroup,\n start?: ReadonlySelectable,\n end?: ReadonlySelectable\n) {\n setSelectionToBlockGroup(group, false /*isInSelection*/, start || null, end || null);\n}\n\nfunction setSelectionToBlockGroup(\n group: ReadonlyContentModelBlockGroup,\n isInSelection: boolean,\n start: ReadonlySelectable | null,\n end: ReadonlySelectable | null\n): boolean {\n return handleSelection(isInSelection, group, start, end, isInSelection => {\n if (isGeneralSegment(group) && needToSetSelection(group, isInSelection)) {\n setIsSelected(mutateBlock(group), isInSelection);\n }\n\n const blocksToDelete: number[] = [];\n\n group.blocks.forEach((block, i) => {\n isInSelection = setSelectionToBlock(block, isInSelection, start, end);\n\n if (block.blockType == 'Paragraph' && block.segments.length == 0 && block.isImplicit) {\n blocksToDelete.push(i);\n }\n });\n\n let index: number | undefined;\n\n if (blocksToDelete.length > 0) {\n const mutableGroup = mutateBlock(group);\n\n while ((index = blocksToDelete.pop()) !== undefined) {\n if (index >= 0) {\n mutableGroup.blocks.splice(index, 1);\n }\n }\n }\n\n return isInSelection;\n });\n}\n\nfunction setSelectionToBlock(\n block: ReadonlyContentModelBlock,\n isInSelection: boolean,\n start: ReadonlySelectable | null,\n end: ReadonlySelectable | null\n) {\n switch (block.blockType) {\n case 'BlockGroup':\n return setSelectionToBlockGroup(block, isInSelection, start, end);\n\n case 'Table':\n return setSelectionToTable(block, isInSelection, start, end);\n\n case 'Divider':\n case 'Entity':\n return handleSelection(isInSelection, block, start, end, isInSelection => {\n if (needToSetSelection(block, isInSelection)) {\n const mutableBlock = mutateBlock(block);\n\n if (isInSelection) {\n mutableBlock.isSelected = true;\n } else {\n delete mutableBlock.isSelected;\n }\n }\n\n return isInSelection;\n });\n\n case 'Paragraph':\n const segmentsToDelete: number[] = [];\n\n block.segments.forEach((segment, i) => {\n isInSelection = handleSelection(\n isInSelection,\n segment,\n start,\n end,\n isInSelection => {\n return setSelectionToSegment(\n block,\n segment,\n isInSelection,\n segmentsToDelete,\n start,\n end,\n i\n );\n }\n );\n });\n\n if (segmentsToDelete.length > 0) {\n const mutablePara = mutateBlock(block);\n\n let index: number | undefined;\n\n while ((index = segmentsToDelete.pop()) !== undefined) {\n if (index >= 0) {\n mutablePara.segments.splice(index, 1);\n }\n }\n }\n\n return isInSelection;\n\n default:\n return isInSelection;\n }\n}\n\nfunction setSelectionToTable(\n table: ReadonlyContentModelTable,\n isInSelection: boolean,\n start: ReadonlySelectable | null,\n end: ReadonlySelectable | null\n): boolean {\n const first = findCell(table, start);\n const last = end ? findCell(table, end) : first;\n\n if (!isInSelection) {\n for (let row = 0; row < table.rows.length; row++) {\n const currentRow = table.rows[row];\n for (let col = 0; col < currentRow.cells.length; col++) {\n const currentCell = table.rows[row].cells[col];\n const isSelected =\n row >= first.row && row <= last.row && col >= first.col && col <= last.col;\n\n if (needToSetSelection(currentCell, isSelected)) {\n setIsSelected(mutateBlock(currentCell), isSelected);\n }\n\n if (!isSelected) {\n setSelectionToBlockGroup(currentCell, false /*isInSelection*/, start, end);\n }\n }\n }\n } else {\n table.rows.forEach(row =>\n row.cells.forEach(cell => {\n const wasInSelection = isInSelection;\n\n isInSelection = setSelectionToBlockGroup(cell, isInSelection, start, end);\n\n if (wasInSelection && isInSelection) {\n mutateBlock(cell).isSelected = true;\n }\n })\n );\n }\n\n return isInSelection;\n}\n\nfunction findCell(\n table: ReadonlyContentModelTable,\n cell: ReadonlySelectable | null\n): TableCellCoordinate {\n let col = -1;\n const row = cell\n ? table.rows.findIndex(\n row => (col = (row.cells as ReadonlyArray<ReadonlySelectable>).indexOf(cell)) >= 0\n )\n : -1;\n\n return { row, col };\n}\n\nfunction setSelectionToSegment(\n paragraph: ReadonlyContentModelParagraph,\n segment: ReadonlyContentModelSegment,\n isInSelection: boolean,\n segmentsToDelete: number[],\n start: ReadonlySelectable | null,\n end: ReadonlySelectable | null,\n i: number\n) {\n switch (segment.segmentType) {\n case 'SelectionMarker':\n if (!isInSelection || (segment != start && segment != end)) {\n // Delete the selection marker when\n // 1. It is not in selection any more. Or\n // 2. It is in middle of selection, so no need to have it\n segmentsToDelete.push(i);\n }\n return isInSelection;\n\n case 'General':\n internalSetSelectionToSegment(paragraph, segment, isInSelection);\n\n return segment != start && segment != end\n ? setSelectionToBlockGroup(segment, isInSelection, start, end)\n : isInSelection;\n\n case 'Image':\n const isSelectedAsImageSelection = start == segment && (!end || end == segment);\n\n internalSetSelectionToSegment(\n paragraph,\n segment,\n isInSelection,\n !segment.isSelectedAsImageSelection != !isSelectedAsImageSelection\n ? image => (image.isSelectedAsImageSelection = isSelectedAsImageSelection)\n : undefined\n );\n\n return isInSelection;\n default:\n internalSetSelectionToSegment(paragraph, segment, isInSelection);\n return isInSelection;\n }\n}\n\nfunction internalSetSelectionToSegment<T extends ReadonlyContentModelSegment>(\n paragraph: ReadonlyContentModelParagraph,\n segment: T,\n isInSelection: boolean,\n additionAction?: (segment: MutableType<T>) => void\n) {\n if (additionAction || needToSetSelection(segment, isInSelection)) {\n mutateSegment(paragraph, segment, mutableSegment => {\n setIsSelected(mutableSegment, isInSelection);\n additionAction?.(mutableSegment);\n });\n }\n}\n\nfunction needToSetSelection(selectable: ReadonlySelectable, isSelected: boolean) {\n return !selectable.isSelected != !isSelected;\n}\n\nfunction setIsSelected(selectable: ShallowMutableSelectable, value: boolean) {\n if (value) {\n selectable.isSelected = true;\n } else {\n delete selectable.isSelected;\n }\n\n return value;\n}\n\nfunction handleSelection(\n isInSelection: boolean,\n model: ReadonlyContentModelBlockGroup | ReadonlyContentModelBlock | ReadonlyContentModelSegment,\n start: ReadonlySelectable | null,\n end: ReadonlySelectable | null,\n callback: (isInSelection: boolean) => boolean\n) {\n isInSelection = isInSelection || model == start;\n isInSelection = callback(isInSelection);\n return isInSelection && !!end && model != end;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"setSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/selection/setSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { isGeneralSegment } from '../typeCheck/isGeneralSegment';\nimport { mutateBlock, mutateSegment } from '../common/mutate';\nimport type {\n MutableType,\n ReadonlyContentModelBlock,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelParagraph,\n ReadonlyContentModelSegment,\n ReadonlyContentModelTable,\n ReadonlySelectable,\n ShallowMutableSelectable,\n TableCellCoordinate,\n} from 'roosterjs-content-model-types';\n\n/**\n * Set selection into Content Model. If the Content Model already has selection, existing selection will be overwritten by the new one.\n * @param group The root level group of Content Model\n * @param start The start selected element. If not passed, existing selection of content model will be cleared\n * @param end The end selected element. If not passed, only the start element will be selected. If passed, all elements between start and end elements will be selected\n */\nexport function setSelection(\n group: ReadonlyContentModelBlockGroup,\n start?: ReadonlySelectable,\n end?: ReadonlySelectable\n) {\n setSelectionToBlockGroup(group, false /*isInSelection*/, start || null, end || null);\n}\n\nfunction setSelectionToBlockGroup(\n group: ReadonlyContentModelBlockGroup,\n isInSelection: boolean,\n start: ReadonlySelectable | null,\n end: ReadonlySelectable | null\n): boolean {\n return handleSelection(isInSelection, group, start, end, isInSelection => {\n if (isGeneralSegment(group) && needToSetSelection(group, isInSelection)) {\n setIsSelected(mutateBlock(group), isInSelection);\n }\n\n const blocksToDelete: number[] = [];\n\n group.blocks.forEach((block, i) => {\n isInSelection = setSelectionToBlock(block, isInSelection, start, end);\n\n if (block.blockType == 'Paragraph' && block.segments.length == 0 && block.isImplicit) {\n blocksToDelete.push(i);\n }\n });\n\n let index: number | undefined;\n\n if (blocksToDelete.length > 0) {\n const mutableGroup = mutateBlock(group);\n\n while ((index = blocksToDelete.pop()) !== undefined) {\n if (index >= 0) {\n mutableGroup.blocks.splice(index, 1);\n }\n }\n }\n\n return isInSelection;\n });\n}\n\nfunction setSelectionToBlock(\n block: ReadonlyContentModelBlock,\n isInSelection: boolean,\n start: ReadonlySelectable | null,\n end: ReadonlySelectable | null\n) {\n switch (block.blockType) {\n case 'BlockGroup':\n return setSelectionToBlockGroup(block, isInSelection, start, end);\n\n case 'Table':\n return setSelectionToTable(block, isInSelection, start, end);\n\n case 'Divider':\n case 'Entity':\n return handleSelection(isInSelection, block, start, end, isInSelection => {\n if (needToSetSelection(block, isInSelection)) {\n const mutableBlock = mutateBlock(block);\n\n if (isInSelection) {\n mutableBlock.isSelected = true;\n } else {\n delete mutableBlock.isSelected;\n }\n }\n\n return isInSelection;\n });\n\n case 'Paragraph':\n const state: ParagraphSelectionState = {\n segmentsToDelete: [],\n boundaryMarkers: [],\n hasSelectedNonMarker: false,\n };\n\n block.segments.forEach((segment, i) => {\n isInSelection = handleSelection(\n isInSelection,\n segment,\n start,\n end,\n isInSelection => {\n return setSelectionToSegment(\n block,\n segment,\n isInSelection,\n state,\n start,\n end,\n i\n );\n }\n );\n });\n\n if (state.hasSelectedNonMarker) {\n // This paragraph contains a real (non-marker) selected segment, so any leading/trailing\n // selection marker of the range is redundant within this paragraph and can be removed.\n // We only do this within the same paragraph: a boundary marker at a paragraph edge must be\n // kept to distinguish \"selection starts at the beginning of this line\" from \"selection\n // starts at the end of the previous line\".\n state.segmentsToDelete.push(...state.boundaryMarkers);\n }\n\n if (state.segmentsToDelete.length > 0) {\n const mutablePara = mutateBlock(block);\n\n let index: number | undefined;\n\n // Sort ascending so the pop()-based splice below always removes the highest index first,\n // keeping the remaining indices valid (boundary markers may sit before queued deletions).\n state.segmentsToDelete.sort((a, b) => a - b);\n\n while ((index = state.segmentsToDelete.pop()) !== undefined) {\n if (index >= 0) {\n mutablePara.segments.splice(index, 1);\n }\n }\n }\n\n return isInSelection;\n\n default:\n return isInSelection;\n }\n}\n\nfunction setSelectionToTable(\n table: ReadonlyContentModelTable,\n isInSelection: boolean,\n start: ReadonlySelectable | null,\n end: ReadonlySelectable | null\n): boolean {\n const first = findCell(table, start);\n const last = end ? findCell(table, end) : first;\n\n if (!isInSelection) {\n for (let row = 0; row < table.rows.length; row++) {\n const currentRow = table.rows[row];\n for (let col = 0; col < currentRow.cells.length; col++) {\n const currentCell = table.rows[row].cells[col];\n const isSelected =\n row >= first.row && row <= last.row && col >= first.col && col <= last.col;\n\n if (needToSetSelection(currentCell, isSelected)) {\n setIsSelected(mutateBlock(currentCell), isSelected);\n }\n\n if (!isSelected) {\n setSelectionToBlockGroup(currentCell, false /*isInSelection*/, start, end);\n }\n }\n }\n } else {\n table.rows.forEach(row =>\n row.cells.forEach(cell => {\n const wasInSelection = isInSelection;\n\n isInSelection = setSelectionToBlockGroup(cell, isInSelection, start, end);\n\n if (wasInSelection && isInSelection) {\n mutateBlock(cell).isSelected = true;\n }\n })\n );\n }\n\n return isInSelection;\n}\n\nfunction findCell(\n table: ReadonlyContentModelTable,\n cell: ReadonlySelectable | null\n): TableCellCoordinate {\n let col = -1;\n const row = cell\n ? table.rows.findIndex(\n row => (col = (row.cells as ReadonlyArray<ReadonlySelectable>).indexOf(cell)) >= 0\n )\n : -1;\n\n return { row, col };\n}\n\ninterface ParagraphSelectionState {\n // Indexes of segments to delete after the paragraph is fully processed\n segmentsToDelete: number[];\n\n // Indexes of leading/trailing selection markers of the range that are kept for now, but will be\n // removed if this paragraph also contains a real (non-marker) selected segment\n boundaryMarkers: number[];\n\n // Whether this paragraph contains at least one selected segment that is not a selection marker\n hasSelectedNonMarker: boolean;\n}\n\nfunction setSelectionToSegment(\n paragraph: ReadonlyContentModelParagraph,\n segment: ReadonlyContentModelSegment,\n isInSelection: boolean,\n state: ParagraphSelectionState,\n start: ReadonlySelectable | null,\n end: ReadonlySelectable | null,\n i: number\n) {\n if (segment.segmentType != 'SelectionMarker' && isInSelection) {\n state.hasSelectedNonMarker = true;\n }\n\n switch (segment.segmentType) {\n case 'SelectionMarker':\n if (!isInSelection || (segment != start && segment != end)) {\n // Delete the selection marker when\n // 1. It is not in selection any more. Or\n // 2. It is in middle of selection, so no need to have it\n state.segmentsToDelete.push(i);\n } else {\n // It is a leading/trailing selection marker of a range selection. Keep it for now, but\n // remember it so it can be removed later if this same paragraph also contains a real\n // (non-marker) selected segment, in which case the marker is redundant.\n state.boundaryMarkers.push(i);\n }\n return isInSelection;\n\n case 'General':\n internalSetSelectionToSegment(paragraph, segment, isInSelection);\n\n return segment != start && segment != end\n ? setSelectionToBlockGroup(segment, isInSelection, start, end)\n : isInSelection;\n\n case 'Image':\n const isSelectedAsImageSelection = start == segment && (!end || end == segment);\n\n internalSetSelectionToSegment(\n paragraph,\n segment,\n isInSelection,\n !segment.isSelectedAsImageSelection != !isSelectedAsImageSelection\n ? image => (image.isSelectedAsImageSelection = isSelectedAsImageSelection)\n : undefined\n );\n\n return isInSelection;\n default:\n internalSetSelectionToSegment(paragraph, segment, isInSelection);\n return isInSelection;\n }\n}\n\nfunction internalSetSelectionToSegment<T extends ReadonlyContentModelSegment>(\n paragraph: ReadonlyContentModelParagraph,\n segment: T,\n isInSelection: boolean,\n additionAction?: (segment: MutableType<T>) => void\n) {\n if (additionAction || needToSetSelection(segment, isInSelection)) {\n mutateSegment(paragraph, segment, mutableSegment => {\n setIsSelected(mutableSegment, isInSelection);\n additionAction?.(mutableSegment);\n });\n }\n}\n\nfunction needToSetSelection(selectable: ReadonlySelectable, isSelected: boolean) {\n return !selectable.isSelected != !isSelected;\n}\n\nfunction setIsSelected(selectable: ShallowMutableSelectable, value: boolean) {\n if (value) {\n selectable.isSelected = true;\n } else {\n delete selectable.isSelected;\n }\n\n return value;\n}\n\nfunction handleSelection(\n isInSelection: boolean,\n model: ReadonlyContentModelBlockGroup | ReadonlyContentModelBlock | ReadonlyContentModelSegment,\n start: ReadonlySelectable | null,\n end: ReadonlySelectable | null,\n callback: (isInSelection: boolean) => boolean\n) {\n isInSelection = isInSelection || model == start;\n isInSelection = callback(isInSelection);\n return isInSelection && !!end && model != end;\n}\n"]}
|
|
@@ -29,7 +29,7 @@ var handleBlockGroupChildren = function (doc, parent, group, context) {
|
|
|
29
29
|
(_a = context.domIndexer) === null || _a === void 0 ? void 0 : _a.onBlockEntity(childBlock, group);
|
|
30
30
|
}
|
|
31
31
|
});
|
|
32
|
-
cleanUpNodeStack(listFormat.nodeStack, context);
|
|
32
|
+
cleanUpNodeStack(listFormat.nodeStack, context, parent);
|
|
33
33
|
// Remove all rest node if any since they don't appear in content model
|
|
34
34
|
(0, cleanUpRestNodes_1.cleanUpRestNodes)(refNode, context.rewriteFromModel);
|
|
35
35
|
}
|
|
@@ -38,7 +38,7 @@ var handleBlockGroupChildren = function (doc, parent, group, context) {
|
|
|
38
38
|
}
|
|
39
39
|
};
|
|
40
40
|
exports.handleBlockGroupChildren = handleBlockGroupChildren;
|
|
41
|
-
function cleanUpNodeStack(nodeStack, context) {
|
|
41
|
+
function cleanUpNodeStack(nodeStack, context, leavingParent) {
|
|
42
42
|
var _a, _b;
|
|
43
43
|
if (nodeStack.length > 0) {
|
|
44
44
|
// Clear list stack, only run to nodeStack[1] because nodeStack[0] is the parent node
|
|
@@ -46,6 +46,13 @@ function cleanUpNodeStack(nodeStack, context) {
|
|
|
46
46
|
var node = (_b = (_a = nodeStack.pop()) === null || _a === void 0 ? void 0 : _a.refNode) !== null && _b !== void 0 ? _b : null;
|
|
47
47
|
(0, cleanUpRestNodes_1.cleanUpRestNodes)(node, context.rewriteFromModel);
|
|
48
48
|
}
|
|
49
|
+
if (leavingParent && nodeStack[0].node == leavingParent) {
|
|
50
|
+
// When leaving a parent node that is the same with the root of node stack
|
|
51
|
+
// It means the whole list node stack is being invalidated, so we clear it
|
|
52
|
+
while (nodeStack.length > 0) {
|
|
53
|
+
nodeStack.pop();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
49
56
|
}
|
|
50
57
|
}
|
|
51
58
|
//# sourceMappingURL=handleBlockGroupChildren.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleBlockGroupChildren.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleBlockGroupChildren.ts"],"names":[],"mappings":";;;AAAA,8DAA6D;AAQ7D;;GAEG;AACI,IAAM,wBAAwB,GAAgD,UACjF,GAAa,EACb,MAAY,EACZ,KAA6B,EAC7B,OAA0B;IAElB,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;IAC/B,IAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;IACvC,IAAI,OAAO,GAAgB,MAAM,CAAC,UAAU,CAAC;IAE7C,IAAI;QACA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,UAAC,UAAU,EAAE,KAAK;;YACnC,2CAA2C;YAC3C,wEAAwE;YACxE,sFAAsF;YACtF,+FAA+F;YAC/F,IACI,KAAK,IAAI,CAAC;gBACV,UAAU,CAAC,SAAS,IAAI,YAAY;gBACpC,UAAU,CAAC,cAAc,IAAI,UAAU,EACzC;gBACE,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAEhD,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;oBACjC,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC;iBAC7B;aACJ;YAED,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEjF,IAAI,UAAU,CAAC,SAAS,IAAI,QAAQ,EAAE;gBAClC,MAAA,OAAO,CAAC,UAAU,0CAAE,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;aACxD;QACL,CAAC,CAAC,CAAC;QAEH,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"handleBlockGroupChildren.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleBlockGroupChildren.ts"],"names":[],"mappings":";;;AAAA,8DAA6D;AAQ7D;;GAEG;AACI,IAAM,wBAAwB,GAAgD,UACjF,GAAa,EACb,MAAY,EACZ,KAA6B,EAC7B,OAA0B;IAElB,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;IAC/B,IAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;IACvC,IAAI,OAAO,GAAgB,MAAM,CAAC,UAAU,CAAC;IAE7C,IAAI;QACA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,UAAC,UAAU,EAAE,KAAK;;YACnC,2CAA2C;YAC3C,wEAAwE;YACxE,sFAAsF;YACtF,+FAA+F;YAC/F,IACI,KAAK,IAAI,CAAC;gBACV,UAAU,CAAC,SAAS,IAAI,YAAY;gBACpC,UAAU,CAAC,cAAc,IAAI,UAAU,EACzC;gBACE,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAEhD,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;oBACjC,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC;iBAC7B;aACJ;YAED,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEjF,IAAI,UAAU,CAAC,SAAS,IAAI,QAAQ,EAAE;gBAClC,MAAA,OAAO,CAAC,UAAU,0CAAE,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;aACxD;QACL,CAAC,CAAC,CAAC;QAEH,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAExD,uEAAuE;QACvE,IAAA,mCAAgB,EAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;KACvD;YAAS;QACN,UAAU,CAAC,SAAS,GAAG,SAAS,CAAC;KACpC;AACL,CAAC,CAAC;AA1CW,QAAA,wBAAwB,4BA0CnC;AAEF,SAAS,gBAAgB,CACrB,SAAoC,EACpC,OAA0B,EAC1B,aAAoB;;IAEpB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;QACtB,qFAAqF;QACrF,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3C,IAAM,IAAI,GAAG,MAAA,MAAA,SAAS,CAAC,GAAG,EAAE,0CAAE,OAAO,mCAAI,IAAI,CAAC;YAE9C,IAAA,mCAAgB,EAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;SACpD;QAED,IAAI,aAAa,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,aAAa,EAAE;YACrD,0EAA0E;YAC1E,0EAA0E;YAC1E,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzB,SAAS,CAAC,GAAG,EAAE,CAAC;aACnB;SACJ;KACJ;AACL,CAAC","sourcesContent":["import { cleanUpRestNodes } from '../utils/cleanUpRestNodes';\nimport type {\n ContentModelBlockGroup,\n ContentModelHandler,\n ModelToDomContext,\n ModelToDomListStackItem,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const handleBlockGroupChildren: ContentModelHandler<ContentModelBlockGroup> = (\n doc: Document,\n parent: Node,\n group: ContentModelBlockGroup,\n context: ModelToDomContext\n) => {\n const { listFormat } = context;\n const nodeStack = listFormat.nodeStack;\n let refNode: Node | null = parent.firstChild;\n\n try {\n group.blocks.forEach((childBlock, index) => {\n // When process list, we need a node stack.\n // When there are two continuous lists, they should share the same stack\n // so that list items with same type/threadId can be merged into the same list element\n // In other cases, clear the stack so that two separate lists won't share the same list element\n if (\n index == 0 ||\n childBlock.blockType != 'BlockGroup' ||\n childBlock.blockGroupType != 'ListItem'\n ) {\n cleanUpNodeStack(listFormat.nodeStack, context);\n\n if (listFormat.nodeStack.length > 0) {\n listFormat.nodeStack = [];\n }\n }\n\n refNode = context.modelHandlers.block(doc, parent, childBlock, context, refNode);\n\n if (childBlock.blockType == 'Entity') {\n context.domIndexer?.onBlockEntity(childBlock, group);\n }\n });\n\n cleanUpNodeStack(listFormat.nodeStack, context, parent);\n\n // Remove all rest node if any since they don't appear in content model\n cleanUpRestNodes(refNode, context.rewriteFromModel);\n } finally {\n listFormat.nodeStack = nodeStack;\n }\n};\n\nfunction cleanUpNodeStack(\n nodeStack: ModelToDomListStackItem[],\n context: ModelToDomContext,\n leavingParent?: Node\n) {\n if (nodeStack.length > 0) {\n // Clear list stack, only run to nodeStack[1] because nodeStack[0] is the parent node\n for (let i = nodeStack.length - 1; i > 0; i--) {\n const node = nodeStack.pop()?.refNode ?? null;\n\n cleanUpRestNodes(node, context.rewriteFromModel);\n }\n\n if (leavingParent && nodeStack[0].node == leavingParent) {\n // When leaving a parent node that is the same with the root of node stack\n // It means the whole list node stack is being invalidated, so we clear it\n while (nodeStack.length > 0) {\n nodeStack.pop();\n }\n }\n }\n}\n"]}
|
|
@@ -10,7 +10,7 @@ export declare function createDomToModelContext(editorContext?: EditorContext, .
|
|
|
10
10
|
* @param config A full config object to define how to convert DOM tree to Content Model
|
|
11
11
|
* @param editorContext Context of editor
|
|
12
12
|
*/
|
|
13
|
-
export declare function createDomToModelContextWithConfig(config: DomToModelSettings, editorContext?: EditorContext):
|
|
13
|
+
export declare function createDomToModelContextWithConfig(config: DomToModelSettings, editorContext?: EditorContext): DomToModelContext;
|
|
14
14
|
/**
|
|
15
15
|
* Create Dom to Content Model Config object
|
|
16
16
|
* @param options All customizations of content model creation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createDomToModelContext.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/context/createDomToModelContext.ts"],"names":[],"mappings":"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","sourcesContent":["import { defaultProcessorMap } from './defaultProcessors';\nimport { getObjectKeys } from '../../domUtils/getObjectKeys';\nimport {\n defaultFormatKeysPerCategory,\n defaultFormatParsers,\n} from '../../formatHandlers/defaultFormatHandlers';\nimport type {\n ContentModelBlockFormat,\n DomToModelContext,\n DomToModelDecoratorContext,\n DomToModelFormatContext,\n DomToModelOption,\n DomToModelSelectionContext,\n DomToModelSettings,\n EditorContext,\n FormatParser,\n FormatParsers,\n FormatParsersPerCategory,\n TextFormatParser,\n} from 'roosterjs-content-model-types';\n\n/**\n * Create context object for DOM to Content Model conversion\n * @param editorContext Context of editor\n * @param options Option array to customize the DOM to Model conversion behavior\n */\nexport function createDomToModelContext(\n editorContext?: EditorContext,\n ...options: (DomToModelOption | undefined)[]\n): DomToModelContext {\n return createDomToModelContextWithConfig(createDomToModelConfig(options), editorContext);\n}\n\n/**\n * Create context object for DOM to Content Model conversion with an existing configure\n * @param config A full config object to define how to convert DOM tree to Content Model\n * @param editorContext Context of editor\n */\nexport function createDomToModelContextWithConfig(\n config: DomToModelSettings,\n editorContext?: EditorContext\n) {\n return Object.assign(\n {},\n editorContext,\n createDomToModelSelectionContext(),\n createDomToModelFormatContext(editorContext?.isRootRtl),\n createDomToModelDecoratorContext(),\n config\n );\n}\n\nfunction createDomToModelSelectionContext(): DomToModelSelectionContext {\n return { isInSelection: false };\n}\n\nfunction createDomToModelFormatContext(isRootRtl?: boolean): DomToModelFormatContext {\n const blockFormat: ContentModelBlockFormat = isRootRtl ? { direction: 'rtl' } : {};\n\n return {\n blockFormat,\n segmentFormat: {},\n\n listFormat: {\n levels: [],\n threadItemCounts: [],\n },\n };\n}\n\nfunction createDomToModelDecoratorContext(): DomToModelDecoratorContext {\n return {\n link: {\n format: {},\n dataset: {},\n },\n code: {\n format: {},\n },\n blockDecorator: {\n format: {},\n tagName: '',\n },\n };\n}\n\n/**\n * Create Dom to Content Model Config object\n * @param options All customizations of content model creation\n */\nexport function createDomToModelConfig(\n options: (DomToModelOption | undefined)[]\n): DomToModelSettings {\n return {\n elementProcessors: Object.assign(\n {},\n defaultProcessorMap,\n ...options.map(x => x?.processorOverride)\n ),\n formatParsers: buildFormatParsers(\n options.map(x => x?.formatParserOverride),\n options.map(x => x?.additionalFormatParsers)\n ),\n defaultElementProcessors: defaultProcessorMap,\n defaultFormatParsers,\n processNonVisibleElements: options.some(x => !!x?.processNonVisibleElements),\n };\n}\n\n/**\n * @internal Export for test only\n * Build format parsers used by DOM to Content Model conversion\n * @param override\n * @param additionalParsersArray\n * @returns\n */\nexport function buildFormatParsers(\n overrides: (Partial<FormatParsers> | undefined)[] = [],\n additionalParsersArray: (Partial<FormatParsersPerCategory> | undefined)[] = []\n): FormatParsersPerCategory {\n const combinedOverrides = Object.assign({}, ...overrides);\n\n const result = getObjectKeys(defaultFormatKeysPerCategory).reduce(\n (result, key) => {\n const value = defaultFormatKeysPerCategory[key]\n .map(\n formatKey =>\n (combinedOverrides[formatKey] === undefined\n ? defaultFormatParsers[formatKey]\n : combinedOverrides[formatKey]) as FormatParser<any>\n )\n .concat(\n ...additionalParsersArray.map(\n parsers => (parsers?.[key] ?? []) as FormatParser<any>[]\n )\n );\n\n result[key] = value;\n\n return result;\n },\n {\n text: [] as TextFormatParser[],\n } as FormatParsersPerCategory\n );\n\n additionalParsersArray.forEach(parsers => {\n if (parsers?.text) {\n result.text = result.text.concat(parsers.text);\n }\n });\n\n return result;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"createDomToModelContext.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/context/createDomToModelContext.ts"],"names":[],"mappings":"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","sourcesContent":["import { defaultProcessorMap } from './defaultProcessors';\nimport { getObjectKeys } from '../../domUtils/getObjectKeys';\nimport {\n defaultFormatKeysPerCategory,\n defaultFormatParsers,\n} from '../../formatHandlers/defaultFormatHandlers';\nimport type {\n ContentModelBlockFormat,\n DomToModelContext,\n DomToModelDecoratorContext,\n DomToModelFormatContext,\n DomToModelOption,\n DomToModelSelectionContext,\n DomToModelSettings,\n EditorContext,\n FormatParser,\n FormatParsers,\n FormatParsersPerCategory,\n TextFormatParser,\n} from 'roosterjs-content-model-types';\n\n/**\n * Create context object for DOM to Content Model conversion\n * @param editorContext Context of editor\n * @param options Option array to customize the DOM to Model conversion behavior\n */\nexport function createDomToModelContext(\n editorContext?: EditorContext,\n ...options: (DomToModelOption | undefined)[]\n): DomToModelContext {\n return createDomToModelContextWithConfig(createDomToModelConfig(options), editorContext);\n}\n\n/**\n * Create context object for DOM to Content Model conversion with an existing configure\n * @param config A full config object to define how to convert DOM tree to Content Model\n * @param editorContext Context of editor\n */\nexport function createDomToModelContextWithConfig(\n config: DomToModelSettings,\n editorContext?: EditorContext\n): DomToModelContext {\n return Object.assign(\n {},\n editorContext,\n createDomToModelSelectionContext(),\n createDomToModelFormatContext(editorContext?.isRootRtl),\n createDomToModelDecoratorContext(),\n config\n );\n}\n\nfunction createDomToModelSelectionContext(): DomToModelSelectionContext {\n return { isInSelection: false };\n}\n\nfunction createDomToModelFormatContext(isRootRtl?: boolean): DomToModelFormatContext {\n const blockFormat: ContentModelBlockFormat = isRootRtl ? { direction: 'rtl' } : {};\n\n return {\n blockFormat,\n segmentFormat: {},\n\n listFormat: {\n levels: [],\n threadItemCounts: [],\n },\n };\n}\n\nfunction createDomToModelDecoratorContext(): DomToModelDecoratorContext {\n return {\n link: {\n format: {},\n dataset: {},\n },\n code: {\n format: {},\n },\n blockDecorator: {\n format: {},\n tagName: '',\n },\n };\n}\n\n/**\n * Create Dom to Content Model Config object\n * @param options All customizations of content model creation\n */\nexport function createDomToModelConfig(\n options: (DomToModelOption | undefined)[]\n): DomToModelSettings {\n return {\n elementProcessors: Object.assign(\n {},\n defaultProcessorMap,\n ...options.map(x => x?.processorOverride)\n ),\n formatParsers: buildFormatParsers(\n options.map(x => x?.formatParserOverride),\n options.map(x => x?.additionalFormatParsers)\n ),\n defaultElementProcessors: defaultProcessorMap,\n defaultFormatParsers,\n processNonVisibleElements: options.some(x => !!x?.processNonVisibleElements),\n };\n}\n\n/**\n * @internal Export for test only\n * Build format parsers used by DOM to Content Model conversion\n * @param override\n * @param additionalParsersArray\n * @returns\n */\nexport function buildFormatParsers(\n overrides: (Partial<FormatParsers> | undefined)[] = [],\n additionalParsersArray: (Partial<FormatParsersPerCategory> | undefined)[] = []\n): FormatParsersPerCategory {\n const combinedOverrides = Object.assign({}, ...overrides);\n\n const result = getObjectKeys(defaultFormatKeysPerCategory).reduce(\n (result, key) => {\n const value = defaultFormatKeysPerCategory[key]\n .map(\n formatKey =>\n (combinedOverrides[formatKey] === undefined\n ? defaultFormatParsers[formatKey]\n : combinedOverrides[formatKey]) as FormatParser<any>\n )\n .concat(\n ...additionalParsersArray.map(\n parsers => (parsers?.[key] ?? []) as FormatParser<any>[]\n )\n );\n\n result[key] = value;\n\n return result;\n },\n {\n text: [] as TextFormatParser[],\n } as FormatParsersPerCategory\n );\n\n additionalParsersArray.forEach(parsers => {\n if (parsers?.text) {\n result.text = result.text.concat(parsers.text);\n }\n });\n\n return result;\n}\n"]}
|
|
@@ -48,7 +48,9 @@ define(["require", "exports", "tslib", "../../modelApi/common/addBlock", "../../
|
|
|
48
48
|
if (element.style.fontSize && parseInt(element.style.fontSize) == 0) {
|
|
49
49
|
formatContainer.zeroFontSize = true;
|
|
50
50
|
}
|
|
51
|
-
if (
|
|
51
|
+
if (!context.skipFormatContainerFallbackCheck &&
|
|
52
|
+
shouldFallbackToParagraph(formatContainer) &&
|
|
53
|
+
!forceFormatContainer) {
|
|
52
54
|
// For DIV container that only has one paragraph child, container style can be merged into paragraph
|
|
53
55
|
// and no need to have this container
|
|
54
56
|
var paragraph = formatContainer.blocks[0];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatContainerProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/formatContainerProcessor.ts"],"names":[],"mappings":";;;;IAkBA;;OAEG;IACU,QAAA,aAAa,GAA6C;QACnE,YAAY;QACZ,aAAa;QACb,aAAa;QACb,cAAc;KACjB,CAAC;IAEF;;;;;;;OAOG;IACI,IAAM,wBAAwB,GAAkC,UACnE,KAAK,EACL,OAAO,EACP,OAAO;QAEP,gCAAgC,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAChG,CAAC,CAAC;IANW,QAAA,wBAAwB,4BAMnC;IAEF;;OAEG;IACI,IAAM,6BAA6B,GAAkC,UACxE,KAAK,EACL,OAAO,EACP,OAAO;QAEP,gCAAgC,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC/F,CAAC,CAAC;IANW,QAAA,6BAA6B,iCAMxC;IAEF,IAAM,gCAAgC,GAAG,UACrC,KAA6B,EAC7B,OAAoB,EACpB,OAA0B,EAC1B,oBAA6B;QAE7B,IAAA,yBAAW,EAAC,OAAO,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE;YACjF,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAChF,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YAE3F,IAAM,MAAM,6BACL,OAAO,CAAC,WAAW,CACzB,CAAC;YAEF,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAEvE,IAAM,OAAO,GACT,IAAA,iCAAe,EAAC,OAAO,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YACxF,IAAM,eAAe,GAAG,IAAA,6CAAqB,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAE/D,0FAA0F;YAC1F,kEAAkE;YAClE,mFAAmF;YACnF,qBAAa,CAAC,OAAO,CAAC,UAAA,KAAK;gBACvB,OAAO,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEnE,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;gBACjE,eAAe,CAAC,YAAY,GAAG,IAAI,CAAC;aACvC;YAED,
|
|
1
|
+
{"version":3,"file":"formatContainerProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/formatContainerProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { addBlock } from '../../modelApi/common/addBlock';\nimport { createFormatContainer } from '../../modelApi/creators/createFormatContainer';\nimport { createParagraph } from '../../modelApi/creators/createParagraph';\nimport { getDefaultStyle } from '../utils/getDefaultStyle';\nimport { parseFormat } from '../utils/parseFormat';\nimport { setParagraphNotImplicit } from '../../modelApi/block/setParagraphNotImplicit';\nimport { stackFormat } from '../utils/stackFormat';\nimport type {\n ContentModelBlockGroup,\n ContentModelFormatContainer,\n ContentModelFormatContainerFormat,\n ContentModelParagraph,\n DomToModelContext,\n ElementProcessor,\n MarginFormat,\n PaddingFormat,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const ContextStyles: (keyof (MarginFormat & PaddingFormat))[] = [\n 'marginLeft',\n 'marginRight',\n 'paddingLeft',\n 'paddingRight',\n];\n\n/**\n * Content Model Element Processor for format container elements (e.g., blockquote, div)\n * Processes elements that create FormatContainer blocks in the content model.\n * This processor can be used in processorOverride to customize how specific elements are processed.\n * @param group The parent block group\n * @param element The DOM element to process\n * @param context DOM to Content Model context\n */\nexport const formatContainerProcessor: ElementProcessor<HTMLElement> = (\n group,\n element,\n context\n) => {\n formatContainerProcessorInternal(group, element, context, false /* forceFormatContainer */);\n};\n\n/**\n * @internal\n */\nexport const forceFormatContainerProcessor: ElementProcessor<HTMLElement> = (\n group,\n element,\n context\n) => {\n formatContainerProcessorInternal(group, element, context, true /* forceFormatContainer */);\n};\n\nconst formatContainerProcessorInternal = (\n group: ContentModelBlockGroup,\n element: HTMLElement,\n context: DomToModelContext,\n forceFormatContainer: boolean\n) => {\n stackFormat(context, { segment: 'shallowCloneForBlock', paragraph: 'shallowClone' }, () => {\n parseFormat(element, context.formatParsers.block, context.blockFormat, context);\n parseFormat(element, context.formatParsers.segmentOnBlock, context.segmentFormat, context);\n\n const format: ContentModelFormatContainerFormat = {\n ...context.blockFormat,\n };\n\n parseFormat(element, context.formatParsers.container, format, context);\n\n const tagName =\n getDefaultStyle(element).display == 'block' ? element.tagName.toLowerCase() : 'div';\n const formatContainer = createFormatContainer(tagName, format);\n\n // It is possible to inherit margin left/right styles from parent DIV or other containers,\n // since we are going into a deeper level of format container now,\n // the container will render these styles so no need to keep them in context format\n ContextStyles.forEach(style => {\n delete context.blockFormat[style];\n });\n\n context.elementProcessors.child(formatContainer, element, context);\n\n if (element.style.fontSize && parseInt(element.style.fontSize) == 0) {\n formatContainer.zeroFontSize = true;\n }\n\n if (\n !context.skipFormatContainerFallbackCheck &&\n shouldFallbackToParagraph(formatContainer) &&\n !forceFormatContainer\n ) {\n // For DIV container that only has one paragraph child, container style can be merged into paragraph\n // and no need to have this container\n const paragraph = formatContainer.blocks[0] as ContentModelParagraph;\n\n if (formatContainer.zeroFontSize) {\n paragraph.segmentFormat = Object.assign({}, paragraph.segmentFormat, {\n fontSize: '0',\n });\n }\n\n Object.assign(paragraph.format, formatContainer.format);\n setParagraphNotImplicit(paragraph);\n addBlock(group, paragraph);\n } else {\n addBlock(group, formatContainer);\n }\n });\n\n addBlock(group, createParagraph(true /*isImplicit*/, context.blockFormat));\n};\n\nfunction shouldFallbackToParagraph(formatContainer: ContentModelFormatContainer) {\n const firstChild = formatContainer.blocks[0];\n\n return (\n formatContainer.tagName == 'div' &&\n formatContainer.blocks.length == 1 &&\n firstChild.blockType == 'Paragraph' &&\n firstChild.isImplicit\n );\n}\n"]}
|
|
@@ -5,4 +5,4 @@ import type { ClipboardData } from 'roosterjs-content-model-types';
|
|
|
5
5
|
* @param allowedCustomPasteType Allowed custom content type when paste besides text/plain, text/html and images
|
|
6
6
|
Only text types are supported, and do not add "text/" prefix to the type values
|
|
7
7
|
*/
|
|
8
|
-
export declare function extractClipboardItems(items: DataTransferItem[], allowedCustomPasteType?: string[]): Promise<ClipboardData>;
|
|
8
|
+
export declare function extractClipboardItems(items: DataTransferItem[], allowedCustomPasteType?: string[], isPasteNative?: boolean): Promise<ClipboardData>;
|
|
@@ -16,7 +16,7 @@ define(["require", "exports", "../readFile"], function (require, exports, readFi
|
|
|
16
16
|
* @param allowedCustomPasteType Allowed custom content type when paste besides text/plain, text/html and images
|
|
17
17
|
Only text types are supported, and do not add "text/" prefix to the type values
|
|
18
18
|
*/
|
|
19
|
-
function extractClipboardItems(items, allowedCustomPasteType) {
|
|
19
|
+
function extractClipboardItems(items, allowedCustomPasteType, isPasteNative) {
|
|
20
20
|
var data = {
|
|
21
21
|
types: [],
|
|
22
22
|
text: '',
|
|
@@ -24,7 +24,7 @@ define(["require", "exports", "../readFile"], function (require, exports, readFi
|
|
|
24
24
|
files: [],
|
|
25
25
|
rawHtml: null,
|
|
26
26
|
customValues: {},
|
|
27
|
-
pasteNativeEvent:
|
|
27
|
+
pasteNativeEvent: !!isPasteNative,
|
|
28
28
|
};
|
|
29
29
|
return Promise.all((items || []).map(function (item) {
|
|
30
30
|
var type = item.type;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractClipboardItems.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domUtils/event/extractClipboardItems.ts"],"names":[],"mappings":";;;;;IAGA,IAAM,eAAe;QAGjB,GAAC,WAAW,IAAG,UAAC,IAAI,EAAE,KAAK,IAAK,OAAA,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,EAAtB,CAAsB;QACtD,GAAC,YAAY,IAAG,UAAC,IAAI,EAAE,KAAK,IAAK,OAAA,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,EAAnB,CAAmB;QACpD,GAAC,QAAQ,IAAG,UAAC,IAAI,EAAE,KAAK,EAAE,IAAK,IAAK,OAAA,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,EAA3C,CAA2C;QAC/E,GAAC,mBAAmB,IAAG,mBAAmB;QAC1C,GAAC,eAAe,IAAG,UAAC,IAAI,EAAE,KAAK,IAAK,OAAA,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,EAAnB,CAAmB;WAC1D,CAAC;IAEF;;;;;OAKG;IACH,SAAgB,qBAAqB,CACjC,KAAyB,EACzB,sBAAiC;
|
|
1
|
+
{"version":3,"file":"extractClipboardItems.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domUtils/event/extractClipboardItems.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from '../readFile';\nimport type { ClipboardData, EdgeLinkPreview } from 'roosterjs-content-model-types';\n\nconst ContentHandlers: {\n [contentType: string]: (data: ClipboardData, value: string, type?: string) => void;\n} = {\n ['text/html']: (data, value) => (data.rawHtml = value),\n ['text/plain']: (data, value) => (data.text = value),\n ['text/*']: (data, value, type?) => !!type && (data.customValues[type] = value),\n ['text/link-preview']: tryParseLinkPreview,\n ['text/uri-list']: (data, value) => (data.text = value),\n};\n\n/**\n * Extract clipboard items to be a ClipboardData object for IE\n * @param items The clipboard items retrieve from a DataTransfer object\n * @param allowedCustomPasteType Allowed custom content type when paste besides text/plain, text/html and images\n Only text types are supported, and do not add \"text/\" prefix to the type values\n */\nexport function extractClipboardItems(\n items: DataTransferItem[],\n allowedCustomPasteType?: string[],\n isPasteNative?: boolean\n): Promise<ClipboardData> {\n const data: ClipboardData = {\n types: [],\n text: '',\n image: null,\n files: [],\n rawHtml: null,\n customValues: {},\n pasteNativeEvent: !!isPasteNative,\n };\n\n return Promise.all(\n (items || []).map(item => {\n const type = item.type;\n\n if (type.indexOf('image/') == 0 && !data.image && item.kind == 'file') {\n data.types.push(type);\n data.image = item.getAsFile();\n return new Promise<void>(resolve => {\n if (data.image) {\n readFile(data.image, dataUrl => {\n data.imageDataUri = dataUrl;\n resolve();\n });\n } else {\n resolve();\n }\n });\n } else if (item.kind == 'file') {\n return new Promise<void>(resolve => {\n const file = item.getAsFile();\n if (!!file) {\n data.types.push(type);\n data.files!.push(file);\n }\n resolve();\n });\n } else {\n const customType = getAllowedCustomType(type, allowedCustomPasteType);\n const handler =\n ContentHandlers[type] || (customType ? ContentHandlers['text/*'] : null);\n return new Promise<void>(resolve =>\n handler\n ? item.getAsString(value => {\n data.types.push(type);\n handler(data, value, customType);\n resolve();\n })\n : resolve()\n );\n }\n })\n ).then(() => data);\n}\n\nfunction tryParseLinkPreview(data: ClipboardData, value: string) {\n try {\n data.customValues['link-preview'] = value;\n data.linkPreview = JSON.parse(value) as EdgeLinkPreview;\n } catch {}\n}\n\nfunction getAllowedCustomType(type: string, allowedCustomPasteType?: string[]) {\n const textType = type.indexOf('text/') == 0 ? type.substring('text/'.length) : null;\n const index =\n allowedCustomPasteType && textType ? allowedCustomPasteType.indexOf(textType) : -1;\n return textType && index >= 0 ? textType : undefined;\n}\n"]}
|
|
@@ -12,6 +12,7 @@ define(["require", "exports", "tslib"], function (require, exports, tslib_1) {
|
|
|
12
12
|
exports.pruneUnselectedModel = pruneUnselectedModel;
|
|
13
13
|
function pruneUnselectedModelInternal(model, isSelectionAfterElement) {
|
|
14
14
|
var e_1, _a, _b;
|
|
15
|
+
var _c;
|
|
15
16
|
for (var index = model.blocks.length - 1; index >= 0; index--) {
|
|
16
17
|
var block = model.blocks[index];
|
|
17
18
|
switch (block.blockType) {
|
|
@@ -35,15 +36,17 @@ define(["require", "exports", "tslib"], function (require, exports, tslib_1) {
|
|
|
35
36
|
case 'Paragraph':
|
|
36
37
|
var newSegments = [];
|
|
37
38
|
try {
|
|
38
|
-
for (var
|
|
39
|
-
var segment =
|
|
39
|
+
for (var _d = (e_1 = void 0, (0, tslib_1.__values)(block.segments)), _e = _d.next(); !_e.done; _e = _d.next()) {
|
|
40
|
+
var segment = _e.value;
|
|
41
|
+
var isSelectedOrUndeletable = segment.isSelected || ((_c = segment.link) === null || _c === void 0 ? void 0 : _c.format.undeletable);
|
|
40
42
|
if (segment.segmentType == 'General') {
|
|
41
43
|
pruneUnselectedModel(segment);
|
|
42
|
-
if (segment.blocks.length > 0 ||
|
|
44
|
+
if (segment.blocks.length > 0 || isSelectedOrUndeletable) {
|
|
43
45
|
newSegments.push(segment);
|
|
44
46
|
}
|
|
45
47
|
}
|
|
46
|
-
else if (
|
|
48
|
+
else if (isSelectedOrUndeletable &&
|
|
49
|
+
segment.segmentType != 'SelectionMarker') {
|
|
47
50
|
newSegments.push(segment);
|
|
48
51
|
}
|
|
49
52
|
}
|
|
@@ -51,7 +54,7 @@ define(["require", "exports", "tslib"], function (require, exports, tslib_1) {
|
|
|
51
54
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
52
55
|
finally {
|
|
53
56
|
try {
|
|
54
|
-
if (
|
|
57
|
+
if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
|
|
55
58
|
}
|
|
56
59
|
finally { if (e_1) throw e_1.error; }
|
|
57
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pruneUnselectedModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domUtils/selection/pruneUnselectedModel.ts"],"names":[],"mappings":";;;;IASA;;OAEG;IACH,SAAgB,oBAAoB,CAChC,KAA0E;QAE1E,4BAA4B,CAAC,KAAK,EAAE,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAEzE,MAAM,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;IAND,oDAMC;IAED,SAAS,4BAA4B,CACjC,KAA0E,EAC1E,uBAAgC
|
|
1
|
+
{"version":3,"file":"pruneUnselectedModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domUtils/selection/pruneUnselectedModel.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ContentModelBlockGroupBase,\n ContentModelBlockGroupType,\n ContentModelParagraph,\n ContentModelSegment,\n ContentModelTableCell,\n ContentModelTableRow,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function pruneUnselectedModel(\n model: ContentModelBlockGroupBase<ContentModelBlockGroupType, HTMLElement>\n) {\n pruneUnselectedModelInternal(model, false /* isSelectionAfterElement */);\n\n unwrap(model);\n}\n\nfunction pruneUnselectedModelInternal(\n model: ContentModelBlockGroupBase<ContentModelBlockGroupType, HTMLElement>,\n isSelectionAfterElement: boolean\n) {\n for (let index = model.blocks.length - 1; index >= 0; index--) {\n const block = model.blocks[index];\n\n switch (block.blockType) {\n case 'BlockGroup':\n pruneUnselectedModelInternal(block, isSelectionAfterElement);\n if (\n block.blockGroupType == 'General'\n ? block.blocks.length == 0 && !block.isSelected\n : block.blocks.length == 0\n ) {\n model.blocks.splice(index, 1);\n }\n break;\n case 'Divider':\n case 'Entity':\n if (!block.isSelected) {\n model.blocks.splice(index, 1);\n } else {\n isSelectionAfterElement = true;\n }\n break;\n case 'Paragraph':\n const newSegments: ContentModelSegment[] = [];\n for (const segment of block.segments) {\n const isSelectedOrUndeletable =\n segment.isSelected || segment.link?.format.undeletable;\n\n if (segment.segmentType == 'General') {\n pruneUnselectedModel(segment);\n if (segment.blocks.length > 0 || isSelectedOrUndeletable) {\n newSegments.push(segment);\n }\n } else if (\n isSelectedOrUndeletable &&\n segment.segmentType != 'SelectionMarker'\n ) {\n newSegments.push(segment);\n }\n }\n block.segments = newSegments;\n if (block.segments.length == 0) {\n model.blocks.splice(index, 1);\n } else {\n isSelectionAfterElement = true;\n }\n break;\n case 'Table':\n const filteredRows: ContentModelTableRow[] = [];\n for (let i = 0; i < block.rows.length; i++) {\n const row = block.rows[i];\n for (let j = 0; j < row.cells.length; j++) {\n const cell = row.cells[j];\n if (!cell.isSelected) {\n pruneUnselectedModelInternal(cell, isSelectionAfterElement);\n } else {\n isSelectionAfterElement = true;\n }\n }\n\n const newCells: ContentModelTableCell[] = [];\n for (let k = 0; k < row.cells.length; k++) {\n const cell = row.cells[k];\n if (cell.isSelected || cell.blocks.length > 0) {\n newCells.push(cell);\n }\n }\n row.cells = newCells;\n\n if (row.cells.length > 0) {\n filteredRows.push(row);\n }\n }\n\n if (\n !isSelectionAfterElement &&\n filteredRows.length == 1 &&\n filteredRows[0].cells.length == 1 &&\n !filteredRows[0].cells[0].isSelected\n ) {\n const cell = filteredRows[0].cells[0];\n model.blocks.splice(index, 1, ...cell.blocks);\n } else if (filteredRows.length == 0) {\n model.blocks.splice(index, 1);\n } else {\n block.rows = filteredRows;\n }\n break;\n }\n }\n return isSelectionAfterElement;\n}\n\nfunction unwrap(model: ContentModelBlockGroupBase<ContentModelBlockGroupType, HTMLElement>) {\n let block = model.blocks[0];\n if (model.blocks.length == 1) {\n while (block.blockType == 'BlockGroup') {\n model.blocks = block.blocks;\n block = model.blocks[0];\n\n if (model.blocks.length > 1) {\n return;\n }\n }\n\n if (block.blockType == 'Paragraph') {\n block.isImplicit = true;\n block.format = {};\n inheritSegmentFormatToChildren(block);\n }\n }\n}\n\nfunction inheritSegmentFormatToChildren(parent: ContentModelParagraph) {\n const value = parent.segmentFormat;\n if (value !== undefined) {\n for (let index = 0; index < parent.segments.length; index++) {\n const segment = parent.segments[index];\n segment.format = {\n ...parent.segmentFormat,\n ...segment.format,\n };\n }\n }\n}\n"]}
|
package/lib-amd/index.d.ts
CHANGED
|
@@ -92,7 +92,7 @@ export { hasSelectionInBlock } from './modelApi/selection/hasSelectionInBlock';
|
|
|
92
92
|
export { hasSelectionInSegment } from './modelApi/selection/hasSelectionInSegment';
|
|
93
93
|
export { hasSelectionInBlockGroup } from './modelApi/selection/hasSelectionInBlockGroup';
|
|
94
94
|
export { setSelection } from './modelApi/selection/setSelection';
|
|
95
|
-
export { cloneModel } from './modelApi/editing/cloneModel';
|
|
95
|
+
export { cloneModel, cloneModelForPaste } from './modelApi/editing/cloneModel';
|
|
96
96
|
export { mergeModel } from './modelApi/editing/mergeModel';
|
|
97
97
|
export { deleteSelection } from './modelApi/editing/deleteSelection';
|
|
98
98
|
export { deleteSegment } from './modelApi/editing/deleteSegment';
|