All files / roosterjs-content-model-dom/lib/domToModel/processors generalProcessor.ts

96.88% Statements 31/32
85.71% Branches 12/14
100% Functions 5/5
96.77% Lines 30/31

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 701x 1x 1x 1x 1x 1x 1x 1x     1x 7x 7x   7x               7x   7x   7x       7x         1x 11x 11x   11x 11x 11x   11x             11x   11x       11x 1x             1x 18x   18x    
import { addBlock } from '../../modelApi/common/addBlock';
import { addDecorators } from '../../modelApi/common/addDecorators';
import { addSegment } from '../../modelApi/common/addSegment';
import { createGeneralBlock } from '../../modelApi/creators/createGeneralBlock';
import { createGeneralSegment } from '../../modelApi/creators/createGeneralSegment';
import { isBlockElement } from '../utils/isBlockElement';
import { parseFormat } from '../utils/parseFormat';
import { stackFormat } from '../utils/stackFormat';
import type { ElementProcessor } from 'roosterjs-content-model-types';
 
const generalBlockProcessor: ElementProcessor<HTMLElement> = (group, element, context) => {
    const block = createGeneralBlock(element);
    const isSelectedBefore = context.isInSelection;
 
    stackFormat(
        context,
        {
            segment: 'empty',
            paragraph: 'empty',
            link: 'empty',
        },
        () => {
            addBlock(group, block);
 
            parseFormat(element, context.formatParsers.general, block.format, context);
 
            context.elementProcessors.child(block, element, context);
        }
    );
 
    Iif (isSelectedBefore && context.isInSelection) {
        block.isSelected = true;
    }
};
 
const generalSegmentProcessor: ElementProcessor<HTMLElement> = (group, element, context) => {
    const segment = createGeneralSegment(element, context.segmentFormat);
    const isSelectedBefore = context.isInSelection;
 
    addDecorators(segment, context);
    const paragraph = addSegment(group, segment);
    context.domIndexer?.onSegment(element, paragraph, [segment]);
 
    stackFormat(
        context,
        {
            segment:
                'empty' /*clearFormat, General segment will include all properties and styles when generate back to HTML, so no need to carry over existing segment format*/,
        },
        () => {
            parseFormat(element, context.formatParsers.general, segment.format, context);
 
            context.elementProcessors.child(segment, element, context);
        }
    );
 
    if (isSelectedBefore && context.isInSelection) {
        segment.isSelected = true;
    }
};
 
/**
 * @internal
 */
export const generalProcessor: ElementProcessor<HTMLElement> = (group, element, context) => {
    const processor = isBlockElement(element) ? generalBlockProcessor : generalSegmentProcessor;
 
    processor(group, element, context);
};