roosterjs-content-model-dom 9.11.2 → 9.12.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.
Files changed (28) hide show
  1. package/lib/formatHandlers/block/htmlAlignFormatHandler.js +9 -6
  2. package/lib/formatHandlers/block/htmlAlignFormatHandler.js.map +1 -1
  3. package/lib/modelApi/editing/deleteExpandedSelection.js +1 -1
  4. package/lib/modelApi/editing/deleteExpandedSelection.js.map +1 -1
  5. package/lib/modelApi/editing/getSegmentTextFormat.d.ts +2 -1
  6. package/lib/modelApi/editing/getSegmentTextFormat.js +12 -8
  7. package/lib/modelApi/editing/getSegmentTextFormat.js.map +1 -1
  8. package/lib/modelApi/editing/mergeModel.js +18 -4
  9. package/lib/modelApi/editing/mergeModel.js.map +1 -1
  10. package/lib-amd/formatHandlers/block/htmlAlignFormatHandler.js +9 -6
  11. package/lib-amd/formatHandlers/block/htmlAlignFormatHandler.js.map +1 -1
  12. package/lib-amd/modelApi/editing/deleteExpandedSelection.js +1 -1
  13. package/lib-amd/modelApi/editing/deleteExpandedSelection.js.map +1 -1
  14. package/lib-amd/modelApi/editing/getSegmentTextFormat.d.ts +2 -1
  15. package/lib-amd/modelApi/editing/getSegmentTextFormat.js +12 -8
  16. package/lib-amd/modelApi/editing/getSegmentTextFormat.js.map +1 -1
  17. package/lib-amd/modelApi/editing/mergeModel.js +18 -4
  18. package/lib-amd/modelApi/editing/mergeModel.js.map +1 -1
  19. package/lib-mjs/formatHandlers/block/htmlAlignFormatHandler.js +9 -6
  20. package/lib-mjs/formatHandlers/block/htmlAlignFormatHandler.js.map +1 -1
  21. package/lib-mjs/modelApi/editing/deleteExpandedSelection.js +1 -1
  22. package/lib-mjs/modelApi/editing/deleteExpandedSelection.js.map +1 -1
  23. package/lib-mjs/modelApi/editing/getSegmentTextFormat.d.ts +2 -1
  24. package/lib-mjs/modelApi/editing/getSegmentTextFormat.js +12 -8
  25. package/lib-mjs/modelApi/editing/getSegmentTextFormat.js.map +1 -1
  26. package/lib-mjs/modelApi/editing/mergeModel.js +18 -4
  27. package/lib-mjs/modelApi/editing/mergeModel.js.map +1 -1
  28. package/package.json +2 -2
@@ -8,12 +8,15 @@ var directionFormatHandler_1 = require("./directionFormatHandler");
8
8
  */
9
9
  exports.htmlAlignFormatHandler = {
10
10
  parse: function (format, element, context, defaultStyle) {
11
- directionFormatHandler_1.directionFormatHandler.parse(format, element, context, defaultStyle);
12
- var htmlAlign = element.getAttribute('align');
13
- if (htmlAlign) {
14
- format.htmlAlign = (0, dir_1.calcAlign)(htmlAlign, format.direction);
15
- delete format.textAlign;
16
- delete context.blockFormat.textAlign;
11
+ // When there is text-align in CSS style on the same element, we should ignore HTML align
12
+ if (!element.style.textAlign) {
13
+ directionFormatHandler_1.directionFormatHandler.parse(format, element, context, defaultStyle);
14
+ var htmlAlign = element.getAttribute('align');
15
+ if (htmlAlign) {
16
+ format.htmlAlign = (0, dir_1.calcAlign)(htmlAlign, format.direction);
17
+ delete format.textAlign;
18
+ delete context.blockFormat.textAlign;
19
+ }
17
20
  }
18
21
  },
19
22
  apply: function (format, element) {
@@ -1 +1 @@
1
- {"version":3,"file":"htmlAlignFormatHandler.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/formatHandlers/block/htmlAlignFormatHandler.ts"],"names":[],"mappings":";;;AAAA,oCAAoD;AACpD,mEAAkE;AAQlE;;GAEG;AACU,QAAA,sBAAsB,GAE/B;IACA,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY;QAC1C,+CAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QAErE,IAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAEhD,IAAI,SAAS,EAAE;YACX,MAAM,CAAC,SAAS,GAAG,IAAA,eAAS,EAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAC1D,OAAO,MAAM,CAAC,SAAS,CAAC;YACxB,OAAO,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC;SACxC;IACL,CAAC;IACD,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO;QACnB,IAAM,GAAG,GAAkB,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAErE,IAAI,MAAM,CAAC,SAAS,EAAE;YAClB,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,eAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;SACnE;IACL,CAAC;CACJ,CAAC","sourcesContent":["import { calcAlign, ResultMap } from '../utils/dir';\nimport { directionFormatHandler } from './directionFormatHandler';\nimport type {\n DirectionFormat,\n HtmlAlignFormat,\n TextAlignFormat,\n} from 'roosterjs-content-model-types';\nimport type { FormatHandler } from '../FormatHandler';\n\n/**\n * @internal\n */\nexport const htmlAlignFormatHandler: FormatHandler<\n DirectionFormat & HtmlAlignFormat & TextAlignFormat\n> = {\n parse: (format, element, context, defaultStyle) => {\n directionFormatHandler.parse(format, element, context, defaultStyle);\n\n const htmlAlign = element.getAttribute('align');\n\n if (htmlAlign) {\n format.htmlAlign = calcAlign(htmlAlign, format.direction);\n delete format.textAlign;\n delete context.blockFormat.textAlign;\n }\n },\n apply: (format, element) => {\n const dir: 'ltr' | 'rtl' = format.direction == 'rtl' ? 'rtl' : 'ltr';\n\n if (format.htmlAlign) {\n element.setAttribute('align', ResultMap[format.htmlAlign][dir]);\n }\n },\n};\n"]}
1
+ {"version":3,"file":"htmlAlignFormatHandler.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/formatHandlers/block/htmlAlignFormatHandler.ts"],"names":[],"mappings":";;;AAAA,oCAAoD;AACpD,mEAAkE;AAQlE;;GAEG;AACU,QAAA,sBAAsB,GAE/B;IACA,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY;QAC1C,yFAAyF;QACzF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE;YAC1B,+CAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;YAErE,IAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAEhD,IAAI,SAAS,EAAE;gBACX,MAAM,CAAC,SAAS,GAAG,IAAA,eAAS,EAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC1D,OAAO,MAAM,CAAC,SAAS,CAAC;gBACxB,OAAO,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC;aACxC;SACJ;IACL,CAAC;IACD,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO;QACnB,IAAM,GAAG,GAAkB,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAErE,IAAI,MAAM,CAAC,SAAS,EAAE;YAClB,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,eAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;SACnE;IACL,CAAC;CACJ,CAAC","sourcesContent":["import { calcAlign, ResultMap } from '../utils/dir';\nimport { directionFormatHandler } from './directionFormatHandler';\nimport type {\n DirectionFormat,\n HtmlAlignFormat,\n TextAlignFormat,\n} from 'roosterjs-content-model-types';\nimport type { FormatHandler } from '../FormatHandler';\n\n/**\n * @internal\n */\nexport const htmlAlignFormatHandler: FormatHandler<\n DirectionFormat & HtmlAlignFormat & TextAlignFormat\n> = {\n parse: (format, element, context, defaultStyle) => {\n // When there is text-align in CSS style on the same element, we should ignore HTML align\n if (!element.style.textAlign) {\n directionFormatHandler.parse(format, element, context, defaultStyle);\n\n const htmlAlign = element.getAttribute('align');\n\n if (htmlAlign) {\n format.htmlAlign = calcAlign(htmlAlign, format.direction);\n delete format.textAlign;\n delete context.blockFormat.textAlign;\n }\n }\n },\n apply: (format, element) => {\n const dir: 'ltr' | 'rtl' = format.direction == 'rtl' ? 'rtl' : 'ltr';\n\n if (format.htmlAlign) {\n element.setAttribute('align', ResultMap[format.htmlAlign][dir]);\n }\n },\n};\n"]}
@@ -41,7 +41,7 @@ function deleteExpandedSelection(model, formatContext) {
41
41
  // so we can put cursor here after delete
42
42
  paragraph = block_1;
43
43
  insertMarkerIndex = indexes[0];
44
- markerFormat = (0, getSegmentTextFormat_1.getSegmentTextFormat)(segments[0]);
44
+ markerFormat = (0, getSegmentTextFormat_1.getSegmentTextFormat)(segments[0], true /*includingBIU*/);
45
45
  context.lastParagraph = paragraph;
46
46
  context.lastTableContext = tableContext;
47
47
  segments.forEach(function (segment, i) {
@@ -1 +1 @@
1
- {"version":3,"file":"deleteExpandedSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/deleteExpandedSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { createBr } from '../creators/createBr';\nimport { createParagraph } from '../creators/createParagraph';\nimport { createSelectionMarker } from '../creators/createSelectionMarker';\nimport { deleteBlock } from './deleteBlock';\nimport { deleteSegment } from './deleteSegment';\nimport { getSegmentTextFormat } from './getSegmentTextFormat';\nimport { iterateSelections } from '../selection/iterateSelections';\nimport { mutateBlock, mutateSegments } from '../common/mutate';\nimport { setParagraphNotImplicit } from '../block/setParagraphNotImplicit';\nimport type {\n ContentModelSelectionMarker,\n DeleteSelectionContext,\n FormatContentModelContext,\n InsertPoint,\n IterateSelectionsOption,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelDocument,\n ReadonlyTableSelectionContext,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst DeleteSelectionIteratingOptions: IterateSelectionsOption = {\n contentUnderSelectedTableCell: 'ignoreForTableOrCell', // When a table cell is selected, we replace all content for this cell, so no need to go into its content\n contentUnderSelectedGeneralElement: 'generalElementOnly', // When a general element is selected, we replace the whole element so no need to go into its content\n includeListFormatHolder: 'never',\n};\n\n/**\n * @internal\n * Iterate the model and find all selected content if any, delete them, and keep/create an insert point\n * at the first deleted position so that we know where to put cursor to after delete\n */\nexport function deleteExpandedSelection(\n model: ReadonlyContentModelDocument,\n formatContext?: FormatContentModelContext\n): DeleteSelectionContext {\n const context: DeleteSelectionContext = {\n deleteResult: 'notDeleted',\n insertPoint: null,\n formatContext,\n };\n\n iterateSelections(\n model,\n (path, tableContext, readonlyBlock, readonlySegments) => {\n // Set paragraph, format and index for default position where we will put cursor to.\n // Later we can overwrite these info when process the selections\n let paragraph: ShallowMutableContentModelParagraph = createParagraph(\n true /*implicit*/,\n undefined /*blockFormat*/,\n model.format\n );\n let markerFormat = model.format;\n let insertMarkerIndex = 0;\n\n if (readonlySegments && readonlyBlock?.blockType == 'Paragraph') {\n const [block, segments, indexes] = mutateSegments(readonlyBlock, readonlySegments);\n\n // Delete segments inside a paragraph\n if (segments[0]) {\n // Now that we have found a paragraph with selections, we can overwrite the default paragraph with this one\n // so we can put cursor here after delete\n paragraph = block;\n insertMarkerIndex = indexes[0];\n markerFormat = getSegmentTextFormat(segments[0]);\n\n context.lastParagraph = paragraph;\n context.lastTableContext = tableContext;\n\n segments.forEach((segment, i) => {\n if (\n i == 0 &&\n !context.insertPoint &&\n segment.segmentType == 'SelectionMarker'\n ) {\n // First time we hit a selection and it is a selection marker, just mark it and not need to delete\n // because this is possible a collapsed selection, then it will be handled later\n context.insertPoint = createInsertPoint(\n segment,\n block,\n path,\n tableContext\n );\n } else if (deleteSegment(block, segment, context.formatContext)) {\n context.deleteResult = 'range';\n }\n });\n\n // Since we are operating on this paragraph and it possible we delete everything from this paragraph,\n // Need to make it \"not implicit\" so that it will always have a container element, so that when we do normalization\n // of this paragraph, a BR can be added if need\n if (context.deleteResult == 'range') {\n setParagraphNotImplicit(block);\n }\n }\n } else if (readonlyBlock) {\n // Delete a whole block (divider, table, ...)\n const blocks = mutateBlock(path[0]).blocks;\n\n if (deleteBlock(blocks, readonlyBlock, paragraph, context.formatContext)) {\n context.deleteResult = 'range';\n }\n } else if (tableContext) {\n // Delete a whole table cell\n const { table, colIndex, rowIndex } = tableContext;\n const mutableTable = mutateBlock(table);\n const row = mutableTable.rows[rowIndex];\n const cell = mutateBlock(row.cells[colIndex]);\n\n path = [cell, ...path];\n paragraph.segments.push(createBr(model.format));\n cell.blocks = [paragraph];\n\n context.deleteResult = 'range';\n }\n\n if (!context.insertPoint) {\n // If we have not got a insert point after delete and we have a paragraph to put an insert point in, create insert point now\n const marker = createSelectionMarker(markerFormat);\n\n setParagraphNotImplicit(paragraph);\n paragraph.segments.splice(insertMarkerIndex, 0, marker);\n context.insertPoint = createInsertPoint(marker, paragraph, path, tableContext);\n }\n },\n DeleteSelectionIteratingOptions\n );\n\n return context;\n}\n\nfunction createInsertPoint(\n marker: ContentModelSelectionMarker,\n paragraph: ShallowMutableContentModelParagraph,\n path: ReadonlyContentModelBlockGroup[],\n tableContext: ReadonlyTableSelectionContext | undefined\n): InsertPoint {\n return {\n marker,\n paragraph,\n path,\n tableContext,\n };\n}\n"]}
1
+ {"version":3,"file":"deleteExpandedSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/deleteExpandedSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { createBr } from '../creators/createBr';\nimport { createParagraph } from '../creators/createParagraph';\nimport { createSelectionMarker } from '../creators/createSelectionMarker';\nimport { deleteBlock } from './deleteBlock';\nimport { deleteSegment } from './deleteSegment';\nimport { getSegmentTextFormat } from './getSegmentTextFormat';\nimport { iterateSelections } from '../selection/iterateSelections';\nimport { mutateBlock, mutateSegments } from '../common/mutate';\nimport { setParagraphNotImplicit } from '../block/setParagraphNotImplicit';\nimport type {\n ContentModelSelectionMarker,\n DeleteSelectionContext,\n FormatContentModelContext,\n InsertPoint,\n IterateSelectionsOption,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelDocument,\n ReadonlyTableSelectionContext,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst DeleteSelectionIteratingOptions: IterateSelectionsOption = {\n contentUnderSelectedTableCell: 'ignoreForTableOrCell', // When a table cell is selected, we replace all content for this cell, so no need to go into its content\n contentUnderSelectedGeneralElement: 'generalElementOnly', // When a general element is selected, we replace the whole element so no need to go into its content\n includeListFormatHolder: 'never',\n};\n\n/**\n * @internal\n * Iterate the model and find all selected content if any, delete them, and keep/create an insert point\n * at the first deleted position so that we know where to put cursor to after delete\n */\nexport function deleteExpandedSelection(\n model: ReadonlyContentModelDocument,\n formatContext?: FormatContentModelContext\n): DeleteSelectionContext {\n const context: DeleteSelectionContext = {\n deleteResult: 'notDeleted',\n insertPoint: null,\n formatContext,\n };\n\n iterateSelections(\n model,\n (path, tableContext, readonlyBlock, readonlySegments) => {\n // Set paragraph, format and index for default position where we will put cursor to.\n // Later we can overwrite these info when process the selections\n let paragraph: ShallowMutableContentModelParagraph = createParagraph(\n true /*implicit*/,\n undefined /*blockFormat*/,\n model.format\n );\n let markerFormat = model.format;\n let insertMarkerIndex = 0;\n\n if (readonlySegments && readonlyBlock?.blockType == 'Paragraph') {\n const [block, segments, indexes] = mutateSegments(readonlyBlock, readonlySegments);\n\n // Delete segments inside a paragraph\n if (segments[0]) {\n // Now that we have found a paragraph with selections, we can overwrite the default paragraph with this one\n // so we can put cursor here after delete\n paragraph = block;\n insertMarkerIndex = indexes[0];\n markerFormat = getSegmentTextFormat(segments[0], true /*includingBIU*/);\n\n context.lastParagraph = paragraph;\n context.lastTableContext = tableContext;\n\n segments.forEach((segment, i) => {\n if (\n i == 0 &&\n !context.insertPoint &&\n segment.segmentType == 'SelectionMarker'\n ) {\n // First time we hit a selection and it is a selection marker, just mark it and not need to delete\n // because this is possible a collapsed selection, then it will be handled later\n context.insertPoint = createInsertPoint(\n segment,\n block,\n path,\n tableContext\n );\n } else if (deleteSegment(block, segment, context.formatContext)) {\n context.deleteResult = 'range';\n }\n });\n\n // Since we are operating on this paragraph and it possible we delete everything from this paragraph,\n // Need to make it \"not implicit\" so that it will always have a container element, so that when we do normalization\n // of this paragraph, a BR can be added if need\n if (context.deleteResult == 'range') {\n setParagraphNotImplicit(block);\n }\n }\n } else if (readonlyBlock) {\n // Delete a whole block (divider, table, ...)\n const blocks = mutateBlock(path[0]).blocks;\n\n if (deleteBlock(blocks, readonlyBlock, paragraph, context.formatContext)) {\n context.deleteResult = 'range';\n }\n } else if (tableContext) {\n // Delete a whole table cell\n const { table, colIndex, rowIndex } = tableContext;\n const mutableTable = mutateBlock(table);\n const row = mutableTable.rows[rowIndex];\n const cell = mutateBlock(row.cells[colIndex]);\n\n path = [cell, ...path];\n paragraph.segments.push(createBr(model.format));\n cell.blocks = [paragraph];\n\n context.deleteResult = 'range';\n }\n\n if (!context.insertPoint) {\n // If we have not got a insert point after delete and we have a paragraph to put an insert point in, create insert point now\n const marker = createSelectionMarker(markerFormat);\n\n setParagraphNotImplicit(paragraph);\n paragraph.segments.splice(insertMarkerIndex, 0, marker);\n context.insertPoint = createInsertPoint(marker, paragraph, path, tableContext);\n }\n },\n DeleteSelectionIteratingOptions\n );\n\n return context;\n}\n\nfunction createInsertPoint(\n marker: ContentModelSelectionMarker,\n paragraph: ShallowMutableContentModelParagraph,\n path: ReadonlyContentModelBlockGroup[],\n tableContext: ReadonlyTableSelectionContext | undefined\n): InsertPoint {\n return {\n marker,\n paragraph,\n path,\n tableContext,\n };\n}\n"]}
@@ -2,6 +2,7 @@ import type { ContentModelSegmentFormat, ReadonlyContentModelSegment } from 'roo
2
2
  /**
3
3
  * Get the text format of a segment, this function will return only format that is applicable to text
4
4
  * @param segment The segment to get format from
5
+ * @param includingBIU When pass true, also get Bold/Italic/Underline format
5
6
  * @returns
6
7
  */
7
- export declare function getSegmentTextFormat(segment: ReadonlyContentModelSegment): ContentModelSegmentFormat;
8
+ export declare function getSegmentTextFormat(segment: ReadonlyContentModelSegment, includingBIU?: boolean): ContentModelSegmentFormat;
@@ -4,18 +4,22 @@ exports.getSegmentTextFormat = void 0;
4
4
  /**
5
5
  * Get the text format of a segment, this function will return only format that is applicable to text
6
6
  * @param segment The segment to get format from
7
+ * @param includingBIU When pass true, also get Bold/Italic/Underline format
7
8
  * @returns
8
9
  */
9
- function getSegmentTextFormat(segment) {
10
+ function getSegmentTextFormat(segment, includingBIU) {
10
11
  var _a;
11
- var _b = (_a = segment === null || segment === void 0 ? void 0 : segment.format) !== null && _a !== void 0 ? _a : {}, fontFamily = _b.fontFamily, fontSize = _b.fontSize, textColor = _b.textColor, backgroundColor = _b.backgroundColor, letterSpacing = _b.letterSpacing, lineHeight = _b.lineHeight;
12
+ var format = (_a = segment.format) !== null && _a !== void 0 ? _a : {};
12
13
  var textFormat = {
13
- fontFamily: fontFamily,
14
- fontSize: fontSize,
15
- textColor: textColor,
16
- backgroundColor: backgroundColor,
17
- letterSpacing: letterSpacing,
18
- lineHeight: lineHeight,
14
+ fontFamily: format.fontFamily,
15
+ fontSize: format.fontSize,
16
+ textColor: format.textColor,
17
+ backgroundColor: format.backgroundColor,
18
+ letterSpacing: format.letterSpacing,
19
+ lineHeight: format.lineHeight,
20
+ fontWeight: includingBIU ? format.fontWeight : undefined,
21
+ italic: includingBIU ? format.italic : undefined,
22
+ underline: includingBIU ? format.underline : undefined,
19
23
  };
20
24
  return removeUndefinedValues(textFormat);
21
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getSegmentTextFormat.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/getSegmentTextFormat.ts"],"names":[],"mappings":";;;AAKA;;;;GAIG;AACH,SAAgB,oBAAoB,CAChC,OAAoC;;IAE9B,IAAA,KACF,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,mCAAI,EAAE,EADjB,UAAU,gBAAA,EAAE,QAAQ,cAAA,EAAE,SAAS,eAAA,EAAE,eAAe,qBAAA,EAAE,aAAa,mBAAA,EAAE,UAAU,gBAC1D,CAAC;IAE1B,IAAM,UAAU,GAA8B;QAC1C,UAAU,YAAA;QACV,QAAQ,UAAA;QACR,SAAS,WAAA;QACT,eAAe,iBAAA;QACf,aAAa,eAAA;QACb,UAAU,YAAA;KACb,CAAC;IAEF,OAAO,qBAAqB,CAAC,UAAU,CAAC,CAAC;AAC7C,CAAC;AAhBD,oDAgBC;AAED,IAAM,qBAAqB,GAAG,UAAC,MAAiC;IAC5D,IAAM,UAAU,GAA2D,EAAE,CAAC;IAC9E,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,UAAA,GAAG;QAC1B,IAAM,KAAK,GAAG,MAAM,CAAC,GAAsC,CAAC,CAAC;QAE7D,IAAI,KAAK,KAAK,SAAS,EAAE;YACrB,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;SAC3B;IACL,CAAC,CAAC,CAAC;IACH,OAAO,UAAU,CAAC;AACtB,CAAC,CAAC","sourcesContent":["import type {\n ContentModelSegmentFormat,\n ReadonlyContentModelSegment,\n} from 'roosterjs-content-model-types';\n\n/**\n * Get the text format of a segment, this function will return only format that is applicable to text\n * @param segment The segment to get format from\n * @returns\n */\nexport function getSegmentTextFormat(\n segment: ReadonlyContentModelSegment\n): ContentModelSegmentFormat {\n const { fontFamily, fontSize, textColor, backgroundColor, letterSpacing, lineHeight } =\n segment?.format ?? {};\n\n const textFormat: ContentModelSegmentFormat = {\n fontFamily,\n fontSize,\n textColor,\n backgroundColor,\n letterSpacing,\n lineHeight,\n };\n\n return removeUndefinedValues(textFormat);\n}\n\nconst removeUndefinedValues = (format: ContentModelSegmentFormat): ContentModelSegmentFormat => {\n const textFormat: Record<string, string | undefined | boolean | never[]> = {};\n Object.keys(format).filter(key => {\n const value = format[key as keyof ContentModelSegmentFormat];\n\n if (value !== undefined) {\n textFormat[key] = value;\n }\n });\n return textFormat;\n};\n"]}
1
+ {"version":3,"file":"getSegmentTextFormat.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/getSegmentTextFormat.ts"],"names":[],"mappings":";;;AAKA;;;;;GAKG;AACH,SAAgB,oBAAoB,CAChC,OAAoC,EACpC,YAAsB;;IAEtB,IAAM,MAAM,GAAG,MAAA,OAAO,CAAC,MAAM,mCAAI,EAAE,CAAC;IACpC,IAAM,UAAU,GAA8B;QAC1C,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QACxD,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAChD,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;KACzD,CAAC;IAEF,OAAO,qBAAqB,CAAC,UAAU,CAAC,CAAC;AAC7C,CAAC;AAlBD,oDAkBC;AAED,IAAM,qBAAqB,GAAG,UAAC,MAAiC;IAC5D,IAAM,UAAU,GAA2D,EAAE,CAAC;IAC9E,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,UAAA,GAAG;QAC1B,IAAM,KAAK,GAAG,MAAM,CAAC,GAAsC,CAAC,CAAC;QAE7D,IAAI,KAAK,KAAK,SAAS,EAAE;YACrB,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;SAC3B;IACL,CAAC,CAAC,CAAC;IACH,OAAO,UAAU,CAAC;AACtB,CAAC,CAAC","sourcesContent":["import type {\n ContentModelSegmentFormat,\n ReadonlyContentModelSegment,\n} from 'roosterjs-content-model-types';\n\n/**\n * Get the text format of a segment, this function will return only format that is applicable to text\n * @param segment The segment to get format from\n * @param includingBIU When pass true, also get Bold/Italic/Underline format\n * @returns\n */\nexport function getSegmentTextFormat(\n segment: ReadonlyContentModelSegment,\n includingBIU?: boolean\n): ContentModelSegmentFormat {\n const format = segment.format ?? {};\n const textFormat: ContentModelSegmentFormat = {\n fontFamily: format.fontFamily,\n fontSize: format.fontSize,\n textColor: format.textColor,\n backgroundColor: format.backgroundColor,\n letterSpacing: format.letterSpacing,\n lineHeight: format.lineHeight,\n fontWeight: includingBIU ? format.fontWeight : undefined,\n italic: includingBIU ? format.italic : undefined,\n underline: includingBIU ? format.underline : undefined,\n };\n\n return removeUndefinedValues(textFormat);\n}\n\nconst removeUndefinedValues = (format: ContentModelSegmentFormat): ContentModelSegmentFormat => {\n const textFormat: Record<string, string | undefined | boolean | never[]> = {};\n Object.keys(format).filter(key => {\n const value = format[key as keyof ContentModelSegmentFormat];\n\n if (value !== undefined) {\n textFormat[key] = value;\n }\n });\n return textFormat;\n};\n"]}
@@ -286,12 +286,26 @@ function getSegmentFormatInLinkFormat(targetFormat) {
286
286
  return result;
287
287
  }
288
288
  function mergeLinkFormat(applyDefaultFormatOption, targetFormat, sourceFormat) {
289
- return applyDefaultFormatOption == 'mergeAll'
290
- ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, getSegmentFormatInLinkFormat(targetFormat)), sourceFormat) : (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, getFormatWithoutSegmentFormat(sourceFormat)), getSegmentFormatInLinkFormat(targetFormat)), getSemanticFormat(sourceFormat)), getHyperlinkTextColor(sourceFormat));
289
+ switch (applyDefaultFormatOption) {
290
+ case 'mergeAll':
291
+ case 'preferSource':
292
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, getSegmentFormatInLinkFormat(targetFormat)), sourceFormat);
293
+ case 'keepSourceEmphasisFormat':
294
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, getFormatWithoutSegmentFormat(sourceFormat)), getSegmentFormatInLinkFormat(targetFormat)), getSemanticFormat(sourceFormat)), getHyperlinkTextColor(sourceFormat));
295
+ case 'preferTarget':
296
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, sourceFormat), getSegmentFormatInLinkFormat(targetFormat));
297
+ }
291
298
  }
