roosterjs-content-model-dom 9.45.1 → 9.45.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/lib/domToModel/processors/formatContainerProcessor.d.ts +4 -0
  2. package/lib/domToModel/processors/formatContainerProcessor.js +13 -3
  3. package/lib/domToModel/processors/formatContainerProcessor.js.map +1 -1
  4. package/lib/domToModel/processors/knownElementProcessor.js +11 -5
  5. package/lib/domToModel/processors/knownElementProcessor.js.map +1 -1
  6. package/lib/domToModel/processors/textProcessor.js +1 -1
  7. package/lib/domToModel/processors/textProcessor.js.map +1 -1
  8. package/lib/modelApi/editing/applyTableFormat.js +4 -1
  9. package/lib/modelApi/editing/applyTableFormat.js.map +1 -1
  10. package/lib/modelApi/editing/setTableCellBackgroundColor.js +22 -23
  11. package/lib/modelApi/editing/setTableCellBackgroundColor.js.map +1 -1
  12. package/lib-amd/domToModel/processors/formatContainerProcessor.d.ts +4 -0
  13. package/lib-amd/domToModel/processors/formatContainerProcessor.js +13 -3
  14. package/lib-amd/domToModel/processors/formatContainerProcessor.js.map +1 -1
  15. package/lib-amd/domToModel/processors/knownElementProcessor.js +11 -5
  16. package/lib-amd/domToModel/processors/knownElementProcessor.js.map +1 -1
  17. package/lib-amd/domToModel/processors/textProcessor.js +1 -1
  18. package/lib-amd/domToModel/processors/textProcessor.js.map +1 -1
  19. package/lib-amd/modelApi/editing/applyTableFormat.js +4 -1
  20. package/lib-amd/modelApi/editing/applyTableFormat.js.map +1 -1
  21. package/lib-amd/modelApi/editing/setTableCellBackgroundColor.js +22 -23
  22. package/lib-amd/modelApi/editing/setTableCellBackgroundColor.js.map +1 -1
  23. package/lib-mjs/domToModel/processors/formatContainerProcessor.d.ts +4 -0
  24. package/lib-mjs/domToModel/processors/formatContainerProcessor.js +10 -1
  25. package/lib-mjs/domToModel/processors/formatContainerProcessor.js.map +1 -1
  26. package/lib-mjs/domToModel/processors/knownElementProcessor.js +11 -5
  27. package/lib-mjs/domToModel/processors/knownElementProcessor.js.map +1 -1
  28. package/lib-mjs/domToModel/processors/textProcessor.js +1 -1
  29. package/lib-mjs/domToModel/processors/textProcessor.js.map +1 -1
  30. package/lib-mjs/modelApi/editing/applyTableFormat.js +4 -1
  31. package/lib-mjs/modelApi/editing/applyTableFormat.js.map +1 -1
  32. package/lib-mjs/modelApi/editing/setTableCellBackgroundColor.js +22 -23
  33. package/lib-mjs/modelApi/editing/setTableCellBackgroundColor.js.map +1 -1
  34. 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;AAUnD;;GAEG;AACU,QAAA,aAAa,GAA6C;IACnE,YAAY;IACZ,aAAa;IACb,aAAa;IACb,cAAc;CACjB,CAAC;AAEF;;;;;;;GAOG;AACI,IAAM,wBAAwB,GAAkC,UACnE,KAAK,EACL,OAAO,EACP,OAAO;IAEP,IAAA,yBAAW,EAAC,OAAO,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE;QACjF,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAChF,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAE3F,IAAM,MAAM,6BACL,OAAO,CAAC,WAAW,CACzB,CAAC;QAEF,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAEvE,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;QACxF,IAAM,eAAe,GAAG,IAAA,6CAAqB,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAE/D,0FAA0F;QAC1F,kEAAkE;QAClE,mFAAmF;QACnF,qBAAa,CAAC,OAAO,CAAC,UAAA,KAAK;YACvB,OAAO,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAEnE,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACjE,eAAe,CAAC,YAAY,GAAG,IAAI,CAAC;SACvC;QAED,IAAI,yBAAyB,CAAC,eAAe,CAAC,EAAE;YAC5C,oGAAoG;YACpG,qCAAqC;YACrC,IAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAA0B,CAAC;YAErE,IAAI,eAAe,CAAC,YAAY,EAAE;gBAC9B,SAAS,CAAC,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,aAAa,EAAE;oBACjE,QAAQ,EAAE,GAAG;iBAChB,CAAC,CAAC;aACN;YAED,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;YACxD,IAAA,iDAAuB,EAAC,SAAS,CAAC,CAAC;YACnC,IAAA,mBAAQ,EAAC,KAAK,EAAE,SAAS,CAAC,CAAC;SAC9B;aAAM;YACH,IAAA,mBAAQ,EAAC,KAAK,EAAE,eAAe,CAAC,CAAC;SACpC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,mBAAQ,EAAC,KAAK,EAAE,IAAA,iCAAe,EAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;AAC/E,CAAC,CAAC;AApDW,QAAA,wBAAwB,4BAoDnC;AAEF,SAAS,yBAAyB,CAAC,eAA4C;IAC3E,IAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAE7C,OAAO,CACH,eAAe,CAAC,OAAO,IAAI,KAAK;QAChC,eAAe,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC;QAClC,UAAU,CAAC,SAAS,IAAI,WAAW;QACnC,UAAU,CAAC,UAAU,CACxB,CAAC;AACN,CAAC","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 ContentModelFormatContainer,\n ContentModelFormatContainerFormat,\n ContentModelParagraph,\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 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)) {\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"]}
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
- if ((isBlock || element.style.display == 'inline-block') && // For inline-block here, we will also check if it should be represented as Format Container
40
- shouldUseFormatContainer(element, context)) {
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":"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","sourcesContent":["import { addBlock } from '../../modelApi/common/addBlock';\nimport { blockProcessor } from './blockProcessor';\nimport { createParagraph } from '../../modelApi/creators/createParagraph';\nimport { formatContainerProcessor } from './formatContainerProcessor';\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 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\n if (\n (isBlock || element.style.display == 'inline-block') && // For inline-block here, we will also check if it should be represented as Format Container\n shouldUseFormatContainer(element, context)\n ) {\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 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 FormatContainerTriggerAttributes.some(attr => element.hasAttribute(attr))\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"]}
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,4DAA2D;AAC3D,0DAAyD;AACzD,0DAAoE;AACpE,oDAAmD;AACnD,oDAAmD;AACnD,uEAGoC;AAOpC,IAAM,4BAA4B,GAAkC;IAChE,cAAc;IACd,WAAW;IACX,eAAe;IACf,YAAY;IACZ,aAAa;IACb,cAAc;IACd,gBAAgB;IAChB,mBAAmB;IACnB,iBAAiB;IACjB,kBAAkB;IAClB,OAAO;IACP,QAAQ;IACR,UAAU;IACV,WAAW;IACX,UAAU;IACV,WAAW;CACd,CAAC;AACF,IAAM,gCAAgC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChD,IAAM,yBAAyB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACjF,IAAM,oBAAoB,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAE3C;;GAEG;AACI,IAAM,qBAAqB,GAAkC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;IACxF,IAAM,OAAO,GAAG,IAAA,+BAAc,EAAC,OAAO,CAAC,CAAC;IACxC,IAAM,gBAAgB,GAAG,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,cAAc,CAAC;IAE5E,IACI,gBAAgB,IAAI,4FAA4F;QAChH,6BAA6B,CAAC,OAAO,EAAE,OAAO,CAAC,EACjD;QACE,IAAA,wDAA6B,EAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;KAC1D;SAAM,IAAI,gBAAgB,IAAI,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE;QACvE,IAAA,mDAAwB,EAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;KACrD;SAAM,IAAI,IAAA,oCAAsB,EAAC,OAAO,CAAC,EAAE;QACxC,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;KAC5D;SAAM,IAAI,OAAO,EAAE;QAChB,IAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;QACtF,IAAM,kBAAkB,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE9E,IAAA,yBAAW,EAAC,OAAO,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE;YACjF,IAAM,aAAa,GAA8B,EAAE,CAAC;YAEpD,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;YACnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YAEpD,IAAA,+BAAc,EAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,IAAI,OAAO,IAAI,CAAC,kBAAkB,EAAE;YAChC,IAAA,mBAAQ,EACJ,KAAK,EACL,IAAA,iCAAe,EACX,IAAI,CAAC,cAAc,EACnB,OAAO,CAAC,WAAW,EACnB,SAAS,CAAC,iBAAiB,EAC3B,SAAS,CACZ,CACJ,CAAC;SACL;KACJ;SAAM;QACH,IAAA,yBAAW,EACP,OAAO,EACP;YACI,OAAO,EAAE,cAAc;YACvB,SAAS,EAAE,cAAc;YACzB,IAAI,EAAE,aAAa;SACtB,EACD;YACI,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YAEpF,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,IAAI,GAAG,EAAE;gBACpD,IAAA,yBAAW,EACP,OAAO,EACP,OAAO,CAAC,aAAa,CAAC,gBAAgB,EACtC,OAAO,CAAC,IAAI,CAAC,MAAM,EACnB,OAAO,CACV,CAAC;aACL;YAED,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7D,CAAC,CACJ,CAAC;KACL;AACL,CAAC,CAAC;AA7DW,QAAA,qBAAqB,yBA6DhC;AAEF,SAAS,6BAA6B,CAAC,OAAoB,EAAE,OAA0B;IACnF,OAAO,gCAAgC,CAAC,IAAI,CAAC,UAAA,IAAI,IAAI,OAAA,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,EAA1B,CAA0B,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAoB,EAAE,OAA0B;IAC9E,oFAAoF;IACpF,IAAI,yBAAyB,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACzD,OAAO,KAAK,CAAC;KAChB;IAED,IAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,IAAM,YAAY,GAAG,IAAA,iCAAe,EAAC,OAAO,CAAC,CAAC;IAE9C,IAAM,OAAO,GAAG,KAAK,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAE3D,qEAAqE;IACrE,IAAI,OAAO,IAAI,OAAO,IAAI,aAAa,EAAE;QACrC,OAAO,IAAI,CAAC;KACf;IAED,sFAAsF;IACtF,kCAAkC;IAClC,IACI,4BAA4B,CAAC,IAAI,CAC7B,UAAA,GAAG,IAAI,OAAA,QAAQ,CAAE,KAAK,CAAC,GAAG,CAAY,IAAK,YAAY,CAAC,GAAG,CAAY,IAAI,EAAE,CAAC,GAAG,CAAC,EAA3E,CAA2E,CACrF,EACH;QACE,OAAO,IAAI,CAAC;KACf;IAED,2EAA2E;IAC3E,IAAI,KAAK,CAAC,UAAU,IAAI,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,MAAM,EAAE;QAC3D,OAAO,IAAI,CAAC;KACf;IAED,sEAAsE;IACtE,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;QAC/B,OAAO,IAAI,CAAC;KACf;IAED,OAAO,KAAK,CAAC;AACjB,CAAC","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"]}
@@ -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;gBACjD,qBAAqB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;QACP,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 internalTextProcessor(group, textNode, context);\n });\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"]}
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"]}
@@ -223,9 +223,12 @@ function setFirstColumnFormatBorders(rows, format) {
223
223
  (0, mutate_1.mutateSegment)(block, segment, function (cellSegment) {
224
224
  if (format.hasFirstColumn) {
225
225
  cellSegment.format.fontWeight = 'bold';
226
+ cell.format.fontWeight = 'bold';
226
227
  }
227
- else if (cellSegment.format.fontWeight == 'bold') {
228
+ else if (cellSegment.format.fontWeight == 'bold' &&
229
+ cell.format.fontWeight == 'bold') {
228
230
  delete cellSegment.format.fontWeight;
231
+ delete cell.format.fontWeight;
229
232
  }
230
233
  });
231
234
  }
@@ -1 +1 @@
1
- {"version":3,"file":"applyTableFormat.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/applyTableFormat.ts"],"names":[],"mappings":"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","sourcesContent":["import { BorderKeys } from '../../formatHandlers/utils/borderKeys';\nimport { combineBorderValue, extractBorderValues } from '../../domUtils/style/borderValues';\nimport { mutateBlock, mutateSegment } from '../common/mutate';\nimport { setTableCellBackgroundColor } from './setTableCellBackgroundColor';\nimport { TableBorderFormat } from '../../constants/TableBorderFormat';\nimport { updateTableCellMetadata } from '../metadata/updateTableCellMetadata';\nimport { updateTableMetadata } from '../metadata/updateTableMetadata';\nimport type {\n BorderFormat,\n ReadonlyContentModelTable,\n ShallowMutableContentModelTableRow,\n TableMetadataFormat,\n} from 'roosterjs-content-model-types';\n\nconst DEFAULT_FORMAT: Required<TableMetadataFormat> = {\n topBorderColor: '#ABABAB',\n bottomBorderColor: '#ABABAB',\n verticalBorderColor: '#ABABAB',\n hasHeaderRow: false,\n hasFirstColumn: false,\n hasBandedRows: false,\n hasBandedColumns: false,\n bgColorEven: null,\n bgColorOdd: '#ABABAB20',\n headerRowColor: '#ABABAB',\n tableBorderFormat: TableBorderFormat.Default,\n verticalAlign: null,\n};\n\ntype MetaOverrides = {\n bgColorOverrides: boolean[][];\n vAlignOverrides: boolean[][];\n borderOverrides: boolean[][];\n};\n\n/**\n * Apply table format from table metadata and the passed in new format\n * @param table The table to apply format to\n * @param newFormat @optional New format to apply. When passed, this value will be merged into existing metadata format and default format\n * @param keepCellShade @optional When pass true, table cells with customized shade color will not be overwritten. @default false\n */\nexport function applyTableFormat(\n table: ReadonlyContentModelTable,\n newFormat?: TableMetadataFormat,\n keepCellShade?: boolean\n) {\n const mutableTable = mutateBlock(table);\n const { rows } = mutableTable;\n\n updateTableMetadata(mutableTable, format => {\n const effectiveMetadata = {\n ...DEFAULT_FORMAT,\n ...format,\n ...newFormat,\n };\n\n const metaOverrides: MetaOverrides = updateOverrides(rows, !keepCellShade);\n\n formatCells(rows, effectiveMetadata, metaOverrides);\n setFirstColumnFormatBorders(rows, effectiveMetadata);\n setHeaderRowFormat(rows, effectiveMetadata, metaOverrides);\n\n return effectiveMetadata;\n });\n}\n\nfunction updateOverrides(\n rows: ShallowMutableContentModelTableRow[],\n removeCellShade: boolean\n): MetaOverrides {\n const overrides: MetaOverrides = {\n bgColorOverrides: [],\n vAlignOverrides: [],\n borderOverrides: [],\n };\n\n rows.forEach(row => {\n const bgColorOverrides: boolean[] = [];\n const vAlignOverrides: boolean[] = [];\n const borderOverrides: boolean[] = [];\n\n overrides.bgColorOverrides.push(bgColorOverrides);\n overrides.vAlignOverrides.push(vAlignOverrides);\n overrides.borderOverrides.push(borderOverrides);\n\n row.cells.forEach(cell => {\n updateTableCellMetadata(mutateBlock(cell), metadata => {\n if (metadata && removeCellShade) {\n bgColorOverrides.push(false);\n delete metadata.bgColorOverride;\n } else {\n bgColorOverrides.push(!!metadata?.bgColorOverride);\n }\n vAlignOverrides.push(!!metadata?.vAlignOverride);\n borderOverrides.push(!!metadata?.borderOverride);\n\n return metadata;\n });\n });\n });\n\n return overrides;\n}\n\ntype ShouldUseTransparentBorder = (indexProp: {\n firstRow: boolean;\n lastRow: boolean;\n firstColumn: boolean;\n lastColumn: boolean;\n}) => [boolean, boolean, boolean, boolean];\n\nconst BorderFormatters: Record<number, ShouldUseTransparentBorder | undefined> = {\n [TableBorderFormat.Default]: _ => [false, false, false, false],\n [TableBorderFormat.ListWithSideBorders]: ({ lastColumn, firstColumn }) => [\n false,\n !lastColumn,\n false,\n !firstColumn,\n ],\n [TableBorderFormat.FirstColumnHeaderExternal]: ({\n firstColumn,\n firstRow,\n lastColumn,\n lastRow,\n }) => [\n !firstRow,\n (!lastColumn && !firstColumn) || (firstColumn && firstRow),\n !lastRow && !firstRow,\n !firstColumn,\n ],\n [TableBorderFormat.NoHeaderBorders]: ({ firstRow, firstColumn, lastColumn }) => [\n firstRow,\n firstRow || lastColumn,\n false,\n firstRow || firstColumn,\n ],\n [TableBorderFormat.NoSideBorders]: ({ firstColumn, lastColumn }) => [\n false,\n lastColumn,\n false,\n firstColumn,\n ],\n [TableBorderFormat.EspecialType1]: ({ firstRow, firstColumn }) => [\n firstColumn && !firstRow,\n firstRow,\n firstColumn && !firstRow,\n firstRow && !firstColumn,\n ],\n [TableBorderFormat.EspecialType2]: ({ firstRow, firstColumn }) => [\n !firstRow,\n firstRow || !firstColumn,\n !firstRow,\n !firstColumn,\n ],\n [TableBorderFormat.EspecialType3]: ({ firstColumn, firstRow }) => [\n true,\n firstRow || !firstColumn,\n !firstRow,\n true,\n ],\n [TableBorderFormat.Clear]: () => [true, true, true, true],\n};\n\n/*\n * Apply vertical align, borders, and background color to all cells in the table\n */\nfunction formatCells(\n rows: ShallowMutableContentModelTableRow[],\n format: TableMetadataFormat,\n metaOverrides: MetaOverrides\n) {\n const { hasBandedRows, hasBandedColumns, bgColorOdd, bgColorEven, hasFirstColumn } = format;\n\n rows.forEach((row, rowIndex) => {\n row.cells.forEach((readonlyCell, colIndex) => {\n const cell = mutateBlock(readonlyCell);\n\n // Format Borders\n if (\n !metaOverrides.borderOverrides[rowIndex][colIndex] &&\n typeof format.tableBorderFormat == 'number'\n ) {\n const transparentBorderMatrix = BorderFormatters[format.tableBorderFormat]?.({\n firstRow: rowIndex === 0,\n lastRow: rowIndex === rows.length - 1,\n firstColumn: colIndex === 0,\n lastColumn: colIndex === row.cells.length - 1,\n });\n\n const formatColor = [\n format.topBorderColor,\n format.verticalBorderColor,\n format.bottomBorderColor,\n format.verticalBorderColor,\n ];\n\n transparentBorderMatrix?.forEach((alwaysUseTransparent, i) => {\n const borderColor = (!alwaysUseTransparent && formatColor[i]) || '';\n\n cell.format[BorderKeys[i]] = combineBorderValue({\n style: getBorderStyleFromColor(borderColor),\n width: '1px',\n color: borderColor,\n });\n });\n }\n\n // Format Background Color\n if (!metaOverrides.bgColorOverrides[rowIndex][colIndex]) {\n let color: string | null | undefined;\n if (hasFirstColumn && colIndex == 0 && rowIndex > 0) {\n color = null;\n } else {\n color =\n hasBandedRows || hasBandedColumns\n ? (hasBandedColumns && colIndex % 2 != 0) ||\n (hasBandedRows && rowIndex % 2 != 0)\n ? bgColorOdd\n : bgColorEven\n : bgColorEven; /* bgColorEven is the default color */\n }\n setTableCellBackgroundColor(\n cell,\n color,\n false /*isColorOverride*/,\n true /*applyToSegments*/\n );\n }\n\n // Format Vertical Align\n if (format.verticalAlign && !metaOverrides.vAlignOverrides[rowIndex][colIndex]) {\n cell.format.verticalAlign = format.verticalAlign;\n }\n\n // Format Header\n cell.isHeader = false;\n });\n });\n}\n\n/**\n * Set the first column format borders for the table as well as header property\n * @param rows The rows of the table\n * @param format The table metadata format\n */\nexport function setFirstColumnFormatBorders(\n rows: ShallowMutableContentModelTableRow[],\n format: Partial<TableMetadataFormat>\n) {\n rows.forEach((row, rowIndex) => {\n row.cells.forEach((readonlyCell, cellIndex) => {\n const cell = mutateBlock(readonlyCell);\n\n if (cellIndex === 0) {\n if (rowIndex == 0) {\n cell.isHeader = !!format.hasHeaderRow;\n }\n for (const block of cell.blocks) {\n if (block.blockType == 'Paragraph') {\n for (const segment of block.segments) {\n mutateSegment(block, segment, cellSegment => {\n if (format.hasFirstColumn) {\n cellSegment.format.fontWeight = 'bold';\n } else if (cellSegment.format.fontWeight == 'bold') {\n delete cellSegment.format.fontWeight;\n }\n });\n }\n }\n }\n }\n });\n });\n}\n\nfunction setHeaderRowFormat(\n rows: ShallowMutableContentModelTableRow[],\n format: TableMetadataFormat,\n metaOverrides: MetaOverrides\n) {\n // Exit early if hasHeaderRow is not set\n if (!format.hasHeaderRow) {\n return;\n }\n\n const rowIndex = 0;\n\n rows[rowIndex]?.cells.forEach((readonlyCell, cellIndex) => {\n const cell = mutateBlock(readonlyCell);\n\n cell.isHeader = true;\n cell.format.fontWeight = 'bold';\n\n if (format.headerRowColor) {\n if (!metaOverrides.bgColorOverrides[rowIndex][cellIndex]) {\n setTableCellBackgroundColor(\n cell,\n format.headerRowColor,\n false /*isColorOverride*/,\n true /*applyToSegments*/\n );\n }\n\n setBorderColor(cell.format, 'borderTop', format.headerRowColor);\n setBorderColor(cell.format, 'borderRight', format.headerRowColor);\n setBorderColor(cell.format, 'borderLeft', format.headerRowColor);\n }\n });\n}\n\n/**\n * @param format The cell format to set the border color\n * @param key The border key to set the color\n * @param value The color to set. If not given, it removes the color and sets the style to transparent\n */\nfunction setBorderColor(format: BorderFormat, key: keyof BorderFormat, value?: string) {\n const border = extractBorderValues(format[key]);\n border.color = value || '';\n border.style = getBorderStyleFromColor(border.color);\n format[key] = combineBorderValue(border);\n}\n\nfunction getBorderStyleFromColor(color?: string): string {\n return !color || color == 'transparent' ? 'none' : 'solid';\n}\n"]}
1
+ {"version":3,"file":"applyTableFormat.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/applyTableFormat.ts"],"names":[],"mappings":"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","sourcesContent":["import { BorderKeys } from '../../formatHandlers/utils/borderKeys';\nimport { combineBorderValue, extractBorderValues } from '../../domUtils/style/borderValues';\nimport { mutateBlock, mutateSegment } from '../common/mutate';\nimport { setTableCellBackgroundColor } from './setTableCellBackgroundColor';\nimport { TableBorderFormat } from '../../constants/TableBorderFormat';\nimport { updateTableCellMetadata } from '../metadata/updateTableCellMetadata';\nimport { updateTableMetadata } from '../metadata/updateTableMetadata';\nimport type {\n BorderFormat,\n ReadonlyContentModelTable,\n ShallowMutableContentModelTableRow,\n TableMetadataFormat,\n} from 'roosterjs-content-model-types';\n\nconst DEFAULT_FORMAT: Required<TableMetadataFormat> = {\n topBorderColor: '#ABABAB',\n bottomBorderColor: '#ABABAB',\n verticalBorderColor: '#ABABAB',\n hasHeaderRow: false,\n hasFirstColumn: false,\n hasBandedRows: false,\n hasBandedColumns: false,\n bgColorEven: null,\n bgColorOdd: '#ABABAB20',\n headerRowColor: '#ABABAB',\n tableBorderFormat: TableBorderFormat.Default,\n verticalAlign: null,\n};\n\ntype MetaOverrides = {\n bgColorOverrides: boolean[][];\n vAlignOverrides: boolean[][];\n borderOverrides: boolean[][];\n};\n\n/**\n * Apply table format from table metadata and the passed in new format\n * @param table The table to apply format to\n * @param newFormat @optional New format to apply. When passed, this value will be merged into existing metadata format and default format\n * @param keepCellShade @optional When pass true, table cells with customized shade color will not be overwritten. @default false\n */\nexport function applyTableFormat(\n table: ReadonlyContentModelTable,\n newFormat?: TableMetadataFormat,\n keepCellShade?: boolean\n) {\n const mutableTable = mutateBlock(table);\n const { rows } = mutableTable;\n\n updateTableMetadata(mutableTable, format => {\n const effectiveMetadata = {\n ...DEFAULT_FORMAT,\n ...format,\n ...newFormat,\n };\n\n const metaOverrides: MetaOverrides = updateOverrides(rows, !keepCellShade);\n\n formatCells(rows, effectiveMetadata, metaOverrides);\n setFirstColumnFormatBorders(rows, effectiveMetadata);\n setHeaderRowFormat(rows, effectiveMetadata, metaOverrides);\n\n return effectiveMetadata;\n });\n}\n\nfunction updateOverrides(\n rows: ShallowMutableContentModelTableRow[],\n removeCellShade: boolean\n): MetaOverrides {\n const overrides: MetaOverrides = {\n bgColorOverrides: [],\n vAlignOverrides: [],\n borderOverrides: [],\n };\n\n rows.forEach(row => {\n const bgColorOverrides: boolean[] = [];\n const vAlignOverrides: boolean[] = [];\n const borderOverrides: boolean[] = [];\n\n overrides.bgColorOverrides.push(bgColorOverrides);\n overrides.vAlignOverrides.push(vAlignOverrides);\n overrides.borderOverrides.push(borderOverrides);\n\n row.cells.forEach(cell => {\n updateTableCellMetadata(mutateBlock(cell), metadata => {\n if (metadata && removeCellShade) {\n bgColorOverrides.push(false);\n delete metadata.bgColorOverride;\n } else {\n bgColorOverrides.push(!!metadata?.bgColorOverride);\n }\n vAlignOverrides.push(!!metadata?.vAlignOverride);\n borderOverrides.push(!!metadata?.borderOverride);\n\n return metadata;\n });\n });\n });\n\n return overrides;\n}\n\ntype ShouldUseTransparentBorder = (indexProp: {\n firstRow: boolean;\n lastRow: boolean;\n firstColumn: boolean;\n lastColumn: boolean;\n}) => [boolean, boolean, boolean, boolean];\n\nconst BorderFormatters: Record<number, ShouldUseTransparentBorder | undefined> = {\n [TableBorderFormat.Default]: _ => [false, false, false, false],\n [TableBorderFormat.ListWithSideBorders]: ({ lastColumn, firstColumn }) => [\n false,\n !lastColumn,\n false,\n !firstColumn,\n ],\n [TableBorderFormat.FirstColumnHeaderExternal]: ({\n firstColumn,\n firstRow,\n lastColumn,\n lastRow,\n }) => [\n !firstRow,\n (!lastColumn && !firstColumn) || (firstColumn && firstRow),\n !lastRow && !firstRow,\n !firstColumn,\n ],\n [TableBorderFormat.NoHeaderBorders]: ({ firstRow, firstColumn, lastColumn }) => [\n firstRow,\n firstRow || lastColumn,\n false,\n firstRow || firstColumn,\n ],\n [TableBorderFormat.NoSideBorders]: ({ firstColumn, lastColumn }) => [\n false,\n lastColumn,\n false,\n firstColumn,\n ],\n [TableBorderFormat.EspecialType1]: ({ firstRow, firstColumn }) => [\n firstColumn && !firstRow,\n firstRow,\n firstColumn && !firstRow,\n firstRow && !firstColumn,\n ],\n [TableBorderFormat.EspecialType2]: ({ firstRow, firstColumn }) => [\n !firstRow,\n firstRow || !firstColumn,\n !firstRow,\n !firstColumn,\n ],\n [TableBorderFormat.EspecialType3]: ({ firstColumn, firstRow }) => [\n true,\n firstRow || !firstColumn,\n !firstRow,\n true,\n ],\n [TableBorderFormat.Clear]: () => [true, true, true, true],\n};\n\n/*\n * Apply vertical align, borders, and background color to all cells in the table\n */\nfunction formatCells(\n rows: ShallowMutableContentModelTableRow[],\n format: TableMetadataFormat,\n metaOverrides: MetaOverrides\n) {\n const { hasBandedRows, hasBandedColumns, bgColorOdd, bgColorEven, hasFirstColumn } = format;\n\n rows.forEach((row, rowIndex) => {\n row.cells.forEach((readonlyCell, colIndex) => {\n const cell = mutateBlock(readonlyCell);\n\n // Format Borders\n if (\n !metaOverrides.borderOverrides[rowIndex][colIndex] &&\n typeof format.tableBorderFormat == 'number'\n ) {\n const transparentBorderMatrix = BorderFormatters[format.tableBorderFormat]?.({\n firstRow: rowIndex === 0,\n lastRow: rowIndex === rows.length - 1,\n firstColumn: colIndex === 0,\n lastColumn: colIndex === row.cells.length - 1,\n });\n\n const formatColor = [\n format.topBorderColor,\n format.verticalBorderColor,\n format.bottomBorderColor,\n format.verticalBorderColor,\n ];\n\n transparentBorderMatrix?.forEach((alwaysUseTransparent, i) => {\n const borderColor = (!alwaysUseTransparent && formatColor[i]) || '';\n\n cell.format[BorderKeys[i]] = combineBorderValue({\n style: getBorderStyleFromColor(borderColor),\n width: '1px',\n color: borderColor,\n });\n });\n }\n\n // Format Background Color\n if (!metaOverrides.bgColorOverrides[rowIndex][colIndex]) {\n let color: string | null | undefined;\n if (hasFirstColumn && colIndex == 0 && rowIndex > 0) {\n color = null;\n } else {\n color =\n hasBandedRows || hasBandedColumns\n ? (hasBandedColumns && colIndex % 2 != 0) ||\n (hasBandedRows && rowIndex % 2 != 0)\n ? bgColorOdd\n : bgColorEven\n : bgColorEven; /* bgColorEven is the default color */\n }\n setTableCellBackgroundColor(\n cell,\n color,\n false /*isColorOverride*/,\n true /*applyToSegments*/\n );\n }\n\n // Format Vertical Align\n if (format.verticalAlign && !metaOverrides.vAlignOverrides[rowIndex][colIndex]) {\n cell.format.verticalAlign = format.verticalAlign;\n }\n\n // Format Header\n cell.isHeader = false;\n });\n });\n}\n\n/**\n * Set the first column format borders for the table as well as header property\n * @param rows The rows of the table\n * @param format The table metadata format\n */\nexport function setFirstColumnFormatBorders(\n rows: ShallowMutableContentModelTableRow[],\n format: Partial<TableMetadataFormat>\n) {\n rows.forEach((row, rowIndex) => {\n row.cells.forEach((readonlyCell, cellIndex) => {\n const cell = mutateBlock(readonlyCell);\n\n if (cellIndex === 0) {\n if (rowIndex == 0) {\n cell.isHeader = !!format.hasHeaderRow;\n }\n\n for (const block of cell.blocks) {\n if (block.blockType == 'Paragraph') {\n for (const segment of block.segments) {\n mutateSegment(block, segment, cellSegment => {\n if (format.hasFirstColumn) {\n cellSegment.format.fontWeight = 'bold';\n cell.format.fontWeight = 'bold';\n } else if (\n cellSegment.format.fontWeight == 'bold' &&\n cell.format.fontWeight == 'bold'\n ) {\n delete cellSegment.format.fontWeight;\n delete cell.format.fontWeight;\n }\n });\n }\n }\n }\n }\n });\n });\n}\n\nfunction setHeaderRowFormat(\n rows: ShallowMutableContentModelTableRow[],\n format: TableMetadataFormat,\n metaOverrides: MetaOverrides\n) {\n // Exit early if hasHeaderRow is not set\n if (!format.hasHeaderRow) {\n return;\n }\n\n const rowIndex = 0;\n\n rows[rowIndex]?.cells.forEach((readonlyCell, cellIndex) => {\n const cell = mutateBlock(readonlyCell);\n\n cell.isHeader = true;\n cell.format.fontWeight = 'bold';\n\n if (format.headerRowColor) {\n if (!metaOverrides.bgColorOverrides[rowIndex][cellIndex]) {\n setTableCellBackgroundColor(\n cell,\n format.headerRowColor,\n false /*isColorOverride*/,\n true /*applyToSegments*/\n );\n }\n\n setBorderColor(cell.format, 'borderTop', format.headerRowColor);\n setBorderColor(cell.format, 'borderRight', format.headerRowColor);\n setBorderColor(cell.format, 'borderLeft', format.headerRowColor);\n }\n });\n}\n\n/**\n * @param format The cell format to set the border color\n * @param key The border key to set the color\n * @param value The color to set. If not given, it removes the color and sets the style to transparent\n */\nfunction setBorderColor(format: BorderFormat, key: keyof BorderFormat, value?: string) {\n const border = extractBorderValues(format[key]);\n border.color = value || '';\n border.style = getBorderStyleFromColor(border.color);\n format[key] = combineBorderValue(border);\n}\n\nfunction getBorderStyleFromColor(color?: string): string {\n return !color || color == 'transparent' ? 'none' : 'solid';\n}\n"]}
@@ -40,7 +40,7 @@ function setTableCellBackgroundColor(cell, color, isColorOverride, applyToSegmen
40
40
  delete cell.format.textColor;
41
41
  }
