turtle 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/lib/turtle.rb +9 -0
  2. data/lib/turtle/builder.rb +228 -0
  3. metadata +56 -0
@@ -0,0 +1,9 @@
1
+ require 'turtle/builder'
2
+
3
+ module Turtle
4
+
5
+ def self.build(out=STDOUT, extension=nil, &block)
6
+ Builder.build out, extension, &block
7
+ end
8
+
9
+ end
@@ -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
+