export default function createVListFromRegion()

in packages/roosterjs-editor-dom/lib/list/createVListFromRegion.ts [30:105]


export default function createVListFromRegion(
    region: Region,
    includeSiblingLists?: boolean,
    startNode?: Node
): VList {
    if (!region) {
        return null;
    }

    let nodes: Node[] = [];

    if (startNode) {
        const list = getRootListNode(region, ListSelector, startNode);
        if (list) {
            nodes.push(list);
        }
    } else {
        const blocks = getSelectedBlockElementsInRegion(region);
        blocks.forEach(block => {
            const list = getRootListNode(region, ListSelector, block.getStartNode());

            if (list) {
                if (nodes[nodes.length - 1] != list) {
                    nodes.push(list);
                }
                if (
                    nodes.length == 1 &&
                    safeInstanceOf(list, 'HTMLOListElement') &&
                    list.start > 1
                ) {
                    // Do not include sibling lists if this list is not start from 1
                    includeSiblingLists = false;
                }
            } else {
                nodes.push(block.collapseToSingleElement());
            }
        });

        if (nodes.length == 0 && !region.rootNode.firstChild) {
            const newNode = createElement(
                KnownCreateElementDataIndex.EmptyLine,
                region.rootNode.ownerDocument
            );
            region.rootNode.appendChild(newNode);
            nodes.push(newNode);
            region.fullSelectionStart = new Position(newNode, PositionType.Begin);
            region.fullSelectionEnd = new Position(newNode, PositionType.End);
        }

        if (includeSiblingLists) {
            tryIncludeSiblingNode(region, nodes, false /*isNext*/);
            tryIncludeSiblingNode(region, nodes, true /*isNext*/);
        }

        nodes = nodes.filter(node => !shouldSkipNode(node, true /*ignoreSpace*/));
    }

    let vList: VList = null;

    if (nodes.length > 0) {
        const firstNode = nodes.shift();
        vList = isListElement(firstNode)
            ? new VList(firstNode)
            : createVListFromItemNode(firstNode);

        nodes.forEach(node => {
            if (isListElement(node)) {
                vList.mergeVList(new VList(node));
            } else {
                vList.appendItem(node, ListType.None);
            }
        });
    }

    return vList;
}