class Gammo::Parser::Initial

Section 12.2.6.4.1

Constants

QUIRKY_IDS

Public Instance Methods

comment_token(token) click to toggle source
# File lib/gammo/parser/insertion_mode/initial.rb, line 13
def comment_token(token)
  parser.document.append_child(Node::Comment.new(data: token.data))
  halt true
end
default(_) click to toggle source
# File lib/gammo/parser/insertion_mode/initial.rb, line 26
def default(_)
  parser.quirks = true
  parser.insertion_mode = BeforeHTML
  halt false
end
doctype_token(token) click to toggle source
# File lib/gammo/parser/insertion_mode/initial.rb, line 18
def doctype_token(token)
  n, quirks = parse_doctype(token.data)
  parser.document.append_child(n)
  parser.quirks = quirks
  parser.insertion_mode = BeforeHTML
  halt true
end
text_token(token) click to toggle source
# File lib/gammo/parser/insertion_mode/initial.rb, line 7
def text_token(token)
  token.data = token.data.lstrip
  # it's all whitespace so ignore it.
  halt true if token.data.length.zero?
end

Private Instance Methods

parse_doctype(s) click to toggle source
# File lib/gammo/parser/insertion_mode/initial.rb, line 90
def parse_doctype(s)
  node = Node::Doctype.new
  pos = s.index(?\s)
  pos = s.length unless pos
  node.data = s.slice(0, pos)
  quirks = false
  quirks = true if node.data != 'html'
  node.data = node.data.downcase
  s = s.slice(pos..-1).lstrip
  return [node, quirks || s != ''] if s.length < 6

  key = s.slice(0, 6).downcase
  s = s.slice(6..-1)
  while key == 'public' || key == 'system'
    s = s.lstrip
    break if s.empty?
    quote = s[0]
    break if quote != ?" && quote != ?'
    s = s.slice(1..-1)
    id = ''
    q = s.index(quote)
    if q
      id = s.slice(0, q)
      s = s.slice((q + 1)..-1)
    else
      id = s
      s = ''
    end
    node.attributes << Attribute.new(key: key, value: id)
    key = key == 'public' ? 'system' : ''
    if key != '' || s != ''
      quirks = true
    elsif node.attributes.length > 0
      if node.attributes.first.key == 'public'
        pub = node.attributes.first.value.downcase
        case pub
        when '-//w3o//dtd w3 html strict 3.0//en//', '-/w3d/dtd html 4.0 transitional/en', 'html'
          quirks = true
        else
          QUIRKY_IDS.each do |quirky|
            if pub.start_with?(quirky)
              quirks = true
              break
            end
          end
        end
        if node.attributes.length == 1 && pub.start_with?('-//w3c//dtd html 4.01 frameset//') || pub.start_with?('-//w3c//dtd html 4.01 transitional//')
          quirks = true
        end
      end
      last = node.attributes.last
      if last.key == 'system' && last.value.downcase == 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd'
        quirks = true
      end
    end
  end
  [node, quirks]
end