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;
}