@@ -621,16 +621,22 @@ def parent
621621 end
622622
623623 ##
624- # Returns a qualified name (QName) for this URI based on available vocabularies, if possible.
624+ # Returns a qualified name (QName) as a tuple of `[prefix, suffix]` for this URI based on available vocabularies, if possible.
625625 #
626626 # @example
627627 # RDF::URI('http://www.w3.org/2000/01/rdf-schema#').qname #=> [:rdfs, nil]
628628 # RDF::URI('http://www.w3.org/2000/01/rdf-schema#label').qname #=> [:rdfs, :label]
629629 # RDF::RDFS.label.qname #=> [:rdfs, :label]
630630 #
631+ # @param [Hash{Symbol => String}] prefixes
632+ # Explicit set of prefixes to look for matches, defaults to loaded vocabularies.
631633 # @return [Array(Symbol, Symbol)] or `nil` if no QName found
632- def qname
633- if self.to_s =~ %r([:/#]([^:/#]*)$)
634+ def qname(prefixes: nil)
635+ if prefixes
636+ prefixes.each do |prefix, uri|
637+ return [prefix, self.to_s[uri.length..-1].to_sym] if self.start_with?(uri)
638+ end
639+ elsif self.to_s =~ %r([:/#]([^:/#]*)$)
634640 local_name = $1
635641 vocab_uri = local_name.empty? ? self.to_s : self.to_s[0...-(local_name.length)]
636642 Vocabulary.each do |vocab|
@@ -655,9 +661,11 @@ def qname
655661 ##
656662 # Returns a string version of the QName or the full IRI
657663 #
664+ # @param [Hash{Symbol => String}] prefixes
665+ # Explicit set of prefixes to look for matches, defaults to loaded vocabularies.
658666 # @return [String] or `nil`
659- def pname
660- (q = self.qname) ? q.join(":") : to_s
667+ def pname(prefixes: nil)
668+ (q = self.qname(prefixes: prefixes) ) ? q.join(":") : to_s
661669 end
662670
663671 ##
0 commit comments