ttl2html 1.3.4 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 79231cafbf41d1d06149ccc0a101aae7ecc02f9ff554d542c36b3891b3943082
4
- data.tar.gz: ba235231f54ff64003de2e397b8f4d55e7cfda909b2624cc8412cd37d51c6a3d
3
+ metadata.gz: 858625044e6a0e9ff78bacc944b6aebb8dc4fb95f07cda76d3eab790d0602163
4
+ data.tar.gz: 0d514bacd1ddd635dfa36ca7aca8e74b2a5ff78e15b16e21a2124eaa04660e40
5
5
  SHA512:
6
- metadata.gz: 22c589eb1d742d5ed17e18431b5b450336bf45216071d6ce7581e7cae9fb907077a67debc347d269c0e0ee10ca28adbb2ad087841cfb6fbc06734bdb266901db
7
- data.tar.gz: a34e1c9af0e0ae65be8a0217425f47bd00a2500e0ce785fce8109b24dae671e1dd7cbb2c40063e93d7cce46689bb4ab43e8677f42bb0c84402d4e0a6434ce742
6
+ metadata.gz: 9958babbf93cd931926e4f56cc348fe16130f908a324d1978cd2d2f35c9ebca2646c4b86fa9ef97365377cb4ca23e7365f460e024207a3ccef8439fb545cde92
7
+ data.tar.gz: ceb241313491e6b67c633aa235c9bc74c5e2bf76fc6b4bc1479c9874e9aed07995f0655da48e2e29e36a4a22dc5efa14476e4394fce5b7465a3a3ef759f9990b
data/bin/ttl2html CHANGED
@@ -37,6 +37,5 @@ end
37
37
  if opt_cleanup
38
38
  ttl2html.cleanup
39
39
  else
40
- ttl2html.output_html_files
41
- ttl2html.output_turtle_files
40
+ ttl2html.output_files
42
41
  end
@@ -15,7 +15,7 @@ module TTL2HTML
15
15
  def initialize(template, param = {})
16
16
  @template = template
17
17
  @param = param.dup
18
- @template_path = [ Dir.pwd, File.join(Dir.pwd, "templates") ]
18
+ @template_path = [ File.join(Dir.pwd, "templates") ]
19
19
  @template_path << File.join(File.dirname(__FILE__), "..", "..", "templates")
20
20
  I18n.load_path << Dir[File.join(File.dirname(__FILE__), "..", "..", "locales") + "/*.yml"]
21
21
  I18n.load_path << Dir[File.expand_path("locales") + "/*.yml"]
@@ -59,6 +59,7 @@ module TTL2HTML
59
59
  def expand_shape(data, uri, prefixes = {})
60
60
  return nil if not data[uri]
61
61
  return nil if not data[uri]["http://www.w3.org/ns/shacl#property"]
62
+ prefix_used = {}
62
63
  result = data[uri]["http://www.w3.org/ns/shacl#property"].sort_by do |e|
63
64
  e["http://www.w3.org/ns/shacl#order"]
64
65
  end.map do |property|
@@ -67,6 +68,7 @@ module TTL2HTML
67
68
  prefixes.each do |prefix, val|
68
69
  if path.index(val) == 0
69
70
  shorten_path = path.sub(/\A#{val}/, "#{prefix}:")
71
+ prefix_used[prefix] = val
70
72
  end
71
73
  end
72
74
  repeatable = false
@@ -107,52 +109,33 @@ module TTL2HTML
107
109
  nodeKind: data[property]["http://www.w3.org/ns/shacl#nodeKind"] ? data[property]["http://www.w3.org/ns/shacl#nodeKind"].first : nil,
108
110
  nodes: nodes,
109
111
  node_mode: node_mode,
112
+ prefix: prefix_used,
110
113
  }
111
114
  end
112
115
  template = "shape-table.html.erb"
113
116
  tmpl = Template.new(template)
114
- tmpl.to_html_raw(template, {properties: result})
117
+ tmpl.to_html_raw(template, { properties: result, prefix: prefix_used })
115
118
  end
116
119
 
117
120
  # helper method:
118
- def uri_mapping_to_path(uri, suffix = ".html")
121
+ include TTL2HTML::Util
122
+ def relative_path(dest)
119
123
  path = nil
120
- if @param[:uri_mappings]
121
- @param[:uri_mappings].each do |mapping|
122
- local_file = uri.sub(@param[:base_uri], "")
123
- if mapping["regexp"] =~ local_file
124
- path = local_file.sub(mapping["regexp"], mapping["path"])
125
- end
126
- end
127
- end
128
- if path.nil?
129
- if suffix == ".html"
130
- if @param[:data_global] and @param[:data_global].keys.find{|e| e.start_with?(uri + "/") }
131
- path = uri + "/index"
132
- elsif uri.end_with?("/")
133
- path = uri + "index"
134
- else
135
- path = uri
136
- end
137
- else
138
- path = uri
139
- end
124
+ dest_uri = RDF::IRI.parse(dest)
125
+ if dest_uri.absolute?
126
+ path = dest
127
+ else
128
+ src = @param[:output_file]
129
+ src = Pathname.new(src).relative_path_from(Pathname.new(@param[:output_dir])) if @param[:output_dir]
130
+ path = Pathname(dest).relative_path_from(Pathname(File.dirname src))
131
+ path = path.to_s + "/" if File.directory? path
140
132
  end
141
- path = path.sub(@param[:base_uri], "") if @param[:base_uri]
142
- path << suffix
143
133
  path
144
134
  end
145
- def relative_path(dest)
146
- src = @param[:output_file]
147
- src = Pathname.new(src).relative_path_from(Pathname.new(@param[:output_dir])) if @param[:output_dir]
148
- path = Pathname(dest).relative_path_from(Pathname(File.dirname src))
149
- path = path.to_s + "/" if File.directory? path
150
- path
151
- end
152
- def relative_path_uri(dest_uri, base_uri)
135
+ def relative_path_uri(dest_uri, base_uri = @param[:base_uri])
153
136
  if dest_uri.start_with? base_uri
154
137
  dest = dest_uri.sub(base_uri, "")
155
- dest = uri_mapping_to_path(dest, "")
138
+ dest = uri_mapping_to_path(dest, @param, "")
156
139
  relative_path(dest)
