module Nokogiri::HTML5

def self.serialize_node_internal(current_node, io, encoding, options)

def self.serialize_node_internal(current_node, io, encoding, options)
  case current_node.type
  when XML::Node::ELEMENT_NODE
    ns = current_node.namespace
    ns_uri = ns.nil? ? nil : ns.href
    # XXX(sfc): attach namespaces to all nodes, even html?
    if ns_uri.nil? || ns_uri == HTML_NAMESPACE || ns_uri == MATHML_NAMESPACE || ns_uri == SVG_NAMESPACE
      tagname = current_node.name
    else
      tagname = "#{ns.prefix}:#{current_node.name}"
    end
    io << '<' << tagname
    current_node.attribute_nodes.each do |attr|
      attr_ns = attr.namespace
      if attr_ns.nil?
        attr_name = attr.name
      else
        ns_uri = attr_ns.href
        if ns_uri == XML_NAMESPACE
          attr_name = 'xml:' + attr.name.sub(/^[^:]*:/, '')
        elsif ns_uri == XMLNS_NAMESPACE && attr.name.sub(/^[^:]*:/, '') == 'xmlns'
          attr_name = 'xmlns'
        elsif ns_uri == XMLNS_NAMESPACE
          attr_name = 'xmlns:' + attr.name.sub(/^[^:]*:/, '')
        elsif ns_uri == XLINK_NAMESPACE
          attr_name = 'xlink:' + attr.name.sub(/^[^:]*:/, '')
        else
          attr_name = "#{attr_ns.prefix}:#{attr.name}"
        end
      end
      io << ' ' << attr_name << '="' << escape_text(attr.content, encoding, true) << '"'
    end
    io << '>'
    if !%w[area base basefont bgsound br col embed frame hr img input keygen
           link meta param source track wbr].include?(current_node.name)
      io << "\n" if options[:preserve_newline] && prepend_newline?(current_node)
      current_node.children.each do |child|
        # XXX(sfc): Templates handled specially?
        serialize_node_internal(child, io, encoding, options)
      end
      io << '</' << tagname << '>'
    end
  when XML::Node::TEXT_NODE
    parent = current_node.parent
    if parent.element? && %w[style script xmp iframe noembed noframes plaintext noscript].include?(parent.name)
      io << current_node.content
    else
      io << escape_text(current_node.content, encoding, false)
    end
  when XML::Node::CDATA_SECTION_NODE
    io << '<![CDATA[' << current_node.content << ']]>'
  when XML::Node::COMMENT_NODE
    io << '<!--' << current_node.content << '-->'
  when XML::Node::PI_NODE
    io << '<?' << current_node.content << '>'
  when XML::Node::DOCUMENT_TYPE_NODE, XML::Node::DTD_NODE
      io << '<!DOCTYPE ' << current_node.name << '>'
  when XML::Node::HTML_DOCUMENT_NODE, XML::Node::DOCUMENT_FRAG_NODE
    current_node.children.each do |child|
      serialize_node_internal(child, io, encoding, options)
    end
  else
    raise "Unexpected node '#{current_node.name}' of type #{current_node.type}"
  end
end