ttl2html 0.1.0 → 0.2.0

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: 3285a319273819d00281486dadbdea6c82c162856157075db553e18b659b16cc
4
- data.tar.gz: 2f66f22a4ad30bd4dc6e0e9a44f24be37cf2e5c11396f4a2c85414becb1dbe6a
3
+ metadata.gz: fbbc4da0cfa20d2803025a5273b8399a1376af7e6e2a181cad79eaba19e7da9f
4
+ data.tar.gz: 6962165c275071e94c34152e6474777f94f46f196fb1b04804b3ea17d6a0c8c5
5
5
  SHA512:
6
- metadata.gz: 4301d623df7599b6344806d66c97c71efb0633f45f663be45a460d5ceb23c1fe452d4ed2b01b2df4f02109d4168b8a31acb2dccb21a7f4e4234926cc59e4f4f5
7
- data.tar.gz: 930b188d2f0d89601ba6af9199fd0ce87d40b3a00bd8a6711c14a82cb7dc52dae90d871772cd4e39dd4680ef8894e4c9245651e2a158c33f690f887a267f597a
6
+ metadata.gz: 2129bdefbb7b498a06301479638c96d1d35a67a8812a28202d0fc3eae1a706e393433b684f0e629c7cc0a2a7ba8e05d3cf5caa1a51e10731a9b0145c009af7b1
7
+ data.tar.gz: 5e5e04ce0c0f2e1e8434cba7ac54a146eb23fb00ab39e007f4c78146f78cd1ddda4bdd89ae7d168ddb831c935b4ff3bde306e9f274c0477b67e9e7b1c49b0d3c
@@ -48,7 +48,65 @@ module TTL2HTML
48
48
  end
49
49
  return nil
50
50
  end