157
140
  else
158
141
  dest_uri
@@ -176,6 +159,7 @@ module TTL2HTML
176
159
  end
177
160
  end
178
161
  def get_title(data, default_title = "no title")
162
+ return default_title if data.nil?
179
163
  if @param[:title_property_perclass] and data["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"]
180
164
  @param[:title_property_perclass].each do |klass, property|
181
165
  if data["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"].include?(klass) and data[property]
@@ -210,14 +194,18 @@ module TTL2HTML
210
194
  object
211
195
  end
212
196
  end
213
- def format_property(property, labels = {})
214
- if labels and labels[property]
197
+ def format_property(property, labels = {}, subject = nil)
198
+ subject = @param[:blank_subject] if not subject and @param[:blank_subject]
199
+ subject_class = @param[:data_global][subject][RDF.type.to_s]&.first if subject
200
+ if subject_class and @param[:labels_with_class][subject_class] and @param[:labels_with_class][subject_class][property]
201
+ @param[:labels_with_class][subject_class][property]
202
+ elsif labels and labels[property]
215
203
  labels[property]
216
204
  else
217
205
  property.split(/[\/\#]/).last.capitalize
218
206
  end
219
207
  end
220
- def format_object(object, data)
208
+ def format_object(object, data, type = {})
221
209
  if object =~ /\Ahttps?:\/\//
222
210
  rel_path = relative_path_uri(object, param[:base_uri])
223
211
  if param[:data_global][object]
@@ -226,12 +214,16 @@ module TTL2HTML
226
214
  "<a href=\"#{rel_path}\">#{object}</a>"
227
215
  end
228
216
  elsif object =~ /\A_:/ and param[:data_global][object]
229
- format_triples(param[:data_global][object])
217
+ if type[:inverse] and param[:data_inverse_global][object]
218
+ format_triples(param[:data_inverse_global][object], inverse: true, blank: true)
219
+ else
220
+ format_triples(param[:data_global][object], blank: true)
221
+ end
230
222
  else
231
223
  object
232
224
  end
233
225
  end
234
- def format_triples(triples, type = :default)
226
+ def format_triples(triples, type = {})
235
227
  param_local = @param.dup.merge(data: triples)
236
228
  param_local[:type] = type
237
229
  if @param[:labels_with_class] and triples["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"]
@@ -258,7 +250,26 @@ module TTL2HTML
258
250
  end
259
251
  end
260
252
  end
261
- to_html_raw("triples.html.erb", param_local)
253
+ if type[:inverse] == true
254
+ if type[:blank] == true
255
+ #p param_local[:data]
256
+ #p param_local[:data_inverse]
257
+ #p param_local[:data_inverse].values.first.first
258
+ param_local[:blank_subject] = param_local[:data].values.first.first
259
+ param_local[:blank_triples] = {
260
+ param_local[:data].keys.first => param_local[:data_global][param_local[:blank_subject]][param_local[:data].keys.first]
261
+ }
262
+ #p param_local[:blank_subject]
263
+ #p param_local[:blank_triples]
264
+ param_local[:type] = {}
265
+ #pp param_local
266
+ to_html_raw("triples-blank.html.erb", param_local)
267
+ else
268
+ to_html_raw("triples-inverse.html.erb", param_local)
269
+ end
270
+ else
271
+ to_html_raw("triples.html.erb", param_local)
272
+ end
262
273
  end
263
274
  def format_version_info(version)
264
275
  param_local = @param.dup.merge(data: version)
@@ -0,0 +1,32 @@
1
+ module TTL2HTML
2
+ module Util
3
+ def uri_mapping_to_path(uri, param, suffix = ".html")
4
+ path = nil
5
+ if param[:uri_mappings]
6
+ param[:uri_mappings].each do |mapping|
7
+ local_file = uri.sub(param[:base_uri], "")
8
+ if mapping["regexp"] =~ local_file
9
+ path = local_file.sub(mapping["regexp"], mapping["path"])
10
+ end
11
+ end
12
+ end
13
+ if path.nil?
14
+ if suffix == ".html"
15
+ if @data.keys.find{|e| e.start_with?(uri + "/") }
16
+ path = uri + "/index"
17
+ elsif uri.end_with?("/")
18
+ path = uri + "index"
19
+ else
20
+ path = uri
21
+ end
22
+ else
23
+ path = uri
24
+ end
25
+ end
26
+ path = path.sub(param[:base_uri], "")
27
+ path << suffix
28
+ #p [uri, path]
29
+ path
30
+ end
31
+ end
32
+ end
@@ -1 +1 @@
1
- TTL2HTML::VERSION = "1.3.4"
1
+ TTL2HTML::VERSION = "2.0.1"
data/lib/ttl2html.rb CHANGED
@@ -1,15 +1,18 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "zlib"
4
+ require "uri"
4
5
  require "yaml"
5
6
  require "nokogiri"
6
7
  require "rdf/turtle"
7
8
  require "ruby-progressbar"
8
9
 
10
+ require "ttl2html/util"
9
11
  require "ttl2html/template"
10
12
 
11
13
  module TTL2HTML
12
14
  class App
15
+ include Util
13
16
  def initialize(config = "config.yml")
14
17
  @config = load_config(config)
15
18
  if not @config[:base_uri]
@@ -18,11 +21,10 @@ module TTL2HTML
18
21
  @data = {}
19
22
  @data_inverse = {}
20
23
  @prefix = {}
21
- @graph = RDF::Graph.new
22
24
  end
23
25
 
24
26
  def load_config(file)
25
- config = {}
27
+ config = { output_turtle: true }
26
28
  open(file) do |io|
27
29
  YAML.safe_load(io, permitted_classes: [Regexp]).each do |k, v|
28
30
  config[k.intern] = v
@@ -39,10 +41,8 @@ module TTL2HTML
39
41
  else
40
42
  io = File.open(file)
41
43
  end
42
- RDF::Turtle::Reader.new(io) do |reader|
43
- @prefix.merge! reader.prefixes
44
+ RDF::Format.for(:turtle).reader.new(io) do |reader|
44
45
  reader.statements.each do |statement|
45
- @graph.insert(statement)
46
46
  s = statement.subject
47
47
  v = statement.predicate
48
48
  o = statement.object
@@ -55,12 +55,13 @@ module TTL2HTML
55
55
  @data[s.to_s][v.to_s] ||= []
56
56
  @data[s.to_s][v.to_s] << o.to_s
57
57
  end
58
- if o.is_a? RDF::URI
58
+ if o.is_a? RDF::URI or o.is_a? RDF::Node
59
59
  @data_inverse[o.to_s] ||= {}
60
60
  @data_inverse[o.to_s][v.to_s] ||= []
61
61
  @data_inverse[o.to_s][v.to_s] << s.to_s
62
62
  end
63
63
  end
64
+ @prefix.merge! reader.prefixes
64
65
  end
65
66
  STDERR.puts "#{count} triples. #{@data.size} subjects."
66
67
  @data
@@ -120,9 +121,12 @@ module TTL2HTML
120
121
  end
121
122
  def output_html_files
122
123
  template = Template.new("", @config)
123
- shapes = @graph.query([nil,
124
- RDF::URI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"),
125
- RDF::URI("http://www.w3.org/ns/shacl#NodeShape")])
124
+ shapes = []
125
+ @data.each do |s, v|
126
+ if v[RDF.type.to_s] and @data[s][RDF.type.to_s].include?("http://www.w3.org/ns/shacl#NodeShape")
127
+ shapes << s
128
+ end
129
+ end
126
130
  labels = shapes2labels(shapes)
127
131
  versions = extract_versions
128
132
  toplevel = extract_toplevel
@@ -142,53 +146,80 @@ module TTL2HTML
142
146
  template = Template.new("default.html.erb", @config)
143
147
  param = @config.dup
144
148
  param[:uri] = uri
145
- param[:turtle_uri] = uri_mapping_to_path(uri, ".ttl")
149
+ param[:turtle_uri] = uri + ".ttl"
146
150
  param[:data] = v
147
151
  param[:data_inverse] = @data_inverse[uri]
152
+ param[:data_inverse_global] = @data_inverse
148
153
  param[:data_global] = @data
149
154
  param[:title] = template.get_title(v)
150
155
  if param[:breadcrumbs]
151
156
  param[:breadcrumbs_items] = build_breadcrumbs(uri, template)
152
157
  end
153
- file = uri_mapping_to_path(uri, ".html")
158
+ file = uri_mapping_to_path(uri, @config, ".html")
154
159
  if @config[:output_dir]
155
160
  Dir.mkdir @config[:output_dir] if not File.exist? @config[:output_dir]
156
161
  file = File.join(@config[:output_dir], file)
157
162
  end
163
+ if template.find_template_path("_default.html.erb")
164
+ param[:additional_content] = template.to_html_raw("_default.html.erb", param)
165
+ end
158
166
  template.output_to(file, param)
159
167
  end
160
168
  index_html = "index.html"
161
169
  index_html = File.join(@config[:output_dir], "index.html") if @config[:output_dir]
162
170
  if @config.has_key? :top_class
163
- subjects = @graph.query([nil,
164
- RDF::URI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"),
165
- RDF::URI(@config[:top_class])]).subjects
171
+ subjects = []
172
+ @data.each do |s, v|
173
+ if @data[s][RDF.type.to_s] and @data[s][RDF.type.to_s].include?(@config[:top_class])
174
+ subjects << s
175
+ end
176
+ end
166
177
  if subjects.empty?
167
178
  STDERR.puts "WARN: top_class parameter specified as [#{@config[:top_class]}], but there is no instance data."
168
- STDERR.puts " Skip generation of top page."
169
179
  else
170
180
  template = Template.new("index.html.erb", @config)
171
181
  param = @config.dup
182
+ param[:class_label] = template.get_title(@data[@config[:top_class]], nil)
172
183
  param[:data_global] = @data
184
+ param[:data_inverse_global] = @data_inverse
173
185
  param[:versions] = versions
174
186
  param[:toplevel] = toplevel
175
187
  subjects.sort.each do |subject|
188
+ objects = []
189
+ if @config.has_key? :top_additional_property
190
+ @config[:top_additional_property].each do |property|
191
+ if @data[subject][property]
192
+ objects += @data[subject][property]
193
+ end
194
+ end
195
+ end
176
196
  param[:index_data] ||= []
177
- param[:index_data] << subject.to_s
197
+ param[:index_data] << {
198
+ subject.to_s => objects
199
+ }
178
200
  end
201
+ param[:output_file] = index_html
202
+ param[:index_list] = template.to_html_raw("index-list.html.erb", param)
179
203
  template.output_to(index_html, param)
180
204
  end
181
205
  end
182
- if shapes.size > 0 or versions.size > 0 or toplevel.size > 0
206
+ if template.find_template_path("about.html") or shapes.size > 0 or versions.size > 0 or toplevel.size > 0
183
207
  about_html = @config[:about_file] || "about.html"
184
208
  about_html = File.join(@config[:output_dir], about_html) if @config[:output_dir]
185
209
  template = Template.new("about.html.erb", @config)
186
210
  param = @config.dup
211
+ param[:content] = template.to_html_raw("about.html", {}) if template.find_template_path("about.html")
187
212
  param[:data_global] = @data
188
213
  param[:versions] = versions
189
214
  param[:toplevel] = toplevel
190
215
  param[:shapes] = {}
191
- shapes.subjects.each do |subject|
216
+ shapes.each do |subject|
217
+ orders = []
218
+ if param[:shape_orders]
219
+ param[:shape_orders].index(subject)
220
+ orders << ( param[:shape_orders].index(subject) or Float::INFINITY )
221
+ end
222
+ orders << subject
192
223
  label = comment = nil
193
224
  target_class = @data[subject.to_s]["http://www.w3.org/ns/shacl#targetClass"]
194
225
  if target_class
@@ -206,6 +237,8 @@ module TTL2HTML
206
237
  label: label,
207
238
  comment: comment,
208
239
  html: template.expand_shape(@data, subject.to_s, @prefix),
240
+ target_class: target_class,
241
+ order: orders,
209
242
  }
210
243
  end
211
244
  template.output_to(about_html, param)
@@ -224,51 +257,87 @@ module TTL2HTML
224
257
  @config[:breadcrumbs].each do |e|
225
258
  data_target = data
226
259
  data_target = @data_inverse[uri] if e["inverse"]
227
- if data_target and data_target[e["property"]]
228
- data_target[e["property"]].each do |parent|
229
- data_parent = @data[parent]
230
- label = template.get_title(data_parent)
231
- label = data_parent[e["label"]].first if e["label"] and data_parent[e["label"]]
232
- results << {
233
- uri: parent,
234
- label: label,
235
- }
236
- results += build_breadcrumbs(parent, template, depth + 1)
260
+ if data_target
261
+ if e["property"].kind_of? Array
262
+ parent = nil
263
+ data_target_sub = data_target
264
+ e["property"].each do |prop|
265
+ if data_target_sub[prop["property"]]
266
+ data_target_sub[prop["property"]].each do |o|
267
+ parent = o
268
+ data_target_sub = @data[parent]
269
+ end
270
+ end
271
+ end
272
+ if parent
273
+ results << build_breadcrumbs_sub(parent, template)
274
+ results += build_breadcrumbs(parent, template, depth + 1)
275
+ return results
276
+ end
277
+ elsif data_target[e["property"]]
278
+ data_target[e["property"]].each do |parent|
279
+ results << build_breadcrumbs_sub(parent, template, e["label"])
280
+ results += build_breadcrumbs(parent, template, depth + 1)
281
+ return results
282
+ end
237
283
  end
238
- return results
239
284
  end
240
285
  end
241
286
  end
242
287
  results
243
288
  end
289
+ def build_breadcrumbs_sub(parent, template, label_prop = nil)
290
+ data_parent = @data[parent]
291
+ label = template.get_title(data_parent)
292
+ label = data_parent[label_prop].first if label_prop and data_parent[label_prop]
293
+ {
294
+ uri: parent,
295
+ label: label,
296
+ }
297
+ end
244
298
 
245
- def shapes2labels(shapes)
246
- labels = {}
247
- shapes.subjects.each do |shape|
248
- target_class = @data[shape.to_s]["http://www.w3.org/ns/shacl#targetClass"]&.first
299
+ def shapes_parse(shapes)
300
+ shapes.each do |shape|
301
+ target_class = @data[shape]["http://www.w3.org/ns/shacl#targetClass"]&.first
249
302
  if target_class
250
- @data[shape.to_s]["http://www.w3.org/ns/shacl#property"].each do |property|
251
- path = @data[property]["http://www.w3.org/ns/shacl#path"].first
252
- name = @data[property]["http://www.w3.org/ns/shacl#name"]
253
- labels[target_class] ||= {}
254
- labels[target_class][path] = name
303
+ properties = @data[shape.to_s]["http://www.w3.org/ns/shacl#property"]
304
+ if @data[shape.to_s]["http://www.w3.org/ns/shacl#or"]
305
+ properties ||= []
306
+ node_list = @data[shape.to_s]["http://www.w3.org/ns/shacl#or"].first
307
+ while node_list and @data[node_list] do
308
+ sub_shape = @data[node_list]["http://www.w3.org/1999/02/22-rdf-syntax-ns#first"].first
309
+ if @data[sub_shape] and @data[sub_shape]["http://www.w3.org/ns/shacl#property"]
310
+ properties += @data[sub_shape]["http://www.w3.org/ns/shacl#property"]
311
+ end
312
+ node_list = @data[node_list]["http://www.w3.org/1999/02/22-rdf-syntax-ns#rest"].first
313
+ end
314
+ end
315
+ if not properties.empty?
316
+ properties.each do |property|
317
+ path = @data[property]["http://www.w3.org/ns/shacl#path"].first
318
+ yield target_class, property
319
+ end
255
320
  end
256
321
  end
257
322
  end
323
+ end
324
+ def shapes2labels(shapes)
325
+ labels = {}
326
+ shapes_parse(shapes) do |target_class, property|
327
+ path = @data[property]["http://www.w3.org/ns/shacl#path"].first
328
+ name = @data[property]["http://www.w3.org/ns/shacl#name"]
329
+ labels[target_class] ||= {}
330
+ labels[target_class][path] = name
331
+ end
258
332
  labels
259
333
  end
260
334
  def shapes2orders(shapes)
261
335
  orders = {}
262
- shapes.subjects.each do |shape|
263
- target_class = @data[shape.to_s]["http://www.w3.org/ns/shacl#targetClass"]&.first
264
- if target_class
265
- @data[shape.to_s]["http://www.w3.org/ns/shacl#property"].each do |property|
266
- path = @data[property]["http://www.w3.org/ns/shacl#path"].first
267
- order = @data[property]["http://www.w3.org/ns/shacl#order"]
268
- orders[target_class] ||= {}
269
- orders[target_class][path] = order&.first&.to_i
270
- end
271
- end
336
+ shapes_parse(shapes) do |target_class, property|
337
+ path = @data[property]["http://www.w3.org/ns/shacl#path"].first
338
+ order = @data[property]["http://www.w3.org/ns/shacl#order"]
339
+ orders[target_class] ||= {}
340
+ orders[target_class][path] = order&.first&.to_i
272
341
  end
273
342
  orders
274
343
  end
@@ -276,17 +345,25 @@ module TTL2HTML
276
345
  def extract_versions
277
346
  versions = []
278
347
  ["http://purl.org/pav/hasVersion", "http://purl.org/pav/hasCurrentVersion", "http://purl.org/dc/terms/hasVersion"].each do |prop|
279
- objects = @graph.query([nil, RDF::URI(prop), nil]).objects
348
+ objects = []
349
+ @data.each do |s, v|
350
+ if @data[s][prop]
351
+ objects += @data[s][prop]
352
+ end
353
+ end
280
354
  objects.each do |o|
281
355
  uri = o.to_s
282
356
  version = @data[uri]
283
357
  next if not version
358
+ next if not version["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"]
284
359
  next if not version["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"].include? "http://rdfs.org/ns/void#Dataset"
285
360
  description = version["http://purl.org/dc/terms/description"]
361
+ link = nil
286
362
  if not description
287
363
  qrev = version["http://www.w3.org/ns/prov#qualifiedRevision"]&.first
288
- if description = @data[qrev]
364
+ if @data[qrev]
289
365
  description = @data[qrev]["http://www.w3.org/2000/01/rdf-schema#comment"]
366
+ link = @data[qrev]["http://www.w3.org/2000/01/rdf-schema#seeAlso"]&.first
290
367
  end
291
368
  end
292
369
  subset = []
@@ -306,6 +383,7 @@ module TTL2HTML
306
383
  date: date,
307
384
  description: description,
308
385
  subset: subset,
386
+ link: link,
309
387
  }
