Permalink
Switch branches/tags
Nothing to show
Find file
Fetching contributors…
Cannot retrieve contributors at this time
132 lines (116 sloc) 3.16 KB
# = REXML Tree Generator
#
# HTree::Node#to_rexml is used for converting HTree to REXML.
#
# == Method Summary
#
# - HTree::Node#to_rexml -> REXML::Child
#
# == Example
#
# HTree.parse(...).to_rexml #=> REXML::Document
#
# == Comparison between HTree and REXML.
#
# - HTree parser is permissive HTML/XML parser.
# REXML parser is strict XML parser.
# HTree is recommended if you need to parse realworld HTML.
# REXML is recommended if you need strict error checking.
# - HTree object is immutable.
# REXML object is mutable.
# REXML should be used if you need modification.
#
require 'htree/modules'
require 'htree/output' # HTree::DocType#generate_content
module HTree
module Node
# convert to REXML tree.
def to_rexml
require 'rexml/document'
to_rexml_internal(nil, DefaultContext)
end
end
# :stopdoc:
class Doc
def to_rexml_internal(parent, context)
raise ArgumentError, "parent must be nil" if parent != nil
result = REXML::Document.new
self.children.each {|c|
c.to_rexml_internal(result, context)
}
result
end
end
class Elem
def to_rexml_internal(parent, context)
ename = self.element_name
ns_decl = {}
if context.namespace_uri(ename.namespace_prefix) != ename.namespace_uri
ns_decl[ename.namespace_prefix] = ename.namespace_uri
end
if ename.namespace_prefix
result = REXML::Element.new("#{ename.namespace_prefix}:#{ename.local_name}", parent)
else
result = REXML::Element.new(ename.local_name, parent)
end
self.each_attribute {|aname, atext|
if aname.namespace_prefix
if context.namespace_uri(aname.namespace_prefix) != aname.namespace_uri
ns_decl[aname.namespace_prefix] = aname.namespace_uri
end
result.add_attribute("#{aname.namespace_prefix}:#{aname.local_name}", atext.to_s)
else
result.add_attribute(aname.local_name, atext.to_s)
end
}
ns_decl.each {|k, v|
if k
result.add_namespace(k, v)
else
result.add_namespace(v)
end
}
context = context.subst_namespaces(ns_decl)
self.children.each {|c|
c.to_rexml_internal(result, context)
}
result
end
end
class Text
def to_rexml_internal(parent, context)
rcdata = self.rcdata.gsub(/[<>]/) { Encoder::ChRef[$&] }
REXML::Text.new(rcdata, true, parent, true)
end
end
class XMLDecl
def to_rexml_internal(parent, context)
r = REXML::XMLDecl.new(self.version, self.encoding, self.standalone)
parent << r if parent
r
end
end
class DocType
def to_rexml_internal(parent, context)
REXML::DocType.new([self.root_element_name, self.generate_content], parent)
end
end
class ProcIns
def to_rexml_internal(parent, context)
r = REXML::Instruction.new(self.target, self.content)
parent << r if parent
r
end
end
class Comment
def to_rexml_internal(parent, context)
REXML::Comment.new(self.content, parent)
end
end
class BogusETag
def to_rexml_internal(parent, context)
nil
end
end
# :startdoc:
end