ttl2html 1.3.5 → 2.0.2

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: 64841e5acabefa8d0ff72ab9a5b342d2cb8c6a5f3ecbcce5d70d9c223ae6f694
4
- data.tar.gz: 4c17bd90212017eccb86e6b96d3d2d1fe87c13841f5a0003a8f19d3e011aa1c0
3
+ metadata.gz: 71b5a2abdcc42e13003a2ceca9c3c29ed0ff866c472a058354a469868a244269
4
+ data.tar.gz: de4d3bd146d80800f7f4358a0f843479e5f8583436d4af550ddef4643af60c06
5
5
  SHA512:
6
- metadata.gz: dd727e999f72c76af779008495bb858eb27bbf05f4e79b8ac9aeee0c61e3b225f8d5710209dcc29538fa7133c0c4da93573e864b2144447840b36ddb22306b36
7
- data.tar.gz: 24fd2e31ebd3df0eb3ee62c62005356f6c66ab7b43697a7e1d82206314d1c038038bc44f145035f7aae87506878f19e458c265a1ebcb2a6fe9b389e70f40ce66
6
+ metadata.gz: 54d9bfb81e8fce12a3b0158e888a67bd6b718f7ab1efa35d09fc18ba8d7c596c226a08017894823d1baf6f637f3080e7211f44c85f4ff5a37546fde3b25b5838
7
+ data.tar.gz: fc40d4fc10a284b152802eef7069d786ea307d4a6713ffff1fd30dee7d46c1605f8b328e5d598f3913b0345d8e20f038cae623497453f2e5e0b6e0adedb4aeb5
@@ -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,41 +109,16 @@ 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")
119
- 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
140
- end
141
- path = path.sub(@param[:base_uri], "") if @param[:base_uri]
142
- path << suffix
143
- path
144
- end
121
+ include TTL2HTML::Util
145
122
  def relative_path(dest)
146
123
  path = nil
147
124
  dest_uri = RDF::IRI.parse(dest)
@@ -151,14 +128,19 @@ module TTL2HTML
151
128
  src = @param[:output_file]
152
129
  src = Pathname.new(src).relative_path_from(Pathname.new(@param[:output_dir])) if @param[:output_dir]
153
130
  path = Pathname(dest).relative_path_from(Pathname(File.dirname src))
154
- path = path.to_s + "/" if File.directory? path
131
+ if @param[:output_dir] and File.directory?(Pathname.new(@param[:output_dir]) + path)
132
+ path = path.to_s + "/"
133
+ elsif File.directory?(path)
134
+ path = path.to_s + "/"
135
+ end
155
136
  end
137
+ #p [ :relative_path, path, dest, src ]
156
138
  path
157
139
  end
158
- def relative_path_uri(dest_uri, base_uri)
140
+ def relative_path_uri(dest_uri, base_uri = @param[:base_uri])
159
141
  if dest_uri.start_with? base_uri
160
142
  dest = dest_uri.sub(base_uri, "")
161
- dest = uri_mapping_to_path(dest, "")
143
+ dest = uri_mapping_to_path(dest, @param, "")
162
144
  relative_path(dest)
163
145
  else
164
146
  dest_uri
@@ -217,14 +199,18 @@ module TTL2HTML
217
199
  object
218
200
  end
219
201
  end
220
- def format_property(property, labels = {})
221
- if labels and labels[property]
202
+ def format_property(property, labels = {}, subject = nil)
203
+ subject = @param[:blank_subject] if not subject and @param[:blank_subject]
204
+ subject_class = @param[:data_global][subject][RDF.type.to_s]&.first if subject
205
+ if subject_class and @param[:labels_with_class][subject_class] and @param[:labels_with_class][subject_class][property]
206
+ @param[:labels_with_class][subject_class][property]
207
+ elsif labels and labels[property]
222
208
  labels[property]
223
209
  else
