turtle 0.0.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/lib/turtle.rb +9 -0
- data/lib/turtle/builder.rb +228 -0
- metadata +56 -0
data/lib/turtle.rb
ADDED
@@ -0,0 +1,228 @@
|
|
1
|
+
module Turtle
|
2
|
+
|
3
|
+
class BlankNode
|
4
|
+
|
5
|
+
def initialize(name)
|
6
|
+
@name = name
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_s()
|
10
|
+
"_:#{@name}"
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
class Builder
|
16
|
+
|
17
|
+
def initialize(out)
|
18
|
+
@out = out
|
19
|
+
@state = :object
|
20
|
+
@xsd = nil
|
21
|
+
@blank = 0
|
22
|
+
@indent = 0
|
23
|
+
end
|
24
|
+
|
25
|
+
def base(uri)
|
26
|
+
@out.puts "@base <#{uri}> ."
|
27
|
+
end
|
28
|
+
|
29
|
+
def prefix(prefix, namespace=nil)
|
30
|
+
if namespace
|
31
|
+
case prefix
|
32
|
+
when :blank, :_
|
33
|
+
@out.puts "@prefix : <#{namespace}> ."
|
34
|
+
else
|
35
|
+
@out.puts "@prefix #{prefix}: <#{namespace}> ."
|
36
|
+
@xsd = prefix if namespace == "http://www.w3.org/2001/XMLSchema#"
|
37
|
+
end
|
38
|
+
else
|
39
|
+
case prefix
|
40
|
+
when :blank, :_
|
41
|
+
@out.puts "@prefix : <#{namespace}> ."
|
42
|
+
when :xsd
|
43
|
+
prefix(:xsd, "http://www.w3.org/2001/XMLSchema#")
|
44
|
+
when :rdf
|
45
|
+
prefix(:rdf, "http://www.w3.org/1999/02/22-rdf-syntax-ns#")
|
46
|
+
when :rdfs
|
47
|
+
prefix(:rdfs, "http://www.w3.org/2000/01/rdf-schema#")
|
48
|
+
when :owl
|
49
|
+
prefix(:owl, "http://www.w3.org/2002/07/owl#")
|
50
|
+
when String
|
51
|
+
@out.puts "@prefix : <#{prefix}> ."
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def subject(s, p=nil, o=nil, &block)
|
57
|
+
@out.print "#{indent}#{resolve s}"
|
58
|
+
if p
|
59
|
+
@out.print " #{resolve p}"
|
60
|
+
if o
|
61
|
+
@out.print " #{resolve o}"
|
62
|
+
@state = :object
|
63
|
+
else
|
64
|
+
@state = :predicate
|
65
|
+
end
|
66
|
+
else
|
67
|
+
@state = :subject
|
68
|
+
end
|
69
|
+
indent &block
|
70
|
+
@out.puts " ."
|
71
|
+
end
|
72
|
+
|
73
|
+
def predicate(p, o=nil, &block)
|
74
|
+
if @state == :object
|
75
|
+
@out.print " ;"
|
76
|
+
end
|
77
|
+
@out.print "\n#{indent}#{resolve p}"
|
78
|
+
if o
|
79
|
+
@out.print " #{resolve o}"
|
80
|
+
@state = :object
|
81
|
+
else
|
82
|
+
@state = :predicate
|
83
|
+
end
|
84
|
+
indent &block
|
85
|
+
end
|
86
|
+
|
87
|
+
def object(o)
|
88
|
+
if @state == :object
|
89
|
+
@out.print " ,"
|
90
|
+
end
|
91
|
+
@out.print "\n#{indent}#{resolve o}"
|
92
|
+
@state = :object
|
93
|
+
end
|
94
|
+
|
95
|
+
def comment(text)
|
96
|
+
@out.print "#{indent}# #{text}\n"
|
97
|
+
end
|
98
|
+
|
99
|
+
def newline
|
100
|
+
@out.print "\n"
|
101
|
+
end
|
102
|
+
|
103
|
+
def blank(name=nil)
|
104
|
+
unless name
|
105
|
+
name = "b#{@blank}"
|
106
|
+
@blank += 1
|
107
|
+
end
|
108
|
+
BlankNode.new name
|
109
|
+
end
|
110
|
+
|
111
|
+
alias s subject
|
112
|
+
alias p predicate
|
113
|
+
alias o object
|
114
|
+
alias triple subject
|
115
|
+
alias t subject
|
116
|
+
alias c comment
|
117
|
+
alias nl newline
|
118
|
+
|
119
|
+
def _(name=nil)
|
120
|
+
if name
|
121
|
+
blank name
|
122
|
+
else
|
123
|
+
:blank
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def a()
|
128
|
+
:a
|
129
|
+
end
|
130
|
+
|
131
|
+
def xsd_datatype(datatype)
|
132
|
+
if @xsd
|
133
|
+
"#{@xsd}:#{datatype}"
|
134
|
+
else
|
135
|
+
"<http://www.w3.org/2001/XMLSchema##{datatype}>"
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def resolve(e)
|
140
|
+
case e
|
141
|
+
when Array
|
142
|
+
case e.size
|
143
|
+
when 0
|
144
|
+
"<>"
|
145
|
+
when 1
|
146
|
+
first = e.first
|
147
|
+
case first
|
148
|
+
when :blank, :_
|
149
|
+
":"
|
150
|
+
when Symbol
|
151
|
+
"#{first}:"
|
152
|
+
when String
|
153
|
+
"<#{e.first}>"
|
154
|
+
end
|
155
|
+
else
|
156
|
+
first, last = e
|
157
|
+
case first
|
158
|
+
when :blank, :_
|
159
|
+
case last
|
160
|
+
when :blank, :_
|
161
|
+
":"
|
162
|
+
else
|
163
|
+
":#{last}"
|
164
|
+
end
|
165
|
+
when Symbol
|
166
|
+
case last
|
167
|
+
when :blank, :_
|
168
|
+
"#{first}:"
|
169
|
+
else
|
170
|
+
"#{first}:#{last}"
|
171
|
+
end
|
172
|
+
when String
|
173
|
+
"\"#{first}\"^^#{xsd_datatype last}"
|
174
|
+
end
|
175
|
+
end
|
176
|
+
when :blank, :_
|
177
|
+
resolve blank
|
178
|
+
when :a
|
179
|
+
"a"
|
180
|
+
when BlankNode
|
181
|
+
e.to_s
|
182
|
+
when Symbol
|
183
|
+
resolve blank(e)
|
184
|
+
when String
|
185
|
+
"\"#{encode(e)}\""
|
186
|
+
when Fixnum
|
187
|
+
"\"#{e}\"^^#{xsd_datatype :integer}"
|
188
|
+
when Float
|
189
|
+
"\"#{e}\"^^#{xsd_datatype :double}"
|
190
|
+
when true, false
|
191
|
+
"\"#{e}\"^^#{xsd_datatype :boolean}"
|
192
|
+
else
|
193
|
+
e
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def encode(s)
|
198
|
+
a = s.codepoints.collect do |p|
|
199
|
+
case p
|
200
|
+
when 34 then "\\\""
|
201
|
+
when 92 then "\\\\"
|
202
|
+
when 0..127 then p.chr
|
203
|
+
else
|
204
|
+
"\\u#{sprintf("%X", p).rjust(4, "0")}"
|
205
|
+
end
|
206
|
+
end
|
207
|
+
a.join
|
208
|
+
end
|
209
|
+
|
210
|
+
def indent()
|
211
|
+
if block_given?
|
212
|
+
@indent += 1
|
213
|
+
yield
|
214
|
+
@indent -= 1
|
215
|
+
else
|
216
|
+
" " * @indent
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
def self.build(out=STDOUT, extension=nil, &block)
|
221
|
+
builder = new out
|
222
|
+
builder.extend ext if extension
|
223
|
+
builder.instance_eval &block
|
224
|
+
end
|
225
|
+
|
226
|
+
end
|
227
|
+
|
228
|
+
end
|
metadata
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: turtle
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kim Dalsgaard
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-16 00:00:00 +01:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: ""
|
17
|
+
email: kim@kimdalsgaard.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- lib/turtle/builder.rb
|
26
|
+
- lib/turtle.rb
|
27
|
+
has_rdoc: true
|
28
|
+
homepage: http://github.com/dalsgaard/turtle.rb
|
29
|
+
licenses: []
|
30
|
+
|
31
|
+
post_install_message:
|
32
|
+
rdoc_options: []
|
33
|
+
|
34
|
+
require_paths:
|
35
|
+
- lib
|
36
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: "0"
|
41
|
+
version:
|
42
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: "0"
|
47
|
+
version:
|
48
|
+
requirements: []
|
49
|
+
|
50
|
+
rubyforge_project:
|
51
|
+
rubygems_version: 1.3.5
|
52
|
+
signing_key:
|
53
|
+
specification_version: 3
|
54
|
+
summary: A Ruby DSL for generating RDF in the Turtle format
|
55
|
+
test_files: []
|
56
|
+
|