rdf 0.1.10 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CONTRIBUTORS +3 -0
- data/README +68 -34
- data/VERSION +1 -1
- data/etc/doap.nt +16 -0
- data/lib/rdf.rb +24 -18
- data/lib/rdf/format.rb +47 -22
- data/lib/rdf/mixin/countable.rb +42 -0
- data/lib/rdf/mixin/durable.rb +2 -0
- data/lib/rdf/mixin/enumerable.rb +72 -50
- data/lib/rdf/mixin/inferable.rb +2 -3
- data/lib/rdf/mixin/mutable.rb +51 -107
- data/lib/rdf/mixin/queryable.rb +43 -11
- data/lib/rdf/mixin/readable.rb +2 -0
- data/lib/rdf/mixin/writable.rb +130 -0
- data/lib/rdf/model/graph.rb +47 -14
- data/lib/rdf/model/literal.rb +12 -2
- data/lib/rdf/model/node.rb +51 -2
- data/lib/rdf/model/resource.rb +7 -10
- data/lib/rdf/model/statement.rb +59 -41
- data/lib/rdf/model/uri.rb +68 -8
- data/lib/rdf/model/value.rb +26 -31
- data/lib/rdf/ntriples/reader.rb +7 -6
- data/lib/rdf/ntriples/writer.rb +90 -0
- data/lib/rdf/query.rb +6 -6
- data/lib/rdf/query/pattern.rb +13 -15
- data/lib/rdf/query/solution.rb +1 -1
- data/lib/rdf/query/variable.rb +3 -1
- data/lib/rdf/reader.rb +2 -1
- data/lib/rdf/repository.rb +97 -47
- data/lib/rdf/util.rb +4 -0
- data/lib/rdf/util/aliasing.rb +51 -0
- data/lib/rdf/util/cache.rb +131 -0
- data/lib/rdf/version.rb +3 -4
- data/lib/rdf/vocab.rb +11 -10
- data/lib/rdf/vocab/cert.rb +13 -0
- data/lib/rdf/vocab/geo.rb +13 -0
- data/lib/rdf/vocab/rsa.rb +12 -0
- data/lib/rdf/writer.rb +102 -109
- metadata +23 -15
@@ -0,0 +1,131 @@
|
|
1
|
+
module RDF; module Util
|
2
|
+
##
|
3
|
+
# A `Hash`-like cache that holds only weak references to the values it
|
4
|
+
# caches, meaning that values contained in the cache can be garbage
|
5
|
+
# collected. This allows the cache to dynamically adjust to changing
|
6
|
+
# memory conditions, caching more objects when memory is plentiful, but
|
7
|
+
# evicting most objects if memory pressure increases to the point of
|
8
|
+
# scarcity.
|
9
|
+
#
|
10
|
+
# @see RDF::URI.intern
|
11
|
+
# @see http://en.wikipedia.org/wiki/Weak_reference
|
12
|
+
# @since 0.2.0
|
13
|
+
class Cache
|
14
|
+
##
|
15
|
+
# @private
|
16
|
+
def self.new(*args)
|
17
|
+
# JRuby doesn't support `ObjectSpace#_id2ref` unless the `-X+O`
|
18
|
+
# startup option is given, so on that platform we'll default to using
|
19
|
+
# the WeakRef-based cache:
|
20
|
+
klass = case RUBY_PLATFORM
|
21
|
+
when /java/ then WeakRefCache
|
22
|
+
else ObjectSpaceCache
|
23
|
+
end
|
24
|
+
cache = klass.allocate
|
25
|
+
cache.send(:initialize, *args)
|
26
|
+
cache
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# @param [Integer] capacity
|
31
|
+
def initialize(capacity = -1)
|
32
|
+
@capacity = capacity
|
33
|
+
@cache ||= {}
|
34
|
+
@index ||= {}
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# @return [Integer]
|
39
|
+
def size
|
40
|
+
@cache.size
|
41
|
+
end
|
42
|
+
|
43
|
+
##
|
44
|
+
# @return [Boolean]
|
45
|
+
def has_capacity?
|
46
|
+
@capacity == -1 || @capacity > @cache.size
|
47
|
+
end
|
48
|
+
|
49
|
+
##
|
50
|
+
# @param [Object] value
|
51
|
+
# @return [void]
|
52
|
+
def define_finalizer!(value)
|
53
|
+
ObjectSpace.define_finalizer(value, finalizer)
|
54
|
+
end
|
55
|
+
|
56
|
+
##
|
57
|
+
# @return [Proc]
|
58
|
+
def finalizer
|
59
|
+
lambda { |object_id| @cache.delete(@index.delete(object_id)) }
|
60
|
+
end
|
61
|
+
|
62
|
+
##
|
63
|
+
# This implementation relies on `ObjectSpace#_id2ref` and performs
|
64
|
+
# optimally on Ruby 1.8.x and 1.9.x; however, it does not work on JRuby
|
65
|
+
# by default since much `ObjectSpace` functionality on that platform is
|
66
|
+
# disabled unless the `-X+O` startup option is given.
|
67
|
+
#
|
68
|
+
# @see http://ruby-doc.org/ruby-1.9/classes/ObjectSpace.html
|
69
|
+
# @see http://eigenclass.org/hiki/weakhash+and+weakref
|
70
|
+
class ObjectSpaceCache < Cache
|
71
|
+
##
|
72
|
+
# @param [Object] key
|
73
|
+
# @return [Object]
|
74
|
+
def [](key)
|
75
|
+
if value_id = @cache[key]
|
76
|
+
value = ObjectSpace._id2ref(value_id)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
##
|
81
|
+
# @param [Object] key
|
82
|
+
# @param [Object] value
|
83
|
+
# @return [Object]
|
84
|
+
def []=(key, value)
|
85
|
+
if has_capacity?
|
86
|
+
@cache[key] = value.object_id
|
87
|
+
@index[value.object_id] = key
|
88
|
+
define_finalizer!(value)
|
89
|
+
end
|
90
|
+
value
|
91
|
+
end
|
92
|
+
end # class ObjectSpaceCache
|
93
|
+
|
94
|
+
##
|
95
|
+
# This implementation uses the `WeakRef` class from Ruby's standard
|
96
|
+
# library, and provides adequate performance on JRuby and on Ruby 1.9.x;
|
97
|
+
# however, it performs very suboptimally on Ruby 1.8.x.
|
98
|
+
#
|
99
|
+
# @see http://ruby-doc.org/ruby-1.9/classes/WeakRef.html
|
100
|
+
class WeakRefCache < Cache
|
101
|
+
##
|
102
|
+
# @param [Integer] capacity
|
103
|
+
def initialize(capacity = -1)
|
104
|
+
require 'weakref' unless defined?(::WeakRef)
|
105
|
+
super
|
106
|
+
end
|
107
|
+
|
108
|
+
##
|
109
|
+
# @param [Object] key
|
110
|
+
# @return [Object]
|
111
|
+
def [](key)
|
112
|
+
if (ref = @cache[key]) && ref.weakref_alive?
|
113
|
+
value = ref.__getobj__
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
##
|
118
|
+
# @param [Object] key
|
119
|
+
# @param [Object] value
|
120
|
+
# @return [Object]
|
121
|
+
def []=(key, value)
|
122
|
+
if has_capacity?
|
123
|
+
@cache[key] = WeakRef.new(value)
|
124
|
+
@index[value.object_id] = key
|
125
|
+
define_finalizer!(value)
|
126
|
+
end
|
127
|
+
value
|
128
|
+
end
|
129
|
+
end # class WeakRefCache
|
130
|
+
end # class Cache
|
131
|
+
end; end # module RDF::Util
|
data/lib/rdf/version.rb
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
module RDF
|
2
2
|
module VERSION
|
3
3
|
MAJOR = 0
|
4
|
-
MINOR =
|
5
|
-
TINY =
|
4
|
+
MINOR = 2
|
5
|
+
TINY = 0
|
6
6
|
EXTRA = nil
|
7
7
|
|
8
|
-
STRING = [MAJOR, MINOR, TINY].join('.')
|
9
|
-
STRING << ".#{EXTRA}" if EXTRA
|
8
|
+
STRING = [MAJOR, MINOR, TINY, EXTRA].compact.join('.')
|
10
9
|
|
11
10
|
##
|
12
11
|
# @return [String]
|
data/lib/rdf/vocab.rb
CHANGED
@@ -7,14 +7,17 @@ module RDF
|
|
7
7
|
# The following vocabularies are pre-defined for your convenience:
|
8
8
|
#
|
9
9
|
# * {RDF::CC} - Creative Commons (CC)
|
10
|
+
# * {RDF::CERT} - W3 Authentication Certificate (CERT)
|
10
11
|
# * {RDF::DC} - Dublin Core (DC)
|
11
12
|
# * {RDF::DC11} - Dublin Core 1.1 (DC11) _deprecated_
|
12
13
|
# * {RDF::DOAP} - Description of a Project (DOAP)
|
13
14
|
# * {RDF::EXIF} - Exchangeable Image File Format (EXIF)
|
14
15
|
# * {RDF::FOAF} - Friend of a Friend (FOAF)
|
16
|
+
# * {RDF::GEO} - WGS84 Geo Positioning (GEO)
|
15
17
|
# * {RDF::HTTP} - Hypertext Transfer Protocol (HTTP)
|
16
18
|
# * {RDF::OWL} - Web Ontology Language (OWL)
|
17
19
|
# * {RDF::RDFS} - RDF Schema (RDFS)
|
20
|
+
# * {RDF::RSA} - W3 RSA Keys (RSA)
|
18
21
|
# * {RDF::RSS} - RDF Site Summary (RSS)
|
19
22
|
# * {RDF::SIOC} - Semantically-Interlinked Online Communities (SIOC)
|
20
23
|
# * {RDF::SKOS} - Simple Knowledge Organization System (SKOS)
|
@@ -52,11 +55,9 @@ module RDF
|
|
52
55
|
def self.each(&block)
|
53
56
|
if self.equal?(Vocabulary)
|
54
57
|
# This is needed since all vocabulary classes are defined using
|
55
|
-
# Ruby's autoloading facility, meaning that `@@subclasses` will
|
56
|
-
#
|
57
|
-
|
58
|
-
require "rdf/vocab/#{prefix}"
|
59
|
-
end
|
58
|
+
# Ruby's autoloading facility, meaning that `@@subclasses` will be
|
59
|
+
# empty until each subclass has been touched or require'd.
|
60
|
+
RDF::VOCABS.each { |v| require "rdf/vocab/#{v}" unless v == :rdf }
|
60
61
|
@@subclasses.each(&block)
|
61
62
|
else
|
62
63
|
# TODO: should enumerate vocabulary-specific defined properties.
|
@@ -79,7 +80,7 @@ module RDF
|
|
79
80
|
# @param [#to_s] property
|
80
81
|
# @return [URI]
|
81
82
|
def self.[](property)
|
82
|
-
RDF::URI.
|
83
|
+
RDF::URI.intern([to_s, property.to_s].join(''))
|
83
84
|
end
|
84
85
|
|
85
86
|
##
|
@@ -87,7 +88,7 @@ module RDF
|
|
87
88
|
#
|
88
89
|
# @return [URI]
|
89
90
|
def self.to_uri
|
90
|
-
RDF::URI.
|
91
|
+
RDF::URI.intern(to_s)
|
91
92
|
end
|
92
93
|
|
93
94
|
##
|
@@ -117,7 +118,7 @@ module RDF
|
|
117
118
|
end
|
118
119
|
|
119
120
|
# Undefine all superfluous instance methods:
|
120
|
-
undef_method
|
121
|
+
undef_method(*(instance_methods.map(&:to_sym) - [:__id__, :__send__, :__class__, :__eval__, :object_id, :instance_eval, :inspect, :class, :is_a?]))
|
121
122
|
|
122
123
|
##
|
123
124
|
# @param [URI, String, #to_s]
|
@@ -134,7 +135,7 @@ module RDF
|
|
134
135
|
# @param [#to_s] property
|
135
136
|
# @return [URI]
|
136
137
|
def [](property)
|
137
|
-
RDF::URI.
|
138
|
+
RDF::URI.intern([to_s, property.to_s].join(''))
|
138
139
|
end
|
139
140
|
|
140
141
|
##
|
@@ -142,7 +143,7 @@ module RDF
|
|
142
143
|
#
|
143
144
|
# @return [URI]
|
144
145
|
def to_uri
|
145
|
-
RDF::URI.
|
146
|
+
RDF::URI.intern(to_s)
|
146
147
|
end
|
147
148
|
|
148
149
|
##
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module RDF
|
2
|
+
##
|
3
|
+
# W3 Authentication Certificates (CERT) vocabulary.
|
4
|
+
#
|
5
|
+
# @see http://www.w3.org/ns/auth/cert#
|
6
|
+
# @since 0.2.0
|
7
|
+
class CERT < Vocabulary("http://www.w3.org/ns/auth/cert#")
|
8
|
+
property :decimal
|
9
|
+
property :hex
|
10
|
+
property :identity
|
11
|
+
property :public_key
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module RDF
|
2
|
+
##
|
3
|
+
# WGS84 Geo Positioning (GEO) vocabulary.
|
4
|
+
#
|
5
|
+
# @see http://www.w3.org/2003/01/geo/wgs84_pos#
|
6
|
+
# @since 0.2.0
|
7
|
+
class GEO < Vocabulary("http://www.w3.org/2003/01/geo/wgs84_pos#")
|
8
|
+
property :lat
|
9
|
+
property :location
|
10
|
+
property :long
|
11
|
+
property :lat_long
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module RDF
|
2
|
+
##
|
3
|
+
# W3 RSA Keys (RSA) vocabulary.
|
4
|
+
#
|
5
|
+
# @see http://www.w3.org/ns/auth/rsa#
|
6
|
+
# @since 0.2.0
|
7
|
+
class RSA < Vocabulary("http://www.w3.org/ns/auth/rsa#")
|
8
|
+
property :modulus
|
9
|
+
property :private_exponent
|
10
|
+
property :public_exponent
|
11
|
+
end
|
12
|
+
end
|
data/lib/rdf/writer.rb
CHANGED
@@ -34,7 +34,7 @@ module RDF
|
|
34
34
|
# @see RDF::Reader
|
35
35
|
class Writer
|
36
36
|
extend ::Enumerable
|
37
|
-
include ::
|
37
|
+
include RDF::Writable
|
38
38
|
|
39
39
|
##
|
40
40
|
# Enumerates known RDF writer classes.
|
@@ -96,24 +96,34 @@ module RDF
|
|
96
96
|
alias_method :format_class, :format
|
97
97
|
end
|
98
98
|
|
99
|
+
##
|
100
|
+
# @param [Object] data
|
101
|
+
# @param [IO, File] io
|
102
|
+
# @param [Hash{Symbol => Object}] options
|
103
|
+
# @return [void]
|
99
104
|
def self.dump(data, io = nil, options = {})
|
100
105
|
io = File.open(io, 'w') if io.is_a?(String)
|
106
|
+
method = data.respond_to?(:each_statement) ? :each_statement : :each
|
101
107
|
if io
|
102
108
|
new(io) do |writer|
|
103
|
-
data.
|
109
|
+
data.send(method) do |statement|
|
104
110
|
writer << statement
|
105
111
|
end
|
106
112
|
writer.flush
|
107
113
|
end
|
108
114
|
else
|
109
115
|
buffer do |writer|
|
110
|
-
data.
|
116
|
+
data.send(method) do |statement|
|
111
117
|
writer << statement
|
112
118
|
end
|
113
119
|
end
|
114
120
|
end
|
115
121
|
end
|
116
122
|
|
123
|
+
##
|
124
|
+
# @yield [writer]
|
125
|
+
# @yieldparam [Writer] writer
|
126
|
+
# @return [String]
|
117
127
|
def self.buffer(*args, &block)
|
118
128
|
require 'stringio' unless defined?(StringIO)
|
119
129
|
|
@@ -123,6 +133,10 @@ module RDF
|
|
123
133
|
end
|
124
134
|
end
|
125
135
|
|
136
|
+
##
|
137
|
+
# @param [String] filename
|
138
|
+
# @param [Hash{Symbol => Object}] options
|
139
|
+
# @return [Writer]
|
126
140
|
def self.open(filename, options = {}, &block)
|
127
141
|
File.open(filename, 'wb') do |file|
|
128
142
|
self.for(options[:format] || filename).new(file, options, &block)
|
@@ -135,16 +149,29 @@ module RDF
|
|
135
149
|
# @yield [writer]
|
136
150
|
# @yieldparam [RDF::Writer] writer
|
137
151
|
def initialize(output = $stdout, options = {}, &block)
|
138
|
-
@output, @options = output, options
|
139
|
-
@nodes, @node_id
|
152
|
+
@output, @options = output, options.dup
|
153
|
+
@nodes, @node_id = {}, 0
|
140
154
|
|
141
155
|
if block_given?
|
142
156
|
write_prologue
|
143
|
-
block.
|
157
|
+
case block.arity
|
158
|
+
when 1 then block.call(self)
|
159
|
+
else instance_eval(&block)
|
160
|
+
end
|
144
161
|
write_epilogue
|
145
162
|
end
|
146
163
|
end
|
147
164
|
|
165
|
+
##
|
166
|
+
# Flushes the underlying output buffer.
|
167
|
+
#
|
168
|
+
# @return [void]
|
169
|
+
def flush
|
170
|
+
@output.flush if @output.respond_to?(:flush)
|
171
|
+
end
|
172
|
+
|
173
|
+
alias_method :flush!, :flush
|
174
|
+
|
148
175
|
##
|
149
176
|
# @return [void]
|
150
177
|
# @abstract
|
@@ -156,84 +183,57 @@ module RDF
|
|
156
183
|
def write_epilogue() end
|
157
184
|
|
158
185
|
##
|
186
|
+
# @param [String] text
|
159
187
|
# @return [void]
|
160
188
|
# @abstract
|
161
189
|
def write_comment(text) end
|
162
190
|
|
163
191
|
##
|
164
|
-
# @
|
165
|
-
def <<(data)
|
166
|
-
case data # TODO
|
167
|
-
#when Graph
|
168
|
-
# write_graph(data)
|
169
|
-
#when Resource
|
170
|
-
# #register!(resource) && write_node(resource)
|
171
|
-
# write_resource(data)
|
172
|
-
when Statement
|
173
|
-
write_statement(data)
|
174
|
-
else
|
175
|
-
if data.respond_to?(:to_a)
|
176
|
-
write_triple(*data.to_a)
|
177
|
-
else
|
178
|
-
raise ArgumentError.new("expected RDF::Statement or RDF::Resource, got #{data.inspect}")
|
179
|
-
end
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
##
|
184
|
-
# @param [Graph] graph
|
192
|
+
# @param [RDF::Graph] graph
|
185
193
|
# @return [void]
|
186
194
|
def write_graph(graph)
|
187
|
-
|
195
|
+
graph.each_triple { |*triple| write_triple(*triple) }
|
188
196
|
end
|
189
197
|
|
190
198
|
##
|
191
|
-
# @
|
192
|
-
def write_resource(subject) # FIXME
|
193
|
-
edge_nodes = []
|
194
|
-
subject.each do |predicate, objects|
|
195
|
-
[objects].flatten.each do |object|
|
196
|
-
edge_nodes << object if register!(object)
|
197
|
-
write_triple subject, predicate, object
|
198
|
-
end
|
199
|
-
end
|
200
|
-
edge_nodes.each { |node| write_resource node }
|
201
|
-
end
|
202
|
-
|
203
|
-
##
|
204
|
-
# @param [Array<Statement>] statements
|
199
|
+
# @param [Array<RDF::Statement>] statements
|
205
200
|
# @return [void]
|
206
201
|
def write_statements(*statements)
|
207
|
-
statements.flatten.each { |
|
202
|
+
statements.flatten.each { |statement| write_statement(statement) }
|
208
203
|
end
|
209
204
|
|
210
205
|
##
|
211
|
-
# @param [Statement] statement
|
206
|
+
# @param [RDF::Statement] statement
|
212
207
|
# @return [void]
|
213
208
|
def write_statement(statement)
|
214
|
-
write_triple(*statement.
|
209
|
+
write_triple(*statement.to_triple)
|
215
210
|
end
|
216
211
|
|
217
212
|
##
|
218
|
-
# @param [Array<Array(Value)>] triples
|
213
|
+
# @param [Array<Array(RDF::Resource, RDF::URI, RDF::Value)>] triples
|
219
214
|
# @return [void]
|
220
215
|
def write_triples(*triples)
|
221
216
|
triples.each { |triple| write_triple(*triple) }
|
222
217
|
end
|
223
218
|
|
224
219
|
##
|
225
|
-
# @param [Resource] subject
|
226
|
-
# @param [URI] predicate
|
227
|
-
# @param [Value] object
|
220
|
+
# @param [RDF::Resource] subject
|
221
|
+
# @param [RDF::URI] predicate
|
222
|
+
# @param [RDF::Value] object
|
228
223
|
# @return [void]
|
229
224
|
# @raise [NotImplementedError] unless implemented in subclass
|
230
225
|
# @abstract
|
231
226
|
def write_triple(subject, predicate, object)
|
232
|
-
raise NotImplementedError # override in subclasses
|
227
|
+
raise NotImplementedError.new("#{self.class}#write_triple") # override in subclasses
|
233
228
|
end
|
234
229
|
|
230
|
+
# Support the RDF::Writable interface:
|
231
|
+
alias_method :insert_graph, :write_graph
|
232
|
+
alias_method :insert_statements, :write_statements
|
233
|
+
alias_method :insert_statement, :write_statement
|
234
|
+
|
235
235
|
##
|
236
|
-
# @param [Value] value
|
236
|
+
# @param [RDF::Value] value
|
237
237
|
# @return [String]
|
238
238
|
def format_value(value, options = {})
|
239
239
|
case value
|
@@ -252,7 +252,7 @@ module RDF
|
|
252
252
|
# @raise [NotImplementedError] unless implemented in subclass
|
253
253
|
# @abstract
|
254
254
|
def format_uri(value, options = {})
|
255
|
-
raise NotImplementedError # override in subclasses
|
255
|
+
raise NotImplementedError.new("#{self.class}#format_uri") # override in subclasses
|
256
256
|
end
|
257
257
|
|
258
258
|
##
|
@@ -262,7 +262,7 @@ module RDF
|
|
262
262
|
# @raise [NotImplementedError] unless implemented in subclass
|
263
263
|
# @abstract
|
264
264
|
def format_node(value, options = {})
|
265
|
-
raise NotImplementedError # override in subclasses
|
265
|
+
raise NotImplementedError.new("#{self.class}#format_node") # override in subclasses
|
266
266
|
end
|
267
267
|
|
268
268
|
##
|
@@ -272,78 +272,71 @@ module RDF
|
|
272
272
|
# @raise [NotImplementedError] unless implemented in subclass
|
273
273
|
# @abstract
|
274
274
|
def format_literal(value, options = {})
|
275
|
-
raise NotImplementedError # override in subclasses
|
275
|
+
raise NotImplementedError.new("#{self.class}#format_literal") # override in subclasses
|
276
276
|
end
|
277
277
|
|
278
|
+
protected
|
279
|
+
|
278
280
|
##
|
279
|
-
# Flushes the underlying output buffer.
|
280
|
-
#
|
281
281
|
# @return [void]
|
282
|
-
def
|
283
|
-
@output.
|
282
|
+
def puts(*args)
|
283
|
+
@output.puts(*args)
|
284
284
|
end
|
285
285
|
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
def uri_for(uriref)
|
298
|
-
case
|
299
|
-
when uriref.is_a?(RDF::Node)
|
300
|
-
@nodes[uriref]
|
301
|
-
when uriref.respond_to?(:to_uri)
|
302
|
-
uriref.to_uri.to_s
|
303
|
-
else
|
304
|
-
uriref.to_s
|
305
|
-
end
|
286
|
+
##
|
287
|
+
# @param [RDF::Resource] uriref
|
288
|
+
# @return [String]
|
289
|
+
def uri_for(uriref)
|
290
|
+
case
|
291
|
+
when uriref.is_a?(RDF::Node)
|
292
|
+
@nodes[uriref]
|
293
|
+
when uriref.respond_to?(:to_uri)
|
294
|
+
uriref.to_uri.to_s
|
295
|
+
else
|
296
|
+
uriref.to_s
|
306
297
|
end
|
298
|
+
end
|
307
299
|
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
300
|
+
##
|
301
|
+
# @return [String]
|
302
|
+
def node_id
|
303
|
+
"_:n#{@node_id += 1}"
|
304
|
+
end
|
313
305
|
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
306
|
+
##
|
307
|
+
# @deprecated
|
308
|
+
def register!(resource)
|
309
|
+
if resource.kind_of?(RDF::Resource)
|
310
|
+
unless @nodes[resource] # have we already seen it?
|
311
|
+
@nodes[resource] = resource.uri || node_id
|
319
312
|
end
|
320
313
|
end
|
314
|
+
end
|
321
315
|
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
##
|
331
|
-
# @param [String] string
|
332
|
-
# @return [String]
|
333
|
-
def quoted(string)
|
334
|
-
"\"#{string}\""
|
335
|
-
end
|
316
|
+
##
|
317
|
+
# @param [String] string
|
318
|
+
# @return [String]
|
319
|
+
def escaped(string)
|
320
|
+
string.gsub('\\', '\\\\').gsub("\t", '\\t').
|
321
|
+
gsub("\n", '\\n').gsub("\r", '\\r').gsub('"', '\\"')
|
322
|
+
end
|
336
323
|
|
337
|
-
|
324
|
+
##
|
325
|
+
# @param [String] string
|
326
|
+
# @return [String]
|
327
|
+
def quoted(string)
|
328
|
+
"\"#{string}\""
|
329
|
+
end
|
338
330
|
|
339
|
-
|
331
|
+
private
|
340
332
|
|
341
|
-
|
342
|
-
@@subclasses << child
|
343
|
-
super
|
344
|
-
end
|
333
|
+
@@subclasses = [] # @private
|
345
334
|
|
346
|
-
|
335
|
+
def self.inherited(child) # @private
|
336
|
+
@@subclasses << child
|
337
|
+
super
|
338
|
+
end
|
339
|
+
end # class Writer
|
347
340
|
|
348
341
|
class WriterError < IOError; end
|
349
342
|
end
|