310
388
  end
311
389
  end
@@ -313,15 +391,24 @@ module TTL2HTML
313
391
  end
314
392
  def extract_toplevel
315
393
  result = {}
316
- toplevel = @graph.query([nil, RDF::URI("http://purl.org/pav/hasCurrentVersion"), nil]).subjects.first
394
+ toplevel = nil
395
+ @data.each do |s, v|
396
+ if @data[s]["http://purl.org/pav/hasCurrentVersion"]
397
+ toplevel = s
398
+ end
399
+ end
317
400
  data = @data[toplevel.to_s]
318
401
  if toplevel
319
402
  license = {}
320
403
  if data["http://purl.org/dc/terms/license"]
321
404
  license_data = @data[data["http://purl.org/dc/terms/license"].first]
322
- license[:url] = license_data["http://www.w3.org/1999/02/22-rdf-syntax-ns#value"]&.first
323
- license[:icon] = license_data["http://xmlns.com/foaf/0.1/thumbnail"]&.first
324
- license[:label] = license_data["http://www.w3.org/2000/01/rdf-schema#label"]
405
+ if license_data
406
+ license[:url] = license_data["http://www.w3.org/1999/02/22-rdf-syntax-ns#value"]&.first
407
+ license[:icon] = license_data["http://xmlns.com/foaf/0.1/thumbnail"]&.first
408
+ license[:label] = license_data["http://www.w3.org/2000/01/rdf-schema#label"]
409
+ elsif data["http://purl.org/dc/terms/license"].first =~ URI::regexp
410
+ license[:url] = license[:label] = data["http://purl.org/dc/terms/license"].first
411
+ end
325
412
  end
