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 @@ -167,7 +167,7 @@ describe('paste with content model & paste plugin', () => {

paste(editor!, clipboardData);

expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(1);
expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(2);
expect(addParserF.addParser).toHaveBeenCalledTimes(DEFAULT_TIMES_ADD_PARSER_CALLED + 5);
expect(WordDesktopFile.processPastedContentFromWordDesktop).toHaveBeenCalledTimes(1);
});
Expand All @@ -178,7 +178,7 @@ describe('paste with content model & paste plugin', () => {

paste(editor!, clipboardData);

expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(2);
expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(3);
expect(addParserF.addParser).toHaveBeenCalledTimes(DEFAULT_TIMES_ADD_PARSER_CALLED + 7);
expect(WacComponents.processPastedContentWacComponents).toHaveBeenCalledTimes(1);
});
Expand All @@ -189,7 +189,7 @@ describe('paste with content model & paste plugin', () => {

paste(editor!, clipboardData);

expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(1);
expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(2);
expect(addParserF.addParser).toHaveBeenCalledTimes(DEFAULT_TIMES_ADD_PARSER_CALLED + 1);
expect(ExcelF.processPastedContentFromExcel).toHaveBeenCalledTimes(1);
});
Expand All @@ -200,7 +200,7 @@ describe('paste with content model & paste plugin', () => {

paste(editor!, clipboardData);

expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(1);
expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(2);
expect(addParserF.addParser).toHaveBeenCalledTimes(DEFAULT_TIMES_ADD_PARSER_CALLED + 1);
expect(ExcelF.processPastedContentFromExcel).toHaveBeenCalledTimes(1);
});
Expand All @@ -211,7 +211,7 @@ describe('paste with content model & paste plugin', () => {

paste(editor!, clipboardData);

expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(1);
expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(2);
expect(addParserF.addParser).toHaveBeenCalledTimes(DEFAULT_TIMES_ADD_PARSER_CALLED + 1);
expect(PPT.processPastedContentFromPowerPoint).toHaveBeenCalledTimes(1);
});
Expand All @@ -223,7 +223,7 @@ describe('paste with content model & paste plugin', () => {

paste(editor!, clipboardData, 'asPlainText');

expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(1);
expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(2);
expect(addParserF.addParser).toHaveBeenCalledTimes(9);
expect(WordDesktopFile.processPastedContentFromWordDesktop).toHaveBeenCalledTimes(1);
});
Expand All @@ -234,7 +234,7 @@ describe('paste with content model & paste plugin', () => {

paste(editor!, clipboardData, 'asPlainText');

expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(2);
expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(3);
expect(addParserF.addParser).toHaveBeenCalledTimes(11);
expect(WacComponents.processPastedContentWacComponents).toHaveBeenCalledTimes(1);
});
Expand All @@ -245,7 +245,7 @@ describe('paste with content model & paste plugin', () => {

paste(editor!, clipboardData, 'asPlainText');

expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(0);
expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(1);
expect(addParserF.addParser).toHaveBeenCalledTimes(4);
expect(ExcelF.processPastedContentFromExcel).toHaveBeenCalledTimes(0);
});
Expand All @@ -256,7 +256,7 @@ describe('paste with content model & paste plugin', () => {

paste(editor!, clipboardData, 'asPlainText');

expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(0);
expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(1);
expect(addParserF.addParser).toHaveBeenCalledTimes(4);
expect(ExcelF.processPastedContentFromExcel).toHaveBeenCalledTimes(0);
});
Expand All @@ -267,7 +267,7 @@ describe('paste with content model & paste plugin', () => {

paste(editor!, clipboardData, 'asPlainText');

expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(1);
expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(2);
expect(addParserF.addParser).toHaveBeenCalledTimes(5);
expect(PPT.processPastedContentFromPowerPoint).toHaveBeenCalledTimes(1);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@ import { DefaultSanitizers } from './DefaultSanitizers';
import { deprecatedBorderColorParser } from './parsers/deprecatedColorParser';
import { getPasteSource } from './pasteSourceValidations/getPasteSource';
import { parseLink } from './parsers/linkParser';
import { pasteButtonProcessor } from './processors/pasteButtonProcessor';
import { PastePropertyNames } from './pasteSourceValidations/constants';
import { processPastedContentFromExcel } from './Excel/processPastedContentFromExcel';
import { processPastedContentFromOneNote } from './oneNote/processPastedContentFromOneNote';
import { processPastedContentFromPowerPoint } from './PowerPoint/processPastedContentFromPowerPoint';
import { processPastedContentFromWordDesktop } from './WordDesktop/processPastedContentFromWordDesktop';
import { processPastedContentWacComponents } from './WacComponents/processPastedContentWacComponents';
import { setProcessor } from './utils/setProcessor';
import type {
BeforePasteEvent,
BorderFormat,
Expand Down Expand Up @@ -140,6 +142,7 @@ export class PastePlugin implements EditorPlugin {
addParser(event.domToModelOption, 'tableCell', deprecatedBorderColorParser);
addParser(event.domToModelOption, 'tableCell', tableBorderParser);
addParser(event.domToModelOption, 'table', deprecatedBorderColorParser);
setProcessor(event.domToModelOption, 'button', pasteButtonProcessor);

if (pasteType === 'mergeFormat') {
addParser(event.domToModelOption, 'block', blockElementParser);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { addSegment, createText, isNodeOfType, parseFormat } from 'roosterjs-content-model-dom';
import type {
ElementProcessor,
ContentModelBlockGroup,
DomToModelContext,
ContentModelSegmentFormat,
} from 'roosterjs-content-model-types';

/**
* @internal
* This processor is used to process <button> elements in the DOM and convert them into Content Model.
* It handles the button element by creating a text segment for each text node within the button.
*/
export const pasteButtonProcessor: ElementProcessor<HTMLButtonElement> = (
group: ContentModelBlockGroup,
element: HTMLButtonElement,
context: DomToModelContext
): void => {
const format: ContentModelSegmentFormat = {};
parseFormat(element, context.formatParsers.segment, format, context);
// Recursively process text nodes in the button
processTextNodesRecursively(group, element, context, format);
};

/**
* Helper function to recursively iterate through nodes and process text nodes
*/
function processTextNodesRecursively(
group: ContentModelBlockGroup,
node: Node,
context: DomToModelContext,
format: ContentModelSegmentFormat
): void {
if (node.nodeType === Node.TEXT_NODE) {
// Process text node directly
const text = createText(node.nodeValue || '', format);
addSegment(group, text);
} else if (isNodeOfType(node, 'ELEMENT_NODE')) {
const newFormat: ContentModelSegmentFormat = { ...format };
parseFormat(node, context.formatParsers.segment, newFormat, context);
// Recursively process all child nodes
for (let i = 0; i < node.childNodes.length; i++) {
processTextNodesRecursively(group, node.childNodes[i], context, newFormat);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ describe('OneNote', () => {
it('OneNote', () => {
paste(editor!, oneNoteClipboardContent1, 'normal');

expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(3);
expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(4);
expect(addParserF.addParser).toHaveBeenCalledTimes(4);
expect(oneNote.processPastedContentFromOneNote).toHaveBeenCalledTimes(1);

Expand Down Expand Up @@ -1575,7 +1575,7 @@ describe('OneNote', () => {
it('OneNote 2', () => {
paste(editor!, oneNoteClipboardContent2, 'normal');

expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(3);
expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(4);
expect(addParserF.addParser).toHaveBeenCalledTimes(4);
expect(oneNote.processPastedContentFromOneNote).toHaveBeenCalledTimes(1);

Expand Down Expand Up @@ -3233,7 +3233,7 @@ describe('OneNote', () => {
it('OneNote 3', () => {
paste(editor!, oneNoteClipboardContent3, 'normal');

expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(3);
expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(4);
expect(addParserF.addParser).toHaveBeenCalledTimes(4);
expect(oneNote.processPastedContentFromOneNote).toHaveBeenCalledTimes(1);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ describe('PowerPoint', () => {
it('PowerPoint 1', () => {
paste(editor!, pptClipboardContent1, 'normal');

expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(1);
expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(2);
expect(addParserF.addParser).toHaveBeenCalledTimes(5);
expect(ppt.processPastedContentFromPowerPoint).toHaveBeenCalledTimes(1);

Expand Down Expand Up @@ -1848,7 +1848,7 @@ describe('PowerPoint', () => {
it('PowerPoint 2', () => {
paste(editor!, pptClipboardContent2, 'normal');

expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(1);
expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(2);
expect(addParserF.addParser).toHaveBeenCalledTimes(5);
expect(ppt.processPastedContentFromPowerPoint).toHaveBeenCalledTimes(1);

Expand Down Expand Up @@ -2169,7 +2169,7 @@ describe('PowerPoint', () => {
it('PowerPoint 3', () => {
paste(editor!, pptClipboardContent3, 'normal');

expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(1);
expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(2);
expect(addParserF.addParser).toHaveBeenCalledTimes(5);
expect(ppt.processPastedContentFromPowerPoint).toHaveBeenCalledTimes(1);

Expand Down Expand Up @@ -2596,7 +2596,7 @@ describe('PowerPoint', () => {
it('PowerPoint 4', () => {
paste(editor!, pptClipboardContent4, 'normal');

expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(1);
expect(setProcessorF.setProcessor).toHaveBeenCalledTimes(2);
expect(addParserF.addParser).toHaveBeenCalledTimes(5);
expect(ppt.processPastedContentFromPowerPoint).toHaveBeenCalledTimes(1);

Expand Down
Loading
Loading