lib/primer/view_components/linters/base_linter.rb
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
# This assumes that the AST provided represents valid HTML, where each tag has a corresponding closing tag.
# From the tags, we build a structured tree which represents the tag hierarchy.
# With this, we are able to know where the tags start and end.
This assumes that the AST provided represents valid HTML, where each tag has a corresponding closing tag.
From the tags, we build a structured tree which represents the tag hierarchy.
With this, we are able to know where the tags start and end.
This assumes that the AST provided represents valid HTML where each tag has a corresponding closing tag . From the tags we build a structured tree which represents the tag hierarchy . With this we are able to know where the tags start and end .
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
            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 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 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
This assumes that the AST provided represents valid HTML, where each tag has a corresponding closing tag.
This assumes that the AST provided represents valid HTML where each tag has a corresponding closing tag .
# get the tag from previously calculated list so the references are the same
processed_source