From 2403ad9e7de8976a83798f9d86f82f3b5ae0d2cd Mon Sep 17 00:00:00 2001 From: ser Date: Sun, 15 Jun 2003 18:31:16 +0000 Subject: REXML hadn't been tested with Ruby 1.8.0, which was really, really, unbelievably stupid of me. There were a lot of warnings and some errors that were caused by Block vs. Proc differences; these have been fixed. REXML passes all of the tests under Ruby 1.8.0. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3943 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/rexml/light/node.rb | 25 ++++++++++++------------- lib/rexml/parsers/baseparser.rb | 23 +++++++++++++---------- lib/rexml/parsers/sax2parser.rb | 2 +- lib/rexml/quickpath.rb | 2 +- lib/rexml/rexml.rb | 2 +- 5 files changed, 28 insertions(+), 26 deletions(-) diff --git a/lib/rexml/light/node.rb b/lib/rexml/light/node.rb index 5b7b95a7dc..680f2c23fe 100644 --- a/lib/rexml/light/node.rb +++ b/lib/rexml/light/node.rb @@ -42,7 +42,9 @@ module REXML if node.kind_of? String node = [ :text, node ] elsif node.nil? - node = [ :start_document, nil, nil ] + node = [ :document, nil, nil ] + elsif node[0] == :start_element + node[0] = :element end replace( node ) _old_put( 1, 0, 1 ) @@ -117,6 +119,10 @@ module REXML end end + def =~( path ) + XPath.match( self, path ) + end + # Doesn't handle namespaces yet def []=( reference, ns, value=nil ) el!() @@ -139,7 +145,7 @@ module REXML # object. Otherwise, the element argument is a string, the namespace (if # provided) is the namespace the element is created in. def << element - if text? + if node_type() == :text at(-1) << element else newnode = Node.new( element ) @@ -150,7 +156,7 @@ module REXML end def node_type - self[0] + _old_get(0) end def text=( foo ) @@ -163,10 +169,6 @@ module REXML context = context.at(1) while context.at(1) end - def element? - at(0) == :start_element - end - def has_name?( name, namespace = '' ) el!() at(3) == name and namespace() == namespace @@ -181,19 +183,16 @@ module REXML at(1) end - def text? - at(0) == :text - end - def to_s end def el! - if text?() - _old_put( 0, :start_element ) + if node_type() != :element and node_type() != :document + _old_put( 0, :element ) push({}) end + self end private diff --git a/lib/rexml/parsers/baseparser.rb b/lib/rexml/parsers/baseparser.rb index 614bdc3948..cfcea16f1d 100644 --- a/lib/rexml/parsers/baseparser.rb +++ b/lib/rexml/parsers/baseparser.rb @@ -23,14 +23,15 @@ module REXML # # Nat Price gave me some good ideas for the API. class BaseParser - NCNAME_STR= '[\w:][-\w\d.]*' + NCNAME_STR= '[\w:][\-\w\d.]*' NAME_STR= "(?:#{NCNAME_STR}:)?#{NCNAME_STR}" - NAMECHAR = '[-\w\d\.:]' + NAMECHAR = '[\-\w\d\.:]' NAME = "([\\w:]#{NAMECHAR}*)" NMTOKEN = "(?:#{NAMECHAR})+" NMTOKENS = "#{NMTOKEN}(\\s+#{NMTOKEN})*" REFERENCE = "(?:&#{NAME};|&#\\d+;|&#x[0-9a-fA-F]+;)" + REFERENCE_RE = /#{REFERENCE}/ DOCTYPE_START = /\A\s*)/um @@ -38,6 +39,7 @@ module REXML COMMENT_START = /\A/um CDATA_START = /\A/um CDATA_PATTERN = //um XMLDECL_START = /\A<\?xml\s/u; XMLDECL_PATTERN = /<\?xml\s+(.*?)\?>*/um @@ -51,7 +53,7 @@ module REXML STANDALONE = /\bstandalone=["'](.*?)['"]/um ENTITY_START = /^\s*/um ENUMERATION = "\\(\\s*#{NMTOKEN}(?:\\s*\\|\\s*#{NMTOKEN})*\\s*\\)" @@ -61,16 +63,17 @@ module REXML ATTVALUE = "(?:\"((?:[^<&\"]|#{REFERENCE})*)\")|(?:'((?:[^<&']|#{REFERENCE})*)')" DEFAULTDECL = "(#REQUIRED|#IMPLIED|(?:(#FIXED\\s+)?#{ATTVALUE}))" ATTDEF = "\\s+#{NAME}\\s+#{ATTTYPE}\\s+#{DEFAULTDECL}" + ATTDEF_RE = /#{ATTDEF}/ ATTLISTDECL_START = /^\s*/um NOTATIONDECL_START = /^\s*/um - SYSTEM = /^\s*/um + PUBLIC = /^\s*/um + SYSTEM = /^\s*/um TEXT_PATTERN = /\A([^<]*)/um # Entity constants - PUBIDCHAR = "\x20\x0D\x0Aa-zA-Z0-9-()+,./:=?;!*@$_%#" + PUBIDCHAR = "\x20\x0D\x0Aa-zA-Z0-9\\-()+,./:=?;!*@$_%#" SYSTEMLITERAL = %Q{((?:"[^"]*")|(?:'[^']*'))} PUBIDLITERAL = %Q{("[#{PUBIDCHAR}']*"|'[#{PUBIDCHAR}]*')} EXTERNALID = "(?:(?:(SYSTEM)\\s+#{SYSTEMLITERAL})|(?:(PUBLIC)\\s+#{PUBIDLITERAL}\\s+#{SYSTEMLITERAL}))" @@ -243,7 +246,7 @@ module REXML contents = md[0] pairs = {} - values = md[0].scan( ATTDEF ) + values = md[0].scan( ATTDEF_RE ) values.each do |attdef| unless attdef[3] == "#IMPLIED" attdef.compact! @@ -263,9 +266,9 @@ module REXML raise REXML::ParseException.new( "error parsing notation: no matching pattern", @source ) end return [ :notationdecl, md[1], md[2], md[3] ] - when /^\s*\]\s*>/um + when CDATA_END @document_status = :after_doctype - @source.match( /^\s*\]\s*>/um, true ) + @source.match( CDATA_END, true ) return [ :end_doctype ] end end @@ -358,7 +361,7 @@ module REXML def unnormalize( string, entities=nil, filter=nil ) rv = string.clone rv.gsub!( /\r\n?/, "\n" ) - matches = rv.scan( REFERENCE) + matches = rv.scan( REFERENCE_RE ) return rv if matches.size == 0 rv.gsub!( /�*((?:\d+)|(?:x[a-fA-F0-9]+));/ ) {|m| m=$1 diff --git a/lib/rexml/parsers/sax2parser.rb b/lib/rexml/parsers/sax2parser.rb index 8598fd43e9..4cddc4806d 100644 --- a/lib/rexml/parsers/sax2parser.rb +++ b/lib/rexml/parsers/sax2parser.rb @@ -185,7 +185,7 @@ module REXML end def add( pair ) - if pair[-1].kind_of? Proc + if pair[-1].kind_of? Proc or (defined? Block and pair[-1].kind_of? Block) @procs << pair unless @procs.include? pair else @listeners << pair unless @listeners.include? pair diff --git a/lib/rexml/quickpath.rb b/lib/rexml/quickpath.rb index c099db8579..2c54ac1999 100644 --- a/lib/rexml/quickpath.rb +++ b/lib/rexml/quickpath.rb @@ -31,7 +31,7 @@ module REXML results = filter([element], path) when /^\*/u results = filter(element.to_a, path) - when /^[\[!\w:]/u + when /^[[!\w:]/u # match on child matches = [] children = element.to_a diff --git a/lib/rexml/rexml.rb b/lib/rexml/rexml.rb index 652a8cd74d..b7de03f3f9 100644 --- a/lib/rexml/rexml.rb +++ b/lib/rexml/rexml.rb @@ -22,5 +22,5 @@ module REXML Copyright = "Copyright #{Time.now.year} Sean Russell " Date = "+2003/110" - Version = "2.7.0" + Version = "2.7.1" end -- cgit v1.2.3