224
210
  property.split(/[\/\#]/).last.capitalize
225
211
  end
226
212
  end
227
- def format_object(object, data)
213
+ def format_object(object, data, type = {})
228
214
  if object =~ /\Ahttps?:\/\//
229
215
  rel_path = relative_path_uri(object, param[:base_uri])
230
216
  if param[:data_global][object]
@@ -233,12 +219,16 @@ module TTL2HTML
233
219
  "<a href=\"#{rel_path}\">#{object}</a>"
234
220
  end
235
221
  elsif object =~ /\A_:/ and param[:data_global][object]
236
- format_triples(param[:data_global][object])
222
+ if type[:inverse] and param[:data_inverse_global][object]
223
+ format_triples(param[:data_inverse_global][object], inverse: true, blank: true)
224
+ else
225
+ format_triples(param[:data_global][object], blank: true)
226
+ end
237
227
  else
238
228
  object
239
229
  end
240
230
  end
241
- def format_triples(triples, type = :default)
231
+ def format_triples(triples, type = {})
242
232
  param_local = @param.dup.merge(data: triples)
243
233
  param_local[:type] = type
244
234
  if @param[:labels_with_class] and triples["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"]
@@ -265,7 +255,26 @@ module TTL2HTML
265
255
  end
266
256
  end
267
257
  end
268
- to_html_raw("triples.html.erb", param_local)
258
+ if type[:inverse] == true
259
+ if type[:blank] == true
260
+ #p param_local[:data]
261
+ #p param_local[:data_inverse]
262
+ #p param_local[:data_inverse].values.first.first
263
+ param_local[:blank_subject] = param_local[:data].values.first.first
264
+ param_local[:blank_triples] = {
265
+ param_local[:data].keys.first => param_local[:data_global][param_local[:blank_subject]][param_local[:data].keys.first]
266
+ }
267
+ #p param_local[:blank_subject]
268
+ #p param_local[:blank_triples]
269
+ param_local[:type] = {}
270
+ #pp param_local
271
+ to_html_raw("triples-blank.html.erb", param_local)
272
+ else
273
+ to_html_raw("triples-inverse.html.erb", param_local)
274
+ end
275
+ else
276
+ to_html_raw("triples.html.erb", param_local)
277
+ end
269
278
  end
270
279
  def format_version_info(version)
271
280
  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.3"
1
+ TTL2HTML::VERSION = "2.0.2"
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,7 +21,6 @@ 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)
@@ -28,6 +30,11 @@ module TTL2HTML
28
30
  config[k.intern] = v
29
31
  end
30
32
  end
33
+ [ :css_file, :javascript_file ].each do |k|
34
+ if config[k]
35
+ config[k] = [ config[k] ].flatten
36
+ end
37
+ end
31
38
  config
32
39
  end
33
40
 
@@ -39,10 +46,8 @@ module TTL2HTML
39
46
  else
40
47
  io = File.open(file)
41
48
  end
42
- RDF::Turtle::Reader.new(io) do |reader|
43
- @prefix.merge! reader.prefixes
49
+ RDF::Format.for(:turtle).reader.new(io) do |reader|
44
50
  reader.statements.each do |statement|
45
- @graph.insert(statement)
46
51
  s = statement.subject
47
52
  v = statement.predicate
48
53
  o = statement.object
@@ -55,12 +60,13 @@ module TTL2HTML
55
60
  @data[s.to_s][v.to_s] ||= []
56
61
  @data[s.to_s][v.to_s] << o.to_s
57
62
  end
58
- if o.is_a? RDF::URI
63
+ if o.is_a? RDF::URI or o.is_a? RDF::Node
59
64
  @data_inverse[o.to_s] ||= {}
60
65
  @data_inverse[o.to_s][v.to_s] ||= []
61
66
  @data_inverse[o.to_s][v.to_s] << s.to_s
62
67
  end
63
68
  end
69
+ @prefix.merge! reader.prefixes
64
70
  end
65
71
  STDERR.puts "#{count} triples. #{@data.size} subjects."
66
72
  @data
@@ -111,18 +117,23 @@ module TTL2HTML
111
117
  progressbar = ProgressBar.create(title: label,
112
118
  total: @data.size,
113
119
  format: "(%t) %a %e %P% Processed: %c from %C")
114
- @data.each do |uri, v|
120
+ @data.keys.sort_by do|uri|
121
+ [ uri.count("/"), uri.size, uri ]
122
+ end.reverse_each do |uri|
115
123
  progressbar.increment
116
124
  next if not uri.start_with? @config[:base_uri]
117
- yield uri, v
125
+ yield uri, @data[uri]
118
126
  end
119
127
  progressbar.finish
120
128
  end
121
129
  def output_html_files
122
130
  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")])
131
+ shapes = []
132
+ @data.each do |s, v|
133
+ if v[RDF.type.to_s] and @data[s][RDF.type.to_s].include?("http://www.w3.org/ns/shacl#NodeShape")
134
+ shapes << s
135
+ end
136
+ end
126
137
  labels = shapes2labels(shapes)
127
138
  versions = extract_versions
128
139
  toplevel = extract_toplevel
@@ -145,38 +156,57 @@ module TTL2HTML
145
156
  param[:turtle_uri] = uri + ".ttl"
146
157
  param[:data] = v
147
158
  param[:data_inverse] = @data_inverse[uri]
159
+ param[:data_inverse_global] = @data_inverse
148
160
  param[:data_global] = @data
149
161
  param[:title] = template.get_title(v)
150
162
  if param[:breadcrumbs]
151
163
  param[:breadcrumbs_items] = build_breadcrumbs(uri, template)
152
164
  end
153
- file = uri_mapping_to_path(uri, ".html")
165
+ file = uri_mapping_to_path(uri, @config, ".html")
154
166
  if @config[:output_dir]
155
167
  Dir.mkdir @config[:output_dir] if not File.exist? @config[:output_dir]
156
168
  file = File.join(@config[:output_dir], file)
157
169
  end
170
+ if template.find_template_path("_default.html.erb")
171
+ param[:additional_content] = template.to_html_raw("_default.html.erb", param)
172
+ end
158
173
  template.output_to(file, param)
159
174
  end
160
175
  index_html = "index.html"
161
176
  index_html = File.join(@config[:output_dir], "index.html") if @config[:output_dir]
162
177
  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
178
+ subjects = []
179
+ @data.each do |s, v|
180
+ if @data[s][RDF.type.to_s] and @data[s][RDF.type.to_s].include?(@config[:top_class])
181
+ subjects << s
182
+ end
183
+ end
166
184
  if subjects.empty?
167
185
  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
186
  else
170
187
  template = Template.new("index.html.erb", @config)
171
188
  param = @config.dup
172
189
  param[:class_label] = template.get_title(@data[@config[:top_class]], nil)
173
190
  param[:data_global] = @data
191
+ param[:data_inverse_global] = @data_inverse
174
192
  param[:versions] = versions
175
193
  param[:toplevel] = toplevel
176
194
  subjects.sort.each do |subject|
195
+ objects = []
196
+ if @config.has_key? :top_additional_property
197
+ @config[:top_additional_property].each do |property|
198
+ if @data[subject][property]
199
+ objects += @data[subject][property]
200
+ end
201
+ end
202
+ end
177
203
  param[:index_data] ||= []
178
- param[:index_data] << subject.to_s
204
+ param[:index_data] << {
205
+ subject.to_s => objects
206
+ }
179
207
  end
208
+ param[:output_file] = index_html
209
+ param[:index_list] = template.to_html_raw("index-list.html.erb", param)
180
210
  template.output_to(index_html, param)
181
211
  end
182
212
  end
@@ -190,7 +220,13 @@ module TTL2HTML
190
220
  param[:versions] = versions
191
221
  param[:toplevel] = toplevel
192
222
  param[:shapes] = {}
193
- shapes.subjects.each do |subject|
223
+ shapes.each do |subject|
224
+ orders = []
225
+ if param[:shape_orders]
226
+ param[:shape_orders].index(subject)
227
+ orders << ( param[:shape_orders].index(subject) or Float::INFINITY )
228
+ end
229
+ orders << subject
194
230
  label = comment = nil
195
231
  target_class = @data[subject.to_s]["http://www.w3.org/ns/shacl#targetClass"]
196
232
  if target_class
@@ -209,6 +245,7 @@ module TTL2HTML
209
245
  comment: comment,
210
246
  html: template.expand_shape(@data, subject.to_s, @prefix),
211
247
  target_class: target_class,
248
+ order: orders,
212
249
  }
