From 95be40a06d1227a0cd0a1cec4424ab33748d1450 Mon Sep 17 00:00:00 2001 From: ser Date: Fri, 13 Feb 2004 22:40:14 +0000 Subject: @@ Fix for the XPath descendant* result set ordering bug @@ @@ SAX2 listener bug fixes @@ @@ Undid a code change that caused a 10x speed regression @@ @@ Indentation fixes, and a new word wrapping feature for text nodes was contributed by Devin Bayer (documentation forthcoming; see the change logs for now) @@ The XPath bug fix is really ugly and inefficient, but I spent two days hacking at it and this was the best I could come up with. The SAX2 listener fixes had to do with crashes in certain conditions, like when there was a carriage return at the end of a document Several people submitted patches for the speed regression; it is embarrassing how long it took me to get around to looking at this. To this day, I don't know where the offending code came from. Encoding fixes Added a contributed word wrapping option for text formatting. Devin Bayer contributed this. Here's his comment: "Setting :wordwrapping to :all, wordwraps all text nodes longer than 60 characters. Setting :indentstyle to aString, make aString used as indentation, instead of the default ' '. And as long as :respect_whitespace isn't set for the element, multiline text nodes will be indented." git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5696 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/rexml/parsers/baseparser.rb | 17 ++++++++++------- lib/rexml/parsers/sax2parser.rb | 9 +++++---- 2 files changed, 15 insertions(+), 11 deletions(-) (limited to 'lib/rexml/parsers') diff --git a/lib/rexml/parsers/baseparser.rb b/lib/rexml/parsers/baseparser.rb index 057617d6e8..025d43db54 100644 --- a/lib/rexml/parsers/baseparser.rb +++ b/lib/rexml/parsers/baseparser.rb @@ -122,14 +122,14 @@ module REXML # Returns true if there are no more events def empty? - !has_next? + #puts "@source.empty? = #{@source.empty?}" + #puts "@stack.empty? = #{@stack.empty?}" + return (@source.empty? and @stack.empty?) end # Returns true if there are more events. Synonymous with !empty? def has_next? - return true if @closed - @source.read if @source.buffer.size==0 and !@source.empty? - (!@source.empty? and @source.buffer.strip.size>0) or @stack.size>0 or @closed + return !(@source.empty? and @stack.empty?) end # Push an event back on the head of the stream. This method @@ -329,9 +329,12 @@ module REXML end else md = @source.match( TEXT_PATTERN, true ) - #md = @source.match_to_consume( '<', TEXT_PATTERN ) - #@source.read - raise REXML::ParseException("no text to add") if md[0].length == 0 + if md[0].length == 0 + #puts "EMPTY = #{empty?}" + #puts "BUFFER = \"#{@source.buffer}\"" + @source.match( /(\s+)/, true ) + end + #return [ :text, "" ] if md[0].length == 0 # unnormalized = Text::unnormalize( md[1], self ) # return PullEvent.new( :text, md[1], unnormalized ) return [ :text, md[1] ] diff --git a/lib/rexml/parsers/sax2parser.rb b/lib/rexml/parsers/sax2parser.rb index aab87caae4..8c82cf8fc1 100644 --- a/lib/rexml/parsers/sax2parser.rb +++ b/lib/rexml/parsers/sax2parser.rb @@ -45,7 +45,7 @@ module REXML if args.size == 2 args[1].each { |match| @procs << [args[0], match, blok] } else - add( [args[0], /.*/, blok] ) + add( [args[0], nil, blok] ) end elsif args[0].kind_of? Array if args.size == 2 @@ -54,7 +54,7 @@ module REXML args[0].each { |match| add( [ :start_element, match, blok ] ) } end else - add([nil, /.*/, args[0]]) + add([nil, nil, args[0]]) end end @@ -164,9 +164,10 @@ module REXML def get_procs( symbol, name ) return nil if @procs.size == 0 @procs.find_all do |sym, match, block| + #puts sym.inspect+"=="+symbol.inspect+ "\t"+match.inspect+"=="+name.inspect+ "\t"+( (sym.nil? or symbol == sym) and ((name.nil? and match.nil?) or match.nil? or ( (name == match) or (match.kind_of? Regexp and name =~ match)))).to_s ( (sym.nil? or symbol == sym) and - (name.nil? or ( + ((name.nil? and match.nil?) or match.nil? or ( (name == match) or (match.kind_of? Regexp and name =~ match) ) @@ -179,7 +180,7 @@ module REXML @listeners.find_all do |sym, match, block| ( (sym.nil? or symbol == sym) and - (name.nil? or ( + ((name.nil? and match.nil?) or match.nil? or ( (name == match) or (match.kind_of? Regexp and name =~ match) ) -- cgit v1.2.3