rdf-raptor 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/{CONTRIBUTORS → CREDITS} +0 -0
- data/README +24 -18
- data/VERSION +1 -1
- data/etc/doap.ttl +1 -1
- data/lib/rdf/raptor.rb +41 -29
- data/lib/rdf/raptor/cli.rb +73 -26
- data/lib/rdf/raptor/ffi.rb +118 -469
- data/lib/rdf/raptor/ffi/v1.rb +130 -0
- data/lib/rdf/raptor/ffi/v1/iostream.rb +47 -0
- data/lib/rdf/raptor/ffi/v1/iostream_handler.rb +151 -0
- data/lib/rdf/raptor/ffi/v1/parser.rb +205 -0
- data/lib/rdf/raptor/ffi/v1/serializer.rb +128 -0
- data/lib/rdf/raptor/ffi/v1/statement.rb +233 -0
- data/lib/rdf/raptor/ffi/v1/uri.rb +111 -0
- data/lib/rdf/raptor/graphviz.rb +4 -4
- data/lib/rdf/raptor/ntriples.rb +85 -0
- data/lib/rdf/raptor/rdfa.rb +5 -5
- data/lib/rdf/raptor/rdfxml.rb +5 -5
- data/lib/rdf/raptor/turtle.rb +5 -6
- data/lib/rdf/raptor/version.rb +1 -1
- metadata +43 -22
data/{CONTRIBUTORS → CREDITS}
RENAMED
File without changes
|
data/README
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
Raptor RDF Parser
|
2
|
-
|
1
|
+
Raptor RDF Parser Plugin for RDF.rb
|
2
|
+
===================================
|
3
3
|
|
4
4
|
This is an [RDF.rb][] plugin that adds support for parsing/serializing
|
5
5
|
[RDF/XML][], [Turtle][] and [RDFa][] data using the [Raptor RDF Parser][Raptor]
|
@@ -11,8 +11,7 @@ library.
|
|
11
11
|
Features
|
12
12
|
--------
|
13
13
|
|
14
|
-
* Requires the [Raptor][] library and utilities
|
15
|
-
* Based on the [`rapper`][rapper] command-line utility bundled with Raptor.
|
14
|
+
* Requires the [Raptor][] library and/or command-line utilities.
|
16
15
|
* Parses and serializes RDF data from/into the RDF/XML or Turtle formats.
|
17
16
|
* Extracts RDF statements from XHTML+RDFa documents.
|
18
17
|
* Provides serialization format autodetection for RDF/XML, Turtle and RDFa.
|
@@ -103,16 +102,18 @@ Documentation
|
|
103
102
|
<http://rdf.rubyforge.org/raptor/>
|
104
103
|
|
105
104
|
* {RDF::Raptor}
|
106
|
-
* {RDF::Raptor::
|
105
|
+
* {RDF::Raptor::NTriples}
|
107
106
|
* {RDF::Raptor::Turtle}
|
107
|
+
* {RDF::Raptor::RDFXML}
|
108
108
|
* {RDF::Raptor::RDFa}
|
109
109
|
* {RDF::Raptor::Graphviz}
|
110
110
|
|
111
111
|
Dependencies
|
112
112
|
------------
|
113
113
|
|
114
|
-
* [RDF.rb](http://rubygems.org/gems/rdf) (>= 0.
|
115
|
-
* [
|
114
|
+
* [RDF.rb](http://rubygems.org/gems/rdf) (>= 0.3.0)
|
115
|
+
* [FFI](http://rubygems.org/gems/ffi) (>= 1.0.0)
|
116
|
+
* [Raptor][] (>= 1.4.16), the `libraptor` library or the `rapper` binary
|
116
117
|
|
117
118
|
Installation
|
118
119
|
------------
|
@@ -124,8 +125,8 @@ To install the latest official release of the `RDF::Raptor` gem, do:
|
|
124
125
|
|
125
126
|
To install the required [Raptor][] command-line tools themselves, look for a
|
126
127
|
`raptor` or `raptor-utils` package in your platform's package management
|
127
|
-
system.
|
128
|
-
common Linux and BSD distributions:
|
128
|
+
system. For your convenience, here follow installation instructions for the
|
129
|
+
Mac and the most common Linux and BSD distributions:
|
129
130
|
|
130
131
|
% [sudo] port install raptor # Mac OS X with MacPorts
|
131
132
|
% [sudo] fink install raptor-bin # Mac OS X with Fink
|
@@ -144,27 +145,32 @@ To get a local working copy of the development repository, do:
|
|
144
145
|
|
145
146
|
% git clone git://github.com/bendiken/rdf-raptor.git
|
146
147
|
|
147
|
-
Alternatively,
|
148
|
-
|
148
|
+
Alternatively, download the latest development version as a tarball as
|
149
|
+
follows:
|
149
150
|
|
150
151
|
% wget http://github.com/bendiken/rdf-raptor/tarball/master
|
151
152
|
|
152
|
-
|
153
|
-
|
153
|
+
Mailing List
|
154
|
+
------------
|
155
|
+
|
156
|
+
* <http://lists.w3.org/Archives/Public/public-rdf-ruby/>
|
157
|
+
|
158
|
+
Authors
|
159
|
+
-------
|
154
160
|
|
155
|
-
* [Arto Bendiken](
|
156
|
-
* [John Fieber](
|
161
|
+
* [Arto Bendiken](http://github.com/bendiken) - <http://ar.to/>
|
162
|
+
* [John Fieber](http://github.com/jfieber) - <http://github.com/jfieber>
|
157
163
|
|
158
164
|
Contributors
|
159
165
|
------------
|
160
166
|
|
161
|
-
* [Ben Lavender](
|
167
|
+
* [Ben Lavender](http://github.com/bhuga) - <http://bhuga.net/>
|
162
168
|
|
163
169
|
License
|
164
170
|
-------
|
165
171
|
|
166
|
-
|
167
|
-
|
172
|
+
This is free and unencumbered public domain software. For more information,
|
173
|
+
see <http://unlicense.org/> or the accompanying {file:UNLICENSE} file.
|
168
174
|
|
169
175
|
[RDF.rb]: http://rdf.rubyforge.org/
|
170
176
|
[RDF/XML]: http://www.w3.org/TR/REC-rdf-syntax/
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.1
|
data/etc/doap.ttl
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
doap:name "RDF::Raptor" ;
|
10
10
|
doap:homepage <http://rdf.rubyforge.org/raptor/> ;
|
11
11
|
doap:license <http://creativecommons.org/licenses/publicdomain/> ;
|
12
|
-
doap:shortdesc "Raptor RDF Parser
|
12
|
+
doap:shortdesc "Raptor RDF Parser plugin for RDF.rb."@en ;
|
13
13
|
doap:description "RDF.rb plugin for parsing/serializing RDF/XML, Turtle and RDFa data using the Raptor RDF Parser library."@en ;
|
14
14
|
doap:created "2010-03-23" ;
|
15
15
|
doap:platform "Ruby" ;
|
data/lib/rdf/raptor.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
|
-
require '
|
2
|
-
require 'rdf'
|
1
|
+
require 'rdf' # @see http://rubygems.org/gems/rdf
|
3
2
|
|
4
3
|
module RDF
|
5
4
|
##
|
6
|
-
# **`RDF::Raptor`** is a Raptor RDF Parser
|
5
|
+
# **`RDF::Raptor`** is a Raptor RDF Parser plugin for RDF.rb.
|
7
6
|
#
|
8
|
-
# * {RDF::Raptor::
|
9
|
-
# machine-readable
|
7
|
+
# * {RDF::Raptor::NTriples} provides support for the standard
|
8
|
+
# machine-readable N-Triples format.
|
10
9
|
# * {RDF::Raptor::Turtle} provides support for the popular
|
11
10
|
# human-readable Turtle format.
|
11
|
+
# * {RDF::Raptor::RDFXML} provides support for the standard
|
12
|
+
# machine-readable RDF/XML format.
|
12
13
|
# * {RDF::Raptor::RDFa} provides support for extracting
|
13
14
|
# RDF statements from XHTML+RDFa documents.
|
14
15
|
# * {RDF::Raptor::Graphviz} provides support for serializing
|
@@ -26,12 +27,12 @@ module RDF
|
|
26
27
|
# @example Obtaining the Raptor engine
|
27
28
|
# RDF::Raptor::ENGINE #=> :ffi
|
28
29
|
#
|
29
|
-
# @example Obtaining an
|
30
|
-
# RDF::Format.for(:
|
31
|
-
# RDF::Format.for("input.
|
32
|
-
# RDF::Format.for(:file_name => "input.
|
33
|
-
# RDF::Format.for(:file_extension => "
|
34
|
-
# RDF::Format.for(:content_type => "
|
30
|
+
# @example Obtaining an N-Triples format class
|
31
|
+
# RDF::Format.for(:ntriples) #=> RDF::Raptor::NTriples::Format
|
32
|
+
# RDF::Format.for("input.nt")
|
33
|
+
# RDF::Format.for(:file_name => "input.nt")
|
34
|
+
# RDF::Format.for(:file_extension => "nt")
|
35
|
+
# RDF::Format.for(:content_type => "text/plain")
|
35
36
|
#
|
36
37
|
# @example Obtaining a Turtle format class
|
37
38
|
# RDF::Format.for(:turtle) #=> RDF::Raptor::Turtle::Format
|
@@ -40,6 +41,13 @@ module RDF
|
|
40
41
|
# RDF::Format.for(:file_extension => "ttl")
|
41
42
|
# RDF::Format.for(:content_type => "text/turtle")
|
42
43
|
#
|
44
|
+
# @example Obtaining an RDF/XML format class
|
45
|
+
# RDF::Format.for(:rdfxml) #=> RDF::Raptor::RDFXML::Format
|
46
|
+
# RDF::Format.for("input.rdf")
|
47
|
+
# RDF::Format.for(:file_name => "input.rdf")
|
48
|
+
# RDF::Format.for(:file_extension => "rdf")
|
49
|
+
# RDF::Format.for(:content_type => "application/rdf+xml")
|
50
|
+
#
|
43
51
|
# @example Obtaining an RDFa format class
|
44
52
|
# RDF::Format.for(:rdfa) #=> RDF::Raptor::RDFa::Format
|
45
53
|
# RDF::Format.for("input.html")
|
@@ -47,24 +55,27 @@ module RDF
|
|
47
55
|
# RDF::Format.for(:file_extension => "html")
|
48
56
|
# RDF::Format.for(:content_type => "application/xhtml+xml")
|
49
57
|
#
|
50
|
-
# {RDF::Raptor} includes an
|
51
|
-
#
|
52
|
-
# implementation, which
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
58
|
+
# {RDF::Raptor} includes an FFI implementation, which loads the
|
59
|
+
# `libraptor` library into the Ruby process, as well as a CLI
|
60
|
+
# implementation, which drives the `rapper` command-line tool in a
|
61
|
+
# sub-process.
|
62
|
+
#
|
63
|
+
# The FFI implementation is used by default unless the `libraptor` library
|
64
|
+
# cannot be found, or if the `RDF_RAPTOR_ENGINE` environment variable is
|
65
|
+
# explicitly set to `'cli'`.
|
56
66
|
#
|
57
|
-
# If the libraptor library is in the standard library search
|
58
|
-
#
|
59
|
-
#
|
60
|
-
# non-standard location, set the RDF_RAPTOR_LIBPATH and/or
|
61
|
-
# RDF_RAPTOR_BINPATH appropriately before
|
67
|
+
# If the `libraptor` library is in the standard library search path, and
|
68
|
+
# the `rapper` command is in the standard command search path, all should
|
69
|
+
# be well and work fine out of the box. However, if either is in a
|
70
|
+
# non-standard location, be sure to set the `RDF_RAPTOR_LIBPATH` and/or
|
71
|
+
# `RDF_RAPTOR_BINPATH` environment variables appropriately before
|
72
|
+
# requiring `rdf/raptor`.
|
62
73
|
#
|
63
74
|
# @see http://rdf.rubyforge.org/
|
64
75
|
# @see http://librdf.org/raptor/
|
65
76
|
# @see http://wiki.github.com/ffi/ffi/
|
66
77
|
#
|
67
|
-
# @author [Arto Bendiken](http://
|
78
|
+
# @author [Arto Bendiken](http://github.com/bendiken)
|
68
79
|
# @author [John Fieber](http://github.com/jfieber)
|
69
80
|
module Raptor
|
70
81
|
LIBRAPTOR = ENV['RDF_RAPTOR_LIBPATH'] || 'libraptor' unless const_defined?(:LIBRAPTOR)
|
@@ -72,13 +83,13 @@ module RDF
|
|
72
83
|
|
73
84
|
require 'rdf/raptor/version'
|
74
85
|
begin
|
75
|
-
# Try
|
86
|
+
# Try FFI implementation
|
76
87
|
raise LoadError if ENV['RDF_RAPTOR_ENGINE'] == 'cli' # override
|
77
88
|
require 'rdf/raptor/ffi'
|
78
89
|
include RDF::Raptor::FFI
|
79
90
|
extend RDF::Raptor::FFI
|
80
91
|
rescue LoadError => e
|
81
|
-
#
|
92
|
+
# CLI fallback
|
82
93
|
require 'rdf/raptor/cli'
|
83
94
|
include RDF::Raptor::CLI
|
84
95
|
extend RDF::Raptor::CLI
|
@@ -112,11 +123,12 @@ module RDF
|
|
112
123
|
@rapper_format = format
|
113
124
|
end
|
114
125
|
end
|
115
|
-
end
|
126
|
+
end # Format
|
116
127
|
|
117
|
-
require 'rdf/raptor/
|
128
|
+
#require 'rdf/raptor/ntriples'
|
118
129
|
require 'rdf/raptor/turtle'
|
130
|
+
require 'rdf/raptor/rdfxml'
|
119
131
|
require 'rdf/raptor/rdfa'
|
120
132
|
require 'rdf/raptor/graphviz'
|
121
|
-
end #
|
122
|
-
end #
|
133
|
+
end # Raptor
|
134
|
+
end # RDF
|
data/lib/rdf/raptor/cli.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
|
1
3
|
module RDF::Raptor
|
2
4
|
##
|
3
5
|
# A command-line interface to Raptor's `rapper` utility.
|
4
6
|
module CLI
|
5
|
-
|
6
7
|
ENGINE = :cli
|
7
8
|
|
8
9
|
##
|
@@ -18,18 +19,23 @@ module RDF::Raptor
|
|
18
19
|
[$1, $2, $3].join('.')
|
19
20
|
end
|
20
21
|
end
|
22
|
+
module_function :version
|
21
23
|
|
22
24
|
##
|
23
|
-
#
|
25
|
+
# CLI reader implementation.
|
24
26
|
class Reader < RDF::Reader
|
25
27
|
##
|
28
|
+
# Initializes the CLI reader instance.
|
29
|
+
#
|
26
30
|
# @param [IO, File, RDF::URI, String] input
|
27
|
-
# @param [Hash{Symbol => Object}]
|
28
|
-
#
|
29
|
-
# @
|
30
|
-
# @
|
31
|
+
# @param [Hash{Symbol => Object}] options
|
32
|
+
# any additional options (see `RDF::Reader#initialize`)
|
33
|
+
# @option options [String, #to_s] :base_uri ("file:///dev/stdin")
|
34
|
+
# @yield [reader] `self`
|
35
|
+
# @yieldparam [RDF::Reader] reader
|
36
|
+
# @yieldreturn [void] ignored
|
31
37
|
def initialize(input = $stdin, options = {}, &block)
|
32
|
-
raise RDF::ReaderError
|
38
|
+
raise RDF::ReaderError, "`rapper` binary not found" unless RDF::Raptor.available?
|
33
39
|
|
34
40
|
format = self.class.format.rapper_format
|
35
41
|
case input
|
@@ -37,16 +43,18 @@ module RDF::Raptor
|
|
37
43
|
@command = "#{RAPPER} -q -i #{format} -o ntriples '#{input}'"
|
38
44
|
@command << " '#{options[:base_uri]}'" if options.has_key?(:base_uri)
|
39
45
|
@rapper = IO.popen(@command, 'rb')
|
46
|
+
|
40
47
|
when File, Tempfile
|
41
48
|
@command = "#{RAPPER} -q -i #{format} -o ntriples '#{File.expand_path(input.path)}'"
|
42
49
|
@command << " '#{options[:base_uri]}'" if options.has_key?(:base_uri)
|
43
50
|
@rapper = IO.popen(@command, 'rb')
|
51
|
+
|
44
52
|
else # IO, String
|
45
53
|
@command = "#{RAPPER} -q -i #{format} -o ntriples file:///dev/stdin"
|
46
54
|
@command << " '#{options[:base_uri]}'" if options.has_key?(:base_uri)
|
47
55
|
@rapper = IO.popen(@command, 'rb+')
|
48
56
|
pid = fork do
|
49
|
-
# process to feed rapper
|
57
|
+
# process to feed `rapper`
|
50
58
|
begin
|
51
59
|
@rapper.close_read
|
52
60
|
if input.respond_to?(:read)
|
@@ -65,13 +73,23 @@ module RDF::Raptor
|
|
65
73
|
Process.detach(pid)
|
66
74
|
@rapper.close_write
|
67
75
|
end
|
68
|
-
|
76
|
+
|
77
|
+
@options = options
|
78
|
+
@reader = RDF::NTriples::Reader.new(@rapper, @options).extend(Extensions)
|
79
|
+
|
80
|
+
if block_given?
|
81
|
+
case block.arity
|
82
|
+
when 0 then instance_eval(&block)
|
83
|
+
else block.call(self)
|
84
|
+
end
|
85
|
+
end
|
69
86
|
end
|
70
87
|
|
71
|
-
|
88
|
+
protected
|
72
89
|
|
73
90
|
##
|
74
|
-
# @return [Array]
|
91
|
+
# @return [Array(RDF::Resource, RDF::URI, RDF::Term)]
|
92
|
+
# @see RDF::Reader#read_triple
|
75
93
|
def read_triple
|
76
94
|
raise EOFError if @rapper.closed?
|
77
95
|
begin
|
@@ -83,18 +101,43 @@ module RDF::Raptor
|
|
83
101
|
triple
|
84
102
|
end
|
85
103
|
|
86
|
-
|
104
|
+
##
|
105
|
+
# Extensions for `RDF::NTriples::Reader`.
|
106
|
+
module Extensions
|
107
|
+
NODEID = RDF::NTriples::Reader::NODEID
|
108
|
+
GENID = /^genid\d+$/
|
109
|
+
|
110
|
+
##
|
111
|
+
# Generates fresh random identifiers for Raptor's `_:genid[0-9]+`
|
112
|
+
# blank nodes, while preserving any user-specified blank node
|
113
|
+
# identifiers verbatim.
|
114
|
+
#
|
115
|
+
# @private
|
116
|
+
# @see RDF::NTriples::Reader#read_node
|
117
|
+
# @see https://github.com/bendiken/rdf-raptor/issues/#issue/9
|
118
|
+
def read_node
|
119
|
+
if node_id = match(NODEID)
|
120
|
+
@nodes ||= {}
|
121
|
+
@nodes[node_id] ||= RDF::Node.new(GENID === node_id ? nil : node_id)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end # Reader
|
87
126
|
|
88
127
|
##
|
89
|
-
#
|
128
|
+
# CLI writer implementation.
|
90
129
|
class Writer < RDF::Writer
|
91
130
|
##
|
131
|
+
# Initializes the CLI writer instance.
|
132
|
+
#
|
92
133
|
# @param [IO, File] output
|
93
134
|
# @param [Hash{Symbol => Object}] options
|
94
|
-
#
|
95
|
-
# @
|
135
|
+
# any additional options (see `RDF::Writer#initialize`)
|
136
|
+
# @yield [writer] `self`
|
137
|
+
# @yieldparam [RDF::Writer] writer
|
138
|
+
# @yieldreturn [void]
|
96
139
|
def initialize(output = $stdout, options = {}, &block)
|
97
|
-
raise RDF::WriterError
|
140
|
+
raise RDF::WriterError, "`rapper` binary not found" unless RDF::Raptor.available?
|
98
141
|
|
99
142
|
format = self.class.format.rapper_format
|
100
143
|
case output
|
@@ -103,16 +146,17 @@ module RDF::Raptor
|
|
103
146
|
@command << " '#{options[:base_uri]}'" if options.has_key?(:base_uri)
|
104
147
|
@rapper = IO.popen(@command, 'rb+')
|
105
148
|
else
|
106
|
-
raise ArgumentError
|
149
|
+
raise ArgumentError, "unsupported output type: #{output.inspect}"
|
107
150
|
end
|
108
151
|
@writer = RDF::NTriples::Writer.new(@rapper, options)
|
109
152
|
super(output, options, &block)
|
110
153
|
end
|
111
154
|
|
112
|
-
|
155
|
+
protected
|
113
156
|
|
114
157
|
##
|
115
158
|
# @return [void]
|
159
|
+
# @see RDF::Writer#write_prologue
|
116
160
|
def write_prologue
|
117
161
|
super
|
118
162
|
end
|
@@ -120,8 +164,9 @@ module RDF::Raptor
|
|
120
164
|
##
|
121
165
|
# @param [RDF::Resource] subject
|
122
166
|
# @param [RDF::URI] predicate
|
123
|
-
# @param [RDF::
|
167
|
+
# @param [RDF::Term] object
|
124
168
|
# @return [void]
|
169
|
+
# @see RDF::Writer#write_triple
|
125
170
|
def write_triple(subject, predicate, object)
|
126
171
|
output_transit(false)
|
127
172
|
@writer.write_triple(subject, predicate, object)
|
@@ -130,20 +175,23 @@ module RDF::Raptor
|
|
130
175
|
|
131
176
|
##
|
132
177
|
# @return [void]
|
178
|
+
# @see RDF::Writer#write_epilogue
|
133
179
|
def write_epilogue
|
134
180
|
@rapper.close_write unless @rapper.closed?
|
135
181
|
output_transit(true)
|
136
182
|
end
|
137
183
|
|
138
184
|
##
|
139
|
-
#
|
185
|
+
# Feeds any available `rapper` output to the destination.
|
186
|
+
#
|
187
|
+
# @param [Boolean] may_block
|
140
188
|
# @return [void]
|
141
|
-
def output_transit(
|
189
|
+
def output_transit(may_block)
|
142
190
|
unless @rapper.closed?
|
143
191
|
chunk_size = @options[:chunk_size] || 4096 # bytes
|
144
192
|
begin
|
145
193
|
loop do
|
146
|
-
@output.write(
|
194
|
+
@output.write(may_block ? @rapper.readpartial(chunk_size) : @rapper.read_nonblock(chunk_size))
|
147
195
|
end
|
148
196
|
rescue EOFError => e
|
149
197
|
@rapper.close
|
@@ -152,7 +200,6 @@ module RDF::Raptor
|
|
152
200
|
end
|
153
201
|
end
|
154
202
|
end
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
end
|
203
|
+
end # Writer
|
204
|
+
end # CLI
|
205
|
+
end # RDF::Raptor
|
data/lib/rdf/raptor/ffi.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
require '
|
1
|
+
require 'tempfile'
|
2
|
+
require 'ffi' # @see http://rubygems.org/gems/ffi
|
2
3
|
|
3
4
|
module RDF::Raptor
|
4
5
|
##
|
@@ -7,116 +8,150 @@ module RDF::Raptor
|
|
7
8
|
# @see http://librdf.org/raptor/api/
|
8
9
|
# @see http://librdf.org/raptor/libraptor.html
|
9
10
|
module FFI
|
11
|
+
autoload :V1, 'rdf/raptor/ffi/v1'
|
10
12
|
|
11
13
|
ENGINE = :ffi
|
12
14
|
|
13
15
|
##
|
14
|
-
# Returns the installed `
|
15
|
-
# not available.
|
16
|
+
# Returns the installed `libraptor` version number, or `nil` if
|
17
|
+
# `libraptor` is not available.
|
16
18
|
#
|
17
19
|
# @example
|
18
20
|
# RDF::Raptor.version #=> "1.4.21"
|
19
21
|
#
|
20
|
-
# @return [String]
|
22
|
+
# @return [String] an "x.y.z" version string
|
21
23
|
def version
|
22
|
-
[
|
23
|
-
|
24
|
-
|
24
|
+
[V1.raptor_version_major,
|
25
|
+
V1.raptor_version_minor,
|
26
|
+
V1.raptor_version_release].join('.').freeze
|
25
27
|
end
|
28
|
+
module_function :version
|
26
29
|
|
27
30
|
##
|
28
|
-
#
|
31
|
+
# FFI reader implementation.
|
29
32
|
class Reader < RDF::Reader
|
30
33
|
##
|
34
|
+
# Initializes the FFI reader instance.
|
35
|
+
#
|
31
36
|
# @param [IO, File, RDF::URI, String] input
|
32
|
-
# @param [Hash{Symbol => Object}]
|
33
|
-
#
|
34
|
-
# @
|
35
|
-
# @
|
37
|
+
# @param [Hash{Symbol => Object}] options
|
38
|
+
# any additional options (see `RDF::Reader#initialize`)
|
39
|
+
# @option options [String, #to_s] :base_uri ("file:///dev/stdin")
|
40
|
+
# @yield [reader] `self`
|
41
|
+
# @yieldparam [RDF::Reader] reader
|
42
|
+
# @yieldreturn [void] ignored
|
36
43
|
def initialize(input = $stdin, options = {}, &block)
|
37
44
|
@format = self.class.format.rapper_format
|
45
|
+
@parser = V1::Parser.new(@format)
|
46
|
+
@parser.error_handler = ERROR_HANDLER
|
47
|
+
@parser.warning_handler = WARNING_HANDLER
|
38
48
|
super
|
39
49
|
end
|
40
50
|
|
41
51
|
ERROR_HANDLER = Proc.new do |user_data, locator, message|
|
42
|
-
line =
|
52
|
+
line = V1.raptor_locator_line(locator)
|
43
53
|
raise RDF::ReaderError, line > -1 ? "Line #{line}: #{message}" : message
|
44
54
|
end
|
45
55
|
|
46
56
|
WARNING_HANDLER = Proc.new do |user_data, locator, message|
|
47
|
-
# line =
|
57
|
+
# line = V1.raptor_locator_line(locator)
|
48
58
|
# $stderr.puts line > -1 ? "Line #{line}: #{message}" : message
|
49
59
|
end
|
50
60
|
|
61
|
+
##
|
62
|
+
# The Raptor parser instance.
|
63
|
+
#
|
64
|
+
# @return [V1::Parser]
|
65
|
+
attr_reader :parser
|
51
66
|
|
52
67
|
##
|
53
68
|
# @yield [statement]
|
54
|
-
# @yieldparam
|
55
|
-
|
56
|
-
|
57
|
-
|
69
|
+
# @yieldparam [RDF::Statement] statement
|
70
|
+
# @yieldreturn [void] ignored
|
71
|
+
# @see RDF::Reader#each_statement
|
72
|
+
def each_statement(options = {}, &block)
|
73
|
+
if block_given?
|
74
|
+
if options[:raw]
|
75
|
+
# this is up to an order of magnitude faster...
|
76
|
+
parse(@input) do |parser, statement|
|
77
|
+
block.call(V1::Statement.new(statement, self))
|
78
|
+
end
|
79
|
+
else
|
80
|
+
parse(@input) do |parser, statement|
|
81
|
+
block.call(V1::Statement.new(statement, self).to_rdf)
|
82
|
+
end
|
83
|
+
end
|
58
84
|
end
|
85
|
+
enum_for(:each_statement, options)
|
59
86
|
end
|
87
|
+
alias_method :each, :each_statement
|
60
88
|
|
61
89
|
##
|
62
90
|
# @yield [triple]
|
63
|
-
# @yieldparam
|
91
|
+
# @yieldparam [Array(RDF::Resource, RDF::URI, RDF::Term)] triple
|
92
|
+
# @yieldreturn [void] ignored
|
93
|
+
# @see RDF::Reader#each_triple
|
64
94
|
def each_triple(&block)
|
65
|
-
|
66
|
-
|
67
|
-
|
95
|
+
if block_given?
|
96
|
+
parse(@input) do |parser, statement|
|
97
|
+
block.call(V1::Statement.new(statement, self).to_triple)
|
98
|
+
end
|
68
99
|
end
|
100
|
+
enum_for(:each_triple)
|
101
|
+
end
|
69
102
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
V1_4.raptor_free_uri(base_uri) if base_uri
|
84
|
-
V1_4.raptor_free_uri(data_url) if data_url
|
85
|
-
end
|
86
|
-
|
87
|
-
when File, Tempfile
|
88
|
-
begin
|
89
|
-
data_url = V1_4.raptor_new_uri("file://#{File.expand_path(@input.path)}")
|
90
|
-
base_uri = @options[:base_uri].to_s.empty? ? nil : V1_4.raptor_new_uri(@options[:base_uri].to_s)
|
91
|
-
unless (result = V1_4.raptor_parse_file(parser, data_url, base_uri)).zero?
|
92
|
-
# TODO: error handling
|
93
|
-
end
|
94
|
-
ensure
|
95
|
-
V1_4.raptor_free_uri(base_uri) if base_uri
|
96
|
-
V1_4.raptor_free_uri(data_url) if data_url
|
97
|
-
end
|
103
|
+
##
|
104
|
+
# @private
|
105
|
+
# @param [RDF::URI, File, Tempfile, IO, StringIO] input
|
106
|
+
# the input stream
|
107
|
+
# @yield [parser, statement]
|
108
|
+
# each statement in the input stream
|
109
|
+
# @yieldparam [FFI::Pointer] parser
|
110
|
+
# @yieldparam [FFI::Pointer] statement
|
111
|
+
# @yieldreturn [void] ignored
|
112
|
+
# @return [void]
|
113
|
+
def parse(input, &block)
|
114
|
+
@parser.parse(input, @options, &block)
|
115
|
+
end
|
98
116
|
|
99
|
-
|
100
|
-
base_uri = (@options[:base_uri] || 'file:///dev/stdin').to_s
|
101
|
-
unless (result = V1_4.raptor_start_parse(parser, base_uri)).zero?
|
102
|
-
# TODO: error handling
|
103
|
-
end
|
104
|
-
# TODO: read in chunks instead of everything in one go:
|
105
|
-
unless (result = V1_4.raptor_parse_chunk(parser, buffer = @input.read, buffer.size, 0)).zero?
|
106
|
-
# TODO: error handling
|
107
|
-
end
|
108
|
-
V1_4.raptor_parse_chunk(parser, nil, 0, 1) # EOF
|
109
|
-
end
|
110
|
-
end
|
117
|
+
GENID = /^genid\d+$/
|
111
118
|
|
119
|
+
##
|
120
|
+
# @param [String] uri_str
|
121
|
+
# @return [RDF::URI]
|
122
|
+
def create_uri(uri_str)
|
123
|
+
RDF::URI.intern(uri_str)
|
112
124
|
end
|
113
125
|
|
114
|
-
|
115
|
-
|
126
|
+
##
|
127
|
+
# @param [String] node_id
|
128
|
+
# @return [RDF::Node]
|
129
|
+
def create_node(node_id)
|
130
|
+
@nodes ||= {}
|
131
|
+
@nodes[node_id] ||= RDF::Node.new(GENID === node_id ? nil : node_id)
|
132
|
+
end
|
133
|
+
end # Reader
|
116
134
|
|
117
135
|
##
|
118
|
-
#
|
136
|
+
# FFI writer implementation.
|
119
137
|
class Writer < RDF::Writer
|
138
|
+
##
|
139
|
+
# Initializes the FFI writer instance.
|
140
|
+
#
|
141
|
+
# @param [IO, File] output
|
142
|
+
# @param [Hash{Symbol => Object}] options
|
143
|
+
# any additional options (see `RDF::Writer#initialize`)
|
144
|
+
# @yield [writer] `self`
|
145
|
+
# @yieldparam [RDF::Writer] writer
|
146
|
+
# @yieldreturn [void] ignored
|
147
|
+
def initialize(output = $stdout, options = {}, &block)
|
148
|
+
@format = self.class.format.rapper_format
|
149
|
+
@serializer = V1::Serializer.new(@format)
|
150
|
+
@serializer.error_handler = ERROR_HANDLER
|
151
|
+
@serializer.warning_handler = WARNING_HANDLER
|
152
|
+
@serializer.start_to(output, options)
|
153
|
+
super
|
154
|
+
end
|
120
155
|
|
121
156
|
ERROR_HANDLER = Proc.new do |user_data, locator, message|
|
122
157
|
raise RDF::WriterError, message
|
@@ -126,423 +161,37 @@ module RDF::Raptor
|
|
126
161
|
# $stderr.puts "warning"
|
127
162
|
end
|
128
163
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
@serializer = V1_4.raptor_new_serializer((@format || :rdfxml).to_s)
|
135
|
-
raise RDF::WriterError, "raptor_new_serializer failed" if @serializer.nil?
|
136
|
-
V1_4.raptor_serializer_set_error_handler(@serializer, nil, ERROR_HANDLER)
|
137
|
-
V1_4.raptor_serializer_set_warning_handler(@serializer, nil, WARNING_HANDLER)
|
138
|
-
base_uri = options[:base_uri].to_s.empty? ? nil : V1_4.raptor_new_uri(options[:base_uri].to_s)
|
139
|
-
|
140
|
-
# make an iostream
|
141
|
-
handler = V1_4::IOStreamHandler.new
|
142
|
-
handler.rubyio = output
|
143
|
-
raptor_iostream = V1_4.raptor_new_iostream_from_handler2(nil, handler)
|
144
|
-
|
145
|
-
# connect the two
|
146
|
-
unless V1_4.raptor_serialize_start_to_iostream(@serializer, base_uri, raptor_iostream).zero?
|
147
|
-
raise RDF::WriterError, "raptor_serialize_start_to_iostream failed"
|
148
|
-
end
|
149
|
-
super
|
150
|
-
ensure
|
151
|
-
V1_4.raptor_free_iostream(raptor_iostream) if raptor_iostream
|
152
|
-
V1_4.raptor_free_uri(base_uri) if base_uri
|
153
|
-
V1_4.raptor_free_serializer(@serializer) if @serializer
|
154
|
-
end
|
155
|
-
end
|
164
|
+
##
|
165
|
+
# The Raptor serializer instance.
|
166
|
+
#
|
167
|
+
# @return [V1::Serializer]
|
168
|
+
attr_reader :serializer
|
156
169
|
|
157
170
|
##
|
158
171
|
# @param [RDF::Resource] subject
|
159
172
|
# @param [RDF::URI] predicate
|
160
|
-
# @param [RDF::
|
173
|
+
# @param [RDF::Term] object
|
161
174
|
# @return [void]
|
175
|
+
# @see RDF::Writer#write_triple
|
162
176
|
def write_triple(subject, predicate, object)
|
163
|
-
|
164
|
-
raptor_statement.subject = subject
|
165
|
-
raptor_statement.predicate = predicate
|
166
|
-
raptor_statement.object = object
|
167
|
-
begin
|
168
|
-
unless V1_4.raptor_serialize_statement(@serializer, raptor_statement.to_ptr).zero?
|
169
|
-
raise RDF::WriterError, "raptor_serialize_statement failed"
|
170
|
-
end
|
171
|
-
ensure
|
172
|
-
raptor_statement.release
|
173
|
-
raptor_statement = nil
|
174
|
-
end
|
177
|
+
@serializer.serialize_triple(subject, predicate, object)
|
175
178
|
end
|
176
179
|
|
177
180
|
##
|
178
181
|
# @return [void]
|
182
|
+
# @see RDF::Writer#write_epilogue
|
179
183
|
def write_epilogue
|
180
|
-
|
181
|
-
raise RDF::WriterError, "raptor_serialize_end failed"
|
182
|
-
end
|
184
|
+
@serializer.finish
|
183
185
|
super
|
184
186
|
end
|
185
|
-
|
186
|
-
end
|
187
|
-
|
187
|
+
end # Writer
|
188
188
|
|
189
189
|
##
|
190
|
-
#
|
191
|
-
module
|
192
|
-
def define_pointer(name)
|
193
|
-
self.class.send(:define_method, name) { :pointer }
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
##
|
198
|
-
# A foreign-function interface (FFI) to `libraptor` 1.4.x.
|
199
|
-
#
|
200
|
-
# @see http://librdf.org/raptor/libraptor.html
|
201
|
-
module V1_4
|
202
|
-
|
203
|
-
##
|
204
|
-
# @param [Hash{Symbol => Object}] options
|
205
|
-
# @option (options) [String, #to_s] :name (:rdfxml)
|
206
|
-
# @yield [parser]
|
207
|
-
# @yieldparam [FFI::Pointer] parser
|
208
|
-
# @return [void]
|
209
|
-
def self.with_parser(options = {}, &block)
|
210
|
-
begin
|
211
|
-
parser = raptor_new_parser((options[:name] || :rdfxml).to_s)
|
212
|
-
block.call(parser)
|
213
|
-
ensure
|
214
|
-
raptor_free_parser(parser) if parser
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
|
-
|
219
|
-
extend Base
|
190
|
+
# @private
|
191
|
+
module LibC
|
220
192
|
extend ::FFI::Library
|
221
|
-
ffi_lib
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
RAPTOR_IDENTIFIER_TYPE_RESOURCE = 1
|
227
|
-
RAPTOR_IDENTIFIER_TYPE_ANONYMOUS = 2
|
228
|
-
RAPTOR_IDENTIFIER_TYPE_LITERAL = 5
|
229
|
-
|
230
|
-
# @see http://librdf.org/raptor/api/raptor-section-triples.html
|
231
|
-
class Statement < ::FFI::Struct
|
232
|
-
layout :subject, :pointer,
|
233
|
-
:subject_type, :int,
|
234
|
-
:predicate, :pointer,
|
235
|
-
:predicate_type, :int,
|
236
|
-
:object, :pointer,
|
237
|
-
:object_type, :int,
|
238
|
-
:object_literal_datatype, :pointer,
|
239
|
-
:object_literal_language, :pointer
|
240
|
-
|
241
|
-
def initialize(*args)
|
242
|
-
super
|
243
|
-
# Objects we need to keep a Ruby reference
|
244
|
-
# to so they don't get garbage collected out from under
|
245
|
-
# the C code we pass them to.
|
246
|
-
@mp = {}
|
247
|
-
|
248
|
-
# Raptor object references we we need to explicitly free
|
249
|
-
# when release is called
|
250
|
-
@raptor_uri_list = []
|
251
|
-
end
|
252
|
-
|
253
|
-
##
|
254
|
-
# Release raptor memory associated with this struct.
|
255
|
-
# Use of the object after calling this will most likely
|
256
|
-
# cause a crash. This is kind of ugly.
|
257
|
-
def release
|
258
|
-
if pointer.kind_of?(::FFI::MemoryPointer) && !pointer.null?
|
259
|
-
pointer.free
|
260
|
-
end
|
261
|
-
while uri = @raptor_uri_list.pop
|
262
|
-
V1_4.raptor_free_uri(uri) unless uri.nil? || uri.null?
|
263
|
-
end
|
264
|
-
end
|
265
|
-
|
266
|
-
##
|
267
|
-
# @return [RDF::Resource]
|
268
|
-
def subject
|
269
|
-
@subject ||= case self[:subject_type]
|
270
|
-
when RAPTOR_IDENTIFIER_TYPE_RESOURCE
|
271
|
-
RDF::URI.intern(V1_4.raptor_uri_to_string(self[:subject]))
|
272
|
-
when RAPTOR_IDENTIFIER_TYPE_ANONYMOUS
|
273
|
-
RDF::Node.new(self[:subject].read_string)
|
274
|
-
end
|
275
|
-
end
|
276
|
-
|
277
|
-
##
|
278
|
-
# Set the subject from an RDF::Resource
|
279
|
-
# @param [RDF::Resource] value
|
280
|
-
def subject=(resource)
|
281
|
-
@subject = nil
|
282
|
-
case resource
|
283
|
-
when RDF::Node
|
284
|
-
self[:subject] = @mp[:subject] = ::FFI::MemoryPointer.from_string(resource.id.to_s)
|
285
|
-
self[:subject_type] = RAPTOR_IDENTIFIER_TYPE_ANONYMOUS
|
286
|
-
when RDF::URI
|
287
|
-
self[:subject] = @mp[:subject] = @raptor_uri_list.push(V1_4.raptor_new_uri(resource.to_s)).last
|
288
|
-
self[:subject_type] = RAPTOR_IDENTIFIER_TYPE_RESOURCE
|
289
|
-
else
|
290
|
-
raise ArgumentError, "subject must be of kind RDF::Node or RDF::URI"
|
291
|
-
end
|
292
|
-
@subject = resource
|
293
|
-
end
|
294
|
-
|
295
|
-
##
|
296
|
-
# @return [String]
|
297
|
-
def subject_as_string
|
298
|
-
V1_4.raptor_statement_part_as_string(
|
299
|
-
self[:subject],
|
300
|
-
self[:subject_type],
|
301
|
-
nil, nil)
|
302
|
-
end
|
303
|
-
|
304
|
-
##
|
305
|
-
# @return [RDF::URI]
|
306
|
-
def predicate
|
307
|
-
@predicate ||= case self[:predicate_type]
|
308
|
-
when RAPTOR_IDENTIFIER_TYPE_RESOURCE
|
309
|
-
RDF::URI.intern(V1_4.raptor_uri_to_string(self[:predicate]))
|
310
|
-
end
|
311
|
-
end
|
312
|
-
|
313
|
-
##
|
314
|
-
# Set the predicate from an RDF::URI
|
315
|
-
# @param [RDF::URI] value
|
316
|
-
def predicate=(uri)
|
317
|
-
@predicate = nil
|
318
|
-
raise ArgumentError, "predicate must be a kind of RDF::URI" unless uri.kind_of?(RDF::URI)
|
319
|
-
self[:predicate] = @raptor_uri_list.push(V1_4.raptor_new_uri(uri.to_s)).last
|
320
|
-
self[:predicate_type] = RAPTOR_IDENTIFIER_TYPE_RESOURCE
|
321
|
-
@predicate = uri
|
322
|
-
end
|
323
|
-
|
324
|
-
##
|
325
|
-
# @return [String]
|
326
|
-
def predicate_as_string
|
327
|
-
V1_4.raptor_statement_part_as_string(
|
328
|
-
self[:predicate],
|
329
|
-
self[:predicate_type],
|
330
|
-
nil, nil)
|
331
|
-
end
|
332
|
-
|
333
|
-
##
|
334
|
-
# @return [RDF::Value]
|
335
|
-
def object
|
336
|
-
@object ||= case self[:object_type]
|
337
|
-
when RAPTOR_IDENTIFIER_TYPE_RESOURCE
|
338
|
-
RDF::URI.intern(V1_4.raptor_uri_to_string(self[:object]))
|
339
|
-
when RAPTOR_IDENTIFIER_TYPE_ANONYMOUS
|
340
|
-
RDF::Node.new(self[:object].read_string)
|
341
|
-
when RAPTOR_IDENTIFIER_TYPE_LITERAL
|
342
|
-
case
|
343
|
-
when self[:object_literal_language] && !self[:object_literal_language].null?
|
344
|
-
RDF::Literal.new(self[:object].read_string, :language => self[:object_literal_language].read_string)
|
345
|
-
when self[:object_literal_datatype] && !self[:object_literal_datatype].null?
|
346
|
-
RDF::Literal.new(self[:object].read_string, :datatype => V1_4.raptor_uri_to_string(self[:object_literal_datatype]))
|
347
|
-
else
|
348
|
-
RDF::Literal.new(self[:object].read_string)
|
349
|
-
end
|
350
|
-
end
|
351
|
-
end
|
352
|
-
|
353
|
-
##
|
354
|
-
# Set the object from an RDF::Value.
|
355
|
-
# Value must be one of RDF::Resource or RDF::Literal.
|
356
|
-
# @param [RDF::Value] value
|
357
|
-
def object=(value)
|
358
|
-
@object = nil
|
359
|
-
case value
|
360
|
-
when RDF::Node
|
361
|
-
self[:object] = @mp[:object] = ::FFI::MemoryPointer.from_string(value.id.to_s)
|
362
|
-
self[:object_type] = RAPTOR_IDENTIFIER_TYPE_ANONYMOUS
|
363
|
-
when RDF::URI
|
364
|
-
self[:object] = @mp[:object] = @raptor_uri_list.push(V1_4.raptor_new_uri(value.to_s)).last
|
365
|
-
self[:object_type] = RAPTOR_IDENTIFIER_TYPE_RESOURCE
|
366
|
-
when RDF::Literal
|
367
|
-
self[:object_type] = RAPTOR_IDENTIFIER_TYPE_LITERAL
|
368
|
-
self[:object] = @mp[:object] = ::FFI::MemoryPointer.from_string(value.value)
|
369
|
-
self[:object_literal_datatype] = if value.datatype
|
370
|
-
@raptor_uri_list.push(V1_4.raptor_new_uri(value.datatype.to_s)).last
|
371
|
-
else
|
372
|
-
nil
|
373
|
-
end
|
374
|
-
self[:object_literal_language] = @mp[:object_literal_language] = if value.language?
|
375
|
-
::FFI::MemoryPointer.from_string(value.language.to_s)
|
376
|
-
else
|
377
|
-
nil
|
378
|
-
end
|
379
|
-
else
|
380
|
-
raise ArgumentError, "object must be of type RDF::Node, RDF::URI or RDF::Literal"
|
381
|
-
end
|
382
|
-
@object = value
|
383
|
-
end
|
384
|
-
|
385
|
-
##
|
386
|
-
# @return [String]
|
387
|
-
def object_as_string
|
388
|
-
V1_4.raptor_statement_part_as_string(
|
389
|
-
self[:object],
|
390
|
-
self[:object_type],
|
391
|
-
self[:object_literal_datatype],
|
392
|
-
self[:object_literal_language])
|
393
|
-
end
|
394
|
-
|
395
|
-
##
|
396
|
-
# @return [Array(RDF::Resource, RDF::URI, RDF::Value)]
|
397
|
-
def to_triple
|
398
|
-
[subject, predicate, object]
|
399
|
-
end
|
400
|
-
|
401
|
-
##
|
402
|
-
# @return [Array(RDF::Resource, RDF::URI, RDF::Value, nil)]
|
403
|
-
def to_quad
|
404
|
-
[subject, predicate, object, nil]
|
405
|
-
end
|
406
|
-
|
407
|
-
end
|
408
|
-
|
409
|
-
# @see http://librdf.org/raptor/api/tutorial-initialising-finishing.html
|
410
|
-
attach_function :raptor_init, [], :void
|
411
|
-
attach_function :raptor_finish, [], :void
|
412
|
-
|
413
|
-
# @see http://librdf.org/raptor/api/raptor-section-locator.html
|
414
|
-
define_pointer :raptor_locator
|
415
|
-
attach_function :raptor_locator_line, [raptor_locator], :int
|
416
|
-
attach_function :raptor_locator_column, [raptor_locator], :int
|
417
|
-
attach_function :raptor_locator_byte, [raptor_locator], :int
|
418
|
-
|
419
|
-
# @see http://librdf.org/raptor/api/raptor-section-general.html
|
420
|
-
attach_variable :raptor_version_major, :int
|
421
|
-
attach_variable :raptor_version_minor, :int
|
422
|
-
attach_variable :raptor_version_release, :int
|
423
|
-
attach_variable :raptor_version_decimal, :int
|
424
|
-
callback :raptor_message_handler, [:pointer, raptor_locator, :string], :void
|
425
|
-
|
426
|
-
# @see http://librdf.org/raptor/api/raptor-section-uri.html
|
427
|
-
define_pointer :raptor_uri
|
428
|
-
attach_function :raptor_new_uri, [:string], raptor_uri
|
429
|
-
attach_function :raptor_uri_as_string, [raptor_uri], :string
|
430
|
-
attach_function :raptor_uri_to_string, [raptor_uri], :string
|
431
|
-
attach_function :raptor_uri_print, [raptor_uri, :pointer], :void
|
432
|
-
attach_function :raptor_free_uri, [raptor_uri], :void
|
433
|
-
|
434
|
-
# @see http://librdf.org/raptor/api/raptor-section-triples.html
|
435
|
-
define_pointer :raptor_identifier
|
436
|
-
define_pointer :raptor_statement
|
437
|
-
attach_function :raptor_statement_compare, [raptor_statement, raptor_statement], :int
|
438
|
-
attach_function :raptor_print_statement, [raptor_statement, :pointer], :void
|
439
|
-
attach_function :raptor_print_statement_as_ntriples, [:pointer, :pointer], :void
|
440
|
-
attach_function :raptor_statement_part_as_string, [:pointer, :int, raptor_uri, :string], :string
|
441
|
-
|
442
|
-
# @see http://librdf.org/raptor/api/raptor-section-parser.html
|
443
|
-
callback :raptor_statement_handler, [:pointer, raptor_statement], :void
|
444
|
-
define_pointer :raptor_parser
|
445
|
-
attach_function :raptor_new_parser, [:string], raptor_parser
|
446
|
-
attach_function :raptor_set_error_handler, [raptor_parser, :pointer, :raptor_message_handler], :void
|
447
|
-
attach_function :raptor_set_warning_handler, [raptor_parser, :pointer, :raptor_message_handler], :void
|
448
|
-
attach_function :raptor_set_statement_handler, [raptor_parser, :pointer, :raptor_statement_handler], :void
|
449
|
-
attach_function :raptor_parse_file, [raptor_parser, raptor_uri, raptor_uri], :int
|
450
|
-
attach_function :raptor_parse_file_stream, [raptor_parser, :pointer, :string, raptor_uri], :int
|
451
|
-
attach_function :raptor_parse_uri, [raptor_parser, raptor_uri, raptor_uri], :int
|
452
|
-
attach_function :raptor_start_parse, [raptor_parser, :string], :int
|
453
|
-
attach_function :raptor_parse_chunk, [raptor_parser, :string, :size_t, :int], :int
|
454
|
-
attach_function :raptor_get_mime_type, [raptor_parser], :string
|
455
|
-
attach_function :raptor_set_parser_strict, [raptor_parser, :int], :void
|
456
|
-
attach_function :raptor_get_need_base_uri, [raptor_parser], :int
|
457
|
-
attach_function :raptor_free_parser, [raptor_parser], :void
|
458
|
-
|
459
|
-
# @see http://librdf.org/raptor/api/raptor-section-iostream.html
|
460
|
-
define_pointer :raptor_iostream
|
461
|
-
callback :raptor_iostream_init_func, [:pointer], :int
|
462
|
-
callback :raptor_iostream_finish_func, [:pointer], :void
|
463
|
-
callback :raptor_iostream_write_byte_func, [:pointer, :int], :int
|
464
|
-
callback :raptor_iostream_write_bytes_func, [:pointer, :pointer, :size_t, :size_t], :int
|
465
|
-
callback :raptor_iostream_write_end_func, [:pointer], :void
|
466
|
-
callback :raptor_iostream_read_bytes_func, [:pointer, :pointer, :size_t, :size_t], :int
|
467
|
-
callback :raptor_iostream_read_eof_func, [:pointer], :int
|
468
|
-
attach_function :raptor_new_iostream_from_handler2, [:pointer, :pointer], raptor_iostream
|
469
|
-
attach_function :raptor_free_iostream, [raptor_iostream], :void
|
470
|
-
|
471
|
-
class IOStreamHandler < ::FFI::Struct
|
472
|
-
layout :version, :int,
|
473
|
-
:init, :raptor_iostream_init_func,
|
474
|
-
:finish, :raptor_iostream_finish_func,
|
475
|
-
:write_byte, :raptor_iostream_write_byte_func,
|
476
|
-
:write_bytes, :raptor_iostream_write_bytes_func,
|
477
|
-
:write_end, :raptor_iostream_write_end_func,
|
478
|
-
:read_bytes, :raptor_iostream_read_bytes_func,
|
479
|
-
:read_eof, :raptor_iostream_read_eof_func
|
480
|
-
|
481
|
-
attr_accessor :rubyio
|
482
|
-
|
483
|
-
def initialize(*args)
|
484
|
-
super
|
485
|
-
# Keep a ruby land reference to our procs so they don't
|
486
|
-
# get snatched by GC.
|
487
|
-
@procs = {}
|
488
|
-
|
489
|
-
self[:version] = 2
|
490
|
-
|
491
|
-
# @procs[:init] = self[:init] = Proc.new do |context|
|
492
|
-
# $stderr.puts("#{self.class}: init")
|
493
|
-
# end
|
494
|
-
# @procs[:finish] = self[:finish] = Proc.new do |context|
|
495
|
-
# $stderr.puts("#{self.class}: finish")
|
496
|
-
# end
|
497
|
-
@procs[:write_byte] = self[:write_byte] = Proc.new do |context, byte|
|
498
|
-
begin
|
499
|
-
@rubyio.putc(byte)
|
500
|
-
rescue
|
501
|
-
return 1
|
502
|
-
end
|
503
|
-
0
|
504
|
-
end
|
505
|
-
@procs[:write_bytes] = self[:write_bytes] = Proc.new do |context, data, size, nmemb|
|
506
|
-
begin
|
507
|
-
@rubyio.write(data.read_string(size * nmemb))
|
508
|
-
rescue
|
509
|
-
return 1
|
510
|
-
end
|
511
|
-
0
|
512
|
-
end
|
513
|
-
# @procs[:write_end] = self[:write_end] = Proc.new do |context|
|
514
|
-
# $stderr.puts("#{self.class}: write_end")
|
515
|
-
# end
|
516
|
-
# @procs[:read_bytes] = self[:read_bytes] = Proc.new do |context, data, size, nmemb|
|
517
|
-
# $stderr.puts("#{self.class}: read_bytes")
|
518
|
-
# end
|
519
|
-
# @procs[:read_eof] = self[:read_eof] = Proc.new do |context|
|
520
|
-
# $stderr.puts("#{self.class}: read_eof")
|
521
|
-
# end
|
522
|
-
end
|
523
|
-
end
|
524
|
-
|
525
|
-
# @see http://librdf.org/raptor/api/raptor-section-xml-namespace.html
|
526
|
-
define_pointer :raptor_namespace
|
527
|
-
|
528
|
-
# @see http://librdf.org/raptor/api/raptor-section-serializer.html
|
529
|
-
define_pointer :raptor_serializer
|
530
|
-
attach_function :raptor_new_serializer, [:string], raptor_serializer
|
531
|
-
attach_function :raptor_free_serializer, [raptor_serializer], :void
|
532
|
-
attach_function :raptor_serialize_start_to_iostream, [raptor_serializer, raptor_uri, raptor_iostream], :int
|
533
|
-
attach_function :raptor_serialize_start_to_filename, [raptor_serializer, :string], :int
|
534
|
-
attach_function :raptor_serialize_statement, [raptor_serializer, raptor_statement], :int
|
535
|
-
attach_function :raptor_serialize_end, [raptor_serializer], :int
|
536
|
-
attach_function :raptor_serializer_set_error_handler, [raptor_serializer, :pointer, :raptor_message_handler], :void
|
537
|
-
attach_function :raptor_serializer_set_warning_handler, [raptor_serializer, :pointer, :raptor_message_handler], :void
|
538
|
-
|
539
|
-
# Initialize the world
|
540
|
-
# We do this exactly once and never release because we can't delegate
|
541
|
-
# any memory management to the ruby GC.
|
542
|
-
# Internally raptor_init/raptor_finish work with ref-counts.
|
543
|
-
raptor_init
|
544
|
-
|
545
|
-
end
|
546
|
-
end
|
547
|
-
end
|
548
|
-
|
193
|
+
ffi_lib ::FFI::Library::LIBC
|
194
|
+
attach_function :strlen, [:pointer], :size_t
|
195
|
+
end # LibC
|
196
|
+
end # FFI
|
197
|
+
end # RDF::Raptor
|