buildFileTreeItem method
Implementation
FileTreeItem buildFileTreeItem(Node node, NodesBuilder builder) {
if (node case ElementNode(tag: 'li', :final children)) {
final List<Node> nodes = [...children ?? <Node>[]];
String? name;
final List<Node> comment = [];
bool isOpen = true;
bool isHighlighted = false;
final List<FileTreeItem> subItems = [];
if (nodes case [..._, ElementNode(tag: 'ul', :final children)]) {
for (final subChild in children ?? <Node>[]) {
subItems.add(buildFileTreeItem(subChild, builder));
}
nodes.removeLast();
}
for (final node in nodes) {
if (name == null) {
if (node is ElementNode && node.tag == 'strong') {
isHighlighted = true;
name = node.innerText;
continue;
} else if (node is TextNode) {
final [namePart, ...commentParts] = node.text.split(' ');
name = namePart;
if (commentParts.isNotEmpty) {
comment.add(TextNode(commentParts.join(' ')));
}
} else {
name = node.innerText;
}
} else {
comment.add(node);
}
}
if (name!.startsWith('^')) {
isOpen = false;
name = name.substring(1);
}
return FileTreeItem(
name: name,
isFolder: subItems.isNotEmpty || name.endsWith('/'),
isOpen: subItems.isNotEmpty && isOpen,
isHighlighted: isHighlighted,
comment: comment.isNotEmpty ? builder.build(comment) : null,
children: subItems,
);
}
throw Exception('Invalid FileTree item structure, must be a list item.');
}