ttl2html 1.2.0 → 1.3.3

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: b9d57dc99fea0827d317a9dc3597cae9c69d1ac38dbcd66000327f1b913dea03
4
- data.tar.gz: d30441245cd56e6322fe3ab0b27351a83900b6c6826b3c5a6d611bffa8245d3e
3
+ metadata.gz: 7971e142aa8344f4ef07bea779f430a94a986014768c1876dcb4ab0e56c0c788
4
+ data.tar.gz: aa5cca9ebcc358b4f2697f68a86ce2edf998f83bbe4c67e2c11512cdf2a7e5f6
5
5
  SHA512:
6
- metadata.gz: 6c5068b43cc54072f3958f46b5192c5fe118d5942c0b53d4f2fc35f8e35560a6768a2905d1cd946efc8462faa51b2d2ea4d844f8f73f982e18fb73ea5a812ee5
7
- data.tar.gz: 6dc8f656583fc5d8a96baab454b1ea47e446e5694c55f457b3e236e91945595d8b2838d7a7b628d918d7a9c85bb138e081e8919453edce96228572a93dd617eb
6
+ metadata.gz: 7f1d25cb74cdbbf69b6b7826edcdea833bc9286f9035a03a85c4f925553364da6c7a1f2713da767a75076a4c8ebc3ac064e639e04ed0c5625607f96cc2a52254
7
+ data.tar.gz: 04435256e3234d30eb7942e64a627cb6bf3e32dbe8e440f2f69711a62da4c14fc5d222d9cddc56bc11eebcd3708c8e27ea1ca0bd31e570b8be3654e8adac1eab
@@ -4,12 +4,14 @@ require "fileutils"
4
4
  require "pathname"
5
5
  require "erb"
6
6
  require "i18n"
7
+ require "action_view"
7
8
 
8
9
  module TTL2HTML
9
10
  class Template
10
11
  attr_reader :param
11
12
  include ERB::Util
12
13
  include I18n::Base
14
+ include ActionView::Helpers::NumberHelper
13
15
  def initialize(template, param = {})
14
16
  @template = template
15
17
  @param = param.dup
@@ -156,16 +158,33 @@ module TTL2HTML
156
158
  dest_uri
157
159
  end
158
160
  end
161
+ def html_title(param)
162
+ titles = []
163
+ if @template.start_with? "about.html"
164
+ titles << t("about.title", title: param[:site_title])
165
+ else
166
+ titles << param[:title]
167
+ titles << param[:site_title]
168
+ end
169
+ titles.compact.join(" - ")
170
+ end
171
+ def shorten_title(title, length = 140)
172
+ if title.length > length
173
+ title[0..length] + "..."
174
+ else
175
+ title
176
+ end
177
+ end
159
178
  def get_title(data, default_title = "no title")
160
179
  if @param[:title_property_perclass] and data["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"]
161
180
  @param[:title_property_perclass].each do |klass, property|
162
181
  if data["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"].include?(klass) and data[property]
163
- return get_language_literal(data[property])
182
+ return shorten_title(get_language_literal(data[property]))
164
183
  end
165
184
  end
166
185
  end
167
186
  if @param[:title_property] and data[@param[:title_property]]
168
- return get_language_literal(data[@param[:title_property]])
187
+ return shorten_title(get_language_literal(data[@param[:title_property]]))
169
188
  end
170
189
  %w(
171
190
  http://www.w3.org/2000/01/rdf-schema#label
@@ -174,7 +193,7 @@ module TTL2HTML
174
193
  http://schema.org/name
175
194
  http://www.w3.org/2004/02/skos/core#prefLabel
176
195
  ).each do |property|
177
- return get_language_literal(data[property]) if data[property]
196
+ return shorten_title(get_language_literal(data[property])) if data[property]
178
197
  end
179
198
  default_title
180
199
  end
@@ -212,8 +231,9 @@ module TTL2HTML
212
231
  object
213
232
  end
214
233
  end
215
- def format_triples(triples)
234
+ def format_triples(triples, type = :default)
216
235
  param_local = @param.dup.merge(data: triples)
236
+ param_local[:type] = type
217
237
  if @param[:labels_with_class] and triples["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"]
218
238
  @param[:labels_with_class].reverse_each do |k, v|
219
239
  triples["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"].each do |entity_class|
@@ -226,7 +246,23 @@ module TTL2HTML
226
246
  end
227
247
  end
228
248
  end
