roosterjs-content-model-dom 9.45.1 → 9.46.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/processors/formatContainerProcessor.d.ts +4 -0
- package/lib/domToModel/processors/formatContainerProcessor.js +13 -3
- package/lib/domToModel/processors/formatContainerProcessor.js.map +1 -1
- package/lib/domToModel/processors/knownElementProcessor.js +11 -5
- package/lib/domToModel/processors/knownElementProcessor.js.map +1 -1
- package/lib/domToModel/processors/tableProcessor.js +15 -2
- package/lib/domToModel/processors/tableProcessor.js.map +1 -1
- package/lib/domToModel/processors/textProcessor.js +1 -1
- package/lib/domToModel/processors/textProcessor.js.map +1 -1
- package/lib/domUtils/selection/preprocessTable.d.ts +5 -0
- package/lib/domUtils/selection/preprocessTable.js +22 -0
- package/lib/domUtils/selection/preprocessTable.js.map +1 -0
- package/lib/domUtils/selection/pruneUnselectedModel.d.ts +5 -0
- package/lib/domUtils/selection/pruneUnselectedModel.js +135 -0
- package/lib/domUtils/selection/pruneUnselectedModel.js.map +1 -0
- package/lib/domUtils/selection/trimModelForSelection.d.ts +7 -0
- package/lib/domUtils/selection/trimModelForSelection.js +25 -0
- package/lib/domUtils/selection/trimModelForSelection.js.map +1 -0
- package/lib/domUtils/style/transformColor.d.ts +1 -1
- package/lib/domUtils/style/transformColor.js +11 -8
- package/lib/domUtils/style/transformColor.js.map +1 -1
- package/lib/formatHandlers/common/backgroundColorFormatHandler.d.ts +2 -2
- package/lib/formatHandlers/common/backgroundColorFormatHandler.js +1 -1
- package/lib/formatHandlers/common/backgroundColorFormatHandler.js.map +1 -1
- package/lib/formatHandlers/utils/color.d.ts +3 -2
- package/lib/formatHandlers/utils/color.js +11 -9
- package/lib/formatHandlers/utils/color.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +5 -3
- package/lib/index.js.map +1 -1
- package/lib/modelApi/editing/applyTableFormat.js +4 -1
- package/lib/modelApi/editing/applyTableFormat.js.map +1 -1
- package/lib/modelApi/editing/mergeModel.js +76 -22
- package/lib/modelApi/editing/mergeModel.js.map +1 -1
- package/lib/modelApi/editing/setTableCellBackgroundColor.js +22 -23
- package/lib/modelApi/editing/setTableCellBackgroundColor.js.map +1 -1
- package/lib/modelToDom/handlers/handleList.js +4 -0
- package/lib/modelToDom/handlers/handleList.js.map +1 -1
- package/lib-amd/domToModel/processors/formatContainerProcessor.d.ts +4 -0
- package/lib-amd/domToModel/processors/formatContainerProcessor.js +13 -3
- package/lib-amd/domToModel/processors/formatContainerProcessor.js.map +1 -1
- package/lib-amd/domToModel/processors/knownElementProcessor.js +11 -5
- package/lib-amd/domToModel/processors/knownElementProcessor.js.map +1 -1
- package/lib-amd/domToModel/processors/tableProcessor.js +15 -2
- package/lib-amd/domToModel/processors/tableProcessor.js.map +1 -1
- package/lib-amd/domToModel/processors/textProcessor.js +1 -1
- package/lib-amd/domToModel/processors/textProcessor.js.map +1 -1
- package/lib-amd/domUtils/selection/preprocessTable.d.ts +5 -0
- package/lib-amd/domUtils/selection/preprocessTable.js +22 -0
- package/lib-amd/domUtils/selection/preprocessTable.js.map +1 -0
- package/lib-amd/domUtils/selection/pruneUnselectedModel.d.ts +5 -0
- package/lib-amd/domUtils/selection/pruneUnselectedModel.js +136 -0
- package/lib-amd/domUtils/selection/pruneUnselectedModel.js.map +1 -0
- package/lib-amd/domUtils/selection/trimModelForSelection.d.ts +7 -0
- package/lib-amd/domUtils/selection/trimModelForSelection.js +24 -0
- package/lib-amd/domUtils/selection/trimModelForSelection.js.map +1 -0
- package/lib-amd/domUtils/style/transformColor.d.ts +1 -1
- package/lib-amd/domUtils/style/transformColor.js +11 -8
- package/lib-amd/domUtils/style/transformColor.js.map +1 -1
- package/lib-amd/formatHandlers/common/backgroundColorFormatHandler.d.ts +2 -2
- package/lib-amd/formatHandlers/common/backgroundColorFormatHandler.js +1 -1
- package/lib-amd/formatHandlers/common/backgroundColorFormatHandler.js.map +1 -1
- package/lib-amd/formatHandlers/utils/color.d.ts +3 -2
- package/lib-amd/formatHandlers/utils/color.js +11 -9
- package/lib-amd/formatHandlers/utils/color.js.map +1 -1
- package/lib-amd/index.d.ts +1 -0
- package/lib-amd/index.js +3 -2
- package/lib-amd/index.js.map +1 -1
- package/lib-amd/modelApi/editing/applyTableFormat.js +4 -1
- package/lib-amd/modelApi/editing/applyTableFormat.js.map +1 -1
- package/lib-amd/modelApi/editing/mergeModel.js +76 -22
- package/lib-amd/modelApi/editing/mergeModel.js.map +1 -1
- package/lib-amd/modelApi/editing/setTableCellBackgroundColor.js +22 -23
- package/lib-amd/modelApi/editing/setTableCellBackgroundColor.js.map +1 -1
- package/lib-amd/modelToDom/handlers/handleList.js +4 -0
- package/lib-amd/modelToDom/handlers/handleList.js.map +1 -1
- package/lib-mjs/domToModel/processors/formatContainerProcessor.d.ts +4 -0
- package/lib-mjs/domToModel/processors/formatContainerProcessor.js +10 -1
- package/lib-mjs/domToModel/processors/formatContainerProcessor.js.map +1 -1
- package/lib-mjs/domToModel/processors/knownElementProcessor.js +11 -5
- package/lib-mjs/domToModel/processors/knownElementProcessor.js.map +1 -1
- package/lib-mjs/domToModel/processors/tableProcessor.js +15 -2
- package/lib-mjs/domToModel/processors/tableProcessor.js.map +1 -1
- package/lib-mjs/domToModel/processors/textProcessor.js +1 -1
- package/lib-mjs/domToModel/processors/textProcessor.js.map +1 -1
- package/lib-mjs/domUtils/selection/preprocessTable.d.ts +5 -0
- package/lib-mjs/domUtils/selection/preprocessTable.js +18 -0
- package/lib-mjs/domUtils/selection/preprocessTable.js.map +1 -0
- package/lib-mjs/domUtils/selection/pruneUnselectedModel.d.ts +5 -0
- package/lib-mjs/domUtils/selection/pruneUnselectedModel.js +131 -0
- package/lib-mjs/domUtils/selection/pruneUnselectedModel.js.map +1 -0
- package/lib-mjs/domUtils/selection/trimModelForSelection.d.ts +7 -0
- package/lib-mjs/domUtils/selection/trimModelForSelection.js +21 -0
- package/lib-mjs/domUtils/selection/trimModelForSelection.js.map +1 -0
- package/lib-mjs/domUtils/style/transformColor.d.ts +1 -1
- package/lib-mjs/domUtils/style/transformColor.js +11 -8
- package/lib-mjs/domUtils/style/transformColor.js.map +1 -1
- package/lib-mjs/formatHandlers/common/backgroundColorFormatHandler.d.ts +2 -2
- package/lib-mjs/formatHandlers/common/backgroundColorFormatHandler.js +1 -1
- package/lib-mjs/formatHandlers/common/backgroundColorFormatHandler.js.map +1 -1
- package/lib-mjs/formatHandlers/utils/color.d.ts +3 -2
- package/lib-mjs/formatHandlers/utils/color.js +11 -9
- package/lib-mjs/formatHandlers/utils/color.js.map +1 -1
- package/lib-mjs/index.d.ts +1 -0
- package/lib-mjs/index.js +1 -0
- package/lib-mjs/index.js.map +1 -1
- package/lib-mjs/modelApi/editing/applyTableFormat.js +4 -1
- package/lib-mjs/modelApi/editing/applyTableFormat.js.map +1 -1
- package/lib-mjs/modelApi/editing/mergeModel.js +76 -22
- package/lib-mjs/modelApi/editing/mergeModel.js.map +1 -1
- package/lib-mjs/modelApi/editing/setTableCellBackgroundColor.js +22 -23
- package/lib-mjs/modelApi/editing/setTableCellBackgroundColor.js.map +1 -1
- package/lib-mjs/modelToDom/handlers/handleList.js +4 -0
- package/lib-mjs/modelToDom/handlers/handleList.js.map +1 -1
- package/package.json +3 -3
|
@@ -12,3 +12,7 @@ export declare const ContextStyles: (keyof (MarginFormat & PaddingFormat))[];
|
|
|
12
12
|
* @param context DOM to Content Model context
|
|
13
13
|
*/
|
|
14
14
|
export declare const formatContainerProcessor: ElementProcessor<HTMLElement>;
|
|
15
|
+
/**
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
export declare const forceFormatContainerProcessor: ElementProcessor<HTMLElement>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.formatContainerProcessor = exports.ContextStyles = void 0;
|
|
3
|
+
exports.forceFormatContainerProcessor = exports.formatContainerProcessor = exports.ContextStyles = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var addBlock_1 = require("../../modelApi/common/addBlock");
|
|
6
6
|
var createFormatContainer_1 = require("../../modelApi/creators/createFormatContainer");
|
|
@@ -27,6 +27,17 @@ exports.ContextStyles = [
|
|
|
27
27
|
* @param context DOM to Content Model context
|
|
28
28
|
*/
|
|
29
29
|
var formatContainerProcessor = function (group, element, context) {
|
|
30
|
+
formatContainerProcessorInternal(group, element, context, false /* forceFormatContainer */);
|
|
31
|
+
};
|
|
32
|
+
exports.formatContainerProcessor = formatContainerProcessor;
|
|
33
|
+
/**
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
var forceFormatContainerProcessor = function (group, element, context) {
|
|
37
|
+
formatContainerProcessorInternal(group, element, context, true /* forceFormatContainer */);
|
|
38
|
+
};
|
|
39
|
+
exports.forceFormatContainerProcessor = forceFormatContainerProcessor;
|
|
40
|
+
var formatContainerProcessorInternal = function (group, element, context, forceFormatContainer) {
|
|
30
41
|
(0, stackFormat_1.stackFormat)(context, { segment: 'shallowCloneForBlock', paragraph: 'shallowClone' }, function () {
|
|
31
42
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.block, context.blockFormat, context);
|
|
32
43
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.segmentOnBlock, context.segmentFormat, context);
|
|
@@ -44,7 +55,7 @@ var formatContainerProcessor = function (group, element, context) {
|
|
|
44
55
|
if (element.style.fontSize && parseInt(element.style.fontSize) == 0) {
|
|
45
56
|
formatContainer.zeroFontSize = true;
|
|
46
57
|
}
|
|
47
|
-
if (shouldFallbackToParagraph(formatContainer)) {
|
|
58
|
+
if (shouldFallbackToParagraph(formatContainer) && !forceFormatContainer) {
|
|
48
59
|
// For DIV container that only has one paragraph child, container style can be merged into paragraph
|
|
49
60
|
// and no need to have this container
|
|
50
61
|
var paragraph = formatContainer.blocks[0];
|
|
@@ -63,7 +74,6 @@ var formatContainerProcessor = function (group, element, context) {
|
|
|
63
74
|
});
|
|
64
75
|
(0, addBlock_1.addBlock)(group, (0, createParagraph_1.createParagraph)(true /*isImplicit*/, context.blockFormat));
|
|
65
76
|
};
|
|
66
|
-
exports.formatContainerProcessor = formatContainerProcessor;
|
|
67
77
|
function shouldFallbackToParagraph(formatContainer) {
|
|
68
78
|
var firstChild = formatContainer.blocks[0];
|
|
69
79
|
return (formatContainer.tagName == 'div' &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatContainerProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/formatContainerProcessor.ts"],"names":[],"mappings":";;;;AAAA,2DAA0D;AAC1D,uFAAsF;AACtF,2EAA0E;AAC1E,4DAA2D;AAC3D,oDAAmD;AACnD,wFAAuF;AACvF,oDAAmD;
|
|
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 (shouldFallbackToParagraph(formatContainer) && !forceFormatContainer) {\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"]}
|
|
@@ -4,12 +4,12 @@ exports.knownElementProcessor = void 0;
|
|
|
4
4
|
var addBlock_1 = require("../../modelApi/common/addBlock");
|
|
5
5
|
var blockProcessor_1 = require("./blockProcessor");
|
|
6
6
|
var createParagraph_1 = require("../../modelApi/creators/createParagraph");
|
|
7
|
-
var formatContainerProcessor_1 = require("./formatContainerProcessor");
|
|
8
7
|
var getDefaultStyle_1 = require("../utils/getDefaultStyle");
|
|
9
8
|
var isBlockElement_1 = require("../utils/isBlockElement");
|
|
10
9
|
var entityUtils_1 = require("../../domUtils/entityUtils");
|
|
11
10
|
var parseFormat_1 = require("../utils/parseFormat");
|
|
12
11
|
var stackFormat_1 = require("../utils/stackFormat");
|
|
12
|
+
var formatContainerProcessor_1 = require("./formatContainerProcessor");
|
|
13
13
|
var FormatContainerTriggerStyles = [
|
|
14
14
|
'marginBottom',
|
|
15
15
|
'marginTop',
|
|
@@ -36,8 +36,12 @@ var SegmentDecoratorTags = ['A', 'CODE'];
|
|
|
36
36
|
*/
|
|
37
37
|
var knownElementProcessor = function (group, element, context) {
|
|
38
38
|
var isBlock = (0, isBlockElement_1.isBlockElement)(element);
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
var isBlockContainer = isBlock || element.style.display == 'inline-block';
|
|
40
|
+
if (isBlockContainer && // For inline-block here, we will also check if it should be represented as Format Container
|
|
41
|
+
shouldForceUseFormatContainer(element, context)) {
|
|
42
|
+
(0, formatContainerProcessor_1.forceFormatContainerProcessor)(group, element, context);
|
|
43
|
+
}
|
|
44
|
+
else if (isBlockContainer && shouldUseFormatContainer(element, context)) {
|
|
41
45
|
(0, formatContainerProcessor_1.formatContainerProcessor)(group, element, context);
|
|
42
46
|
}
|
|
43
47
|
else if ((0, entityUtils_1.isBlockEntityContainer)(element)) {
|
|
@@ -71,6 +75,9 @@ var knownElementProcessor = function (group, element, context) {
|
|
|
71
75
|
}
|
|
72
76
|
};
|
|
73
77
|
exports.knownElementProcessor = knownElementProcessor;
|
|
78
|
+
function shouldForceUseFormatContainer(element, context) {
|
|
79
|
+
return FormatContainerTriggerAttributes.some(function (attr) { return element.hasAttribute(attr); });
|
|
80
|
+
}
|
|
74
81
|
function shouldUseFormatContainer(element, context) {
|
|
75
82
|
// For those tags that we know we should not use format container, just return false
|
|
76
83
|
if (ByPassFormatContainerTags.indexOf(element.tagName) >= 0) {
|
|
@@ -85,8 +92,7 @@ function shouldUseFormatContainer(element, context) {
|
|
|
85
92
|
}
|
|
86
93
|
// For block element with positive value of border width or top/bottom margin/padding,
|
|
87
94
|
// we need to use format container
|
|
88
|
-
if (FormatContainerTriggerStyles.some(function (key) { return parseInt(style[key] || defaultStyle[key] || '') > 0; })
|
|
89
|
-
FormatContainerTriggerAttributes.some(function (attr) { return element.hasAttribute(attr); })) {
|
|
95
|
+
if (FormatContainerTriggerStyles.some(function (key) { return parseInt(style[key] || defaultStyle[key] || '') > 0; })) {
|
|
90
96
|
return true;
|
|
91
97
|
}
|
|
92
98
|
// For margin left/right with value "auto", we need to use format container
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knownElementProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/knownElementProcessor.ts"],"names":[],"mappings":";;;AAAA,2DAA0D;AAC1D,mDAAkD;AAClD,2EAA0E;AAC1E,
|
|
1
|
+
{"version":3,"file":"knownElementProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/knownElementProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { addBlock } from '../../modelApi/common/addBlock';\nimport { blockProcessor } from './blockProcessor';\nimport { createParagraph } from '../../modelApi/creators/createParagraph';\nimport { getDefaultStyle } from '../utils/getDefaultStyle';\nimport { isBlockElement } from '../utils/isBlockElement';\nimport { isBlockEntityContainer } from '../../domUtils/entityUtils';\nimport { parseFormat } from '../utils/parseFormat';\nimport { stackFormat } from '../utils/stackFormat';\nimport {\n forceFormatContainerProcessor,\n formatContainerProcessor,\n} from './formatContainerProcessor';\nimport type {\n ContentModelSegmentFormat,\n DomToModelContext,\n ElementProcessor,\n} from 'roosterjs-content-model-types';\n\nconst FormatContainerTriggerStyles: (keyof CSSStyleDeclaration)[] = [\n 'marginBottom',\n 'marginTop',\n 'paddingBottom',\n 'paddingTop',\n 'paddingLeft',\n 'paddingRight',\n 'borderTopWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'width',\n 'height',\n 'maxWidth',\n 'maxHeight',\n 'minWidth',\n 'minHeight',\n];\nconst FormatContainerTriggerAttributes = ['id'];\nconst ByPassFormatContainerTags = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'P', 'A'];\nconst SegmentDecoratorTags = ['A', 'CODE'];\n\n/**\n * @internal\n */\nexport const knownElementProcessor: ElementProcessor<HTMLElement> = (group, element, context) => {\n const isBlock = isBlockElement(element);\n const isBlockContainer = isBlock || element.style.display == 'inline-block';\n\n if (\n isBlockContainer && // For inline-block here, we will also check if it should be represented as Format Container\n shouldForceUseFormatContainer(element, context)\n ) {\n forceFormatContainerProcessor(group, element, context);\n } else if (isBlockContainer && shouldUseFormatContainer(element, context)) {\n formatContainerProcessor(group, element, context);\n } else if (isBlockEntityContainer(element)) {\n context.elementProcessors.child(group, element, context);\n } else if (isBlock) {\n const decorator = context.blockDecorator.tagName ? context.blockDecorator : undefined;\n const isSegmentDecorator = SegmentDecoratorTags.indexOf(element.tagName) >= 0;\n\n stackFormat(context, { segment: 'shallowCloneForBlock', paragraph: 'shallowClone' }, () => {\n const segmentFormat: ContentModelSegmentFormat = {};\n\n parseFormat(element, context.formatParsers.segmentOnBlock, segmentFormat, context);\n Object.assign(context.segmentFormat, segmentFormat);\n\n blockProcessor(group, element, context, segmentFormat);\n });\n\n if (isBlock && !isSegmentDecorator) {\n addBlock(\n group,\n createParagraph(\n true /*isImplicit*/,\n context.blockFormat,\n undefined /*segmentFormat*/,\n decorator\n )\n );\n }\n } else {\n stackFormat(\n context,\n {\n segment: 'shallowClone',\n paragraph: 'shallowClone',\n link: 'cloneFormat',\n },\n () => {\n parseFormat(element, context.formatParsers.segment, context.segmentFormat, context);\n\n if (context.link.format.href && element.tagName != 'A') {\n parseFormat(\n element,\n context.formatParsers.segmentUnderLink,\n context.link.format,\n context\n );\n }\n\n context.elementProcessors.child(group, element, context);\n }\n );\n }\n};\n\nfunction shouldForceUseFormatContainer(element: HTMLElement, context: DomToModelContext) {\n return FormatContainerTriggerAttributes.some(attr => element.hasAttribute(attr));\n}\n\nfunction shouldUseFormatContainer(element: HTMLElement, context: DomToModelContext) {\n // For those tags that we know we should not use format container, just return false\n if (ByPassFormatContainerTags.indexOf(element.tagName) >= 0) {\n return false;\n }\n\n const style = element.style;\n const defaultStyle = getDefaultStyle(element);\n\n const bgcolor = style.getPropertyValue('background-color');\n\n // For block element with background, we need to use format container\n if (bgcolor && bgcolor != 'transparent') {\n return true;\n }\n\n // For block element with positive value of border width or top/bottom margin/padding,\n // we need to use format container\n if (\n FormatContainerTriggerStyles.some(\n key => parseInt((style[key] as string) || (defaultStyle[key] as string) || '') > 0\n )\n ) {\n return true;\n }\n\n // For margin left/right with value \"auto\", we need to use format container\n if (style.marginLeft == 'auto' || style.marginRight == 'auto') {\n return true;\n }\n\n // For element with \"align\" attribute, we need to use format container\n if (element.getAttribute('align')) {\n return true;\n }\n\n return false;\n}\n"]}
|
|
@@ -51,6 +51,7 @@ var tableProcessor = function (group, tableElement, context) {
|
|
|
51
51
|
var hasColGroup = processColGroup(tableElement, context, columnPositions);
|
|
52
52
|
var rowPositions = [0];
|
|
53
53
|
var zoomScale = context.zoomScale || 1;
|
|
54
|
+
var maxColumns = 0;
|
|
54
55
|
var _loop_1 = function (row) {
|
|
55
56
|
var tr = tableElement.rows[row];
|
|
56
57
|
var tableRow = table.rows[row];
|
|
@@ -169,17 +170,29 @@ var tableProcessor = function (group, tableElement, context) {
|
|
|
169
170
|
tableRow.cells[col] = (0, createTableCell_1.createTableCell)(false, false, false, context.blockFormat);
|
|
170
171
|
}
|
|
171
172
|
}
|
|
173
|
+
maxColumns = Math.max(maxColumns, tableRow.cells.length);
|
|
172
174
|
};
|
|
173
175
|
for (var row = 0; row < tableElement.rows.length; row++) {
|
|
174
176
|
_loop_1(row);
|
|
175
177
|
}
|
|
176
178
|
table.widths = calcSizes(columnPositions);
|
|
177
179
|
var heights = calcSizes(rowPositions);
|
|
178
|
-
table.rows.
|
|
180
|
+
for (var i = 0; i < table.rows.length; i++) {
|
|
181
|
+
var row = table.rows[i];
|
|
182
|
+
var currentLength = row.cells.length;
|
|
183
|
+
if (currentLength > 0 && currentLength < maxColumns) {
|
|
184
|
+
var lastCell = row.cells[currentLength - 1];
|
|
185
|
+
for (var col = currentLength; col < maxColumns; col++) {
|
|
186
|
+
var spanCell = (0, createTableCell_1.createTableCell)(true, // spanLeft
|
|
187
|
+
false, lastCell.isHeader, lastCell.format);
|
|
188
|
+
spanCell.dataset = (0, tslib_1.__assign)({}, lastCell.dataset);
|
|
189
|
+
row.cells[col] = spanCell;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
179
192
|
if (heights[i] > 0) {
|
|
180
193
|
row.height = heights[i];
|
|
181
194
|
}
|
|
182
|
-
}
|
|
195
|
+
}
|
|
183
196
|
});
|
|
184
197
|
};
|
|
185
198
|
exports.tableProcessor = tableProcessor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tableProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/tableProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { addBlock } from '../../modelApi/common/addBlock';\nimport { createTable } from '../../modelApi/creators/createTable';\nimport { createTableCell } from '../../modelApi/creators/createTableCell';\nimport { getBoundingClientRect } from '../utils/getBoundingClientRect';\nimport { getSelectionRootNode } from '../../domUtils/selection/getSelectionRootNode';\nimport { isElementOfType } from '../../domUtils/isElementOfType';\nimport { isNodeOfType } from '../../domUtils/isNodeOfType';\nimport { parseFormat } from '../utils/parseFormat';\nimport { parseValueWithUnit } from '../../formatHandlers/utils/parseValueWithUnit';\nimport { stackFormat } from '../utils/stackFormat';\nimport type {\n ContentModelTableCellFormat,\n DatasetFormat,\n DomToModelContext,\n ElementProcessor,\n SizeFormat,\n} from 'roosterjs-content-model-types';\n\n/**\n * Content Model Element Processor for table\n *\n * For Table with merged/splitted cells, HTML uses colSpan and rowSpan attributes to specify how it should be rendered.\n * To make it easier to edit a table, we will use a different way to describe table.\n *\n * 1. For a m * n table (m rows, n columns), we always create a m * n array for the cells.\n * 2. For a regular table cell, it is mapped to one item of this array\n * 3. For a merged/splitted table cell, it will has colSpan/rowSpan value. We also created TableCell model for those spanned\n * cells, and use \"spanLeft\" and \"spanAbove\" to mark its state\n * 4. When edit table, we always edit on this mapped m * n array because it always has an item for each cell\n * 5. When write back to DOM, we create TD/TH elements for those non-spanned cells, and mark its colSpan/rowSpan value according\n * its neighbour cell's spanLeft/spanAbove attribute\n * @param group The parent block group\n * @param parent Parent DOM node to process\n * @param context DOM to Content Model context\n */\nexport const tableProcessor: ElementProcessor<HTMLTableElement> = (\n group,\n tableElement,\n context\n) => {\n stackFormat(\n context,\n { segment: 'shallowCloneForBlock', paragraph: 'shallowCloneForGroup' },\n () => {\n parseFormat(tableElement, context.formatParsers.block, context.blockFormat, context);\n\n const table = createTable(tableElement.rows.length, context.blockFormat);\n const tableSelection = context.selection?.type == 'table' ? context.selection : null;\n const selectedTable = tableSelection?.table;\n const hasTableSelection = selectedTable == tableElement;\n const recalculateTableSize = shouldRecalculateTableSize(tableElement, context);\n\n if (context.allowCacheElement) {\n table.cachedElement = tableElement;\n }\n\n context.domIndexer?.onTable(tableElement, table);\n\n parseFormat(tableElement, context.formatParsers.table, table.format, context);\n parseFormat(tableElement, context.formatParsers.tableBorder, table.format, context);\n parseFormat(\n tableElement,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n parseFormat(tableElement, context.formatParsers.dataset, table.dataset, context);\n addBlock(group, table);\n\n const columnPositions: (number | undefined)[] = [0];\n const hasColGroup = processColGroup(tableElement, context, columnPositions);\n const rowPositions: number[] = [0];\n const zoomScale = context.zoomScale || 1;\n\n for (let row = 0; row < tableElement.rows.length; row++) {\n const tr = tableElement.rows[row];\n const tableRow = table.rows[row];\n\n const tbody = tr.parentNode;\n\n if (\n isNodeOfType(tbody, 'ELEMENT_NODE') &&\n (isElementOfType(tbody, 'tbody') ||\n isElementOfType(tbody, 'thead') ||\n isElementOfType(tbody, 'tfoot'))\n ) {\n parseFormat(tbody, context.formatParsers.tableRow, tableRow.format, context);\n } else if (context.allowCacheElement) {\n tableRow.cachedElement = tr;\n }\n\n parseFormat(tr, context.formatParsers.tableRow, tableRow.format, context);\n\n stackFormat(context, { paragraph: 'shallowClone', segment: 'shallowClone' }, () => {\n const parent = tr.parentElement;\n const isInTableSection = parent && getIsInTableSection(parent);\n\n if (isInTableSection) {\n // If there is TBODY around TR, retrieve format from TBODY first, in case some format are declared there\n parseFormat(\n parent,\n context.formatParsers.block,\n context.blockFormat,\n context\n );\n parseFormat(\n parent,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n }\n\n parseFormat(tr, context.formatParsers.block, context.blockFormat, context);\n parseFormat(\n tr,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n\n tableRow.height = parseInt(tr.style.height) || 0;\n\n for (\n let sourceCol = 0, targetCol = 0;\n sourceCol < tr.cells.length;\n sourceCol++\n ) {\n for (; tableRow.cells[targetCol]; targetCol++) {}\n\n const td = tr.cells[sourceCol];\n const hasSelectionBeforeCell = context.isInSelection;\n if (recalculateTableSize) {\n const colEnd = targetCol + td.colSpan;\n const rowEnd = row + td.rowSpan;\n const needCalcWidth = columnPositions[colEnd] === undefined;\n const needCalcHeight = rowPositions[rowEnd] === undefined;\n\n if (needCalcWidth || needCalcHeight) {\n const rect = getBoundingClientRect(td);\n\n if (rect.width > 0 || rect.height > 0) {\n if (needCalcWidth) {\n const pos = columnPositions[targetCol];\n\n columnPositions[colEnd] =\n (typeof pos == 'number' ? pos : 0) +\n rect.width / zoomScale;\n }\n\n if (needCalcHeight) {\n rowPositions[rowEnd] =\n rowPositions[row] + rect.height / zoomScale;\n }\n }\n }\n }\n\n stackFormat(\n context,\n { paragraph: 'shallowClone', segment: 'shallowClone' },\n () => {\n parseFormat(\n td,\n context.formatParsers.block,\n context.blockFormat,\n context\n );\n parseFormat(\n td,\n context.formatParsers.segmentOnTableCell,\n context.segmentFormat,\n context\n );\n\n const cellFormat: ContentModelTableCellFormat = {\n ...context.blockFormat,\n };\n const dataset: DatasetFormat = {};\n\n parseFormat(\n td,\n context.formatParsers.tableCell,\n cellFormat,\n context\n );\n parseFormat(\n td,\n context.formatParsers.tableBorder,\n cellFormat,\n context\n );\n parseFormat(td, context.formatParsers.dataset, dataset, context);\n\n for (\n let colSpan = 1;\n colSpan <= (td.colSpan == 0 ? 1 : td.colSpan);\n colSpan++, targetCol++\n ) {\n for (\n let rowSpan = 1;\n // RowSpan of 0 means it should span to the end of the table\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/td#rowspan\n rowSpan <=\n (td.rowSpan == 0\n ? isInTableSection\n ? translateRowSpanZero(parent, td)\n : 1\n : td.rowSpan);\n rowSpan++\n ) {\n const hasTd = colSpan == 1 && rowSpan == 1;\n const cell = createTableCell(\n colSpan > 1,\n rowSpan > 1,\n td.tagName == 'TH',\n cellFormat\n );\n\n cell.dataset = { ...dataset };\n\n const spannedRow = table.rows[row + rowSpan - 1];\n\n if (spannedRow) {\n spannedRow.cells[targetCol] = cell;\n }\n\n if (hasTd) {\n // When there is COLGROUP, width on table cell should be ignored, so we should not cache the table cell,\n // and always recreate it when write back using the table formats\n if (context.allowCacheElement && !hasColGroup) {\n cell.cachedElement = td;\n }\n\n const { listParent, levels } = context.listFormat;\n\n context.listFormat.listParent = undefined;\n context.listFormat.levels = [];\n\n try {\n context.elementProcessors.child(cell, td, context);\n } finally {\n context.listFormat.listParent = listParent;\n context.listFormat.levels = levels;\n }\n }\n\n const hasSelectionAfterCell = context.isInSelection;\n\n if (\n (hasSelectionBeforeCell && hasSelectionAfterCell) ||\n (hasTableSelection &&\n tableSelection &&\n row >= tableSelection.firstRow &&\n row <= tableSelection.lastRow &&\n targetCol >= tableSelection.firstColumn &&\n targetCol <= tableSelection.lastColumn)\n ) {\n cell.isSelected = true;\n }\n }\n }\n }\n );\n }\n });\n\n for (let col = 0; col < tableRow.cells.length; col++) {\n if (!tableRow.cells[col]) {\n tableRow.cells[col] = createTableCell(\n false,\n false,\n false,\n context.blockFormat\n );\n }\n }\n }\n\n table.widths = calcSizes(columnPositions);\n\n const heights = calcSizes(rowPositions);\n\n table.rows.forEach((row, i) => {\n if (heights[i] > 0) {\n row.height = heights[i];\n }\n });\n }\n );\n};\n\nfunction translateRowSpanZero(parent: HTMLTableSectionElement, td: HTMLTableCellElement) {\n const amountOfRows = parent.rows.length;\n\n let tdIndex = -1;\n for (let i = 0; i < parent.rows.length; i++) {\n const row = parent.rows[i];\n for (let j = 0; j < row.cells.length; j++) {\n if (row.cells[j] === td) {\n tdIndex = i;\n break;\n }\n }\n if (tdIndex !== -1) {\n break;\n }\n }\n\n return amountOfRows - tdIndex;\n}\n\nfunction calcSizes(positions: (number | undefined)[]): number[] {\n const result: number[] = [];\n let lastPos = 0;\n\n for (let i = positions.length - 1; i >= 0; i--) {\n const pos = positions[i];\n\n if (typeof pos == 'number') {\n lastPos = pos;\n break;\n }\n }\n\n for (let i = positions.length - 2; i >= 0; i--) {\n const pos = positions[i];\n if (pos === undefined) {\n result[i] = 0;\n } else {\n result[i] = lastPos - pos;\n lastPos = pos;\n }\n }\n\n return result;\n}\n\nfunction processColGroup(\n table: HTMLElement,\n context: DomToModelContext,\n result: (number | undefined)[]\n): boolean {\n let lastPos = 0;\n let hasColGroup = false;\n\n for (let child = table.firstChild; child; child = child.nextSibling) {\n if (isNodeOfType(child, 'ELEMENT_NODE') && child.tagName == 'COLGROUP') {\n hasColGroup = true;\n\n for (let col = child.firstChild; col; col = col.nextSibling) {\n if (isNodeOfType(col, 'ELEMENT_NODE') && col.tagName == 'COL') {\n const colFormat: SizeFormat = {};\n\n parseFormat(col, context.formatParsers.tableColumn, colFormat, context);\n\n for (let i = 0; i < parseInt(col.getAttribute('span') ?? '1'); i++) {\n if (colFormat.width === undefined) {\n result.push(undefined);\n } else {\n const width = parseValueWithUnit(\n colFormat.width ?? '',\n undefined /*element*/,\n 'px'\n );\n\n result.push(width + lastPos);\n lastPos += width;\n }\n }\n }\n }\n }\n }\n\n return hasColGroup;\n}\n\nfunction shouldRecalculateTableSize(table: HTMLTableElement, context: DomToModelContext): boolean {\n switch (context.recalculateTableSize) {\n case true:\n case 'all':\n return true;\n\n case 'selected':\n const selectionRoot = getSelectionRootNode(context.selection);\n\n return (\n !!selectionRoot &&\n (selectionRoot == table ||\n table.contains(selectionRoot) ||\n selectionRoot.contains(table))\n );\n\n default:\n return false;\n }\n}\n\nfunction getIsInTableSection(element: HTMLElement): element is HTMLTableSectionElement {\n return (\n isElementOfType(element, 'tbody') ||\n isElementOfType(element, 'thead') ||\n isElementOfType(element, 'tfoot')\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tableProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/tableProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { addBlock } from '../../modelApi/common/addBlock';\nimport { createTable } from '../../modelApi/creators/createTable';\nimport { createTableCell } from '../../modelApi/creators/createTableCell';\nimport { getBoundingClientRect } from '../utils/getBoundingClientRect';\nimport { getSelectionRootNode } from '../../domUtils/selection/getSelectionRootNode';\nimport { isElementOfType } from '../../domUtils/isElementOfType';\nimport { isNodeOfType } from '../../domUtils/isNodeOfType';\nimport { parseFormat } from '../utils/parseFormat';\nimport { parseValueWithUnit } from '../../formatHandlers/utils/parseValueWithUnit';\nimport { stackFormat } from '../utils/stackFormat';\nimport type {\n ContentModelTableCellFormat,\n DatasetFormat,\n DomToModelContext,\n ElementProcessor,\n SizeFormat,\n} from 'roosterjs-content-model-types';\n\n/**\n * Content Model Element Processor for table\n *\n * For Table with merged/splitted cells, HTML uses colSpan and rowSpan attributes to specify how it should be rendered.\n * To make it easier to edit a table, we will use a different way to describe table.\n *\n * 1. For a m * n table (m rows, n columns), we always create a m * n array for the cells.\n * 2. For a regular table cell, it is mapped to one item of this array\n * 3. For a merged/splitted table cell, it will has colSpan/rowSpan value. We also created TableCell model for those spanned\n * cells, and use \"spanLeft\" and \"spanAbove\" to mark its state\n * 4. When edit table, we always edit on this mapped m * n array because it always has an item for each cell\n * 5. When write back to DOM, we create TD/TH elements for those non-spanned cells, and mark its colSpan/rowSpan value according\n * its neighbour cell's spanLeft/spanAbove attribute\n * @param group The parent block group\n * @param parent Parent DOM node to process\n * @param context DOM to Content Model context\n */\nexport const tableProcessor: ElementProcessor<HTMLTableElement> = (\n group,\n tableElement,\n context\n) => {\n stackFormat(\n context,\n { segment: 'shallowCloneForBlock', paragraph: 'shallowCloneForGroup' },\n () => {\n parseFormat(tableElement, context.formatParsers.block, context.blockFormat, context);\n\n const table = createTable(tableElement.rows.length, context.blockFormat);\n const tableSelection = context.selection?.type == 'table' ? context.selection : null;\n const selectedTable = tableSelection?.table;\n const hasTableSelection = selectedTable == tableElement;\n const recalculateTableSize = shouldRecalculateTableSize(tableElement, context);\n\n if (context.allowCacheElement) {\n table.cachedElement = tableElement;\n }\n\n context.domIndexer?.onTable(tableElement, table);\n\n parseFormat(tableElement, context.formatParsers.table, table.format, context);\n parseFormat(tableElement, context.formatParsers.tableBorder, table.format, context);\n parseFormat(\n tableElement,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n parseFormat(tableElement, context.formatParsers.dataset, table.dataset, context);\n addBlock(group, table);\n\n const columnPositions: (number | undefined)[] = [0];\n const hasColGroup = processColGroup(tableElement, context, columnPositions);\n const rowPositions: number[] = [0];\n const zoomScale = context.zoomScale || 1;\n let maxColumns = 0;\n\n for (let row = 0; row < tableElement.rows.length; row++) {\n const tr = tableElement.rows[row];\n const tableRow = table.rows[row];\n\n const tbody = tr.parentNode;\n\n if (\n isNodeOfType(tbody, 'ELEMENT_NODE') &&\n (isElementOfType(tbody, 'tbody') ||\n isElementOfType(tbody, 'thead') ||\n isElementOfType(tbody, 'tfoot'))\n ) {\n parseFormat(tbody, context.formatParsers.tableRow, tableRow.format, context);\n } else if (context.allowCacheElement) {\n tableRow.cachedElement = tr;\n }\n\n parseFormat(tr, context.formatParsers.tableRow, tableRow.format, context);\n\n stackFormat(context, { paragraph: 'shallowClone', segment: 'shallowClone' }, () => {\n const parent = tr.parentElement;\n const isInTableSection = parent && getIsInTableSection(parent);\n\n if (isInTableSection) {\n // If there is TBODY around TR, retrieve format from TBODY first, in case some format are declared there\n parseFormat(\n parent,\n context.formatParsers.block,\n context.blockFormat,\n context\n );\n parseFormat(\n parent,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n }\n\n parseFormat(tr, context.formatParsers.block, context.blockFormat, context);\n parseFormat(\n tr,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n\n tableRow.height = parseInt(tr.style.height) || 0;\n\n for (\n let sourceCol = 0, targetCol = 0;\n sourceCol < tr.cells.length;\n sourceCol++\n ) {\n for (; tableRow.cells[targetCol]; targetCol++) {}\n\n const td = tr.cells[sourceCol];\n const hasSelectionBeforeCell = context.isInSelection;\n if (recalculateTableSize) {\n const colEnd = targetCol + td.colSpan;\n const rowEnd = row + td.rowSpan;\n const needCalcWidth = columnPositions[colEnd] === undefined;\n const needCalcHeight = rowPositions[rowEnd] === undefined;\n\n if (needCalcWidth || needCalcHeight) {\n const rect = getBoundingClientRect(td);\n\n if (rect.width > 0 || rect.height > 0) {\n if (needCalcWidth) {\n const pos = columnPositions[targetCol];\n\n columnPositions[colEnd] =\n (typeof pos == 'number' ? pos : 0) +\n rect.width / zoomScale;\n }\n\n if (needCalcHeight) {\n rowPositions[rowEnd] =\n rowPositions[row] + rect.height / zoomScale;\n }\n }\n }\n }\n\n stackFormat(\n context,\n { paragraph: 'shallowClone', segment: 'shallowClone' },\n () => {\n parseFormat(\n td,\n context.formatParsers.block,\n context.blockFormat,\n context\n );\n parseFormat(\n td,\n context.formatParsers.segmentOnTableCell,\n context.segmentFormat,\n context\n );\n\n const cellFormat: ContentModelTableCellFormat = {\n ...context.blockFormat,\n };\n const dataset: DatasetFormat = {};\n\n parseFormat(\n td,\n context.formatParsers.tableCell,\n cellFormat,\n context\n );\n parseFormat(\n td,\n context.formatParsers.tableBorder,\n cellFormat,\n context\n );\n parseFormat(td, context.formatParsers.dataset, dataset, context);\n\n for (\n let colSpan = 1;\n colSpan <= (td.colSpan == 0 ? 1 : td.colSpan);\n colSpan++, targetCol++\n ) {\n for (\n let rowSpan = 1;\n // RowSpan of 0 means it should span to the end of the table\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/td#rowspan\n rowSpan <=\n (td.rowSpan == 0\n ? isInTableSection\n ? translateRowSpanZero(parent, td)\n : 1\n : td.rowSpan);\n rowSpan++\n ) {\n const hasTd = colSpan == 1 && rowSpan == 1;\n const cell = createTableCell(\n colSpan > 1,\n rowSpan > 1,\n td.tagName == 'TH',\n cellFormat\n );\n\n cell.dataset = { ...dataset };\n\n const spannedRow = table.rows[row + rowSpan - 1];\n\n if (spannedRow) {\n spannedRow.cells[targetCol] = cell;\n }\n\n if (hasTd) {\n // When there is COLGROUP, width on table cell should be ignored, so we should not cache the table cell,\n // and always recreate it when write back using the table formats\n if (context.allowCacheElement && !hasColGroup) {\n cell.cachedElement = td;\n }\n\n const { listParent, levels } = context.listFormat;\n\n context.listFormat.listParent = undefined;\n context.listFormat.levels = [];\n\n try {\n context.elementProcessors.child(cell, td, context);\n } finally {\n context.listFormat.listParent = listParent;\n context.listFormat.levels = levels;\n }\n }\n\n const hasSelectionAfterCell = context.isInSelection;\n\n if (\n (hasSelectionBeforeCell && hasSelectionAfterCell) ||\n (hasTableSelection &&\n tableSelection &&\n row >= tableSelection.firstRow &&\n row <= tableSelection.lastRow &&\n targetCol >= tableSelection.firstColumn &&\n targetCol <= tableSelection.lastColumn)\n ) {\n cell.isSelected = true;\n }\n }\n }\n }\n );\n }\n });\n\n for (let col = 0; col < tableRow.cells.length; col++) {\n if (!tableRow.cells[col]) {\n tableRow.cells[col] = createTableCell(\n false,\n false,\n false,\n context.blockFormat\n );\n }\n }\n\n maxColumns = Math.max(maxColumns, tableRow.cells.length);\n }\n\n table.widths = calcSizes(columnPositions);\n\n const heights = calcSizes(rowPositions);\n\n for (let i = 0; i < table.rows.length; i++) {\n const row = table.rows[i];\n const currentLength = row.cells.length;\n\n if (currentLength > 0 && currentLength < maxColumns) {\n const lastCell = row.cells[currentLength - 1];\n\n for (let col = currentLength; col < maxColumns; col++) {\n const spanCell = createTableCell(\n true, // spanLeft\n false,\n lastCell.isHeader,\n lastCell.format\n );\n spanCell.dataset = { ...lastCell.dataset };\n row.cells[col] = spanCell;\n }\n }\n\n if (heights[i] > 0) {\n row.height = heights[i];\n }\n }\n }\n );\n};\n\nfunction translateRowSpanZero(parent: HTMLTableSectionElement, td: HTMLTableCellElement) {\n const amountOfRows = parent.rows.length;\n\n let tdIndex = -1;\n for (let i = 0; i < parent.rows.length; i++) {\n const row = parent.rows[i];\n for (let j = 0; j < row.cells.length; j++) {\n if (row.cells[j] === td) {\n tdIndex = i;\n break;\n }\n }\n if (tdIndex !== -1) {\n break;\n }\n }\n\n return amountOfRows - tdIndex;\n}\n\nfunction calcSizes(positions: (number | undefined)[]): number[] {\n const result: number[] = [];\n let lastPos = 0;\n\n for (let i = positions.length - 1; i >= 0; i--) {\n const pos = positions[i];\n\n if (typeof pos == 'number') {\n lastPos = pos;\n break;\n }\n }\n\n for (let i = positions.length - 2; i >= 0; i--) {\n const pos = positions[i];\n if (pos === undefined) {\n result[i] = 0;\n } else {\n result[i] = lastPos - pos;\n lastPos = pos;\n }\n }\n\n return result;\n}\n\nfunction processColGroup(\n table: HTMLElement,\n context: DomToModelContext,\n result: (number | undefined)[]\n): boolean {\n let lastPos = 0;\n let hasColGroup = false;\n\n for (let child = table.firstChild; child; child = child.nextSibling) {\n if (isNodeOfType(child, 'ELEMENT_NODE') && child.tagName == 'COLGROUP') {\n hasColGroup = true;\n\n for (let col = child.firstChild; col; col = col.nextSibling) {\n if (isNodeOfType(col, 'ELEMENT_NODE') && col.tagName == 'COL') {\n const colFormat: SizeFormat = {};\n\n parseFormat(col, context.formatParsers.tableColumn, colFormat, context);\n\n for (let i = 0; i < parseInt(col.getAttribute('span') ?? '1'); i++) {\n if (colFormat.width === undefined) {\n result.push(undefined);\n } else {\n const width = parseValueWithUnit(\n colFormat.width ?? '',\n undefined /*element*/,\n 'px'\n );\n\n result.push(width + lastPos);\n lastPos += width;\n }\n }\n }\n }\n }\n }\n\n return hasColGroup;\n}\n\nfunction shouldRecalculateTableSize(table: HTMLTableElement, context: DomToModelContext): boolean {\n switch (context.recalculateTableSize) {\n case true:\n case 'all':\n return true;\n\n case 'selected':\n const selectionRoot = getSelectionRootNode(context.selection);\n\n return (\n !!selectionRoot &&\n (selectionRoot == table ||\n table.contains(selectionRoot) ||\n selectionRoot.contains(table))\n );\n\n default:\n return false;\n }\n}\n\nfunction getIsInTableSection(element: HTMLElement): element is HTMLTableSectionElement {\n return (\n isElementOfType(element, 'tbody') ||\n isElementOfType(element, 'thead') ||\n isElementOfType(element, 'tfoot')\n );\n}\n"]}
|
|
@@ -11,8 +11,8 @@ var textProcessor = function (group, textNode, context) {
|
|
|
11
11
|
(0, stackFormat_1.stackFormat)(context, { segment: 'shallowClone' }, function () {
|
|
12
12
|
context.formatParsers.text.forEach(function (parser) {
|
|
13
13
|
parser(context.segmentFormat, textNode, context);
|
|
14
|
-
internalTextProcessor(group, textNode, context);
|
|
15
14
|
});
|
|
15
|
+
internalTextProcessor(group, textNode, context);
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
18
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/textProcessor.ts"],"names":[],"mappings":";;;AAAA,yEAAwE;AACxE,oDAAmD;AAQnD;;GAEG;AACI,IAAM,aAAa,GAA2B,UACjD,KAA6B,EAC7B,QAAc,EACd,OAA0B;IAE1B,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;QACvC,IAAA,yBAAW,EAAC,OAAO,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE;YAC9C,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,UAAA,MAAM;gBACrC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"textProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/textProcessor.ts"],"names":[],"mappings":";;;AAAA,yEAAwE;AACxE,oDAAmD;AAQnD;;GAEG;AACI,IAAM,aAAa,GAA2B,UACjD,KAA6B,EAC7B,QAAc,EACd,OAA0B;IAE1B,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;QACvC,IAAA,yBAAW,EAAC,OAAO,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE;YAC9C,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,UAAA,MAAM;gBACrC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;YACH,qBAAqB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;KACN;SAAM;QACH,qBAAqB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;KACnD;AACL,CAAC,CAAC;AAfW,QAAA,aAAa,iBAexB;AAEF,SAAS,qBAAqB,CAC1B,KAA6B,EAC7B,QAAc,EACd,OAA0B;;IAE1B,IAAM,SAAS,GAAG,IAAA,iCAAe,EAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9D,IAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;IAE/C,OAAO,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEtE,IAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC3D,MAAA,OAAO,CAAC,UAAU,0CAAE,SAAS,CACzB,QAAQ,EACR,SAAS,EACT,WAAW,CAAC,MAAM,CAAC,UAAC,CAAC,IAA4B,OAAA,CAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,WAAW,KAAI,MAAM,EAAxB,CAAwB,CAAC,CAC7E,CAAC;AACN,CAAC","sourcesContent":["import { ensureParagraph } from '../../modelApi/common/ensureParagraph';\nimport { stackFormat } from '../utils/stackFormat';\nimport type {\n ContentModelBlockGroup,\n ContentModelText,\n DomToModelContext,\n ElementProcessor,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const textProcessor: ElementProcessor<Text> = (\n group: ContentModelBlockGroup,\n textNode: Text,\n context: DomToModelContext\n) => {\n if (context.formatParsers.text.length > 0) {\n stackFormat(context, { segment: 'shallowClone' }, () => {\n context.formatParsers.text.forEach(parser => {\n parser(context.segmentFormat, textNode, context);\n });\n internalTextProcessor(group, textNode, context);\n });\n } else {\n internalTextProcessor(group, textNode, context);\n }\n};\n\nfunction internalTextProcessor(\n group: ContentModelBlockGroup,\n textNode: Text,\n context: DomToModelContext\n) {\n const paragraph = ensureParagraph(group, context.blockFormat);\n const segmentCount = paragraph.segments.length;\n\n context.elementProcessors.textWithSelection(group, textNode, context);\n\n const newSegments = paragraph.segments.slice(segmentCount);\n context.domIndexer?.onSegment(\n textNode,\n paragraph,\n newSegments.filter((x): x is ContentModelText => x?.segmentType == 'Text')\n );\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.preprocessTable = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var getSelectedCells_1 = require("../../modelApi/selection/getSelectedCells");
|
|
6
|
+
/**
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
function preprocessTable(table) {
|
|
10
|
+
var sel = (0, getSelectedCells_1.getSelectedCells)(table);
|
|
11
|
+
table.rows = table.rows
|
|
12
|
+
.map(function (row) {
|
|
13
|
+
return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, row), { cells: row.cells.filter(function (cell) { return cell.isSelected; }) });
|
|
14
|
+
})
|
|
15
|
+
.filter(function (row) { return row.cells.length > 0; });
|
|
16
|
+
delete table.format.width;
|
|
17
|
+
table.widths = sel
|
|
18
|
+
? table.widths.filter(function (_, index) { return index >= (sel === null || sel === void 0 ? void 0 : sel.firstColumn) && index <= (sel === null || sel === void 0 ? void 0 : sel.lastColumn); })
|
|
19
|
+
: [];
|
|
20
|
+
}
|
|
21
|
+
exports.preprocessTable = preprocessTable;
|
|
22
|
+
//# sourceMappingURL=preprocessTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preprocessTable.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domUtils/selection/preprocessTable.ts"],"names":[],"mappings":";;;;AAAA,8EAA6E;AAG7E;;GAEG;AACH,SAAgB,eAAe,CAAC,KAAwB;IACpD,IAAM,GAAG,GAAG,IAAA,mCAAgB,EAAC,KAAK,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI;SAClB,GAAG,CAAC,UAAA,GAAG;QACJ,uDACO,GAAG,KACN,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,UAAA,IAAI,IAAI,OAAA,IAAI,CAAC,UAAU,EAAf,CAAe,CAAC,IAClD;IACN,CAAC,CAAC;SACD,MAAM,CAAC,UAAA,GAAG,IAAI,OAAA,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAApB,CAAoB,CAAC,CAAC;IAEzC,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;IAE1B,KAAK,CAAC,MAAM,GAAG,GAAG;QACd,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,UAAC,CAAC,EAAE,KAAK,IAAK,OAAA,KAAK,KAAI,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,WAAW,CAAA,IAAI,KAAK,KAAI,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,CAAA,EAArD,CAAqD,CAAC;QAC1F,CAAC,CAAC,EAAE,CAAC;AACb,CAAC;AAhBD,0CAgBC","sourcesContent":["import { getSelectedCells } from '../../modelApi/selection/getSelectedCells';\nimport type { ContentModelTable } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function preprocessTable(table: ContentModelTable) {\n const sel = getSelectedCells(table);\n table.rows = table.rows\n .map(row => {\n return {\n ...row,\n cells: row.cells.filter(cell => cell.isSelected),\n };\n })\n .filter(row => row.cells.length > 0);\n\n delete table.format.width;\n\n table.widths = sel\n ? table.widths.filter((_, index) => index >= sel?.firstColumn && index <= sel?.lastColumn)\n : [];\n}\n"]}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pruneUnselectedModel = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
/**
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
function pruneUnselectedModel(model) {
|
|
9
|
+
pruneUnselectedModelInternal(model, false /* isSelectionAfterElement */);
|
|
10
|
+
unwrap(model);
|
|
11
|
+
}
|
|
12
|
+
exports.pruneUnselectedModel = pruneUnselectedModel;
|
|
13
|
+
function pruneUnselectedModelInternal(model, isSelectionAfterElement) {
|
|
14
|
+
var e_1, _a, _b;
|
|
15
|
+
for (var index = model.blocks.length - 1; index >= 0; index--) {
|
|
16
|
+
var block = model.blocks[index];
|
|
17
|
+
switch (block.blockType) {
|
|
18
|
+
case 'BlockGroup':
|
|
19
|
+
pruneUnselectedModelInternal(block, isSelectionAfterElement);
|
|
20
|
+
if (block.blockGroupType == 'General'
|
|
21
|
+
? block.blocks.length == 0 && !block.isSelected
|
|
22
|
+
: block.blocks.length == 0) {
|
|
23
|
+
model.blocks.splice(index, 1);
|
|
24
|
+
}
|
|
25
|
+
break;
|
|
26
|
+
case 'Divider':
|
|
27
|
+
case 'Entity':
|
|
28
|
+
if (!block.isSelected) {
|
|
29
|
+
model.blocks.splice(index, 1);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
isSelectionAfterElement = true;
|
|
33
|
+
}
|
|
34
|
+
break;
|
|
35
|
+
case 'Paragraph':
|
|
36
|
+
var newSegments = [];
|
|
37
|
+
try {
|
|
38
|
+
for (var _c = (e_1 = void 0, (0, tslib_1.__values)(block.segments)), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
39
|
+
var segment = _d.value;
|
|
40
|
+
if (segment.segmentType == 'General') {
|
|
41
|
+
pruneUnselectedModel(segment);
|
|
42
|
+
if (segment.blocks.length > 0 || segment.isSelected) {
|
|
43
|
+
newSegments.push(segment);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else if (segment.isSelected && segment.segmentType != 'SelectionMarker') {
|
|
47
|
+
newSegments.push(segment);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
52
|
+
finally {
|
|
53
|
+
try {
|
|
54
|
+
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
55
|
+
}
|
|
56
|
+
finally { if (e_1) throw e_1.error; }
|
|
57
|
+
}
|
|
58
|
+
block.segments = newSegments;
|
|
59
|
+
if (block.segments.length == 0) {
|
|
60
|
+
model.blocks.splice(index, 1);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
isSelectionAfterElement = true;
|
|
64
|
+
}
|
|
65
|
+
break;
|
|
66
|
+
case 'Table':
|
|
67
|
+
var filteredRows = [];
|
|
68
|
+
for (var i = 0; i < block.rows.length; i++) {
|
|
69
|
+
var row = block.rows[i];
|
|
70
|
+
for (var j = 0; j < row.cells.length; j++) {
|
|
71
|
+
var cell = row.cells[j];
|
|
72
|
+
if (!cell.isSelected) {
|
|
73
|
+
pruneUnselectedModelInternal(cell, isSelectionAfterElement);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
isSelectionAfterElement = true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
var newCells = [];
|
|
80
|
+
for (var k = 0; k < row.cells.length; k++) {
|
|
81
|
+
var cell = row.cells[k];
|
|
82
|
+
if (cell.isSelected || cell.blocks.length > 0) {
|
|
83
|
+
newCells.push(cell);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
row.cells = newCells;
|
|
87
|
+
if (row.cells.length > 0) {
|
|
88
|
+
filteredRows.push(row);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (!isSelectionAfterElement &&
|
|
92
|
+
filteredRows.length == 1 &&
|
|
93
|
+
filteredRows[0].cells.length == 1 &&
|
|
94
|
+
!filteredRows[0].cells[0].isSelected) {
|
|
95
|
+
var cell = filteredRows[0].cells[0];
|
|
96
|
+
(_b = model.blocks).splice.apply(_b, (0, tslib_1.__spreadArray)([index, 1], (0, tslib_1.__read)(cell.blocks), false));
|
|
97
|
+
}
|
|
98
|
+
else if (filteredRows.length == 0) {
|
|
99
|
+
model.blocks.splice(index, 1);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
block.rows = filteredRows;
|
|
103
|
+
}
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return isSelectionAfterElement;
|
|
108
|
+
}
|
|
109
|
+
function unwrap(model) {
|
|
110
|
+
var block = model.blocks[0];
|
|
111
|
+
if (model.blocks.length == 1) {
|
|
112
|
+
while (block.blockType == 'BlockGroup') {
|
|
113
|
+
model.blocks = block.blocks;
|
|
114
|
+
block = model.blocks[0];
|
|
115
|
+
if (model.blocks.length > 1) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (block.blockType == 'Paragraph') {
|
|
120
|
+
block.isImplicit = true;
|
|
121
|
+
block.format = {};
|
|
122
|
+
inheritSegmentFormatToChildren(block);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function inheritSegmentFormatToChildren(parent) {
|
|
127
|
+
var value = parent.segmentFormat;
|
|
128
|
+
if (value !== undefined) {
|
|
129
|
+
for (var index = 0; index < parent.segments.length; index++) {
|
|
130
|
+
var segment = parent.segments[index];
|
|
131
|
+
segment.format = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, parent.segmentFormat), segment.format);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=pruneUnselectedModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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 if (segment.segmentType == 'General') {\n pruneUnselectedModel(segment);\n if (segment.blocks.length > 0 || segment.isSelected) {\n newSegments.push(segment);\n }\n } else if (segment.isSelected && segment.segmentType != 'SelectionMarker') {\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"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ContentModelDocument, DOMSelection } from 'roosterjs-content-model-types';
|
|
2
|
+
/**
|
|
3
|
+
* Remove the unselected content from the model
|
|
4
|
+
* @param model the model document
|
|
5
|
+
* @param selection The editor selection
|
|
6
|
+
* */
|
|
7
|
+
export declare function trimModelForSelection(model: ContentModelDocument, selection: DOMSelection): void;
|