lib/rdf/rdfa/reader.rb in rdf-rdfa-0.3.19 vs lib/rdf/rdfa/reader.rb in rdf-rdfa-0.3.19.1
- old
+ new
@@ -87,10 +87,21 @@
# Version
# @!attribute [r] version
# @return [:"rdfa1.0", :"rdfa1.1"]
attr_reader :version
+ # Repository used for collecting triples.
+ # @!attribute [r] repository
+ # @return [RDF::Repository]
+ attr_reader :repository
+
+ # Returns the XML implementation module for this reader instance.
+ #
+ # @!attribute [rw] implementation
+ # @return [Module]
+ attr_reader :implementation
+
# The Recursive Baggage
# @private
class EvaluationContext # :nodoc:
##
# The base.
@@ -230,16 +241,10 @@
v << "lists[#{list_mapping.keys.length}]" if list_mapping
v.join(", ")
end
end
- # Returns the XML implementation module for this reader instance.
- #
- # @!attribute [rw] implementation
- # @return [Module]
- attr_reader :implementation
-
##
# Initializes the RDFa reader instance.
#
# @param [IO, File, String] input
# the input stream to read
@@ -271,11 +276,12 @@
# @raise [RDF::ReaderError] if _validate_
def initialize(input = $stdin, options = {}, &block)
super do
@debug = options[:debug]
@options = {:reference_folding => true}.merge(@options)
-
+ @repository = RDF::Repository.new
+
@options[:rdfagraph] = case @options[:rdfagraph]
when String, Symbol then @options[:rdfagraph].to_s.split(',').map(&:strip).map(&:to_sym)
when Array then @options[:rdfagraph].map {|o| o.to_s.to_sym}
else []
end.select {|o| [:output, :processor].include?(o)}
@@ -347,34 +353,17 @@
#
# @yield [statement]
# @yieldparam [RDF::Statement] statement
# @return [void]
def each_statement(&block)
-
- if @options[:vocab_expansion]
- # Process vocabulary expansion after normal processing
- @options[:vocab_expansion] = false
- expand.each_statement(&block)
- @options[:vocab_expansion] = true
- elsif @options[:reference_folding]
- # Process reference folding after normal processing
- @options[:reference_folding] = false
- fold_references.each_statement(&block)
- @options[:reference_folding] = true
- else
- @callback = block
-
- # Process any saved callbacks (processor graph issues)
- @saved_callbacks.each {|s| @callback.call(s) } if @saved_callbacks
-
+ unless @processed || @root.nil?
# Add prefix definitions from host defaults
@host_defaults[:uri_mappings].each_pair do |prefix, value|
prefix(prefix, value)
end
# parse
- return unless @root
parse_whole_document(@doc, RDF::URI(base_uri))
def extract_script(el, input, type, options, &block)
add_debug(el, "script element of type #{type}")
begin
@@ -394,34 +383,54 @@
end
# Look for Embedded Turtle and RDF/XML
unless @root.xpath("//rdf:RDF", "xmlns:rdf" => "http://www.w3.org/1999/02/22-rdf-syntax-ns#").empty?
extract_script(@root, @doc, "application/rdf+xml", @options) do |statement|
- block.call(statement)
+ @repository << statement
end
end
# Look for Embedded scripts
@root.css("script[type]").each do |el|
type = el.attribute("type")
extract_script(el, el.inner_text, type, @options) do |statement|
- block.call(statement)
+ @repository << statement
end
end
# Look for Embedded microdata
unless @root.xpath("//@itemscope").empty?
begin
require 'rdf/microdata'
add_debug(@doc, "process microdata")
- RDF::Microdata::Reader.new(@doc, options).each(&block)
+ @repository << RDF::Microdata::Reader.new(@doc, options)
rescue
add_debug(@doc, "microdata detected, not processed")
end
end
+
+ # Perform reference folding
+ fold_references(@repository) if @options[:reference_folding]
+
+ # Perform vocabulary expansion
+ expand(@repository) if @options[:vocab_expansion]
+
+ @processed = true
end
+
+ # Return statements in the default graph for
+ # statements in the associated named or default graph from the
+ # processed repository
+ @repository.each do |statement|
+ case statement.context
+ when nil
+ yield statement if @options[:rdfagraph].include?(:output)
+ when RDF::RDFA.ProcessorGraph
+ yield RDF::Statement.new(*statement.to_triple) if @options[:rdfagraph].include?(:processor)
+ end
+ end
end
##
# Iterates the given block for each RDF triple in the input.
#
@@ -475,37 +484,29 @@
def add_processor_message(node, message, process_class)
puts "#{node_path(node)}: #{message}" if ::RDF::RDFa.debug?
@debug << "#{node_path(node)}: #{message}" if @debug.is_a?(Array)
if @options[:processor_callback] || @options[:rdfagraph].include?(:processor)
- g = RDF::Graph.new
n = RDF::Node.new
- g << RDF::Statement.new(n, RDF["type"], process_class)
- g << RDF::Statement.new(n, RDF::DC.description, message)
- g << RDF::Statement.new(n, RDF::DC.date, RDF::Literal::Date.new(DateTime.now))
- g << RDF::Statement.new(n, RDF::RDFA.context, base_uri) if base_uri
+ processor_statements = [
+ RDF::Statement.new(n, RDF["type"], process_class, :context => RDF::RDFA.ProcessorGraph),
+ RDF::Statement.new(n, RDF::DC.description, message, :context => RDF::RDFA.ProcessorGraph),
+ RDF::Statement.new(n, RDF::DC.date, RDF::Literal::Date.new(DateTime.now), :context => RDF::RDFA.ProcessorGraph)
+ ]
+ processor_statements << RDF::Statement.new(n, RDF::RDFA.context, base_uri, :context => RDF::RDFA.ProcessorGraph) if base_uri
if node.respond_to?(:path)
nc = RDF::Node.new
- g << RDF::Statement.new(n, RDF::RDFA.context, nc)
- g << RDF::Statement.new(nc, RDF["type"], RDF::PTR.XPathPointer)
- g << RDF::Statement.new(nc, RDF::PTR.expression, node.path)
+ processor_statements += [
+ RDF::Statement.new(n, RDF::RDFA.context, nc, :context => RDF::RDFA.ProcessorGraph),
+ RDF::Statement.new(nc, RDF["type"], RDF::PTR.XPathPointer, :context => RDF::RDFA.ProcessorGraph),
+ RDF::Statement.new(nc, RDF::PTR.expression, node.path, :context => RDF::RDFA.ProcessorGraph)
+ ]
end
- g.each do |s|
- # Provide as callback
- @options[:processor_callback].call(s) if @options[:processor_callback]
-
- # Yield as result
- if @options[:rdfagraph].include?(:processor)
- if @callback
- @callback.call(s)
- else
- # Save messages for later callback
- @saved_callbacks ||= []
- @saved_callbacks << s
- end
- end
+ @repository.insert(*processor_statements)
+ if cb = @options[:processor_callback]
+ processor_statements.each {|s| cb.call(s)}
end
end
end
##
@@ -521,10 +522,10 @@
def add_triple(node, subject, predicate, object, context = nil)
statement = RDF::Statement.new(subject, predicate, object)
add_error(node, "statement #{RDF::NTriples.serialize(statement)} is invalid") unless statement.valid?
if subject && predicate && object # Basic sanity checking
add_info(node, "statement: #{RDF::NTriples.serialize(statement)}")
- @callback.call(statement) if @options[:rdfagraph].include?(:output)
+ repository << statement
end
end
# Parsing an RDFa document (this is *not* the recursive method)
def parse_whole_document(doc, base)