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.
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
+