ttl2html 1.1.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/ttl2html/template.rb +56 -7
- data/lib/ttl2html/version.rb +1 -1
- data/lib/ttl2html.rb +94 -39
- data/locales/en.yml +3 -1
- data/locales/ja.yml +3 -1
- data/templates/about.html.erb +8 -6
- data/templates/default.html.erb +25 -5
- data/templates/index.html.erb +1 -1
- data/templates/layout.html.erb +18 -10
- data/templates/triples.html.erb +22 -14
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7291dd5276af9d25f9c91f5d798a1ad7614abe6d35ccf36aaa35beceb523d0ae
|
4
|
+
data.tar.gz: baca08577305a96a85b7c18015181a578dfbfc70344c73a599ebab582a591a69
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fd0e4667b20caaa5444bf8c5013e8e2d9fabc944628201a340c33865f3ae747def16b4860a70eb11dad6da9b5db014bb2aeb48d8a00ef9a48ea0aa1b3bf6db84
|
7
|
+
data.tar.gz: 8e85d33dabd668ce182e0d10483ae95f46c44bb3a421d5153823ae6df6d0768d9ce00b8f0f010f219a8861aaa3f5349c20e1727ac3742383e22be518d2d3cebc
|
data/lib/ttl2html/template.rb
CHANGED
@@ -12,9 +12,10 @@ module TTL2HTML
|
|
12
12
|
include I18n::Base
|
13
13
|
def initialize(template, param = {})
|
14
14
|
@template = template
|
15
|
-
@param = param
|
15
|
+
@param = param.dup
|
16
16
|
@template_path = [ Dir.pwd, File.join(Dir.pwd, "templates") ]
|
17
17
|
@template_path << File.join(File.dirname(__FILE__), "..", "..", "templates")
|
18
|
+
I18n.load_path << Dir[File.join(File.dirname(__FILE__), "..", "..", "locales") + "/*.yml"]
|
18
19
|
I18n.load_path << Dir[File.expand_path("locales") + "/*.yml"]
|
19
20
|
I18n.locale = @param[:locale] if @param[:locale]
|
20
21
|
end
|
@@ -112,6 +113,33 @@ module TTL2HTML
|
|
112
113
|
end
|
113
114
|
|
114
115
|
# helper method:
|
116
|
+
def uri_mapping_to_path(uri, suffix = ".html")
|
117
|
+
path = nil
|
118
|
+
if @param[:uri_mappings]
|
119
|
+
@param[:uri_mappings].each do |mapping|
|
120
|
+
local_file = uri.sub(@param[:base_uri], "")
|
121
|
+
if mapping["regexp"] =~ local_file
|
122
|
+
path = local_file.sub(mapping["regexp"], mapping["path"])
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
if path.nil?
|
127
|
+
if suffix == ".html"
|
128
|
+
if @param[:data_global] and @param[:data_global].keys.find{|e| e.start_with?(uri + "/") }
|
129
|
+
path = uri + "/index"
|
130
|
+
elsif uri.end_with?("/")
|
131
|
+
path = uri + "index"
|
132
|
+
else
|
133
|
+
path = uri
|
134
|
+
end
|
135
|
+
else
|
136
|
+
path = uri
|
137
|
+
end
|
138
|
+
end
|
139
|
+
path = path.sub(@param[:base_uri], "") if @param[:base_uri]
|
140
|
+
path << suffix
|
141
|
+
path
|
142
|
+
end
|
115
143
|
def relative_path(dest)
|
116
144
|
src = @param[:output_file]
|
117
145
|
src = Pathname.new(src).relative_path_from(Pathname.new(@param[:output_dir])) if @param[:output_dir]
|
@@ -122,21 +150,29 @@ module TTL2HTML
|
|
122
150
|
def relative_path_uri(dest_uri, base_uri)
|
123
151
|
if dest_uri.start_with? base_uri
|
124
152
|
dest = dest_uri.sub(base_uri, "")
|
153
|
+
dest = uri_mapping_to_path(dest, "")
|
125
154
|
relative_path(dest)
|
126
155
|
else
|
127
156
|
dest_uri
|
128
157
|
end
|
129
158
|
end
|
159
|
+
def shorten_title(title, length = 140)
|
160
|
+
if title.length > length
|
161
|
+
title[0..length] + "..."
|
162
|
+
else
|
163
|
+
title
|
164
|
+
end
|
165
|
+
end
|
130
166
|
def get_title(data, default_title = "no title")
|
131
167
|
if @param[:title_property_perclass] and data["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"]
|
132
168
|
@param[:title_property_perclass].each do |klass, property|
|
133
169
|
if data["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"].include?(klass) and data[property]
|
134
|
-
return get_language_literal(data[property])
|
170
|
+
return shorten_title(get_language_literal(data[property]))
|
135
171
|
end
|
136
172
|
end
|
137
173
|
end
|
138
174
|
if @param[:title_property] and data[@param[:title_property]]
|
139
|
-
return get_language_literal(data[@param[:title_property]])
|
175
|
+
return shorten_title(get_language_literal(data[@param[:title_property]]))
|
140
176
|
end
|
141
177
|
%w(
|
142
178
|
http://www.w3.org/2000/01/rdf-schema#label
|
@@ -145,7 +181,7 @@ module TTL2HTML
|
|
145
181
|
http://schema.org/name
|
146
182
|
http://www.w3.org/2004/02/skos/core#prefLabel
|
147
183
|
).each do |property|
|
148
|
-
return get_language_literal(data[property]) if data[property]
|
184
|
+
return shorten_title(get_language_literal(data[property])) if data[property]
|
149
185
|
end
|
150
186
|
default_title
|
151
187
|
end
|
@@ -172,7 +208,7 @@ module TTL2HTML
|
|
172
208
|
def format_object(object, data)
|
173
209
|
if object =~ /\Ahttps?:\/\//
|
174
210
|
rel_path = relative_path_uri(object, param[:base_uri])
|
175
|
-
if
|
211
|
+
if param[:data_global][object]
|
176
212
|
"<a href=\"#{rel_path}\">#{get_title(param[:data_global][object]) or object}</a>"
|
177
213
|
else
|
178
214
|
"<a href=\"#{rel_path}\">#{object}</a>"
|
@@ -183,8 +219,9 @@ module TTL2HTML
|
|
183
219
|
object
|
184
220
|
end
|
185
221
|
end
|
186
|
-
def format_triples(triples)
|
222
|
+
def format_triples(triples, type = :default)
|
187
223
|
param_local = @param.dup.merge(data: triples)
|
224
|
+
param_local[:type] = type
|
188
225
|
if @param[:labels_with_class] and triples["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"]
|
189
226
|
@param[:labels_with_class].reverse_each do |k, v|
|
190
227
|
triples["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"].each do |entity_class|
|
@@ -197,7 +234,19 @@ module TTL2HTML
|
|
197
234
|
end
|
198
235
|
end
|
199
236
|
end
|
237
|
+
if @param[:orders_with_class] and triples["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"]
|
238
|
+
@param[:orders_with_class].reverse_each do |k, v|
|
239
|
+
triples["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"].each do |entity_class|
|
240
|
+
if entity_class == k
|
241
|
+
v.each do |property, order|
|
242
|
+
param_local[:orders] ||= {}
|
243
|
+
param_local[:orders][property] = order || Float::INFINITY
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
200
249
|
to_html_raw("triples.html.erb", param_local)
|
201
250
|
end
|
202
251
|
end
|
203
|
-
end
|
252
|
+
end
|
data/lib/ttl2html/version.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
TTL2HTML::VERSION = "1.1
|
1
|
+
TTL2HTML::VERSION = "1.3.1"
|
data/lib/ttl2html.rb
CHANGED
@@ -10,9 +10,7 @@ require "ttl2html/template"
|
|
10
10
|
|
11
11
|
module TTL2HTML
|
12
12
|
class App
|
13
|
-
using ProgressBar::Refinements::Enumerator
|
14
13
|
def initialize(config = "config.yml")
|
15
|
-
@template = {}
|
16
14
|
@config = load_config(config)
|
17
15
|
if not @config[:base_uri]
|
18
16
|
raise "load_config: base_uri not found"
|
@@ -68,50 +66,41 @@ module TTL2HTML
|
|
68
66
|
def format_turtle(subject, depth = 1)
|
69
67
|
turtle = RDF::Turtle::Writer.new
|
70
68
|
result = ""
|
71
|
-
if subject
|
72
|
-
result << "<#{subject}>\n#{" "*depth}"
|
73
|
-
else
|
69
|
+
if subject =~ /^_:/
|
74
70
|
result << "[\n#{" "*depth}"
|
71
|
+
else
|
72
|
+
result << "<#{subject}>\n#{" "*depth}"
|
75
73
|
end
|
76
|
-
result << @
|
74
|
+
result << @data[subject.to_s].keys.sort.map do |predicate|
|
77
75
|
str = "<#{predicate}> "
|
78
|
-
str << @
|
79
|
-
if object
|
80
|
-
@graph.query([object, nil, nil]).statements.sort_by{|e|
|
81
|
-
[ e.predicate, e.object ]
|
82
|
-
}.map{|e|
|
83
|
-
[ e.predicate, e.object ]
|
84
|
-
}
|
85
|
-
else
|
86
|
-
object
|
87
|
-
end
|
88
|
-
end.map do |object|
|
89
|
-
if object.resource? and not object.iri? # blank node:
|
76
|
+
str << @data[subject.to_s][predicate].sort.map do |object|
|
77
|
+
if object =~ /^_:/ # blank node:
|
90
78
|
format_turtle(object, depth + 1)
|
79
|
+
elsif object =~ RDF::URI::IRI
|
80
|
+
turtle.format_uri(RDF::URI.new object)
|
81
|
+
elsif object.respond_to?(:first) and object.first.kind_of?(Symbol)
|
82
|
+
turtle.format_literal(RDF::Literal.new(object[1], language: object[0]))
|
91
83
|
else
|
92
|
-
|
93
|
-
when RDF::URI
|
94
|
-
turtle.format_uri(object)
|
95
|
-
else
|
96
|
-
turtle.format_literal(object)
|
97
|
-
end
|
84
|
+
turtle.format_literal(object)
|
98
85
|
end
|
99
86
|
end.join(", ")
|
100
87
|
str
|
101
88
|
end.join(";\n#{" "*depth}")
|
102
|
-
result << " ." if subject
|
89
|
+
result << " ." if not subject =~ /^_:/
|
103
90
|
result << "\n"
|
104
|
-
result << "#{" "*(depth-1)}]" if
|
91
|
+
result << "#{" "*(depth-1)}]" if subject =~ /^_:/
|
105
92
|
result
|
106
93
|
end
|
107
94
|
def format_turtle_inverse(object)
|
108
|
-
turtle = RDF::Turtle::Writer.new
|
109
95
|
result = ""
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
96
|
+
return result if not object.start_with? @config[:base_uri]
|
97
|
+
return result if not @data_inverse.has_key? object
|
98
|
+
turtle = RDF::Turtle::Writer.new
|
99
|
+
@data_inverse[object].keys.sort.each do |predicate|
|
100
|
+
@data_inverse[object.to_s][predicate].sort.each do |subject|
|
101
|
+
next if subject =~ /^_:/
|
102
|
+
result << "<#{subject}> <#{predicate}> <#{object}>.\n"
|
103
|
+
end
|
115
104
|
end
|
116
105
|
result
|
117
106
|
end
|
@@ -123,7 +112,7 @@ module TTL2HTML
|
|
123
112
|
end
|
124
113
|
end
|
125
114
|
def output_html_files
|
126
|
-
template = Template.new("")
|
115
|
+
template = Template.new("", @config)
|
127
116
|
shapes = @graph.query([nil,
|
128
117
|
RDF::URI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"),
|
129
118
|
RDF::URI("http://www.w3.org/ns/shacl#NodeShape")])
|
@@ -139,14 +128,23 @@ module TTL2HTML
|
|
139
128
|
end
|
140
129
|
end
|
141
130
|
end
|
131
|
+
@config[:orders_with_class] = shapes2orders(shapes)
|
132
|
+
progressbar = ProgressBar.create(title: :output_html_files,
|
133
|
+
total: @data.size,
|
134
|
+
format: "(%t) %a %e %P% Processed: %c from %C")
|
142
135
|
each_data do |uri, v|
|
136
|
+
progressbar.increment
|
143
137
|
template = Template.new("default.html.erb", @config)
|
144
138
|
param = @config.dup
|
145
139
|
param[:uri] = uri
|
140
|
+
param[:turtle_uri] = uri_mapping_to_path(uri, ".ttl")
|
146
141
|
param[:data] = v
|
147
142
|
param[:data_inverse] = @data_inverse[uri]
|
148
143
|
param[:data_global] = @data
|
149
144
|
param[:title] = template.get_title(v)
|
145
|
+
if param[:breadcrumbs]
|
146
|
+
param[:breadcrumbs_items] = build_breadcrumbs(uri, template)
|
147
|
+
end
|
150
148
|
file = uri_mapping_to_path(uri, ".html")
|
151
149
|
if @config[:output_dir]
|
152
150
|
Dir.mkdir @config[:output_dir] if not File.exist? @config[:output_dir]
|
@@ -154,6 +152,7 @@ module TTL2HTML
|
|
154
152
|
end
|
155
153
|
template.output_to(file, param)
|
156
154
|
end
|
155
|
+
progressbar.finish
|
157
156
|
index_html = "index.html"
|
158
157
|
index_html = File.join(@config[:output_dir], "index.html") if @config[:output_dir]
|
159
158
|
if @config.has_key? :top_class
|
@@ -182,16 +181,22 @@ module TTL2HTML
|
|
182
181
|
param[:data_global] = @data
|
183
182
|
param[:content] = {}
|
184
183
|
shapes.subjects.each do |subject|
|
185
|
-
label = nil
|
184
|
+
label = comment = nil
|
186
185
|
target_class = @data[subject.to_s]["http://www.w3.org/ns/shacl#targetClass"]
|
187
186
|
if target_class
|
188
|
-
|
189
|
-
|
187
|
+
target_class = target_class.first
|
188
|
+
if @data[target_class]
|
189
|
+
label = template.get_title(@data[target_class], nil)
|
190
|
+
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"]
|
191
|
+
else
|
192
|
+
label = template.format_property(target_class)
|
193
|
+
end
|
190
194
|
else
|
191
195
|
label = template.get_title(@data[subject.to_s])
|
192
196
|
end
|
193
197
|
param[:content][subject] = {
|
194
198
|
label: label,
|
199
|
+
comment: comment,
|
195
200
|
html: template.expand_shape(@data, subject.to_s, @prefix),
|
196
201
|
}
|
197
202
|
end
|
@@ -199,6 +204,36 @@ module TTL2HTML
|
|
199
204
|
end
|
200
205
|
end
|
201
206
|
|
207
|
+
def build_breadcrumbs(uri, template, depth = 0)
|
208
|
+
results = []
|
209
|
+
data = @data[uri]
|
210
|
+
if @config[:breadcrumbs]
|
211
|
+
if depth == 0
|
212
|
+
first_label = template.get_title(data)
|
213
|
+
first_label = data[@config[:breadcrumbs].first["label"]].first if @config[:breadcrumbs].first["label"] and data[@config[:breadcrumbs].first["label"]]
|
214
|
+
results << { label: first_label }
|
215
|
+
end
|
216
|
+
@config[:breadcrumbs].each do |e|
|
217
|
+
data_target = data
|
218
|
+
data_target = @data_inverse[uri] if e["inverse"]
|
219
|
+
if data_target and data_target[e["property"]]
|
220
|
+
data_target[e["property"]].each do |parent|
|
221
|
+
data_parent = @data[parent]
|
222
|
+
label = template.get_title(data_parent)
|
223
|
+
label = data_parent[e["label"]].first if e["label"] and data_parent[e["label"]]
|
224
|
+
results << {
|
225
|
+
uri: parent,
|
226
|
+
label: label,
|
227
|
+
}
|
228
|
+
results += build_breadcrumbs(parent, template, depth + 1)
|
229
|
+
end
|
230
|
+
return results
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
results
|
235
|
+
end
|
236
|
+
|
202
237
|
def shapes2labels(shapes)
|
203
238
|
labels = {}
|
204
239
|
shapes.subjects.each do |shape|
|
@@ -214,20 +249,40 @@ module TTL2HTML
|
|
214
249
|
end
|
215
250
|
labels
|
216
251
|
end
|
252
|
+
def shapes2orders(shapes)
|
253
|
+
orders = {}
|
254
|
+
shapes.subjects.each do |shape|
|
255
|
+
target_class = @data[shape.to_s]["http://www.w3.org/ns/shacl#targetClass"]&.first
|
256
|
+
if target_class
|
257
|
+
@data[shape.to_s]["http://www.w3.org/ns/shacl#property"].each do |property|
|
258
|
+
path = @data[property]["http://www.w3.org/ns/shacl#path"].first
|
259
|
+
order = @data[property]["http://www.w3.org/ns/shacl#order"]
|
260
|
+
orders[target_class] ||= {}
|
261
|
+
orders[target_class][path] = order&.first&.to_i
|
262
|
+
end
|
263
|
+
end
|
264
|
+
end
|
265
|
+
orders
|
266
|
+
end
|
217
267
|
|
218
268
|
def output_turtle_files
|
269
|
+
progressbar = ProgressBar.create(title: :output_turtle_files,
|
270
|
+
total: @data.size,
|
271
|
+
format: "(%t) %a %e %P% Processed: %c from %C")
|
219
272
|
each_data do |uri, v|
|
273
|
+
progressbar.increment
|
220
274
|
file = uri_mapping_to_path(uri, ".ttl")
|
221
275
|
if @config[:output_dir]
|
222
276
|
Dir.mkdir @config[:output_dir] if not File.exist? @config[:output_dir]
|
223
277
|
file = File.join(@config[:output_dir], file)
|
224
278
|
end
|
225
|
-
str = format_turtle(
|
226
|
-
str << format_turtle_inverse(
|
279
|
+
str = format_turtle(uri)
|
280
|
+
str << format_turtle_inverse(uri)
|
227
281
|
open(file, "w") do |io|
|
228
282
|
io.puts str.strip
|
229
283
|
end
|
230
284
|
end
|
285
|
+
progressbar.finish
|
231
286
|
end
|
232
287
|
def uri_mapping_to_path(uri, suffix = ".html")
|
233
288
|
path = nil
|
@@ -293,4 +348,4 @@ module TTL2HTML
|
|
293
348
|
file
|
294
349
|
end
|
295
350
|
end
|
296
|
-
end
|
351
|
+
end
|
data/locales/en.yml
CHANGED
@@ -23,4 +23,6 @@ en:
|
|
23
23
|
optional: "Optional"
|
24
24
|
non-repeatable: "Non repeatable"
|
25
25
|
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:"
|
26
|
+
blank-node-or-structure: "The structural contents of a blank node are either of the followings:"
|
27
|
+
triples:
|
28
|
+
inverse_refered: "Referred to as '%{property}' from:"
|
data/locales/ja.yml
CHANGED
@@ -22,4 +22,6 @@ ja:
|
|
22
22
|
optional: 省略可能
|
23
23
|
non-repeatable: 繰り返し無し
|
24
24
|
blank-node-structure: ブランクノードの内容は以下の内容からなる構造を持ちます。
|
25
|
-
blank-node-or-structure: ブランクノードの内容は以下のいずれかの内容からなる構造を持ちます。
|
25
|
+
blank-node-or-structure: ブランクノードの内容は以下のいずれかの内容からなる構造を持ちます。
|
26
|
+
triples:
|
27
|
+
inverse_refered: "'%{property}'としての参照元:"
|
data/templates/about.html.erb
CHANGED
@@ -6,15 +6,15 @@
|
|
6
6
|
<div class="container">
|
7
7
|
<div class="row">
|
8
8
|
<div class="col-md-12">
|
9
|
-
<
|
10
|
-
<
|
11
|
-
|
9
|
+
<nav aria-label="breadcrumb">
|
10
|
+
<ol class="breadcrumb">
|
11
|
+
<li class="breadcrumb-item"><a href="./"><i class="bi bi-house-door-fill"></i> Home</a></li>
|
12
|
+
<li class="breadcrumb-item active" aria-current="page"><%=h t("about.title", title: param[:site_title]) %></li>
|
12
13
|
</ol>
|
13
|
-
</
|
14
|
+
</nav>
|
14
15
|
</div>
|
15
|
-
|
16
16
|
<div class="row">
|
17
|
-
<div class="col-md
|
17
|
+
<div class="col-md">
|
18
18
|
<%- param[:content].keys.sort.each do |shape| -%>
|
19
19
|
<h3><%=h param[:content][shape][:label] %></h3>
|
20
20
|
<p><%= param[:content][shape][:comment] %></p>
|
@@ -23,3 +23,5 @@
|
|
23
23
|
<%- end -%>
|
24
24
|
</div>
|
25
25
|
</div>
|
26
|
+
</div>
|
27
|
+
|
data/templates/default.html.erb
CHANGED
@@ -1,22 +1,42 @@
|
|
1
1
|
<div class="jumbotron">
|
2
2
|
<div class="container">
|
3
3
|
<h1><%=h param[:title] %></h1>
|
4
|
-
<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
|
-
|
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
|
-
|
22
|
-
</div>
|
41
|
+
<%- end -%>
|
42
|
+
</div>
|
data/templates/index.html.erb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
<div class="jumbotron">
|
2
2
|
<div class="container">
|
3
3
|
<h1><%=h param[:site_title] %></h1>
|
4
|
-
<p><
|
4
|
+
<p><i class="bi bi-link-45deg"></i> <a href="<%=h param[:base_uri] %>"><%=h param[:base_uri] %></a></p>
|
5
5
|
</div>
|
6
6
|
</div>
|
7
7
|
<div class="container">
|
data/templates/layout.html.erb
CHANGED
@@ -4,17 +4,25 @@
|
|
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.
|
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">
|
8
9
|
<title><% if param[:title] %><%=h param[:title] %><% end %><% if param[:site_title] %> - <%=h param[:site_title] %><% end %></title>
|
9
10
|
<meta name="twitter:card" content="summary">
|
10
11
|
<meta name="twitter:title" content="<% if param[:title] %><%=h param[:title] %><% end %><% if param[:site_title] %> - <%=h param[:site_title] %><% end %>">
|
11
12
|
</head>
|
12
13
|
<body>
|
13
|
-
<nav class="navbar navbar-
|
14
|
-
<
|
15
|
-
<
|
16
|
-
|
17
|
-
|
14
|
+
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
|
15
|
+
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
16
|
+
<span class="navbar-toggler-icon"></span>
|
17
|
+
</button>
|
18
|
+
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
19
|
+
<ul class="navbar-nav mr-auto">
|
20
|
+
<li class="nav-item<%= ' class="active"' if param[:active] == :home %>">
|
21
|
+
<a class="navbar-brand" href="/">Home</a>
|
22
|
+
</li>
|
23
|
+
<li class="nav-item<%= ' class="active"' if param[:active] == :about %>">
|
24
|
+
<a class="navbar-brand" href="/about">About</a>
|
25
|
+
</li>
|
18
26
|
</ul>
|
19
27
|
</div>
|
20
28
|
</nav>
|
@@ -22,13 +30,13 @@
|
|
22
30
|
<hr>
|
23
31
|
<footer>
|
24
32
|
<%- if param[:uri] -%>
|
25
|
-
<p class="
|
33
|
+
<p class="text-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>
|
26
34
|
<%- end -%>
|
27
35
|
</footer>
|
28
36
|
|
29
37
|
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
|
30
|
-
<script src="https://code.jquery.com/jquery-3.
|
31
|
-
<script src="https://
|
32
|
-
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.
|
38
|
+
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
|
39
|
+
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
|
40
|
+
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
|
33
41
|
</body>
|
34
42
|
</html>
|
data/templates/triples.html.erb
CHANGED
@@ -1,16 +1,24 @@
|
|
1
|
-
<dl>
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
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
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
<dd><%= format_object v.first, param[:data] %></dd>
|
14
|
-
|
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>
|
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.1
|
4
|
+
version: 1.3.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-
|
11
|
+
date: 2021-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|