292
299
  function mergeSegmentFormat(applyDefaultFormatOption, targetFormat, sourceFormat) {
293
- return applyDefaultFormatOption == 'mergeAll'
294
- ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, targetFormat), sourceFormat) : (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, getFormatWithoutSegmentFormat(sourceFormat)), targetFormat), getSemanticFormat(sourceFormat));
300
+ switch (applyDefaultFormatOption) {
301
+ case 'mergeAll':
302
+ case 'preferSource':
303
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, targetFormat), sourceFormat);
304
+ case 'preferTarget':
305
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, sourceFormat), targetFormat);
306
+ case 'keepSourceEmphasisFormat':
307
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, getFormatWithoutSegmentFormat(sourceFormat)), targetFormat), getSemanticFormat(sourceFormat));
308
+ }
295
309
  }
296
310
  function getSemanticFormat(segmentFormat) {
297
311
  var result = {};
@@ -1 +1 @@
1
- {"version":3,"file":"mergeModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/mergeModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { addBlock } from '../common/addBlock';\nimport { addSegment } from '../common/addSegment';\nimport { applyTableFormat } from './applyTableFormat';\nimport { createListItem } from '../creators/createListItem';\nimport { createParagraph } from '../creators/createParagraph';\nimport { createSelectionMarker } from '../creators/createSelectionMarker';\nimport { createTableCell } from '../creators/createTableCell';\nimport { deleteSelection } from './deleteSelection';\nimport { EmptySegmentFormat } from '../../constants/EmptySegmentFormat';\nimport { getClosestAncestorBlockGroupIndex } from './getClosestAncestorBlockGroupIndex';\nimport { getObjectKeys } from '../..//domUtils/getObjectKeys';\nimport { mutateBlock } from '../common/mutate';\nimport { normalizeContentModel } from '../common/normalizeContentModel';\nimport { normalizeTable } from './normalizeTable';\nimport type {\n ContentModelBlock,\n ContentModelBlockFormat,\n ContentModelDocument,\n ContentModelHyperLinkFormat,\n ContentModelListItem,\n ContentModelParagraph,\n ContentModelSegmentFormat,\n ContentModelTable,\n FormatContentModelContext,\n InsertPoint,\n MergeModelOption,\n ReadonlyContentModelBlock,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelDocument,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst HeadingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\nconst KeysOfSegmentFormat = getObjectKeys(EmptySegmentFormat);\n\n/**\n * Merge source model into target mode\n * @param target Target Content Model that will merge content into\n * @param source Source Content Model will be merged to target model\n * @param context Format context. When call this function inside formatContentModel, provide this context so that formatContentModel will do extra handling to the result\n * @param options More options, see MergeModelOption\n * @returns Insert point after merge, or null if there is no insert point\n */\nexport function mergeModel(\n target: ReadonlyContentModelDocument,\n source: ContentModelDocument,\n context?: FormatContentModelContext,\n options?: MergeModelOption\n): InsertPoint | null {\n const insertPosition =\n options?.insertPosition ?? deleteSelection(target, [], context).insertPoint;\n\n const { addParagraphAfterMergedContent, mergeFormat, mergeTable } = options || {};\n\n if (addParagraphAfterMergedContent && !mergeTable) {\n const { paragraph, marker } = insertPosition || {};\n const newPara = createParagraph(false /* isImplicit */, paragraph?.format, marker?.format);\n addBlock(source, newPara);\n }\n\n if (insertPosition) {\n if (mergeFormat && mergeFormat != 'none') {\n const newFormat: ContentModelSegmentFormat = {\n ...(target.format || {}),\n ...insertPosition.marker.format,\n };\n\n applyDefaultFormat(source, newFormat, mergeFormat);\n }\n\n for (let i = 0; i < source.blocks.length; i++) {\n const block = source.blocks[i];\n\n switch (block.blockType) {\n case 'Paragraph':\n mergeParagraph(insertPosition, block, i == 0, context, options);\n break;\n\n case 'Divider':\n insertBlock(insertPosition, block);\n break;\n\n case 'Entity':\n insertBlock(insertPosition, block);\n context?.newEntities.push(block);\n break;\n\n case 'Table':\n if (source.blocks.length == 1 && mergeTable) {\n mergeTables(insertPosition, block, source);\n } else {\n insertBlock(insertPosition, block);\n }\n break;\n\n case 'BlockGroup':\n switch (block.blockGroupType) {\n case 'General':\n case 'FormatContainer':\n insertBlock(insertPosition, block);\n break;\n case 'ListItem':\n mergeList(insertPosition, block);\n break;\n }\n break;\n }\n }\n }\n\n normalizeContentModel(target);\n\n return insertPosition;\n}\n\nfunction mergeParagraph(\n markerPosition: InsertPoint,\n newPara: ContentModelParagraph,\n mergeToCurrentParagraph: boolean,\n context?: FormatContentModelContext,\n option?: MergeModelOption\n) {\n const { paragraph, marker } = markerPosition;\n const newParagraph = mergeToCurrentParagraph\n ? paragraph\n : splitParagraph(markerPosition, newPara.format);\n const segmentIndex = newParagraph.segments.indexOf(marker);\n\n if (option?.mergeFormat == 'none' && mergeToCurrentParagraph) {\n newParagraph.segments.forEach(segment => {\n segment.format = { ...(newParagraph.segmentFormat || {}), ...segment.format };\n });\n delete newParagraph.segmentFormat;\n }\n if (segmentIndex >= 0) {\n for (let i = 0; i < newPara.segments.length; i++) {\n const segment = newPara.segments[i];\n\n newParagraph.segments.splice(segmentIndex + i, 0, segment);\n\n if (context) {\n if (segment.segmentType == 'Entity') {\n context.newEntities.push(segment);\n }\n\n if (segment.segmentType == 'Image') {\n context.newImages.push(segment);\n }\n }\n }\n }\n\n if (newPara.decorator) {\n newParagraph.decorator = { ...newPara.decorator };\n if (HeadingTags.indexOf(newParagraph.decorator.tagName) > -1) {\n const sourceKeys: (keyof ContentModelSegmentFormat)[] = getObjectKeys(\n newParagraph.decorator.format\n );\n const segmentDecoratorKeys: (keyof ContentModelSegmentFormat)[] = getObjectKeys(\n newParagraph.segmentFormat || {}\n );\n\n sourceKeys.forEach(key => {\n if (segmentDecoratorKeys.indexOf(key) > -1) {\n delete newParagraph.segmentFormat?.[key];\n }\n });\n }\n }\n\n if (!mergeToCurrentParagraph) {\n newParagraph.format = newPara.format;\n } else {\n newParagraph.format = {\n ...newParagraph.format,\n ...newPara.format,\n };\n }\n}\n\nfunction mergeTables(\n markerPosition: InsertPoint,\n newTable: ContentModelTable,\n source: ContentModelDocument\n) {\n const { tableContext, marker } = markerPosition;\n\n if (tableContext && source.blocks.length == 1 && source.blocks[0] == newTable) {\n const { table: readonlyTable, colIndex, rowIndex } = tableContext;\n const table = mutateBlock(readonlyTable);\n\n for (let i = 0; i < newTable.rows.length; i++) {\n for (let j = 0; j < newTable.rows[i].cells.length; j++) {\n const newCell = newTable.rows[i].cells[j];\n\n if (i == 0 && colIndex + j >= table.rows[0].cells.length) {\n for (let k = 0; k < table.rows.length; k++) {\n const leftCell = table.rows[k]?.cells[colIndex + j - 1];\n table.rows[k].cells[colIndex + j] = createTableCell(\n false /*spanLeft*/,\n false /*spanAbove*/,\n leftCell?.isHeader,\n leftCell?.format\n );\n }\n }\n\n if (j == 0 && rowIndex + i >= table.rows.length) {\n if (!table.rows[rowIndex + i]) {\n table.rows[rowIndex + i] = {\n cells: [],\n format: {},\n height: 0,\n };\n }\n\n for (let k = 0; k < table.rows[rowIndex].cells.length; k++) {\n const aboveCell = table.rows[rowIndex + i - 1]?.cells[k];\n table.rows[rowIndex + i].cells[k] = createTableCell(\n false /*spanLeft*/,\n false /*spanAbove*/,\n false /*isHeader*/,\n aboveCell?.format\n );\n }\n }\n\n const oldCell = table.rows[rowIndex + i].cells[colIndex + j];\n table.rows[rowIndex + i].cells[colIndex + j] = newCell;\n\n if (i == 0 && j == 0) {\n const newMarker = createSelectionMarker(marker.format);\n const newPara = addSegment(newCell, newMarker);\n\n if (markerPosition.path[0] == oldCell) {\n // Update insert point to match the change result\n markerPosition.path[0] = newCell;\n markerPosition.marker = newMarker;\n markerPosition.paragraph = newPara;\n }\n }\n }\n }\n\n normalizeTable(table, markerPosition.marker.format);\n applyTableFormat(table, undefined /*newFormat*/, true /*keepCellShade*/);\n } else {\n insertBlock(markerPosition, newTable);\n }\n}\n\nfunction mergeList(markerPosition: InsertPoint, newList: ContentModelListItem) {\n splitParagraph(markerPosition, newList.format);\n\n const { path, paragraph } = markerPosition;\n\n const listItemIndex = getClosestAncestorBlockGroupIndex(path, ['ListItem']);\n const listItem = path[listItemIndex] as ContentModelListItem;\n const listParent = path[listItemIndex + 1]; // It is ok here when index is -1, that means there is no list and we just insert a new paragraph and use path[0] as its parent\n const blockIndex = listParent.blocks.indexOf(listItem || paragraph);\n\n if (blockIndex >= 0) {\n mutateBlock(listParent).blocks.splice(blockIndex, 0, newList);\n }\n\n if (listItem) {\n listItem?.levels.forEach((level, i) => {\n newList.levels[i] = { ...level };\n });\n }\n}\n\nfunction splitParagraph(markerPosition: InsertPoint, newParaFormat: ContentModelBlockFormat) {\n const { paragraph, marker, path } = markerPosition;\n const segmentIndex = paragraph.segments.indexOf(marker);\n const paraIndex = path[0].blocks.indexOf(paragraph);\n const newParagraph: ShallowMutableContentModelParagraph = createParagraph(\n false /*isImplicit*/,\n { ...paragraph.format, ...newParaFormat },\n paragraph.segmentFormat\n );\n\n if (segmentIndex >= 0) {\n newParagraph.segments = paragraph.segments.splice(segmentIndex);\n }\n\n if (paraIndex >= 0) {\n mutateBlock(path[0]).blocks.splice(paraIndex + 1, 0, newParagraph);\n }\n\n const listItemIndex = getClosestAncestorBlockGroupIndex(\n path,\n ['ListItem'],\n ['FormatContainer', 'TableCell']\n );\n const listItem = path[listItemIndex] as ContentModelListItem;\n\n if (listItem) {\n const listParent = listItemIndex >= 0 ? path[listItemIndex + 1] : null;\n const blockIndex = listParent ? listParent.blocks.indexOf(listItem) : -1;\n\n if (blockIndex >= 0 && listParent) {\n const newListItem = createListItem(listItem.levels, listItem.formatHolder.format);\n\n if (paraIndex >= 0) {\n newListItem.blocks = listItem.blocks.splice(paraIndex + 1);\n }\n\n if (blockIndex >= 0) {\n mutateBlock(listParent).blocks.splice(blockIndex + 1, 0, newListItem);\n }\n\n path[listItemIndex] = newListItem;\n }\n }\n\n markerPosition.paragraph = newParagraph;\n\n return newParagraph;\n}\n\nfunction insertBlock(markerPosition: InsertPoint, block: ContentModelBlock) {\n const { path } = markerPosition;\n const newParaFormat = block.blockType !== 'Paragraph' ? {} : block.format;\n const newPara = splitParagraph(markerPosition, newParaFormat);\n const blockIndex = path[0].blocks.indexOf(newPara);\n\n if (blockIndex >= 0) {\n mutateBlock(path[0]).blocks.splice(blockIndex, 0, block);\n }\n}\n\nfunction applyDefaultFormat(\n group: ReadonlyContentModelBlockGroup,\n format: ContentModelSegmentFormat,\n applyDefaultFormatOption: 'mergeAll' | 'keepSourceEmphasisFormat'\n) {\n group.blocks.forEach(block => {\n mergeBlockFormat(applyDefaultFormatOption, block);\n\n switch (block.blockType) {\n case 'BlockGroup':\n if (block.blockGroupType == 'ListItem') {\n mutateBlock(block).formatHolder.format = mergeSegmentFormat(\n applyDefaultFormatOption,\n format,\n block.formatHolder.format\n );\n }\n applyDefaultFormat(block, format, applyDefaultFormatOption);\n break;\n\n case 'Table':\n block.rows.forEach(row =>\n row.cells.forEach(cell => {\n applyDefaultFormat(cell, format, applyDefaultFormatOption);\n })\n );\n break;\n\n case 'Paragraph':\n const paragraphFormat = block.decorator?.format || {};\n const paragraph = mutateBlock(block);\n\n paragraph.segments.forEach(segment => {\n if (segment.segmentType == 'General') {\n applyDefaultFormat(segment, format, applyDefaultFormatOption);\n }\n\n segment.format = mergeSegmentFormat(applyDefaultFormatOption, format, {\n ...paragraphFormat,\n ...segment.format,\n });\n\n if (segment.link) {\n segment.link.format = mergeLinkFormat(\n applyDefaultFormatOption,\n format,\n segment.link.format\n );\n }\n });\n\n if (applyDefaultFormatOption === 'keepSourceEmphasisFormat') {\n delete paragraph.decorator;\n }\n break;\n }\n });\n}\n\nfunction mergeBlockFormat(applyDefaultFormatOption: string, block: ReadonlyContentModelBlock) {\n if (applyDefaultFormatOption == 'keepSourceEmphasisFormat' && block.format.backgroundColor) {\n delete mutateBlock(block).format.backgroundColor;\n }\n}\n\n/**\n * Hyperlink format type definition only contains backgroundColor and underline.\n * So create a minimum object with the styles supported in Hyperlink to be used in merge.\n */\nfunction getSegmentFormatInLinkFormat(\n targetFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n const result: ContentModelHyperLinkFormat = {};\n if (targetFormat.backgroundColor) {\n result.backgroundColor = targetFormat.backgroundColor;\n }\n if (targetFormat.underline) {\n result.underline = targetFormat.underline;\n }\n\n return result;\n}\n\nfunction mergeLinkFormat(\n applyDefaultFormatOption: 'mergeAll' | 'keepSourceEmphasisFormat',\n targetFormat: ContentModelSegmentFormat,\n sourceFormat: ContentModelHyperLinkFormat\n) {\n return applyDefaultFormatOption == 'mergeAll'\n ? { ...getSegmentFormatInLinkFormat(targetFormat), ...sourceFormat }\n : {\n // Hyperlink segment format contains other attributes such as LinkFormat\n // so we have to retain them\n ...getFormatWithoutSegmentFormat(sourceFormat),\n // Link format only have Text color, background color, Underline, but only\n // text color + background color should be merged from the target\n ...getSegmentFormatInLinkFormat(targetFormat),\n // Get the semantic format of the source\n ...getSemanticFormat(sourceFormat),\n // The text color of the hyperlink should not be merged and\n // we should always retain the source text color\n ...getHyperlinkTextColor(sourceFormat),\n };\n}\n\nfunction mergeSegmentFormat(\n applyDefaultFormatOption: 'mergeAll' | 'keepSourceEmphasisFormat',\n targetFormat: ContentModelSegmentFormat,\n sourceFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n return applyDefaultFormatOption == 'mergeAll'\n ? { ...targetFormat, ...sourceFormat }\n : {\n ...getFormatWithoutSegmentFormat(sourceFormat),\n ...targetFormat,\n ...getSemanticFormat(sourceFormat),\n };\n}\n\nfunction getSemanticFormat(segmentFormat: ContentModelSegmentFormat): ContentModelSegmentFormat {\n const result: ContentModelSegmentFormat = {};\n\n const { fontWeight, italic, underline } = segmentFormat;\n\n if (fontWeight && fontWeight != 'normal') {\n result.fontWeight = fontWeight;\n }\n if (italic) {\n result.italic = italic;\n }\n if (underline) {\n result.underline = underline;\n }\n\n return result;\n}\n\n/**\n * Segment format can also contain other type of metadata, for example in Images/Hyperlink,\n * we want to preserve these properties when merging format\n */\nfunction getFormatWithoutSegmentFormat(\n sourceFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n const resultFormat = {\n ...sourceFormat,\n };\n KeysOfSegmentFormat.forEach(key => delete resultFormat[key]);\n return resultFormat;\n}\nfunction getHyperlinkTextColor(sourceFormat: ContentModelHyperLinkFormat) {\n const result: ContentModelHyperLinkFormat = {};\n if (sourceFormat.textColor) {\n result.textColor = sourceFormat.textColor;\n }\n\n return result;\n}\n"]}
1
+ {"version":3,"file":"mergeModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/mergeModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { addBlock } from '../common/addBlock';\nimport { addSegment } from '../common/addSegment';\nimport { applyTableFormat } from './applyTableFormat';\nimport { createListItem } from '../creators/createListItem';\nimport { createParagraph } from '../creators/createParagraph';\nimport { createSelectionMarker } from '../creators/createSelectionMarker';\nimport { createTableCell } from '../creators/createTableCell';\nimport { deleteSelection } from './deleteSelection';\nimport { EmptySegmentFormat } from '../../constants/EmptySegmentFormat';\nimport { getClosestAncestorBlockGroupIndex } from './getClosestAncestorBlockGroupIndex';\nimport { getObjectKeys } from '../..//domUtils/getObjectKeys';\nimport { mutateBlock } from '../common/mutate';\nimport { normalizeContentModel } from '../common/normalizeContentModel';\nimport { normalizeTable } from './normalizeTable';\nimport type {\n ContentModelBlock,\n ContentModelBlockFormat,\n ContentModelDocument,\n ContentModelHyperLinkFormat,\n ContentModelListItem,\n ContentModelParagraph,\n ContentModelSegmentFormat,\n ContentModelTable,\n FormatContentModelContext,\n InsertPoint,\n MergeModelOption,\n ReadonlyContentModelBlock,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelDocument,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst HeadingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\nconst KeysOfSegmentFormat = getObjectKeys(EmptySegmentFormat);\n\ntype MergeFormatTypes = 'mergeAll' | 'keepSourceEmphasisFormat' | 'preferSource' | 'preferTarget';\n\n/**\n * Merge source model into target mode\n * @param target Target Content Model that will merge content into\n * @param source Source Content Model will be merged to target model\n * @param context Format context. When call this function inside formatContentModel, provide this context so that formatContentModel will do extra handling to the result\n * @param options More options, see MergeModelOption\n * @returns Insert point after merge, or null if there is no insert point\n */\nexport function mergeModel(\n target: ReadonlyContentModelDocument,\n source: ContentModelDocument,\n context?: FormatContentModelContext,\n options?: MergeModelOption\n): InsertPoint | null {\n const insertPosition =\n options?.insertPosition ?? deleteSelection(target, [], context).insertPoint;\n\n const { addParagraphAfterMergedContent, mergeFormat, mergeTable } = options || {};\n\n if (addParagraphAfterMergedContent && !mergeTable) {\n const { paragraph, marker } = insertPosition || {};\n const newPara = createParagraph(false /* isImplicit */, paragraph?.format, marker?.format);\n addBlock(source, newPara);\n }\n\n if (insertPosition) {\n if (mergeFormat && mergeFormat != 'none') {\n const newFormat: ContentModelSegmentFormat = {\n ...(target.format || {}),\n ...insertPosition.marker.format,\n };\n\n applyDefaultFormat(source, newFormat, mergeFormat);\n }\n\n for (let i = 0; i < source.blocks.length; i++) {\n const block = source.blocks[i];\n\n switch (block.blockType) {\n case 'Paragraph':\n mergeParagraph(insertPosition, block, i == 0, context, options);\n break;\n\n case 'Divider':\n insertBlock(insertPosition, block);\n break;\n\n case 'Entity':\n insertBlock(insertPosition, block);\n context?.newEntities.push(block);\n break;\n\n case 'Table':\n if (source.blocks.length == 1 && mergeTable) {\n mergeTables(insertPosition, block, source);\n } else {\n insertBlock(insertPosition, block);\n }\n break;\n\n case 'BlockGroup':\n switch (block.blockGroupType) {\n case 'General':\n case 'FormatContainer':\n insertBlock(insertPosition, block);\n break;\n case 'ListItem':\n mergeList(insertPosition, block);\n break;\n }\n break;\n }\n }\n }\n\n normalizeContentModel(target);\n\n return insertPosition;\n}\n\nfunction mergeParagraph(\n markerPosition: InsertPoint,\n newPara: ContentModelParagraph,\n mergeToCurrentParagraph: boolean,\n context?: FormatContentModelContext,\n option?: MergeModelOption\n) {\n const { paragraph, marker } = markerPosition;\n const newParagraph = mergeToCurrentParagraph\n ? paragraph\n : splitParagraph(markerPosition, newPara.format);\n const segmentIndex = newParagraph.segments.indexOf(marker);\n\n if (option?.mergeFormat == 'none' && mergeToCurrentParagraph) {\n newParagraph.segments.forEach(segment => {\n segment.format = { ...(newParagraph.segmentFormat || {}), ...segment.format };\n });\n delete newParagraph.segmentFormat;\n }\n if (segmentIndex >= 0) {\n for (let i = 0; i < newPara.segments.length; i++) {\n const segment = newPara.segments[i];\n\n newParagraph.segments.splice(segmentIndex + i, 0, segment);\n\n if (context) {\n if (segment.segmentType == 'Entity') {\n context.newEntities.push(segment);\n }\n\n if (segment.segmentType == 'Image') {\n context.newImages.push(segment);\n }\n }\n }\n }\n\n if (newPara.decorator) {\n newParagraph.decorator = { ...newPara.decorator };\n if (HeadingTags.indexOf(newParagraph.decorator.tagName) > -1) {\n const sourceKeys: (keyof ContentModelSegmentFormat)[] = getObjectKeys(\n newParagraph.decorator.format\n );\n const segmentDecoratorKeys: (keyof ContentModelSegmentFormat)[] = getObjectKeys(\n newParagraph.segmentFormat || {}\n );\n\n sourceKeys.forEach(key => {\n if (segmentDecoratorKeys.indexOf(key) > -1) {\n delete newParagraph.segmentFormat?.[key];\n }\n });\n }\n }\n\n if (!mergeToCurrentParagraph) {\n newParagraph.format = newPara.format;\n } else {\n newParagraph.format = {\n ...newParagraph.format,\n ...newPara.format,\n };\n }\n}\n\nfunction mergeTables(\n markerPosition: InsertPoint,\n newTable: ContentModelTable,\n source: ContentModelDocument\n) {\n const { tableContext, marker } = markerPosition;\n\n if (tableContext && source.blocks.length == 1 && source.blocks[0] == newTable) {\n const { table: readonlyTable, colIndex, rowIndex } = tableContext;\n const table = mutateBlock(readonlyTable);\n\n for (let i = 0; i < newTable.rows.length; i++) {\n for (let j = 0; j < newTable.rows[i].cells.length; j++) {\n const newCell = newTable.rows[i].cells[j];\n\n if (i == 0 && colIndex + j >= table.rows[0].cells.length) {\n for (let k = 0; k < table.rows.length; k++) {\n const leftCell = table.rows[k]?.cells[colIndex + j - 1];\n table.rows[k].cells[colIndex + j] = createTableCell(\n false /*spanLeft*/,\n false /*spanAbove*/,\n leftCell?.isHeader,\n leftCell?.format\n );\n }\n }\n\n if (j == 0 && rowIndex + i >= table.rows.length) {\n if (!table.rows[rowIndex + i]) {\n table.rows[rowIndex + i] = {\n cells: [],\n format: {},\n height: 0,\n };\n }\n\n for (let k = 0; k < table.rows[rowIndex].cells.length; k++) {\n const aboveCell = table.rows[rowIndex + i - 1]?.cells[k];\n table.rows[rowIndex + i].cells[k] = createTableCell(\n false /*spanLeft*/,\n false /*spanAbove*/,\n false /*isHeader*/,\n aboveCell?.format\n );\n }\n }\n\n const oldCell = table.rows[rowIndex + i].cells[colIndex + j];\n table.rows[rowIndex + i].cells[colIndex + j] = newCell;\n\n if (i == 0 && j == 0) {\n const newMarker = createSelectionMarker(marker.format);\n const newPara = addSegment(newCell, newMarker);\n\n if (markerPosition.path[0] == oldCell) {\n // Update insert point to match the change result\n markerPosition.path[0] = newCell;\n markerPosition.marker = newMarker;\n markerPosition.paragraph = newPara;\n }\n }\n }\n }\n\n normalizeTable(table, markerPosition.marker.format);\n applyTableFormat(table, undefined /*newFormat*/, true /*keepCellShade*/);\n } else {\n insertBlock(markerPosition, newTable);\n }\n}\n\nfunction mergeList(markerPosition: InsertPoint, newList: ContentModelListItem) {\n splitParagraph(markerPosition, newList.format);\n\n const { path, paragraph } = markerPosition;\n\n const listItemIndex = getClosestAncestorBlockGroupIndex(path, ['ListItem']);\n const listItem = path[listItemIndex] as ContentModelListItem;\n const listParent = path[listItemIndex + 1]; // It is ok here when index is -1, that means there is no list and we just insert a new paragraph and use path[0] as its parent\n const blockIndex = listParent.blocks.indexOf(listItem || paragraph);\n\n if (blockIndex >= 0) {\n mutateBlock(listParent).blocks.splice(blockIndex, 0, newList);\n }\n\n if (listItem) {\n listItem?.levels.forEach((level, i) => {\n newList.levels[i] = { ...level };\n });\n }\n}\n\nfunction splitParagraph(markerPosition: InsertPoint, newParaFormat: ContentModelBlockFormat) {\n const { paragraph, marker, path } = markerPosition;\n const segmentIndex = paragraph.segments.indexOf(marker);\n const paraIndex = path[0].blocks.indexOf(paragraph);\n const newParagraph: ShallowMutableContentModelParagraph = createParagraph(\n false /*isImplicit*/,\n { ...paragraph.format, ...newParaFormat },\n paragraph.segmentFormat\n );\n\n if (segmentIndex >= 0) {\n newParagraph.segments = paragraph.segments.splice(segmentIndex);\n }\n\n if (paraIndex >= 0) {\n mutateBlock(path[0]).blocks.splice(paraIndex + 1, 0, newParagraph);\n }\n\n const listItemIndex = getClosestAncestorBlockGroupIndex(\n path,\n ['ListItem'],\n ['FormatContainer', 'TableCell']\n );\n const listItem = path[listItemIndex] as ContentModelListItem;\n\n if (listItem) {\n const listParent = listItemIndex >= 0 ? path[listItemIndex + 1] : null;\n const blockIndex = listParent ? listParent.blocks.indexOf(listItem) : -1;\n\n if (blockIndex >= 0 && listParent) {\n const newListItem = createListItem(listItem.levels, listItem.formatHolder.format);\n\n if (paraIndex >= 0) {\n newListItem.blocks = listItem.blocks.splice(paraIndex + 1);\n }\n\n if (blockIndex >= 0) {\n mutateBlock(listParent).blocks.splice(blockIndex + 1, 0, newListItem);\n }\n\n path[listItemIndex] = newListItem;\n }\n }\n\n markerPosition.paragraph = newParagraph;\n\n return newParagraph;\n}\n\nfunction insertBlock(markerPosition: InsertPoint, block: ContentModelBlock) {\n const { path } = markerPosition;\n const newParaFormat = block.blockType !== 'Paragraph' ? {} : block.format;\n const newPara = splitParagraph(markerPosition, newParaFormat);\n const blockIndex = path[0].blocks.indexOf(newPara);\n\n if (blockIndex >= 0) {\n mutateBlock(path[0]).blocks.splice(blockIndex, 0, block);\n }\n}\n\nfunction applyDefaultFormat(\n group: ReadonlyContentModelBlockGroup,\n format: ContentModelSegmentFormat,\n applyDefaultFormatOption: MergeFormatTypes\n) {\n group.blocks.forEach(block => {\n mergeBlockFormat(applyDefaultFormatOption, block);\n\n switch (block.blockType) {\n case 'BlockGroup':\n if (block.blockGroupType == 'ListItem') {\n mutateBlock(block).formatHolder.format = mergeSegmentFormat(\n applyDefaultFormatOption,\n format,\n block.formatHolder.format\n );\n }\n applyDefaultFormat(block, format, applyDefaultFormatOption);\n break;\n\n case 'Table':\n block.rows.forEach(row =>\n row.cells.forEach(cell => {\n applyDefaultFormat(cell, format, applyDefaultFormatOption);\n })\n );\n break;\n\n case 'Paragraph':\n const paragraphFormat = block.decorator?.format || {};\n const paragraph = mutateBlock(block);\n\n paragraph.segments.forEach(segment => {\n if (segment.segmentType == 'General') {\n applyDefaultFormat(segment, format, applyDefaultFormatOption);\n }\n\n segment.format = mergeSegmentFormat(applyDefaultFormatOption, format, {\n ...paragraphFormat,\n ...segment.format,\n });\n\n if (segment.link) {\n segment.link.format = mergeLinkFormat(\n applyDefaultFormatOption,\n format,\n segment.link.format\n );\n }\n });\n\n if (applyDefaultFormatOption === 'keepSourceEmphasisFormat') {\n delete paragraph.decorator;\n }\n break;\n }\n });\n}\n\nfunction mergeBlockFormat(applyDefaultFormatOption: string, block: ReadonlyContentModelBlock) {\n if (applyDefaultFormatOption == 'keepSourceEmphasisFormat' && block.format.backgroundColor) {\n delete mutateBlock(block).format.backgroundColor;\n }\n}\n\n/**\n * Hyperlink format type definition only contains backgroundColor and underline.\n * So create a minimum object with the styles supported in Hyperlink to be used in merge.\n */\nfunction getSegmentFormatInLinkFormat(\n targetFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n const result: ContentModelHyperLinkFormat = {};\n if (targetFormat.backgroundColor) {\n result.backgroundColor = targetFormat.backgroundColor;\n }\n if (targetFormat.underline) {\n result.underline = targetFormat.underline;\n }\n\n return result;\n}\n\nfunction mergeLinkFormat(\n applyDefaultFormatOption: MergeFormatTypes,\n targetFormat: ContentModelSegmentFormat,\n sourceFormat: ContentModelHyperLinkFormat\n) {\n switch (applyDefaultFormatOption) {\n case 'mergeAll':\n case 'preferSource':\n return { ...getSegmentFormatInLinkFormat(targetFormat), ...sourceFormat };\n case 'keepSourceEmphasisFormat':\n return {\n // Hyperlink segment format contains other attributes such as LinkFormat\n // so we have to retain them\n ...getFormatWithoutSegmentFormat(sourceFormat),\n // Link format only have Text color, background color, Underline, but only\n // text color + background color should be merged from the target\n ...getSegmentFormatInLinkFormat(targetFormat),\n // Get the semantic format of the source\n ...getSemanticFormat(sourceFormat),\n // The text color of the hyperlink should not be merged and\n // we should always retain the source text color\n ...getHyperlinkTextColor(sourceFormat),\n };\n case 'preferTarget':\n return { ...sourceFormat, ...getSegmentFormatInLinkFormat(targetFormat) };\n }\n}\n\nfunction mergeSegmentFormat(\n applyDefaultFormatOption: MergeFormatTypes,\n targetFormat: ContentModelSegmentFormat,\n sourceFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n switch (applyDefaultFormatOption) {\n case 'mergeAll':\n case 'preferSource':\n return { ...targetFormat, ...sourceFormat };\n case 'preferTarget':\n return { ...sourceFormat, ...targetFormat };\n case 'keepSourceEmphasisFormat':\n return {\n ...getFormatWithoutSegmentFormat(sourceFormat),\n ...targetFormat,\n ...getSemanticFormat(sourceFormat),\n };\n }\n}\n\nfunction getSemanticFormat(segmentFormat: ContentModelSegmentFormat): ContentModelSegmentFormat {\n const result: ContentModelSegmentFormat = {};\n\n const { fontWeight, italic, underline } = segmentFormat;\n\n if (fontWeight && fontWeight != 'normal') {\n result.fontWeight = fontWeight;\n }\n if (italic) {\n result.italic = italic;\n }\n if (underline) {\n result.underline = underline;\n }\n\n return result;\n}\n\n/**\n * Segment format can also contain other type of metadata, for example in Images/Hyperlink,\n * we want to preserve these properties when merging format\n */\nfunction getFormatWithoutSegmentFormat(\n sourceFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n const resultFormat = {\n ...sourceFormat,\n };\n KeysOfSegmentFormat.forEach(key => delete resultFormat[key]);\n return resultFormat;\n}\nfunction getHyperlinkTextColor(sourceFormat: ContentModelHyperLinkFormat) {\n const result: ContentModelHyperLinkFormat = {};\n if (sourceFormat.textColor) {\n result.textColor = sourceFormat.textColor;\n }\n\n return result;\n}\n"]}
@@ -7,12 +7,15 @@ define(["require", "exports", "../utils/dir", "./directionFormatHandler"], funct
7
7
  */
8
8
  exports.htmlAlignFormatHandler = {
9
9
  parse: function (format, element, context, defaultStyle) {
10
- directionFormatHandler_1.directionFormatHandler.parse(format, element, context, defaultStyle);
11
- var htmlAlign = element.getAttribute('align');
12
- if (htmlAlign) {
13
- format.htmlAlign = (0, dir_1.calcAlign)(htmlAlign, format.direction);
14
- delete format.textAlign;
15
- delete context.blockFormat.textAlign;
10
+ // When there is text-align in CSS style on the same element, we should ignore HTML align
11
+ if (!element.style.textAlign) {
12
+ directionFormatHandler_1.directionFormatHandler.parse(format, element, context, defaultStyle);
13
+ var htmlAlign = element.getAttribute('align');
14
+ if (htmlAlign) {
15
+ format.htmlAlign = (0, dir_1.calcAlign)(htmlAlign, format.direction);
16
+ delete format.textAlign;
17
+ delete context.blockFormat.textAlign;
18
+ }
16
19
  }
17
20
  },
18
21
  apply: function (format, element) {
@@ -1 +1 @@
1
- {"version":3,"file":"htmlAlignFormatHandler.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/formatHandlers/block/htmlAlignFormatHandler.ts"],"names":[],"mappings":";;;;IASA;;OAEG;IACU,QAAA,sBAAsB,GAE/B;QACA,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY;YAC1C,+CAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;YAErE,IAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAEhD,IAAI,SAAS,EAAE;gBACX,MAAM,CAAC,SAAS,GAAG,IAAA,eAAS,EAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC1D,OAAO,MAAM,CAAC,SAAS,CAAC;gBACxB,OAAO,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC;aACxC;QACL,CAAC;QACD,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO;YACnB,IAAM,GAAG,GAAkB,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YAErE,IAAI,MAAM,CAAC,SAAS,EAAE;gBAClB,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,eAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;aACnE;QACL,CAAC;KACJ,CAAC","sourcesContent":["import { calcAlign, ResultMap } from '../utils/dir';\nimport { directionFormatHandler } from './directionFormatHandler';\nimport type {\n DirectionFormat,\n HtmlAlignFormat,\n TextAlignFormat,\n} from 'roosterjs-content-model-types';\nimport type { FormatHandler } from '../FormatHandler';\n\n/**\n * @internal\n */\nexport const htmlAlignFormatHandler: FormatHandler<\n DirectionFormat & HtmlAlignFormat & TextAlignFormat\n> = {\n parse: (format, element, context, defaultStyle) => {\n directionFormatHandler.parse(format, element, context, defaultStyle);\n\n const htmlAlign = element.getAttribute('align');\n\n if (htmlAlign) {\n format.htmlAlign = calcAlign(htmlAlign, format.direction);\n delete format.textAlign;\n delete context.blockFormat.textAlign;\n }\n },\n apply: (format, element) => {\n const dir: 'ltr' | 'rtl' = format.direction == 'rtl' ? 'rtl' : 'ltr';\n\n if (format.htmlAlign) {\n element.setAttribute('align', ResultMap[format.htmlAlign][dir]);\n }\n },\n};\n"]}
1
+ {"version":3,"file":"htmlAlignFormatHandler.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/formatHandlers/block/htmlAlignFormatHandler.ts"],"names":[],"mappings":";;;;IASA;;OAEG;IACU,QAAA,sBAAsB,GAE/B;QACA,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY;YAC1C,yFAAyF;YACzF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE;gBAC1B,+CAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;gBAErE,IAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBAEhD,IAAI,SAAS,EAAE;oBACX,MAAM,CAAC,SAAS,GAAG,IAAA,eAAS,EAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;oBAC1D,OAAO,MAAM,CAAC,SAAS,CAAC;oBACxB,OAAO,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC;iBACxC;aACJ;QACL,CAAC;QACD,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO;YACnB,IAAM,GAAG,GAAkB,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YAErE,IAAI,MAAM,CAAC,SAAS,EAAE;gBAClB,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,eAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;aACnE;QACL,CAAC;KACJ,CAAC","sourcesContent":["import { calcAlign, ResultMap } from '../utils/dir';\nimport { directionFormatHandler } from './directionFormatHandler';\nimport type {\n DirectionFormat,\n HtmlAlignFormat,\n TextAlignFormat,\n} from 'roosterjs-content-model-types';\nimport type { FormatHandler } from '../FormatHandler';\n\n/**\n * @internal\n */\nexport const htmlAlignFormatHandler: FormatHandler<\n DirectionFormat & HtmlAlignFormat & TextAlignFormat\n> = {\n parse: (format, element, context, defaultStyle) => {\n // When there is text-align in CSS style on the same element, we should ignore HTML align\n if (!element.style.textAlign) {\n directionFormatHandler.parse(format, element, context, defaultStyle);\n\n const htmlAlign = element.getAttribute('align');\n\n if (htmlAlign) {\n format.htmlAlign = calcAlign(htmlAlign, format.direction);\n delete format.textAlign;\n delete context.blockFormat.textAlign;\n }\n }\n },\n apply: (format, element) => {\n const dir: 'ltr' | 'rtl' = format.direction == 'rtl' ? 'rtl' : 'ltr';\n\n if (format.htmlAlign) {\n element.setAttribute('align', ResultMap[format.htmlAlign][dir]);\n }\n },\n};\n"]}
@@ -32,7 +32,7 @@ define(["require", "exports", "tslib", "../creators/createBr", "../creators/crea
32
32
  // so we can put cursor here after delete
33
33
  paragraph = block_1;
34
34
  insertMarkerIndex = indexes[0];
35
- markerFormat = (0, getSegmentTextFormat_1.getSegmentTextFormat)(segments[0]);
35
+ markerFormat = (0, getSegmentTextFormat_1.getSegmentTextFormat)(segments[0], true /*includingBIU*/);
36
36
  context.lastParagraph = paragraph;
37
37
  context.lastTableContext = tableContext;
38
38
  segments.forEach(function (segment, i) {
@@ -1 +1 @@
1
- {"version":3,"file":"deleteExpandedSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/deleteExpandedSelection.ts"],"names":[],"mappings":";;;;IAqBA,IAAM,+BAA+B,GAA4B;QAC7D,6BAA6B,EAAE,sBAAsB;QACrD,kCAAkC,EAAE,oBAAoB;QACxD,uBAAuB,EAAE,OAAO;KACnC,CAAC;IAEF;;;;OAIG;IACH,SAAgB,uBAAuB,CACnC,KAAmC,EACnC,aAAyC;QAEzC,IAAM,OAAO,GAA2B;YACpC,YAAY,EAAE,YAAY;YAC1B,WAAW,EAAE,IAAI;YACjB,aAAa,eAAA;SAChB,CAAC;QAEF,IAAA,qCAAiB,EACb,KAAK,EACL,UAAC,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB;YAChD,oFAAoF;YACpF,gEAAgE;YAChE,IAAI,SAAS,GAAwC,IAAA,iCAAe,EAChE,IAAI,CAAC,YAAY,EACjB,SAAS,CAAC,eAAe,EACzB,KAAK,CAAC,MAAM,CACf,CAAC;YACF,IAAI,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC;YAChC,IAAI,iBAAiB,GAAG,CAAC,CAAC;YAE1B,IAAI,gBAAgB,IAAI,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,SAAS,KAAI,WAAW,EAAE;gBACvD,IAAA,KAAA,oBAA6B,IAAA,uBAAc,EAAC,aAAa,EAAE,gBAAgB,CAAC,IAAA,EAA3E,OAAK,QAAA,EAAE,QAAQ,QAAA,EAAE,OAAO,QAAmD,CAAC;gBAEnF,qCAAqC;gBACrC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE;oBACb,2GAA2G;oBAC3G,yCAAyC;oBACzC,SAAS,GAAG,OAAK,CAAC;oBAClB,iBAAiB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC/B,YAAY,GAAG,IAAA,2CAAoB,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;oBAEjD,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;oBAClC,OAAO,CAAC,gBAAgB,GAAG,YAAY,CAAC;oBAExC,QAAQ,CAAC,OAAO,CAAC,UAAC,OAAO,EAAE,CAAC;wBACxB,IACI,CAAC,IAAI,CAAC;4BACN,CAAC,OAAO,CAAC,WAAW;4BACpB,OAAO,CAAC,WAAW,IAAI,iBAAiB,EAC1C;4BACE,kGAAkG;4BAClG,gFAAgF;4BAChF,OAAO,CAAC,WAAW,GAAG,iBAAiB,CACnC,OAAO,EACP,OAAK,EACL,IAAI,EACJ,YAAY,CACf,CAAC;yBACL;6BAAM,IAAI,IAAA,6BAAa,EAAC,OAAK,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE;4BAC7D,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC;yBAClC;oBACL,CAAC,CAAC,CAAC;oBAEH,qGAAqG;oBACrG,mHAAmH;oBACnH,+CAA+C;oBAC/C,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,EAAE;wBACjC,IAAA,iDAAuB,EAAC,OAAK,CAAC,CAAC;qBAClC;iBACJ;aACJ;iBAAM,IAAI,aAAa,EAAE;gBACtB,6CAA6C;gBAC7C,IAAM,MAAM,GAAG,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBAE3C,IAAI,IAAA,yBAAW,EAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE;oBACtE,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC;iBAClC;aACJ;iBAAM,IAAI,YAAY,EAAE;gBACrB,4BAA4B;gBACpB,IAAA,KAAK,GAAyB,YAAY,MAArC,EAAE,QAAQ,GAAe,YAAY,SAA3B,EAAE,QAAQ,GAAK,YAAY,SAAjB,CAAkB;gBACnD,IAAM,YAAY,GAAG,IAAA,oBAAW,EAAC,KAAK,CAAC,CAAC;gBACxC,IAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACxC,IAAM,IAAI,GAAG,IAAA,oBAAW,EAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAE9C,IAAI,+BAAI,IAAI,uBAAK,IAAI,SAAC,CAAC;gBACvB,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAA,mBAAQ,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;gBAChD,IAAI,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC;gBAE1B,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC;aAClC;YAED,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;gBACtB,4HAA4H;gBAC5H,IAAM,MAAM,GAAG,IAAA,6CAAqB,EAAC,YAAY,CAAC,CAAC;gBAEnD,IAAA,iDAAuB,EAAC,SAAS,CAAC,CAAC;gBACnC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBACxD,OAAO,CAAC,WAAW,GAAG,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;aAClF;QACL,CAAC,EACD,+BAA+B,CAClC,CAAC;QAEF,OAAO,OAAO,CAAC;IACnB,CAAC;IAjGD,0DAiGC;IAED,SAAS,iBAAiB,CACtB,MAAmC,EACnC,SAA8C,EAC9C,IAAsC,EACtC,YAAuD;QAEvD,OAAO;YACH,MAAM,QAAA;YACN,SAAS,WAAA;YACT,IAAI,MAAA;YACJ,YAAY,cAAA;SACf,CAAC;IACN,CAAC","sourcesContent":["import { createBr } from '../creators/createBr';\nimport { createParagraph } from '../creators/createParagraph';\nimport { createSelectionMarker } from '../creators/createSelectionMarker';\nimport { deleteBlock } from './deleteBlock';\nimport { deleteSegment } from './deleteSegment';\nimport { getSegmentTextFormat } from './getSegmentTextFormat';\nimport { iterateSelections } from '../selection/iterateSelections';\nimport { mutateBlock, mutateSegments } from '../common/mutate';\nimport { setParagraphNotImplicit } from '../block/setParagraphNotImplicit';\nimport type {\n ContentModelSelectionMarker,\n DeleteSelectionContext,\n FormatContentModelContext,\n InsertPoint,\n IterateSelectionsOption,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelDocument,\n ReadonlyTableSelectionContext,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst DeleteSelectionIteratingOptions: IterateSelectionsOption = {\n contentUnderSelectedTableCell: 'ignoreForTableOrCell', // When a table cell is selected, we replace all content for this cell, so no need to go into its content\n contentUnderSelectedGeneralElement: 'generalElementOnly', // When a general element is selected, we replace the whole element so no need to go into its content\n includeListFormatHolder: 'never',\n};\n\n/**\n * @internal\n * Iterate the model and find all selected content if any, delete them, and keep/create an insert point\n * at the first deleted position so that we know where to put cursor to after delete\n */\nexport function deleteExpandedSelection(\n model: ReadonlyContentModelDocument,\n formatContext?: FormatContentModelContext\n): DeleteSelectionContext {\n const context: DeleteSelectionContext = {\n deleteResult: 'notDeleted',\n insertPoint: null,\n formatContext,\n };\n\n iterateSelections(\n model,\n (path, tableContext, readonlyBlock, readonlySegments) => {\n // Set paragraph, format and index for default position where we will put cursor to.\n // Later we can overwrite these info when process the selections\n let paragraph: ShallowMutableContentModelParagraph = createParagraph(\n true /*implicit*/,\n undefined /*blockFormat*/,\n model.format\n );\n let markerFormat = model.format;\n let insertMarkerIndex = 0;\n\n if (readonlySegments && readonlyBlock?.blockType == 'Paragraph') {\n const [block, segments, indexes] = mutateSegments(readonlyBlock, readonlySegments);\n\n // Delete segments inside a paragraph\n if (segments[0]) {\n // Now that we have found a paragraph with selections, we can overwrite the default paragraph with this one\n // so we can put cursor here after delete\n paragraph = block;\n insertMarkerIndex = indexes[0];\n markerFormat = getSegmentTextFormat(segments[0]);\n\n context.lastParagraph = paragraph;\n context.lastTableContext = tableContext;\n\n segments.forEach((segment, i) => {\n if (\n i == 0 &&\n !context.insertPoint &&\n segment.segmentType == 'SelectionMarker'\n ) {\n // First time we hit a selection and it is a selection marker, just mark it and not need to delete\n // because this is possible a collapsed selection, then it will be handled later\n context.insertPoint = createInsertPoint(\n segment,\n block,\n path,\n tableContext\n );\n } else if (deleteSegment(block, segment, context.formatContext)) {\n context.deleteResult = 'range';\n }\n });\n\n // Since we are operating on this paragraph and it possible we delete everything from this paragraph,\n // Need to make it \"not implicit\" so that it will always have a container element, so that when we do normalization\n // of this paragraph, a BR can be added if need\n if (context.deleteResult == 'range') {\n setParagraphNotImplicit(block);\n }\n }\n } else if (readonlyBlock) {\n // Delete a whole block (divider, table, ...)\n const blocks = mutateBlock(path[0]).blocks;\n\n if (deleteBlock(blocks, readonlyBlock, paragraph, context.formatContext)) {\n context.deleteResult = 'range';\n }\n } else if (tableContext) {\n // Delete a whole table cell\n const { table, colIndex, rowIndex } = tableContext;\n const mutableTable = mutateBlock(table);\n const row = mutableTable.rows[rowIndex];\n const cell = mutateBlock(row.cells[colIndex]);\n\n path = [cell, ...path];\n paragraph.segments.push(createBr(model.format));\n cell.blocks = [paragraph];\n\n context.deleteResult = 'range';\n }\n\n if (!context.insertPoint) {\n // If we have not got a insert point after delete and we have a paragraph to put an insert point in, create insert point now\n const marker = createSelectionMarker(markerFormat);\n\n setParagraphNotImplicit(paragraph);\n paragraph.segments.splice(insertMarkerIndex, 0, marker);\n context.insertPoint = createInsertPoint(marker, paragraph, path, tableContext);\n }\n },\n DeleteSelectionIteratingOptions\n );\n\n return context;\n}\n\nfunction createInsertPoint(\n marker: ContentModelSelectionMarker,\n paragraph: ShallowMutableContentModelParagraph,\n path: ReadonlyContentModelBlockGroup[],\n tableContext: ReadonlyTableSelectionContext | undefined\n): InsertPoint {\n return {\n marker,\n paragraph,\n path,\n tableContext,\n };\n}\n"]}
1
+ {"version":3,"file":"deleteExpandedSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/deleteExpandedSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { createBr } from '../creators/createBr';\nimport { createParagraph } from '../creators/createParagraph';\nimport { createSelectionMarker } from '../creators/createSelectionMarker';\nimport { deleteBlock } from './deleteBlock';\nimport { deleteSegment } from './deleteSegment';\nimport { getSegmentTextFormat } from './getSegmentTextFormat';\nimport { iterateSelections } from '../selection/iterateSelections';\nimport { mutateBlock, mutateSegments } from '../common/mutate';\nimport { setParagraphNotImplicit } from '../block/setParagraphNotImplicit';\nimport type {\n ContentModelSelectionMarker,\n DeleteSelectionContext,\n FormatContentModelContext,\n InsertPoint,\n IterateSelectionsOption,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelDocument,\n ReadonlyTableSelectionContext,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst DeleteSelectionIteratingOptions: IterateSelectionsOption = {\n contentUnderSelectedTableCell: 'ignoreForTableOrCell', // When a table cell is selected, we replace all content for this cell, so no need to go into its content\n contentUnderSelectedGeneralElement: 'generalElementOnly', // When a general element is selected, we replace the whole element so no need to go into its content\n includeListFormatHolder: 'never',\n};\n\n/**\n * @internal\n * Iterate the model and find all selected content if any, delete them, and keep/create an insert point\n * at the first deleted position so that we know where to put cursor to after delete\n */\nexport function deleteExpandedSelection(\n model: ReadonlyContentModelDocument,\n formatContext?: FormatContentModelContext\n): DeleteSelectionContext {\n const context: DeleteSelectionContext = {\n deleteResult: 'notDeleted',\n insertPoint: null,\n formatContext,\n };\n\n iterateSelections(\n model,\n (path, tableContext, readonlyBlock, readonlySegments) => {\n // Set paragraph, format and index for default position where we will put cursor to.\n // Later we can overwrite these info when process the selections\n let paragraph: ShallowMutableContentModelParagraph = createParagraph(\n true /*implicit*/,\n undefined /*blockFormat*/,\n model.format\n );\n let markerFormat = model.format;\n let insertMarkerIndex = 0;\n\n if (readonlySegments && readonlyBlock?.blockType == 'Paragraph') {\n const [block, segments, indexes] = mutateSegments(readonlyBlock, readonlySegments);\n\n // Delete segments inside a paragraph\n if (segments[0]) {\n // Now that we have found a paragraph with selections, we can overwrite the default paragraph with this one\n // so we can put cursor here after delete\n paragraph = block;\n insertMarkerIndex = indexes[0];\n markerFormat = getSegmentTextFormat(segments[0], true /*includingBIU*/);\n\n context.lastParagraph = paragraph;\n context.lastTableContext = tableContext;\n\n segments.forEach((segment, i) => {\n if (\n i == 0 &&\n !context.insertPoint &&\n segment.segmentType == 'SelectionMarker'\n ) {\n // First time we hit a selection and it is a selection marker, just mark it and not need to delete\n // because this is possible a collapsed selection, then it will be handled later\n context.insertPoint = createInsertPoint(\n segment,\n block,\n path,\n tableContext\n );\n } else if (deleteSegment(block, segment, context.formatContext)) {\n context.deleteResult = 'range';\n }\n });\n\n // Since we are operating on this paragraph and it possible we delete everything from this paragraph,\n // Need to make it \"not implicit\" so that it will always have a container element, so that when we do normalization\n // of this paragraph, a BR can be added if need\n if (context.deleteResult == 'range') {\n setParagraphNotImplicit(block);\n }\n }\n } else if (readonlyBlock) {\n // Delete a whole block (divider, table, ...)\n const blocks = mutateBlock(path[0]).blocks;\n\n if (deleteBlock(blocks, readonlyBlock, paragraph, context.formatContext)) {\n context.deleteResult = 'range';\n }\n } else if (tableContext) {\n // Delete a whole table cell\n const { table, colIndex, rowIndex } = tableContext;\n const mutableTable = mutateBlock(table);\n const row = mutableTable.rows[rowIndex];\n const cell = mutateBlock(row.cells[colIndex]);\n\n path = [cell, ...path];\n paragraph.segments.push(createBr(model.format));\n cell.blocks = [paragraph];\n\n context.deleteResult = 'range';\n }\n\n if (!context.insertPoint) {\n // If we have not got a insert point after delete and we have a paragraph to put an insert point in, create insert point now\n const marker = createSelectionMarker(markerFormat);\n\n setParagraphNotImplicit(paragraph);\n paragraph.segments.splice(insertMarkerIndex, 0, marker);\n context.insertPoint = createInsertPoint(marker, paragraph, path, tableContext);\n }\n },\n DeleteSelectionIteratingOptions\n );\n\n return context;\n}\n\nfunction createInsertPoint(\n marker: ContentModelSelectionMarker,\n paragraph: ShallowMutableContentModelParagraph,\n path: ReadonlyContentModelBlockGroup[],\n tableContext: ReadonlyTableSelectionContext | undefined\n): InsertPoint {\n return {\n marker,\n paragraph,\n path,\n tableContext,\n };\n}\n"]}
@@ -2,6 +2,7 @@ import type { ContentModelSegmentFormat, ReadonlyContentModelSegment } from 'roo
2
2
  /**
3
3
  * Get the text format of a segment, this function will return only format that is applicable to text
4
4
  * @param segment The segment to get format from
5
+ * @param includingBIU When pass true, also get Bold/Italic/Underline format
5
6
  * @returns
6
7
  */
7
- export declare function getSegmentTextFormat(segment: ReadonlyContentModelSegment): ContentModelSegmentFormat;
8
+ export declare function getSegmentTextFormat(segment: ReadonlyContentModelSegment, includingBIU?: boolean): ContentModelSegmentFormat;
@@ -5,18 +5,22 @@ define(["require", "exports"], function (require, exports) {
5
5
  /**
6
6
  * Get the text format of a segment, this function will return only format that is applicable to text
7
7
  * @param segment The segment to get format from
8
+ * @param includingBIU When pass true, also get Bold/Italic/Underline format
8
9
  * @returns
9
10
  */
10
- function getSegmentTextFormat(segment) {
11
+ function getSegmentTextFormat(segment, includingBIU) {
11
12
  var _a;
12
- var _b = (_a = segment === null || segment === void 0 ? void 0 : segment.format) !== null && _a !== void 0 ? _a : {}, fontFamily = _b.fontFamily, fontSize = _b.fontSize, textColor = _b.textColor, backgroundColor = _b.backgroundColor, letterSpacing = _b.letterSpacing, lineHeight = _b.lineHeight;
13
+ var format = (_a = segment.format) !== null && _a !== void 0 ? _a : {};
13
14
  var textFormat = {
14
- fontFamily: fontFamily,
15
- fontSize: fontSize,
16
- textColor: textColor,
17
- backgroundColor: backgroundColor,
18
- letterSpacing: letterSpacing,
19
- lineHeight: lineHeight,
15
+ fontFamily: format.fontFamily,
16
+ fontSize: format.fontSize,
17
+ textColor: format.textColor,
18
+ backgroundColor: format.backgroundColor,
19
+ letterSpacing: format.letterSpacing,
20
+ lineHeight: format.lineHeight,
21
+ fontWeight: includingBIU ? format.fontWeight : undefined,
22
+ italic: includingBIU ? format.italic : undefined,
23
+ underline: includingBIU ? format.underline : undefined,
20
24
  };
21
25
  return removeUndefinedValues(textFormat);
22
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getSegmentTextFormat.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/getSegmentTextFormat.ts"],"names":[],"mappings":";;;;IAKA;;;;OAIG;IACH,SAAgB,oBAAoB,CAChC,OAAoC;;QAE9B,IAAA,KACF,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,mCAAI,EAAE,EADjB,UAAU,gBAAA,EAAE,QAAQ,cAAA,EAAE,SAAS,eAAA,EAAE,eAAe,qBAAA,EAAE,aAAa,mBAAA,EAAE,UAAU,gBAC1D,CAAC;QAE1B,IAAM,UAAU,GAA8B;YAC1C,UAAU,YAAA;YACV,QAAQ,UAAA;YACR,SAAS,WAAA;YACT,eAAe,iBAAA;YACf,aAAa,eAAA;YACb,UAAU,YAAA;SACb,CAAC;QAEF,OAAO,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAhBD,oDAgBC;IAED,IAAM,qBAAqB,GAAG,UAAC,MAAiC;QAC5D,IAAM,UAAU,GAA2D,EAAE,CAAC;QAC9E,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,UAAA,GAAG;YAC1B,IAAM,KAAK,GAAG,MAAM,CAAC,GAAsC,CAAC,CAAC;YAE7D,IAAI,KAAK,KAAK,SAAS,EAAE;gBACrB,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;aAC3B;QACL,CAAC,CAAC,CAAC;QACH,OAAO,UAAU,CAAC;IACtB,CAAC,CAAC","sourcesContent":["import type {\n ContentModelSegmentFormat,\n ReadonlyContentModelSegment,\n} from 'roosterjs-content-model-types';\n\n/**\n * Get the text format of a segment, this function will return only format that is applicable to text\n * @param segment The segment to get format from\n * @returns\n */\nexport function getSegmentTextFormat(\n segment: ReadonlyContentModelSegment\n): ContentModelSegmentFormat {\n const { fontFamily, fontSize, textColor, backgroundColor, letterSpacing, lineHeight } =\n segment?.format ?? {};\n\n const textFormat: ContentModelSegmentFormat = {\n fontFamily,\n fontSize,\n textColor,\n backgroundColor,\n letterSpacing,\n lineHeight,\n };\n\n return removeUndefinedValues(textFormat);\n}\n\nconst removeUndefinedValues = (format: ContentModelSegmentFormat): ContentModelSegmentFormat => {\n const textFormat: Record<string, string | undefined | boolean | never[]> = {};\n Object.keys(format).filter(key => {\n const value = format[key as keyof ContentModelSegmentFormat];\n\n if (value !== undefined) {\n textFormat[key] = value;\n }\n });\n return textFormat;\n};\n"]}
1
+ {"version":3,"file":"getSegmentTextFormat.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/getSegmentTextFormat.ts"],"names":[],"mappings":";;;;IAKA;;;;;OAKG;IACH,SAAgB,oBAAoB,CAChC,OAAoC,EACpC,YAAsB;;QAEtB,IAAM,MAAM,GAAG,MAAA,OAAO,CAAC,MAAM,mCAAI,EAAE,CAAC;QACpC,IAAM,UAAU,GAA8B;YAC1C,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YACxD,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YAChD,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;SACzD,CAAC;QAEF,OAAO,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAlBD,oDAkBC;IAED,IAAM,qBAAqB,GAAG,UAAC,MAAiC;QAC5D,IAAM,UAAU,GAA2D,EAAE,CAAC;QAC9E,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,UAAA,GAAG;YAC1B,IAAM,KAAK,GAAG,MAAM,CAAC,GAAsC,CAAC,CAAC;YAE7D,IAAI,KAAK,KAAK,SAAS,EAAE;gBACrB,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;aAC3B;QACL,CAAC,CAAC,CAAC;QACH,OAAO,UAAU,CAAC;IACtB,CAAC,CAAC","sourcesContent":["import type {\n ContentModelSegmentFormat,\n ReadonlyContentModelSegment,\n} from 'roosterjs-content-model-types';\n\n/**\n * Get the text format of a segment, this function will return only format that is applicable to text\n * @param segment The segment to get format from\n * @param includingBIU When pass true, also get Bold/Italic/Underline format\n * @returns\n */\nexport function getSegmentTextFormat(\n segment: ReadonlyContentModelSegment,\n includingBIU?: boolean\n): ContentModelSegmentFormat {\n const format = segment.format ?? {};\n const textFormat: ContentModelSegmentFormat = {\n fontFamily: format.fontFamily,\n fontSize: format.fontSize,\n textColor: format.textColor,\n backgroundColor: format.backgroundColor,\n letterSpacing: format.letterSpacing,\n lineHeight: format.lineHeight,\n fontWeight: includingBIU ? format.fontWeight : undefined,\n italic: includingBIU ? format.italic : undefined,\n underline: includingBIU ? format.underline : undefined,\n };\n\n return removeUndefinedValues(textFormat);\n}\n\nconst removeUndefinedValues = (format: ContentModelSegmentFormat): ContentModelSegmentFormat => {\n const textFormat: Record<string, string | undefined | boolean | never[]> = {};\n Object.keys(format).filter(key => {\n const value = format[key as keyof ContentModelSegmentFormat];\n\n if (value !== undefined) {\n textFormat[key] = value;\n }\n });\n return textFormat;\n};\n"]}
@@ -272,12 +272,26 @@ define(["require", "exports", "tslib", "../common/addBlock", "../common/addSegme
272
272
  return result;
273
273
  }
274
274
  function mergeLinkFormat(applyDefaultFormatOption, targetFormat, sourceFormat) {
275
- return applyDefaultFormatOption == 'mergeAll'
276
- ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, getSegmentFormatInLinkFormat(targetFormat)), sourceFormat) : (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, getFormatWithoutSegmentFormat(sourceFormat)), getSegmentFormatInLinkFormat(targetFormat)), getSemanticFormat(sourceFormat)), getHyperlinkTextColor(sourceFormat));
275
+ switch (applyDefaultFormatOption) {
276
+ case 'mergeAll':
277
+ case 'preferSource':
278
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, getSegmentFormatInLinkFormat(targetFormat)), sourceFormat);
279
+ case 'keepSourceEmphasisFormat':
280
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, getFormatWithoutSegmentFormat(sourceFormat)), getSegmentFormatInLinkFormat(targetFormat)), getSemanticFormat(sourceFormat)), getHyperlinkTextColor(sourceFormat));
281
+ case 'preferTarget':
282
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, sourceFormat), getSegmentFormatInLinkFormat(targetFormat));
283
+ }
277
284
  }