326
413
  if data["http://purl.org/dc/terms/publisher"]
327
414
  publisher_data = @data[data["http://purl.org/dc/terms/publisher"].first]
@@ -353,58 +440,38 @@ module TTL2HTML
353
440
 
354
441
  def output_turtle_files
355
442
  each_data(:output_turtle_files) do |uri, v|
356
- file = uri_mapping_to_path(uri, ".ttl")
443
+ file = uri_mapping_to_path(uri, @config, ".ttl")
357
444
  if @config[:output_dir]
358
445
  Dir.mkdir @config[:output_dir] if not File.exist? @config[:output_dir]
359
446
  file = File.join(@config[:output_dir], file)
360
447
  end
361
- str = format_turtle(uri)
448
+ dir = File.dirname(file)
449
+ FileUtils.mkdir_p(dir) if not File.exist?(dir)
450
+ str = format_turtle(uri)
362
451
  str << format_turtle_inverse(uri)
363
452
  open(file, "w") do |io|
364
453
  io.puts str.strip
365
454
  end
366
455
  end
367
456
  end
368
- def uri_mapping_to_path(uri, suffix = ".html")
369
- path = nil
370
- if @config[:uri_mappings]
371
- @config[:uri_mappings].each do |mapping|
372
- local_file = uri.sub(@config[:base_uri], "")
373
- if mapping["regexp"] =~ local_file
374
- path = local_file.sub(mapping["regexp"], mapping["path"])
375
- end
376
- end
377
- end
378
- if path.nil?
379
- if suffix == ".html"
380
- if @data.keys.find{|e| e.start_with?(uri + "/") }
381
- path = uri + "/index"
382
- elsif uri.end_with?("/")
383
- path = uri + "index"
384
- else
385
- path = uri
386
- end
387
- else
388
- path = uri
389
- end
390
- end
391
- path = path.sub(@config[:base_uri], "")
392
- path << suffix
393
- #p [uri, path]
394
- path
457
+
458
+ def output_files
459
+ output_html_files
460
+ output_turtle_files if @config[:output_turtle]
395
461
  end
