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)