249
+ if @param[:orders_with_class] and triples["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"]
250
+ @param[:orders_with_class].reverse_each do |k, v|
251
+ triples["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"].each do |entity_class|
252
+ if entity_class == k
253
+ v.each do |property, order|
254
+ param_local[:orders] ||= {}
255
+ param_local[:orders][property] = order || Float::INFINITY
256
+ end
257
+ end
258
+ end
259
+ end
260
+ end
229
261
  to_html_raw("triples.html.erb", param_local)
230
262
  end
263
+ def format_version_info(version)
264
+ param_local = @param.dup.merge(data: version)
265
+ to_html_raw("version.html.erb", param_local)
266
+ end
231
267
  end
232
268
  end
@@ -1 +1 @@
1
- TTL2HTML::VERSION = "1.2.0"
1
+ TTL2HTML::VERSION = "1.3.3"
data/lib/ttl2html.rb CHANGED
@@ -105,11 +105,16 @@ module TTL2HTML
105
105
  result
106
106
  end
107
107
 
108
- def each_data
108
+ def each_data(label = :each_data)
109
+ progressbar = ProgressBar.create(title: label,
110
+ total: @data.size,
111
+ format: "(%t) %a %e %P% Processed: %c from %C")
109
112
  @data.each do |uri, v|
113
+ progressbar.increment
110
114
  next if not uri.start_with? @config[:base_uri]
111
115
  yield uri, v
112
116
  end
117
+ progressbar.finish
113
118
  end
114
119
  def output_html_files
115
120
  template = Template.new("", @config)
@@ -117,6 +122,8 @@ module TTL2HTML
117
122
  RDF::URI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"),
118
123
  RDF::URI("http://www.w3.org/ns/shacl#NodeShape")])
119
124
  labels = shapes2labels(shapes)
125
+ versions = extract_versions
126
+ toplevel = extract_toplevel
120
127
  @config[:labels_with_class] ||= {}
121
128
  labels.each do |klass, props|
122
129
  props.each do |property, label|
@@ -128,18 +135,19 @@ module TTL2HTML
128
135
  end
129
136
  end
130
137
  end
131
- progressbar = ProgressBar.create(title: :output_html_files,
132
- total: @data.size,
133
- format: "(%t) %a %e %P% Processed: %c from %C")
134
- each_data do |uri, v|
135
- progressbar.increment
138
+ @config[:orders_with_class] = shapes2orders(shapes)
139
+ each_data(:output_html_files) do |uri, v|
136
140
  template = Template.new("default.html.erb", @config)
137
141
  param = @config.dup
138
142
  param[:uri] = uri
143
+ param[:turtle_uri] = uri_mapping_to_path(uri, ".ttl")
139
144
  param[:data] = v
140
145
  param[:data_inverse] = @data_inverse[uri]
141
146
  param[:data_global] = @data
142
147
  param[:title] = template.get_title(v)
148
+ if param[:breadcrumbs]
149
+ param[:breadcrumbs_items] = build_breadcrumbs(uri, template)
150
+ end
143
151
  file = uri_mapping_to_path(uri, ".html")
144
152
  if @config[:output_dir]
145
153
  Dir.mkdir @config[:output_dir] if not File.exist? @config[:output_dir]
@@ -147,7 +155,6 @@ module TTL2HTML
147
155
  end
148
156
  template.output_to(file, param)
149
157
  end
150
- progressbar.finish
151
158
  index_html = "index.html"
152
159
  index_html = File.join(@config[:output_dir], "index.html") if @config[:output_dir]
153
160
  if @config.has_key? :top_class
@@ -161,6 +168,8 @@ module TTL2HTML
161
168
  template = Template.new("index.html.erb", @config)
162
169
  param = @config.dup
163
170
  param[:data_global] = @data
171
+ param[:versions] = versions
172
+ param[:toplevel] = toplevel
164
173
  subjects.sort.each do |subject|
165
174
  param[:index_data] ||= []
166
175
  param[:index_data] << subject.to_s
@@ -168,24 +177,32 @@ module TTL2HTML
168
177
  template.output_to(index_html, param)
169
178
  end
170
179
  end
171
- if shapes.size > 0
180
+ if shapes.size > 0 or versions.size > 0 or toplevel.size > 0
172
181
  about_html = @config[:about_file] || "about.html"
173
182
  about_html = File.join(@config[:output_dir], about_html) if @config[:output_dir]
174
183
  template = Template.new("about.html.erb", @config)
175
184
  param = @config.dup
176
185
  param[:data_global] = @data