462
+
396
463
  def cleanup
397
464
  @data.select do |uri, v|
398
465
  uri.start_with? @config[:base_uri]
399
466
  end.sort_by do |uri, v|
400
467
  -(uri.size)
401
468
  end.each do |uri, v|
402
- html_file = uri_mapping_to_path(uri, ".html")
469
+ html_file = uri_mapping_to_path(uri, @config, ".html")
403
470
  html_file = File.join(@config[:output_dir], html_file) if @config[:output_dir]
404
- File.unlink html_file
405
- ttl_file = uri_mapping_to_path(uri, ".ttl")
471
+ File.unlink html_file if File.exist? html_file
472
+ ttl_file = uri_mapping_to_path(uri, @config, ".ttl")
406
473
  ttl_file = File.join(@config[:output_dir], ttl_file) if @config[:output_dir]
407
- File.unlink ttl_file
474
+ File.unlink ttl_file if File.exist? ttl_file
408
475
  dir = uri.sub(@config[:base_uri], "")
409
476
  dir = File.join(@config[:output_dir], dir) if @config[:output_dir]
410
477
  Dir.rmdir dir if File.exist? dir
data/locales/en.yml CHANGED
@@ -1,11 +1,14 @@
1
1
  en:
2
2
  about:
3
3
  title: "About %{title}"
4
- The properties for the textbook resources are as follows:
4
+ shape-heading: "Resources description"
5
5
  shape-note: "The properties for the %{resource} resources are as follows:"
6
+ shape-target: Target class
7
+ shape-namespace: "The namespace URIs used in the table are as follows:"
6
8
  versions: Versions
7
9
  version-release: "Version %{version} released."
8
10
  version-triples: "%{triples} triples"
11
+ version-link: "Please refer to <a href=\"%{link}\">here</a> for the revision details."
9
12
  contact: Contact
10
13
  contact-contribution: "This dataset was developed by %{name}"
