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 8x 8x   8x 8x 8x   8x             8x   8x       8x 1x             1x 23x   23x    
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);
};