From e8e04626df106be20c2c04c7ed3d37c7646c2e64 Mon Sep 17 00:00:00 2001 From: Bryan Valverde U Date: Mon, 18 Sep 2023 13:03:20 -0600 Subject: [PATCH] Remove Segment format from the pasted content when the format merge option is equal to `none` (#2073) * init * Remove unneeded change * Revert "Remove unneeded change" This reverts commit 2219d3565335781eaa80a54773837d93c07020c8. * fix build --- .../lib/modelApi/common/mergeModel.ts | 11 +- .../test/modelApi/common/mergeModelTest.ts | 103 ++++++++++++++++++ 2 files changed, 112 insertions(+), 2 deletions(-) diff --git a/packages-content-model/roosterjs-content-model-editor/lib/modelApi/common/mergeModel.ts b/packages-content-model/roosterjs-content-model-editor/lib/modelApi/common/mergeModel.ts index 01ce919a8ba..d68454351e8 100644 --- a/packages-content-model/roosterjs-content-model-editor/lib/modelApi/common/mergeModel.ts +++ b/packages-content-model/roosterjs-content-model-editor/lib/modelApi/common/mergeModel.ts @@ -83,7 +83,7 @@ export function mergeModel( switch (block.blockType) { case 'Paragraph': - mergeParagraph(insertPosition, block, i == 0, context); + mergeParagraph(insertPosition, block, i == 0, context, options); break; case 'Divider': @@ -125,7 +125,8 @@ function mergeParagraph( markerPosition: InsertPoint, newPara: ContentModelParagraph, mergeToCurrentParagraph: boolean, - context?: FormatWithContentModelContext + context?: FormatWithContentModelContext, + option?: MergeModelOption ) { const { paragraph, marker } = markerPosition; const newParagraph = mergeToCurrentParagraph @@ -133,6 +134,12 @@ function mergeParagraph( : splitParagraph(markerPosition, newPara.format); const segmentIndex = newParagraph.segments.indexOf(marker); + if (option?.mergeFormat == 'none' && mergeToCurrentParagraph) { + newParagraph.segments.forEach(segment => { + segment.format = { ...(newParagraph.segmentFormat || {}), ...segment.format }; + }); + delete newParagraph.segmentFormat; + } if (segmentIndex >= 0) { for (let i = 0; i < newPara.segments.length; i++) { const segment = newPara.segments[i]; diff --git a/packages-content-model/roosterjs-content-model-editor/test/modelApi/common/mergeModelTest.ts b/packages-content-model/roosterjs-content-model-editor/test/modelApi/common/mergeModelTest.ts index a3a98253fc3..b0cd8ab9fda 100644 --- a/packages-content-model/roosterjs-content-model-editor/test/modelApi/common/mergeModelTest.ts +++ b/packages-content-model/roosterjs-content-model-editor/test/modelApi/common/mergeModelTest.ts @@ -2077,6 +2077,109 @@ describe('mergeModel', () => { }); }); + it('Merge with default format paragraph and paragraph, mergeFormat: none', () => { + const MockedFormat = { + fontFamily: 'sourceSegmentFormatFontFamily', + italic: 'sourceSegmentFormatItalic', + underline: 'sourceSegmentFormatUnderline', + fontSize: 'sourceSegmentFormatFontSize', + } as any; + const majorModel = createContentModelDocument(MockedFormat); + majorModel.blocks.push({ + blockType: 'Paragraph', + segmentFormat: MockedFormat, + segments: [ + { + segmentType: 'Text', + text: 'test', + format: { + fontFamily: 'sourceFontFamily', + } as any, + }, + createSelectionMarker(), + ], + format: {}, + }); + const sourceModel: ContentModelDocument = { + blockGroupType: 'Document', + blocks: [ + { + blockType: 'Paragraph', + segments: [ + { + segmentType: 'Text', + text: 'test', + format: { + fontFamily: 'sourceFontFamily', + italic: 'sourceItalic', + underline: 'sourceUnderline', + fontSize: 'sourcefontSize', + } as any, + }, + ], + format: {}, + }, + ], + }; + const para1 = createParagraph(); + const marker = createSelectionMarker(); + + para1.segments.push(marker); + majorModel.blocks.push(para1); + + mergeModel( + majorModel, + sourceModel, + { newEntities: [], deletedEntities: [] }, + { + mergeFormat: 'none', + } + ); + + expect(majorModel).toEqual({ + blockGroupType: 'Document', + blocks: [ + { + blockType: 'Paragraph', + segments: [ + Object({ + segmentType: 'Text', + text: 'test', + format: Object({ + fontFamily: 'sourceFontFamily', + italic: 'sourceSegmentFormatItalic', + underline: 'sourceSegmentFormatUnderline', + fontSize: 'sourceSegmentFormatFontSize', + }), + }), + Object({ + segmentType: 'Text', + text: 'test', + format: Object({ + fontFamily: 'sourceFontFamily', + italic: 'sourceItalic', + underline: 'sourceUnderline', + fontSize: 'sourcefontSize', + }), + }), + Object({ + segmentType: 'SelectionMarker', + isSelected: true, + format: Object({ + fontFamily: 'sourceSegmentFormatFontFamily', + italic: 'sourceSegmentFormatItalic', + underline: 'sourceSegmentFormatUnderline', + fontSize: 'sourceSegmentFormatFontSize', + }), + }), + ], + format: {}, + }, + ], + format: MockedFormat, + }); + }); + it('Merge Table + Paragraph', () => { const majorModel = createContentModelDocument(); const sourceModel: ContentModelDocument = {