11
14
  contact-email: "For dataset inquiries, please contact at <a href=\"%{email}\">%{email}</a>"
@@ -35,3 +38,4 @@ en:
35
38
  blank-node-or-structure: "The structural contents of a blank node are either of the followings:"
36
39
  triples:
37
40
  inverse_refered: "Referred to as '%{property}' from:"
41
+ blank_node: "Blank node"
data/locales/ja.yml CHANGED
@@ -1,10 +1,14 @@
1
1
  ja:
2
2
  about:
3
3
  title: "%{title}について"
4
+ shape-heading: "各リソースの説明"
4
5
  shape-note: "%{resource}リソースが持つプロパティを下表に示します"
6
+ shape-target: 対象クラス
7
+ shape-namespace: "表内で用いている名前空間URIは以下の通りです"
5
8
  versions: 更新履歴
6
9
  version-release: "バージョン%{version}を公開。"
7
10
  version-triples: "%{triples}トリプル"
11
+ version-link: "更新の詳細については<a href=\"%{link}\">こちら</a>をご覧ください。"
8
12
  contact: 連絡先
9
13
  contact-contribution: "本データセットは %{name} が開発したものです"
10
14
  contact-email: "データセットに関する問い合わせは <a href=\"%{email}\">%{email}</a> までお問い合わせください。"
@@ -34,3 +38,4 @@ ja:
34
38
  blank-node-or-structure: ブランクノードの内容は以下のいずれかの内容からなる構造を持ちます。
35
39
  triples:
36
40
  inverse_refered: "'%{property}'としての参照元:"
41
+ blank_node: "空ノード"
@@ -17,11 +17,22 @@
17
17
  </nav>
18
18
  </div>
19
19
  </div>
20
- <%- if param[:shapes] -%>
20
+ <%- if param[:content] -%>
21
21
  <div class="row">
22
22
  <div class="col-md">
23
- <%- param[:shapes].keys.sort.each do |shape| -%>
23
+ <%= param[:content] %>
24
+ </div>
25
+ </div>
26
+ <%- end -%>
27
+ <%- if param[:shapes].size > 0 -%>
28
+ <div class="row">
29
+ <div class="col-md">
30
+ <h2 id="shapes"><%=h t("about.shape-heading") %></h2>
31
+ <%- param[:shapes].keys.sort_by{|k| param[:shapes][k][:order] }.each do |shape| -%>
24
32
  <h3><%=h param[:shapes][shape][:label] %></h3>
33
+ <%- if param[:shapes][shape][:target_class] -%>
34
+ <ul><li><%= t("about.shape-target") %>: <a href="<%=h param[:shapes][shape][:target_class] %>"><%=h param[:shapes][shape][:target_class] %></a></li></ul>
35
+ <%- end -%>
25
36
  <p><%= param[:shapes][shape][:comment] %></p>
26
37
  <p><%=h t("about.shape-note", resource: param[:shapes][shape][:label]) %></p>
27
38
  <%= param[:shapes][shape][:html] -%>
@@ -29,7 +40,7 @@
29
40
  </div>
30
41
  </div>
31
42
  <%- end -%>
32
- <%- if param[:versions] -%>
43
+ <%- if param[:versions].size > 0 -%>
33
44
  <div class="row">
34
45
  <div class="col-md">
35
46
  <h2 id="versions"><%=h t("about.versions") %> <i class="bi bi-info-circle"></i></h2>
@@ -10,11 +10,11 @@
10
10
  <div class="col-md-12">
11
11
  <nav aria-label="breadcrumb">
12
12
  <ol class="breadcrumb">
13
- <li class="breadcrumb-item"><a href="./"><i class="bi bi-house-door-fill"></i> Home</a></li>
13
+ <li class="breadcrumb-item"><a href="<%=h relative_path_uri(param[:base_uri]) %>"><i class="bi bi-house-door-fill"></i> Home</a></li>
14
14
  <%- param[:breadcrumbs_items].reverse.each_with_index do |e, i| -%>
15
15
  <li class="breadcrumb-item<%= ' active' if i == param[:breadcrumbs_items].size-1 %>" aria-current="page">
16
16
  <%- if e[:uri] -%>
17
- <a href="<%=h e[:uri] %>"><%=h e[:label] %></a>
17
+ <a href="<%=h relative_path_uri(e[:uri]) %>"><%=h e[:label] %></a>
18
18
  <%- else -%>
19
19
  <%=h e[:label] %>
20
20
  <%- end -%>
@@ -31,11 +31,14 @@
31
31
  <%= format_triples(param[:data]) %>
32
32
  </div>
33
33
  </div>
34
+ <%- if param[:additional_content] -%>
35
+ <%= param[:additional_content] %>
36
+ <%- end -%>
34
37
  <%- if param[:data_inverse] -%>
35
38
  <div class="row inverse">
36
39
  <div class="col-md-12">
37
40
  <h2><%=h t("default.inverse_data") %></h2>
38
- <%= format_triples(param[:data_inverse], :inverse) %>
41
+ <%= format_triples(param[:data_inverse], inverse: true) %>
39
42
  </div>
40
43
  </div>
41
44
  <%- end -%>
@@ -0,0 +1,20 @@
1
+ <div class="row">
2
+ <div class="col-md-12">
3
+ <h2><%=h t("index.list", resource: param[:class_label]) %></h2>
4
+ <ul>
5
+ <%- param[:index_data].each do |e| -%>
6
+ <%- e.each do |s, o| -%>
7
+ <li><%= format_object(s, param[:data_global]) %>
8
+ <%- if o and o.size > 0 -%>
9
+ <ul>
10
+ <%- o.each do |o2| -%>
11
+ <li><%= format_object(o2.to_s, param[:data_global]) %></li>
12
+ <%- end -%>
13
+ </ul>
14
+ <%- end -%>
15
+ </li>
16
+ <%- end -%>
17
+ <%- end -%>
18
+ </ul>
19
+ </div>
20
+ </div>
@@ -5,19 +5,11 @@
5
5
  <p><%= get_language_literal(param[:toplevel][:description]) %></p>
6
6
  <%- end -%>
