vite-uni-dev-tool
Version:
vite-uni-dev-tool, debug, uni-app, 一处编写,到处调试
76 lines (67 loc) • 2.46 kB
text/typescript
/**
* 将树结构扁平化并添加层级及闭合层级信息(包含闭合节点)
* 这个函数会为每个节点添加开始和结束标记,形成类似括号匹配的结构
* @param tree - 生成的树结构
* @param level - 当前层级,默认为0
* @param parentUid - 父节点UID,默认为undefined
* @returns 扁平化的节点数组(包含闭合节点)
*/
export function flattenTreeWithEndMarkers(
tree: InstanceTree.TreeNode | null,
level: number = 0,
parentUid?: number,
): InstanceTree.FlattenedNodeWithEnd[] {
if (!tree) {
return [];
}
let result: InstanceTree.FlattenedNodeWithEnd[] = [];
// 创建当前节点的开始标记
const startNode: InstanceTree.FlattenedNodeWithEnd = {
type: tree.type,
level: level,
...(tree.uid !== undefined && { uid: tree.uid }),
...(tree.content !== undefined && { content: '' }),
...(parentUid !== undefined && { parentUid: parentUid }),
isStartNode: true, // 标记为开始节点
};
let hasStart = false;
if (startNode.type || startNode.content) {
hasStart = true;
result.push(startNode);
}
// 如果当前节点有 content,将其作为单独的层级处理
if (
tree.content !== undefined &&
tree.content !== null &&
tree.content !== ''
) {
const contentNode: InstanceTree.FlattenedNodeWithEnd = {
type: '', // 内容节点类型为
level: level + (hasStart ? 1 : 0), // content 作为子层级
content: tree.content,
parentUid: tree.uid, // 父节点UID
isContentNode: true, // 标记为内容节点
};
result.push(contentNode);
}
// 如果当前节点有子节点,则递归处理子节点
if (tree.children && tree.children.length > 0) {
for (const child of tree.children) {
const childNodes = flattenTreeWithEndMarkers(child, level + 1, tree.uid);
result = result.concat(childNodes);
}
}
// 添加当前节点的结束标记(闭合节点)
const endNode: InstanceTree.FlattenedNodeWithEnd = {
type: tree.type,
level: level,
...(tree.uid !== undefined && { uid: tree.uid }),
...(tree.content !== undefined && { content: '' }),
...(parentUid !== undefined && { parentUid: parentUid }),
isEndNode: true, // 标记为结束节点
};
if (endNode.type || endNode.content) {
result.push(endNode);
}
return result;
}