module Kramdown::Parser::Html::Parser

def handle_html_start_tag(line = nil) # :yields: el, closed, handle_body

:yields: el, closed, handle_body
body - and the end tag - need to be handled in case closed=false).
element is already closed, ie. contains no body; the third parameter specifies whether the
(first parameter is the created element; the second parameter is +true+ if the HTML
Does the common processing steps and then yields to the caller for further processing

Process the HTML start tag that has already be scanned/checked via @src.
def handle_html_start_tag(line = nil) # :yields: el, closed, handle_body
  name = @src[1]
  name.downcase! if HTML_ELEMENT[name.downcase]
  closed = !@src[4].nil?
  attrs = parse_html_attributes(@src[2], line, HTML_ELEMENT[name])
  el = Element.new(:html_element, name, attrs, category: :block)
  el.options[:location] = line if line
  @tree.children << el
  if !closed && HTML_ELEMENTS_WITHOUT_BODY.include?(el.value)
    closed = true
  end
  if name == 'script' || name == 'style'
    handle_raw_html_tag(name)
    yield(el, false, false)
  else
    yield(el, closed, true)
  end
end

def handle_raw_html_tag(name)

Handle the raw HTML tag at the current position.
def handle_raw_html_tag(name)
  curpos = @src.pos
  if @src.scan_until(/(?=<\/#{name}\s*>)/mi)
    add_text(extract_string(curpos...@src.pos, @src), @tree.children.last, :raw)
    @src.scan(HTML_TAG_CLOSE_RE)
  else
    add_text(@src.rest, @tree.children.last, :raw)
    @src.terminate
    warning("Found no end tag for '#{name}' - auto-closing it")
  end
end

def parse_html_attributes(str, line = nil, in_html_tag = true)

contain only lowercase letters.
If the optional +in_html_tag+ parameter is set to +false+, attributes are not modified to

If the optional +line+ parameter is supplied, it is used in warning messages.

Parses the given string for HTML attributes and returns the resulting hash.
def parse_html_attributes(str, line = nil, in_html_tag = true)
  attrs = {}
  str.scan(HTML_ATTRIBUTE_RE).each do |attr, val, _sep, quoted_val|
    attr.downcase! if in_html_tag
    if attrs.key?(attr)
      warning("Duplicate HTML attribute '#{attr}' on line #{line || '?'} - overwriting previous one")
    end
    attrs[attr] = val || quoted_val || ""
  end
  attrs
end

def parse_raw_html(el, &block)

providing the block given to this method.
When an HTML start tag is found, processing is deferred to #handle_html_start_tag,

element).
- The matching end tag for the element +el+ is found (only used if +el+ is an HTML
- The end of the document is reached.

Parsing continues until one of the following criteria are fulfilled:
Parse raw HTML from the current source position, storing the found elements in +el+.
def parse_raw_html(el, &block)
  @stack.push(@tree)
  @tree = el
  done = false
  while !@src.eos? && !done
    if (result = @src.scan_until(HTML_RAW_START))
      add_text(result, @tree, :text)
      line = @src.current_line_number
      if (result = @src.scan(HTML_COMMENT_RE))
        @tree.children << Element.new(:xml_comment, result, nil, category: :block, location: line)
      elsif (result = @src.scan(HTML_INSTRUCTION_RE))
        @tree.children << Element.new(:xml_pi, result, nil, category: :block, location: line)
      elsif @src.scan(HTML_CDATA_RE)
        @tree.children << Element.new(:text, @src[1], nil, cdata: true, location: line)
      elsif @src.scan(HTML_TAG_RE)
        if method(:handle_html_start_tag).arity.abs >= 1
          handle_html_start_tag(line, &block)
        else
          handle_html_start_tag(&block) # DEPRECATED: method needs to accept line number in 2.0
        end
      elsif @src.scan(HTML_TAG_CLOSE_RE)
        if @tree.value == (HTML_ELEMENT[@tree.value] ? @src[1].downcase : @src[1])
          done = true
        else
          add_text(@src.matched, @tree, :text)
          warning("Found invalidly used HTML closing tag for '#{@src[1]}' on " \
                  "line #{line} - ignoring it")
        end
      else
        add_text(@src.getch, @tree, :text)
      end
    else
      add_text(@src.rest, @tree, :text)
      @src.terminate
      if @tree.type == :html_element
        warning("Found no end tag for '#{@tree.value}' on line " \
                "#{@tree.options[:location]} - auto-closing it")
      end
      done = true
    end
  end
  @tree = @stack.pop
end