42
42
  if (applyToSegments) {
43
- setAdaptiveCellColor(cell);
43
+ setAdaptiveCellColor(cell, color);
44
44
  }
45
45
  }
46
46
  else {
@@ -54,34 +54,38 @@ function setTableCellBackgroundColor(cell, color, isColorOverride, applyToSegmen
54
54
  exports.setTableCellBackgroundColor = setTableCellBackgroundColor;
55
55
  function removeAdaptiveCellColor(cell) {
56
56
  cell.blocks.forEach(function (readonlyBlock) {
57
- var _a, _b;
57
+ var _a;
58
58
  if (readonlyBlock.blockType == 'Paragraph') {
59
59
  var block = (0, mutate_1.mutateBlock)(readonlyBlock);
60
60
  if (((_a = block.segmentFormat) === null || _a === void 0 ? void 0 : _a.textColor) &&
61
- shouldRemoveColor((_b = block.segmentFormat) === null || _b === void 0 ? void 0 : _b.textColor, cell.format.backgroundColor || '')) {
61
+ (areSameColor(block.segmentFormat.textColor, White) ||
62
+ areSameColor(block.segmentFormat.textColor, Black))) {
62
63
  delete block.segmentFormat.textColor;
63
64
  }
64
65
  block.segments.forEach(function (segment) {
65
66
  if (segment.format.textColor &&
66
- shouldRemoveColor(segment.format.textColor, cell.format.backgroundColor || '')) {
67
+ (areSameColor(segment.format.textColor, White) ||
68
+ areSameColor(segment.format.textColor, Black))) {
67
69
  delete segment.format.textColor;
68
70
  }
69
71
  });
70
72
  }
71
73
  });
72
74
  }
73
- function setAdaptiveCellColor(cell) {
75
+ function setAdaptiveCellColor(cell, backgroundColor) {
74
76
  if (cell.format.textColor) {
75
77
  cell.blocks.forEach(function (readonlyBlock) {
76
78
  var _a;
77
79
  if (readonlyBlock.blockType == 'Paragraph') {
78
80
  var block = (0, mutate_1.mutateBlock)(readonlyBlock);
79
- if (!((_a = block.segmentFormat) === null || _a === void 0 ? void 0 : _a.textColor)) {
81
+ if (!((_a = block.segmentFormat) === null || _a === void 0 ? void 0 : _a.textColor) ||
82
+ areSameColor(backgroundColor, block.segmentFormat.textColor)) {
80
83
  block.segmentFormat = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, block.segmentFormat), { textColor: cell.format.textColor });
81
84
  }
82
85
  block.segments.forEach(function (segment) {
83
86
  var _a;
84
- if (!((_a = segment.format) === null || _a === void 0 ? void 0 : _a.textColor)) {
87
+ if (!((_a = segment.format) === null || _a === void 0 ? void 0 : _a.textColor) ||
88
+ areSameColor(backgroundColor, segment.format.textColor)) {
85
89
  segment.format = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, segment.format), { textColor: cell.format.textColor });
86
90
  }
87
91
  });
@@ -89,22 +93,6 @@ function setAdaptiveCellColor(cell) {
89
93
  });
90
94
  }
91
95
  }
92
- /**
93
- * If the cell background color is too dark or too bright, and the text color is white or black, we should remove the text color
94
- * @param textColor the segment or block text color
95
- * @param cellBackgroundColor the cell background color
96
- * @returns
97
- */
98
- function shouldRemoveColor(textColor, cellBackgroundColor) {
99
- var lightness = calculateLightness(cellBackgroundColor);
100
- if (([White, 'rgb(255,255,255)'].indexOf(textColor) > -1 &&
101
- (lightness > BRIGHT_COLORS_LIGHTNESS || cellBackgroundColor == '')) ||
102
- ([Black, 'rgb(0,0,0)'].indexOf(textColor) > -1 &&
103
- (lightness < DARK_COLORS_LIGHTNESS || cellBackgroundColor == ''))) {
104
- return true;
105
- }
106
- return false;
107
- }
108
96
  function calculateLightness(color) {
109
97
  var colorValues = (0, color_1.parseColor)(color);
110
98
  // Use the values of r,g,b to calculate the lightness in the HSl representation
@@ -120,4 +108,15 @@ function calculateLightness(color) {
120
108
  return 255;
121
109
  }
122
110
  }
111
+ /**
112
+ * Check if two colors are the same by comparing their RGB values
113
+ */
114
+ function areSameColor(color1, color2) {
115
+ var rgb1 = (0, color_1.parseColor)(color1);
116
+ var rgb2 = (0, color_1.parseColor)(color2);
117
+ if (rgb1 && rgb2) {
118
+ return rgb1[0] === rgb2[0] && rgb1[1] === rgb2[1] && rgb1[2] === rgb2[2];
119
+ }
120
+ return false;
121
+ }
123
122
  //# sourceMappingURL=setTableCellBackgroundColor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"setTableCellBackgroundColor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/setTableCellBackgroundColor.ts"],"names":[],"mappings":"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","sourcesContent":["import { mutateBlock } from '../common/mutate';\nimport { parseColor } from '../../formatHandlers/utils/color';\nimport { updateTableCellMetadata } from '../metadata/updateTableCellMetadata';\nimport type { ShallowMutableContentModelTableCell } from 'roosterjs-content-model-types';\n\n// Using the HSL (hue, saturation and lightness) representation for RGB color values.\n// If the value of the lightness is less than 20, the color is dark.\n// If the value of the lightness is more than 80, the color is bright\nconst DARK_COLORS_LIGHTNESS = 20;\nconst BRIGHT_COLORS_LIGHTNESS = 80;\nconst White = '#ffffff';\nconst Black = '#000000';\n\n/**\n * Set shade color of table cell\n * @param cell The cell to set shade color to\n * @param color The color to set\n * @param isColorOverride @optional When pass true, it means this shade color is not part of table format, so it can be preserved when apply table format\n * @param applyToSegments @optional When pass true, we will also apply text color from table cell to its child blocks and segments\n */\nexport function setTableCellBackgroundColor(\n cell: ShallowMutableContentModelTableCell,\n color: string | null | undefined,\n isColorOverride?: boolean,\n applyToSegments?: boolean\n) {\n if (color) {\n cell.format.backgroundColor = color;\n\n if (isColorOverride) {\n updateTableCellMetadata(cell, metadata => {\n metadata = metadata || {};\n metadata.bgColorOverride = true;\n return metadata;\n });\n }\n\n const lightness = calculateLightness(color);\n\n if (lightness < DARK_COLORS_LIGHTNESS) {\n cell.format.textColor = White;\n } else if (lightness > BRIGHT_COLORS_LIGHTNESS) {\n cell.format.textColor = Black;\n } else {\n delete cell.format.textColor;\n }\n\n if (applyToSegments) {\n setAdaptiveCellColor(cell);\n }\n } else {\n delete cell.format.backgroundColor;\n delete cell.format.textColor;\n if (applyToSegments) {\n removeAdaptiveCellColor(cell);\n }\n }\n}\n\nfunction removeAdaptiveCellColor(cell: ShallowMutableContentModelTableCell) {\n cell.blocks.forEach(readonlyBlock => {\n if (readonlyBlock.blockType == 'Paragraph') {\n const block = mutateBlock(readonlyBlock);\n\n if (\n block.segmentFormat?.textColor &&\n shouldRemoveColor(block.segmentFormat?.textColor, cell.format.backgroundColor || '')\n ) {\n delete block.segmentFormat.textColor;\n }\n block.segments.forEach(segment => {\n if (\n segment.format.textColor &&\n shouldRemoveColor(segment.format.textColor, cell.format.backgroundColor || '')\n ) {\n delete segment.format.textColor;\n }\n });\n }\n });\n}\n\nfunction setAdaptiveCellColor(cell: ShallowMutableContentModelTableCell) {\n if (cell.format.textColor) {\n cell.blocks.forEach(readonlyBlock => {\n if (readonlyBlock.blockType == 'Paragraph') {\n const block = mutateBlock(readonlyBlock);\n\n if (!block.segmentFormat?.textColor) {\n block.segmentFormat = {\n ...block.segmentFormat,\n textColor: cell.format.textColor,\n };\n }\n block.segments.forEach(segment => {\n if (!segment.format?.textColor) {\n segment.format = {\n ...segment.format,\n textColor: cell.format.textColor,\n };\n }\n });\n }\n });\n }\n}\n\n/**\n * If the cell background color is too dark or too bright, and the text color is white or black, we should remove the text color\n * @param textColor the segment or block text color\n * @param cellBackgroundColor the cell background color\n * @returns\n */\nfunction shouldRemoveColor(textColor: string, cellBackgroundColor: string) {\n const lightness = calculateLightness(cellBackgroundColor);\n if (\n ([White, 'rgb(255,255,255)'].indexOf(textColor) > -1 &&\n (lightness > BRIGHT_COLORS_LIGHTNESS || cellBackgroundColor == '')) ||\n ([Black, 'rgb(0,0,0)'].indexOf(textColor) > -1 &&\n (lightness < DARK_COLORS_LIGHTNESS || cellBackgroundColor == ''))\n ) {\n return true;\n }\n return false;\n}\n\nfunction calculateLightness(color: string) {\n const colorValues = parseColor(color);\n\n // Use the values of r,g,b to calculate the lightness in the HSl representation\n //First calculate the fraction of the light in each color, since in css the value of r,g,b is in the interval of [0,255], we have\n if (colorValues) {\n const red = colorValues[0] / 255;\n const green = colorValues[1] / 255;\n const blue = colorValues[2] / 255;\n\n //Then the lightness in the HSL representation is the average between maximum fraction of r,g,b and the minimum fraction\n return (Math.max(red, green, blue) + Math.min(red, green, blue)) * 50;\n } else {\n return 255;\n }\n}\n"]}
1
+ {"version":3,"file":"setTableCellBackgroundColor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/setTableCellBackgroundColor.ts"],"names":[],"mappings":"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","sourcesContent":["import { mutateBlock } from '../common/mutate';\nimport { parseColor } from '../../formatHandlers/utils/color';\nimport { updateTableCellMetadata } from '../metadata/updateTableCellMetadata';\nimport type { ShallowMutableContentModelTableCell } from 'roosterjs-content-model-types';\n\n// Using the HSL (hue, saturation and lightness) representation for RGB color values.\n// If the value of the lightness is less than 20, the color is dark.\n// If the value of the lightness is more than 80, the color is bright\nconst DARK_COLORS_LIGHTNESS = 20;\nconst BRIGHT_COLORS_LIGHTNESS = 80;\nconst White = '#ffffff';\nconst Black = '#000000';\n\n/**\n * Set shade color of table cell\n * @param cell The cell to set shade color to\n * @param color The color to set\n * @param isColorOverride @optional When pass true, it means this shade color is not part of table format, so it can be preserved when apply table format\n * @param applyToSegments @optional When pass true, we will also apply text color from table cell to its child blocks and segments\n */\nexport function setTableCellBackgroundColor(\n cell: ShallowMutableContentModelTableCell,\n color: string | null | undefined,\n isColorOverride?: boolean,\n applyToSegments?: boolean\n) {\n if (color) {\n cell.format.backgroundColor = color;\n\n if (isColorOverride) {\n updateTableCellMetadata(cell, metadata => {\n metadata = metadata || {};\n metadata.bgColorOverride = true;\n return metadata;\n });\n }\n\n const lightness = calculateLightness(color);\n\n if (lightness < DARK_COLORS_LIGHTNESS) {\n cell.format.textColor = White;\n } else if (lightness > BRIGHT_COLORS_LIGHTNESS) {\n cell.format.textColor = Black;\n } else {\n delete cell.format.textColor;\n }\n\n if (applyToSegments) {\n setAdaptiveCellColor(cell, color);\n }\n } else {\n delete cell.format.backgroundColor;\n delete cell.format.textColor;\n if (applyToSegments) {\n removeAdaptiveCellColor(cell);\n }\n }\n}\n\nfunction removeAdaptiveCellColor(cell: ShallowMutableContentModelTableCell) {\n cell.blocks.forEach(readonlyBlock => {\n if (readonlyBlock.blockType == 'Paragraph') {\n const block = mutateBlock(readonlyBlock);\n\n if (\n block.segmentFormat?.textColor &&\n (areSameColor(block.segmentFormat.textColor, White) ||\n areSameColor(block.segmentFormat.textColor, Black))\n ) {\n delete block.segmentFormat.textColor;\n }\n block.segments.forEach(segment => {\n if (\n segment.format.textColor &&\n (areSameColor(segment.format.textColor, White) ||\n areSameColor(segment.format.textColor, Black))\n ) {\n delete segment.format.textColor;\n }\n });\n }\n });\n}\n\nfunction setAdaptiveCellColor(cell: ShallowMutableContentModelTableCell, backgroundColor: string) {\n if (cell.format.textColor) {\n cell.blocks.forEach(readonlyBlock => {\n if (readonlyBlock.blockType == 'Paragraph') {\n const block = mutateBlock(readonlyBlock);\n\n if (\n !block.segmentFormat?.textColor ||\n areSameColor(backgroundColor, block.segmentFormat.textColor)\n ) {\n block.segmentFormat = {\n ...block.segmentFormat,\n textColor: cell.format.textColor,\n };\n }\n block.segments.forEach(segment => {\n if (\n !segment.format?.textColor ||\n areSameColor(backgroundColor, segment.format.textColor)\n ) {\n segment.format = {\n ...segment.format,\n textColor: cell.format.textColor,\n };\n }\n });\n }\n });\n }\n}\n\nfunction calculateLightness(color: string) {\n const colorValues = parseColor(color);\n\n // Use the values of r,g,b to calculate the lightness in the HSl representation\n //First calculate the fraction of the light in each color, since in css the value of r,g,b is in the interval of [0,255], we have\n if (colorValues) {\n const red = colorValues[0] / 255;\n const green = colorValues[1] / 255;\n const blue = colorValues[2] / 255;\n\n //Then the lightness in the HSL representation is the average between maximum fraction of r,g,b and the minimum fraction\n return (Math.max(red, green, blue) + Math.min(red, green, blue)) * 50;\n } else {\n return 255;\n }\n}\n\n/**\n * Check if two colors are the same by comparing their RGB values\n */\nfunction areSameColor(color1: string, color2: string): boolean {\n const rgb1 = parseColor(color1);\n const rgb2 = parseColor(color2);\n\n if (rgb1 && rgb2) {\n return rgb1[0] === rgb2[0] && rgb1[1] === rgb2[1] && rgb1[2] === rgb2[2];\n }\n return false;\n}\n"]}
@@ -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,7 +1,7 @@
1
1
  define(["require", "exports", "tslib", "../../modelApi/common/addBlock", "../../modelApi/creators/createFormatContainer", "../../modelApi/creators/createParagraph", "../utils/getDefaultStyle", "../utils/parseFormat", "../../modelApi/block/setParagraphNotImplicit", "../utils/stackFormat"], function (require, exports, tslib_1, addBlock_1, createFormatContainer_1, createParagraph_1, getDefaultStyle_1, parseFormat_1, setParagraphNotImplicit_1, stackFormat_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.formatContainerProcessor = exports.ContextStyles = void 0;
4
+ exports.forceFormatContainerProcessor = exports.formatContainerProcessor = exports.ContextStyles = void 0;
5
5
  /**
6
6
  * @internal
7
7
  */
@@ -20,6 +20,17 @@ define(["require", "exports", "tslib", "../../modelApi/common/addBlock", "../../
20
20
  * @param context DOM to Content Model context
21
21
  */
22
22
  var formatContainerProcessor = function (group, element, context) {
23
+ formatContainerProcessorInternal(group, element, context, false /* forceFormatContainer */);
24
+ };
25
+ exports.formatContainerProcessor = formatContainerProcessor;
26
+ /**
27
+ * @internal
28
+ */
29
+ var forceFormatContainerProcessor = function (group, element, context) {
30
+ formatContainerProcessorInternal(group, element, context, true /* forceFormatContainer */);
31
+ };
32
+ exports.forceFormatContainerProcessor = forceFormatContainerProcessor;
33
+ var formatContainerProcessorInternal = function (group, element, context, forceFormatContainer) {
23
34
  (0, stackFormat_1.stackFormat)(context, { segment: 'shallowCloneForBlock', paragraph: 'shallowClone' }, function () {
24
35
  (0, parseFormat_1.parseFormat)(element, context.formatParsers.block, context.blockFormat, context);
25
36
  (0, parseFormat_1.parseFormat)(element, context.formatParsers.segmentOnBlock, context.segmentFormat, context);
@@ -37,7 +48,7 @@ define(["require", "exports", "tslib", "../../modelApi/common/addBlock", "../../
37
48
  if (element.style.fontSize && parseInt(element.style.fontSize) == 0) {
38
49
  formatContainer.zeroFontSize = true;
39
50
  }
40
- if (shouldFallbackToParagraph(formatContainer)) {
51
+ if (shouldFallbackToParagraph(formatContainer) && !forceFormatContainer) {
41
52
  // For DIV container that only has one paragraph child, container style can be merged into paragraph
42
53
  // and no need to have this container
43
54
  var paragraph = formatContainer.blocks[0];
@@ -56,7 +67,6 @@ define(["require", "exports", "tslib", "../../modelApi/common/addBlock", "../../
56
67
  });
57
68
  (0, addBlock_1.addBlock)(group, (0, createParagraph_1.createParagraph)(true /*isImplicit*/, context.blockFormat));
58
69
  };
59
- exports.formatContainerProcessor = formatContainerProcessor;
60
70
  function shouldFallbackToParagraph(formatContainer) {
61
71
  var firstChild = formatContainer.blocks[0];
62
72
  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":";;;;IAgBA;;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,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,IAAI,yBAAyB,CAAC,eAAe,CAAC,EAAE;gBAC5C,oGAAoG;gBACpG,qCAAqC;gBACrC,IAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAA0B,CAAC;gBAErE,IAAI,eAAe,CAAC,YAAY,EAAE;oBAC9B,SAAS,CAAC,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,aAAa,EAAE;wBACjE,QAAQ,EAAE,GAAG;qBAChB,CAAC,CAAC;iBACN;gBAED,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;gBACxD,IAAA,iDAAuB,EAAC,SAAS,CAAC,CAAC;gBACnC,IAAA,mBAAQ,EAAC,KAAK,EAAE,SAAS,CAAC,CAAC;aAC9B;iBAAM;gBACH,IAAA,mBAAQ,EAAC,KAAK,EAAE,eAAe,CAAC,CAAC;aACpC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,mBAAQ,EAAC,KAAK,EAAE,IAAA,iCAAe,EAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC/E,CAAC,CAAC;IApDW,QAAA,wBAAwB,4BAoDnC;IAEF,SAAS,yBAAyB,CAAC,eAA4C;QAC3E,IAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAE7C,OAAO,CACH,eAAe,CAAC,OAAO,IAAI,KAAK;YAChC,eAAe,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC;YAClC,UAAU,CAAC,SAAS,IAAI,WAAW;YACnC,UAAU,CAAC,UAAU,CACxB,CAAC;IACN,CAAC","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 ContentModelFormatContainer,\n ContentModelFormatContainerFormat,\n ContentModelParagraph,\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 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)) {\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"]}
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"]}
@@ -1,4 +1,4 @@
1
- define(["require", "exports", "../../modelApi/common/addBlock", "./blockProcessor", "../../modelApi/creators/createParagraph", "./formatContainerProcessor", "../utils/getDefaultStyle", "../utils/isBlockElement", "../../domUtils/entityUtils", "../utils/parseFormat", "../utils/stackFormat"], function (require, exports, addBlock_1, blockProcessor_1, createParagraph_1, formatContainerProcessor_1, getDefaultStyle_1, isBlockElement_1, entityUtils_1, parseFormat_1, stackFormat_1) {
1
+ define(["require", "exports", "../../modelApi/common/addBlock", "./blockProcessor", "../../modelApi/creators/createParagraph", "../utils/getDefaultStyle", "../utils/isBlockElement", "../../domUtils/entityUtils", "../utils/parseFormat", "../utils/stackFormat", "./formatContainerProcessor"], function (require, exports, addBlock_1, blockProcessor_1, createParagraph_1, getDefaultStyle_1, isBlockElement_1, entityUtils_1, parseFormat_1, stackFormat_1, formatContainerProcessor_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.knownElementProcessor = void 0;
@@ -28,8 +28,12 @@ define(["require", "exports", "../../modelApi/common/addBlock", "./blockProcesso
28
28
  */
29
29
  var knownElementProcessor = function (group, element, context) {
30
30
  var isBlock = (0, isBlockElement_1.isBlockElement)(element);
31
- if ((isBlock || element.style.display == 'inline-block') && // For inline-block here, we will also check if it should be represented as Format Container
32
- shouldUseFormatContainer(element, context)) {
31
+ var isBlockContainer = isBlock || element.style.display == 'inline-block';
32
+ if (isBlockContainer && // For inline-block here, we will also check if it should be represented as Format Container
33
+ shouldForceUseFormatContainer(element, context)) {
34
+ (0, formatContainerProcessor_1.forceFormatContainerProcessor)(group, element, context);
35
+ }
36
+ else if (isBlockContainer && shouldUseFormatContainer(element, context)) {
33
37
  (0, formatContainerProcessor_1.formatContainerProcessor)(group, element, context);
34
38
  }
35
39
  else if ((0, entityUtils_1.isBlockEntityContainer)(element)) {
@@ -63,6 +67,9 @@ define(["require", "exports", "../../modelApi/common/addBlock", "./blockProcesso
63
67
  }
64
68
  };
65
69
  exports.knownElementProcessor = knownElementProcessor;
70
+ function shouldForceUseFormatContainer(element, context) {
71
+ return FormatContainerTriggerAttributes.some(function (attr) { return element.hasAttribute(attr); });
72
+ }
66
73
  function shouldUseFormatContainer(element, context) {
67
74
  // For those tags that we know we should not use format container, just return false
68
75
  if (ByPassFormatContainerTags.indexOf(element.tagName) >= 0) {
@@ -77,8 +84,7 @@ define(["require", "exports", "../../modelApi/common/addBlock", "./blockProcesso
77
84
  }
78
85
  // For block element with positive value of border width or top/bottom margin/padding,
79
86
  // we need to use format container
80
- if (FormatContainerTriggerStyles.some(function (key) { return parseInt(style[key] || defaultStyle[key] || '') > 0; }) ||
81
- FormatContainerTriggerAttributes.some(function (attr) { return element.hasAttribute(attr); })) {
87
+ if (FormatContainerTriggerStyles.some(function (key) { return parseInt(style[key] || defaultStyle[key] || '') > 0; })) {
82
88
  return true;
83
89
  }
84
90
  // For margin left/right with value "auto", we need to use format container