jekyll-rdf 2.0.0 → 2.1.0.alpha.pre.171
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/jekyll-rdf.rb +7 -0
- data/lib/jekyll/drops/rdf_resource.rb +113 -29
- data/lib/jekyll/drops/rdf_resource_class.rb +9 -3
- data/lib/jekyll/drops/rdf_statement.rb +5 -5
- data/lib/jekyll/drops/rdf_term.rb +23 -12
- data/lib/jekyll/filters/rdf_collection.rb +57 -0
- data/lib/jekyll/filters/rdf_container.rb +51 -0
- data/lib/jekyll/filters/rdf_property.rb +73 -35
- data/lib/jekyll/filters/rdf_resolve_prefix.rb +48 -0
- data/lib/jekyll/filters/rdf_sparql_query.rb +4 -5
- data/lib/jekyll/rdf_class_extraction.rb +35 -0
- data/lib/jekyll/rdf_generator_helper.rb +119 -0
- data/lib/jekyll/rdf_main_generator.rb +11 -109
- data/lib/jekyll/rdf_page_data.rb +15 -26
- data/lib/jekyll/rdf_page_helper.rb +54 -0
- data/lib/jekyll/rdf_template_mapper.rb +5 -25
- metadata +20 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf67f6f007e203e27966536bdded0e5c552acbda
|
4
|
+
data.tar.gz: 192c1276717719dea8f449d58113a7e05606c731
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe5f7f9cc3881a868dae0a8db88afe0df263d6b0def386921459685e59aa9bd2eecb4375a5015a90b66b4969e99cfdbc2fe87fa636f1003238f1485b2f2a939a
|
7
|
+
data.tar.gz: 2917ae2a2b7852e676e484d0b1c353684296186e9e6c5443551ff99d4e2fcd414369d25a8e1451120dc8ac51227de16880d92d7bb3094780772f2d1838f7d5e7
|
data/lib/jekyll-rdf.rb
CHANGED
@@ -29,6 +29,7 @@
|
|
29
29
|
require 'jekyll'
|
30
30
|
require 'linkeddata'
|
31
31
|
require 'sparql'
|
32
|
+
require 'set'
|
32
33
|
|
33
34
|
require 'jekyll/drops/rdf_term'
|
34
35
|
require 'jekyll/drops/rdf_statement'
|
@@ -38,8 +39,14 @@ require 'jekyll/drops/rdf_resource_class'
|
|
38
39
|
require 'jekyll/exceptions/NoPrefixMapped'
|
39
40
|
require 'jekyll/exceptions/NoPrefixesDefined'
|
40
41
|
require 'jekyll/exceptions/UnMarkedUri'
|
42
|
+
require 'jekyll/filters/rdf_resolve_prefix'
|
41
43
|
require 'jekyll/filters/rdf_sparql_query'
|
42
44
|
require 'jekyll/filters/rdf_property'
|
45
|
+
require 'jekyll/filters/rdf_collection'
|
46
|
+
require 'jekyll/filters/rdf_container'
|
47
|
+
require 'jekyll/rdf_generator_helper'
|
43
48
|
require 'jekyll/rdf_main_generator'
|
49
|
+
require 'jekyll/rdf_page_helper'
|
44
50
|
require 'jekyll/rdf_page_data'
|
51
|
+
require 'jekyll/rdf_class_extraction'
|
45
52
|
require 'jekyll/rdf_template_mapper'
|
@@ -51,6 +51,33 @@ module Jekyll #:nodoc:
|
|
51
51
|
#
|
52
52
|
attr_accessor :subResources
|
53
53
|
|
54
|
+
##
|
55
|
+
#
|
56
|
+
#
|
57
|
+
def initialize(term, sparql, site = nil, page = nil)
|
58
|
+
super(term, sparql)
|
59
|
+
if(site.is_a?(Jekyll::Site))
|
60
|
+
@site = site
|
61
|
+
end
|
62
|
+
if(page.is_a?(Jekyll::Page))
|
63
|
+
@page = page
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def addNecessities(site, page)
|
68
|
+
if(site.is_a?(Jekyll::Site))
|
69
|
+
@site ||= site
|
70
|
+
end
|
71
|
+
if(page.is_a?(Jekyll::Page))
|
72
|
+
@page ||= page
|
73
|
+
end
|
74
|
+
return self
|
75
|
+
end
|
76
|
+
|
77
|
+
def ready?
|
78
|
+
return (@site.is_a?(Jekyll::Site)||@page.is_a?(Jekyll::Page))
|
79
|
+
end
|
80
|
+
|
54
81
|
##
|
55
82
|
# Return a list of Jekyll::Drops::RdfStatements whose subject, predicate or object is the RDF resource represented by the receiver
|
56
83
|
#
|
@@ -120,9 +147,61 @@ module Jekyll #:nodoc:
|
|
120
147
|
# Return a list of Jekyll::Drops::RdfStatements whose object is the RDF resource represented by the receiver
|
121
148
|
#
|
122
149
|
def statements_as(role)
|
123
|
-
|
124
|
-
|
150
|
+
if(!term.to_s[0..1].eql? "_:")
|
151
|
+
inputURI = "<#{term.to_s}>"
|
152
|
+
elsif(:predicate.eql? role)
|
153
|
+
return []
|
154
|
+
else
|
155
|
+
inputURI = term.to_s
|
156
|
+
end
|
157
|
+
|
158
|
+
case role
|
159
|
+
when :subject
|
160
|
+
query = "SELECT ?p ?o ?dt ?lit ?lang WHERE{ #{inputURI} ?p ?o BIND(datatype(?o) AS ?dt) BIND(isLiteral(?o) AS ?lit) BIND(lang(?o) AS ?lang)}"
|
161
|
+
sparql.query(query).map do |solution|
|
162
|
+
check = checkSolution(solution)
|
163
|
+
createStatement(term.to_s, solution.p, solution.o, solution.lit, check[:lang], check[:dataType])
|
164
|
+
end
|
165
|
+
when :predicate
|
166
|
+
query = "SELECT ?s ?o ?dt ?lit ?lang WHERE{ ?s #{inputURI} ?o BIND(datatype(?o) AS ?dt) BIND(isLiteral(?o) AS ?lit) BIND(lang(?o) AS ?lang)}"
|
167
|
+
sparql.query(query).map do |solution|
|
168
|
+
check = checkSolution(solution)
|
169
|
+
createStatement(solution.s, term.to_s, solution.o, solution.lit, check[:lang], check[:dataType])
|
170
|
+
end
|
171
|
+
when :object
|
172
|
+
query = "SELECT ?s ?p WHERE{ ?s ?p #{inputURI}}"
|
173
|
+
sparql.query(query).map do |solution|
|
174
|
+
createStatement( solution.s, solution.p, term.to_s)
|
175
|
+
end
|
176
|
+
else
|
177
|
+
Jekyll.logger.error "Not existing role found in #{term.to_s}"
|
178
|
+
return
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
#checks if a query solution contains a language or type tag and returns those in a hash
|
183
|
+
private
|
184
|
+
def checkSolution(solution)
|
185
|
+
result = {:lang => nil, :dataType => nil}
|
186
|
+
if((solution.bound?(:lang)) && (!solution.lang.to_s.eql?("")))
|
187
|
+
result[:lang] = solution.lang.to_s.to_sym
|
188
|
+
end
|
189
|
+
if(solution.bound? :dt)
|
190
|
+
result[:dataType] = solution.dt
|
191
|
+
end
|
192
|
+
return result
|
193
|
+
end
|
194
|
+
|
195
|
+
private
|
196
|
+
def createStatement(subjectString, predicateString, objectString, isLit = nil, lang = nil, dataType = nil)
|
197
|
+
subject = RDF::URI(subjectString)
|
198
|
+
predicate = RDF::URI(predicateString)
|
199
|
+
if(!isLit.nil?&&isLit.true?)
|
200
|
+
object = RDF::Literal(objectString, language: lang, datatype: RDF::URI(dataType))
|
201
|
+
else
|
202
|
+
object = RDF::URI(objectString)
|
125
203
|
end
|
204
|
+
return RdfStatement.new(RDF::Statement( subject, predicate, object), @sparql, @site)
|
126
205
|
end
|
127
206
|
|
128
207
|
private
|
@@ -131,38 +210,43 @@ module Jekyll #:nodoc:
|
|
131
210
|
# * +domain_name+
|
132
211
|
#
|
133
212
|
def generate_file_name(domain_name, baseurl)
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
uri[2]
|
141
|
-
|
142
|
-
|
143
|
-
|
213
|
+
if(term.to_s[0..1].eql? "_:")
|
214
|
+
file_name = "rdfsites/blanknode/#{term.to_s}/"
|
215
|
+
else
|
216
|
+
begin
|
217
|
+
uri = URI::split(term.to_s)
|
218
|
+
file_name = "rdfsites/" # in this directory all external RDF sites are stored
|
219
|
+
if (uri[2] == domain_name)
|
220
|
+
file_name = ""
|
221
|
+
uri[0] = nil
|
222
|
+
uri[2] = nil
|
223
|
+
if(uri[5].length > baseurl.length)
|
224
|
+
if(uri[5][0..(baseurl.length)].eql? (baseurl + "/"))
|
225
|
+
uri[5] = uri[5][(baseurl.length)..-1]
|
226
|
+
end
|
227
|
+
elsif(uri[5].eql?(baseurl))
|
228
|
+
uri[5] = nil
|
144
229
|
end
|
145
|
-
elsif(uri[5].eql?(baseurl))
|
146
|
-
uri[5] = nil
|
147
230
|
end
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
231
|
+
(0..8).each do |i|
|
232
|
+
if !(uri[i].nil?)
|
233
|
+
case i
|
234
|
+
when 5
|
235
|
+
file_name += "#{uri[i][1..-1]}/"
|
236
|
+
when 8
|
237
|
+
file_name += "#/#{uri[i]}"
|
238
|
+
else
|
239
|
+
file_name += "#{uri[i]}/"
|
240
|
+
end
|
158
241
|
end
|
159
242
|
end
|
243
|
+
unless file_name[-1] == '/'
|
244
|
+
file_name += '/'
|
245
|
+
end
|
246
|
+
rescue URI::InvalidURIError #unclean coding: blanknodes are recognized through errors
|
247
|
+
file_name = "invalids/#{term.to_s}"
|
248
|
+
Jekyll.logger.error("Invalid resource found: #{term.to_s} is not a proper uri")
|
160
249
|
end
|
161
|
-
unless file_name[-1] == '/'
|
162
|
-
file_name += '/'
|
163
|
-
end
|
164
|
-
rescue URI::InvalidURIError #unclean coding: blanknodes are recognized through errors
|
165
|
-
file_name = "rdfsites/blanknode/#{term.to_s}/"
|
166
250
|
end
|
167
251
|
file_name = file_name.gsub('_','_u')
|
168
252
|
file_name = file_name.gsub('//','/') # needs a better regex to include /// ////...
|
@@ -39,8 +39,8 @@ module Jekyll #:nodoc:
|
|
39
39
|
attr_accessor :subClasses
|
40
40
|
attr_accessor :subClassHierarchyValue
|
41
41
|
|
42
|
-
def initialize(term,
|
43
|
-
super(term,
|
42
|
+
def initialize(term, sparql)
|
43
|
+
super(term, sparql)
|
44
44
|
@subClasses = []
|
45
45
|
@lock = -1
|
46
46
|
@subClassHierarchyValue = 0
|
@@ -52,7 +52,13 @@ module Jekyll #:nodoc:
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def findDirectSubClasses
|
55
|
-
|
55
|
+
if(!@term.to_s[0..1].eql? "_:")
|
56
|
+
term_uri = "<#{@term.to_s}>"
|
57
|
+
else
|
58
|
+
term_uri = @term.to_s
|
59
|
+
end
|
60
|
+
query = "SELECT ?s WHERE{ ?s <http://www.w3.org/2000/01/rdf-schema#subClassOf> #{term_uri}}"
|
61
|
+
selection = @sparql.query(query).map{ |solution| solution.s.to_s}
|
56
62
|
return selection
|
57
63
|
end
|
58
64
|
|
@@ -50,12 +50,12 @@ module Jekyll
|
|
50
50
|
# Create a new Jekyll::Drops::RdfStatement
|
51
51
|
#
|
52
52
|
# * +statement+ - The statement to be represented
|
53
|
-
# * +
|
53
|
+
# * +sparql+ - The SPARQL::Client which contains the +statement+
|
54
54
|
# * +site+ - The Jekyll::Site to be enriched
|
55
|
-
def initialize(statement,
|
56
|
-
@subject ||= Jekyll::Drops::RdfTerm.build_term_drop(statement.subject,
|
57
|
-
@predicate ||= Jekyll::Drops::RdfTerm.build_term_drop(statement.predicate,
|
58
|
-
@object ||= Jekyll::Drops::RdfTerm.build_term_drop(statement.object,
|
55
|
+
def initialize(statement, sparql, site)
|
56
|
+
@subject ||= Jekyll::Drops::RdfTerm.build_term_drop(statement.subject, sparql, site)
|
57
|
+
@predicate ||= Jekyll::Drops::RdfTerm.build_term_drop(statement.predicate, sparql, site)
|
58
|
+
@object ||= Jekyll::Drops::RdfTerm.build_term_drop(statement.object, sparql, site)
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|
@@ -37,19 +37,33 @@ module Jekyll
|
|
37
37
|
attr_reader :term
|
38
38
|
|
39
39
|
##
|
40
|
-
# The
|
40
|
+
# The SPARQL::Client which contains the represented +term+
|
41
41
|
#
|
42
|
-
attr_reader :
|
42
|
+
attr_reader :sparql
|
43
43
|
|
44
44
|
##
|
45
45
|
# Create a new Jekyll::Drops::RdfTerm
|
46
46
|
#
|
47
47
|
# * +term+ - The term to be represented
|
48
|
-
# * +
|
48
|
+
# * +sparql+ - The SPARQL::Client which contains the represented +term+
|
49
49
|
#
|
50
|
-
def initialize(term,
|
50
|
+
def initialize(term, sparql)
|
51
51
|
@term ||= term
|
52
|
-
@
|
52
|
+
@sparql ||= sparql
|
53
|
+
end
|
54
|
+
|
55
|
+
##
|
56
|
+
# Funktion stub with no funktionality. Its purpose is to keep RdfResource compatible.
|
57
|
+
#
|
58
|
+
def addNecessities (site, page)
|
59
|
+
return self
|
60
|
+
end
|
61
|
+
|
62
|
+
##
|
63
|
+
# Funktion stub with no funktionality. Its purpose is to keep RdfResource compatible.
|
64
|
+
#
|
65
|
+
def ready?
|
66
|
+
return true;
|
53
67
|
end
|
54
68
|
|
55
69
|
##
|
@@ -66,18 +80,15 @@ module Jekyll
|
|
66
80
|
# Convert an RDF term into a new Jekyll::Drops::RdfTerm
|
67
81
|
#
|
68
82
|
# * +term+ - The term to be represented
|
69
|
-
# * +
|
83
|
+
# * +sparql+ - The SPARQL::Client which contains the represented +term+
|
70
84
|
# * +site+ - The Jekyll::Site to be enriched
|
71
85
|
#
|
72
|
-
def self.build_term_drop(term,
|
86
|
+
def self.build_term_drop(term, sparql, site)
|
73
87
|
case term
|
74
88
|
when RDF::URI, RDF::Node
|
75
|
-
|
76
|
-
resource = site.data['resources'].find{ |r| r.term == term }
|
77
|
-
end
|
78
|
-
resource ? resource : RdfResource.new(term, graph)
|
89
|
+
return RdfResource.new(term, sparql)
|
79
90
|
when RDF::Literal
|
80
|
-
return RdfLiteral.new(term,
|
91
|
+
return RdfLiteral.new(term, sparql)
|
81
92
|
else
|
82
93
|
return nil
|
83
94
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
##
|
2
|
+
# MIT License
|
3
|
+
#
|
4
|
+
# Copyright (c) 2016 Elias Saalmann, Christian Frommert, Simon Jakobi,
|
5
|
+
# Arne Jonas Präger, Maxi Bornmann, Georg Hackel, Eric Füg
|
6
|
+
#
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
+
# of this software and associated documentation files (the "Software"), to deal
|
9
|
+
# in the Software without restriction, including without limitation the rights
|
10
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
+
# copies of the Software, and to permit persons to whom the Software is
|
12
|
+
# furnished to do so, subject to the following conditions:
|
13
|
+
#
|
14
|
+
# The above copyright notice and this permission notice shall be included in all
|
15
|
+
# copies or substantial portions of the Software.
|
16
|
+
#
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
23
|
+
# SOFTWARE.
|
24
|
+
#
|
25
|
+
|
26
|
+
module Jekyll
|
27
|
+
module RdfCollection
|
28
|
+
def rdf_collection(input)
|
29
|
+
if(input.statements_as_subject.any?{ |statement|
|
30
|
+
statement.predicate.to_s.eql? "http://www.w3.org/1999/02/22-rdf-syntax-ns#rest"
|
31
|
+
})
|
32
|
+
finalizedContainer = Set.new #avoid loops
|
33
|
+
nodeSequence = [input.iri]
|
34
|
+
nextSequence = []
|
35
|
+
results = []
|
36
|
+
sparqlClient = input.sparql
|
37
|
+
while(!nodeSequence.empty?)
|
38
|
+
currentContainer = nodeSequence.pop
|
39
|
+
query = "SELECT ?f ?r WHERE{ <#{currentContainer}> <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> ?r. <#{currentContainer}> <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> ?f}"
|
40
|
+
solutions = sparqlClient.query(query).each { |solution|
|
41
|
+
if((!solution.r.to_s.eql? "http://www.w3.org/1999/02/22-rdf-syntax-ns#nil") && (finalizedContainer.add? solution.r))
|
42
|
+
nextSequence.push solution.r.to_s
|
43
|
+
end
|
44
|
+
results.push Jekyll::Drops::RdfTerm.build_term_drop(solution.f, input.sparql, input.site).addNecessities(input.site, input.page)
|
45
|
+
if(nodeSequence.empty?)
|
46
|
+
nodeSequence = nextSequence
|
47
|
+
nextSequence = []
|
48
|
+
end
|
49
|
+
}
|
50
|
+
end
|
51
|
+
return results
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
Liquid::Template.register_filter(Jekyll::RdfCollection)
|
@@ -0,0 +1,51 @@
|
|
1
|
+
##
|
2
|
+
# MIT License
|
3
|
+
#
|
4
|
+
# Copyright (c) 2016 Elias Saalmann, Christian Frommert, Simon Jakobi,
|
5
|
+
# Arne Jonas Präger, Maxi Bornmann, Georg Hackel, Eric Füg
|
6
|
+
#
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
+
# of this software and associated documentation files (the "Software"), to deal
|
9
|
+
# in the Software without restriction, including without limitation the rights
|
10
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
+
# copies of the Software, and to permit persons to whom the Software is
|
12
|
+
# furnished to do so, subject to the following conditions:
|
13
|
+
#
|
14
|
+
# The above copyright notice and this permission notice shall be included in all
|
15
|
+
# copies or substantial portions of the Software.
|
16
|
+
#
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
23
|
+
# SOFTWARE.
|
24
|
+
#
|
25
|
+
|
26
|
+
module Jekyll
|
27
|
+
module RdfContainer
|
28
|
+
include Jekyll::RdfPrefixResolver
|
29
|
+
def rdf_container(input, type = nil)
|
30
|
+
sparqlClient = input.sparql
|
31
|
+
if(!(validContainer?(input, sparqlClient, type)))
|
32
|
+
Jekyll.logger.error "<#{input.iri}> is not recognized as a container"
|
33
|
+
return []
|
34
|
+
end
|
35
|
+
query = "SELECT ?p ?o WHERE{ <#{input.iri}> ?p ?o }"
|
36
|
+
solutions = sparqlClient.query(query).each_with_object([]) {|solution, array|
|
37
|
+
if((solution.p.to_s[0..43].eql? "http://www.w3.org/1999/02/22-rdf-syntax-ns#_") && (solution.p.to_s[44..-1] !~ /\D/))
|
38
|
+
array << Jekyll::Drops::RdfTerm.build_term_drop(solution.o, input.sparql, input.site).addNecessities(input.site, input.page)
|
39
|
+
end
|
40
|
+
}
|
41
|
+
return solutions
|
42
|
+
end
|
43
|
+
def validContainer?(input, sparqlClient, type = nil)
|
44
|
+
askQuery1 = "ASK WHERE {VALUES ?o {<http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq> <http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag> <http://www.w3.org/1999/02/22-rdf-syntax-ns#Alt>} <#{input.iri}> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?o}"
|
45
|
+
askQuery2 = "ASK WHERE {<#{input.iri}> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?o. ?o <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Container>}"
|
46
|
+
return (sparqlClient.query(askQuery1).true?) || (sparqlClient.query(askQuery2).true?)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
Liquid::Template.register_filter(Jekyll::RdfContainer)
|
@@ -29,6 +29,7 @@ module Jekyll
|
|
29
29
|
# Internal module to hold the medthod #rdf_property
|
30
30
|
#
|
31
31
|
module RdfProperty
|
32
|
+
include Jekyll::RdfPrefixResolver
|
32
33
|
##
|
33
34
|
# Computes all objects for which statements exist containing the given subject and predicate and returns any of them
|
34
35
|
#
|
@@ -38,51 +39,88 @@ module Jekyll
|
|
38
39
|
# * +list+ - (optional) decides the format of the return value. If set to true it returns an array, otherwise it returns a singleton String containing a URI.
|
39
40
|
#
|
40
41
|
def rdf_property(input, predicate, lang = nil, list = false)
|
42
|
+
return map_predicate(input, predicate, lang, list)
|
43
|
+
end
|
44
|
+
|
45
|
+
def rdf_inverse_property(input, predicate, lang = nil, list = false)
|
46
|
+
return map_predicate(input, predicate, lang, list, true)
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
def map_predicate(input, predicate, lang = nil, list = false, inverse = false)
|
41
51
|
return input unless input.is_a?(Jekyll::Drops::RdfResource)
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
result = result.select{ |s|
|
50
|
-
if(s.object.term.is_a?(RDF::Literal))
|
51
|
-
s.object.term.language == lang.to_sym
|
52
|
-
else
|
53
|
-
false
|
54
|
-
end
|
55
|
-
}
|
56
|
-
end
|
57
|
-
return unless !result.empty?
|
58
|
-
if(list)
|
59
|
-
return result.map{|p|
|
60
|
-
p.object.to_s
|
61
|
-
}
|
62
|
-
else
|
63
|
-
return (result.first.object).to_s
|
64
|
-
end
|
52
|
+
predicate = rdf_resolve_prefix(input, predicate)
|
53
|
+
result = filter_statements(input, predicate, inverse, lang)
|
54
|
+
return unless !result.empty?
|
55
|
+
if(list)
|
56
|
+
return result
|
57
|
+
else
|
58
|
+
return result.first
|
65
59
|
end
|
66
60
|
end
|
67
61
|
|
68
62
|
private
|
69
|
-
def
|
70
|
-
|
71
|
-
|
63
|
+
def filter_statements(input, predicate, inverse = false, lang = nil)
|
64
|
+
client = input.sparql
|
65
|
+
query = ""
|
66
|
+
if (lang.eql? 'cfg')
|
67
|
+
lang_query = "FILTER(lang(?o) = '#{input.site.config['jekyll_rdf']['language']}')"
|
68
|
+
elsif lang.nil?
|
69
|
+
lang_query = ""
|
70
|
+
else
|
71
|
+
lang_query = "FILTER(lang(?o) = '#{lang}')"
|
72
72
|
end
|
73
|
-
|
74
|
-
if(
|
75
|
-
|
73
|
+
|
74
|
+
if(!input.to_s[0..1].eql? "_:")
|
75
|
+
input_uri = "<#{input.to_s}>"
|
76
|
+
else
|
77
|
+
input_uri = input.to_s
|
76
78
|
end
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
79
|
+
|
80
|
+
if(inverse)
|
81
|
+
query = "SELECT ?s WHERE{ ?s <#{predicate}> #{input_uri} }"
|
82
|
+
result = client.query(query).map do |solution|
|
83
|
+
subject = RDF::URI(solution.s)
|
84
|
+
Jekyll::Drops::RdfResource.new(subject, input.sparql, input.site, input.page)
|
82
85
|
end
|
83
86
|
else
|
84
|
-
|
87
|
+
query = "SELECT ?o ?dt ?lit ?lang WHERE{ #{input_uri} <#{predicate}> ?o BIND(datatype(?o) AS ?dt) BIND(isLiteral(?o) AS ?lit) BIND(lang(?o) AS ?lang) #{lang_query} }"
|
88
|
+
result = client.query(query).map do |solution|
|
89
|
+
dist_literal_resource(input, solution)
|
90
|
+
end
|
85
91
|
end
|
92
|
+
return result
|
93
|
+
end
|
94
|
+
|
95
|
+
##
|
96
|
+
# Distinguishes the solution between an Literal and a Resource
|
97
|
+
#
|
98
|
+
private
|
99
|
+
def dist_literal_resource(input, solution)
|
100
|
+
if solution.lit.true?
|
101
|
+
check = check_solution(solution)
|
102
|
+
object = RDF::Literal(solution.o, language: check[:lang], datatype: RDF::URI(check[:dataType]))
|
103
|
+
result = Jekyll::Drops::RdfLiteral.new(object, input.sparql)
|
104
|
+
else
|
105
|
+
object = RDF::URI(solution.o)
|
106
|
+
result = Jekyll::Drops::RdfResource.new(object, input.sparql, input.site, input.page)
|
107
|
+
end
|
108
|
+
return result
|
109
|
+
end
|
110
|
+
|
111
|
+
##
|
112
|
+
# check what language and datatype the passed literal has
|
113
|
+
#
|
114
|
+
private
|
115
|
+
def check_solution(solution)
|
116
|
+
result = {:lang => nil, :dataType => nil}
|
117
|
+
if((solution.bound?(:lang)) && (!solution.lang.to_s.eql?("")))
|
118
|
+
result[:lang] = solution.lang.to_s.to_sym
|
119
|
+
end
|
120
|
+
if(solution.bound? :dt)
|
121
|
+
result[:dataType] = solution.dt
|
122
|
+
end
|
123
|
+
return result
|
86
124
|
end
|
87
125
|
end
|
88
126
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
##
|
2
|
+
# MIT License
|
3
|
+
#
|
4
|
+
# Copyright (c) 2016 Elias Saalmann, Christian Frommert, Simon Jakobi,
|
5
|
+
# Arne Jonas Präger, Maxi Bornmann, Georg Hackel, Eric Füg
|
6
|
+
#
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
+
# of this software and associated documentation files (the "Software"), to deal
|
9
|
+
# in the Software without restriction, including without limitation the rights
|
10
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
+
# copies of the Software, and to permit persons to whom the Software is
|
12
|
+
# furnished to do so, subject to the following conditions:
|
13
|
+
#
|
14
|
+
# The above copyright notice and this permission notice shall be included in all
|
15
|
+
# copies or substantial portions of the Software.
|
16
|
+
#
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
23
|
+
# SOFTWARE.
|
24
|
+
#
|
25
|
+
|
26
|
+
module Jekyll
|
27
|
+
module RdfPrefixResolver
|
28
|
+
private
|
29
|
+
def rdf_resolve_prefix(input, predicate)
|
30
|
+
if(predicate[0] == "<" && predicate[-1] == ">")
|
31
|
+
return predicate[1..-2]
|
32
|
+
end
|
33
|
+
arr=predicate.split(":",2) #bad regex, would also devide 'http://example....' into 'http' and '//example....',even though it is already a complete URI; if 'PREFIX http: <http://...> is defined, 'http' in 'http://example....' could be mistaken for a prefix
|
34
|
+
if((arr[1].include? (":")) || (arr[1][0..1].eql?("//")))
|
35
|
+
raise UnMarkedUri.new(predicate, input.page.data['template'])
|
36
|
+
end
|
37
|
+
if(!input.page.data["rdf_prefixes"].nil?)
|
38
|
+
if(!input.page.data["rdf_prefix_map"][arr[0]].nil?)
|
39
|
+
return arr[1].prepend(input.page.data["rdf_prefix_map"][arr[0]])
|
40
|
+
else
|
41
|
+
raise NoPrefixMapped.new(predicate, input.page.data['template'], arr[0])
|
42
|
+
end
|
43
|
+
else
|
44
|
+
raise NoPrefixesDefined.new(predicate, input.page.data['template'])
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -44,10 +44,9 @@ module Jekyll
|
|
44
44
|
query = query.prepend(" ").prepend(input.page.data["rdf_prefixes"])
|
45
45
|
end
|
46
46
|
begin
|
47
|
-
input.
|
48
|
-
|
49
|
-
hsh
|
50
|
-
hsh.update(hsh){ |k,v| Jekyll::Drops::RdfTerm.build_term_drop(v, input.graph, input.site) }
|
47
|
+
result = input.sparql.query(query).map do |solution|
|
48
|
+
hsh = solution.to_h
|
49
|
+
hsh.update(hsh){ |k,v| Jekyll::Drops::RdfTerm.build_term_drop(v, input.sparql, input.site).addNecessities(input.site, input.page)}
|
51
50
|
hsh.collect{|k,v| [k.to_s, v]}.to_h
|
52
51
|
end
|
53
52
|
return result
|
@@ -56,7 +55,7 @@ module Jekyll
|
|
56
55
|
rescue SPARQL::MalformedQuery => mq
|
57
56
|
Jekyll.logger.error("malformed query found: \n #{query} \n Error Message: #{mq.message}")
|
58
57
|
rescue Exception => e
|
59
|
-
Jekyll.logger.error("unknown Exception of class: #{e.class} in sparql_query \n Query: #{query} \nMessage: #{e.message}")
|
58
|
+
Jekyll.logger.error("unknown Exception of class: #{e.class} in sparql_query \n Query: #{query} \nMessage: #{e.message} \nTrace #{e.backtrace.drop(1).map{|s| "\t#{s}"}.join("\n")}")
|
60
59
|
end
|
61
60
|
return []
|
62
61
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module RdfClassExtraction
|
3
|
+
private
|
4
|
+
def search_for_classes(sparql)
|
5
|
+
class_recognition_query = "SELECT DISTINCT ?resourceUri WHERE{ {?resourceUri <http://www.w3.org/2000/01/rdf-schema#subClassOf> ?o} UNION{ ?s <http://www.w3.org/2000/01/rdf-schema#subClassOf> ?resourceUri} UNION{ ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?resourceUri}}"
|
6
|
+
class_search_results = sparql.query(class_recognition_query).map{ |sol| sol[:resourceUri] }.reject do |s| # Reject literals
|
7
|
+
s.class <= RDF::Literal
|
8
|
+
end.select do |s| # Select URIs and blank nodes in case of include_blank
|
9
|
+
s.class <=RDF::Node || s.class <= RDF::URI
|
10
|
+
end
|
11
|
+
return class_search_results
|
12
|
+
end
|
13
|
+
|
14
|
+
def create_resource_class(class_search_results, sparql)
|
15
|
+
class_search_results.each do |uri|
|
16
|
+
@classResources[uri.to_s]=Jekyll::Drops::RdfResourceClass.new(uri, sparql)
|
17
|
+
end
|
18
|
+
|
19
|
+
@classResources.each{|key, value|
|
20
|
+
value.findDirectSubClasses.each{|s|
|
21
|
+
value.addSubClass(@classResources[s])
|
22
|
+
}
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def assign_class_templates(classes_to_templates)
|
27
|
+
if(classes_to_templates.is_a?(Hash))
|
28
|
+
classes_to_templates.each{|key, value|
|
29
|
+
@classResources[key].propagateTemplate(value,0)
|
30
|
+
@classResources[key].traverseHierarchyValue(0);
|
31
|
+
}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module RdfGeneratorHelper
|
3
|
+
private
|
4
|
+
def prepare_pages (site, mapper)
|
5
|
+
@pageResources.each{|uri, entry|
|
6
|
+
if(entry['./'].nil?)
|
7
|
+
if(@config['render_orphaned_uris'])
|
8
|
+
entry.each{|name, resource|
|
9
|
+
createPage(site, resource, mapper, @global_config)
|
10
|
+
}
|
11
|
+
end
|
12
|
+
else
|
13
|
+
resource = entry.delete('./')
|
14
|
+
resource.subResources = entry
|
15
|
+
createPage(site, resource, mapper, @global_config)
|
16
|
+
end
|
17
|
+
}
|
18
|
+
|
19
|
+
@blanknodes.each{|resource|
|
20
|
+
createPage(site, resource, mapper, @global_config)
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
def parse_resources (resources, sparql)
|
25
|
+
@pageResources={};
|
26
|
+
@blanknodes=[]
|
27
|
+
resources.each do |uri|
|
28
|
+
resource = Jekyll::Drops::RdfResource.new(uri, sparql)
|
29
|
+
if(uri.instance_of? RDF::URI)
|
30
|
+
uriString = uri.to_s
|
31
|
+
if((uriString.include? "#") && (uriString.index("#") < (uriString.length - 1))) #sorting in uris with a #
|
32
|
+
preSufUri = uriString.split("#")
|
33
|
+
if(!@pageResources.key? preSufUri[0])
|
34
|
+
@pageResources[preSufUri[0]] = {}
|
35
|
+
end
|
36
|
+
@pageResources[preSufUri[0]][preSufUri[1]] = resource
|
37
|
+
else #sorting in uris without a #
|
38
|
+
if(!@pageResources.key? uriString)
|
39
|
+
@pageResources[uriString]={}
|
40
|
+
end
|
41
|
+
@pageResources[uriString]['./'] = resource
|
42
|
+
end
|
43
|
+
elsif(uri.instance_of? RDF::Node)
|
44
|
+
@blanknodes << resource
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def load_config (site)
|
50
|
+
begin
|
51
|
+
@config = site.config.fetch('jekyll_rdf')
|
52
|
+
rescue KeyError => e
|
53
|
+
Jekyll.logger.error("You've included Jekyll-RDF, but it is not configured. Aborting the jekyll-rdf plugin.")
|
54
|
+
return false
|
55
|
+
end
|
56
|
+
|
57
|
+
@global_config = Jekyll.configuration({})
|
58
|
+
|
59
|
+
#small fix because global_config doesn't work in a test enviorment
|
60
|
+
if(!@global_config.key? "url")
|
61
|
+
@global_config["url"] = site.config["url"]
|
62
|
+
@global_config["baseurl"] = site.config["baseurl"]
|
63
|
+
end
|
64
|
+
return true
|
65
|
+
end
|
66
|
+
##
|
67
|
+
# #extract_resources returns resources from an RDF Sparql endpoint.
|
68
|
+
#
|
69
|
+
# Literals are omitted.
|
70
|
+
# Blank nodes are only returned if +include_blank+ is true.
|
71
|
+
# Duplicate nodes are removed.
|
72
|
+
#
|
73
|
+
# * +selection+ - choose any of the following:
|
74
|
+
# nil ::
|
75
|
+
# no restrictions, return subjects, predicates, objects
|
76
|
+
# "subjects" ::
|
77
|
+
# return only subjects
|
78
|
+
# "predicates" ::
|
79
|
+
# return only predicates
|
80
|
+
# "objects" ::
|
81
|
+
# return only objects
|
82
|
+
# Otherwise ::
|
83
|
+
# consider +selection+ to be a SPARQL query and return answer set to this SPARQL query
|
84
|
+
# * +include_blank+ - If true, blank nodes are also returned, otherwise blank nodes are omitted
|
85
|
+
# * +sparql+ - The SPARQL client to run queries against
|
86
|
+
#
|
87
|
+
def extract_resources(selection, include_blank, sparql)
|
88
|
+
|
89
|
+
case selection
|
90
|
+
when nil # Config parameter not present
|
91
|
+
object_resources = extract_resources("objects", include_blank, sparql)
|
92
|
+
subject_resources = extract_resources("subjects", include_blank, sparql)
|
93
|
+
predicate_resources = extract_resources("predicates", include_blank, sparql)
|
94
|
+
return object_resources.concat(subject_resources).concat(predicate_resources).uniq
|
95
|
+
when "objects"
|
96
|
+
query = "SELECT ?resourceUri WHERE{?s ?p ?resourceUri}"
|
97
|
+
when "subjects"
|
98
|
+
query = "SELECT ?resourceUri WHERE{?resourceUri ?p ?o}"
|
99
|
+
when "predicates"
|
100
|
+
query = "SELECT ?resourceUri WHERE{?s ?resourceUri ?o}"
|
101
|
+
else
|
102
|
+
# Custom query
|
103
|
+
query = selection
|
104
|
+
end
|
105
|
+
sparql.query(query).map{ |sol| sol[:resourceUri] }.reject do |s| # Reject literals
|
106
|
+
s.class <= RDF::Literal
|
107
|
+
end.select do |s| # Select URIs and blank nodes in case of include_blank
|
108
|
+
include_blank || s.class == RDF::URI
|
109
|
+
end.uniq
|
110
|
+
end
|
111
|
+
|
112
|
+
def createPage(site, resource, mapper, global_config)
|
113
|
+
page = RdfPageData.new(site, site.source, resource, mapper, global_config)
|
114
|
+
if(page.complete)
|
115
|
+
site.pages << page
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -32,6 +32,7 @@ module Jekyll
|
|
32
32
|
class RdfMainGenerator < Jekyll::Generator
|
33
33
|
safe true
|
34
34
|
priority :highest
|
35
|
+
include Jekyll::RdfGeneratorHelper
|
35
36
|
|
36
37
|
##
|
37
38
|
# #generate performs the enrichment of a Jekyll::Site with rdf triples
|
@@ -40,127 +41,28 @@ module Jekyll
|
|
40
41
|
#
|
41
42
|
def generate(site)
|
42
43
|
|
43
|
-
|
44
|
-
|
45
|
-
rescue Exception
|
46
|
-
Jekyll.logger.error("You've included Jekyll-RDF, but it is not configured. Aborting the jekyll-rdf plugin.")
|
47
|
-
return
|
44
|
+
if(!load_config(site))
|
45
|
+
return false#in case of error, exit routine
|
48
46
|
end
|
49
|
-
|
50
|
-
global_config = Jekyll.configuration({})
|
51
|
-
|
52
|
-
#small fix because global_config doesn't work in a test enviorment
|
53
|
-
if(!global_config.key? "url")
|
54
|
-
global_config["url"] = site.config["url"]
|
55
|
-
global_config["baseurl"] = site.config["baseurl"]
|
56
|
-
end
|
57
|
-
|
58
|
-
if(config.key? "template_mapping")
|
47
|
+
if(@config.key? "template_mapping")
|
59
48
|
Jekyll.logger.error("Outdated format in _config.yml:\n 'template_mapping' detected but the following keys must be used now instead:\n instance_template_mappings -> maps single resources to single layouts\n class_template_mappings -> maps entire classes of resources to layouts\nJekyll-RDF wont render any pages for #{site.source}")
|
60
|
-
return
|
49
|
+
return false
|
61
50
|
end
|
62
51
|
|
63
|
-
graph = RDF::Graph.load(config['path'])
|
52
|
+
graph = RDF::Graph.load(@config['path'])
|
64
53
|
sparql = SPARQL::Client.new(graph)
|
65
54
|
|
66
55
|
# restrict RDF graph with restriction
|
67
|
-
resources = extract_resources(config['restriction'], config['include_blank'],
|
68
|
-
|
56
|
+
resources = extract_resources(@config['restriction'], @config['include_blank'], sparql)
|
69
57
|
site.data['sparql'] = sparql
|
70
58
|
site.data['resources'] = []
|
71
59
|
|
72
|
-
|
73
|
-
pageResources={};
|
74
|
-
blanknodes=[]
|
75
|
-
resources.each do |uri|
|
76
|
-
resource = Jekyll::Drops::RdfResource.new(uri, graph)
|
77
|
-
if(uri.instance_of? RDF::URI)
|
78
|
-
uriString = uri.to_s
|
79
|
-
if((uriString.include? "#") && (uriString.index("#") < (uriString.length - 1))) #sorting in uris with a #
|
80
|
-
preSufUri = uriString.split("#")
|
81
|
-
if(!pageResources.key? preSufUri[0])
|
82
|
-
pageResources[preSufUri[0]] = {}
|
83
|
-
end
|
84
|
-
pageResources[preSufUri[0]][preSufUri[1]] = resource
|
85
|
-
elsif #sorting in uris without a #
|
86
|
-
if(!pageResources.key? uriString)
|
87
|
-
pageResources[uriString]={}
|
88
|
-
end
|
89
|
-
pageResources[uriString]['./'] = resource
|
90
|
-
end
|
91
|
-
elsif(uri.instance_of? RDF::Node)
|
92
|
-
blanknodes << resource
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
mapper = Jekyll::RdfTemplateMapper.new(config['instance_template_mappings'], config['class_template_mappings'], config['default_template'], graph, sparql)
|
97
|
-
|
98
|
-
# create RDF pages for each URI
|
99
|
-
pageResources.each{|uri, entry|
|
100
|
-
if(entry['./'].nil?)
|
101
|
-
if(config['render_orphaned_uris'])
|
102
|
-
entry.each{|name, resource|
|
103
|
-
site.pages << RdfPageData.new(site, site.source, resource, mapper, global_config)
|
104
|
-
}
|
105
|
-
end
|
106
|
-
else
|
107
|
-
resource = entry.delete('./')
|
108
|
-
resource.subResources = entry
|
109
|
-
site.pages << RdfPageData.new(site, site.source, resource, mapper, global_config)
|
110
|
-
end
|
111
|
-
}
|
60
|
+
parse_resources(resources, sparql)
|
112
61
|
|
113
|
-
|
114
|
-
site.pages << RdfPageData.new(site, site.source, resource, mapper, global_config)
|
115
|
-
}
|
116
|
-
end
|
117
|
-
|
118
|
-
##
|
119
|
-
# #extract_resources returns resources from an RDF graph.
|
120
|
-
#
|
121
|
-
# Literals are omitted.
|
122
|
-
# Blank nodes are only returned if +include_blank+ is true.
|
123
|
-
# Duplicate nodes are removed.
|
124
|
-
#
|
125
|
-
# * +selection+ - choose any of the following:
|
126
|
-
# nil ::
|
127
|
-
# no restrictions, return subjects, predicates, objects
|
128
|
-
# "subjects" ::
|
129
|
-
# return only subjects
|
130
|
-
# "predicates" ::
|
131
|
-
# return only predicates
|
132
|
-
# "objects" ::
|
133
|
-
# return only objects
|
134
|
-
# Otherwise ::
|
135
|
-
# consider +selection+ to be a SPARQL query and return answer set to this SPARQL query
|
136
|
-
# * +include_blank+ - If true, blank nodes are also returned, otherwise blank nodes are omitted
|
137
|
-
# * +graph+ - The RDF graph to restrict
|
138
|
-
# * +sparql+ - The SPARQL client to run queries against
|
139
|
-
#
|
140
|
-
def extract_resources(selection, include_blank, graph, sparql)
|
62
|
+
mapper = Jekyll::RdfTemplateMapper.new(@config['instance_template_mappings'], @config['class_template_mappings'], @config['default_template'], sparql)
|
141
63
|
|
142
|
-
|
143
|
-
|
144
|
-
object_resources = extract_resources("objects", include_blank, graph, sparql)
|
145
|
-
subject_resources = extract_resources("subjects", include_blank, graph, sparql)
|
146
|
-
predicate_resources = extract_resources("predicates", include_blank, graph, sparql)
|
147
|
-
return object_resources.concat(subject_resources).concat(predicate_resources).uniq
|
148
|
-
when "objects"
|
149
|
-
graph.objects
|
150
|
-
when "subjects"
|
151
|
-
graph.subjects
|
152
|
-
when "predicates"
|
153
|
-
graph.predicates
|
154
|
-
else
|
155
|
-
# Custom query
|
156
|
-
sparql.query(selection).map{ |sol| sol[:resourceUri] }
|
157
|
-
end.reject do |s| # Reject literals
|
158
|
-
s.class <= RDF::Literal
|
159
|
-
end.select do |s| # Select URIs and blank nodes in case of include_blank
|
160
|
-
include_blank || s.class == RDF::URI
|
161
|
-
end.uniq
|
64
|
+
prepare_pages(site, mapper)
|
65
|
+
return true
|
162
66
|
end
|
163
|
-
|
164
67
|
end
|
165
|
-
|
166
68
|
end
|
data/lib/jekyll/rdf_page_data.rb
CHANGED
@@ -29,6 +29,8 @@ module Jekyll
|
|
29
29
|
# JekyllRdf::RdfPageData creates pages for each RDF resource using a given template
|
30
30
|
#
|
31
31
|
class RdfPageData < Jekyll::Page
|
32
|
+
include Jekyll::RdfPageHelper
|
33
|
+
attr_reader :complete
|
32
34
|
|
33
35
|
##
|
34
36
|
# initialize initializes the page
|
@@ -42,37 +44,24 @@ module Jekyll
|
|
42
44
|
@base = base
|
43
45
|
@dir = ""
|
44
46
|
@name = resource.filename(URI::split(config['url'])[2], config['baseurl'])
|
47
|
+
@resource = resource
|
48
|
+
if(base.nil?)
|
49
|
+
Jekyll.logger.warn "Resource #{resource} not rendered: no base url found."
|
50
|
+
@complete = false #TODO: set a return here and adapt the test for displaying a warning for rendering a page without template
|
51
|
+
else
|
52
|
+
@complete = true
|
53
|
+
end
|
45
54
|
self.process(@name)
|
55
|
+
map_template(resource, mapper)
|
46
56
|
|
47
|
-
|
48
|
-
|
49
|
-
self.data['title'] = resource.iri
|
50
|
-
self.data['rdf'] = resource
|
51
|
-
self.data['template'] = template
|
52
|
-
if(!resource.subResources.nil?)
|
53
|
-
self.data['sub_rdf'] = resource.subResources.values
|
54
|
-
self.data['sub_rdf'].each { |res|
|
55
|
-
res.page = self
|
56
|
-
res.site = site
|
57
|
-
}
|
58
|
-
end
|
59
|
-
if !self.data["rdf_prefix_path"].nil?
|
60
|
-
begin
|
61
|
-
prefixFile=File.new(File.join(base, 'rdf-data', self.data["rdf_prefix_path"].strip)).readlines
|
62
|
-
self.data["rdf_prefixes"] = prefixFile.join(" ")
|
63
|
-
self.data["rdf_prefix_map"] = Hash[ *(prefixFile.collect { |v|
|
64
|
-
arr = v.split(":",2)
|
65
|
-
[arr[0][7..-1].strip, arr[1].strip[1..-2]]
|
66
|
-
}.flatten)]
|
67
|
-
rescue Errno::ENOENT => ex
|
68
|
-
Jekyll.logger.error("context: #{resource} template: #{template} file not found: #{File.join(base, 'rdf-data', self.data["rdf_prefix_path"])}")
|
69
|
-
end
|
57
|
+
if(!@complete)
|
58
|
+
return #return if something went wrong
|
70
59
|
end
|
60
|
+
load_data(site)
|
61
|
+
load_prefixes()
|
71
62
|
resource.page = self
|
72
63
|
resource.site = site
|
73
64
|
site.data['resources'] << resource
|
74
65
|
end
|
75
|
-
|
76
66
|
end
|
77
|
-
|
78
|
-
end
|
67
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module RdfPageHelper
|
3
|
+
private
|
4
|
+
##
|
5
|
+
# sets @template to the path of a fitting layout
|
6
|
+
# it will set @complete to false if no fitting template is found
|
7
|
+
# * +resource+ - the resource that will be mapped to a template
|
8
|
+
# * +mapper+ - the mapper that provides the resource mappings
|
9
|
+
def map_template(resource, mapper)
|
10
|
+
@template = mapper.map(resource)
|
11
|
+
if(@template.nil?)
|
12
|
+
Jekyll.logger.warn("Resource #{resource} not rendered: No fitting template or default template found.")
|
13
|
+
@complete = false
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
##
|
18
|
+
# loads the data from the yaml-frontmatter and extends page.data with three key value pairs:
|
19
|
+
# -title -> contains the resource.iri
|
20
|
+
# -rdf -> contains the resource itself
|
21
|
+
# -template -> contains the path to the currenly used template
|
22
|
+
def load_data(site)
|
23
|
+
self.read_yaml(File.join(@base, '_layouts'), @template)
|
24
|
+
self.data['title'] = @resource.iri
|
25
|
+
self.data['rdf'] = @resource
|
26
|
+
self.data['template'] = @template
|
27
|
+
if(!@resource.subResources.nil?)
|
28
|
+
self.data['sub_rdf'] = @resource.subResources.values
|
29
|
+
self.data['sub_rdf'].each { |res|
|
30
|
+
res.page = self
|
31
|
+
res.site = site
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
##
|
37
|
+
# loads the prefix data passed in the layout yaml-frontmatter into page.data["rdf_prefixes"] and page.data["rdf_prefix_map"]
|
38
|
+
def load_prefixes
|
39
|
+
if !self.data["rdf_prefix_path"].nil?
|
40
|
+
begin
|
41
|
+
prefixFile=File.new(File.join(@base, 'rdf-data', self.data["rdf_prefix_path"].strip)).readlines
|
42
|
+
self.data["rdf_prefixes"] = prefixFile.join(" ")
|
43
|
+
self.data["rdf_prefix_map"] = Hash[ *(prefixFile.collect { |v|
|
44
|
+
arr = v.split(":",2)
|
45
|
+
[arr[0][7..-1].strip, arr[1].strip[1..-2]]
|
46
|
+
}.flatten)]
|
47
|
+
rescue Errno::ENOENT => ex
|
48
|
+
Jekyll.logger.error("context: #{@resource} template: #{@template} file not found: #{File.join(@base, 'rdf-data', self.data["rdf_prefix_path"])}")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
@@ -44,40 +44,20 @@ module Jekyll
|
|
44
44
|
|
45
45
|
attr_accessor :classResources
|
46
46
|
|
47
|
+
include Jekyll::RdfClassExtraction
|
48
|
+
|
47
49
|
##
|
48
50
|
# Create a new Jekyll::RdfTemplateMapper
|
49
51
|
#
|
50
52
|
# * +resources_to_templates+ - A Hash mapping a type resource to a template name
|
51
53
|
# * +default_template+ - Default template name
|
52
|
-
def initialize(resources_to_templates, classes_to_templates, default_template,
|
54
|
+
def initialize(resources_to_templates, classes_to_templates, default_template, sparql)
|
53
55
|
@resources_to_templates = resources_to_templates
|
54
56
|
@default_template = default_template
|
55
57
|
@classes_to_templates = classes_to_templates
|
56
|
-
|
57
58
|
@classResources = {}
|
58
|
-
|
59
|
-
|
60
|
-
s.class <= RDF::Literal
|
61
|
-
end.select do |s| # Select URIs and blank nodes in case of include_blank
|
62
|
-
true || s.class == RDF::URI
|
63
|
-
end
|
64
|
-
|
65
|
-
classSearchResults.each do |uri|
|
66
|
-
classResources[uri.to_s]=Jekyll::Drops::RdfResourceClass.new(uri, graph)
|
67
|
-
end
|
68
|
-
|
69
|
-
classResources.each{|key, value|
|
70
|
-
value.findDirectSubClasses.each{|s|
|
71
|
-
value.addSubClass(classResources[s.subject.term.to_s])
|
72
|
-
}
|
73
|
-
}
|
74
|
-
|
75
|
-
if(classes_to_templates.is_a?(Hash))
|
76
|
-
classes_to_templates.each{|key, value|
|
77
|
-
classResources[key].propagateTemplate(value,0)
|
78
|
-
classResources[key].traverseHierarchyValue(0);
|
79
|
-
}
|
80
|
-
end
|
59
|
+
create_resource_class(search_for_classes(sparql), sparql)
|
60
|
+
assign_class_templates(classes_to_templates)
|
81
61
|
end
|
82
62
|
|
83
63
|
##
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-rdf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.1.0.alpha.pre.171
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elias Saalmann
|
@@ -16,7 +16,7 @@ authors:
|
|
16
16
|
autorequire:
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
|
-
date: 2017-03
|
19
|
+
date: 2017-07-03 00:00:00.000000000 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
name: linkeddata
|
@@ -24,28 +24,28 @@ dependencies:
|
|
24
24
|
requirements:
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: '
|
27
|
+
version: '2.0'
|
28
28
|
type: :runtime
|
29
29
|
prerelease: false
|
30
30
|
version_requirements: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
32
|
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: '
|
34
|
+
version: '2.0'
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: sparql
|
37
37
|
requirement: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: '
|
41
|
+
version: '2.2'
|
42
42
|
type: :runtime
|
43
43
|
prerelease: false
|
44
44
|
version_requirements: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: '
|
48
|
+
version: '2.2'
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
50
|
name: jekyll
|
51
51
|
requirement: !ruby/object:Gem::Requirement
|
@@ -67,7 +67,7 @@ dependencies:
|
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '10.4'
|
70
|
-
type: :
|
70
|
+
type: :development
|
71
71
|
prerelease: false
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
@@ -81,7 +81,7 @@ dependencies:
|
|
81
81
|
- - "~>"
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: '0.8'
|
84
|
-
type: :
|
84
|
+
type: :development
|
85
85
|
prerelease: false
|
86
86
|
version_requirements: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
@@ -95,7 +95,7 @@ dependencies:
|
|
95
95
|
- - "~>"
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: '3.0'
|
98
|
-
type: :
|
98
|
+
type: :development
|
99
99
|
prerelease: false
|
100
100
|
version_requirements: !ruby/object:Gem::Requirement
|
101
101
|
requirements:
|
@@ -109,7 +109,7 @@ dependencies:
|
|
109
109
|
- - "~>"
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '1.1'
|
112
|
-
type: :
|
112
|
+
type: :development
|
113
113
|
prerelease: false
|
114
114
|
version_requirements: !ruby/object:Gem::Requirement
|
115
115
|
requirements:
|
@@ -159,10 +159,16 @@ files:
|
|
159
159
|
- lib/jekyll/exceptions/NoPrefixMapped.rb
|
160
160
|
- lib/jekyll/exceptions/NoPrefixesDefined.rb
|
161
161
|
- lib/jekyll/exceptions/UnMarkedUri.rb
|
162
|
+
- lib/jekyll/filters/rdf_collection.rb
|
163
|
+
- lib/jekyll/filters/rdf_container.rb
|
162
164
|
- lib/jekyll/filters/rdf_property.rb
|
165
|
+
- lib/jekyll/filters/rdf_resolve_prefix.rb
|
163
166
|
- lib/jekyll/filters/rdf_sparql_query.rb
|
167
|
+
- lib/jekyll/rdf_class_extraction.rb
|
168
|
+
- lib/jekyll/rdf_generator_helper.rb
|
164
169
|
- lib/jekyll/rdf_main_generator.rb
|
165
170
|
- lib/jekyll/rdf_page_data.rb
|
171
|
+
- lib/jekyll/rdf_page_helper.rb
|
166
172
|
- lib/jekyll/rdf_template_mapper.rb
|
167
173
|
homepage: https://github.com/white-gecko/jekyll-rdf
|
168
174
|
licenses:
|
@@ -179,13 +185,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
179
185
|
version: '0'
|
180
186
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
181
187
|
requirements:
|
182
|
-
- - "
|
188
|
+
- - ">"
|
183
189
|
- !ruby/object:Gem::Version
|
184
|
-
version:
|
190
|
+
version: 1.3.1
|
185
191
|
requirements: []
|
186
192
|
rubyforge_project:
|
187
|
-
rubygems_version: 2.
|
193
|
+
rubygems_version: 2.6.12
|
188
194
|
signing_key:
|
189
195
|
specification_version: 4
|
190
|
-
summary: Hypertext Publication System for
|
196
|
+
summary: Hypertext Publication System for Templated Resource Rendering
|
191
197
|
test_files: []
|