method
parse_attributes
v2_6_3 -
Show latest stable
-
0 notes -
Class: REXML::Parsers::BaseParser
- 1_8_6_287
- 1_8_7_72
- 1_8_7_330
- 1_9_1_378
- 1_9_2_180
- 1_9_3_125
- 1_9_3_392
- 2_1_10
- 2_2_9
- 2_4_6
- 2_5_5
- 2_6_3 (0)
- What's this?
parse_attributes(prefixes, curr_ns)
private
Hide source
# File lib/rexml/parsers/baseparser.rb, line 485 def parse_attributes(prefixes, curr_ns) attributes = {} closed = false match_data = @source.match(/^(.*?)(\/)?>/m, true) if match_data.nil? message = "Start tag isn't ended" raise REXML::ParseException.new(message, @source) end raw_attributes = match_data[1] closed = !match_data[2].nil? return attributes, closed if raw_attributes.nil? return attributes, closed if raw_attributes.empty? scanner = StringScanner.new(raw_attributes) until scanner.eos? if scanner.scan(/\s+/) break if scanner.eos? end pos = scanner.pos loop do break if scanner.scan(ATTRIBUTE_PATTERN) unless scanner.scan(QNAME) message = "Invalid attribute name: <#{scanner.rest}>" raise REXML::ParseException.new(message, @source) end name = scanner[0] unless scanner.scan(/\s*=\s*/m) message = "Missing attribute equal: <#{name}>" raise REXML::ParseException.new(message, @source) end quote = scanner.scan(/['"]/) unless quote message = "Missing attribute value start quote: <#{name}>" raise REXML::ParseException.new(message, @source) end unless scanner.scan(/.*#{Regexp.escape(quote)}/m) match_data = @source.match(/^(.*?)(\/)?>/m, true) if match_data scanner << "/" if closed scanner << ">" scanner << match_data[1] scanner.pos = pos closed = !match_data[2].nil? next end message = "Missing attribute value end quote: <#{name}>: <#{quote}>" raise REXML::ParseException.new(message, @source) end end name = scanner[1] prefix = scanner[2] local_part = scanner[3] # quote = scanner[4] value = scanner[5] if prefix == "xmlns" if local_part == "xml" if value != "http://www.w3.org/XML/1998/namespace" msg = "The 'xml' prefix must not be bound to any other namespace "+ "(http://www.w3.org/TR/REC-xml-names/#ns-decl)" raise REXML::ParseException.new( msg, @source, self ) end elsif local_part == "xmlns" msg = "The 'xmlns' prefix must not be declared "+ "(http://www.w3.org/TR/REC-xml-names/#ns-decl)" raise REXML::ParseException.new( msg, @source, self) end curr_ns << local_part elsif prefix prefixes << prefix unless prefix == "xml" end if attributes.has_key?(name) msg = "Duplicate attribute #{name.inspect}" raise REXML::ParseException.new(msg, @source, self) end attributes[name] = value end return attributes, closed end