You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
2.5 KiB
Ruby
128 lines
2.5 KiB
Ruby
require 'htree/modules'
|
|
require 'htree/fstr'
|
|
|
|
module HTree
|
|
module Node
|
|
# raw_string returns a source string recorded by parsing.
|
|
# It returns +nil+ if the node is constructed not via parsing.
|
|
def raw_string
|
|
catch(:raw_string_tag) {
|
|
return raw_string_internal('')
|
|
}
|
|
nil
|
|
end
|
|
end
|
|
|
|
# :stopdoc:
|
|
class Doc
|
|
def raw_string_internal(result)
|
|
@children.each {|n|
|
|
n.raw_string_internal(result)
|
|
}
|
|
end
|
|
end
|
|
|
|
class Elem
|
|
def raw_string_internal(result)
|
|
@stag.raw_string_internal(result)
|
|
@children.each {|n| n.raw_string_internal(result) }
|
|
@etag.raw_string_internal(result) if @etag
|
|
end
|
|
end
|
|
|
|
module Tag
|
|
def init_raw_string() @raw_string = nil end
|
|
def raw_string=(arg) @raw_string = HTree.frozen_string(arg) end
|
|
def raw_string_internal(result)
|
|
throw :raw_string_tag if !@raw_string
|
|
result << @raw_string
|
|
end
|
|
end
|
|
|
|
module Leaf
|
|
def init_raw_string() @raw_string = nil end
|
|
def raw_string=(arg) @raw_string = HTree.frozen_string(arg) end
|
|
def raw_string_internal(result)
|
|
throw :raw_string_tag if !@raw_string
|
|
result << @raw_string
|
|
end
|
|
end
|
|
|
|
class Text
|
|
def raw_string=(arg)
|
|
if arg == @rcdata then
|
|
@raw_string = @rcdata
|
|
else
|
|
super
|
|
end
|
|
end
|
|
end
|
|
# :startdoc:
|
|
|
|
module Node
|
|
def eliminate_raw_string
|
|
raise NotImplementedError
|
|
end
|
|
end
|
|
|
|
# :stopdoc:
|
|
|
|
class Doc
|
|
def eliminate_raw_string
|
|
Doc.new(@children.map {|c| c.eliminate_raw_string })
|
|
end
|
|
end
|
|
|
|
class Elem
|
|
def eliminate_raw_string
|
|
Elem.new!(
|
|
@stag.eliminate_raw_string,
|
|
@empty ? nil : @children.map {|c| c.eliminate_raw_string },
|
|
@etag && @etag.eliminate_raw_string)
|
|
end
|
|
end
|
|
|
|
class Text
|
|
def eliminate_raw_string
|
|
Text.new_internal(@rcdata)
|
|
end
|
|
end
|
|
|
|
class STag
|
|
def eliminate_raw_string
|
|
STag.new(@qualified_name, @attributes, @inherited_context)
|
|
end
|
|
end
|
|
|
|
class ETag
|
|
def eliminate_raw_string
|
|
self.class.new(@qualified_name)
|
|
end
|
|
end
|
|
|
|
class XMLDecl
|
|
def eliminate_raw_string
|
|
XMLDecl.new(@version, @encoding, @standalone)
|
|
end
|
|
end
|
|
|
|
class DocType
|
|
def eliminate_raw_string
|
|
DocType.new(@root_element_name, @public_identifier, @system_identifier)
|
|
end
|
|
end
|
|
|
|
class ProcIns
|
|
def eliminate_raw_string
|
|
ProcIns.new(@target, @content)
|
|
end
|
|
end
|
|
|
|
class Comment
|
|
def eliminate_raw_string
|
|
Comment.new(@content)
|
|
end
|
|
end
|
|
# :startdoc:
|
|
end
|