213
250
  end
214
251
  template.output_to(about_html, param)
@@ -227,30 +264,62 @@ module TTL2HTML
227
264
  @config[:breadcrumbs].each do |e|
228
265
  data_target = data
229
266
  data_target = @data_inverse[uri] if e["inverse"]
230
- if data_target and data_target[e["property"]]
231
- data_target[e["property"]].each do |parent|
232
- data_parent = @data[parent]
233
- label = template.get_title(data_parent)
234
- label = data_parent[e["label"]].first if e["label"] and data_parent[e["label"]]
235
- results << {
236
- uri: parent,
237
- label: label,
238
- }
239
- results += build_breadcrumbs(parent, template, depth + 1)
267
+ if data_target
268
+ if e["property"].kind_of? Array
269
+ parent = nil
270
+ data_target_sub = data_target
271
+ e["property"].each do |prop|
272
+ if data_target_sub[prop["property"]]
273
+ data_target_sub[prop["property"]].each do |o|
274
+ parent = o
275
+ data_target_sub = @data[parent]
276
+ end
277
+ end
278
+ end
279
+ if parent
280
+ results << build_breadcrumbs_sub(parent, template)
281
+ results += build_breadcrumbs(parent, template, depth + 1)
282
+ return results
283
+ end
284
+ elsif data_target[e["property"]]
285
+ data_target[e["property"]].each do |parent|
286
+ results << build_breadcrumbs_sub(parent, template, e["label"])
287
+ results += build_breadcrumbs(parent, template, depth + 1)
288
+ return results
289
+ end
240
290
  end
