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