summaryrefslogtreecommitdiff
path: root/lib/rexml
diff options
context:
space:
mode:
-rw-r--r--lib/rexml/doctype.rb1
-rw-r--r--lib/rexml/element.rb13
-rw-r--r--lib/rexml/encoding.rb6
-rw-r--r--lib/rexml/entity.rb2
-rw-r--r--lib/rexml/formatters/pretty.rb1
-rw-r--r--lib/rexml/functions.rb12
-rw-r--r--lib/rexml/parsers/baseparser.rb5
-rw-r--r--lib/rexml/parsers/sax2parser.rb17
-rw-r--r--lib/rexml/parsers/treeparser.rb5
-rw-r--r--lib/rexml/parsers/xpathparser.rb6
-rw-r--r--lib/rexml/source.rb14
-rw-r--r--lib/rexml/syncenumerator.rb7
-rw-r--r--lib/rexml/text.rb43
-rw-r--r--lib/rexml/validation/validation.rb6
-rw-r--r--lib/rexml/xpath_parser.rb14
15 files changed, 85 insertions, 67 deletions
@@ -117,7 +117,6 @@ module REXML
unless @children.empty?
next_indent = indent + 1
output << ' ['
- child = nil # speed
@children.each { |child|
output << "\n"
f.write( child, output )
@@ -296,7 +296,7 @@ module REXML
raise "First argument must be either an element name, or an Element object" if element.nil?
el = @elements.add(element)
attrs.each do |key, value|
- el.attributes[key]=Attribute.new(key,value,self)
end if attrs.kind_of? Hash
el
end
@@ -552,7 +552,11 @@ module REXML
def attribute( name, namespace=nil )
prefix = nil
- prefix = namespaces.index(namespace) if namespace
prefix = nil if prefix == 'xmlns'
attributes.get_attribute( "#{prefix ? prefix + ':' : ''}#{name}" )
end
@@ -704,7 +708,6 @@ module REXML
# A private helper method
def each_with_something( test, max=0, name=nil )
num = 0
- child=nil
@elements.each( name ){ |child|
yield child if test.call(child) and num += 1
return if max>0 and num == max
@@ -754,7 +757,6 @@ module REXML
raise "index (#{index}) must be >= 1" if index < 1
name = literalize(name) if name
num = 0
- child = nil
@element.find { |child|
child.kind_of? Element and
(name.nil? ? true : child.has_name?( name )) and
@@ -1217,7 +1219,8 @@ module REXML
def get_attribute_ns(namespace, name)
each_attribute() { |attribute|
if name == attribute.name &&
- namespace == attribute.namespace()
return attribute
end
}
@@ -56,14 +56,14 @@ module REXML
def check_encoding str
# We have to recognize UTF-16, LSB UTF-16, and UTF-8
- if str[0] == 0xfe && str[1] == 0xff
str[0,2] = ""
return UTF_16
- elsif str[0] == 0xff && str[1] == 0xfe
str[0,2] = ""
return UNILE
end
- str =~ /^\s*<\?xml\s+version\s*=\s*(['"]).*?\1\s+encoding\s*=\s*(["'])(.*?)\2/um
return $3.upcase if $3
return UTF_8
end
@@ -139,7 +139,7 @@ module REXML
if @parent
matches.each do |entity_reference|
entity_value = @parent.entity( entity_reference[0] )
- rv.gsub!( /%#{entity_reference};/um, entity_value )
end
end
return rv
@@ -31,6 +31,7 @@ module REXML
@level = 0
@ie_hack = ie_hack
@width = 80
end
protected
@@ -256,9 +256,15 @@ module REXML
end
}
- string(string).unpack('U*').collect { |c|
- if map.has_key? c then map[c] else c end
- }.compact.pack('U*')
end
# UNTESTED
@@ -242,6 +242,11 @@ module REXML
@document_status = :after_doctype
@source.read if @source.buffer.size<2
md = @source.match(/\s*/um, true)
end
end
if @document_status == :in_doctype
@@ -149,17 +149,26 @@ module REXML
procs = get_procs( :end_prefix_mapping, event[1] )
listeners = get_listeners( :end_prefix_mapping, event[1] )
if procs or listeners
- namespace_mapping.each do |prefix, uri|
# notify observers of namespaces
- procs.each { |ob| ob.call( prefix ) } if procs
- listeners.each { |ob| ob.end_prefix_mapping(prefix) } if listeners
end
end
when :text
#normalized = @parser.normalize( event[1] )
#handle( :characters, normalized )
copy = event[1].clone
- @entities.each { |key, value| copy = copy.gsub("&#{key};", value) }
copy.gsub!( Text::NUMERICENTITY ) {|m|
m=$1
m = "0#{m}" if m[0] == ?x
@@ -30,7 +30,10 @@ module REXML
return
when :start_element
tag_stack.push(event[1])
- el = @build_context = @build_context.add_element( event[1], event[2] )
when :end_element
tag_stack.pop
@build_context = @build_context.parent
@@ -332,12 +332,12 @@ module REXML
predicates << expr[1..-2] if expr
end
#puts "PREDICATES = #{predicates.inspect}"
- predicates.each{ |expr|
- #puts "ORING #{expr}"
preds = []
parsed << :predicate
parsed << preds
- OrExpr(expr, preds)
}
#puts "PREDICATES = #{predicates.inspect}"
path
@@ -59,6 +59,9 @@ module REXML
@to_utf = true
else
@to_utf = false
end
end
@@ -147,13 +150,13 @@ module REXML
str = @source.read( 2 )
if encoding
self.encoding = encoding
- elsif 0xfe == str[0] && 0xff == str[1]
@line_break = "\000>"
- elsif 0xff == str[0] && 0xfe == str[1]
@line_break = ">\000"
- elsif 0xef == str[0] && 0xbb == str[1]
str += @source.read(1)
- str = '' if (0xbf == str[2])
@line_break = ">"
else
@line_break = ">"
@@ -193,6 +196,9 @@ module REXML
str = @source.readline(@line_break)
str = decode(str) if @to_utf and str
@buffer << str
rescue Exception, NameError
@source = nil
end
@@ -6,8 +6,7 @@ module REXML
# Enumerable objects.
def initialize(*enums)
@gens = enums
- @biggest = @gens[0]
- @gens.each {|x| @biggest = x if x.size > @biggest.size }
end
# Returns the number of enumerated Enumerable objects, i.e. the size
@@ -24,8 +23,8 @@ module REXML
# Enumerates rows of the Enumerable objects.
def each
- @biggest.zip( *@gens ) {|a|
- yield(*a[1..-1])
}
self
end
@@ -308,37 +308,24 @@ module REXML
# Unescapes all possible entities
def Text::unnormalize( string, doctype=nil, filter=nil, illegal=nil )
- rv = string.clone
- rv.gsub!( /\r\n?/, "\n" )
- matches = rv.scan( REFERENCE )
- return rv if matches.size == 0
- rv.gsub!( NUMERICENTITY ) {|m|
- m=$1
- m = "0#{m}" if m[0] == ?x
- [Integer(m)].pack('U*')
- }
- matches.collect!{|x|x[0]}.compact!
- if matches.size > 0
- if doctype
- matches.each do |entity_reference|
- unless filter and filter.include?(entity_reference)
- entity_value = doctype.entity( entity_reference )
- re = /&#{entity_reference};/
- rv.gsub!( re, entity_value ) if entity_value
- end
end
else
- matches.each do |entity_reference|
- unless filter and filter.include?(entity_reference)
- entity_value = DocType::DEFAULT_ENTITIES[ entity_reference ]
- re = /&#{entity_reference};/
- rv.gsub!( re, entity_value.value ) if entity_value
- end
- end
end
- rv.gsub!( /&amp;/, '&' )
- end
- rv
end
end
end
@@ -33,8 +33,8 @@ module REXML
sattr = [:start_attribute, nil]
eattr = [:end_attribute]
text = [:text, nil]
- k,v = event[2].find { |k,v|
- sattr[1] = k
#puts "Looking for #{sattr.inspect}"
m = @current.next( sattr )
#puts "Got #{m.inspect}"
@@ -47,7 +47,7 @@ module REXML
@current = m
else
#puts "Didn't get end"
- text[1] = v
#puts "Looking for #{text.inspect}"
m = m.next( text )
#puts "Got #{m.inspect}"
@@ -222,7 +222,7 @@ module REXML
when :child
new_nodeset = []
nt = nil
- for node in nodeset
nt = node.node_type
new_nodeset += node.children if nt == :element or nt == :document
end
@@ -266,7 +266,7 @@ module REXML
when :ancestor
new_nodeset = []
- for node in nodeset
while node.parent
node = node.parent
new_nodeset << node unless new_nodeset.include? node
@@ -277,7 +277,7 @@ module REXML
when :ancestor_or_self
new_nodeset = []
- for node in nodeset
if node.node_type == :element
new_nodeset << node
while ( node.parent )
@@ -341,7 +341,7 @@ module REXML
when :descendant
results = []
nt = nil
- for node in nodeset
nt = node.node_type
results += expr( path_stack.dclone.unshift( :descendant_or_self ),
node.children ) if nt == :element or nt == :document
@@ -376,7 +376,7 @@ module REXML
when :preceding
new_nodeset = []
- for node in nodeset
new_nodeset += preceding( node )
end
#puts "NEW NODESET => #{new_nodeset.inspect}"
@@ -385,7 +385,7 @@ module REXML
when :following
new_nodeset = []
- for node in nodeset
new_nodeset += following( node )
end
nodeset = new_nodeset
@@ -395,7 +395,7 @@ module REXML
#puts "In :namespace"
new_nodeset = []
prefix = path_stack.shift
- for node in nodeset
if (node.node_type == :element or node.node_type == :attribute)
if @namespaces
namespaces = @namespaces