241
- return results
242
291
  end
243
292
  end
244
293
  end
245
294
  results
246
295
  end
296
+ def build_breadcrumbs_sub(parent, template, label_prop = nil)
297
+ data_parent = @data[parent]
298
+ label = template.get_title(data_parent)
299
+ label = data_parent[label_prop].first if label_prop and data_parent[label_prop]
300
+ {
301
+ uri: parent,
302
+ label: label,
303
+ }
304
+ end
247
305
 
248
306
  def shapes_parse(shapes)
249
- shapes.subjects.each do |shape|
250
- target_class = @data[shape.to_s]["http://www.w3.org/ns/shacl#targetClass"]&.first
307
+ shapes.each do |shape|
308
+ target_class = @data[shape]["http://www.w3.org/ns/shacl#targetClass"]&.first
251
309
  if target_class
252
310
  properties = @data[shape.to_s]["http://www.w3.org/ns/shacl#property"]
253
- if properties
311
+ if @data[shape.to_s]["http://www.w3.org/ns/shacl#or"]
312
+ properties ||= []
313
+ node_list = @data[shape.to_s]["http://www.w3.org/ns/shacl#or"].first
314
+ while node_list and @data[node_list] do
315
+ sub_shape = @data[node_list]["http://www.w3.org/1999/02/22-rdf-syntax-ns#first"].first
316
+ if @data[sub_shape] and @data[sub_shape]["http://www.w3.org/ns/shacl#property"]
317
+ properties += @data[sub_shape]["http://www.w3.org/ns/shacl#property"]
318
+ end
319
+ node_list = @data[node_list]["http://www.w3.org/1999/02/22-rdf-syntax-ns#rest"].first
320
+ end
321
+ end
322
+ if not properties.empty?
254
323
  properties.each do |property|
255
324
  path = @data[property]["http://www.w3.org/ns/shacl#path"].first
256
325
  yield target_class, property
