class Temple::HTML::Fast

@api public

def initialize(opts = {})

def initialize(opts = {})
  super
  @format = options[:format]
  unless [:xhtml, :html, :xml].include?(@format)
    if @format == :html4 || @format == :html5
      warn "Format #{@format.inspect} is deprecated, use :html"
      @format = :html
    else
      raise ArgumentError, "Invalid format #{@format.inspect}"
    end
  end
  wrapper = options[:js_wrapper]
  wrapper = @format == :xml || @format == :xhtml ? :cdata : :comment if wrapper == :guess
  @js_wrapper =
    case wrapper
    when :comment
      [ "<!--\n", "\n//-->" ]
    when :cdata
      [ "\n//<![CDATA[\n", "\n//]]>\n" ]
    when :both
      [ "<!--\n//<![CDATA[\n", "\n//]]>\n//-->" ]
    when nil
    when Array
      wrapper
    else
      raise ArgumentError, "Invalid JavaScript wrapper #{wrapper.inspect}"
    end
end

def on_html_attr(name, value)

def on_html_attr(name, value)
  if @format == :html && empty_exp?(value)
    [:static, " #{name}"]
  else
    [:multi,
     [:static, " #{name}=#{options[:attr_quote]}"],
     compile(value),
     [:static, options[:attr_quote]]]
  end
end

def on_html_attrs(*attrs)

def on_html_attrs(*attrs)
  [:multi, *attrs.map {|attr| compile(attr) }]
end

def on_html_comment(content)

def on_html_comment(content)
  [:multi,
    [:static, '<!--'],
    compile(content),
    [:static, '-->']]
end

def on_html_condcomment(condition, content)

def on_html_condcomment(condition, content)
  on_html_comment [:multi,
                   [:static, "[#{condition}]>"],
                   content,
                   [:static, '<![endif]']]
end

def on_html_doctype(type)

def on_html_doctype(type)
  type = type.to_s.downcase
  if type =~ /^xml(\s+(.+))?$/
    raise(FilterError, 'Invalid xml directive in html mode') if @format == :html
    w = options[:attr_quote]
    str = "<?xml version=#{w}1.0#{w} encoding=#{w}#{$2 || 'utf-8'}#{w} ?>"
  else
    str = DOCTYPES[@format][type] || raise(FilterError, "Invalid doctype #{type}")
  end
  [:static, str]
end

def on_html_js(content)

def on_html_js(content)
  if @js_wrapper
    [:multi,
     [:static, @js_wrapper.first],
     compile(content),
     [:static, @js_wrapper.last]]
  else
    compile(content)
  end
end

def on_html_tag(name, attrs, content = nil)

def on_html_tag(name, attrs, content = nil)
  name = name.to_s
  closed = !content || (empty_exp?(content) && (@format == :xml || options[:autoclose].include?(name)))
  result = [:multi, [:static, "<#{name}"], compile(attrs)]
  result << [:static, (closed && @format != :html ? ' /' : '') + '>']
  result << compile(content) if content
  result << [:static, "</#{name}>"] if !closed
  result
end