rdf-rdfa 0.3.8 → 0.3.9
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.
- data/README +32 -82
- data/VERSION +1 -1
- data/lib/rdf/rdfa.rb +6 -4
- data/lib/rdf/rdfa/expansion.rb +50 -37
- data/lib/rdf/rdfa/format.rb +14 -0
- data/lib/rdf/rdfa/profile/html.rb +20 -0
- data/lib/rdf/rdfa/profile/xhtml.rb +33 -36
- data/lib/rdf/rdfa/profile/xml.rb +11 -10
- data/lib/rdf/rdfa/reader.rb +53 -25
- data/lib/rdf/rdfa/reader/nokogiri.rb +4 -3
- data/lib/rdf/rdfa/reader/rexml.rb +4 -3
- data/lib/rdf/rdfa/writer.rb +51 -60
- data/lib/rdf/rdfa/writer/haml_templates.rb +27 -68
- metadata +233 -135
data/lib/rdf/rdfa/profile/xml.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
|
-
# This file is automatically generated by
|
2
|
-
# RDFa
|
3
|
-
|
4
|
-
require 'facets/module'
|
1
|
+
# This file is automatically generated by script/intern_profile
|
2
|
+
# RDFa profile for ./rdfa-1.1.html
|
5
3
|
|
6
4
|
class RDF::RDFa::Profile
|
7
|
-
def self.
|
8
|
-
if uri.to_s == "http://www.w3.org/
|
9
|
-
@
|
5
|
+
def self.find_with_rdfa_1_1_html(uri)
|
6
|
+
if uri.to_s == "http://www.w3.org/2011/rdfa-context/rdfa-1.1"
|
7
|
+
@_rdfa_1_1_html_prof ||= RDF::RDFa::Profile.new(RDF::URI("http://www.w3.org/2011/rdfa-context/rdfa-1.1"), {
|
10
8
|
:prefixes => {
|
11
9
|
:cc => "http://creativecommons.org/ns#",
|
12
10
|
:ctag => "http://commontag.org/ns#",
|
@@ -22,6 +20,7 @@ class RDF::RDFa::Profile
|
|
22
20
|
:rdfs => "http://www.w3.org/2000/01/rdf-schema#",
|
23
21
|
:rev => "http://purl.org/stuff/rev#",
|
24
22
|
:rif => "http://www.w3.org/2007/rif#",
|
23
|
+
:schema => "http://schema.org/",
|
25
24
|
:sioc => "http://rdfs.org/sioc/ns#",
|
26
25
|
:skos => "http://www.w3.org/2004/02/skos/core#",
|
27
26
|
:skosxl => "http://www.w3.org/2008/05/skos-xl#",
|
@@ -32,21 +31,23 @@ class RDF::RDFa::Profile
|
|
32
31
|
:wdrs => "http://www.w3.org/2007/05/powder-s#",
|
33
32
|
:xhv => "http://www.w3.org/1999/xhtml/vocab#",
|
34
33
|
:xml => "http://www.w3.org/XML/1998/namespace",
|
35
|
-
:xmlns => "http://www.w3.org/2000/xmlns/",
|
36
34
|
:xsd => "http://www.w3.org/2001/XMLSchema#",
|
37
35
|
},
|
38
36
|
:terms => {
|
39
37
|
:describedby => "http://www.w3.org/2007/05/powder-s#describedby",
|
38
|
+
:license => "http://www.w3.org/1999/xhtml/vocab#license",
|
39
|
+
:role => "http://www.w3.org/1999/xhtml/vocab#role",
|
40
40
|
},
|
41
41
|
})
|
42
42
|
else
|
43
|
-
|
43
|
+
find_without_rdfa_1_1_html(uri)
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
47
|
class << self
|
48
48
|
##
|
49
49
|
# Override find to return this profile, if matched
|
50
|
-
|
50
|
+
alias_method :find_without_rdfa_1_1_html, :find
|
51
|
+
alias_method :find, :find_with_rdfa_1_1_html
|
51
52
|
end
|
52
53
|
end
|
data/lib/rdf/rdfa/reader.rb
CHANGED
@@ -21,8 +21,9 @@ module RDF::RDFa
|
|
21
21
|
#
|
22
22
|
# Based on processing rules described here:
|
23
23
|
# @see http://www.w3.org/TR/rdfa-syntax/#s_model RDFa 1.0
|
24
|
-
# @see http://www.w3.org/TR/2011/WD-rdfa-core-
|
25
|
-
# @see http://www.w3.org/TR/2011/WD-xhtml-rdfa-
|
24
|
+
# @see http://www.w3.org/TR/2011/WD-rdfa-core-20111215/ RDFa Core 1.1
|
25
|
+
# @see http://www.w3.org/TR/2011/WD-xhtml-rdfa-20111215/ XHTML+RDFa 1.1
|
26
|
+
# @see http://www.w3.org/TR/2011/WD-rdfa-in-html-20110525/ HTML+RDFa 1.1
|
26
27
|
#
|
27
28
|
# @author [Gregg Kellogg](http://kellogg-assoc.com/)
|
28
29
|
class Reader < RDF::Reader
|
@@ -44,19 +45,40 @@ module RDF::RDFa
|
|
44
45
|
:"rdfa1.1" => [:term, :curie, :absuri],
|
45
46
|
}
|
46
47
|
|
48
|
+
# This expression matches an NCName as defined in
|
49
|
+
# [XML-NAMES](http://www.w3.org/TR/2009/REC-xml-names-20091208/#NT-NCName)
|
50
|
+
#
|
51
|
+
# @see http://www.w3.org/TR/2009/REC-xml-names-20091208/#NT-NCName
|
47
52
|
NC_REGEXP = Regexp.new(
|
48
53
|
%{^
|
49
54
|
(?!\\\\u0301) # ́ is a non-spacing acute accent.
|
50
55
|
# It is legal within an XML Name, but not as the first character.
|
51
56
|
( [a-zA-Z_]
|
52
|
-
| \\\\u[0-9a-fA-F]
|
57
|
+
| \\\\u[0-9a-fA-F]{4}
|
58
|
+
)
|
59
|
+
( [0-9a-zA-Z_\.-/]
|
60
|
+
| \\\\u([0-9a-fA-F]{4})
|
61
|
+
)*
|
62
|
+
$},
|
63
|
+
Regexp::EXTENDED)
|
64
|
+
|
65
|
+
# This expression matches an term as defined in
|
66
|
+
# [RDFA-CORE](http://www.w3.org/TR/2011/WD-rdfa-core-20111215/#s_terms)
|
67
|
+
#
|
68
|
+
# @see http://www.w3.org/TR/2011/WD-rdfa-core-20111215/#s_terms
|
69
|
+
TERM_REGEXP = Regexp.new(
|
70
|
+
%{^
|
71
|
+
(?!\\\\u0301) # ́ is a non-spacing acute accent.
|
72
|
+
# It is legal within an XML Name, but not as the first character.
|
73
|
+
( [a-zA-Z_]
|
74
|
+
| \\\\u[0-9a-fA-F]{4}
|
53
75
|
)
|
54
76
|
( [0-9a-zA-Z_\.-]
|
55
77
|
| \\\\u([0-9a-fA-F]{4})
|
56
78
|
)*
|
57
79
|
$},
|
58
80
|
Regexp::EXTENDED)
|
59
|
-
|
81
|
+
|
60
82
|
# Host language
|
61
83
|
# @attr [:xml1, :xhtml1, :xhtml5, :html4, :html5, :svg]
|
62
84
|
attr_reader :host_language
|
@@ -253,6 +275,9 @@ module RDF::RDFa
|
|
253
275
|
self.extend(@implementation)
|
254
276
|
|
255
277
|
detect_host_language_version(input, options)
|
278
|
+
|
279
|
+
add_info(@doc, "version = #{@version}, host_language = #{@host_language}, library = #{@library}")
|
280
|
+
|
256
281
|
initialize_xml(input, options) rescue raise RDF::ReaderError.new($!.message)
|
257
282
|
|
258
283
|
if (root.nil? && validate?)
|
@@ -263,11 +288,11 @@ module RDF::RDFa
|
|
263
288
|
|
264
289
|
# Section 4.2 RDFa Host Language Conformance
|
265
290
|
#
|
266
|
-
# The Host Language may require the automatic inclusion of one or more
|
291
|
+
# The Host Language may require the automatic inclusion of one or more Initial Contexts
|
267
292
|
@host_defaults = {
|
268
|
-
:vocabulary
|
269
|
-
:uri_mappings
|
270
|
-
:
|
293
|
+
:vocabulary => nil,
|
294
|
+
:uri_mappings => {},
|
295
|
+
:initial_contexts => [],
|
271
296
|
}
|
272
297
|
|
273
298
|
if @version == :"rdfa1.0"
|
@@ -280,13 +305,13 @@ module RDF::RDFa
|
|
280
305
|
|
281
306
|
case @host_language
|
282
307
|
when :xml1, :svg
|
283
|
-
@host_defaults[:
|
284
|
-
when :xhtml1
|
285
|
-
@host_defaults[:
|
308
|
+
@host_defaults[:initial_contexts] = [XML_RDFA_CONTEXT]
|
309
|
+
when :xhtml1
|
310
|
+
@host_defaults[:initial_contexts] = [XML_RDFA_CONTEXT, XHTML_RDFA_CONTEXT]
|
311
|
+
when :xhtml5, :html4, :html5
|
312
|
+
@host_defaults[:initial_contexts] = [XML_RDFA_CONTEXT, HTML_RDFA_CONTEXT]
|
286
313
|
end
|
287
314
|
|
288
|
-
add_info(@doc, "version = #{@version}, host_language = #{@host_language}, library = #{@library}")
|
289
|
-
|
290
315
|
block.call(self) if block_given?
|
291
316
|
end
|
292
317
|
end
|
@@ -413,7 +438,7 @@ module RDF::RDFa
|
|
413
438
|
|
414
439
|
if @version != :"rdfa1.0"
|
415
440
|
# Process default vocabularies
|
416
|
-
|
441
|
+
load_initial_contexts(@host_defaults[:initial_contexts]) do |which, value|
|
417
442
|
add_debug(root) { "parse_whole_document, #{which}: #{value.inspect}"}
|
418
443
|
case which
|
419
444
|
when :uri_mappings then evaluation_context.uri_mappings.merge!(value)
|
@@ -430,24 +455,24 @@ module RDF::RDFa
|
|
430
455
|
# Parse and process URI mappings, Term mappings and a default vocabulary from @profile
|
431
456
|
#
|
432
457
|
# Yields each mapping
|
433
|
-
def
|
434
|
-
|
458
|
+
def load_initial_contexts(initial_contexts)
|
459
|
+
initial_contexts.
|
435
460
|
map {|uri| uri(uri).normalize}.
|
436
461
|
each do |uri|
|
437
462
|
# Don't try to open ourselves!
|
438
463
|
if base_uri == uri
|
439
|
-
add_debug(
|
464
|
+
add_debug(root) {"load_initial_contexts: skip recursive profile <#{uri}>"}
|
440
465
|
next
|
441
466
|
end
|
442
467
|
|
443
468
|
old_debug = RDF::RDFa.debug?
|
444
469
|
begin
|
445
|
-
add_info(
|
470
|
+
add_info(root, "load_initial_contexts: load <#{uri}>")
|
446
471
|
RDF::RDFa.debug = false
|
447
472
|
profile = Profile.find(uri)
|
448
473
|
rescue Exception => e
|
449
474
|
RDF::RDFa.debug = old_debug
|
450
|
-
add_error(
|
475
|
+
add_error(root, e.message, RDF::RDFA.ProfileReferenceError)
|
451
476
|
raise # In case we're not in strict mode, we need to be sure processing stops
|
452
477
|
ensure
|
453
478
|
RDF::RDFa.debug = old_debug
|
@@ -572,6 +597,7 @@ module RDF::RDFa
|
|
572
597
|
rev
|
573
598
|
src
|
574
599
|
typeof
|
600
|
+
value
|
575
601
|
vocab
|
576
602
|
).each do |a|
|
577
603
|
attrs[a.to_sym] = element.attributes[a].to_s.strip if element.attributes[a]
|
@@ -946,22 +972,24 @@ module RDF::RDFa
|
|
946
972
|
rescue ArgumentError => e
|
947
973
|
add_error(element, e.message)
|
948
974
|
end
|
949
|
-
elsif
|
975
|
+
elsif element.name == 'time'
|
976
|
+
# HTML5 support
|
950
977
|
# Lexically scan value and assign appropriate type, otherwise, leave untyped
|
951
|
-
v = element.
|
952
|
-
datatype = %w(Date Time DateTime Duration).map {|t| RDF::Literal.const_get(t)}.detect do |dt|
|
978
|
+
v = (attrs[:datetime] || element.inner_text).to_s
|
979
|
+
datatype = %w(Date Time DateTime Year YearMonth Duration).map {|t| RDF::Literal.const_get(t)}.detect do |dt|
|
953
980
|
v.match(dt::GRAMMAR)
|
954
981
|
end || RDF::Literal
|
955
|
-
add_debug(element) {"[Step 11(1.1)]
|
982
|
+
add_debug(element) {"[Step 11(1.1)] <time> literal: #{datatype} #{v.inspect}"}
|
956
983
|
datatype.new(v)
|
957
984
|
elsif attrs[:content]
|
958
985
|
# plain literal
|
959
986
|
add_debug(element, "[Step 11(1.1)] plain literal (content)")
|
960
987
|
RDF::Literal.new(attrs[:content], :language => language, :validate => validate?, :canonicalize => canonicalize?)
|
961
|
-
elsif attrs[:value]
|
988
|
+
elsif element.name.to_s == 'data' && attrs[:value]
|
989
|
+
# HTML5 support
|
962
990
|
# plain literal
|
963
991
|
add_debug(element, "[Step 11(1.1)] plain literal (value)")
|
964
|
-
RDF::Literal.new(attrs[:value], :validate => validate?, :canonicalize => canonicalize?)
|
992
|
+
RDF::Literal.new(attrs[:value], :language => language, :validate => validate?, :canonicalize => canonicalize?)
|
965
993
|
elsif (attrs[:resource] || attrs[:href] || attrs[:src] || attrs[:data]) &&
|
966
994
|
!(attrs[:rel] || attrs[:rev]) &&
|
967
995
|
evaluation_context.incomplete_triples.empty? &&
|
@@ -220,21 +220,22 @@ module RDF::RDFa
|
|
220
220
|
when /html 4/i then :html4
|
221
221
|
when /xhtml/i then :xhtml1
|
222
222
|
when /html/i then :html5
|
223
|
+
else :html5
|
223
224
|
end
|
224
225
|
when "application/xhtml+xml"
|
225
226
|
case doc_type_string
|
226
227
|
when /html 4/i then :html4
|
227
228
|
when /xhtml/i then :xhtml1
|
228
229
|
when /html/i then :xhtml5
|
230
|
+
else :xhtml5
|
229
231
|
end
|
230
232
|
else
|
231
233
|
case root_element
|
232
234
|
when /svg/i then :svg
|
233
|
-
when /html/i then :
|
235
|
+
when /html/i then :html5
|
236
|
+
else :xml1
|
234
237
|
end
|
235
238
|
end
|
236
|
-
|
237
|
-
@host_language ||= :xml1
|
238
239
|
end
|
239
240
|
|
240
241
|
# Accessor methods to mask native elements & attributes
|
@@ -246,21 +246,22 @@ module RDF::RDFa
|
|
246
246
|
when /html 4/i then :html4
|
247
247
|
when /xhtml/i then :xhtml1
|
248
248
|
when /html/i then :html5
|
249
|
+
else :html5
|
249
250
|
end
|
250
251
|
when "application/xhtml+xml"
|
251
252
|
case doc_type_string
|
252
253
|
when /html 4/i then :html4
|
253
254
|
when /xhtml/i then :xhtml1
|
254
255
|
when /html/i then :xhtml5
|
256
|
+
else :xhtml5
|
255
257
|
end
|
256
258
|
else
|
257
259
|
case root_element
|
258
260
|
when /svg/i then :svg
|
259
|
-
when /html/i then :
|
261
|
+
when /html/i then :html5
|
262
|
+
else :xml1
|
260
263
|
end
|
261
264
|
end
|
262
|
-
|
263
|
-
@host_language ||= :xml1
|
264
265
|
end
|
265
266
|
|
266
267
|
# Accessor methods to mask native elements & attributes
|
data/lib/rdf/rdfa/writer.rb
CHANGED
@@ -52,16 +52,16 @@ module RDF::RDFa
|
|
52
52
|
# @author [Gregg Kellogg](http://kellogg-assoc.com/)
|
53
53
|
class Writer < RDF::Writer
|
54
54
|
format RDF::RDFa::Format
|
55
|
-
|
55
|
+
|
56
56
|
# Defines rdf:type of subjects to be emitted at the beginning of the document.
|
57
57
|
# @return [Array<URI>]
|
58
58
|
attr :top_classes
|
59
|
-
|
59
|
+
|
60
60
|
# Defines order of predicates to to emit at begninning of a resource description. Defaults to
|
61
61
|
# [rdf:type, rdfs:label, dc:title]
|
62
62
|
# @return [Array<URI>]
|
63
63
|
attr :predicate_order
|
64
|
-
|
64
|
+
|
65
65
|
# Defines order of predicates to use in heading.
|
66
66
|
# @return [Array<URI>]
|
67
67
|
attr :heading_predicates
|
@@ -75,7 +75,7 @@ module RDF::RDFa
|
|
75
75
|
|
76
76
|
# @return [RDF::URI] Base URI used for relativizing URIs
|
77
77
|
attr_accessor :base_uri
|
78
|
-
|
78
|
+
|
79
79
|
##
|
80
80
|
# Initializes the RDFa writer instance.
|
81
81
|
#
|
@@ -177,7 +177,7 @@ module RDF::RDFa
|
|
177
177
|
add_debug {"\nserialize: prefixes: #{prefix.inspect}"}
|
178
178
|
|
179
179
|
subjects = order_subjects
|
180
|
-
|
180
|
+
|
181
181
|
# Take title from first subject having a heading predicate
|
182
182
|
doc_title = nil
|
183
183
|
titles = {}
|
@@ -221,7 +221,7 @@ module RDF::RDFa
|
|
221
221
|
#
|
222
222
|
# @param [Array<RDF::Resource>] subjects
|
223
223
|
# Ordered list of subjects. Template must yield to each subject, which returns
|
224
|
-
# the serialization of that subject (@see subject_template)
|
224
|
+
# the serialization of that subject (@see #subject_template)
|
225
225
|
# @param [Hash{Symbol => Object}] options Rendering options passed to Haml render.
|
226
226
|
# @option options [RDF::URI] base (nil)
|
227
227
|
# Base URI added to document, used for shortening URIs within the document.
|
@@ -251,39 +251,30 @@ module RDF::RDFa
|
|
251
251
|
yield(subject) if block_given?
|
252
252
|
end
|
253
253
|
end
|
254
|
-
|
254
|
+
|
255
255
|
# Render a subject using haml_template[:subject].
|
256
256
|
#
|
257
257
|
# The _subject_ template may be called either as a top-level element, or recursively under another element
|
258
258
|
# if the _rel_ local is not nil.
|
259
259
|
#
|
260
|
-
# Yields each predicate/property to be rendered separately (@see render_property_value and
|
261
|
-
# render_property_values).
|
260
|
+
# Yields each predicate/property to be rendered separately (@see #render_property_value and
|
261
|
+
# {#render_property_values}).
|
262
262
|
#
|
263
263
|
# The default Haml template is:
|
264
264
|
# - if element == :li
|
265
|
-
# %li{:
|
265
|
+
# %li{:rel => rel, :resource => (about || resource), :typeof => typeof, :inlist => inlist}
|
266
266
|
# - if typeof
|
267
267
|
# %span.type!= typeof
|
268
268
|
# - predicates.each do |predicate|
|
269
269
|
# != yield(predicate)
|
270
|
-
# - elsif rel && typeof
|
271
|
-
# %div{:rel => rel}
|
272
|
-
# %div{:about => about, :typeof => typeof}
|
273
|
-
# %span.type!= typeof
|
274
|
-
# - predicates.each do |predicate|
|
275
|
-
# != yield(predicate)
|
276
|
-
# - elsif rel
|
277
|
-
# %div{:rel => rel, :resource => resource}
|
278
|
-
# - predicates.each do |predicate|
|
279
|
-
# != yield(predicate)
|
280
270
|
# - else
|
281
|
-
# %div{:
|
271
|
+
# %div{:rel => rel, :resource => (about || resource), :typeof => typeof, :inlist => inlist}
|
282
272
|
# - if typeof
|
283
273
|
# %span.type!= typeof
|
284
274
|
# - predicates.each do |predicate|
|
285
275
|
# != yield(predicate)
|
286
276
|
#
|
277
|
+
#
|
287
278
|
# @param [Array<RDF::Resource>] subject
|
288
279
|
# Subject to render
|
289
280
|
# @param [Array<RDF::Resource>] predicates
|
@@ -328,7 +319,7 @@ module RDF::RDFa
|
|
328
319
|
yield(predicate) if block_given?
|
329
320
|
end
|
330
321
|
end
|
331
|
-
|
322
|
+
|
332
323
|
# Render a single- or multi-valued predicate using haml_template[:property_value] or haml_template[:property_values].
|
333
324
|
# Yields each object for optional rendering. The block should only
|
334
325
|
# render for recursive subject definitions (i.e., where the object
|
@@ -346,9 +337,9 @@ module RDF::RDFa
|
|
346
337
|
# - elsif get_curie(object) == 'rdf:nil'
|
347
338
|
# %span{:rel => get_curie(predicate), :inlist => ''}
|
348
339
|
# - elsif object.node?
|
349
|
-
# %span{:
|
340
|
+
# %span{:property => get_curie(predicate), :resource => get_curie(object), :inlist => inlist}= get_curie(object)
|
350
341
|
# - elsif object.uri?
|
351
|
-
# %a{:
|
342
|
+
# %a{:property => get_curie(predicate), :href => object.to_s, :inlist => inlist}= object.to_s
|
352
343
|
# - elsif object.datatype == RDF.XMLLiteral
|
353
344
|
# %span{:property => get_curie(predicate), :lang => get_lang(object), :datatype => get_dt_curie(object), :inlist => inlist}<!= get_value(object)
|
354
345
|
# - else
|
@@ -364,10 +355,10 @@ module RDF::RDFa
|
|
364
355
|
# - if res = yield(object)
|
365
356
|
# != res
|
366
357
|
# - elsif object.node?
|
367
|
-
# %li{:
|
358
|
+
# %li{:property => get_curie(predicate), :resource => get_curie(object), :inlist => inlist}= get_curie(object)
|
368
359
|
# - elsif object.uri?
|
369
360
|
# %li
|
370
|
-
# %a{:
|
361
|
+
# %a{:property => get_curie(predicate), :href => object.to_s, :inlist => inlist}= object.to_s
|
371
362
|
# - elsif object.datatype == RDF.XMLLiteral
|
372
363
|
# %li{:property => get_curie(predicate), :lang => get_lang(object), :datatype => get_curie(object.datatype), :inlist => inlist}<!= get_value(object)
|
373
364
|
# - else
|
@@ -397,7 +388,7 @@ module RDF::RDFa
|
|
397
388
|
add_debug {"render_property(#{predicate}): #{objects.inspect}"}
|
398
389
|
# If there are multiple objects, and no :property_values is defined, call recursively with
|
399
390
|
# each object
|
400
|
-
|
391
|
+
|
401
392
|
template = options[:haml]
|
402
393
|
template ||= objects.length > 1 ? haml_template[:property_values] : haml_template[:property_value]
|
403
394
|
|
@@ -411,7 +402,7 @@ module RDF::RDFa
|
|
411
402
|
# Render each list as multiple properties and set :inlist to true
|
412
403
|
list = RDF::List.new(object, @graph)
|
413
404
|
list.each_statement {|st| subject_done(st.subject)}
|
414
|
-
|
405
|
+
|
415
406
|
add_debug {"list: #{list.inspect} #{list.to_a}"}
|
416
407
|
render_property(predicate, list.to_a, options.merge(:inlist => ""), &block)
|
417
408
|
end.join(" ")
|
@@ -443,36 +434,36 @@ module RDF::RDFa
|
|
443
434
|
end
|
444
435
|
end
|
445
436
|
end
|
446
|
-
|
437
|
+
|
447
438
|
# Perform any preprocessing of statements required
|
448
439
|
# @return [ignored]
|
449
440
|
def preprocess
|
450
|
-
# Load
|
441
|
+
# Load initial contexts
|
451
442
|
# Add terms and prefixes to local store for converting URIs
|
452
443
|
# Keep track of vocabulary from left-most profile
|
453
|
-
[
|
444
|
+
[XML_RDFA_CONTEXT, HTML_RDFA_CONTEXT].each do |uri|
|
454
445
|
prof = Profile.find(uri)
|
455
446
|
prof.prefixes.each_pair do |k, v|
|
456
447
|
@uri_to_prefix[v] = k
|
457
448
|
end
|
458
|
-
|
449
|
+
|
459
450
|
prof.terms.each_pair do |k, v|
|
460
451
|
@uri_to_term_or_curie[v] = k
|
461
452
|
end
|
462
|
-
|
453
|
+
|
463
454
|
@vocabulary = prof.vocabulary.to_s if prof.vocabulary
|
464
455
|
end
|
465
|
-
|
456
|
+
|
466
457
|
# Load defined prefixes
|
467
458
|
(@options[:prefixes] || {}).each_pair do |k, v|
|
468
459
|
@uri_to_prefix[v.to_s] = k
|
469
460
|
end
|
470
461
|
@options[:prefixes] = {} # Will define actual used when matched
|
471
|
-
|
462
|
+
|
472
463
|
# Process each statement to establish CURIEs and Terms
|
473
464
|
@graph.each {|statement| preprocess_statement(statement)}
|
474
465
|
end
|
475
|
-
|
466
|
+
|
476
467
|
# Order subjects for output. Override this to output subjects in another order.
|
477
468
|
#
|
478
469
|
# Uses #top_classes and #base_uri.
|
@@ -480,13 +471,13 @@ module RDF::RDFa
|
|
480
471
|
def order_subjects
|
481
472
|
seen = {}
|
482
473
|
subjects = []
|
483
|
-
|
474
|
+
|
484
475
|
# Start with base_uri
|
485
476
|
if base_uri && @subjects.keys.include?(base_uri)
|
486
477
|
subjects << base_uri
|
487
478
|
seen[base_uri] = true
|
488
479
|
end
|
489
|
-
|
480
|
+
|
490
481
|
# Add distinguished classes
|
491
482
|
top_classes.
|
492
483
|
select {|s| !seen.include?(s)}.
|
@@ -497,18 +488,18 @@ module RDF::RDFa
|
|
497
488
|
seen[subject] = true
|
498
489
|
end
|
499
490
|
end
|
500
|
-
|
491
|
+
|
501
492
|
# Sort subjects by resources over nodes, ref_counts and the subject URI itself
|
502
493
|
recursable = @subjects.keys.
|
503
494
|
select {|s| !seen.include?(s)}.
|
504
495
|
map {|r| [r.is_a?(RDF::Node) ? 1 : 0, ref_count(r), r]}.
|
505
496
|
sort
|
506
|
-
|
497
|
+
|
507
498
|
add_debug {"order_subjects: #{recursable.inspect}"}
|
508
499
|
|
509
500
|
subjects += recursable.map{|r| r.last}
|
510
501
|
end
|
511
|
-
|
502
|
+
|
512
503
|
# Take a hash from predicate uris to lists of values.
|
513
504
|
# Sort the lists of values. Return a sorted list of properties.
|
514
505
|
#
|
@@ -517,17 +508,17 @@ module RDF::RDFa
|
|
517
508
|
def order_properties(properties)
|
518
509
|
# Make sorted list of properties
|
519
510
|
prop_list = []
|
520
|
-
|
511
|
+
|
521
512
|
predicate_order.each do |prop|
|
522
513
|
next unless properties[prop.to_s]
|
523
514
|
prop_list << prop.to_s
|
524
515
|
end
|
525
|
-
|
516
|
+
|
526
517
|
properties.keys.sort.each do |prop|
|
527
518
|
next if prop_list.include?(prop.to_s)
|
528
519
|
prop_list << prop.to_s
|
529
520
|
end
|
530
|
-
|
521
|
+
|
531
522
|
add_debug {"order_properties: #{prop_list.join(', ')}"}
|
532
523
|
prop_list
|
533
524
|
end
|
@@ -546,7 +537,7 @@ module RDF::RDFa
|
|
546
537
|
get_curie(statement.object)
|
547
538
|
get_curie(statement.object.datatype) if statement.object.literal? && statement.object.has_datatype?
|
548
539
|
end
|
549
|
-
|
540
|
+
|
550
541
|
# Reset parser to run again
|
551
542
|
def reset
|
552
543
|
@depth = 0
|
@@ -580,16 +571,16 @@ module RDF::RDFa
|
|
580
571
|
# @return [Nokogiri::XML::Element, {Namespace}]
|
581
572
|
def subject(subject, options = {})
|
582
573
|
return if is_done?(subject)
|
583
|
-
|
574
|
+
|
584
575
|
subject_done(subject)
|
585
|
-
|
576
|
+
|
586
577
|
properties = {}
|
587
578
|
@graph.query(:subject => subject) do |st|
|
588
579
|
properties[st.predicate.to_s] ||= []
|
589
580
|
properties[st.predicate.to_s] << st.object
|
590
581
|
end
|
591
582
|
prop_list = order_properties(properties)
|
592
|
-
|
583
|
+
|
593
584
|
# Find appropriate template
|
594
585
|
curie ||= case
|
595
586
|
when subject.node?
|
@@ -604,7 +595,7 @@ module RDF::RDFa
|
|
604
595
|
|
605
596
|
typeof = [properties.delete(RDF.type.to_s)].flatten.compact.map {|r| get_curie(r)}.join(" ")
|
606
597
|
typeof = nil if typeof.empty?
|
607
|
-
|
598
|
+
|
608
599
|
# Nodes without a curie need a blank @typeof to generate a subject
|
609
600
|
typeof ||= "" unless curie
|
610
601
|
prop_list -= [RDF.type.to_s]
|
@@ -627,7 +618,7 @@ module RDF::RDFa
|
|
627
618
|
end
|
628
619
|
end
|
629
620
|
end
|
630
|
-
|
621
|
+
|
631
622
|
# Write a predicate with one or more values.
|
632
623
|
#
|
633
624
|
# Values may be a combination of Literal and Resource (Node or URI).
|
@@ -638,9 +629,9 @@ module RDF::RDFa
|
|
638
629
|
# @return [String]
|
639
630
|
def predicate(predicate, objects)
|
640
631
|
add_debug {"predicate: #{predicate.inspect}, objects: #{objects}"}
|
641
|
-
|
632
|
+
|
642
633
|
return if objects.to_a.empty?
|
643
|
-
|
634
|
+
|
644
635
|
add_debug {"predicate: #{get_curie(predicate)}"}
|
645
636
|
render_property(predicate, objects) do |o|
|
646
637
|
# Yields each object, for potential recursive definition.
|
@@ -648,7 +639,7 @@ module RDF::RDFa
|
|
648
639
|
depth {subject(o, :rel => get_curie(predicate), :element => (:li if objects.length > 1))} if !is_done?(o) && @subjects.include?(o)
|
649
640
|
end
|
650
641
|
end
|
651
|
-
|
642
|
+
|
652
643
|
# Haml rendering helper. Return CURIE for the literal datatype, if the literal is a typed literal.
|
653
644
|
#
|
654
645
|
# @param [RDF::Resource] resource
|
@@ -749,7 +740,7 @@ module RDF::RDFa
|
|
749
740
|
add_debug {"get_curie(#{uri}): none"}
|
750
741
|
uri
|
751
742
|
end
|
752
|
-
|
743
|
+
|
753
744
|
#add_debug {"get_curie(#{resource}) => #{curie}"}
|
754
745
|
|
755
746
|
@uri_to_term_or_curie[uri] = curie
|
@@ -757,7 +748,7 @@ module RDF::RDFa
|
|
757
748
|
raise RDF::WriterError, "Invalid URI #{uri.inspect}: #{e.message}"
|
758
749
|
end
|
759
750
|
private
|
760
|
-
|
751
|
+
|
761
752
|
##
|
762
753
|
# Haml rendering helper. Escape entities to avoid whitespace issues.
|
763
754
|
#
|
@@ -777,7 +768,7 @@ module RDF::RDFa
|
|
777
768
|
@depth -= 1
|
778
769
|
ret
|
779
770
|
end
|
780
|
-
|
771
|
+
|
781
772
|
# Set the template to use within block
|
782
773
|
def with_template(templ)
|
783
774
|
if templ
|
@@ -792,10 +783,10 @@ module RDF::RDFa
|
|
792
783
|
res = yield
|
793
784
|
# Restore template
|
794
785
|
@haml_template = old_template
|
795
|
-
|
786
|
+
|
796
787
|
res
|
797
788
|
end
|
798
|
-
|
789
|
+
|
799
790
|
# Render HAML
|
800
791
|
# @param [Symbol, String] template
|
801
792
|
# If a symbol, finds a matching template from haml_template, otherwise uses template as is
|
@@ -821,7 +812,7 @@ module RDF::RDFa
|
|
821
812
|
end
|
822
813
|
|
823
814
|
##
|
824
|
-
# Find a template appropriate for the subject.
|
815
|
+
# Find a template appropriate for the subject.
|
825
816
|
# Override this method to provide templates based on attributes of a given subject
|
826
817
|
#
|
827
818
|
# @param [RDF::URI] subject
|
@@ -832,7 +823,7 @@ module RDF::RDFa
|
|
832
823
|
def subject_done(subject)
|
833
824
|
@serialized[subject] = true
|
834
825
|
end
|
835
|
-
|
826
|
+
|
836
827
|
def is_done?(subject)
|
837
828
|
@serialized.include?(subject)
|
838
829
|
end
|