51
-
51
+
52
+ def expand_shape(data, uri, prefixes = {})
53
+ return nil if not data[uri]
54
+ return nil if not data[uri]["http://www.w3.org/ns/shacl#property"]
55
+ result = data[uri]["http://www.w3.org/ns/shacl#property"].sort_by do |e|
56
+ e["http://www.w3.org/ns/shacl#order"]
57
+ end.map do |property|
58
+ path = data[property]["http://www.w3.org/ns/shacl#path"].first
59
+ shorten_path = path.dup
60
+ prefixes.each do |prefix, val|
61
+ if path.index(val) == 0
62
+ shorten_path = path.sub(/\A#{val}/, "#{prefix}:")
63
+ end
64
+ end
65
+ repeatable = false
66
+ if data[property]["http://www.w3.org/ns/shacl#maxCount"]
67
+ max_count = data[property]["http://www.w3.org/ns/shacl#maxCount"].first.to_i
68
+ if max_count > 1
69
+ repeatable = true
70
+ end
71
+ else
72
+ repeatable = true
73
+ end
74
+ nodes = nil
75
+ if data[property]["http://www.w3.org/ns/shacl#node"]
76
+ node = data[property]["http://www.w3.org/ns/shacl#node"].first
77
+ if data[node]["http://www.w3.org/ns/shacl#or"]
78
+ node_or = data[data[node]["http://www.w3.org/ns/shacl#or"].first]
79
+ node_mode = :or
80
+ nodes = []
81
+ nodes << expand_shape(data, node_or["http://www.w3.org/1999/02/22-rdf-syntax-ns#first"].first, prefixes)
82
+ rest = node_or["http://www.w3.org/1999/02/22-rdf-syntax-ns#rest"].first
83
+ while data[rest] do
84
+ nodes << expand_shape(data, data[rest]["http://www.w3.org/1999/02/22-rdf-syntax-ns#first"].first, prefixes)
85
+ rest = data[rest]["http://www.w3.org/1999/02/22-rdf-syntax-ns#rest"].first
86
+ end
87
+ else
88
+ nodes = expand_shape(data, node, prefixes)
89
+ end
90
+ #p nodes
91
+ end
92
+ {
93
+ path: path,
94
+ shorten_path: shorten_path,
95
+ name: data[property]["http://www.w3.org/ns/shacl#name"].first,
96
+ example: data[property]["http://www.w3.org/2004/02/skos/core#example"] ? data[property]["http://www.w3.org/2004/02/skos/core#example"].first : nil,
97
+ description: data[property]["http://www.w3.org/ns/shacl#description"] ? data[property]["http://www.w3.org/ns/shacl#description"].first : nil,
98
+ required: data[property]["http://www.w3.org/ns/shacl#minCount"] ? data[property]["http://www.w3.org/ns/shacl#minCount"].first.to_i > 0 : false,
99
+ repeatable: repeatable,
100
+ nodeKind: data[property]["http://www.w3.org/ns/shacl#nodeKind"] ? data[property]["http://www.w3.org/ns/shacl#nodeKind"].first : nil,
101
+ nodes: nodes,
102
+ node_mode: node_mode,
103
+ }
104
+ end
105
+ template = "shape-table.html.erb"
106
+ tmpl = Template.new(template)
107
+ tmpl.to_html_raw(template, {properties: result})
108
+ end
109
+
52
110
  # helper method:
53
111
  def relative_path(dest)
54
112
  src = @param[:output_file]
@@ -1 +1 @@
1
- TTL2HTML::VERSION = "0.1.0"
1
+ TTL2HTML::VERSION = "0.2.0"
data/lib/ttl2html.rb CHANGED
@@ -18,6 +18,7 @@ module TTL2HTML
18
18
  end
19
19
  @data = {}
20
20
  @data_inverse = {}
21
+ @prefix = {}
21
22
  @graph = RDF::Graph.new
22
23
  end
23
24
 
@@ -33,6 +34,7 @@ module TTL2HTML
33
34
  STDERR.puts "loading #{file}..."
34
35
  count = 0
35
36
  RDF::Turtle::Reader.open(file) do |reader|
37
+ @prefix.merge! reader.prefixes
36
38
  reader.statements.each do |statement|
37
39
  @graph.insert(statement)
38
40
  s = statement.subject
@@ -137,17 +139,48 @@ module TTL2HTML
137
139
  end
138
140
  index_html = "index.html"
139
141
  index_html = File.join(@config[:output_dir], "index.html") if @config[:output_dir]
140
- if @config.has_key? :top_class and not File.exist? index_html
141
- template = Template.new("index.html.erb", @config)
142
+ if @config.has_key? :top_class
143
+ subjects = @graph.query([nil,
144
+ RDF::URI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"),
145
+ RDF::URI(@config[:top_class])]).subjects
146
+ if subjects.empty?
147
+ STDERR.puts "WARN: top_class parameter specified as [#{@config[:top_class]}], but there is no instance data."
148
+ STDERR.puts " Skip generation of top page."
149
+ else
150
+ template = Template.new("index.html.erb", @config)
151
+ param = @config.dup
152
+ param[:data_global] = @data
153
+ subjects.each do |subject|
154
+ param[:index_data] ||= []
155
+ param[:index_data] << subject.to_s
156
+ end
157
+ template.output_to(index_html, param)
158
+ end
159
+ end
160
+ shapes = @graph.query([nil,
161
+ RDF::URI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"),
162
+ RDF::URI("http://www.w3.org/ns/shacl#NodeShape")])
163
+ if shapes.size > 0
164
+ about_html = @config[:about_file] || "about.html"
165
+ about_html = File.join(@config[:output_dir], about_html) if @config[:output_dir]
166
+ template = Template.new("about.html.erb", @config)
142
167
  param = @config.dup
143
168
  param[:data_global] = @data
144
- @graph.query([nil,
145
- RDF::URI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"),
146
- RDF::URI(@config[:top_class])]).subjects.sort.each do |subject|
147
- param[:index_data] ||= []
148
- param[:index_data] << subject.to_s
169
+ param[:content] = {}
170
+ shapes.subjects.each do |subject|
171
+ label = nil
172
+ target_class = @data[subject.to_s]["http://www.w3.org/ns/shacl#targetClass"]
173
+ if target_class and @data[target_class.first]
174
+ label = template.get_title(@data[target_class.first])
175
+ else
176
+ label = template.get_title(@data[subject.to_s])
177
+ end
178
+ param[:content][subject] = {
179
+ label: label,
180
+ html: template.expand_shape(@data, subject.to_s, @prefix),
181
+ }
149
182
  end
150
- template.output_to(index_html, param)
183
+ template.output_to(about_html, param)
151
184
  end
152
185
  end
153
186
  def output_turtle_files
@@ -0,0 +1,24 @@
1
+ <div class="jumbotron">
2
+ <div class="container">
3
+ <h1><%=h param[:site_title] %>について</h1>
4
+ </div>
5
+ </div>
6
+ <div class="container">
7
+ <div class="row">
8
+ <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 param[:site_title] %>について</li>
12
+ </ol>
13
+ </div>
14
+ </div>
15
+
16
+ <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><%=h param[:content][shape][:label] %>リソースが持つプロパティを下表に示します</p>
21
+ <%= param[:content][shape][:html] -%>
22
+ <%- end -%>
23
+ </div>
24
+ </div>
@@ -0,0 +1,55 @@
1
+ <table class="table table-condensed">
2
+ <tr>
3
+ <th>プロパティ名</th><th>説明</th><th>プロパティ値の例</th><th>必須・省略の別<br>繰り返しの有無</th><th>備考</th>
4
+ </tr>
5
+ <tbody>
6
+ <%- param[:properties].each do |property| -%>
7
+ <tr>
8
+ <%- if property[:nodeKind] == "http://www.w3.org/ns/shacl#BlankNode" -%>
9
+ <td rowspan="2"><code><%=h property[:shorten_path] %></code></td>
10
+ <%- else -%>
11
+ <td><code><%=h property[:shorten_path] %></code></td>
12
+ <%- end -%>
13
+ <td><%= property[:name_ja] %></td>
14
+ <%- if property[:nodeKind] == "http://www.w3.org/ns/shacl#IRI" -%>
15
+ <td class="url"><%= property[:example] %></td>
16
+ <%- else -%>
17
+ <td><%= property[:example] %></td>
18
+ <%- end -%>
19
+ <td>
20
+ <div>
21
+ <%- if property[:required] -%>
22
+ <strong>必須</strong>
23
+ <%- else -%>
24
+ 省略可能
25
+ <%- end -%>
26
+ </div>
27
+ <div>
28
+ <%- if property[:repeatable] -%>
29
+ 繰り返し有り
30
+ <%- else -%>
31
+ 繰り返し無し
32
+ <%- end -%>
33
+ </div>
34
+ </td>
35
+ <td><%= property[:description_ja] %></td>
36
+ </tr>
37
+ <%- if property[:nodeKind] == "http://www.w3.org/ns/shacl#BlankNode" -%>
38
+ <tr>
39
+ <td colspan="4">
40
+ <%- if property[:node_mode] == :or -%>
41
+ ブランクノードの内容は以下のいずれかの内容からなる構造を持ちます。
42
+ <%- property[:nodes].each do |e| -%>
43
+ <div class="blank_node"><%= e.sub(/class="table"/, 'class="table table-condensed"') %></div>
44
+ <%- end -%>
45
+ <%- else -%>
46
+ ブランクノードの内容は以下の構造を持ちます。
47
+ <div class="blank_node"><%= property[:nodes].sub(/class="table"/, 'class="table table-condensed"') %></div>
48
+ <%- end -%>
49
+ </td>
50
+ </tr>
51
+ <%- end -%>
52
+ <%- end -%>
53
+ </tbody>
54
+ </table>
55
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ttl2html
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masao Takaku
@@ -122,9 +122,11 @@ files:
122
122
  - lib/ttl2html/template.rb
123
123
  - lib/ttl2html/version.rb
124
124
  - lib/xlsx2shape.rb
125
+ - templates/about.html.erb
125
126
  - templates/default.html.erb
126
127
  - templates/index.html.erb
127
128
  - templates/layout.html.erb
129
+ - templates/shape-table.html.erb
128
130
  - templates/triples.html.erb
129
131
  homepage: https://github.com/masao/ttl2html
130
132
  licenses: