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 15x 15x   15x               15x   15x   15x       15x         1x 9x 9x   9x 9x 9x   9x             9x   9x       9x 1x             1x 24x   24x    
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);
};