278
285
  function mergeSegmentFormat(applyDefaultFormatOption, targetFormat, sourceFormat) {
279
- return applyDefaultFormatOption == 'mergeAll'
280
- ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, targetFormat), sourceFormat) : (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, getFormatWithoutSegmentFormat(sourceFormat)), targetFormat), getSemanticFormat(sourceFormat));
286
+ switch (applyDefaultFormatOption) {
287
+ case 'mergeAll':
288
+ case 'preferSource':
289
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, targetFormat), sourceFormat);
290
+ case 'preferTarget':
291
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, sourceFormat), targetFormat);
292
+ case 'keepSourceEmphasisFormat':
293
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, getFormatWithoutSegmentFormat(sourceFormat)), targetFormat), getSemanticFormat(sourceFormat));
294
+ }
281
295
  }
282
296
  function getSemanticFormat(segmentFormat) {
283
297
  var result = {};
@@ -1 +1 @@
1
- {"version":3,"file":"mergeModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/mergeModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { addBlock } from '../common/addBlock';\nimport { addSegment } from '../common/addSegment';\nimport { applyTableFormat } from './applyTableFormat';\nimport { createListItem } from '../creators/createListItem';\nimport { createParagraph } from '../creators/createParagraph';\nimport { createSelectionMarker } from '../creators/createSelectionMarker';\nimport { createTableCell } from '../creators/createTableCell';\nimport { deleteSelection } from './deleteSelection';\nimport { EmptySegmentFormat } from '../../constants/EmptySegmentFormat';\nimport { getClosestAncestorBlockGroupIndex } from './getClosestAncestorBlockGroupIndex';\nimport { getObjectKeys } from '../..//domUtils/getObjectKeys';\nimport { mutateBlock } from '../common/mutate';\nimport { normalizeContentModel } from '../common/normalizeContentModel';\nimport { normalizeTable } from './normalizeTable';\nimport type {\n ContentModelBlock,\n ContentModelBlockFormat,\n ContentModelDocument,\n ContentModelHyperLinkFormat,\n ContentModelListItem,\n ContentModelParagraph,\n ContentModelSegmentFormat,\n ContentModelTable,\n FormatContentModelContext,\n InsertPoint,\n MergeModelOption,\n ReadonlyContentModelBlock,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelDocument,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst HeadingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\nconst KeysOfSegmentFormat = getObjectKeys(EmptySegmentFormat);\n\n/**\n * Merge source model into target mode\n * @param target Target Content Model that will merge content into\n * @param source Source Content Model will be merged to target model\n * @param context Format context. When call this function inside formatContentModel, provide this context so that formatContentModel will do extra handling to the result\n * @param options More options, see MergeModelOption\n * @returns Insert point after merge, or null if there is no insert point\n */\nexport function mergeModel(\n target: ReadonlyContentModelDocument,\n source: ContentModelDocument,\n context?: FormatContentModelContext,\n options?: MergeModelOption\n): InsertPoint | null {\n const insertPosition =\n options?.insertPosition ?? deleteSelection(target, [], context).insertPoint;\n\n const { addParagraphAfterMergedContent, mergeFormat, mergeTable } = options || {};\n\n if (addParagraphAfterMergedContent && !mergeTable) {\n const { paragraph, marker } = insertPosition || {};\n const newPara = createParagraph(false /* isImplicit */, paragraph?.format, marker?.format);\n addBlock(source, newPara);\n }\n\n if (insertPosition) {\n if (mergeFormat && mergeFormat != 'none') {\n const newFormat: ContentModelSegmentFormat = {\n ...(target.format || {}),\n ...insertPosition.marker.format,\n };\n\n applyDefaultFormat(source, newFormat, mergeFormat);\n }\n\n for (let i = 0; i < source.blocks.length; i++) {\n const block = source.blocks[i];\n\n switch (block.blockType) {\n case 'Paragraph':\n mergeParagraph(insertPosition, block, i == 0, context, options);\n break;\n\n case 'Divider':\n insertBlock(insertPosition, block);\n break;\n\n case 'Entity':\n insertBlock(insertPosition, block);\n context?.newEntities.push(block);\n break;\n\n case 'Table':\n if (source.blocks.length == 1 && mergeTable) {\n mergeTables(insertPosition, block, source);\n } else {\n insertBlock(insertPosition, block);\n }\n break;\n\n case 'BlockGroup':\n switch (block.blockGroupType) {\n case 'General':\n case 'FormatContainer':\n insertBlock(insertPosition, block);\n break;\n case 'ListItem':\n mergeList(insertPosition, block);\n break;\n }\n break;\n }\n }\n }\n\n normalizeContentModel(target);\n\n return insertPosition;\n}\n\nfunction mergeParagraph(\n markerPosition: InsertPoint,\n newPara: ContentModelParagraph,\n mergeToCurrentParagraph: boolean,\n context?: FormatContentModelContext,\n option?: MergeModelOption\n) {\n const { paragraph, marker } = markerPosition;\n const newParagraph = mergeToCurrentParagraph\n ? paragraph\n : splitParagraph(markerPosition, newPara.format);\n const segmentIndex = newParagraph.segments.indexOf(marker);\n\n if (option?.mergeFormat == 'none' && mergeToCurrentParagraph) {\n newParagraph.segments.forEach(segment => {\n segment.format = { ...(newParagraph.segmentFormat || {}), ...segment.format };\n });\n delete newParagraph.segmentFormat;\n }\n if (segmentIndex >= 0) {\n for (let i = 0; i < newPara.segments.length; i++) {\n const segment = newPara.segments[i];\n\n newParagraph.segments.splice(segmentIndex + i, 0, segment);\n\n if (context) {\n if (segment.segmentType == 'Entity') {\n context.newEntities.push(segment);\n }\n\n if (segment.segmentType == 'Image') {\n context.newImages.push(segment);\n }\n }\n }\n }\n\n if (newPara.decorator) {\n newParagraph.decorator = { ...newPara.decorator };\n if (HeadingTags.indexOf(newParagraph.decorator.tagName) > -1) {\n const sourceKeys: (keyof ContentModelSegmentFormat)[] = getObjectKeys(\n newParagraph.decorator.format\n );\n const segmentDecoratorKeys: (keyof ContentModelSegmentFormat)[] = getObjectKeys(\n newParagraph.segmentFormat || {}\n );\n\n sourceKeys.forEach(key => {\n if (segmentDecoratorKeys.indexOf(key) > -1) {\n delete newParagraph.segmentFormat?.[key];\n }\n });\n }\n }\n\n if (!mergeToCurrentParagraph) {\n newParagraph.format = newPara.format;\n } else {\n newParagraph.format = {\n ...newParagraph.format,\n ...newPara.format,\n };\n }\n}\n\nfunction mergeTables(\n markerPosition: InsertPoint,\n newTable: ContentModelTable,\n source: ContentModelDocument\n) {\n const { tableContext, marker } = markerPosition;\n\n if (tableContext && source.blocks.length == 1 && source.blocks[0] == newTable) {\n const { table: readonlyTable, colIndex, rowIndex } = tableContext;\n const table = mutateBlock(readonlyTable);\n\n for (let i = 0; i < newTable.rows.length; i++) {\n for (let j = 0; j < newTable.rows[i].cells.length; j++) {\n const newCell = newTable.rows[i].cells[j];\n\n if (i == 0 && colIndex + j >= table.rows[0].cells.length) {\n for (let k = 0; k < table.rows.length; k++) {\n const leftCell = table.rows[k]?.cells[colIndex + j - 1];\n table.rows[k].cells[colIndex + j] = createTableCell(\n false /*spanLeft*/,\n false /*spanAbove*/,\n leftCell?.isHeader,\n leftCell?.format\n );\n }\n }\n\n if (j == 0 && rowIndex + i >= table.rows.length) {\n if (!table.rows[rowIndex + i]) {\n table.rows[rowIndex + i] = {\n cells: [],\n format: {},\n height: 0,\n };\n }\n\n for (let k = 0; k < table.rows[rowIndex].cells.length; k++) {\n const aboveCell = table.rows[rowIndex + i - 1]?.cells[k];\n table.rows[rowIndex + i].cells[k] = createTableCell(\n false /*spanLeft*/,\n false /*spanAbove*/,\n false /*isHeader*/,\n aboveCell?.format\n );\n }\n }\n\n const oldCell = table.rows[rowIndex + i].cells[colIndex + j];\n table.rows[rowIndex + i].cells[colIndex + j] = newCell;\n\n if (i == 0 && j == 0) {\n const newMarker = createSelectionMarker(marker.format);\n const newPara = addSegment(newCell, newMarker);\n\n if (markerPosition.path[0] == oldCell) {\n // Update insert point to match the change result\n markerPosition.path[0] = newCell;\n markerPosition.marker = newMarker;\n markerPosition.paragraph = newPara;\n }\n }\n }\n }\n\n normalizeTable(table, markerPosition.marker.format);\n applyTableFormat(table, undefined /*newFormat*/, true /*keepCellShade*/);\n } else {\n insertBlock(markerPosition, newTable);\n }\n}\n\nfunction mergeList(markerPosition: InsertPoint, newList: ContentModelListItem) {\n splitParagraph(markerPosition, newList.format);\n\n const { path, paragraph } = markerPosition;\n\n const listItemIndex = getClosestAncestorBlockGroupIndex(path, ['ListItem']);\n const listItem = path[listItemIndex] as ContentModelListItem;\n const listParent = path[listItemIndex + 1]; // It is ok here when index is -1, that means there is no list and we just insert a new paragraph and use path[0] as its parent\n const blockIndex = listParent.blocks.indexOf(listItem || paragraph);\n\n if (blockIndex >= 0) {\n mutateBlock(listParent).blocks.splice(blockIndex, 0, newList);\n }\n\n if (listItem) {\n listItem?.levels.forEach((level, i) => {\n newList.levels[i] = { ...level };\n });\n }\n}\n\nfunction splitParagraph(markerPosition: InsertPoint, newParaFormat: ContentModelBlockFormat) {\n const { paragraph, marker, path } = markerPosition;\n const segmentIndex = paragraph.segments.indexOf(marker);\n const paraIndex = path[0].blocks.indexOf(paragraph);\n const newParagraph: ShallowMutableContentModelParagraph = createParagraph(\n false /*isImplicit*/,\n { ...paragraph.format, ...newParaFormat },\n paragraph.segmentFormat\n );\n\n if (segmentIndex >= 0) {\n newParagraph.segments = paragraph.segments.splice(segmentIndex);\n }\n\n if (paraIndex >= 0) {\n mutateBlock(path[0]).blocks.splice(paraIndex + 1, 0, newParagraph);\n }\n\n const listItemIndex = getClosestAncestorBlockGroupIndex(\n path,\n ['ListItem'],\n ['FormatContainer', 'TableCell']\n );\n const listItem = path[listItemIndex] as ContentModelListItem;\n\n if (listItem) {\n const listParent = listItemIndex >= 0 ? path[listItemIndex + 1] : null;\n const blockIndex = listParent ? listParent.blocks.indexOf(listItem) : -1;\n\n if (blockIndex >= 0 && listParent) {\n const newListItem = createListItem(listItem.levels, listItem.formatHolder.format);\n\n if (paraIndex >= 0) {\n newListItem.blocks = listItem.blocks.splice(paraIndex + 1);\n }\n\n if (blockIndex >= 0) {\n mutateBlock(listParent).blocks.splice(blockIndex + 1, 0, newListItem);\n }\n\n path[listItemIndex] = newListItem;\n }\n }\n\n markerPosition.paragraph = newParagraph;\n\n return newParagraph;\n}\n\nfunction insertBlock(markerPosition: InsertPoint, block: ContentModelBlock) {\n const { path } = markerPosition;\n const newParaFormat = block.blockType !== 'Paragraph' ? {} : block.format;\n const newPara = splitParagraph(markerPosition, newParaFormat);\n const blockIndex = path[0].blocks.indexOf(newPara);\n\n if (blockIndex >= 0) {\n mutateBlock(path[0]).blocks.splice(blockIndex, 0, block);\n }\n}\n\nfunction applyDefaultFormat(\n group: ReadonlyContentModelBlockGroup,\n format: ContentModelSegmentFormat,\n applyDefaultFormatOption: 'mergeAll' | 'keepSourceEmphasisFormat'\n) {\n group.blocks.forEach(block => {\n mergeBlockFormat(applyDefaultFormatOption, block);\n\n switch (block.blockType) {\n case 'BlockGroup':\n if (block.blockGroupType == 'ListItem') {\n mutateBlock(block).formatHolder.format = mergeSegmentFormat(\n applyDefaultFormatOption,\n format,\n block.formatHolder.format\n );\n }\n applyDefaultFormat(block, format, applyDefaultFormatOption);\n break;\n\n case 'Table':\n block.rows.forEach(row =>\n row.cells.forEach(cell => {\n applyDefaultFormat(cell, format, applyDefaultFormatOption);\n })\n );\n break;\n\n case 'Paragraph':\n const paragraphFormat = block.decorator?.format || {};\n const paragraph = mutateBlock(block);\n\n paragraph.segments.forEach(segment => {\n if (segment.segmentType == 'General') {\n applyDefaultFormat(segment, format, applyDefaultFormatOption);\n }\n\n segment.format = mergeSegmentFormat(applyDefaultFormatOption, format, {\n ...paragraphFormat,\n ...segment.format,\n });\n\n if (segment.link) {\n segment.link.format = mergeLinkFormat(\n applyDefaultFormatOption,\n format,\n segment.link.format\n );\n }\n });\n\n if (applyDefaultFormatOption === 'keepSourceEmphasisFormat') {\n delete paragraph.decorator;\n }\n break;\n }\n });\n}\n\nfunction mergeBlockFormat(applyDefaultFormatOption: string, block: ReadonlyContentModelBlock) {\n if (applyDefaultFormatOption == 'keepSourceEmphasisFormat' && block.format.backgroundColor) {\n delete mutateBlock(block).format.backgroundColor;\n }\n}\n\n/**\n * Hyperlink format type definition only contains backgroundColor and underline.\n * So create a minimum object with the styles supported in Hyperlink to be used in merge.\n */\nfunction getSegmentFormatInLinkFormat(\n targetFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n const result: ContentModelHyperLinkFormat = {};\n if (targetFormat.backgroundColor) {\n result.backgroundColor = targetFormat.backgroundColor;\n }\n if (targetFormat.underline) {\n result.underline = targetFormat.underline;\n }\n\n return result;\n}\n\nfunction mergeLinkFormat(\n applyDefaultFormatOption: 'mergeAll' | 'keepSourceEmphasisFormat',\n targetFormat: ContentModelSegmentFormat,\n sourceFormat: ContentModelHyperLinkFormat\n) {\n return applyDefaultFormatOption == 'mergeAll'\n ? { ...getSegmentFormatInLinkFormat(targetFormat), ...sourceFormat }\n : {\n // Hyperlink segment format contains other attributes such as LinkFormat\n // so we have to retain them\n ...getFormatWithoutSegmentFormat(sourceFormat),\n // Link format only have Text color, background color, Underline, but only\n // text color + background color should be merged from the target\n ...getSegmentFormatInLinkFormat(targetFormat),\n // Get the semantic format of the source\n ...getSemanticFormat(sourceFormat),\n // The text color of the hyperlink should not be merged and\n // we should always retain the source text color\n ...getHyperlinkTextColor(sourceFormat),\n };\n}\n\nfunction mergeSegmentFormat(\n applyDefaultFormatOption: 'mergeAll' | 'keepSourceEmphasisFormat',\n targetFormat: ContentModelSegmentFormat,\n sourceFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n return applyDefaultFormatOption == 'mergeAll'\n ? { ...targetFormat, ...sourceFormat }\n : {\n ...getFormatWithoutSegmentFormat(sourceFormat),\n ...targetFormat,\n ...getSemanticFormat(sourceFormat),\n };\n}\n\nfunction getSemanticFormat(segmentFormat: ContentModelSegmentFormat): ContentModelSegmentFormat {\n const result: ContentModelSegmentFormat = {};\n\n const { fontWeight, italic, underline } = segmentFormat;\n\n if (fontWeight && fontWeight != 'normal') {\n result.fontWeight = fontWeight;\n }\n if (italic) {\n result.italic = italic;\n }\n if (underline) {\n result.underline = underline;\n }\n\n return result;\n}\n\n/**\n * Segment format can also contain other type of metadata, for example in Images/Hyperlink,\n * we want to preserve these properties when merging format\n */\nfunction getFormatWithoutSegmentFormat(\n sourceFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n const resultFormat = {\n ...sourceFormat,\n };\n KeysOfSegmentFormat.forEach(key => delete resultFormat[key]);\n return resultFormat;\n}\nfunction getHyperlinkTextColor(sourceFormat: ContentModelHyperLinkFormat) {\n const result: ContentModelHyperLinkFormat = {};\n if (sourceFormat.textColor) {\n result.textColor = sourceFormat.textColor;\n }\n\n return result;\n}\n"]}
1
+ {"version":3,"file":"mergeModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/mergeModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { addBlock } from '../common/addBlock';\nimport { addSegment } from '../common/addSegment';\nimport { applyTableFormat } from './applyTableFormat';\nimport { createListItem } from '../creators/createListItem';\nimport { createParagraph } from '../creators/createParagraph';\nimport { createSelectionMarker } from '../creators/createSelectionMarker';\nimport { createTableCell } from '../creators/createTableCell';\nimport { deleteSelection } from './deleteSelection';\nimport { EmptySegmentFormat } from '../../constants/EmptySegmentFormat';\nimport { getClosestAncestorBlockGroupIndex } from './getClosestAncestorBlockGroupIndex';\nimport { getObjectKeys } from '../..//domUtils/getObjectKeys';\nimport { mutateBlock } from '../common/mutate';\nimport { normalizeContentModel } from '../common/normalizeContentModel';\nimport { normalizeTable } from './normalizeTable';\nimport type {\n ContentModelBlock,\n ContentModelBlockFormat,\n ContentModelDocument,\n ContentModelHyperLinkFormat,\n ContentModelListItem,\n ContentModelParagraph,\n ContentModelSegmentFormat,\n ContentModelTable,\n FormatContentModelContext,\n InsertPoint,\n MergeModelOption,\n ReadonlyContentModelBlock,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelDocument,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst HeadingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\nconst KeysOfSegmentFormat = getObjectKeys(EmptySegmentFormat);\n\ntype MergeFormatTypes = 'mergeAll' | 'keepSourceEmphasisFormat' | 'preferSource' | 'preferTarget';\n\n/**\n * Merge source model into target mode\n * @param target Target Content Model that will merge content into\n * @param source Source Content Model will be merged to target model\n * @param context Format context. When call this function inside formatContentModel, provide this context so that formatContentModel will do extra handling to the result\n * @param options More options, see MergeModelOption\n * @returns Insert point after merge, or null if there is no insert point\n */\nexport function mergeModel(\n target: ReadonlyContentModelDocument,\n source: ContentModelDocument,\n context?: FormatContentModelContext,\n options?: MergeModelOption\n): InsertPoint | null {\n const insertPosition =\n options?.insertPosition ?? deleteSelection(target, [], context).insertPoint;\n\n const { addParagraphAfterMergedContent, mergeFormat, mergeTable } = options || {};\n\n if (addParagraphAfterMergedContent && !mergeTable) {\n const { paragraph, marker } = insertPosition || {};\n const newPara = createParagraph(false /* isImplicit */, paragraph?.format, marker?.format);\n addBlock(source, newPara);\n }\n\n if (insertPosition) {\n if (mergeFormat && mergeFormat != 'none') {\n const newFormat: ContentModelSegmentFormat = {\n ...(target.format || {}),\n ...insertPosition.marker.format,\n };\n\n applyDefaultFormat(source, newFormat, mergeFormat);\n }\n\n for (let i = 0; i < source.blocks.length; i++) {\n const block = source.blocks[i];\n\n switch (block.blockType) {\n case 'Paragraph':\n mergeParagraph(insertPosition, block, i == 0, context, options);\n break;\n\n case 'Divider':\n insertBlock(insertPosition, block);\n break;\n\n case 'Entity':\n insertBlock(insertPosition, block);\n context?.newEntities.push(block);\n break;\n\n case 'Table':\n if (source.blocks.length == 1 && mergeTable) {\n mergeTables(insertPosition, block, source);\n } else {\n insertBlock(insertPosition, block);\n }\n break;\n\n case 'BlockGroup':\n switch (block.blockGroupType) {\n case 'General':\n case 'FormatContainer':\n insertBlock(insertPosition, block);\n break;\n case 'ListItem':\n mergeList(insertPosition, block);\n break;\n }\n break;\n }\n }\n }\n\n normalizeContentModel(target);\n\n return insertPosition;\n}\n\nfunction mergeParagraph(\n markerPosition: InsertPoint,\n newPara: ContentModelParagraph,\n mergeToCurrentParagraph: boolean,\n context?: FormatContentModelContext,\n option?: MergeModelOption\n) {\n const { paragraph, marker } = markerPosition;\n const newParagraph = mergeToCurrentParagraph\n ? paragraph\n : splitParagraph(markerPosition, newPara.format);\n const segmentIndex = newParagraph.segments.indexOf(marker);\n\n if (option?.mergeFormat == 'none' && mergeToCurrentParagraph) {\n newParagraph.segments.forEach(segment => {\n segment.format = { ...(newParagraph.segmentFormat || {}), ...segment.format };\n });\n delete newParagraph.segmentFormat;\n }\n if (segmentIndex >= 0) {\n for (let i = 0; i < newPara.segments.length; i++) {\n const segment = newPara.segments[i];\n\n newParagraph.segments.splice(segmentIndex + i, 0, segment);\n\n if (context) {\n if (segment.segmentType == 'Entity') {\n context.newEntities.push(segment);\n }\n\n if (segment.segmentType == 'Image') {\n context.newImages.push(segment);\n }\n }\n }\n }\n\n if (newPara.decorator) {\n newParagraph.decorator = { ...newPara.decorator };\n if (HeadingTags.indexOf(newParagraph.decorator.tagName) > -1) {\n const sourceKeys: (keyof ContentModelSegmentFormat)[] = getObjectKeys(\n newParagraph.decorator.format\n );\n const segmentDecoratorKeys: (keyof ContentModelSegmentFormat)[] = getObjectKeys(\n newParagraph.segmentFormat || {}\n );\n\n sourceKeys.forEach(key => {\n if (segmentDecoratorKeys.indexOf(key) > -1) {\n delete newParagraph.segmentFormat?.[key];\n }\n });\n }\n }\n\n if (!mergeToCurrentParagraph) {\n newParagraph.format = newPara.format;\n } else {\n newParagraph.format = {\n ...newParagraph.format,\n ...newPara.format,\n };\n }\n}\n\nfunction mergeTables(\n markerPosition: InsertPoint,\n newTable: ContentModelTable,\n source: ContentModelDocument\n) {\n const { tableContext, marker } = markerPosition;\n\n if (tableContext && source.blocks.length == 1 && source.blocks[0] == newTable) {\n const { table: readonlyTable, colIndex, rowIndex } = tableContext;\n const table = mutateBlock(readonlyTable);\n\n for (let i = 0; i < newTable.rows.length; i++) {\n for (let j = 0; j < newTable.rows[i].cells.length; j++) {\n const newCell = newTable.rows[i].cells[j];\n\n if (i == 0 && colIndex + j >= table.rows[0].cells.length) {\n for (let k = 0; k < table.rows.length; k++) {\n const leftCell = table.rows[k]?.cells[colIndex + j - 1];\n table.rows[k].cells[colIndex + j] = createTableCell(\n false /*spanLeft*/,\n false /*spanAbove*/,\n leftCell?.isHeader,\n leftCell?.format\n );\n }\n }\n\n if (j == 0 && rowIndex + i >= table.rows.length) {\n if (!table.rows[rowIndex + i]) {\n table.rows[rowIndex + i] = {\n cells: [],\n format: {},\n height: 0,\n };\n }\n\n for (let k = 0; k < table.rows[rowIndex].cells.length; k++) {\n const aboveCell = table.rows[rowIndex + i - 1]?.cells[k];\n table.rows[rowIndex + i].cells[k] = createTableCell(\n false /*spanLeft*/,\n false /*spanAbove*/,\n false /*isHeader*/,\n aboveCell?.format\n );\n }\n }\n\n const oldCell = table.rows[rowIndex + i].cells[colIndex + j];\n table.rows[rowIndex + i].cells[colIndex + j] = newCell;\n\n if (i == 0 && j == 0) {\n const newMarker = createSelectionMarker(marker.format);\n const newPara = addSegment(newCell, newMarker);\n\n if (markerPosition.path[0] == oldCell) {\n // Update insert point to match the change result\n markerPosition.path[0] = newCell;\n markerPosition.marker = newMarker;\n markerPosition.paragraph = newPara;\n }\n }\n }\n }\n\n normalizeTable(table, markerPosition.marker.format);\n applyTableFormat(table, undefined /*newFormat*/, true /*keepCellShade*/);\n } else {\n insertBlock(markerPosition, newTable);\n }\n}\n\nfunction mergeList(markerPosition: InsertPoint, newList: ContentModelListItem) {\n splitParagraph(markerPosition, newList.format);\n\n const { path, paragraph } = markerPosition;\n\n const listItemIndex = getClosestAncestorBlockGroupIndex(path, ['ListItem']);\n const listItem = path[listItemIndex] as ContentModelListItem;\n const listParent = path[listItemIndex + 1]; // It is ok here when index is -1, that means there is no list and we just insert a new paragraph and use path[0] as its parent\n const blockIndex = listParent.blocks.indexOf(listItem || paragraph);\n\n if (blockIndex >= 0) {\n mutateBlock(listParent).blocks.splice(blockIndex, 0, newList);\n }\n\n if (listItem) {\n listItem?.levels.forEach((level, i) => {\n newList.levels[i] = { ...level };\n });\n }\n}\n\nfunction splitParagraph(markerPosition: InsertPoint, newParaFormat: ContentModelBlockFormat) {\n const { paragraph, marker, path } = markerPosition;\n const segmentIndex = paragraph.segments.indexOf(marker);\n const paraIndex = path[0].blocks.indexOf(paragraph);\n const newParagraph: ShallowMutableContentModelParagraph = createParagraph(\n false /*isImplicit*/,\n { ...paragraph.format, ...newParaFormat },\n paragraph.segmentFormat\n );\n\n if (segmentIndex >= 0) {\n newParagraph.segments = paragraph.segments.splice(segmentIndex);\n }\n\n if (paraIndex >= 0) {\n mutateBlock(path[0]).blocks.splice(paraIndex + 1, 0, newParagraph);\n }\n\n const listItemIndex = getClosestAncestorBlockGroupIndex(\n path,\n ['ListItem'],\n ['FormatContainer', 'TableCell']\n );\n const listItem = path[listItemIndex] as ContentModelListItem;\n\n if (listItem) {\n const listParent = listItemIndex >= 0 ? path[listItemIndex + 1] : null;\n const blockIndex = listParent ? listParent.blocks.indexOf(listItem) : -1;\n\n if (blockIndex >= 0 && listParent) {\n const newListItem = createListItem(listItem.levels, listItem.formatHolder.format);\n\n if (paraIndex >= 0) {\n newListItem.blocks = listItem.blocks.splice(paraIndex + 1);\n }\n\n if (blockIndex >= 0) {\n mutateBlock(listParent).blocks.splice(blockIndex + 1, 0, newListItem);\n }\n\n path[listItemIndex] = newListItem;\n }\n }\n\n markerPosition.paragraph = newParagraph;\n\n return newParagraph;\n}\n\nfunction insertBlock(markerPosition: InsertPoint, block: ContentModelBlock) {\n const { path } = markerPosition;\n const newParaFormat = block.blockType !== 'Paragraph' ? {} : block.format;\n const newPara = splitParagraph(markerPosition, newParaFormat);\n const blockIndex = path[0].blocks.indexOf(newPara);\n\n if (blockIndex >= 0) {\n mutateBlock(path[0]).blocks.splice(blockIndex, 0, block);\n }\n}\n\nfunction applyDefaultFormat(\n group: ReadonlyContentModelBlockGroup,\n format: ContentModelSegmentFormat,\n applyDefaultFormatOption: MergeFormatTypes\n) {\n group.blocks.forEach(block => {\n mergeBlockFormat(applyDefaultFormatOption, block);\n\n switch (block.blockType) {\n case 'BlockGroup':\n if (block.blockGroupType == 'ListItem') {\n mutateBlock(block).formatHolder.format = mergeSegmentFormat(\n applyDefaultFormatOption,\n format,\n block.formatHolder.format\n );\n }\n applyDefaultFormat(block, format, applyDefaultFormatOption);\n break;\n\n case 'Table':\n block.rows.forEach(row =>\n row.cells.forEach(cell => {\n applyDefaultFormat(cell, format, applyDefaultFormatOption);\n })\n );\n break;\n\n case 'Paragraph':\n const paragraphFormat = block.decorator?.format || {};\n const paragraph = mutateBlock(block);\n\n paragraph.segments.forEach(segment => {\n if (segment.segmentType == 'General') {\n applyDefaultFormat(segment, format, applyDefaultFormatOption);\n }\n\n segment.format = mergeSegmentFormat(applyDefaultFormatOption, format, {\n ...paragraphFormat,\n ...segment.format,\n });\n\n if (segment.link) {\n segment.link.format = mergeLinkFormat(\n applyDefaultFormatOption,\n format,\n segment.link.format\n );\n }\n });\n\n if (applyDefaultFormatOption === 'keepSourceEmphasisFormat') {\n delete paragraph.decorator;\n }\n break;\n }\n });\n}\n\nfunction mergeBlockFormat(applyDefaultFormatOption: string, block: ReadonlyContentModelBlock) {\n if (applyDefaultFormatOption == 'keepSourceEmphasisFormat' && block.format.backgroundColor) {\n delete mutateBlock(block).format.backgroundColor;\n }\n}\n\n/**\n * Hyperlink format type definition only contains backgroundColor and underline.\n * So create a minimum object with the styles supported in Hyperlink to be used in merge.\n */\nfunction getSegmentFormatInLinkFormat(\n targetFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n const result: ContentModelHyperLinkFormat = {};\n if (targetFormat.backgroundColor) {\n result.backgroundColor = targetFormat.backgroundColor;\n }\n if (targetFormat.underline) {\n result.underline = targetFormat.underline;\n }\n\n return result;\n}\n\nfunction mergeLinkFormat(\n applyDefaultFormatOption: MergeFormatTypes,\n targetFormat: ContentModelSegmentFormat,\n sourceFormat: ContentModelHyperLinkFormat\n) {\n switch (applyDefaultFormatOption) {\n case 'mergeAll':\n case 'preferSource':\n return { ...getSegmentFormatInLinkFormat(targetFormat), ...sourceFormat };\n case 'keepSourceEmphasisFormat':\n return {\n // Hyperlink segment format contains other attributes such as LinkFormat\n // so we have to retain them\n ...getFormatWithoutSegmentFormat(sourceFormat),\n // Link format only have Text color, background color, Underline, but only\n // text color + background color should be merged from the target\n ...getSegmentFormatInLinkFormat(targetFormat),\n // Get the semantic format of the source\n ...getSemanticFormat(sourceFormat),\n // The text color of the hyperlink should not be merged and\n // we should always retain the source text color\n ...getHyperlinkTextColor(sourceFormat),\n };\n case 'preferTarget':\n return { ...sourceFormat, ...getSegmentFormatInLinkFormat(targetFormat) };\n }\n}\n\nfunction mergeSegmentFormat(\n applyDefaultFormatOption: MergeFormatTypes,\n targetFormat: ContentModelSegmentFormat,\n sourceFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n switch (applyDefaultFormatOption) {\n case 'mergeAll':\n case 'preferSource':\n return { ...targetFormat, ...sourceFormat };\n case 'preferTarget':\n return { ...sourceFormat, ...targetFormat };\n case 'keepSourceEmphasisFormat':\n return {\n ...getFormatWithoutSegmentFormat(sourceFormat),\n ...targetFormat,\n ...getSemanticFormat(sourceFormat),\n };\n }\n}\n\nfunction getSemanticFormat(segmentFormat: ContentModelSegmentFormat): ContentModelSegmentFormat {\n const result: ContentModelSegmentFormat = {};\n\n const { fontWeight, italic, underline } = segmentFormat;\n\n if (fontWeight && fontWeight != 'normal') {\n result.fontWeight = fontWeight;\n }\n if (italic) {\n result.italic = italic;\n }\n if (underline) {\n result.underline = underline;\n }\n\n return result;\n}\n\n/**\n * Segment format can also contain other type of metadata, for example in Images/Hyperlink,\n * we want to preserve these properties when merging format\n */\nfunction getFormatWithoutSegmentFormat(\n sourceFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n const resultFormat = {\n ...sourceFormat,\n };\n KeysOfSegmentFormat.forEach(key => delete resultFormat[key]);\n return resultFormat;\n}\nfunction getHyperlinkTextColor(sourceFormat: ContentModelHyperLinkFormat) {\n const result: ContentModelHyperLinkFormat = {};\n if (sourceFormat.textColor) {\n result.textColor = sourceFormat.textColor;\n }\n\n return result;\n}\n"]}
@@ -5,12 +5,15 @@ import { directionFormatHandler } from './directionFormatHandler';
5
5
  */
