module ERBLint::Linters::TagTreeHelpers

def build_tag_tree(processed_source)

With this, we are able to know where the tags start and end.
From the tags, we build a structured tree which represents the tag hierarchy.
This assumes that the AST provided represents valid HTML, where each tag has a corresponding closing tag.
def build_tag_tree(processed_source)
  nodes = processed_source.ast.children
  tag_tree = {}
  tags = []
  current_opened_tag = nil
  nodes.each do |node|
    if node.type == :tag
      # get the tag from previously calculated list so the references are the same
      tag = BetterHtml::Tree::Tag.from_node(node)
      tags << tag
      if tag.closing?
        if current_opened_tag && tag.name == current_opened_tag.name
          tag_tree[current_opened_tag][:closing] = tag
          current_opened_tag = tag_tree[current_opened_tag][:parent]
        end
        next
      end
      self_closing = self_closing?(tag)
      tag_tree[tag] = {
        tag: tag,
        closing: self_closing ? tag : nil,
        parent: current_opened_tag,
        children: [],
      }
      tag_tree[current_opened_tag][:children] << tag_tree[tag] if current_opened_tag
      current_opened_tag = tag unless self_closing
    elsif current_opened_tag
      tag_tree[current_opened_tag][:children] << node
    end
  end
  [tags, tag_tree]
end

def self_closing?(tag)

def self_closing?(tag)
  tag.self_closing? || SELF_CLOSING_TAGS.include?(tag.name)
end