@@ -283,11 +352,17 @@ module TTL2HTML
283
352
  def extract_versions
284
353
  versions = []
285
354
  ["http://purl.org/pav/hasVersion", "http://purl.org/pav/hasCurrentVersion", "http://purl.org/dc/terms/hasVersion"].each do |prop|
286
- objects = @graph.query([nil, RDF::URI(prop), nil]).objects
355
+ objects = []
356
+ @data.each do |s, v|
357
+ if @data[s][prop]
358
+ objects += @data[s][prop]
359
+ end
360
+ end
287
361
  objects.each do |o|
288
362
  uri = o.to_s
289
363
  version = @data[uri]
290
364
  next if not version
365
+ next if not version["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"]
291
366
  next if not version["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"].include? "http://rdfs.org/ns/void#Dataset"
292
367
  description = version["http://purl.org/dc/terms/description"]
293
368
  link = nil
@@ -323,15 +398,24 @@ module TTL2HTML
323
398
  end
324
399
  def extract_toplevel
325
400
  result = {}
326
- toplevel = @graph.query([nil, RDF::URI("http://purl.org/pav/hasCurrentVersion"), nil]).subjects.first
401
+ toplevel = nil
402
+ @data.each do |s, v|
403
+ if @data[s]["http://purl.org/pav/hasCurrentVersion"]
404
+ toplevel = s
405
+ end
406
+ end
327
407
  data = @data[toplevel.to_s]
328
408
  if toplevel
329
409
  license = {}
330
410
  if data["http://purl.org/dc/terms/license"]
331
411
  license_data = @data[data["http://purl.org/dc/terms/license"].first]
332
- license[:url] = license_data["http://www.w3.org/1999/02/22-rdf-syntax-ns#value"]&.first
333
- license[:icon] = license_data["http://xmlns.com/foaf/0.1/thumbnail"]&.first
334
- license[:label] = license_data["http://www.w3.org/2000/01/rdf-schema#label"]
412
+ if license_data
413
+ license[:url] = license_data["http://www.w3.org/1999/02/22-rdf-syntax-ns#value"]&.first
414
+ license[:icon] = license_data["http://xmlns.com/foaf/0.1/thumbnail"]&.first
415
+ license[:label] = license_data["http://www.w3.org/2000/01/rdf-schema#label"]
416
+ elsif data["http://purl.org/dc/terms/license"].first =~ URI::regexp
417
+ license[:url] = license[:label] = data["http://purl.org/dc/terms/license"].first
418
+ end
335
419
  end
336
420
  if data["http://purl.org/dc/terms/publisher"]
337
421
  publisher_data = @data[data["http://purl.org/dc/terms/publisher"].first]
@@ -363,7 +447,7 @@ module TTL2HTML
363
447
 
364
448
  def output_turtle_files
365
449
  each_data(:output_turtle_files) do |uri, v|
366
- file = uri_mapping_to_path(uri, ".ttl")
450
+ file = uri_mapping_to_path(uri, @config, ".ttl")
367
451
  if @config[:output_dir]
368
452
  Dir.mkdir @config[:output_dir] if not File.exist? @config[:output_dir]
369
453
  file = File.join(@config[:output_dir], file)
@@ -383,44 +467,16 @@ module TTL2HTML
383
467
  output_turtle_files if @config[:output_turtle]
384
468
  end
385
469
 
386
- def uri_mapping_to_path(uri, suffix = ".html")
387
- path = nil
388
- if @config[:uri_mappings]
389
- @config[:uri_mappings].each do |mapping|
390
- local_file = uri.sub(@config[:base_uri], "")
391
- if mapping["regexp"] =~ local_file
392
- path = local_file.sub(mapping["regexp"], mapping["path"])
393
- end
394
- end
395
- end
396
- if path.nil?
397
- if suffix == ".html"
398
- if @data.keys.find{|e| e.start_with?(uri + "/") }
399
- path = uri + "/index"
400
- elsif uri.end_with?("/")
401
- path = uri + "index"
402
- else
403
- path = uri
404
- end
405
- else
406
- path = uri
407
- end
408
- end
409
- path = path.sub(@config[:base_uri], "")
410
- path << suffix
411
- #p [uri, path]
412
- path
413
- end
414
470
  def cleanup