7
7
  <p><i class="bi bi-link-45deg"></i> <a href="<%=h param[:base_uri] %>"><%=h param[:base_uri] %></a></p>
8
+ <p><a class="btn btn-info" href="<%=h relative_path(param[:about_file] || "about.html") %>"><%=h t("about.title", title: param[:site_title]) %> &raquo;</a></p>
8
9
  </div>
9
10
  </div>
10
11
  <div class="container">
11
- <div class="row">
12
- <div class="col-md-12">
13
- <h2><%=h t("index.list", resource: param[:class_label]) %></h2>
14
- <ul>
15
- <%- param[:index_data].each do |e| -%>
16
- <li><%= format_object(e, param[:data_global]) %></li>
17
- <%- end -%>
18
- </ul>
19
- </div>
20
- </div>
12
+ <%= param[:index_list] %>
21
13
  <%- if param[:versions].size > 0 -%>
22
14
  <div class="row">
23
15
  <div class="col-md">
@@ -39,4 +31,4 @@
39
31
  </div>
40
32
  </div>
41
33
  <%- end -%>
42
- </div>
34
+ </div>
@@ -1,9 +1,8 @@
1
1
  <!DOCTYPE html>
2
- <html>
2
+ <html lang="<%= param[:locale] || I18n.default_locale %>">
3
3
  <head>
4
4
  <meta charset="utf-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
6
- <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
7
6
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
8
7
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.1/font/bootstrap-icons.css">
9
8
  <%- if param[:css_file] -%>
@@ -15,11 +14,30 @@
15
14
  <title><%=h html_title(param) %></title>
16
15
  <meta name="twitter:card" content="summary">
17
16
  <meta name="twitter:title" content="<%=h html_title(param) %>">
17
+ <meta property="og:title" content="<%=h html_title(param) %>">
18
+ <meta property="og:type" content="website">
19
+ <%- if param[:uri] -%>
20
+ <meta property="og:url" content="<%=h param[:uri] %>">
21
+ <%- end -%>
22
+ <%- if param[:logo] -%>
23
+ <meta property="og:image" content="<%=h URI.parse(param[:base_uri]) + param[:logo] %>">
24
+ <%- end -%>
25
+ <%- if param[:google_analytics] -%>
26
+ <script async src="https://www.googletagmanager.com/gtag/js?id=<%=h param[:google_analytics] %>"></script>
27
+ <script>
28
+ window.dataLayer = window.dataLayer || [];
29
+ function gtag(){dataLayer.push(arguments);}
30
+ gtag('js', new Date());
31
+ gtag('config', '<%=u param[:google_analytics] %>');
32
+ </script>
33
+ <%- end -%>
18
34
  </head>
19
35
  <body>
20
- <nav class="navbar navbar-expand-lg navbar-light">
36
+ <nav class="navbar navbar-expand-lg <%=h param[:navbar_class] || "navbar-light" %>">
21
37
  <%- if param[:logo] -%>
22
- <a class="navbar-brand" href="/"><img src="<%=h relative_path(param[:logo]) %>" height="30"></a>
38
+ <a class="navbar-brand" href="<%=h relative_path_uri(param[:base_uri]) %>">
39
+ <img src="<%=h relative_path(param[:logo]) %>" style="max-height: 54px" alt="<%=h param[:site_title] %>">
40
+ </a>
23
41
  <%- end -%>
24
42
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
25
43
  <span class="navbar-toggler-icon"></span>
@@ -27,19 +45,24 @@
27
45
  <div class="collapse navbar-collapse" id="navbarSupportedContent">
28
46
  <ul class="navbar-nav mr-auto">
29
47
  <li class="nav-item<%= ' active' if @template == "index.html.erb" %>">
30
- <a class="nav-link" href="/">Home</a>
48
+ <a class="nav-link" href="<%=h relative_path_uri(param[:base_uri]) %>">Home</a>
31
49
  </li>
32
50
  <li class="nav-item<%= ' active' if @template == "about.html.erb" %>">
33
- <a class="nav-link" href="/about">About</a>
51
+ <a class="nav-link" href="<%=h relative_path(param[:about_file] || "about.html") %>">About</a>
34
52
  </li>
53
+ <%- if param[:additional_link] -%>
54
+ <%- param[:additional_link].each do |link| -%>
55
+ <li class="nav-item"><a class="nav-link" href="<%=h link["href"] %>"><%=h link["label"] %></a></li>
56
+ <%- end -%>
57
+ <%- end -%>
35
58
  </ul>
36
59
  </div>
37
60
  </nav>
38
61
  <%= param[:content] %>
39
62
  <hr>
40
63
  <footer>
41
- <%- if param[:uri] -%>
42
- <p class="float-right"><a href="<%=h relative_path(param[:turtle_uri]) %>"><img src="https://www.w3.org/RDF/icons/rdf_flyer.24" alt="<%=h t("layout.rdf-data") %>"></a></p>
64
+ <%- if param[:turtle_uri] -%>
65
+ <p class="float-right"><a href="<%=h param[:turtle_uri] %>"><img src="https://www.w3.org/RDF/icons/rdf_flyer.24" alt="<%=h t("layout.rdf-data") %>"></a></p>
43
66
  <%- end -%>
44
67
  <%- if param[:admin_name] -%>
45
68
  <p>
@@ -55,5 +78,8 @@
55
78
  <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
56
79
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
57
80
  <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
81
+ <%- if param[:javascript_file] -%>
82
+ <script src="<%=h relative_path(param[:javascript_file]) %>"></script>
83
+ <%- end -%>
58
84
  </body>
59
85
  </html>
@@ -1,4 +1,4 @@
1
- <table class="table table-condensed">
1
+ <table class="table table-sm">
2
2
  <tr>
3
3
  <th><%=h t('shape-table.header.property-name') %></th>
4
4
  <th><%=h t('shape-table.header.description') %></th>
@@ -56,5 +56,17 @@
56
56
  <%- end -%>
57
57
  <%- end -%>
58
58
  </tbody>
