buildFileTreeItem method

FileTreeItem buildFileTreeItem(
  1. Node node,
  2. NodesBuilder builder
)

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.');
}