module ERBLint::Linters::TagTreeHelpers
def build_tag_tree(processed_source)
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