# File lib/html5/treewalkers/base.rb, line 98
  def each
    current_node = @tree
    while current_node != nil
      details = node_details(current_node)
      has_children = false

      case details.shift
      when :DOCTYPE
        yield doctype(*details)

      when :TEXT
        text(*details) {|token| yield token}

      when :ELEMENT
        name, attributes, has_children = details
        if VOID_ELEMENTS.include?(name)
          yield empty_tag(name, attributes.to_a, has_children)
          has_children = false
        else
          yield start_tag(name, attributes.to_a)
        end

      when :COMMENT
        yield comment(details[0])

      when :DOCUMENT, :DOCUMENT_FRAGMENT
        has_children = true

      when nil
        # ignore (REXML::XMLDecl is an example)

      else
        yield unknown(details[0])
      end

      first_child = has_children ? first_child(current_node) : nil
      if first_child != nil
        current_node = first_child
      else
        while current_node != nil
          details = node_details(current_node)
          if details.shift == :ELEMENT
            name, attributes, has_children = details
            yield end_tag(name) if !VOID_ELEMENTS.include?(name)
          end

          if @tree == current_node
            current_node = nil
          else
            next_sibling = next_sibling(current_node)
            if next_sibling != nil
              current_node = next_sibling
              break
            end

            current_node = parent(current_node)
          end
        end
      end
    end
  end