parseNodes method

List<TagflowNode> parseNodes(
  1. NodeList nodes
)

Implementation

List<TagflowNode> parseNodes(dom.NodeList nodes) {
  const excludeTags = ['table'];
  bool isNodeValid(dom.Node node) {
    if (node is dom.Text) {
      return node.text.isNotEmpty ||
          excludeTags.contains(node.parent?.localName);
    }

    if (node is dom.Element) {
      if (excludeTags.contains(node.localName)) {
        return true;
      }
      return node.hasChildNodes() || node.nodes.every(isNodeValid);
    }

    return false;
  }

  final parsedNodes = <TagflowNode>[];
  for (final node in nodes) {
    final state = _renderBoundaryState;
    if (state != null && _handleRenderBoundary(node, state)) break;
    if (state?.isRendering == false && node is! dom.Element) continue;
    if (!isNodeValid(node)) continue;
    final wasRendering = state?.isRendering ?? true;
    final parsedNode = parseNode(node);
    final canAddNode =
        wasRendering ||
        (state?.isRendering ?? false) ||
        (state?.isStopped ?? false);
    if (canAddNode && parsedNode != null && isValidNode(parsedNode)) {
      parsedNodes.add(parsedNode);
    }
    if (state?.isStopped ?? false) break;
  }
  return parsedNodes;
}