59
- </table>
60
-
59
+ <%- if param[:prefix] and not param[:prefix].empty? -%>
60
+ <tfoot>
61
+ <tr><td colspan="5">
62
+ <%=h t('about.shape-namespace') %>
63
+ <dl class="row small">
64
+ <%- param[:prefix].each do |prefix, url| -%>
65
+ <dt class="col-sm-2"><code><%=h prefix %>:</code></dt>
66
+ <dd class="col-sm-10"><%=h url %></dd>
67
+ <%- end -%>
68
+ </dl>
69
+ <%- end -%>
70
+ </td></tr>
71
+ </tfoot>
72
+ </table>
@@ -0,0 +1,4 @@
1
+ <dl class="row border">
2
+ <dt class="col-sm-3"><%= format_object(param[:blank_subject], param[:data]) %></dt>
3
+ <dd class="col-sm-9"><%= format_triples(param[:blank_triples]) %></dd>
4
+ </dl>
@@ -0,0 +1,20 @@
1
+ <dl class="row">
2
+ <%- param[:data].sort_by{|k, v|
3
+ order = param[:orders][k] if param[:orders] and param[:orders][k]
4
+ order = Float::INFINITY if order.nil?
5
+ [ order, k ]
6
+ }.each do |k, v| -%>
7
+ <dt class="col-sm-3"><%=h t('triples.inverse_refered', property: format_property(k, param[:labels], v.first)) %></dt>
8
+ <%- if v.respond_to? :has_key? -%>
9
+ <% v.each_with_index do |v2, idx| %>
10
+ <dd class="col-sm-9<%= ' offset-sm-3' if idx > 0 %>" lang="<%=h v2[0] %>"><%= format_object v2[1], param[:data], param[:type] %></dd>
11
+ <% end %>
12
+ <%- elsif v.size > 1 -%>
13
+ <%- v.each_with_index do |v2, idx| -%>
14
+ <dd class="col-sm-9<%= ' offset-sm-3' if idx > 0 %>"><%= format_object v2, param[:data], param[:type] %></dd>
15
+ <%- end -%>
16
+ <%- else -%>
17
+ <dd class="col-sm-9"><%= format_object v.first, param[:data], param[:type] %></dd>
18
+ <%- end -%>
19
+ <%- end -%>
20
+ </dl>
@@ -4,21 +4,17 @@
4
4
  order = Float::INFINITY if order.nil?
5
5
  [ order, k ]
6
6
  }.each do |k, v| -%>
7
- <%- if param[:type] == :inverse -%>
8
- <dt class="col-sm-3"><%=h t('triples.inverse_refered', property: format_property(k, param[:labels])) %></dt>
9
- <%- else -%>
10
7
  <dt class="col-sm-3"><%=h format_property(k, param[:labels]) %></dt>
11
- <%- end -%>
12
8
  <%- if v.respond_to? :has_key? -%>
13
- <% v.each_with_index do |v2, idx| %>
14
- <dd class="col-sm-9<%= ' offset-sm-3' if idx > 0 %>" lang="<%=h v2[0] %>"><%= format_object v2[1], param[:data] %></dd>
15
- <% end %>
9
+ <%- v.each_with_index do |v2, idx| -%>
10
+ <dd class="col-sm-9<%= ' offset-sm-3' if idx > 0 %>" lang="<%=h v2[0] %>"><%= format_object v2[1], param[:data], param[:type] %></dd>
11
+ <%- end -%>
16
12
  <%- elsif v.size > 1 -%>
17
13
  <%- v.each_with_index do |v2, idx| -%>
18
- <dd class="col-sm-9<%= ' offset-sm-3' if idx > 0 %>"><%= format_object v2, param[:data] %></dd>
14
+ <dd class="col-sm-9<%= ' offset-sm-3' if idx > 0 %>"><%= format_object v2, param[:data], param[:type] %></dd>
19
15
  <%- end -%>
20
16
  <%- else -%>
21
- <dd class="col-sm-9"><%= format_object v.first, param[:data] %></dd>
17
+ <dd class="col-sm-9"><%= format_object v.first, param[:data], param[:type] %></dd>
22
18
  <%- end -%>
23
19
  <%- end -%>
24
20
  </dl>
@@ -1,6 +1,10 @@
1
1
  <dt><%=h param[:data][:date] %></dt>
2
2
  <dd><%=h t("about.version-release", version: param[:data][:version]) %></dd>
3
- <dd><%=h get_language_literal(param[:data][:description]) %></dd>
3
+ <dd><%=h get_language_literal(param[:data][:description]) %>
4
+ <%- if param[:data][:link] -%>
5
+ <%= t("about.version-link", link: param[:data][:link]) %>
6
+ <%- end -%>
7
+ </dd>
4
8
  <%- if param[:data][:datadump] -%>
5
9
  <dd><ul>
6
10
  <li><a href="<%=h param[:data][:datadump] %>"><%=h File.basename(param[:data][:datadump]) %></a>
@@ -24,5 +28,5 @@
24
28
  </ul>
25
29
  </li>
26
30
  <%- end -%>
27
- </dd>
31
+ </ul></dd>
28
32
  <%- end -%>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ttl2html
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.4
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masao Takaku
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-30 00:00:00.000000000 Z
11
+ date: 2022-08-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -150,15 +150,19 @@ files:
150
150
  - bin/xlsx2shape
151
151
  - lib/ttl2html.rb
152
152
  - lib/ttl2html/template.rb
153
+ - lib/ttl2html/util.rb
153
154
  - lib/ttl2html/version.rb
154
155
  - lib/xlsx2shape.rb
155
156
  - locales/en.yml
156
157
  - locales/ja.yml
157
158
  - templates/about.html.erb
158
159
  - templates/default.html.erb
160
+ - templates/index-list.html.erb
159
161
  - templates/index.html.erb
160
162
  - templates/layout.html.erb
161
163
  - templates/shape-table.html.erb
164
+ - templates/triples-blank.html.erb
165
+ - templates/triples-inverse.html.erb
162
166
  - templates/triples.html.erb
163
167
  - templates/version.html.erb
164
168
  homepage: https://github.com/masao/ttl2html
@@ -180,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
180
184
  - !ruby/object:Gem::Version
181
185
  version: '0'
182
186
  requirements: []
183
- rubygems_version: 3.3.3
187
+ rubygems_version: 3.3.7
184
188
  signing_key:
185
189
  specification_version: 4
186
190
  summary: ttl2html