415
471
  @data.select do |uri, v|
416
472
  uri.start_with? @config[:base_uri]
417
473
  end.sort_by do |uri, v|
418
474
  -(uri.size)
419
475
  end.each do |uri, v|
420
- html_file = uri_mapping_to_path(uri, ".html")
476
+ html_file = uri_mapping_to_path(uri, @config, ".html")
421
477
  html_file = File.join(@config[:output_dir], html_file) if @config[:output_dir]
422
478
  File.unlink html_file if File.exist? html_file
423
- ttl_file = uri_mapping_to_path(uri, ".ttl")
479
+ ttl_file = uri_mapping_to_path(uri, @config, ".ttl")
424
480
  ttl_file = File.join(@config[:output_dir], ttl_file) if @config[:output_dir]
425
481
  File.unlink ttl_file if File.exist? ttl_file
426
482
  dir = uri.sub(@config[:base_uri], "")
data/locales/en.yml CHANGED
@@ -4,6 +4,7 @@ en:
4
4
  shape-heading: "Resources description"
5
5
  shape-note: "The properties for the %{resource} resources are as follows:"
6
6
  shape-target: Target class
7
+ shape-namespace: "The namespace URIs used in the table are as follows:"
7
8
  versions: Versions
8
9
  version-release: "Version %{version} released."
9
10
  version-triples: "%{triples} triples"
@@ -11,6 +12,7 @@ en:
11
12
  contact: Contact
12
13
  contact-contribution: "This dataset was developed by %{name}"
13
14
  contact-email: "For dataset inquiries, please contact at <a href=\"%{email}\">%{email}</a>"
15
+ toc: Table of Contents
14
16
  default:
15
17
  details: Details
16
18
  inverse_data: Referred resources
@@ -37,3 +39,4 @@ en:
37
39
  blank-node-or-structure: "The structural contents of a blank node are either of the followings:"
38
40
  triples:
39
41
  inverse_refered: "Referred to as '%{property}' from:"
42
+ blank_node: "Blank node"
data/locales/ja.yml CHANGED
@@ -4,6 +4,7 @@ ja:
4
4
  shape-heading: "各リソースの説明"
5
5
  shape-note: "%{resource}リソースが持つプロパティを下表に示します"
6
6
  shape-target: 対象クラス
7
+ shape-namespace: "表内で用いている名前空間URIは以下の通りです"
7
8
  versions: 更新履歴
8
9
  version-release: "バージョン%{version}を公開。"
9
10
  version-triples: "%{triples}トリプル"
@@ -11,6 +12,7 @@ ja:
11
12
  contact: 連絡先
12
13
  contact-contribution: "本データセットは %{name} が開発したものです"
13
14
  contact-email: "データセットに関する問い合わせは <a href=\"%{email}\">%{email}</a> までお問い合わせください。"
15
+ toc: 目次
14
16
  default:
15
17
  details: 詳細情報
16
18
  inverse_data: 被参照情報
@@ -37,3 +39,4 @@ ja:
37
39
  blank-node-or-structure: ブランクノードの内容は以下のいずれかの内容からなる構造を持ちます。
38
40
  triples:
39
41
  inverse_refered: "'%{property}'としての参照元:"
42
+ blank_node: "空ノード"
@@ -17,19 +17,21 @@
17
17
  </nav>
18
18
  </div>
19
19
  </div>
20
- <%- if param[:content] -%>
21
20
  <div class="row">
22
- <div class="col-md">
23
- <%= param[:content] %>
21
+ <%- if @template == "about.html.erb" and param[:about_toc] -%>
22
+ <div class="col-md-2 order-12">
23
+ <h2 data-toc-skip><%=h t('about.toc') %></h2>
24
+ <nav id="toc" data-toggle="toc" class="sticky-top"></nav>
24
25
  </div>