177
- param[:content] = {}
186
+ param[:versions] = versions
187
+ param[:toplevel] = toplevel
188
+ param[:shapes] = {}
178
189
  shapes.subjects.each do |subject|
179
- label = nil
190
+ label = comment = nil
180
191
  target_class = @data[subject.to_s]["http://www.w3.org/ns/shacl#targetClass"]
181
192
  if target_class
182
- label = template.get_title(@data[target_class.first], nil) if @data[target_class.first]
183
- label = template.format_property(target_class.first) if label.nil?
193
+ target_class = target_class.first
194
+ if @data[target_class]
195
+ label = template.get_title(@data[target_class], nil)
196
+ comment = template.get_language_literal(@data[target_class]["http://www.w3.org/2000/01/rdf-schema#comment"]) if @data[target_class]["http://www.w3.org/2000/01/rdf-schema#comment"]
197
+ else
198
+ label = template.format_property(target_class)
199
+ end
184
200
  else
185
201
  label = template.get_title(@data[subject.to_s])
186
202
  end
187
- param[:content][subject] = {
203
+ param[:shapes][subject] = {
188
204
  label: label,
205
+ comment: comment,
189
206
  html: template.expand_shape(@data, subject.to_s, @prefix),
190
207
  }
191
208
  end
@@ -193,6 +210,36 @@ module TTL2HTML
193
210
  end
194
211
  end
195
212
 
213
+ def build_breadcrumbs(uri, template, depth = 0)
214
+ results = []
215
+ data = @data[uri]
216
+ if @config[:breadcrumbs]
217
+ if depth == 0
218
+ first_label = template.get_title(data)
219
+ first_label = data[@config[:breadcrumbs].first["label"]].first if @config[:breadcrumbs].first["label"] and data[@config[:breadcrumbs].first["label"]]
220
+ results << { label: first_label }
221
+ end
222
+ @config[:breadcrumbs].each do |e|
223
+ data_target = data
224
+ data_target = @data_inverse[uri] if e["inverse"]
225
+ if data_target and data_target[e["property"]]
226
+ data_target[e["property"]].each do |parent|
227
+ data_parent = @data[parent]
228
+ label = template.get_title(data_parent)
229
+ label = data_parent[e["label"]].first if e["label"] and data_parent[e["label"]]
230
+ results << {
231
+ uri: parent,
232
+ label: label,
233
+ }
234
+ results += build_breadcrumbs(parent, template, depth + 1)
235
+ end
236
+ return results
237
+ end
238
+ end
239
+ end
240
+ results
241
+ end
242
+
196
243
  def shapes2labels(shapes)
197
244
  labels = {}
198
245
  shapes.subjects.each do |shape|
@@ -208,13 +255,102 @@ module TTL2HTML
208
255
  end
209
256
  labels
210
257
  end
258
+ def shapes2orders(shapes)
259
+ orders = {}
260
+ shapes.subjects.each do |shape|
261
+ target_class = @data[shape.to_s]["http://www.w3.org/ns/shacl#targetClass"]&.first
262
+ if target_class
263
+ @data[shape.to_s]["http://www.w3.org/ns/shacl#property"].each do |property|
264
+ path = @data[property]["http://www.w3.org/ns/shacl#path"].first
265
+ order = @data[property]["http://www.w3.org/ns/shacl#order"]
266
+ orders[target_class] ||= {}
267
+ orders[target_class][path] = order&.first&.to_i
268
+ end
269
+ end
270
+ end
271
+ orders
272
+ end
273
+
274
+ def extract_versions
275
+ versions = []
276
+ ["http://purl.org/pav/hasVersion", "http://purl.org/pav/hasCurrentVersion", "http://purl.org/dc/terms/hasVersion"].each do |prop|
277
+ objects = @graph.query([nil, RDF::URI(prop), nil]).objects
278
+ objects.each do |o|
279
+ uri = o.to_s
280
+ version = @data[uri]
281
+ next if not version
282
+ next if not version["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"].include? "http://rdfs.org/ns/void#Dataset"
283
+ description = version["http://purl.org/dc/terms/description"]
284
+ if not description
285
+ qrev = version["http://www.w3.org/ns/prov#qualifiedRevision"]&.first
286
+ if description = @data[qrev]
287
+ description = @data[qrev]["http://www.w3.org/2000/01/rdf-schema#comment"]
288
+ end
289
+ end
290
+ subset = []
291
+ if version["http://rdfs.org/ns/void#subset"]
292
+ version["http://rdfs.org/ns/void#subset"].each do |s|
293
+ subset << @data[s]["http://rdfs.org/ns/void#dataDump"].first
294
+ end
295
+ end
296
+ date = version["http://purl.org/pav/createdOn"]&.first
297
+ date = version["http://purl.org/dc/terms/issued"]&.first if date.nil?
298
+ versions << {
299
+ uri: uri,
300
+ version: version["http://purl.org/pav/version"]&.first,
301
+ triples: version["http://rdfs.org/ns/void#triples"]&.first,
302
+ datadump: version["http://rdfs.org/ns/void#dataDump"]&.first,
303
+ bytesize: version["http://www.w3.org/ns/dcat#byteSize"]&.first,
304
+ date: date,
305
+ description: description,
306
+ subset: subset,
307
+ }
308
+ end
309
+ end
310
+ versions.sort_by{|v| [ v[:date], v[:uri] ] }
311
+ end
312
+ def extract_toplevel
313
+ result = {}
314
+ toplevel = @graph.query([nil, RDF::URI("http://purl.org/pav/hasCurrentVersion"), nil]).subjects.first
315
+ data = @data[toplevel.to_s]
316
+ if toplevel
317
+ license = {}
318
+ if data["http://purl.org/dc/terms/license"]
319
+ license_data = @data[data["http://purl.org/dc/terms/license"].first]
320
+ license[:url] = license_data["http://www.w3.org/1999/02/22-rdf-syntax-ns#value"]&.first
321
+ license[:icon] = license_data["http://xmlns.com/foaf/0.1/thumbnail"]&.first
322
+ license[:label] = license_data["http://www.w3.org/2000/01/rdf-schema#label"]
323
+ end
324
+ if data["http://purl.org/dc/terms/publisher"]
325
+ publisher_data = @data[data["http://purl.org/dc/terms/publisher"].first]
326
+ email = publisher_data["http://xmlns.com/foaf/0.1/mbox"]&.first
327
+ contact = { email: email }
328
+ name = publisher_data["http://xmlns.com/foaf/0.1/name"]
329
+ contact[:name] = name if name
330
+ members = []
331
+ if publisher_data["http://xmlns.com/foaf/0.1/member"]
332
+ publisher_data["http://xmlns.com/foaf/0.1/member"].each do |member|
333
+ member_data = @data[member]
334
+ members << {
335
+ name: member_data["http://xmlns.com/foaf/0.1/name"],
336
+ org: member_data["http://www.w3.org/2006/vcard/ns#organization-name"]
337
+ }
338
+ end
339
+ contact[:members] = members
340
+ end
341
+ end
342
+ result = {
343
+ uri: toplevel.to_s,
344
+ description: data["http://purl.org/dc/terms/description"],
345
+ license: license,
346
+ contact: contact,
347
+ }
348
+ end
349
+ result
350
+ end
211
351
 
212
352
  def output_turtle_files
213
- progressbar = ProgressBar.create(title: :output_turtle_files,
214
- total: @data.size,
215
- format: "(%t) %a %e %P% Processed: %c from %C")
216
- each_data do |uri, v|
217
- progressbar.increment
353
+ each_data(:output_turtle_files) do |uri, v|
218
354
  file = uri_mapping_to_path(uri, ".ttl")
219
355
  if @config[:output_dir]
220
356
  Dir.mkdir @config[:output_dir] if not File.exist? @config[:output_dir]
@@ -226,7 +362,6 @@ module TTL2HTML
226
362
  io.puts str.strip
227
363
  end
228
364
  end
229
- progressbar.finish
230
365
  end
231
366
  def uri_mapping_to_path(uri, suffix = ".html")
232
367
  path = nil
@@ -292,4 +427,4 @@ module TTL2HTML
292
427
  file
293
428
  end
294
429
  end
295
- end
430
+ end
data/locales/en.yml CHANGED
@@ -3,11 +3,20 @@ en:
3
3
  title: "About %{title}"
4
4
  The properties for the textbook resources are as follows:
5
5
  shape-note: "The properties for the %{resource} resources are as follows:"
6
+ versions: Versions
7
+ version-release: "Version %{version} released."
8
+ version-triples: "%{triples} triples"
9
+ contact: Contact
10
+ contact-contribution: "This dataset was developed by %{name}"
11
+ contact-email: "For dataset inquiries, please contact at <a href=\"%{email}\">%{email}</a>"
6
12
  default:
7
13
  details: Details
8
14
  inverse_data: Referred resources
9
15
  index:
10
16
  list: "List of %{resource}"
17
+ latest-news: "Latest news"
18
+ past-versions: "Past versions"
19
+ license-text: "This dataset is freely usable as <a href=\"%{url}\">%{label}</a>"
11
20
  layout:
12
21
  rdf-data: RDF data
13
22
  shape-table:
@@ -23,4 +32,6 @@ en:
23
32
  optional: "Optional"
24
33
  non-repeatable: "Non repeatable"
25
34
  blank-node-structure: "The structural contents of a blank node are as follows:"
26
- blank-node-or-structure: "The structural contents of a blank node are either of the followings:"
35
+ blank-node-or-structure: "The structural contents of a blank node are either of the followings:"
36
+ triples:
37
+ inverse_refered: "Referred to as '%{property}' from:"
data/locales/ja.yml CHANGED
@@ -2,11 +2,20 @@ ja:
2
2
  about:
3
3
  title: "%{title}について"
4
4
  shape-note: "%{resource}リソースが持つプロパティを下表に示します"
5
+ versions: 更新履歴
6
+ version-release: "バージョン%{version}を公開。"
7
+ version-triples: "%{triples}トリプル"
8
+ contact: 連絡先
9
+ contact-contribution: "本データセットは %{name} が開発したものです"
10
+ contact-email: "データセットに関する問い合わせは <a href=\"%{email}\">%{email}</a> までお問い合わせください。"
5
11
  default:
6
12
  details: 詳細情報
7
13
  inverse_data: 被参照情報
8
14
  index:
9
15
  list: "%{resource} 一覧"
16
+ latest-news: 最新のお知らせ
17
+ past-versions: 過去の更新履歴
18
+ license-text: "このデータセットは<a href=\"%{url}\">%{label}</a>として自由に利用できます。"
10
19
  layout:
11
20
  rdf-data: RDFデータ
12
21
  shape-table:
@@ -22,4 +31,6 @@ ja:
22
31
  optional: 省略可能
23
32
  non-repeatable: 繰り返し無し
24
33
  blank-node-structure: ブランクノードの内容は以下の内容からなる構造を持ちます。
25
- blank-node-or-structure: ブランクノードの内容は以下のいずれかの内容からなる構造を持ちます。
34
+ blank-node-or-structure: ブランクノードの内容は以下のいずれかの内容からなる構造を持ちます。
35
+ triples:
36
+ inverse_refered: "'%{property}'としての参照元:"
@@ -1,25 +1,67 @@
1
1
  <div class="jumbotron">
2
2
  <div class="container">
3
3
  <h1><%=h t("about.title", title: param[:site_title]) %></h1>
4
+ <%- if param[:toplevel] and param[:toplevel][:description] -%>
5
+ <p><%= get_language_literal(param[:toplevel][:description]) %></p>
6
+ <%- end -%>
4
7
  </div>
5
8
  </div>
6
9
  <div class="container">
7
10
  <div class="row">
8
11
  <div class="col-md-12">
9
- <ol class="breadcrumb">
10
- <li><a href="./"><span class="glyphicon glyphicon-home" aria-hidden="true"></span> Home</a></li>
11
- <li class="active"><%=h t("about.title", title: param[:site_title]) %></li>
12
- </ol>
12
+ <nav aria-label="breadcrumb">
13
+ <ol class="breadcrumb">
14
+ <li class="breadcrumb-item"><a href="./"><i class="bi bi-house-door-fill"></i> Home</a></li>
15
+ <li class="breadcrumb-item active" aria-current="page"><%=h t("about.title", title: param[:site_title]) %></li>
16
+ </ol>
17
+ </nav>
13
18
  </div>
14
19
  </div>
15
-
20
+ <%- if param[:shapes] -%>
16
21
  <div class="row">
17
- <div class="col-md-10">
18
- <%- param[:content].keys.sort.each do |shape| -%>
19
- <h3><%=h param[:content][shape][:label] %></h3>
20
- <p><%= param[:content][shape][:comment] %></p>
21
- <p><%=h t("about.shape-note", resource: param[:content][shape][:label]) %></p>
22
- <%= param[:content][shape][:html] -%>
22
+ <div class="col-md">
23
+ <%- param[:shapes].keys.sort.each do |shape| -%>
24
+ <h3><%=h param[:shapes][shape][:label] %></h3>
25
+ <p><%= param[:shapes][shape][:comment] %></p>
26
+ <p><%=h t("about.shape-note", resource: param[:shapes][shape][:label]) %></p>
27
+ <%= param[:shapes][shape][:html] -%>
23
28
  <%- end -%>
24
29
  </div>
25
30
  </div>
31
+ <%- end -%>
32
+ <%- if param[:versions] -%>
33
+ <div class="row">
34
+ <div class="col-md">
35
+ <h2 id="versions"><%=h t("about.versions") %> <i class="bi bi-info-circle"></i></h2>
36
+ <dl>
37
+ <%- param[:versions].reverse_each do |version| -%>
38
+ <%= format_version_info(version) %>
39
+ <%- end -%>
40
+ </dl>
41
+ </div>
42
+ </div>
43
+ <%- end -%>
44
+ <%- if param[:toplevel] and param[:toplevel][:contact] -%>
45
+ <div class="row">
46
+ <div class="col-md">
47
+ <h2 id="contact"><%=h t("about.contact") %></h2>
48
+ <%- if param[:toplevel][:contact][:name] -%>
49
+ <p><%=h t("about.contact-contribution", name: get_language_literal(param[:toplevel][:contact][:name])) %></p>
50
+ <%- end -%>
51
+ <%- if param[:toplevel][:contact][:members] -%>
52
+ <ul>
53
+ <%- param[:toplevel][:contact][:members].each do |member| -%>
54
+ <li><%=h get_language_literal(member[:name]) %>
55
+ <%- if member[:org] -%>
56
+ (<%=h get_language_literal(member[:org]) %>)
57
+ <%- end -%>
58
+ <%- end -%>
59
+ </ul>
60
+ <%- end -%>
61
+ <%- if param[:toplevel][:contact][:email] -%>
62
+ <p><%= t("about.contact-email", email: param[:toplevel][:contact][:email]) %></p>
63
+ <%- end -%>
64
+ </div>
65
+ </div>
66
+ <%- end -%>
67
+ </div>
@@ -1,22 +1,42 @@
1
1
  <div class="jumbotron">
2
2
  <div class="container">
3
3
  <h1><%=h param[:title] %></h1>
4
- <p><small><span class="glyphicon glyphicon-link"></span> <a href="<%=h param[:uri] %>"><%=h param[:uri] %></a></small></p>
4
+ <p><i class="bi bi-link-45deg"></i> <a href="<%=h param[:uri] %>"><%=h param[:uri] %></a></p>
5
5
  </div>
6
6
  </div>
7
7
  <div class="container">
8
+ <%- if param[:breadcrumbs] -%>
9
+ <div class="row">
10
+ <div class="col-md-12">
11
+ <nav aria-label="breadcrumb">
12
+ <ol class="breadcrumb">
13
+ <li class="breadcrumb-item"><a href="./"><i class="bi bi-house-door-fill"></i> Home</a></li>
14
+ <%- param[:breadcrumbs_items].reverse.each_with_index do |e, i| -%>
15
+ <li class="breadcrumb-item<%= ' active' if i == param[:breadcrumbs_items].size-1 %>" aria-current="page">
16
+ <%- if e[:uri] -%>
17
+ <a href="<%=h e[:uri] %>"><%=h e[:label] %></a>
18
+ <%- else -%>
19
+ <%=h e[:label] %>
20
+ <%- end -%>
21
+ </li>
22
+ <%- end -%>
23
+ </ol>
24
+ </nav>
25
+ </div>
26
+ </div>
27
+ <%- end -%>
8
28
  <div class="row">
9
29
  <div class="col-md-12">
10
30
  <h2><%=h t("default.details") %></h2>
11
31
  <%= format_triples(param[:data]) %>
12
32
  </div>
13
33
  </div>
14
- <% if param[:data_inverse] %>
34
+ <%- if param[:data_inverse] -%>
15
35
  <div class="row inverse">
16
36
  <div class="col-md-12">
17
37
  <h2><%=h t("default.inverse_data") %></h2>
18
- <%= format_triples(param[:data_inverse]) %>
38
+ <%= format_triples(param[:data_inverse], :inverse) %>
19
39
  </div>
20
40
  </div>
21
- <% end %>
22
- </div>
41
+ <%- end -%>
42
+ </div>
@@ -1,7 +1,10 @@
1
1
  <div class="jumbotron">
2
2
  <div class="container">
3
3
  <h1><%=h param[:site_title] %></h1>
4
- <p><small><span class="glyphicon glyphicon-link"></span> <a href="<%=h param[:base_uri] %>"><%=h param[:base_uri] %></a></small></p>
4
+ <%- if param[:toplevel] and param[:toplevel][:description] -%>
5
+ <p><%= get_language_literal(param[:toplevel][:description]) %></p>
6
+ <%- end -%>
7
+ <p><i class="bi bi-link-45deg"></i> <a href="<%=h param[:base_uri] %>"><%=h param[:base_uri] %></a></p>
5
8
  </div>
6
9
  </div>
7
10
  <div class="container">
@@ -9,10 +12,31 @@
9
12
  <div class="col-md-12">
10
13
  <h2><%=h t("index.list", resource: param[:class_label]) %></h2>
11
14
  <ul>
12
- <% param[:index_data].each do |e| %>
15
+ <%- param[:index_data].each do |e| -%>
13
16
  <li><%= format_object(e, param[:data_global]) %></li>
14
- <% end %>
17
+ <%- end -%>
15
18
  </ul>
16
19
  </div>
17
20
  </div>
18
- </div>
21
+ <%- if param[:versions].size > 0 -%>
22
+ <div class="row">
23
+ <div class="col-md">
24
+ <h2 id="versions"><%=h t("index.latest-news") %> <i class="bi bi-info-circle"></i></h2>
25
+ <dl>
26
+ <%= format_version_info(param[:versions].last) %>
27
+ </dl>
28
+ <%- if param[:versions].size > 1 -%>
29
+ <p><a href="about#versions">&raquo; <%=h t("index.past-versions") %></a></p>
30
+ <%- end -%>
31
+ <%- if param[:toplevel] and param[:toplevel][:license] -%>
32
+ <p>
33
+ <%- if param[:toplevel][:license][:icon] -%>
34
+ <a href="<%=h param[:toplevel][:license][:url] %>"><img src="<%=h param[:toplevel][:license][:icon] %>"></a>
35
+ <%- end -%>
36
+ <%= t("index.license-text", label: get_language_literal(param[:toplevel][:license][:label]), url: param[:toplevel][:license][:url]) %>
37
+ </p>
38
+ <%- end -%>
39
+ </div>
40
+ </div>
41
+ <%- end -%>
42
+ </div>
@@ -4,17 +4,34 @@
4
4
  <meta charset="utf-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
6
6
  <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
7
- <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
8
- <title><% if param[:title] %><%=h param[:title] %><% end %><% if param[:site_title] %> - <%=h param[:site_title] %><% end %></title>
7
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
8
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.1/font/bootstrap-icons.css">
9
+ <%- if param[:css_file] -%>
10
+ <link rel="stylesheet" href="<%=h relative_path(param[:css_file]) %>">
11
+ <%- end -%>
12
+ <%- if param[:custom_css] -%>
13
+ <style type="text/css"><%=h param[:custom_css] %></style>
14
+ <%- end -%>
15
+ <title><%=h html_title(param) %></title>
9
16
  <meta name="twitter:card" content="summary">
10
- <meta name="twitter:title" content="<% if param[:title] %><%=h param[:title] %><% end %><% if param[:site_title] %> - <%=h param[:site_title] %><% end %>">
17
+ <meta name="twitter:title" content="<%=h html_title(param) %>">
11
18
  </head>
12
19
  <body>
13
- <nav class="navbar navbar-inverse">
14
- <div class="container">
15
- <ul class="nav navbar-nav navbar-right">
16
- <li<%= ' class="active"' if param[:active] == :home %>><a class="navbar-brand" href="/">Home</a></li>
17
- <li<%= ' class="active"' if param[:active] == :about %>><a href="/about">About</a></li>
20
+ <nav class="navbar navbar-expand-lg navbar-light">
21
+ <%- if param[:logo] -%>
22
+ <a class="navbar-brand" href="/"><img src="<%=h relative_path(param[:logo]) %>" height="30"></a>
23
+ <%- end -%>
24
+ <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
25
+ <span class="navbar-toggler-icon"></span>
26
+ </button>
27
+ <div class="collapse navbar-collapse" id="navbarSupportedContent">
28
+ <ul class="navbar-nav mr-auto">
29
+ <li class="nav-item<%= ' active' if @template == "index.html.erb" %>">
30
+ <a class="nav-link" href="/">Home</a>
31
+ </li>
32
+ <li class="nav-item<%= ' active' if @template == "about.html.erb" %>">
33
+ <a class="nav-link" href="/about">About</a>
34
+ </li>
18
35
  </ul>
19
36
  </div>
20
37
  </nav>
@@ -22,13 +39,21 @@
22
39
  <hr>
23
40
  <footer>
24
41
  <%- if param[:uri] -%>
25
- <p class="pull-right"><a href="<%=h param[:uri] %>.ttl"><img src="https://www.w3.org/RDF/icons/rdf_flyer.24" alt="<%=h t("layout.rdf-data") %>"></a></p>
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>
43
+ <%- end -%>
44
+ <%- if param[:admin_name] -%>
45
+ <p>
46
+ <%- if param[:copyright_year] -%>
47
+ &copy; <%=h param[:copyright_year] %>
48
+ <%- end -%>
49
+ <%=h param[:admin_name] %>
50
+ </p>
26
51
  <%- end -%>
27
52
  </footer>
28
53
 
29
54
  <!-- jQuery first, then Popper.js, then Bootstrap JS -->
30
- <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
31
- <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
32
- <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
55
+ <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
56
+ <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
+ <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
33
58
  </body>
34
59
  </html>
@@ -1,16 +1,24 @@
1
- <dl>
2
- <% param[:data].each do |k, v| %>
3
- <dt><%=h format_property(k, param[:labels]) %></dt>
4
- <% if v.respond_to? :has_key? %>
5
- <% v.each do |lang, v2| %>
6
- <dd lang="<%=h lang %>"><%= format_object v2, param[:data] %></dd>
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
+ <%- 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
+ <dt class="col-sm-3"><%=h format_property(k, param[:labels]) %></dt>
11
+ <%- end -%>
12
+ <%- 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>
7
15
  <% end %>
8
- <% elsif v.size > 1 %>
9
- <% v.each do |v2| %>
10
- <dd><%= format_object v2, param[:data] %></dd>
11
- <% end %>
12
- <% else %>
13
- <dd><%= format_object v.first, param[:data] %></dd>
14
- <% end %>
16
+ <%- elsif v.size > 1 -%>
17
+ <%- 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>
19
+ <%- end -%>
20
+ <%- else -%>
21
+ <dd class="col-sm-9"><%= format_object v.first, param[:data] %></dd>
22
+ <%- end -%>
15
23
  <%- end -%>
16
- </dl>
24
+ </dl>
@@ -0,0 +1,28 @@
1
+ <dt><%=h param[:data][:date] %></dt>
2
+ <dd><%=h t("about.version-release", version: param[:data][:version]) %></dd>
3
+ <dd><%=h get_language_literal(param[:data][:description]) %></dd>
4
+ <%- if param[:data][:datadump] -%>
5
+ <dd><ul>
6
+ <li><a href="<%=h param[:data][:datadump] %>"><%=h File.basename(param[:data][:datadump]) %></a>
7
+ <%-
8
+ fileinfo = []
9
+ if param[:data][:triples]
10
+ fileinfo << t("about.version-triples", triples: number_with_delimiter(param[:data][:triples].to_i))
11
+ end
12
+ if param[:data][:bytesize]
13
+ fileinfo << number_to_human_size(param[:data][:bytesize])
14
+ end
15
+ -%>
16
+ <%- if fileinfo.size > 0 -%>
17
+ (<%=h fileinfo.join(", ") %>)
18
+ <%- end -%>
19
+ <%- if param[:data][:subset].size > 0 -%>
20
+ <ul>
21
+ <%- param[:data][:subset].each do |subset| -%>
22
+ <li><a href="<%=h subset %>"><%=h File.basename(subset) %></a></li>
23
+ <%- end -%>
24
+ </ul>
25
+ </li>
26
+ <%- end -%>
27
+ </dd>
28
+ <%- 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.2.0
4
+ version: 1.3.3
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-11-27 00:00:00.000000000 Z
11
+ date: 2021-12-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: actionview
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: rspec
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -146,6 +160,7 @@ files:
146
160
  - templates/layout.html.erb
147
161
  - templates/shape-table.html.erb
148
162
  - templates/triples.html.erb
163
+ - templates/version.html.erb
149
164
  homepage: https://github.com/masao/ttl2html
150
165
  licenses:
151
166
  - MIT
@@ -165,7 +180,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
165
180
  - !ruby/object:Gem::Version
166
181
  version: '0'
167
182
  requirements: []
168
- rubygems_version: 3.2.3
183
+ rubygems_version: 3.2.32
169
184
  signing_key:
170
185
  specification_version: 4
171
186
  summary: ttl2html