All files / roosterjs-content-model-core/lib/coreApi/createContentModel createContentModel.ts

100% Statements 20/20
100% Branches 26/26
100% Functions 1/1
100% Lines 19/19

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 551x 1x                             1x   235x   235x 183x   183x   170x             65x     65x 65x 65x 65x       65x 61x     65x   65x 9x     65x    
import { updateCache } from '../../corePlugin/cache/updateCache';
import {
    cloneModel,
    createDomToModelContext,
    createDomToModelContextWithConfig,
    domToContentModel,
} from 'roosterjs-content-model-dom';
import type { CreateContentModel } from 'roosterjs-content-model-types';
 
/**
 * @internal
 * Create Content Model from DOM tree in this editor
 * @param core The editor core object
 * @param option The option to customize the behavior of DOM to Content Model conversion
 * @param selectionOverride When passed, use this selection range instead of current selection in editor
 */
export const createContentModel: CreateContentModel = (core, option, selectionOverride) => {
    // Flush all mutations if any, so that we can get an up-to-date Content Model
    core.cache.textMutationObserver?.flushMutations();
 
    if (!selectionOverride && (!option || option.tryGetFromCache)) {
        const cachedModel = core.cache.cachedModel;
 
        if (cachedModel) {
            // When in shadow edit, use a cloned model so we won't pollute the cached one
            return core.lifecycle.shadowEditFragment
                ? cloneModel(cachedModel, { includeCachedElement: true })
                : cachedModel;
        }
    }
 
    const selection =
        selectionOverride == 'none'
            ? undefined
            : selectionOverride || core.api.getDOMSelection(core) || undefined;
    const saveIndex = !option && !selectionOverride;
    const editorContext = core.api.createEditorContext(core, saveIndex);
    const settings = core.environment.domToModelSettings;
    const domToModelContext = option
        ? createDomToModelContext(editorContext, settings.builtIn, settings.customized, option)
        : createDomToModelContextWithConfig(settings.calculated, editorContext);
 
    if (selection) {
        domToModelContext.selection = selection;
    }
 
    const model = domToContentModel(core.logicalRoot, domToModelContext);
 
    if (saveIndex) {
        updateCache(core.cache, model, selection);
    }
 
    return model;
};