diff options
author | ser <ser@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-06-15 18:31:16 +0000 |
---|---|---|
committer | ser <ser@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-06-15 18:31:16 +0000 |
commit | 2403ad9e7de8976a83798f9d86f82f3b5ae0d2cd (patch) | |
tree | c0f4098655ece836190b90b412481b561d07e640 /lib/rexml | |
parent | 4d33715fe4b0c9750b4cf4e71166e8d67ecc8395 (diff) | |
download | ruby-2403ad9e7de8976a83798f9d86f82f3b5ae0d2cd.tar.gz |
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
Diffstat (limited to 'lib/rexml')
-rw-r--r-- | lib/rexml/light/node.rb | 25 | ||||
-rw-r--r-- | lib/rexml/parsers/baseparser.rb | 23 | ||||
-rw-r--r-- | lib/rexml/parsers/sax2parser.rb | 2 | ||||
-rw-r--r-- | lib/rexml/quickpath.rb | 2 | ||||
-rw-r--r-- | 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*<!DOCTYPE\s/um DOCTYPE_PATTERN = /\s*<!DOCTYPE\s+(.*?)(\[|>)/um @@ -38,6 +39,7 @@ module REXML COMMENT_START = /\A<!--/u COMMENT_PATTERN = /<!--(.*?)-->/um CDATA_START = /\A<!\[CDATA\[/u + CDATA_END = /^\s*\]\s*>/um CDATA_PATTERN = /<!\[CDATA\[(.*?)\]\]>/um XMLDECL_START = /\A<\?xml\s/u; XMLDECL_PATTERN = /<\?xml\s+(.*?)\?>*/um @@ -51,7 +53,7 @@ module REXML STANDALONE = /\bstandalone=["'](.*?)['"]/um ENTITY_START = /^\s*<!ENTITY/ - IDENTITY = /^([!\*\w-]+)(\s+#{NCNAME_STR})?(\s+["'].*?['"])?(\s+['"].*?["'])?/u + IDENTITY = /^([!\*\w\-]+)(\s+#{NCNAME_STR})?(\s+["'].*?['"])?(\s+['"].*?["'])?/u ELEMENTDECL_START = /^\s*<!ELEMENT/um ELEMENTDECL_PATTERN = /^\s*(<!ELEMENT.*?)>/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*<!ATTLIST/um ATTLISTDECL_PATTERN = /^\s*<!ATTLIST\s+#{NAME}(?:#{ATTDEF})*\s*>/um NOTATIONDECL_START = /^\s*<!NOTATION/um - PUBLIC = /^\s*<!NOTATION\s+(\w[-\w]*)\s+(PUBLIC)\s+((["']).*?\4)\s*>/um - SYSTEM = /^\s*<!NOTATION\s+(\w[-\w]*)\s+(SYSTEM)\s+((["']).*?\4)\s*>/um + PUBLIC = /^\s*<!NOTATION\s+(\w[\-\w]*)\s+(PUBLIC)\s+((["']).*?\4)\s*>/um + SYSTEM = /^\s*<!NOTATION\s+(\w[\-\w]*)\s+(SYSTEM)\s+((["']).*?\4)\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 <ser@germane-software.com>" Date = "+2003/110" - Version = "2.7.0" + Version = "2.7.1" end |