6
6
  export var htmlAlignFormatHandler = {
7
7
  parse: function (format, element, context, defaultStyle) {
8
- directionFormatHandler.parse(format, element, context, defaultStyle);
9
- var htmlAlign = element.getAttribute('align');
10
- if (htmlAlign) {
11
- format.htmlAlign = calcAlign(htmlAlign, format.direction);
12
- delete format.textAlign;
13
- delete context.blockFormat.textAlign;
8
+ // When there is text-align in CSS style on the same element, we should ignore HTML align
9
+ if (!element.style.textAlign) {
10
+ directionFormatHandler.parse(format, element, context, defaultStyle);
11
+ var htmlAlign = element.getAttribute('align');
12
+ if (htmlAlign) {
13
+ format.htmlAlign = calcAlign(htmlAlign, format.direction);
14
+ delete format.textAlign;
15
+ delete context.blockFormat.textAlign;
16
+ }
14
17
  }
15
18
  },
16
19
  apply: function (format, element) {
@@ -1 +1 @@
1
- {"version":3,"file":"htmlAlignFormatHandler.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/formatHandlers/block/htmlAlignFormatHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAQlE;;GAEG;AACH,MAAM,CAAC,IAAM,sBAAsB,GAE/B;IACA,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY;QAC1C,sBAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QAErE,IAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAEhD,IAAI,SAAS,EAAE;YACX,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAC1D,OAAO,MAAM,CAAC,SAAS,CAAC;YACxB,OAAO,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC;SACxC;IACL,CAAC;IACD,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO;QACnB,IAAM,GAAG,GAAkB,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAErE,IAAI,MAAM,CAAC,SAAS,EAAE;YAClB,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;SACnE;IACL,CAAC;CACJ,CAAC","sourcesContent":["import { calcAlign, ResultMap } from '../utils/dir';\nimport { directionFormatHandler } from './directionFormatHandler';\nimport type {\n DirectionFormat,\n HtmlAlignFormat,\n TextAlignFormat,\n} from 'roosterjs-content-model-types';\nimport type { FormatHandler } from '../FormatHandler';\n\n/**\n * @internal\n */\nexport const htmlAlignFormatHandler: FormatHandler<\n DirectionFormat & HtmlAlignFormat & TextAlignFormat\n> = {\n parse: (format, element, context, defaultStyle) => {\n directionFormatHandler.parse(format, element, context, defaultStyle);\n\n const htmlAlign = element.getAttribute('align');\n\n if (htmlAlign) {\n format.htmlAlign = calcAlign(htmlAlign, format.direction);\n delete format.textAlign;\n delete context.blockFormat.textAlign;\n }\n },\n apply: (format, element) => {\n const dir: 'ltr' | 'rtl' = format.direction == 'rtl' ? 'rtl' : 'ltr';\n\n if (format.htmlAlign) {\n element.setAttribute('align', ResultMap[format.htmlAlign][dir]);\n }\n },\n};\n"]}
1
+ {"version":3,"file":"htmlAlignFormatHandler.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/formatHandlers/block/htmlAlignFormatHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAQlE;;GAEG;AACH,MAAM,CAAC,IAAM,sBAAsB,GAE/B;IACA,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY;QAC1C,yFAAyF;QACzF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE;YAC1B,sBAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;YAErE,IAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAEhD,IAAI,SAAS,EAAE;gBACX,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC1D,OAAO,MAAM,CAAC,SAAS,CAAC;gBACxB,OAAO,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC;aACxC;SACJ;IACL,CAAC;IACD,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO;QACnB,IAAM,GAAG,GAAkB,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAErE,IAAI,MAAM,CAAC,SAAS,EAAE;YAClB,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;SACnE;IACL,CAAC;CACJ,CAAC","sourcesContent":["import { calcAlign, ResultMap } from '../utils/dir';\nimport { directionFormatHandler } from './directionFormatHandler';\nimport type {\n DirectionFormat,\n HtmlAlignFormat,\n TextAlignFormat,\n} from 'roosterjs-content-model-types';\nimport type { FormatHandler } from '../FormatHandler';\n\n/**\n * @internal\n */\nexport const htmlAlignFormatHandler: FormatHandler<\n DirectionFormat & HtmlAlignFormat & TextAlignFormat\n> = {\n parse: (format, element, context, defaultStyle) => {\n // When there is text-align in CSS style on the same element, we should ignore HTML align\n if (!element.style.textAlign) {\n directionFormatHandler.parse(format, element, context, defaultStyle);\n\n const htmlAlign = element.getAttribute('align');\n\n if (htmlAlign) {\n format.htmlAlign = calcAlign(htmlAlign, format.direction);\n delete format.textAlign;\n delete context.blockFormat.textAlign;\n }\n }\n },\n apply: (format, element) => {\n const dir: 'ltr' | 'rtl' = format.direction == 'rtl' ? 'rtl' : 'ltr';\n\n if (format.htmlAlign) {\n element.setAttribute('align', ResultMap[format.htmlAlign][dir]);\n }\n },\n};\n"]}
@@ -38,7 +38,7 @@ export function deleteExpandedSelection(model, formatContext) {
38
38
  // so we can put cursor here after delete
39
39
  paragraph = block_1;
40
40
  insertMarkerIndex = indexes[0];
41
- markerFormat = getSegmentTextFormat(segments[0]);
41
+ markerFormat = getSegmentTextFormat(segments[0], true /*includingBIU*/);
42
42
  context.lastParagraph = paragraph;
43
43
  context.lastTableContext = tableContext;
44
44
  segments.forEach(function (segment, i) {
@@ -1 +1 @@
1
- {"version":3,"file":"deleteExpandedSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/deleteExpandedSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { createBr } from '../creators/createBr';\nimport { createParagraph } from '../creators/createParagraph';\nimport { createSelectionMarker } from '../creators/createSelectionMarker';\nimport { deleteBlock } from './deleteBlock';\nimport { deleteSegment } from './deleteSegment';\nimport { getSegmentTextFormat } from './getSegmentTextFormat';\nimport { iterateSelections } from '../selection/iterateSelections';\nimport { mutateBlock, mutateSegments } from '../common/mutate';\nimport { setParagraphNotImplicit } from '../block/setParagraphNotImplicit';\nimport type {\n ContentModelSelectionMarker,\n DeleteSelectionContext,\n FormatContentModelContext,\n InsertPoint,\n IterateSelectionsOption,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelDocument,\n ReadonlyTableSelectionContext,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst DeleteSelectionIteratingOptions: IterateSelectionsOption = {\n contentUnderSelectedTableCell: 'ignoreForTableOrCell', // When a table cell is selected, we replace all content for this cell, so no need to go into its content\n contentUnderSelectedGeneralElement: 'generalElementOnly', // When a general element is selected, we replace the whole element so no need to go into its content\n includeListFormatHolder: 'never',\n};\n\n/**\n * @internal\n * Iterate the model and find all selected content if any, delete them, and keep/create an insert point\n * at the first deleted position so that we know where to put cursor to after delete\n */\nexport function deleteExpandedSelection(\n model: ReadonlyContentModelDocument,\n formatContext?: FormatContentModelContext\n): DeleteSelectionContext {\n const context: DeleteSelectionContext = {\n deleteResult: 'notDeleted',\n insertPoint: null,\n formatContext,\n };\n\n iterateSelections(\n model,\n (path, tableContext, readonlyBlock, readonlySegments) => {\n // Set paragraph, format and index for default position where we will put cursor to.\n // Later we can overwrite these info when process the selections\n let paragraph: ShallowMutableContentModelParagraph = createParagraph(\n true /*implicit*/,\n undefined /*blockFormat*/,\n model.format\n );\n let markerFormat = model.format;\n let insertMarkerIndex = 0;\n\n if (readonlySegments && readonlyBlock?.blockType == 'Paragraph') {\n const [block, segments, indexes] = mutateSegments(readonlyBlock, readonlySegments);\n\n // Delete segments inside a paragraph\n if (segments[0]) {\n // Now that we have found a paragraph with selections, we can overwrite the default paragraph with this one\n // so we can put cursor here after delete\n paragraph = block;\n insertMarkerIndex = indexes[0];\n markerFormat = getSegmentTextFormat(segments[0]);\n\n context.lastParagraph = paragraph;\n context.lastTableContext = tableContext;\n\n segments.forEach((segment, i) => {\n if (\n i == 0 &&\n !context.insertPoint &&\n segment.segmentType == 'SelectionMarker'\n ) {\n // First time we hit a selection and it is a selection marker, just mark it and not need to delete\n // because this is possible a collapsed selection, then it will be handled later\n context.insertPoint = createInsertPoint(\n segment,\n block,\n path,\n tableContext\n );\n } else if (deleteSegment(block, segment, context.formatContext)) {\n context.deleteResult = 'range';\n }\n });\n\n // Since we are operating on this paragraph and it possible we delete everything from this paragraph,\n // Need to make it \"not implicit\" so that it will always have a container element, so that when we do normalization\n // of this paragraph, a BR can be added if need\n if (context.deleteResult == 'range') {\n setParagraphNotImplicit(block);\n }\n }\n } else if (readonlyBlock) {\n // Delete a whole block (divider, table, ...)\n const blocks = mutateBlock(path[0]).blocks;\n\n if (deleteBlock(blocks, readonlyBlock, paragraph, context.formatContext)) {\n context.deleteResult = 'range';\n }\n } else if (tableContext) {\n // Delete a whole table cell\n const { table, colIndex, rowIndex } = tableContext;\n const mutableTable = mutateBlock(table);\n const row = mutableTable.rows[rowIndex];\n const cell = mutateBlock(row.cells[colIndex]);\n\n path = [cell, ...path];\n paragraph.segments.push(createBr(model.format));\n cell.blocks = [paragraph];\n\n context.deleteResult = 'range';\n }\n\n if (!context.insertPoint) {\n // If we have not got a insert point after delete and we have a paragraph to put an insert point in, create insert point now\n const marker = createSelectionMarker(markerFormat);\n\n setParagraphNotImplicit(paragraph);\n paragraph.segments.splice(insertMarkerIndex, 0, marker);\n context.insertPoint = createInsertPoint(marker, paragraph, path, tableContext);\n }\n },\n DeleteSelectionIteratingOptions\n );\n\n return context;\n}\n\nfunction createInsertPoint(\n marker: ContentModelSelectionMarker,\n paragraph: ShallowMutableContentModelParagraph,\n path: ReadonlyContentModelBlockGroup[],\n tableContext: ReadonlyTableSelectionContext | undefined\n): InsertPoint {\n return {\n marker,\n paragraph,\n path,\n tableContext,\n };\n}\n"]}
1
+ {"version":3,"file":"deleteExpandedSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/deleteExpandedSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { createBr } from '../creators/createBr';\nimport { createParagraph } from '../creators/createParagraph';\nimport { createSelectionMarker } from '../creators/createSelectionMarker';\nimport { deleteBlock } from './deleteBlock';\nimport { deleteSegment } from './deleteSegment';\nimport { getSegmentTextFormat } from './getSegmentTextFormat';\nimport { iterateSelections } from '../selection/iterateSelections';\nimport { mutateBlock, mutateSegments } from '../common/mutate';\nimport { setParagraphNotImplicit } from '../block/setParagraphNotImplicit';\nimport type {\n ContentModelSelectionMarker,\n DeleteSelectionContext,\n FormatContentModelContext,\n InsertPoint,\n IterateSelectionsOption,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelDocument,\n ReadonlyTableSelectionContext,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst DeleteSelectionIteratingOptions: IterateSelectionsOption = {\n contentUnderSelectedTableCell: 'ignoreForTableOrCell', // When a table cell is selected, we replace all content for this cell, so no need to go into its content\n contentUnderSelectedGeneralElement: 'generalElementOnly', // When a general element is selected, we replace the whole element so no need to go into its content\n includeListFormatHolder: 'never',\n};\n\n/**\n * @internal\n * Iterate the model and find all selected content if any, delete them, and keep/create an insert point\n * at the first deleted position so that we know where to put cursor to after delete\n */\nexport function deleteExpandedSelection(\n model: ReadonlyContentModelDocument,\n formatContext?: FormatContentModelContext\n): DeleteSelectionContext {\n const context: DeleteSelectionContext = {\n deleteResult: 'notDeleted',\n insertPoint: null,\n formatContext,\n };\n\n iterateSelections(\n model,\n (path, tableContext, readonlyBlock, readonlySegments) => {\n // Set paragraph, format and index for default position where we will put cursor to.\n // Later we can overwrite these info when process the selections\n let paragraph: ShallowMutableContentModelParagraph = createParagraph(\n true /*implicit*/,\n undefined /*blockFormat*/,\n model.format\n );\n let markerFormat = model.format;\n let insertMarkerIndex = 0;\n\n if (readonlySegments && readonlyBlock?.blockType == 'Paragraph') {\n const [block, segments, indexes] = mutateSegments(readonlyBlock, readonlySegments);\n\n // Delete segments inside a paragraph\n if (segments[0]) {\n // Now that we have found a paragraph with selections, we can overwrite the default paragraph with this one\n // so we can put cursor here after delete\n paragraph = block;\n insertMarkerIndex = indexes[0];\n markerFormat = getSegmentTextFormat(segments[0], true /*includingBIU*/);\n\n context.lastParagraph = paragraph;\n context.lastTableContext = tableContext;\n\n segments.forEach((segment, i) => {\n if (\n i == 0 &&\n !context.insertPoint &&\n segment.segmentType == 'SelectionMarker'\n ) {\n // First time we hit a selection and it is a selection marker, just mark it and not need to delete\n // because this is possible a collapsed selection, then it will be handled later\n context.insertPoint = createInsertPoint(\n segment,\n block,\n path,\n tableContext\n );\n } else if (deleteSegment(block, segment, context.formatContext)) {\n context.deleteResult = 'range';\n }\n });\n\n // Since we are operating on this paragraph and it possible we delete everything from this paragraph,\n // Need to make it \"not implicit\" so that it will always have a container element, so that when we do normalization\n // of this paragraph, a BR can be added if need\n if (context.deleteResult == 'range') {\n setParagraphNotImplicit(block);\n }\n }\n } else if (readonlyBlock) {\n // Delete a whole block (divider, table, ...)\n const blocks = mutateBlock(path[0]).blocks;\n\n if (deleteBlock(blocks, readonlyBlock, paragraph, context.formatContext)) {\n context.deleteResult = 'range';\n }\n } else if (tableContext) {\n // Delete a whole table cell\n const { table, colIndex, rowIndex } = tableContext;\n const mutableTable = mutateBlock(table);\n const row = mutableTable.rows[rowIndex];\n const cell = mutateBlock(row.cells[colIndex]);\n\n path = [cell, ...path];\n paragraph.segments.push(createBr(model.format));\n cell.blocks = [paragraph];\n\n context.deleteResult = 'range';\n }\n\n if (!context.insertPoint) {\n // If we have not got a insert point after delete and we have a paragraph to put an insert point in, create insert point now\n const marker = createSelectionMarker(markerFormat);\n\n setParagraphNotImplicit(paragraph);\n paragraph.segments.splice(insertMarkerIndex, 0, marker);\n context.insertPoint = createInsertPoint(marker, paragraph, path, tableContext);\n }\n },\n DeleteSelectionIteratingOptions\n );\n\n return context;\n}\n\nfunction createInsertPoint(\n marker: ContentModelSelectionMarker,\n paragraph: ShallowMutableContentModelParagraph,\n path: ReadonlyContentModelBlockGroup[],\n tableContext: ReadonlyTableSelectionContext | undefined\n): InsertPoint {\n return {\n marker,\n paragraph,\n path,\n tableContext,\n };\n}\n"]}
@@ -2,6 +2,7 @@ import type { ContentModelSegmentFormat, ReadonlyContentModelSegment } from 'roo
2
2
  /**
3
3
  * Get the text format of a segment, this function will return only format that is applicable to text
4
4
  * @param segment The segment to get format from
5
+ * @param includingBIU When pass true, also get Bold/Italic/Underline format
5
6
  * @returns
6
7
  */
7
- export declare function getSegmentTextFormat(segment: ReadonlyContentModelSegment): ContentModelSegmentFormat;
8
+ export declare function getSegmentTextFormat(segment: ReadonlyContentModelSegment, includingBIU?: boolean): ContentModelSegmentFormat;
@@ -1,18 +1,22 @@
1
1
  /**
2
2
  * Get the text format of a segment, this function will return only format that is applicable to text
3
3
  * @param segment The segment to get format from
4
+ * @param includingBIU When pass true, also get Bold/Italic/Underline format
4
5
  * @returns
5
6
  */
6
- export function getSegmentTextFormat(segment) {
7
+ export function getSegmentTextFormat(segment, includingBIU) {
7
8
  var _a;
8
- var _b = (_a = segment === null || segment === void 0 ? void 0 : segment.format) !== null && _a !== void 0 ? _a : {}, fontFamily = _b.fontFamily, fontSize = _b.fontSize, textColor = _b.textColor, backgroundColor = _b.backgroundColor, letterSpacing = _b.letterSpacing, lineHeight = _b.lineHeight;
9
+ var format = (_a = segment.format) !== null && _a !== void 0 ? _a : {};
9
10
  var textFormat = {
10
- fontFamily: fontFamily,
11
- fontSize: fontSize,
12
- textColor: textColor,
13
- backgroundColor: backgroundColor,
14
- letterSpacing: letterSpacing,
15
- lineHeight: lineHeight,
11
+ fontFamily: format.fontFamily,
12
+ fontSize: format.fontSize,
13
+ textColor: format.textColor,
14
+ backgroundColor: format.backgroundColor,
15
+ letterSpacing: format.letterSpacing,
16
+ lineHeight: format.lineHeight,
17
+ fontWeight: includingBIU ? format.fontWeight : undefined,
18
+ italic: includingBIU ? format.italic : undefined,
19
+ underline: includingBIU ? format.underline : undefined,
16
20
  };
17
21
  return removeUndefinedValues(textFormat);
18
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getSegmentTextFormat.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/getSegmentTextFormat.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAChC,OAAoC;;IAE9B,IAAA,KACF,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,mCAAI,EAAE,EADjB,UAAU,gBAAA,EAAE,QAAQ,cAAA,EAAE,SAAS,eAAA,EAAE,eAAe,qBAAA,EAAE,aAAa,mBAAA,EAAE,UAAU,gBAC1D,CAAC;IAE1B,IAAM,UAAU,GAA8B;QAC1C,UAAU,YAAA;QACV,QAAQ,UAAA;QACR,SAAS,WAAA;QACT,eAAe,iBAAA;QACf,aAAa,eAAA;QACb,UAAU,YAAA;KACb,CAAC;IAEF,OAAO,qBAAqB,CAAC,UAAU,CAAC,CAAC;AAC7C,CAAC;AAED,IAAM,qBAAqB,GAAG,UAAC,MAAiC;IAC5D,IAAM,UAAU,GAA2D,EAAE,CAAC;IAC9E,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,UAAA,GAAG;QAC1B,IAAM,KAAK,GAAG,MAAM,CAAC,GAAsC,CAAC,CAAC;QAE7D,IAAI,KAAK,KAAK,SAAS,EAAE;YACrB,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;SAC3B;IACL,CAAC,CAAC,CAAC;IACH,OAAO,UAAU,CAAC;AACtB,CAAC,CAAC","sourcesContent":["import type {\n ContentModelSegmentFormat,\n ReadonlyContentModelSegment,\n} from 'roosterjs-content-model-types';\n\n/**\n * Get the text format of a segment, this function will return only format that is applicable to text\n * @param segment The segment to get format from\n * @returns\n */\nexport function getSegmentTextFormat(\n segment: ReadonlyContentModelSegment\n): ContentModelSegmentFormat {\n const { fontFamily, fontSize, textColor, backgroundColor, letterSpacing, lineHeight } =\n segment?.format ?? {};\n\n const textFormat: ContentModelSegmentFormat = {\n fontFamily,\n fontSize,\n textColor,\n backgroundColor,\n letterSpacing,\n lineHeight,\n };\n\n return removeUndefinedValues(textFormat);\n}\n\nconst removeUndefinedValues = (format: ContentModelSegmentFormat): ContentModelSegmentFormat => {\n const textFormat: Record<string, string | undefined | boolean | never[]> = {};\n Object.keys(format).filter(key => {\n const value = format[key as keyof ContentModelSegmentFormat];\n\n if (value !== undefined) {\n textFormat[key] = value;\n }\n });\n return textFormat;\n};\n"]}
1
+ {"version":3,"file":"getSegmentTextFormat.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/getSegmentTextFormat.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAChC,OAAoC,EACpC,YAAsB;;IAEtB,IAAM,MAAM,GAAG,MAAA,OAAO,CAAC,MAAM,mCAAI,EAAE,CAAC;IACpC,IAAM,UAAU,GAA8B;QAC1C,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QACxD,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAChD,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;KACzD,CAAC;IAEF,OAAO,qBAAqB,CAAC,UAAU,CAAC,CAAC;AAC7C,CAAC;AAED,IAAM,qBAAqB,GAAG,UAAC,MAAiC;IAC5D,IAAM,UAAU,GAA2D,EAAE,CAAC;IAC9E,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,UAAA,GAAG;QAC1B,IAAM,KAAK,GAAG,MAAM,CAAC,GAAsC,CAAC,CAAC;QAE7D,IAAI,KAAK,KAAK,SAAS,EAAE;YACrB,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;SAC3B;IACL,CAAC,CAAC,CAAC;IACH,OAAO,UAAU,CAAC;AACtB,CAAC,CAAC","sourcesContent":["import type {\n ContentModelSegmentFormat,\n ReadonlyContentModelSegment,\n} from 'roosterjs-content-model-types';\n\n/**\n * Get the text format of a segment, this function will return only format that is applicable to text\n * @param segment The segment to get format from\n * @param includingBIU When pass true, also get Bold/Italic/Underline format\n * @returns\n */\nexport function getSegmentTextFormat(\n segment: ReadonlyContentModelSegment,\n includingBIU?: boolean\n): ContentModelSegmentFormat {\n const format = segment.format ?? {};\n const textFormat: ContentModelSegmentFormat = {\n fontFamily: format.fontFamily,\n fontSize: format.fontSize,\n textColor: format.textColor,\n backgroundColor: format.backgroundColor,\n letterSpacing: format.letterSpacing,\n lineHeight: format.lineHeight,\n fontWeight: includingBIU ? format.fontWeight : undefined,\n italic: includingBIU ? format.italic : undefined,\n underline: includingBIU ? format.underline : undefined,\n };\n\n return removeUndefinedValues(textFormat);\n}\n\nconst removeUndefinedValues = (format: ContentModelSegmentFormat): ContentModelSegmentFormat => {\n const textFormat: Record<string, string | undefined | boolean | never[]> = {};\n Object.keys(format).filter(key => {\n const value = format[key as keyof ContentModelSegmentFormat];\n\n if (value !== undefined) {\n textFormat[key] = value;\n }\n });\n return textFormat;\n};\n"]}
@@ -282,12 +282,26 @@ function getSegmentFormatInLinkFormat(targetFormat) {
282
282
  return result;
283
283
  }
284
284
  function mergeLinkFormat(applyDefaultFormatOption, targetFormat, sourceFormat) {
285
- return applyDefaultFormatOption == 'mergeAll'
286
- ? __assign(__assign({}, getSegmentFormatInLinkFormat(targetFormat)), sourceFormat) : __assign(__assign(__assign(__assign({}, getFormatWithoutSegmentFormat(sourceFormat)), getSegmentFormatInLinkFormat(targetFormat)), getSemanticFormat(sourceFormat)), getHyperlinkTextColor(sourceFormat));
285
+ switch (applyDefaultFormatOption) {
286
+ case 'mergeAll':
287
+ case 'preferSource':
288
+ return __assign(__assign({}, getSegmentFormatInLinkFormat(targetFormat)), sourceFormat);
289
+ case 'keepSourceEmphasisFormat':
290
+ return __assign(__assign(__assign(__assign({}, getFormatWithoutSegmentFormat(sourceFormat)), getSegmentFormatInLinkFormat(targetFormat)), getSemanticFormat(sourceFormat)), getHyperlinkTextColor(sourceFormat));
291
+ case 'preferTarget':
292
+ return __assign(__assign({}, sourceFormat), getSegmentFormatInLinkFormat(targetFormat));
293
+ }
287
294
  }
288
295
  function mergeSegmentFormat(applyDefaultFormatOption, targetFormat, sourceFormat) {
289
- return applyDefaultFormatOption == 'mergeAll'
290
- ? __assign(__assign({}, targetFormat), sourceFormat) : __assign(__assign(__assign({}, getFormatWithoutSegmentFormat(sourceFormat)), targetFormat), getSemanticFormat(sourceFormat));
296
+ switch (applyDefaultFormatOption) {
297
+ case 'mergeAll':
298
+ case 'preferSource':
299
+ return __assign(__assign({}, targetFormat), sourceFormat);
300
+ case 'preferTarget':
301
+ return __assign(__assign({}, sourceFormat), targetFormat);
302
+ case 'keepSourceEmphasisFormat':
303
+ return __assign(__assign(__assign({}, getFormatWithoutSegmentFormat(sourceFormat)), targetFormat), getSemanticFormat(sourceFormat));
304
+ }
291
305
  }
292
306
  function getSemanticFormat(segmentFormat) {
293
307
  var result = {};
@@ -1 +1 @@
1
- {"version":3,"file":"mergeModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/mergeModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { addBlock } from '../common/addBlock';\nimport { addSegment } from '../common/addSegment';\nimport { applyTableFormat } from './applyTableFormat';\nimport { createListItem } from '../creators/createListItem';\nimport { createParagraph } from '../creators/createParagraph';\nimport { createSelectionMarker } from '../creators/createSelectionMarker';\nimport { createTableCell } from '../creators/createTableCell';\nimport { deleteSelection } from './deleteSelection';\nimport { EmptySegmentFormat } from '../../constants/EmptySegmentFormat';\nimport { getClosestAncestorBlockGroupIndex } from './getClosestAncestorBlockGroupIndex';\nimport { getObjectKeys } from '../..//domUtils/getObjectKeys';\nimport { mutateBlock } from '../common/mutate';\nimport { normalizeContentModel } from '../common/normalizeContentModel';\nimport { normalizeTable } from './normalizeTable';\nimport type {\n ContentModelBlock,\n ContentModelBlockFormat,\n ContentModelDocument,\n ContentModelHyperLinkFormat,\n ContentModelListItem,\n ContentModelParagraph,\n ContentModelSegmentFormat,\n ContentModelTable,\n FormatContentModelContext,\n InsertPoint,\n MergeModelOption,\n ReadonlyContentModelBlock,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelDocument,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst HeadingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\nconst KeysOfSegmentFormat = getObjectKeys(EmptySegmentFormat);\n\n/**\n * Merge source model into target mode\n * @param target Target Content Model that will merge content into\n * @param source Source Content Model will be merged to target model\n * @param context Format context. When call this function inside formatContentModel, provide this context so that formatContentModel will do extra handling to the result\n * @param options More options, see MergeModelOption\n * @returns Insert point after merge, or null if there is no insert point\n */\nexport function mergeModel(\n target: ReadonlyContentModelDocument,\n source: ContentModelDocument,\n context?: FormatContentModelContext,\n options?: MergeModelOption\n): InsertPoint | null {\n const insertPosition =\n options?.insertPosition ?? deleteSelection(target, [], context).insertPoint;\n\n const { addParagraphAfterMergedContent, mergeFormat, mergeTable } = options || {};\n\n if (addParagraphAfterMergedContent && !mergeTable) {\n const { paragraph, marker } = insertPosition || {};\n const newPara = createParagraph(false /* isImplicit */, paragraph?.format, marker?.format);\n addBlock(source, newPara);\n }\n\n if (insertPosition) {\n if (mergeFormat && mergeFormat != 'none') {\n const newFormat: ContentModelSegmentFormat = {\n ...(target.format || {}),\n ...insertPosition.marker.format,\n };\n\n applyDefaultFormat(source, newFormat, mergeFormat);\n }\n\n for (let i = 0; i < source.blocks.length; i++) {\n const block = source.blocks[i];\n\n switch (block.blockType) {\n case 'Paragraph':\n mergeParagraph(insertPosition, block, i == 0, context, options);\n break;\n\n case 'Divider':\n insertBlock(insertPosition, block);\n break;\n\n case 'Entity':\n insertBlock(insertPosition, block);\n context?.newEntities.push(block);\n break;\n\n case 'Table':\n if (source.blocks.length == 1 && mergeTable) {\n mergeTables(insertPosition, block, source);\n } else {\n insertBlock(insertPosition, block);\n }\n break;\n\n case 'BlockGroup':\n switch (block.blockGroupType) {\n case 'General':\n case 'FormatContainer':\n insertBlock(insertPosition, block);\n break;\n case 'ListItem':\n mergeList(insertPosition, block);\n break;\n }\n break;\n }\n }\n }\n\n normalizeContentModel(target);\n\n return insertPosition;\n}\n\nfunction mergeParagraph(\n markerPosition: InsertPoint,\n newPara: ContentModelParagraph,\n mergeToCurrentParagraph: boolean,\n context?: FormatContentModelContext,\n option?: MergeModelOption\n) {\n const { paragraph, marker } = markerPosition;\n const newParagraph = mergeToCurrentParagraph\n ? paragraph\n : splitParagraph(markerPosition, newPara.format);\n const segmentIndex = newParagraph.segments.indexOf(marker);\n\n if (option?.mergeFormat == 'none' && mergeToCurrentParagraph) {\n newParagraph.segments.forEach(segment => {\n segment.format = { ...(newParagraph.segmentFormat || {}), ...segment.format };\n });\n delete newParagraph.segmentFormat;\n }\n if (segmentIndex >= 0) {\n for (let i = 0; i < newPara.segments.length; i++) {\n const segment = newPara.segments[i];\n\n newParagraph.segments.splice(segmentIndex + i, 0, segment);\n\n if (context) {\n if (segment.segmentType == 'Entity') {\n context.newEntities.push(segment);\n }\n\n if (segment.segmentType == 'Image') {\n context.newImages.push(segment);\n }\n }\n }\n }\n\n if (newPara.decorator) {\n newParagraph.decorator = { ...newPara.decorator };\n if (HeadingTags.indexOf(newParagraph.decorator.tagName) > -1) {\n const sourceKeys: (keyof ContentModelSegmentFormat)[] = getObjectKeys(\n newParagraph.decorator.format\n );\n const segmentDecoratorKeys: (keyof ContentModelSegmentFormat)[] = getObjectKeys(\n newParagraph.segmentFormat || {}\n );\n\n sourceKeys.forEach(key => {\n if (segmentDecoratorKeys.indexOf(key) > -1) {\n delete newParagraph.segmentFormat?.[key];\n }\n });\n }\n }\n\n if (!mergeToCurrentParagraph) {\n newParagraph.format = newPara.format;\n } else {\n newParagraph.format = {\n ...newParagraph.format,\n ...newPara.format,\n };\n }\n}\n\nfunction mergeTables(\n markerPosition: InsertPoint,\n newTable: ContentModelTable,\n source: ContentModelDocument\n) {\n const { tableContext, marker } = markerPosition;\n\n if (tableContext && source.blocks.length == 1 && source.blocks[0] == newTable) {\n const { table: readonlyTable, colIndex, rowIndex } = tableContext;\n const table = mutateBlock(readonlyTable);\n\n for (let i = 0; i < newTable.rows.length; i++) {\n for (let j = 0; j < newTable.rows[i].cells.length; j++) {\n const newCell = newTable.rows[i].cells[j];\n\n if (i == 0 && colIndex + j >= table.rows[0].cells.length) {\n for (let k = 0; k < table.rows.length; k++) {\n const leftCell = table.rows[k]?.cells[colIndex + j - 1];\n table.rows[k].cells[colIndex + j] = createTableCell(\n false /*spanLeft*/,\n false /*spanAbove*/,\n leftCell?.isHeader,\n leftCell?.format\n );\n }\n }\n\n if (j == 0 && rowIndex + i >= table.rows.length) {\n if (!table.rows[rowIndex + i]) {\n table.rows[rowIndex + i] = {\n cells: [],\n format: {},\n height: 0,\n };\n }\n\n for (let k = 0; k < table.rows[rowIndex].cells.length; k++) {\n const aboveCell = table.rows[rowIndex + i - 1]?.cells[k];\n table.rows[rowIndex + i].cells[k] = createTableCell(\n false /*spanLeft*/,\n false /*spanAbove*/,\n false /*isHeader*/,\n aboveCell?.format\n );\n }\n }\n\n const oldCell = table.rows[rowIndex + i].cells[colIndex + j];\n table.rows[rowIndex + i].cells[colIndex + j] = newCell;\n\n if (i == 0 && j == 0) {\n const newMarker = createSelectionMarker(marker.format);\n const newPara = addSegment(newCell, newMarker);\n\n if (markerPosition.path[0] == oldCell) {\n // Update insert point to match the change result\n markerPosition.path[0] = newCell;\n markerPosition.marker = newMarker;\n markerPosition.paragraph = newPara;\n }\n }\n }\n }\n\n normalizeTable(table, markerPosition.marker.format);\n applyTableFormat(table, undefined /*newFormat*/, true /*keepCellShade*/);\n } else {\n insertBlock(markerPosition, newTable);\n }\n}\n\nfunction mergeList(markerPosition: InsertPoint, newList: ContentModelListItem) {\n splitParagraph(markerPosition, newList.format);\n\n const { path, paragraph } = markerPosition;\n\n const listItemIndex = getClosestAncestorBlockGroupIndex(path, ['ListItem']);\n const listItem = path[listItemIndex] as ContentModelListItem;\n const listParent = path[listItemIndex + 1]; // It is ok here when index is -1, that means there is no list and we just insert a new paragraph and use path[0] as its parent\n const blockIndex = listParent.blocks.indexOf(listItem || paragraph);\n\n if (blockIndex >= 0) {\n mutateBlock(listParent).blocks.splice(blockIndex, 0, newList);\n }\n\n if (listItem) {\n listItem?.levels.forEach((level, i) => {\n newList.levels[i] = { ...level };\n });\n }\n}\n\nfunction splitParagraph(markerPosition: InsertPoint, newParaFormat: ContentModelBlockFormat) {\n const { paragraph, marker, path } = markerPosition;\n const segmentIndex = paragraph.segments.indexOf(marker);\n const paraIndex = path[0].blocks.indexOf(paragraph);\n const newParagraph: ShallowMutableContentModelParagraph = createParagraph(\n false /*isImplicit*/,\n { ...paragraph.format, ...newParaFormat },\n paragraph.segmentFormat\n );\n\n if (segmentIndex >= 0) {\n newParagraph.segments = paragraph.segments.splice(segmentIndex);\n }\n\n if (paraIndex >= 0) {\n mutateBlock(path[0]).blocks.splice(paraIndex + 1, 0, newParagraph);\n }\n\n const listItemIndex = getClosestAncestorBlockGroupIndex(\n path,\n ['ListItem'],\n ['FormatContainer', 'TableCell']\n );\n const listItem = path[listItemIndex] as ContentModelListItem;\n\n if (listItem) {\n const listParent = listItemIndex >= 0 ? path[listItemIndex + 1] : null;\n const blockIndex = listParent ? listParent.blocks.indexOf(listItem) : -1;\n\n if (blockIndex >= 0 && listParent) {\n const newListItem = createListItem(listItem.levels, listItem.formatHolder.format);\n\n if (paraIndex >= 0) {\n newListItem.blocks = listItem.blocks.splice(paraIndex + 1);\n }\n\n if (blockIndex >= 0) {\n mutateBlock(listParent).blocks.splice(blockIndex + 1, 0, newListItem);\n }\n\n path[listItemIndex] = newListItem;\n }\n }\n\n markerPosition.paragraph = newParagraph;\n\n return newParagraph;\n}\n\nfunction insertBlock(markerPosition: InsertPoint, block: ContentModelBlock) {\n const { path } = markerPosition;\n const newParaFormat = block.blockType !== 'Paragraph' ? {} : block.format;\n const newPara = splitParagraph(markerPosition, newParaFormat);\n const blockIndex = path[0].blocks.indexOf(newPara);\n\n if (blockIndex >= 0) {\n mutateBlock(path[0]).blocks.splice(blockIndex, 0, block);\n }\n}\n\nfunction applyDefaultFormat(\n group: ReadonlyContentModelBlockGroup,\n format: ContentModelSegmentFormat,\n applyDefaultFormatOption: 'mergeAll' | 'keepSourceEmphasisFormat'\n) {\n group.blocks.forEach(block => {\n mergeBlockFormat(applyDefaultFormatOption, block);\n\n switch (block.blockType) {\n case 'BlockGroup':\n if (block.blockGroupType == 'ListItem') {\n mutateBlock(block).formatHolder.format = mergeSegmentFormat(\n applyDefaultFormatOption,\n format,\n block.formatHolder.format\n );\n }\n applyDefaultFormat(block, format, applyDefaultFormatOption);\n break;\n\n case 'Table':\n block.rows.forEach(row =>\n row.cells.forEach(cell => {\n applyDefaultFormat(cell, format, applyDefaultFormatOption);\n })\n );\n break;\n\n case 'Paragraph':\n const paragraphFormat = block.decorator?.format || {};\n const paragraph = mutateBlock(block);\n\n paragraph.segments.forEach(segment => {\n if (segment.segmentType == 'General') {\n applyDefaultFormat(segment, format, applyDefaultFormatOption);\n }\n\n segment.format = mergeSegmentFormat(applyDefaultFormatOption, format, {\n ...paragraphFormat,\n ...segment.format,\n });\n\n if (segment.link) {\n segment.link.format = mergeLinkFormat(\n applyDefaultFormatOption,\n format,\n segment.link.format\n );\n }\n });\n\n if (applyDefaultFormatOption === 'keepSourceEmphasisFormat') {\n delete paragraph.decorator;\n }\n break;\n }\n });\n}\n\nfunction mergeBlockFormat(applyDefaultFormatOption: string, block: ReadonlyContentModelBlock) {\n if (applyDefaultFormatOption == 'keepSourceEmphasisFormat' && block.format.backgroundColor) {\n delete mutateBlock(block).format.backgroundColor;\n }\n}\n\n/**\n * Hyperlink format type definition only contains backgroundColor and underline.\n * So create a minimum object with the styles supported in Hyperlink to be used in merge.\n */\nfunction getSegmentFormatInLinkFormat(\n targetFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n const result: ContentModelHyperLinkFormat = {};\n if (targetFormat.backgroundColor) {\n result.backgroundColor = targetFormat.backgroundColor;\n }\n if (targetFormat.underline) {\n result.underline = targetFormat.underline;\n }\n\n return result;\n}\n\nfunction mergeLinkFormat(\n applyDefaultFormatOption: 'mergeAll' | 'keepSourceEmphasisFormat',\n targetFormat: ContentModelSegmentFormat,\n sourceFormat: ContentModelHyperLinkFormat\n) {\n return applyDefaultFormatOption == 'mergeAll'\n ? { ...getSegmentFormatInLinkFormat(targetFormat), ...sourceFormat }\n : {\n // Hyperlink segment format contains other attributes such as LinkFormat\n // so we have to retain them\n ...getFormatWithoutSegmentFormat(sourceFormat),\n // Link format only have Text color, background color, Underline, but only\n // text color + background color should be merged from the target\n ...getSegmentFormatInLinkFormat(targetFormat),\n // Get the semantic format of the source\n ...getSemanticFormat(sourceFormat),\n // The text color of the hyperlink should not be merged and\n // we should always retain the source text color\n ...getHyperlinkTextColor(sourceFormat),\n };\n}\n\nfunction mergeSegmentFormat(\n applyDefaultFormatOption: 'mergeAll' | 'keepSourceEmphasisFormat',\n targetFormat: ContentModelSegmentFormat,\n sourceFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n return applyDefaultFormatOption == 'mergeAll'\n ? { ...targetFormat, ...sourceFormat }\n : {\n ...getFormatWithoutSegmentFormat(sourceFormat),\n ...targetFormat,\n ...getSemanticFormat(sourceFormat),\n };\n}\n\nfunction getSemanticFormat(segmentFormat: ContentModelSegmentFormat): ContentModelSegmentFormat {\n const result: ContentModelSegmentFormat = {};\n\n const { fontWeight, italic, underline } = segmentFormat;\n\n if (fontWeight && fontWeight != 'normal') {\n result.fontWeight = fontWeight;\n }\n if (italic) {\n result.italic = italic;\n }\n if (underline) {\n result.underline = underline;\n }\n\n return result;\n}\n\n/**\n * Segment format can also contain other type of metadata, for example in Images/Hyperlink,\n * we want to preserve these properties when merging format\n */\nfunction getFormatWithoutSegmentFormat(\n sourceFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n const resultFormat = {\n ...sourceFormat,\n };\n KeysOfSegmentFormat.forEach(key => delete resultFormat[key]);\n return resultFormat;\n}\nfunction getHyperlinkTextColor(sourceFormat: ContentModelHyperLinkFormat) {\n const result: ContentModelHyperLinkFormat = {};\n if (sourceFormat.textColor) {\n result.textColor = sourceFormat.textColor;\n }\n\n return result;\n}\n"]}
1
+ {"version":3,"file":"mergeModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/mergeModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { addBlock } from '../common/addBlock';\nimport { addSegment } from '../common/addSegment';\nimport { applyTableFormat } from './applyTableFormat';\nimport { createListItem } from '../creators/createListItem';\nimport { createParagraph } from '../creators/createParagraph';\nimport { createSelectionMarker } from '../creators/createSelectionMarker';\nimport { createTableCell } from '../creators/createTableCell';\nimport { deleteSelection } from './deleteSelection';\nimport { EmptySegmentFormat } from '../../constants/EmptySegmentFormat';\nimport { getClosestAncestorBlockGroupIndex } from './getClosestAncestorBlockGroupIndex';\nimport { getObjectKeys } from '../..//domUtils/getObjectKeys';\nimport { mutateBlock } from '../common/mutate';\nimport { normalizeContentModel } from '../common/normalizeContentModel';\nimport { normalizeTable } from './normalizeTable';\nimport type {\n ContentModelBlock,\n ContentModelBlockFormat,\n ContentModelDocument,\n ContentModelHyperLinkFormat,\n ContentModelListItem,\n ContentModelParagraph,\n ContentModelSegmentFormat,\n ContentModelTable,\n FormatContentModelContext,\n InsertPoint,\n MergeModelOption,\n ReadonlyContentModelBlock,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelDocument,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst HeadingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\nconst KeysOfSegmentFormat = getObjectKeys(EmptySegmentFormat);\n\ntype MergeFormatTypes = 'mergeAll' | 'keepSourceEmphasisFormat' | 'preferSource' | 'preferTarget';\n\n/**\n * Merge source model into target mode\n * @param target Target Content Model that will merge content into\n * @param source Source Content Model will be merged to target model\n * @param context Format context. When call this function inside formatContentModel, provide this context so that formatContentModel will do extra handling to the result\n * @param options More options, see MergeModelOption\n * @returns Insert point after merge, or null if there is no insert point\n */\nexport function mergeModel(\n target: ReadonlyContentModelDocument,\n source: ContentModelDocument,\n context?: FormatContentModelContext,\n options?: MergeModelOption\n): InsertPoint | null {\n const insertPosition =\n options?.insertPosition ?? deleteSelection(target, [], context).insertPoint;\n\n const { addParagraphAfterMergedContent, mergeFormat, mergeTable } = options || {};\n\n if (addParagraphAfterMergedContent && !mergeTable) {\n const { paragraph, marker } = insertPosition || {};\n const newPara = createParagraph(false /* isImplicit */, paragraph?.format, marker?.format);\n addBlock(source, newPara);\n }\n\n if (insertPosition) {\n if (mergeFormat && mergeFormat != 'none') {\n const newFormat: ContentModelSegmentFormat = {\n ...(target.format || {}),\n ...insertPosition.marker.format,\n };\n\n applyDefaultFormat(source, newFormat, mergeFormat);\n }\n\n for (let i = 0; i < source.blocks.length; i++) {\n const block = source.blocks[i];\n\n switch (block.blockType) {\n case 'Paragraph':\n mergeParagraph(insertPosition, block, i == 0, context, options);\n break;\n\n case 'Divider':\n insertBlock(insertPosition, block);\n break;\n\n case 'Entity':\n insertBlock(insertPosition, block);\n context?.newEntities.push(block);\n break;\n\n case 'Table':\n if (source.blocks.length == 1 && mergeTable) {\n mergeTables(insertPosition, block, source);\n } else {\n insertBlock(insertPosition, block);\n }\n break;\n\n case 'BlockGroup':\n switch (block.blockGroupType) {\n case 'General':\n case 'FormatContainer':\n insertBlock(insertPosition, block);\n break;\n case 'ListItem':\n mergeList(insertPosition, block);\n break;\n }\n break;\n }\n }\n }\n\n normalizeContentModel(target);\n\n return insertPosition;\n}\n\nfunction mergeParagraph(\n markerPosition: InsertPoint,\n newPara: ContentModelParagraph,\n mergeToCurrentParagraph: boolean,\n context?: FormatContentModelContext,\n option?: MergeModelOption\n) {\n const { paragraph, marker } = markerPosition;\n const newParagraph = mergeToCurrentParagraph\n ? paragraph\n : splitParagraph(markerPosition, newPara.format);\n const segmentIndex = newParagraph.segments.indexOf(marker);\n\n if (option?.mergeFormat == 'none' && mergeToCurrentParagraph) {\n newParagraph.segments.forEach(segment => {\n segment.format = { ...(newParagraph.segmentFormat || {}), ...segment.format };\n });\n delete newParagraph.segmentFormat;\n }\n if (segmentIndex >= 0) {\n for (let i = 0; i < newPara.segments.length; i++) {\n const segment = newPara.segments[i];\n\n newParagraph.segments.splice(segmentIndex + i, 0, segment);\n\n if (context) {\n if (segment.segmentType == 'Entity') {\n context.newEntities.push(segment);\n }\n\n if (segment.segmentType == 'Image') {\n context.newImages.push(segment);\n }\n }\n }\n }\n\n if (newPara.decorator) {\n newParagraph.decorator = { ...newPara.decorator };\n if (HeadingTags.indexOf(newParagraph.decorator.tagName) > -1) {\n const sourceKeys: (keyof ContentModelSegmentFormat)[] = getObjectKeys(\n newParagraph.decorator.format\n );\n const segmentDecoratorKeys: (keyof ContentModelSegmentFormat)[] = getObjectKeys(\n newParagraph.segmentFormat || {}\n );\n\n sourceKeys.forEach(key => {\n if (segmentDecoratorKeys.indexOf(key) > -1) {\n delete newParagraph.segmentFormat?.[key];\n }\n });\n }\n }\n\n if (!mergeToCurrentParagraph) {\n newParagraph.format = newPara.format;\n } else {\n newParagraph.format = {\n ...newParagraph.format,\n ...newPara.format,\n };\n }\n}\n\nfunction mergeTables(\n markerPosition: InsertPoint,\n newTable: ContentModelTable,\n source: ContentModelDocument\n) {\n const { tableContext, marker } = markerPosition;\n\n if (tableContext && source.blocks.length == 1 && source.blocks[0] == newTable) {\n const { table: readonlyTable, colIndex, rowIndex } = tableContext;\n const table = mutateBlock(readonlyTable);\n\n for (let i = 0; i < newTable.rows.length; i++) {\n for (let j = 0; j < newTable.rows[i].cells.length; j++) {\n const newCell = newTable.rows[i].cells[j];\n\n if (i == 0 && colIndex + j >= table.rows[0].cells.length) {\n for (let k = 0; k < table.rows.length; k++) {\n const leftCell = table.rows[k]?.cells[colIndex + j - 1];\n table.rows[k].cells[colIndex + j] = createTableCell(\n false /*spanLeft*/,\n false /*spanAbove*/,\n leftCell?.isHeader,\n leftCell?.format\n );\n }\n }\n\n if (j == 0 && rowIndex + i >= table.rows.length) {\n if (!table.rows[rowIndex + i]) {\n table.rows[rowIndex + i] = {\n cells: [],\n format: {},\n height: 0,\n };\n }\n\n for (let k = 0; k < table.rows[rowIndex].cells.length; k++) {\n const aboveCell = table.rows[rowIndex + i - 1]?.cells[k];\n table.rows[rowIndex + i].cells[k] = createTableCell(\n false /*spanLeft*/,\n false /*spanAbove*/,\n false /*isHeader*/,\n aboveCell?.format\n );\n }\n }\n\n const oldCell = table.rows[rowIndex + i].cells[colIndex + j];\n table.rows[rowIndex + i].cells[colIndex + j] = newCell;\n\n if (i == 0 && j == 0) {\n const newMarker = createSelectionMarker(marker.format);\n const newPara = addSegment(newCell, newMarker);\n\n if (markerPosition.path[0] == oldCell) {\n // Update insert point to match the change result\n markerPosition.path[0] = newCell;\n markerPosition.marker = newMarker;\n markerPosition.paragraph = newPara;\n }\n }\n }\n }\n\n normalizeTable(table, markerPosition.marker.format);\n applyTableFormat(table, undefined /*newFormat*/, true /*keepCellShade*/);\n } else {\n insertBlock(markerPosition, newTable);\n }\n}\n\nfunction mergeList(markerPosition: InsertPoint, newList: ContentModelListItem) {\n splitParagraph(markerPosition, newList.format);\n\n const { path, paragraph } = markerPosition;\n\n const listItemIndex = getClosestAncestorBlockGroupIndex(path, ['ListItem']);\n const listItem = path[listItemIndex] as ContentModelListItem;\n const listParent = path[listItemIndex + 1]; // It is ok here when index is -1, that means there is no list and we just insert a new paragraph and use path[0] as its parent\n const blockIndex = listParent.blocks.indexOf(listItem || paragraph);\n\n if (blockIndex >= 0) {\n mutateBlock(listParent).blocks.splice(blockIndex, 0, newList);\n }\n\n if (listItem) {\n listItem?.levels.forEach((level, i) => {\n newList.levels[i] = { ...level };\n });\n }\n}\n\nfunction splitParagraph(markerPosition: InsertPoint, newParaFormat: ContentModelBlockFormat) {\n const { paragraph, marker, path } = markerPosition;\n const segmentIndex = paragraph.segments.indexOf(marker);\n const paraIndex = path[0].blocks.indexOf(paragraph);\n const newParagraph: ShallowMutableContentModelParagraph = createParagraph(\n false /*isImplicit*/,\n { ...paragraph.format, ...newParaFormat },\n paragraph.segmentFormat\n );\n\n if (segmentIndex >= 0) {\n newParagraph.segments = paragraph.segments.splice(segmentIndex);\n }\n\n if (paraIndex >= 0) {\n mutateBlock(path[0]).blocks.splice(paraIndex + 1, 0, newParagraph);\n }\n\n const listItemIndex = getClosestAncestorBlockGroupIndex(\n path,\n ['ListItem'],\n ['FormatContainer', 'TableCell']\n );\n const listItem = path[listItemIndex] as ContentModelListItem;\n\n if (listItem) {\n const listParent = listItemIndex >= 0 ? path[listItemIndex + 1] : null;\n const blockIndex = listParent ? listParent.blocks.indexOf(listItem) : -1;\n\n if (blockIndex >= 0 && listParent) {\n const newListItem = createListItem(listItem.levels, listItem.formatHolder.format);\n\n if (paraIndex >= 0) {\n newListItem.blocks = listItem.blocks.splice(paraIndex + 1);\n }\n\n if (blockIndex >= 0) {\n mutateBlock(listParent).blocks.splice(blockIndex + 1, 0, newListItem);\n }\n\n path[listItemIndex] = newListItem;\n }\n }\n\n markerPosition.paragraph = newParagraph;\n\n return newParagraph;\n}\n\nfunction insertBlock(markerPosition: InsertPoint, block: ContentModelBlock) {\n const { path } = markerPosition;\n const newParaFormat = block.blockType !== 'Paragraph' ? {} : block.format;\n const newPara = splitParagraph(markerPosition, newParaFormat);\n const blockIndex = path[0].blocks.indexOf(newPara);\n\n if (blockIndex >= 0) {\n mutateBlock(path[0]).blocks.splice(blockIndex, 0, block);\n }\n}\n\nfunction applyDefaultFormat(\n group: ReadonlyContentModelBlockGroup,\n format: ContentModelSegmentFormat,\n applyDefaultFormatOption: MergeFormatTypes\n) {\n group.blocks.forEach(block => {\n mergeBlockFormat(applyDefaultFormatOption, block);\n\n switch (block.blockType) {\n case 'BlockGroup':\n if (block.blockGroupType == 'ListItem') {\n mutateBlock(block).formatHolder.format = mergeSegmentFormat(\n applyDefaultFormatOption,\n format,\n block.formatHolder.format\n );\n }\n applyDefaultFormat(block, format, applyDefaultFormatOption);\n break;\n\n case 'Table':\n block.rows.forEach(row =>\n row.cells.forEach(cell => {\n applyDefaultFormat(cell, format, applyDefaultFormatOption);\n })\n );\n break;\n\n case 'Paragraph':\n const paragraphFormat = block.decorator?.format || {};\n const paragraph = mutateBlock(block);\n\n paragraph.segments.forEach(segment => {\n if (segment.segmentType == 'General') {\n applyDefaultFormat(segment, format, applyDefaultFormatOption);\n }\n\n segment.format = mergeSegmentFormat(applyDefaultFormatOption, format, {\n ...paragraphFormat,\n ...segment.format,\n });\n\n if (segment.link) {\n segment.link.format = mergeLinkFormat(\n applyDefaultFormatOption,\n format,\n segment.link.format\n );\n }\n });\n\n if (applyDefaultFormatOption === 'keepSourceEmphasisFormat') {\n delete paragraph.decorator;\n }\n break;\n }\n });\n}\n\nfunction mergeBlockFormat(applyDefaultFormatOption: string, block: ReadonlyContentModelBlock) {\n if (applyDefaultFormatOption == 'keepSourceEmphasisFormat' && block.format.backgroundColor) {\n delete mutateBlock(block).format.backgroundColor;\n }\n}\n\n/**\n * Hyperlink format type definition only contains backgroundColor and underline.\n * So create a minimum object with the styles supported in Hyperlink to be used in merge.\n */\nfunction getSegmentFormatInLinkFormat(\n targetFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n const result: ContentModelHyperLinkFormat = {};\n if (targetFormat.backgroundColor) {\n result.backgroundColor = targetFormat.backgroundColor;\n }\n if (targetFormat.underline) {\n result.underline = targetFormat.underline;\n }\n\n return result;\n}\n\nfunction mergeLinkFormat(\n applyDefaultFormatOption: MergeFormatTypes,\n targetFormat: ContentModelSegmentFormat,\n sourceFormat: ContentModelHyperLinkFormat\n) {\n switch (applyDefaultFormatOption) {\n case 'mergeAll':\n case 'preferSource':\n return { ...getSegmentFormatInLinkFormat(targetFormat), ...sourceFormat };\n case 'keepSourceEmphasisFormat':\n return {\n // Hyperlink segment format contains other attributes such as LinkFormat\n // so we have to retain them\n ...getFormatWithoutSegmentFormat(sourceFormat),\n // Link format only have Text color, background color, Underline, but only\n // text color + background color should be merged from the target\n ...getSegmentFormatInLinkFormat(targetFormat),\n // Get the semantic format of the source\n ...getSemanticFormat(sourceFormat),\n // The text color of the hyperlink should not be merged and\n // we should always retain the source text color\n ...getHyperlinkTextColor(sourceFormat),\n };\n case 'preferTarget':\n return { ...sourceFormat, ...getSegmentFormatInLinkFormat(targetFormat) };\n }\n}\n\nfunction mergeSegmentFormat(\n applyDefaultFormatOption: MergeFormatTypes,\n targetFormat: ContentModelSegmentFormat,\n sourceFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n switch (applyDefaultFormatOption) {\n case 'mergeAll':\n case 'preferSource':\n return { ...targetFormat, ...sourceFormat };\n case 'preferTarget':\n return { ...sourceFormat, ...targetFormat };\n case 'keepSourceEmphasisFormat':\n return {\n ...getFormatWithoutSegmentFormat(sourceFormat),\n ...targetFormat,\n ...getSemanticFormat(sourceFormat),\n };\n }\n}\n\nfunction getSemanticFormat(segmentFormat: ContentModelSegmentFormat): ContentModelSegmentFormat {\n const result: ContentModelSegmentFormat = {};\n\n const { fontWeight, italic, underline } = segmentFormat;\n\n if (fontWeight && fontWeight != 'normal') {\n result.fontWeight = fontWeight;\n }\n if (italic) {\n result.italic = italic;\n }\n if (underline) {\n result.underline = underline;\n }\n\n return result;\n}\n\n/**\n * Segment format can also contain other type of metadata, for example in Images/Hyperlink,\n * we want to preserve these properties when merging format\n */\nfunction getFormatWithoutSegmentFormat(\n sourceFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n const resultFormat = {\n ...sourceFormat,\n };\n KeysOfSegmentFormat.forEach(key => delete resultFormat[key]);\n return resultFormat;\n}\nfunction getHyperlinkTextColor(sourceFormat: ContentModelHyperLinkFormat) {\n const result: ContentModelHyperLinkFormat = {};\n if (sourceFormat.textColor) {\n result.textColor = sourceFormat.textColor;\n }\n\n return result;\n}\n"]}
package/package.json CHANGED
@@ -3,9 +3,9 @@
3
3
  "description": "Content Model for roosterjs",
4
4
  "dependencies": {
5
5
  "tslib": "^2.3.1",
6
- "roosterjs-content-model-types": "^9.11.2"
6
+ "roosterjs-content-model-types": "^9.12.0"
7
7
  },
8
- "version": "9.11.2",
8
+ "version": "9.12.0",
9
9
  "main": "./lib/index.js",
10
10
  "typings": "./lib/index.d.ts",
11
11
  "module": "./lib-mjs/index.js",