25
- </div>
26
- <%- end -%>
27
- <%- if param[:shapes].size > 0 -%>
28
- <div class="row">
26
+ <%- end -%>
29
27
  <div class="col-md">
28
+ <%- if param[:content] -%>
29
+ <%= param[:content] %>
30
+ <%- end -%>
31
+ <%- if param[:shapes].size > 0 -%>
30
32
  <h2 id="shapes"><%=h t("about.shape-heading") %></h2>
31
- <%- param[:shapes].keys.sort.each do |shape| -%>
32
- <h3><%=h param[:shapes][shape][:label] %></h3>
33
+ <%- param[:shapes].keys.sort_by{|k| param[:shapes][k][:order] }.each do |shape| -%>
34
+ <h3 id="<%=h relative_path_uri(shape) %>"><%=h param[:shapes][shape][:label] %></h3>
33
35
  <%- if param[:shapes][shape][:target_class] -%>
34
36
  <ul><li><%= t("about.shape-target") %>: <a href="<%=h param[:shapes][shape][:target_class] %>"><%=h param[:shapes][shape][:target_class] %></a></li></ul>
35
37
  <%- end -%>
@@ -37,24 +39,16 @@
37
39
  <p><%=h t("about.shape-note", resource: param[:shapes][shape][:label]) %></p>
38
40
  <%= param[:shapes][shape][:html] -%>
39
41
  <%- end -%>
40
- </div>
41
- </div>
42
- <%- end -%>
43
- <%- if param[:versions].size > 0 -%>
44
- <div class="row">
45
- <div class="col-md">
42
+ <%- end -%>
43
+ <%- if param[:versions].size > 0 -%>
46
44
  <h2 id="versions"><%=h t("about.versions") %> <i class="bi bi-info-circle"></i></h2>
47
45
  <dl>
48
46
  <%- param[:versions].reverse_each do |version| -%>
49
47
  <%= format_version_info(version) %>
50
48
  <%- end -%>
51
49
  </dl>
52
- </div>
53
- </div>
54
- <%- end -%>
55
- <%- if param[:toplevel] and param[:toplevel][:contact] -%>
56
- <div class="row">
57
- <div class="col-md">
50
+ <%- end -%>
51
+ <%- if param[:toplevel] and param[:toplevel][:contact] -%>
58
52
  <h2 id="contact"><%=h t("about.contact") %></h2>
59
53
  <%- if param[:toplevel][:contact][:name] -%>
60
54
  <p><%=h t("about.contact-contribution", name: get_language_literal(param[:toplevel][:contact][:name])) %></p>
@@ -72,7 +66,7 @@
72
66
  <%- if param[:toplevel][:contact][:email] -%>
73
67
  <p><%= t("about.contact-email", email: param[:toplevel][:contact][:email]) %></p>
74
68
  <%- end -%>
69
+ <%- end -%>
75
70
  </div>
76
71
  </div>
77
- <%- end -%>
78
- </div>
72
+ </div>
@@ -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,13 +1,16 @@
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
6
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
7
7
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.1/font/bootstrap-icons.css">
8
- <%- if param[:css_file] -%>
9
- <link rel="stylesheet" href="<%=h relative_path(param[:css_file]) %>">
8
+ <%- if @template == "about.html.erb" and param[:about_toc] -%>
9
+ <link rel="stylesheet" href="https://cdn.rawgit.com/afeld/bootstrap-toc/v1.0.1/dist/bootstrap-toc.min.css">
10
10
  <%- end -%>
11
+ <%- param[:css_file].each do |file| -%>
12
+ <link rel="stylesheet" href="<%=h relative_path(file) %>">
13
+ <%- end if param[:css_file] -%>
11
14
  <%- if param[:custom_css] -%>
12
15
  <style type="text/css"><%=h param[:custom_css] %></style>
13
16
  <%- end -%>
@@ -32,10 +35,12 @@
32
35
  </script>
33
36
  <%- end -%>
34
37
  </head>
