1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
require "rexml/child"
module REXML
##
# Represents an XML comment; that is, text between <!-- ... -->
class Comment < Child
include Comparable
START = "<!--"
START_RE = /\A<!--/u
STOP = "-->"
PATTERN = /#{START}(.*?)#{STOP}/um
attr_accessor :string # The content text
##
# Constructor. The first argument can be one of three types:
# @param first If String, the contents of this comment are set to the
# argument. If Comment, the argument is duplicated. If
# Source, the argument is scanned for a comment.
# @param second If the first argument is a Source, this argument
# should be nil, not supplied, or a Parent to be set as the parent
# of this object
def initialize( first, second = nil )
super second
if first.kind_of? String
@string = first
elsif first.kind_of? Comment
@string = first.string
elsif first.kind_of? Source
@string = first.match( PATTERN, true )[1]
end
end
def clone
Comment.new self
end
def write( output, indent=0 )
indent( output, indent )
output << START
output << @string
output << STOP
end
alias :to_s :string
##
# Compares this Comment to another; the contents of the comment are used
# in the comparison.
def <=>(other)
other.to_s <=> @string
end
##
# Compares this Comment to another; the contents of the comment are used
# in the comparison.
def ==( other )
other.kind_of? Comment and
(other <=> self) == 0
end
def Comment.parse_stream source, listener
listener.comment(source.match( PATTERN, true )[1])
end
end
end
|