Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ const initialState: OptionState = {
codeFormat: {},
},
markdownPasteOptions: {
autoConversion: false,
autoConversion: true,
undoConversion: false,
},
editPluginOptions: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,16 @@ export function mergeModel(
if (mergeFormat && mergeFormat != 'none') {
const newFormat: ContentModelSegmentFormat = {
...(target.format || {}),
...(options?.preserveParagraphDecorator
? {
...insertPosition.paragraph.decorator?.format,
...insertPosition.paragraph.segmentFormat,
}
: undefined),
...insertPosition.marker.format,
};

applyDefaultFormat(source, newFormat, mergeFormat);
applyDefaultFormat(source, newFormat, mergeFormat, options?.preserveParagraphDecorator);
}

for (let i = 0; i < source.blocks.length; i++) {
Expand Down Expand Up @@ -476,7 +482,8 @@ function insertBlock(markerPosition: InsertPoint, block: ContentModelBlock) {
function applyDefaultFormat(
group: ReadonlyContentModelBlockGroup,
format: ContentModelSegmentFormat,
applyDefaultFormatOption: MergeFormatTypes
applyDefaultFormatOption: MergeFormatTypes,
preserveParagraphDecorator?: boolean
) {
group.blocks.forEach(block => {
mergeBlockFormat(applyDefaultFormatOption, block);
Expand All @@ -490,30 +497,54 @@ function applyDefaultFormat(
block.formatHolder.format
);
}
applyDefaultFormat(block, format, applyDefaultFormatOption);
applyDefaultFormat(
block,
format,
applyDefaultFormatOption,
preserveParagraphDecorator
);
break;

case 'Table':
block.rows.forEach(row =>
row.cells.forEach(cell => {
applyDefaultFormat(cell, format, applyDefaultFormatOption);
applyDefaultFormat(
cell,
format,
applyDefaultFormatOption,
preserveParagraphDecorator
);
})
);
break;

case 'Paragraph':
const paragraphFormat = block.decorator?.format || {};
const paragraph = mutateBlock(block);
const paragraphTargetFormat =
applyDefaultFormatOption === 'keepSourceEmphasisFormat' &&
preserveParagraphDecorator
? { ...format, ...paragraphFormat }
: format;

paragraph.segments.forEach(segment => {
if (segment.segmentType == 'General') {
applyDefaultFormat(segment, format, applyDefaultFormatOption);
applyDefaultFormat(
segment,
format,
applyDefaultFormatOption,
preserveParagraphDecorator
);
}

segment.format = mergeSegmentFormat(applyDefaultFormatOption, format, {
...paragraphFormat,
...segment.format,
});
segment.format = mergeSegmentFormat(
applyDefaultFormatOption,
paragraphTargetFormat,
{
...paragraphFormat,
...segment.format,
}
);

if (segment.link) {
segment.link.format = mergeLinkFormat(
Expand All @@ -524,7 +555,10 @@ function applyDefaultFormat(
}
});

if (applyDefaultFormatOption === 'keepSourceEmphasisFormat') {
if (
applyDefaultFormatOption === 'keepSourceEmphasisFormat' &&
!preserveParagraphDecorator
) {
delete paragraph.decorator;
}
break;
Expand Down Expand Up @@ -607,7 +641,7 @@ function mergeSegmentFormat(
function getSemanticFormat(segmentFormat: ContentModelSegmentFormat): ContentModelSegmentFormat {
const result: ContentModelSegmentFormat = {};

const { fontWeight, italic, underline } = segmentFormat;
const { fontWeight, italic, underline, strikethrough } = segmentFormat;

if (fontWeight && fontWeight != 'normal') {
result.fontWeight = fontWeight;
Expand All @@ -618,6 +652,9 @@ function getSemanticFormat(segmentFormat: ContentModelSegmentFormat): ContentMod
if (underline) {
result.underline = underline;
}
if (strikethrough) {
result.strikethrough = strikethrough;
}

return result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2789,6 +2789,78 @@ describe('mergeModel', () => {
});
});

[undefined, false, true].forEach(preserveParagraphDecorator => {
it(`inherits target paragraph formatting only when preserveParagraphDecorator is enabled: ${preserveParagraphDecorator}`, () => {
const target = createContentModelDocument({ textColor: 'black', fontSize: '12px' });
const targetParagraph = createParagraph();
targetParagraph.decorator = {
tagName: 'h3',
format: { textColor: 'blue', fontSize: '24px' },
};
targetParagraph.segmentFormat = { textColor: 'green', fontSize: '18px' };
targetParagraph.segments.push(createSelectionMarker({ fontFamily: 'Arial' }));
target.blocks.push(targetParagraph);

const source = createContentModelDocument();
const sourceParagraph = createParagraph();
sourceParagraph.segments.push(createText('Text'));
source.blocks.push(sourceParagraph);

mergeModel(target, source, undefined, {
mergeFormat: 'keepSourceEmphasisFormat',
preserveParagraphDecorator,
});

expect(targetParagraph.segments[0]).toEqual(
createText('Text', {
textColor: preserveParagraphDecorator ? 'green' : 'black',
fontSize: preserveParagraphDecorator ? '18px' : '12px',
fontFamily: 'Arial',
})
);
});
});

it('preserves heading tags and sizes when preserveParagraphDecorator is enabled', () => {
const target = createContentModelDocument({ fontFamily: 'Arial' });
const targetParagraph = createParagraph();
targetParagraph.decorator = {
tagName: 'h3',
format: { textColor: 'blue' },
};
targetParagraph.segmentFormat = { textColor: 'green' };
targetParagraph.segments.push(
createSelectionMarker({ fontSize: '20px', fontWeight: 'normal', textColor: 'red' })
);
target.blocks.push(targetParagraph);

const source = createContentModelDocument();
const sourceParagraph = createParagraph();
sourceParagraph.decorator = {
tagName: 'h2',
format: { fontSize: '1.5em', fontWeight: 'bold' },
};
sourceParagraph.segments.push(createText('Heading'));
source.blocks.push(sourceParagraph);

mergeModel(target, source, undefined, {
mergeFormat: 'keepSourceEmphasisFormat',
preserveParagraphDecorator: true,
});

const expectedFormat = {
fontFamily: 'Arial',
fontSize: '1.5em',
fontWeight: 'bold',
textColor: 'red',
};
expect(targetParagraph.decorator).toEqual({
tagName: 'h2',
format: { fontSize: '1.5em', fontWeight: 'bold' },
});
expect(targetParagraph.segments[0]).toEqual(createText('Heading', expectedFormat));
});

it('Merge with default format paragraph and paragraph with decorator, mergeAll', () => {
const MockedFormat = {
fontFamily: 'mocked',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,8 @@ export class MarkdownPastePlugin implements EditorPlugin {
}),
undefined /*context*/,
{
mergeFormat: 'preferTarget',
mergeFormat: 'keepSourceEmphasisFormat',
preserveParagraphDecorator: true,
}
);
if (this.options.undoConversion) {
Expand Down
Loading
Loading