class XML::InternalParserNS
Constants
- XMLNS
Attributes
ns[R]
Public Class Methods
new(parserNS, *args)
click to toggle source
Calls superclass method
# File lib/xml/parserns.rb, line 12 def self.new(parserNS, *args) nssep = nil if args.length == 2 && !args[0].is_a?(Parser) nssep = args[1] args = args.shift end obj = super(*args) obj.__init__(parserNS, nssep) obj end
Public Instance Methods
__init__(parserNS, nssep)
click to toggle source
# File lib/xml/parserns.rb, line 23 def __init__(parserNS, nssep) @ns = [] @parserNS = parserNS @nssep = nssep end
getNSURI(prefix)
click to toggle source
# File lib/xml/parserns.rb, line 80 def getNSURI(prefix) return XMLNS if prefix == 'xml' @ns.reverse_each do |n| return n[prefix] if n.include?(prefix) end nil end
getNamespaces()
click to toggle source
# File lib/xml/parserns.rb, line 76 def getNamespaces @ns[-1] end
getSpecifiedAttributes()
click to toggle source
Calls superclass method
# File lib/xml/parserns.rb, line 103 def getSpecifiedAttributes ret = super # attrs = {} # ret.each do |k, v| # next if k =~ /^xmlns/u # if @nssep # prefix, uri, localpart = resolveAttributeQName(k) # k = uri.to_s + @nssep + k # end # attrs[k] = v # end attrs = [] ret.each do |k| next if k =~ /^xmlns:|^xmlns$/u if @nssep prefix, uri, localpart = resolveAttributeQName(k) k = uri.to_s + @nssep + k end attrs.push(k) end attrs end
parse(*args) { |START_NAMESPACE_DECL, prefix, uri, parser| ... }
click to toggle source
Calls superclass method
# File lib/xml/parserns.rb, line 30 def parse(*args) if block_given? super do |nodetype, name, args, parser| case nodetype when START_ELEM ns, args = getNSAttrs(args) @ns.push(ns) if @nssep if @parserNS.respond_to?(:startNamespaceDecl) ns.each do |prefix, uri| yield(START_NAMESPACE_DECL, prefix, uri, parser) end end prefix, uri, localpart = resolveElementQName(name) name = uri + @nssep + name if uri attrs = {} args.each do |k, v| prefix, uri, localpart = resolveAttributeQName(k) k = uri + @nssep + k if uri attrs[k] = v end args = attrs end yield(nodetype, name, args, parser) when END_ELEM if @nssep prefix, uri, localpart = resolveElementQName(name) name = uri + @nssep + name if uri end yield(nodetype, name, args, parser) ns = @ns.pop if @nssep and @parserNS.respond_to?(:endNamespaceDecl) ns.to_a.reverse.each do |prefix, uri| yield(END_NAMESPACE_DECL, prefix, nil, parser) end end else yield(nodetype, name, args, parser) end end else super end end
resolveAttributeQName(qname)
click to toggle source
# File lib/xml/parserns.rb, line 95 def resolveAttributeQName(qname) qname =~ /^((\S+):)?(\S+)$/u prefix, localpart = $2, $3 uri = nil uri = getNSURI(prefix) if !prefix.nil? [prefix, uri, localpart] end
resolveElementQName(qname)
click to toggle source
# File lib/xml/parserns.rb, line 88 def resolveElementQName(qname) qname =~ /^((\S+):)?(\S+)$/u prefix, localpart = $2, $3 uri = getNSURI(prefix) [prefix, uri, localpart] end
Private Instance Methods
endElement(name)
click to toggle source
# File lib/xml/parserns.rb, line 168 def endElement(name) if @parserNS.respond_to?(:endElement) if @nssep prefix, uri, localpart = resolveElementQName(name) name = uri + @nssep + name if uri end @parserNS.endElement(name) end ns = @ns.pop if @nssep and @parserNS.respond_to?(:endNamespaceDecl) ns.to_a.reverse.each do |prefix, uri| @parserNS.endNamespaceDecl(prefix) end end end
getNSAttrs(args, eliminateNSDecl = false)
click to toggle source
# File lib/xml/parserns.rb, line 129 def getNSAttrs(args, eliminateNSDecl = false) ns = {} newargs = {} args.each do |n, v| prefix, localpart = n.split(':') if prefix == 'xmlns' ns[localpart] = v next if eliminateNSDecl end newargs[n] = v end [ns, newargs] end
startElement(name, args)
click to toggle source
# File lib/xml/parserns.rb, line 144 def startElement(name, args) ns, args = getNSAttrs(args) @ns.push(ns) if @nssep and @parserNS.respond_to?(:startNamespaceDecl) ns.each do |prefix, uri| @parserNS.startNamespaceDecl(prefix, uri) end end if @parserNS.respond_to?(:startElement) if @nssep prefix, uri, localpart = resolveElementQName(name) name = uri + @nssep + name if uri attrs = {} args.each do |k, v| prefix, uri, localpart = resolveAttributeQName(k) k = uri + @nssep + k if uri attrs[k] = v end args = attrs end @parserNS.startElement(name, args) end end