35
- <body>
36
- <nav class="navbar navbar-expand-lg navbar-light">
38
+ <body<%= ' data-spy="scroll" data-target="#toc"' if @template == "about.html.erb" and param[:about_toc] %>>
39
+ <nav class="navbar navbar-expand-lg <%=h param[:navbar_class] || "navbar-light" %>">
37
40
  <%- if param[:logo] -%>
38
- <a class="navbar-brand" href="<%=h relative_path_uri(param[:base_uri], param[:base_uri]) %>"><img src="<%=h relative_path(param[:logo]) %>" height="30"></a>
41
+ <a class="navbar-brand" href="<%=h relative_path_uri(param[:base_uri]) %>">
42
+ <img src="<%=h relative_path(param[:logo]) %>" style="max-height: 54px" alt="<%=h param[:site_title] %>">
43
+ </a>
39
44
  <%- end -%>
40
45
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
41
46
  <span class="navbar-toggler-icon"></span>
@@ -43,7 +48,7 @@
43
48
  <div class="collapse navbar-collapse" id="navbarSupportedContent">
44
49
  <ul class="navbar-nav mr-auto">
45
50
  <li class="nav-item<%= ' active' if @template == "index.html.erb" %>">
46
- <a class="nav-link" href="<%=h relative_path_uri(param[:base_uri], param[:base_uri]) %>">Home</a>
51
+ <a class="nav-link" href="<%=h relative_path_uri(param[:base_uri]) %>">Home</a>
47
52
  </li>
48
53
  <li class="nav-item<%= ' active' if @template == "about.html.erb" %>">
49
54
  <a class="nav-link" href="<%=h relative_path(param[:about_file] || "about.html") %>">About</a>
@@ -76,5 +81,11 @@
76
81
  <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
77
82
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
78
83
  <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
84
+ <%- if @template == "about.html.erb" and param[:about_toc] -%>
85
+ <script src="https://cdn.rawgit.com/afeld/bootstrap-toc/v1.0.1/dist/bootstrap-toc.min.js"></script>
86
+ <%- end -%>
87
+ <%- param[:javascript_file].each do |file| -%>
88
+ <script src="<%=h relative_path(file) %>"></script>
89
+ <%- end if param[:javascript_file] -%>
79
90
  </body>
80
91
  </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>
@@ -1,24 +1,26 @@
1
- <dl class="row">
1
+ <dl class="row<%= if param[:type][:blank] then ' border' end %>">
2
2
  <%- param[:data].sort_by{|k, v|
3
3
  order = param[:orders][k] if param[:orders] and param[:orders][k]
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 %>
16
- <%- elsif v.size > 1 -%>
17
9
  <%- 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>
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.sort_by{|e|
14
+ if e =~ /\A_:/ and param[:data_global][e]
15
+ param[:data_global][e].to_s
16
+ else
17
+ e
18
+ end
19
+ }.each_with_index do |v2, idx| -%>
20
+ <dd class="col-sm-9<%= ' offset-sm-3' if idx > 0 %>"><%= format_object v2, param[:data], param[:type] %></dd>
19
21
  <%- end -%>
20
22
  <%- else -%>
21
- <dd class="col-sm-9"><%= format_object v.first, param[:data] %></dd>
23
+ <dd class="col-sm-9"><%= format_object v.first, param[:data], param[:type] %></dd>
22
24
  <%- end -%>
23
25
  <%- end -%>
24
26
  </dl>
@@ -1,6 +1,6 @@
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]) %>
3
+ <dd><%= get_language_literal(param[:data][:description]) %>
4
4
  <%- if param[:data][:link] -%>
5
5
  <%= t("about.version-link", link: param[:data][:link]) %>
6
6
  <%- end -%>
@@ -28,5 +28,5 @@
28
28
  </ul>
29
29
  </li>
30
30
  <%- end -%>
31
- </dd>
31
+ </ul></dd>
32
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.5
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masao Takaku
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-18 00:00:00.000000000 Z
11
+ date: 2022-08-31 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