module Redlander::Parsing

Syntax parsing methods. “self” is assumed to be an instance of Redlander::Model

Public Instance Methods

from(content, options = {}) { |statement| ... } click to toggle source

Core parsing method for non-streams

@note

If a block is given, the extracted statements will be yielded into
the block and inserted into the model depending on the output
of the block (if true, the statement will be added,
if false, the statement will not be added).

@param [String, URI] content

- Can be a String,
  causing the statements to be extracted
  directly from it, or
- URI
  causing the content to be first pulled
  from the specified URI (or a local file,
  if URI schema == "file:")

@param [Hash] options @option options [String] :format name of the parser to use, @option options [String] :mime_type MIME type of the syntax, if applicable, @option options [String, URI] :type_uri URI of syntax, if applicable, @option options [String, URI] :base_uri base URI,

to be applied to the nodes with relative URIs.

@yieldparam [Statement] @raise [RedlandError] if it fails to create a parser or stream @return [Model]

# File lib/redlander/parsing.rb, line 30
def from(content, options = {})
  format = options[:format].to_s
  mime_type = options[:mime_type] && options[:mime_type].to_s
  type_uri = options[:type_uri] && options[:type_uri].to_s
  base_uri = options[:base_uri] && options[:base_uri].to_s
  content = Uri.new(content) if content.is_a?(URI)

  # FIXME: to be fixed in librdf:
  # ntriples parser absolutely needs "\n" at the end of the input
  if format == "ntriples" && !content.is_a?(Uri) && !content.end_with?("\n")
    content << "\n"
  end

  rdf_parser = Redland.librdf_new_parser(Redlander.rdf_world, format, mime_type, type_uri)
  raise RedlandError, "Failed to create a new '#{format}' parser" if rdf_parser.null?

  begin
    if block_given?
      rdf_stream =
        if content.is_a?(Uri)
          Redland.librdf_parser_parse_as_stream(rdf_parser, content.rdf_uri, base_uri)
        else
          Redland.librdf_parser_parse_string_as_stream(rdf_parser, content, base_uri)
        end
      raise RedlandError, "Failed to create a new stream" if rdf_stream.null?

      begin
        while Redland.librdf_stream_end(rdf_stream).zero?
          statement = Statement.new(Redland.librdf_stream_get_object(rdf_stream))
          statements.add(statement) if yield statement
          Redland.librdf_stream_next(rdf_stream)
        end
      ensure
        Redland.librdf_free_stream(rdf_stream)
      end
    else
      if content.is_a?(Uri)
        Redland.librdf_parser_parse_into_model(rdf_parser, content.rdf_uri, base_uri, @rdf_model).zero?
      else
        Redland.librdf_parser_parse_string_into_model(rdf_parser, content, base_uri, @rdf_model).zero?
      end
    end
  ensure
    Redland.librdf_free_parser(rdf_parser)
  end
  self
end
from_file(uri, options = {}, &block)
Alias for: from_uri
from_ntriples(content, options = {}, &block) click to toggle source

Parse input in NTriples format. Shortcut for {#from}(content, :format => “ntriples”).

@param (see from) @yieldparam [Statement] @return [void]

# File lib/redlander/parsing.rb, line 94
def from_ntriples(content, options = {}, &block)
  from(content, options.merge(:format => "ntriples"), &block)
end
from_rdfxml(content, options = {}, &block) click to toggle source

Parse input in RDF/XML format. Shortcut for {#from}(content, :format => “rdfxml”).

@param (see from) @yieldparam [Statement] @return [void]

# File lib/redlander/parsing.rb, line 84
def from_rdfxml(content, options = {}, &block)
  from(content, options.merge(:format => "rdfxml"), &block)
end
from_turtle(content, options = {}, &block) click to toggle source

Parse input in Turtls format. Shortcut for {#from}(content, :format => “turtle”).

@param (see from) @yieldparam [Statement] @return [void]

# File lib/redlander/parsing.rb, line 104
def from_turtle(content, options = {}, &block)
  from(content, options.merge(:format => "turtle"), &block)
end
from_uri(uri, options = {}, &block) click to toggle source

Parse input as stream from URI (or File)

@param [URI, String] uri URI of the endpoint or file path @param [Hash] options (see {#from}) @yieldparam [Statement] @return [void]

# File lib/redlander/parsing.rb, line 114
def from_uri(uri, options = {}, &block)
  if uri.is_a?(String)
    uri = URI.parse(uri)
    uri = URI.parse("file://#{File.expand_path(uri.to_s)}") if uri.scheme.nil?
  end
  from(uri, options, &block)
end
Also aliased as: from_file