jekyll-rdf 1.1.1 → 2.0.0
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/jekyll-rdf.rb +4 -2
- data/lib/jekyll/drops/rdf_literal.rb +1 -1
- data/lib/jekyll/drops/rdf_resource.rb +43 -52
- data/lib/jekyll/drops/rdf_resource_class.rb +83 -0
- data/lib/jekyll/drops/rdf_term.rb +5 -2
- data/lib/jekyll/exceptions/NoPrefixMapped.rb +7 -0
- data/lib/jekyll/exceptions/NoPrefixesDefined.rb +5 -0
- data/lib/jekyll/exceptions/UnMarkedUri.rb +5 -0
- data/lib/jekyll/filters/rdf_property.rb +43 -10
- data/lib/jekyll/filters/rdf_sparql_query.rb +11 -0
- data/lib/jekyll/rdf_main_generator.rb +61 -5
- data/lib/jekyll/rdf_page_data.rb +23 -5
- data/lib/jekyll/rdf_template_mapper.rb +64 -6
- metadata +13 -8
- data/lib/jekyll/filters/rdf_property_list.rb +0 -58
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb995c6b66f94be8fafd3b78c74a8bb82858c35f
|
4
|
+
data.tar.gz: 97ad76c5961a904d35919cab1e52ad81fe21aef1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a4a626bbd804965f6e5259750ee6458ef9250cbe79f7d5b5cb7f94952b701b73bd7496ffed8296e825f2db68abd42ccfba16d5eed511d5b787d13438fcf68fbf
|
7
|
+
data.tar.gz: e772f781b9ff347c466baa0caa8848d832ce898415feca39d95c63066e7c7567973cdb7f98b21ff83e90dbbcc1407abca6f9b8420c7b0456892b1f450e8dfca3
|
data/lib/jekyll-rdf.rb
CHANGED
@@ -30,14 +30,16 @@ require 'jekyll'
|
|
30
30
|
require 'linkeddata'
|
31
31
|
require 'sparql'
|
32
32
|
|
33
|
-
|
34
33
|
require 'jekyll/drops/rdf_term'
|
35
34
|
require 'jekyll/drops/rdf_statement'
|
36
35
|
require 'jekyll/drops/rdf_literal'
|
37
36
|
require 'jekyll/drops/rdf_resource'
|
37
|
+
require 'jekyll/drops/rdf_resource_class'
|
38
|
+
require 'jekyll/exceptions/NoPrefixMapped'
|
39
|
+
require 'jekyll/exceptions/NoPrefixesDefined'
|
40
|
+
require 'jekyll/exceptions/UnMarkedUri'
|
38
41
|
require 'jekyll/filters/rdf_sparql_query'
|
39
42
|
require 'jekyll/filters/rdf_property'
|
40
|
-
require 'jekyll/filters/rdf_property_list'
|
41
43
|
require 'jekyll/rdf_main_generator'
|
42
44
|
require 'jekyll/rdf_page_data'
|
43
45
|
require 'jekyll/rdf_template_mapper'
|
@@ -1,6 +1,6 @@
|
|
1
1
|
##
|
2
2
|
# MIT License
|
3
|
-
#
|
3
|
+
#
|
4
4
|
# Copyright (c) 2016 Elias Saalmann, Christian Frommert, Simon Jakobi,
|
5
5
|
# Arne Jonas Präger, Maxi Bornmann, Georg Hackel, Eric Füg
|
6
6
|
#
|
@@ -41,6 +41,16 @@ module Jekyll #:nodoc:
|
|
41
41
|
#
|
42
42
|
attr_accessor :page
|
43
43
|
|
44
|
+
##
|
45
|
+
# The relative path to the location on the disk where this resource is rendered to
|
46
|
+
#
|
47
|
+
attr_reader :render_path
|
48
|
+
|
49
|
+
##
|
50
|
+
#
|
51
|
+
#
|
52
|
+
attr_accessor :subResources
|
53
|
+
|
44
54
|
##
|
45
55
|
# Return a list of Jekyll::Drops::RdfStatements whose subject, predicate or object is the RDF resource represented by the receiver
|
46
56
|
#
|
@@ -76,52 +86,20 @@ module Jekyll #:nodoc:
|
|
76
86
|
@filename ||= generate_file_name(domain_name, baseurl)
|
77
87
|
end
|
78
88
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
def types
|
83
|
-
@types ||= begin
|
84
|
-
types = [ term.to_s ]
|
89
|
+
def directClasses
|
90
|
+
@directClasses ||= begin
|
91
|
+
classes=[]
|
85
92
|
selection = statements_as(:subject).select{ |s| s.predicate.term.to_s=="http://www.w3.org/1999/02/22-rdf-syntax-ns#type" }
|
86
93
|
unless selection.empty?
|
87
|
-
|
88
|
-
if selection.count > 1
|
89
|
-
Jekyll.logger.warn "Resource #{name} has multiple RDFS types. Will use #{t.object.term.to_s} for template mapping. "
|
90
|
-
end
|
91
|
-
types << t.object.term.to_s
|
92
|
-
t = t.object
|
93
|
-
s = t.super_class
|
94
|
-
while s
|
95
|
-
types << s.term.to_s
|
96
|
-
s = s.super_class
|
97
|
-
end
|
94
|
+
selection.each{|s| classes << s.object.term.to_s}
|
98
95
|
end
|
99
|
-
|
96
|
+
classes.uniq!
|
97
|
+
classes
|
100
98
|
end
|
101
99
|
end
|
102
100
|
|
103
|
-
|
104
|
-
|
105
|
-
#
|
106
|
-
def super_class
|
107
|
-
selection = statements_as(:subject).select{ |s| s.predicate.term.to_s=="http://www.w3.org/2000/01/rdf-schema#subClassOf" }
|
108
|
-
unless selection.empty?
|
109
|
-
super_class = selection.first
|
110
|
-
if selection.count > 1
|
111
|
-
Jekyll.logger.warn "Type #{name} has multiple RDFS super classes. Will use #{super_class.object.term.to_s} for template mapping. "
|
112
|
-
end
|
113
|
-
super_class.object
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
##
|
118
|
-
# Return a user-facing string representing this RdfResource
|
119
|
-
#
|
120
|
-
def name
|
121
|
-
@name ||= begin
|
122
|
-
n = statements_as(:subject).find{ |s| s.predicate.term.to_s=="http://xmlns.com/foaf/0.1/name" }
|
123
|
-
n ? n.object.name : term.to_s
|
124
|
-
end
|
101
|
+
def iri
|
102
|
+
term.to_s
|
125
103
|
end
|
126
104
|
|
127
105
|
##
|
@@ -160,29 +138,42 @@ module Jekyll #:nodoc:
|
|
160
138
|
file_name = ""
|
161
139
|
uri[0] = nil
|
162
140
|
uri[2] = nil
|
163
|
-
uri[5]
|
141
|
+
if(uri[5].length > baseurl.length)
|
142
|
+
if(uri[5][0..(baseurl.length)].eql? (baseurl + "/"))
|
143
|
+
uri[5] = uri[5][(baseurl.length)..-1]
|
144
|
+
end
|
145
|
+
elsif(uri[5].eql?(baseurl))
|
146
|
+
uri[5] = nil
|
147
|
+
end
|
164
148
|
end
|
165
149
|
(0..8).each do |i|
|
166
|
-
if uri[i]
|
150
|
+
if !(uri[i].nil?)
|
167
151
|
case i
|
168
|
-
when
|
169
|
-
file_name += "#{uri[i]
|
152
|
+
when 5
|
153
|
+
file_name += "#{uri[i][1..-1]}/"
|
170
154
|
when 8
|
171
|
-
file_name
|
172
|
-
file_name += "##{uri[i]}"
|
155
|
+
file_name += "#/#{uri[i]}"
|
173
156
|
else
|
174
|
-
|
157
|
+
file_name += "#{uri[i]}/"
|
175
158
|
end
|
176
159
|
end
|
177
160
|
end
|
178
161
|
unless file_name[-1] == '/'
|
179
162
|
file_name += '/'
|
180
163
|
end
|
181
|
-
|
182
|
-
file_name.
|
183
|
-
|
184
|
-
|
164
|
+
rescue URI::InvalidURIError #unclean coding: blanknodes are recognized through errors
|
165
|
+
file_name = "rdfsites/blanknode/#{term.to_s}/"
|
166
|
+
end
|
167
|
+
file_name = file_name.gsub('_','_u')
|
168
|
+
file_name = file_name.gsub('//','/') # needs a better regex to include /// ////...
|
169
|
+
file_name = file_name.gsub(':','_D')
|
170
|
+
file_name = file_name.strip
|
171
|
+
if(file_name[-2..-1] == "#/")
|
172
|
+
file_name = file_name[0..-3]
|
185
173
|
end
|
174
|
+
file_name += 'index.html'
|
175
|
+
@render_path = file_name
|
176
|
+
file_name
|
186
177
|
end
|
187
178
|
|
188
179
|
end
|
@@ -0,0 +1,83 @@
|
|
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 #:nodoc:
|
27
|
+
module Drops #:nodoc:
|
28
|
+
|
29
|
+
##
|
30
|
+
# Represents an RDF resource class to the Liquid template engine
|
31
|
+
#
|
32
|
+
class RdfResourceClass < RdfResource
|
33
|
+
@subClasses = []
|
34
|
+
@lock = -1
|
35
|
+
@subClassHierarchyValue = 0
|
36
|
+
attr_accessor :lock
|
37
|
+
attr_accessor :template
|
38
|
+
attr_accessor :alternativeTemplates
|
39
|
+
attr_accessor :subClasses
|
40
|
+
attr_accessor :subClassHierarchyValue
|
41
|
+
|
42
|
+
def initialize(term, graph)
|
43
|
+
super(term, graph)
|
44
|
+
@subClasses = []
|
45
|
+
@lock = -1
|
46
|
+
@subClassHierarchyValue = 0
|
47
|
+
@alternativeTemplates = []
|
48
|
+
end
|
49
|
+
|
50
|
+
def multipleTemplates?
|
51
|
+
!@alternativeTemplates.empty?
|
52
|
+
end
|
53
|
+
|
54
|
+
def findDirectSubClasses
|
55
|
+
selection = statements_as(:object).select{ |s| s.predicate.term.to_s=="http://www.w3.org/2000/01/rdf-schema#subClassOf" }
|
56
|
+
return selection
|
57
|
+
end
|
58
|
+
|
59
|
+
def addSubClass(resource)
|
60
|
+
@subClasses << resource
|
61
|
+
end
|
62
|
+
|
63
|
+
def propagateTemplate(template, lock)
|
64
|
+
if(@lock>lock||@lock==-1)
|
65
|
+
@lock=lock
|
66
|
+
@template=template
|
67
|
+
@alternativeTemplates.clear()
|
68
|
+
subClasses.each{|sub| sub.propagateTemplate(template ,lock+1)}
|
69
|
+
elsif(@lock==lock)
|
70
|
+
@alternativeTemplates.push(template)
|
71
|
+
subClasses.each{|sub| sub.propagateTemplate(template ,lock+1)}
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def traverseHierarchyValue(predecessorHierarchyValue)
|
76
|
+
if(@subClassHierarchyValue + 1 >= predecessorHierarchyValue) #avoid loops
|
77
|
+
@subClassHierarchyValue += 1
|
78
|
+
subClasses.each{|sub| sub.traverseHierarchyValue(@subClassHierarchyValue)}
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -53,10 +53,13 @@ module Jekyll
|
|
53
53
|
end
|
54
54
|
|
55
55
|
##
|
56
|
-
# Convert this RdfTerm into a
|
56
|
+
# Convert this RdfTerm into a string
|
57
|
+
# This should be:
|
58
|
+
# - for resoruces: the IRI
|
59
|
+
# - for literals: the literal representation e.g. "Hallo"@de or "123"^^<http://www.w3.org/2001/XMLSchema#integer>
|
57
60
|
#
|
58
61
|
def to_s
|
59
|
-
|
62
|
+
term.to_s
|
60
63
|
end
|
61
64
|
|
62
65
|
##
|
@@ -0,0 +1,7 @@
|
|
1
|
+
class NoPrefixMapped < StandardError
|
2
|
+
attr_accessor :prefix, :property
|
3
|
+
def initialize property, layout, prefix
|
4
|
+
@prefix, @property = prefix, property
|
5
|
+
super("Their is no mapping defined for #{prefix} in context to #{property}\n in layout: '#{layout}'.")
|
6
|
+
end
|
7
|
+
end
|
@@ -29,28 +29,61 @@ module Jekyll
|
|
29
29
|
# Internal module to hold the medthod #rdf_property
|
30
30
|
#
|
31
31
|
module RdfProperty
|
32
|
-
|
33
32
|
##
|
34
33
|
# Computes all objects for which statements exist containing the given subject and predicate and returns any of them
|
35
34
|
#
|
36
35
|
# * +input+ - is the subject of the statements to be matched
|
37
36
|
# * +predicate+ - is the predicate of the statements to be matched
|
38
|
-
# * +lang+ - (optional) preferred language of a the returned object. The precise implementation of choosing which object to
|
37
|
+
# * +lang+ - (optional) preferred language of a the returned object. The precise implementation of choosing which object to return (both in case a language is supplied and in case is not supplied) is undefined
|
38
|
+
# * +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
39
|
#
|
40
|
-
def rdf_property(input, predicate, lang = nil)
|
40
|
+
def rdf_property(input, predicate, lang = nil, list = false)
|
41
41
|
return input unless input.is_a?(Jekyll::Drops::RdfResource)
|
42
42
|
begin
|
43
|
-
|
44
|
-
|
45
|
-
if
|
46
|
-
|
43
|
+
predicate = rdf_resolve_prefix(input, predicate)
|
44
|
+
result = input.statements_as_subject.select{ |s| s.predicate.term.to_s == predicate }
|
45
|
+
if lang != nil
|
46
|
+
if lang == 'cfg'
|
47
|
+
lang = input.site.config['jekyll_rdf']['language']
|
48
|
+
end
|
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
|
47
64
|
end
|
48
|
-
p = results.first unless p
|
49
|
-
return unless p
|
50
|
-
(p.object.name).to_s
|
51
65
|
end
|
52
66
|
end
|
53
67
|
|
68
|
+
private
|
69
|
+
def rdf_resolve_prefix(input, predicate)
|
70
|
+
if(predicate[0] == "<" && predicate[-1] == ">")
|
71
|
+
return predicate[1..-2]
|
72
|
+
end
|
73
|
+
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
|
74
|
+
if((arr[1].include? (":")) || (arr[1][0..1].eql?("//")))
|
75
|
+
raise UnMarkedUri.new(predicate, input.page.data['template'])
|
76
|
+
end
|
77
|
+
if(!input.page.data["rdf_prefixes"].nil?)
|
78
|
+
if(!input.page.data["rdf_prefix_map"][arr[0]].nil?)
|
79
|
+
return arr[1].prepend(input.page.data["rdf_prefix_map"][arr[0]])
|
80
|
+
else
|
81
|
+
raise NoPrefixMapped.new(predicate, input.page.data['template'], arr[0])
|
82
|
+
end
|
83
|
+
else
|
84
|
+
raise NoPrefixesDefined.new(predicate, input.page.data['template'])
|
85
|
+
end
|
86
|
+
end
|
54
87
|
end
|
55
88
|
end
|
56
89
|
|
@@ -40,14 +40,25 @@ module Jekyll
|
|
40
40
|
def sparql_query(input, query)
|
41
41
|
return input unless input.is_a?(Jekyll::Drops::RdfResource)
|
42
42
|
query.gsub!('?resourceUri', "<#{input.term.to_s}>")
|
43
|
+
if(!input.page.data["rdf_prefixes"].nil?)
|
44
|
+
query = query.prepend(" ").prepend(input.page.data["rdf_prefixes"])
|
45
|
+
end
|
43
46
|
begin
|
47
|
+
input.site.data['sparql']
|
44
48
|
result = input.site.data['sparql'].query(query).map do |solution|
|
45
49
|
hsh = solution.to_hash
|
46
50
|
hsh.update(hsh){ |k,v| Jekyll::Drops::RdfTerm.build_term_drop(v, input.graph, input.site) }
|
47
51
|
hsh.collect{|k,v| [k.to_s, v]}.to_h
|
48
52
|
end
|
49
53
|
return result
|
54
|
+
rescue SPARQL::Client::ClientError => ce
|
55
|
+
Jekyll.logger.error("client error experienced: \n #{query} \n Error Message: #{ce.message}")
|
56
|
+
rescue SPARQL::MalformedQuery => mq
|
57
|
+
Jekyll.logger.error("malformed query found: \n #{query} \n Error Message: #{mq.message}")
|
58
|
+
rescue Exception => e
|
59
|
+
Jekyll.logger.error("unknown Exception of class: #{e.class} in sparql_query \n Query: #{query} \nMessage: #{e.message}")
|
50
60
|
end
|
61
|
+
return []
|
51
62
|
end
|
52
63
|
|
53
64
|
end
|
@@ -39,7 +39,26 @@ module Jekyll
|
|
39
39
|
# * +site+ - The Jekyll::Site whose #data is to be enriched
|
40
40
|
#
|
41
41
|
def generate(site)
|
42
|
-
|
42
|
+
|
43
|
+
begin
|
44
|
+
config = site.config.fetch('jekyll_rdf')
|
45
|
+
rescue Exception
|
46
|
+
Jekyll.logger.error("You've included Jekyll-RDF, but it is not configured. Aborting the jekyll-rdf plugin.")
|
47
|
+
return
|
48
|
+
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")
|
59
|
+
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
|
61
|
+
end
|
43
62
|
|
44
63
|
graph = RDF::Graph.load(config['path'])
|
45
64
|
sparql = SPARQL::Client.new(graph)
|
@@ -50,13 +69,50 @@ module Jekyll
|
|
50
69
|
site.data['sparql'] = sparql
|
51
70
|
site.data['resources'] = []
|
52
71
|
|
53
|
-
|
54
|
-
|
55
|
-
|
72
|
+
#parse resources
|
73
|
+
pageResources={};
|
74
|
+
blanknodes=[]
|
56
75
|
resources.each do |uri|
|
57
76
|
resource = Jekyll::Drops::RdfResource.new(uri, graph)
|
58
|
-
|
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
|
59
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
|
+
}
|
112
|
+
|
113
|
+
blanknodes.each{|resource|
|
114
|
+
site.pages << RdfPageData.new(site, site.source, resource, mapper, global_config)
|
115
|
+
}
|
60
116
|
end
|
61
117
|
|
62
118
|
##
|
data/lib/jekyll/rdf_page_data.rb
CHANGED
@@ -37,19 +37,37 @@ module Jekyll
|
|
37
37
|
# * +resource+ - The RDF resource for which the page is rendered
|
38
38
|
# * +mapper+ - The layout-mapping
|
39
39
|
#
|
40
|
-
def initialize(site, base, resource, mapper)
|
40
|
+
def initialize(site, base, resource, mapper, config)
|
41
41
|
@site = site
|
42
42
|
@base = base
|
43
43
|
@dir = ""
|
44
|
-
@name = resource.filename(URI::split(
|
44
|
+
@name = resource.filename(URI::split(config['url'])[2], config['baseurl'])
|
45
45
|
self.process(@name)
|
46
46
|
|
47
47
|
template = mapper.map(resource)
|
48
48
|
self.read_yaml(File.join(base, '_layouts'), template)
|
49
|
-
|
50
|
-
self.data['title'] = resource.name
|
49
|
+
self.data['title'] = resource.iri
|
51
50
|
self.data['rdf'] = resource
|
52
|
-
|
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
|
70
|
+
end
|
53
71
|
resource.page = self
|
54
72
|
resource.site = site
|
55
73
|
site.data['resources'] << resource
|
@@ -31,21 +31,53 @@ module Jekyll
|
|
31
31
|
class RdfTemplateMapper
|
32
32
|
|
33
33
|
##
|
34
|
-
# A Hash mapping a
|
34
|
+
# A Hash mapping a resource to a template name
|
35
35
|
attr_accessor :resources_to_templates
|
36
36
|
|
37
37
|
##
|
38
38
|
# Default template name
|
39
39
|
attr_accessor :default_template
|
40
40
|
|
41
|
+
##
|
42
|
+
# A Hash mapping a type resource to a template name
|
43
|
+
attr_accessor :classes_to_templates
|
44
|
+
|
45
|
+
attr_accessor :classResources
|
46
|
+
|
41
47
|
##
|
42
48
|
# Create a new Jekyll::RdfTemplateMapper
|
43
49
|
#
|
44
50
|
# * +resources_to_templates+ - A Hash mapping a type resource to a template name
|
45
51
|
# * +default_template+ - Default template name
|
46
|
-
def initialize(resources_to_templates, default_template)
|
52
|
+
def initialize(resources_to_templates, classes_to_templates, default_template, graph, sparql)
|
47
53
|
@resources_to_templates = resources_to_templates
|
48
54
|
@default_template = default_template
|
55
|
+
@classes_to_templates = classes_to_templates
|
56
|
+
|
57
|
+
@classResources = {}
|
58
|
+
classRecognitionQuery = "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}}"
|
59
|
+
classSearchResults = sparql.query(classRecognitionQuery).map{ |sol| sol[:resourceUri] }.reject do |s| # Reject literals
|
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
|
49
81
|
end
|
50
82
|
|
51
83
|
##
|
@@ -53,13 +85,39 @@ module Jekyll
|
|
53
85
|
#
|
54
86
|
# Returns the template name of one of the +resource+'s types, if available. Returns the default template name otherwise.
|
55
87
|
def map(resource)
|
56
|
-
resource.
|
57
|
-
|
58
|
-
|
88
|
+
tmpl = resources_to_templates ? resources_to_templates[resource.term.to_s] : nil
|
89
|
+
lock = -1
|
90
|
+
hier = -1
|
91
|
+
warnMultTempl = false
|
92
|
+
duplicateLevelTempl = []
|
93
|
+
if(tmpl.nil?)
|
94
|
+
resource.directClasses.each do |classUri|
|
95
|
+
classRes = classResources[classUri]
|
96
|
+
if((classRes.lock <= lock || lock == -1) && !classRes.template.nil?)
|
97
|
+
if(classRes.subClassHierarchyValue > hier)
|
98
|
+
Jekyll.logger.info("classMapped: #{classUri} : #{resource.term.to_s} : #{classResources[classUri].template}")
|
99
|
+
lock = classRes.lock
|
100
|
+
tmpl = classRes.template
|
101
|
+
hier = classRes.subClassHierarchyValue
|
102
|
+
warnMultTempl = false
|
103
|
+
duplicateLevelTempl.clear.push(tmpl)
|
104
|
+
if(classRes.multipleTemplates?)
|
105
|
+
warnMultTempl = true
|
106
|
+
duplicateLevelTempl.concat(classRes.alternativeTemplates)
|
107
|
+
end
|
108
|
+
elsif(classRes.subClassHierarchyValue == hier)
|
109
|
+
warnMultTempl = true
|
110
|
+
duplicateLevelTempl.push(classRes.template)
|
111
|
+
end
|
112
|
+
end unless classRes.nil?
|
113
|
+
end
|
114
|
+
if(warnMultTempl)
|
115
|
+
Jekyll.logger.warn("Warning: multiple possible templates for #{resource.term.to_s}: #{duplicateLevelTempl.uniq.join(', ')}")
|
116
|
+
end
|
59
117
|
end
|
118
|
+
return tmpl unless tmpl.nil?
|
60
119
|
return default_template
|
61
120
|
end
|
62
|
-
|
63
121
|
end
|
64
122
|
|
65
123
|
end
|
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:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elias Saalmann
|
@@ -11,10 +11,12 @@ authors:
|
|
11
11
|
- Maxi Bornmann
|
12
12
|
- Georg Hackel
|
13
13
|
- Eric Füg
|
14
|
+
- Sebastian Zänker
|
15
|
+
- Natanael Arndt
|
14
16
|
autorequire:
|
15
17
|
bindir: bin
|
16
18
|
cert_chain: []
|
17
|
-
date:
|
19
|
+
date: 2017-03-29 00:00:00.000000000 Z
|
18
20
|
dependencies:
|
19
21
|
- !ruby/object:Gem::Dependency
|
20
22
|
name: linkeddata
|
@@ -64,14 +66,14 @@ dependencies:
|
|
64
66
|
requirements:
|
65
67
|
- - "~>"
|
66
68
|
- !ruby/object:Gem::Version
|
67
|
-
version: '10.
|
69
|
+
version: '10.4'
|
68
70
|
type: :runtime
|
69
71
|
prerelease: false
|
70
72
|
version_requirements: !ruby/object:Gem::Requirement
|
71
73
|
requirements:
|
72
74
|
- - "~>"
|
73
75
|
- !ruby/object:Gem::Version
|
74
|
-
version: '10.
|
76
|
+
version: '10.4'
|
75
77
|
- !ruby/object:Gem::Dependency
|
76
78
|
name: coveralls
|
77
79
|
requirement: !ruby/object:Gem::Requirement
|
@@ -143,7 +145,7 @@ dependencies:
|
|
143
145
|
- !ruby/object:Gem::Version
|
144
146
|
version: '3.4'
|
145
147
|
description: Generate static sites with Jekyll based on RDF data
|
146
|
-
email:
|
148
|
+
email: arndt@informatik.uni-leipzig.de
|
147
149
|
executables: []
|
148
150
|
extensions: []
|
149
151
|
extra_rdoc_files: []
|
@@ -151,15 +153,18 @@ files:
|
|
151
153
|
- lib/jekyll-rdf.rb
|
152
154
|
- lib/jekyll/drops/rdf_literal.rb
|
153
155
|
- lib/jekyll/drops/rdf_resource.rb
|
156
|
+
- lib/jekyll/drops/rdf_resource_class.rb
|
154
157
|
- lib/jekyll/drops/rdf_statement.rb
|
155
158
|
- lib/jekyll/drops/rdf_term.rb
|
159
|
+
- lib/jekyll/exceptions/NoPrefixMapped.rb
|
160
|
+
- lib/jekyll/exceptions/NoPrefixesDefined.rb
|
161
|
+
- lib/jekyll/exceptions/UnMarkedUri.rb
|
156
162
|
- lib/jekyll/filters/rdf_property.rb
|
157
|
-
- lib/jekyll/filters/rdf_property_list.rb
|
158
163
|
- lib/jekyll/filters/rdf_sparql_query.rb
|
159
164
|
- lib/jekyll/rdf_main_generator.rb
|
160
165
|
- lib/jekyll/rdf_page_data.rb
|
161
166
|
- lib/jekyll/rdf_template_mapper.rb
|
162
|
-
homepage:
|
167
|
+
homepage: https://github.com/white-gecko/jekyll-rdf
|
163
168
|
licenses:
|
164
169
|
- MIT
|
165
170
|
metadata: {}
|
@@ -179,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
179
184
|
version: '0'
|
180
185
|
requirements: []
|
181
186
|
rubyforge_project:
|
182
|
-
rubygems_version: 2.
|
187
|
+
rubygems_version: 2.2.2
|
183
188
|
signing_key:
|
184
189
|
specification_version: 4
|
185
190
|
summary: Hypertext Publication System for Templates Resource Rendering
|
@@ -1,58 +0,0 @@
|
|
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
|
-
|
28
|
-
##
|
29
|
-
# Internal module to hold the method #rdf_property
|
30
|
-
#
|
31
|
-
module RdfPropertyList
|
32
|
-
|
33
|
-
##
|
34
|
-
# Computes all objects for which statements exist containing the given subject and predicate and returns an Array of them
|
35
|
-
#
|
36
|
-
# * +input+ - is the subject of the statements to be matched
|
37
|
-
# * +predicate+ - is the predicate of the statements to be matched
|
38
|
-
# * +lang+ - (optional) preferred language of the returned objects. If 'cfg' is specified the preferred language is provides by the site configuration _config.yml
|
39
|
-
#
|
40
|
-
def rdf_property_list(input, predicate, lang = nil)
|
41
|
-
return input unless input.is_a?(Jekyll::Drops::RdfResource)
|
42
|
-
begin
|
43
|
-
result = input.page.data['rdf'].statements_as_subject.select{ |s| s.predicate.term.to_s == predicate } # select all matching statements with given predicate
|
44
|
-
if lang != nil
|
45
|
-
if lang == 'cfg'
|
46
|
-
lang = input.site.config['jekyll_rdf']['language']
|
47
|
-
end
|
48
|
-
result = result.select{ |s| s.object.term.language == lang.to_sym } # select all statements with matching language
|
49
|
-
end
|
50
|
-
return unless result
|
51
|
-
result.map{|p| p.object.name}
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
Liquid::Template.register_filter(Jekyll::RdfPropertyList)
|