rdf-rdfa 0.3.6 → 0.3.7
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 +25 -25
- data/VERSION +1 -1
- data/lib/rdf/rdfa/expansion.rb +7 -7
- data/lib/rdf/rdfa/format.rb +15 -1
- data/lib/rdf/rdfa/reader.rb +116 -117
- data/lib/rdf/rdfa/writer.rb +46 -28
- data/lib/rdf/rdfa/writer/haml_templates.rb +51 -40
- metadata +110 -171
data/README
CHANGED
@@ -45,13 +45,13 @@ One significant RDF feature missing from RDFa was support for ordered collection
|
|
45
45
|
)
|
46
46
|
]
|
47
47
|
|
48
|
-
defines a playlist with an ordered set of tracks. RDFa adds the @
|
48
|
+
defines a playlist with an ordered set of tracks. RDFa adds the @inlist attribute, which is used to identify values (object or literal) that are to be placed in a list. The same playlist might be defined in RDFa as follows:
|
49
49
|
|
50
50
|
<div vocab="http://schema.org/" typeof="MusicPlaylist">
|
51
51
|
<span property="name">Classic Rock Playlist</span>
|
52
52
|
<meta property="numTracks" content="5"/>
|
53
53
|
|
54
|
-
<div rel="tracks"
|
54
|
+
<div rel="tracks" inlist="">
|
55
55
|
<div typeof="MusicRecording">
|
56
56
|
1.<span property="name">Sweet Home Alabama</span> -
|
57
57
|
<span property="byArtist">Lynard Skynard</span>
|
@@ -160,27 +160,27 @@ The template hash defines four Haml templates:
|
|
160
160
|
as those provided by a previous Reader. _title_ is taken from the first top-level subject
|
161
161
|
having an appropriate title property (as defined by the _heading_predicates_ option).
|
162
162
|
|
163
|
-
* _subject_: Subject Template, take a _subject_ and an
|
163
|
+
* _subject_: Subject Template, take a _subject_ and an ordered list of _predicate_s and yields
|
164
164
|
each _predicate_ to be rendered. Described further in {RDF::RDFa::Writer#render_subject}.
|
165
165
|
|
166
166
|
- if element == :li
|
167
|
-
%li{:
|
167
|
+
%li{:rel => rel, :resource => resource, :inlist => inlist}
|
168
168
|
- if typeof
|
169
|
-
%span.type!= typeof
|
169
|
+
%span{:rel => 'rdf:type', :resource => typeof}.type!= typeof
|
170
170
|
- predicates.each do |predicate|
|
171
171
|
!= yield(predicate)
|
172
172
|
- elsif rel && typeof
|
173
|
-
%div{:rel =>
|
174
|
-
%div{:about =>
|
173
|
+
%div{:rel => rel}
|
174
|
+
%div{:about => resource, :typeof => typeof}
|
175
175
|
%span.type!= typeof
|
176
176
|
- predicates.each do |predicate|
|
177
177
|
!= yield(predicate)
|
178
178
|
- elsif rel
|
179
|
-
%div{:rel =>
|
179
|
+
%div{:rel => rel, :resource => resource}
|
180
180
|
- predicates.each do |predicate|
|
181
181
|
!= yield(predicate)
|
182
182
|
- else
|
183
|
-
%div{:about =>
|
183
|
+
%div{:about => about, :typeof => typeof}
|
184
184
|
- if typeof
|
185
185
|
%span.type!= typeof
|
186
186
|
- predicates.each do |predicate|
|
@@ -198,27 +198,27 @@ The template hash defines four Haml templates:
|
|
198
198
|
* _property\_value_: Property Value Template, used for predicates having a single value; takes
|
199
199
|
a _predicate_, and a single-valued Array of _objects_. Described further in {RDF::RDFa::Writer#render\_property}.
|
200
200
|
|
201
|
-
- object = objects.first
|
202
201
|
- if heading_predicates.include?(predicate) && object.literal?
|
203
|
-
%h1{:property => get_curie(predicate), :content => get_content(object), :lang => get_lang(object), :datatype => get_dt_curie(object)}
|
202
|
+
%h1{:property => get_curie(predicate), :content => get_content(object), :lang => get_lang(object), :datatype => get_dt_curie(object), :inlist => inlist}= escape_entities(get_value(object))
|
204
203
|
- else
|
205
204
|
%div.property
|
206
205
|
%span.label
|
207
206
|
= get_predicate_name(predicate)
|
208
207
|
- if res = yield(object)
|
209
208
|
!= res
|
209
|
+
- elsif get_curie(object) == 'rdf:nil'
|
210
|
+
%span{:rel => get_curie(predicate), :inlist => ''}
|
210
211
|
- elsif object.node?
|
211
|
-
%span{:resource => get_curie(object), :rel => get_curie(predicate)}= get_curie(object)
|
212
|
+
%span{:resource => get_curie(object), :rel => get_curie(predicate), :inlist => inlist}= get_curie(object)
|
212
213
|
- elsif object.uri?
|
213
|
-
%a{:href => object.to_s, :rel => get_curie(predicate)}= object.to_s
|
214
|
+
%a{:href => object.to_s, :rel => get_curie(predicate), :inlist => inlist}= object.to_s
|
214
215
|
- elsif object.datatype == RDF.XMLLiteral
|
215
|
-
%span{:property => get_curie(predicate), :lang => get_lang(object), :datatype => get_dt_curie(object)}<!= get_value(object)
|
216
|
+
%span{:property => get_curie(predicate), :lang => get_lang(object), :datatype => get_dt_curie(object), :inlist => inlist}<!= get_value(object)
|
216
217
|
- else
|
217
|
-
%span{:property => get_curie(predicate), :content => get_content(object), :lang => get_lang(object), :datatype => get_dt_curie(object)}
|
218
|
+
%span{:property => get_curie(predicate), :content => get_content(object), :lang => get_lang(object), :datatype => get_dt_curie(object), :inlist => inlist}= escape_entities(get_value(object))
|
218
219
|
|
219
|
-
In addition to _predicate_ and _objects_, the template takes
|
220
|
-
|
221
|
-
specified, as the conditions dictate.
|
220
|
+
In addition to _predicate_ and _objects_, the template takes _inlist_ to indicate that the
|
221
|
+
property is part of an rdf:List.
|
222
222
|
|
223
223
|
Also, if the predicate is identified as a _heading predicate_ (via _:heading\_predicates_ option),
|
224
224
|
it will generate a heading element, and may use the value as the document title.
|
@@ -244,19 +244,19 @@ The template hash defines four Haml templates:
|
|
244
244
|
%div.property
|
245
245
|
%span.label
|
246
246
|
= get_predicate_name(predicate)
|
247
|
-
%ul
|
247
|
+
%ul
|
248
248
|
- objects.each do |object|
|
249
249
|
- if res = yield(object)
|
250
250
|
!= res
|
251
251
|
- elsif object.node?
|
252
|
-
%li{:resource => get_curie(object)}= get_curie(object)
|
252
|
+
%li{:rel => get_curie(predicate), :resource => get_curie(object), :inlist => inlist}= get_curie(object)
|
253
253
|
- elsif object.uri?
|
254
254
|
%li
|
255
|
-
%a{:href => object.to_s}= object.to_s
|
255
|
+
%a{:rel => get_curie(predicate), :href => object.to_s, :inlist => inlist}= object.to_s
|
256
256
|
- elsif object.datatype == RDF.XMLLiteral
|
257
|
-
%li{:lang => get_lang(object), :datatype => get_curie(object.datatype)}<!= get_value(object)
|
257
|
+
%li{:property => get_curie(predicate), :lang => get_lang(object), :datatype => get_curie(object.datatype), :inlist => inlist}<!= get_value(object)
|
258
258
|
- else
|
259
|
-
%li{:content => get_content(object), :lang => get_lang(object), :datatype => get_dt_curie(object)}
|
259
|
+
%li{:property => get_curie(predicate), :content => get_content(object), :lang => get_lang(object), :datatype => get_dt_curie(object), :inlist => inlist}= escape_entities(get_value(object))
|
260
260
|
|
261
261
|
In this case, and unordered list is used for output. Creates output similar to the following:
|
262
262
|
|
@@ -330,7 +330,7 @@ Full documentation available on [Rubydoc.info][RDFa doc]
|
|
330
330
|
## Resources
|
331
331
|
* [RDF.rb][RDF.rb]
|
332
332
|
* [Distiller](http://rdf.greggkellogg.net/distiller)
|
333
|
-
* [Documentation]
|
333
|
+
* [Documentation][RDFa doc]
|
334
334
|
* [History](file:file.History.html)
|
335
335
|
* [RDFa 1.1 Core][RDFa 1.1 Core]
|
336
336
|
* [XHTML+RDFa 1.1][XHTML+RDFa 1.1]
|
@@ -375,6 +375,6 @@ see <http://unlicense.org/> or the accompanying {file:UNLICENSE} file.
|
|
375
375
|
[RDFa 1.1 Core]: http://www.w3.org/TR/2011/WD-rdfa-core-20110331/ "RDFa 1.1 Core"
|
376
376
|
[XHTML+RDFa 1.1]: http://www.w3.org/TR/2011/WD-xhtml-rdfa-20110331/ "XHTML+RDFa 1.1"
|
377
377
|
[RDFa-test-suite]: http://rdfa.digitalbazaar.com/test-suite/ "RDFa test suite"
|
378
|
-
[RDFa doc]: http://rubydoc.info/github/gkellogg/rdf-rdfa/
|
378
|
+
[RDFa doc]: http://rubydoc.info/github/gkellogg/rdf-rdfa/frames
|
379
379
|
[Haml]: http://haml-lang.com/
|
380
380
|
[Turtle]: http://www.w3.org/TR/2011/WD-turtle-20110809/
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.7
|
data/lib/rdf/rdfa/expansion.rb
CHANGED
@@ -19,17 +19,18 @@ module RDF::RDFa
|
|
19
19
|
# Subsequently, perform RDFS expansion using rules rdfs5, rdfs7, rdfs9, and rdfs11 placing
|
20
20
|
# resulting triples into the default graph. Iterate on this step until no more triples are added.
|
21
21
|
#
|
22
|
+
# @example
|
22
23
|
# rdfs5
|
23
|
-
# {uuu rdfs:subPropertyOf vvv . vvv rdfs:subPropertyOf xxx} => {
|
24
|
+
# {uuu rdfs:subPropertyOf vvv . vvv rdfs:subPropertyOf xxx} => {uuu rdfs:subPropertyOf xxx}
|
24
25
|
#
|
25
26
|
# rdfs7
|
26
|
-
# {aaa rdfs:subPropertyOf bbb . uuu aaa yyy} => {
|
27
|
+
# {aaa rdfs:subPropertyOf bbb . uuu aaa yyy} => {uuu bbb yyy}
|
27
28
|
#
|
28
29
|
# rdfs9
|
29
|
-
# {uuu rdfs:subClassOf xxx . vvv rdf:type uuu} => {
|
30
|
+
# {uuu rdfs:subClassOf xxx . vvv rdf:type uuu} => {vvv rdf:type xxx}
|
30
31
|
#
|
31
32
|
# rdfs11
|
32
|
-
# {uuu rdfs:subClassOf vvv . vvv rdfs:subClassOf xxx} => {
|
33
|
+
# {uuu rdfs:subClassOf vvv . vvv rdfs:subClassOf xxx} => {uuu rdfs:subClassOf xxx}
|
33
34
|
#
|
34
35
|
# @return [RDF::Graph]
|
35
36
|
def expand
|
@@ -41,9 +42,8 @@ module RDF::RDFa
|
|
41
42
|
|
42
43
|
# Vocabularies managed in vocab_repo, and copied to repo for processing.
|
43
44
|
# This allows for persistent storage of vocabularies
|
44
|
-
@@vocab_repo
|
45
|
-
|
46
|
-
end
|
45
|
+
@@vocab_repo = @options[:vocab_repository] if @options.has_key?(:vocab_repository)
|
46
|
+
@@vocab_repo ||= RDF::Repository.new.insert(*COOKED_VOCAB_STATEMENTS)
|
47
47
|
|
48
48
|
vocabs = repo.query(:predicate => RDF::RDFA.hasVocabulary).to_a.map(&:object)
|
49
49
|
vocabs.each do |vocab|
|
data/lib/rdf/rdfa/format.rb
CHANGED
@@ -22,6 +22,21 @@ module RDF::RDFa
|
|
22
22
|
content_type 'text/html', :extension => :html
|
23
23
|
reader { RDF::RDFa::Reader }
|
24
24
|
writer { RDF::RDFa::Writer }
|
25
|
+
|
26
|
+
##
|
27
|
+
# Sample detection to see if it matches RDFa (not RDF/XML or Microdata)
|
28
|
+
#
|
29
|
+
# Use a text sample to detect the format of an input file. Sub-classes implement
|
30
|
+
# a matcher sufficient to detect probably format matches, including disambiguating
|
31
|
+
# between other similar formats.
|
32
|
+
#
|
33
|
+
# @param [String] sample Beginning several bytes (~ 1K) of input.
|
34
|
+
# @return [Boolean]
|
35
|
+
def self.detect(sample)
|
36
|
+
(sample.match(/<[^>]*(about|resource|prefix|typeof|property|vocab)\s*="[^>]*>/m) ||
|
37
|
+
sample.match(/<[^>]*DOCTYPE\s+html[^>]*>.*xmlns:/im)
|
38
|
+
) && !sample.match(/<(\w+:)?(RDF)/)
|
39
|
+
end
|
25
40
|
end
|
26
41
|
|
27
42
|
# Aliases for RDFa::Format
|
@@ -34,7 +49,6 @@ module RDF::RDFa
|
|
34
49
|
# RDF::Format.for(:html).writer # RDF::RDFa::Writer
|
35
50
|
class HTML < RDF::Format
|
36
51
|
content_encoding 'utf-8'
|
37
|
-
content_type 'text/html', :extension => :html
|
38
52
|
reader { RDF::RDFa::Reader }
|
39
53
|
writer { RDF::RDFa::Writer }
|
40
54
|
end
|
data/lib/rdf/rdfa/reader.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'nokogiri' # FIXME: Implement using different modules as in RDF::TriX
|
2
|
+
require 'rdf/ntriples'
|
2
3
|
|
3
4
|
module RDF::RDFa
|
4
5
|
##
|
@@ -50,12 +51,6 @@ module RDF::RDFa
|
|
50
51
|
# @attr [:"rdfa1.0", :"rdfa1.1"]
|
51
52
|
attr_reader :version
|
52
53
|
|
53
|
-
##
|
54
|
-
# Returns the base URI determined by this reader.
|
55
|
-
#
|
56
|
-
# @attr [RDF::URI]
|
57
|
-
attr_reader :base_uri
|
58
|
-
|
59
54
|
# The Recursive Baggage
|
60
55
|
# @private
|
61
56
|
class EvaluationContext # :nodoc:
|
@@ -143,11 +138,11 @@ module RDF::RDFa
|
|
143
138
|
attr :default_vocabulary, true
|
144
139
|
|
145
140
|
##
|
146
|
-
#
|
141
|
+
# lists
|
147
142
|
#
|
148
|
-
# A hash associating
|
143
|
+
# A hash associating lists with properties.
|
149
144
|
# @attr [Hash{RDF::URI => Array<RDF::Resource>}]
|
150
|
-
attr :
|
145
|
+
attr :list_mapping, true
|
151
146
|
|
152
147
|
# @param [RDF::URI] base
|
153
148
|
# @param [Hash] host_defaults
|
@@ -174,7 +169,7 @@ module RDF::RDFa
|
|
174
169
|
@uri_mappings = from.uri_mappings.clone
|
175
170
|
@incomplete_triples = from.incomplete_triples.clone
|
176
171
|
@namespaces = from.namespaces.clone
|
177
|
-
@
|
172
|
+
@list_mapping = from.list_mapping # Don't clone
|
178
173
|
end
|
179
174
|
|
180
175
|
def inspect
|
@@ -184,7 +179,7 @@ module RDF::RDFa
|
|
184
179
|
v << "uri_mappings[#{uri_mappings.keys.length}]"
|
185
180
|
v << "incomplete_triples[#{incomplete_triples.length}]"
|
186
181
|
v << "term_mappings[#{term_mappings.keys.length}]"
|
187
|
-
v << "
|
182
|
+
v << "lists[#{list_mapping.keys.length}]" if list_mapping
|
188
183
|
v.join(", ")
|
189
184
|
end
|
190
185
|
end
|
@@ -228,7 +223,6 @@ module RDF::RDFa
|
|
228
223
|
def initialize(input = $stdin, options = {}, &block)
|
229
224
|
super do
|
230
225
|
@debug = options[:debug]
|
231
|
-
@base_uri = uri(options[:base_uri])
|
232
226
|
|
233
227
|
detect_host_language_version(input, options)
|
234
228
|
|
@@ -246,17 +240,17 @@ module RDF::RDFa
|
|
246
240
|
|
247
241
|
case @host_language
|
248
242
|
when :html4, :html5
|
249
|
-
Nokogiri::HTML.parse(input,
|
243
|
+
Nokogiri::HTML.parse(input, base_uri.to_s, options[:encoding])
|
250
244
|
else
|
251
|
-
Nokogiri::XML.parse(input,
|
245
|
+
Nokogiri::XML.parse(input, base_uri.to_s, options[:encoding])
|
252
246
|
end
|
253
247
|
end
|
254
248
|
|
255
|
-
if (@doc.nil? || @doc.root.nil?)
|
249
|
+
if ((@doc.nil? || @doc.root.nil?) && validate?)
|
256
250
|
add_error(nil, "Empty document", RDF::RDFA.DocumentError)
|
257
251
|
raise RDF::ReaderError, "Empty Document"
|
258
252
|
end
|
259
|
-
add_warning(nil, "
|
253
|
+
add_warning(nil, "Syntax errors:\n#{@doc.errors}", RDF::RDFA.DocumentError) if !@doc.errors.empty? && validate?
|
260
254
|
|
261
255
|
# Section 4.2 RDFa Host Language Conformance
|
262
256
|
#
|
@@ -316,7 +310,7 @@ module RDF::RDFa
|
|
316
310
|
input.rewind
|
317
311
|
string = input.read(1000)
|
318
312
|
input.rewind
|
319
|
-
string
|
313
|
+
string.to_s
|
320
314
|
else
|
321
315
|
input.to_s[0..1000]
|
322
316
|
end
|
@@ -394,7 +388,7 @@ module RDF::RDFa
|
|
394
388
|
end
|
395
389
|
|
396
390
|
# parse
|
397
|
-
parse_whole_document(@doc,
|
391
|
+
parse_whole_document(@doc, RDF::URI(base_uri))
|
398
392
|
end
|
399
393
|
end
|
400
394
|
|
@@ -422,7 +416,7 @@ module RDF::RDFa
|
|
422
416
|
|
423
417
|
# Figure out the document path, if it is a Nokogiri::XML::Element or Attribute
|
424
418
|
def node_path(node)
|
425
|
-
"<#{
|
419
|
+
"<#{base_uri}>" + case node
|
426
420
|
when Nokogiri::XML::Node then node.display_path
|
427
421
|
else node.to_s
|
428
422
|
end
|
@@ -460,7 +454,7 @@ module RDF::RDFa
|
|
460
454
|
@processor_graph << RDF::Statement.new(n, RDF["type"], process_class)
|
461
455
|
@processor_graph << RDF::Statement.new(n, RDF::DC.description, message)
|
462
456
|
@processor_graph << RDF::Statement.new(n, RDF::DC.date, RDF::Literal::Date.new(DateTime.now))
|
463
|
-
@processor_graph << RDF::Statement.new(n, RDF::RDFA.context,
|
457
|
+
@processor_graph << RDF::Statement.new(n, RDF::RDFA.context, base_uri)
|
464
458
|
nc = RDF::Node.new
|
465
459
|
@processor_graph << RDF::Statement.new(nc, RDF["type"], RDF::PTR.XPathPointer)
|
466
460
|
@processor_graph << RDF::Statement.new(nc, RDF::PTR.expression, node.path) if node.respond_to?(:path)
|
@@ -528,7 +522,7 @@ module RDF::RDFa
|
|
528
522
|
map {|uri| uri(uri).normalize}.
|
529
523
|
each do |uri|
|
530
524
|
# Don't try to open ourselves!
|
531
|
-
if
|
525
|
+
if base_uri == uri
|
532
526
|
add_debug(element, "process_profile: skip recursive profile <#{uri}>")
|
533
527
|
next
|
534
528
|
end
|
@@ -637,7 +631,7 @@ module RDF::RDFa
|
|
637
631
|
language = evaluation_context.language
|
638
632
|
term_mappings = evaluation_context.term_mappings.clone
|
639
633
|
default_vocabulary = evaluation_context.default_vocabulary
|
640
|
-
|
634
|
+
list_mapping = evaluation_context.list_mapping
|
641
635
|
|
642
636
|
# shortcut
|
643
637
|
attrs = element.attributes
|
@@ -659,12 +653,12 @@ module RDF::RDFa
|
|
659
653
|
rel = attrs['rel'].to_s.strip if attrs['rel']
|
660
654
|
rev = attrs['rev'].to_s.strip if attrs['rev']
|
661
655
|
|
662
|
-
#
|
663
|
-
# @
|
656
|
+
# Lists:
|
657
|
+
# @inlist
|
664
658
|
# an attribute (value ignored) used to indicate that the object associated with a
|
665
|
-
# @rel or @property attribute on the same element is to be added to the
|
666
|
-
# for that property. Causes a
|
667
|
-
|
659
|
+
# @rel or @property attribute on the same element is to be added to the list
|
660
|
+
# for that property. Causes a list to be created if it does not already exist.
|
661
|
+
inlist = attrs['inlist'].to_s.strip if attrs.has_key?('inlist')
|
668
662
|
|
669
663
|
add_debug(element) do
|
670
664
|
attrs = {
|
@@ -679,7 +673,7 @@ module RDF::RDFa
|
|
679
673
|
:datatype => datatype,
|
680
674
|
:rel => rel,
|
681
675
|
:rev => rev,
|
682
|
-
:
|
676
|
+
:inlist => inlist,
|
683
677
|
}.select {|k,v| v}
|
684
678
|
|
685
679
|
"attrs " + attrs.map {|a| "#{a.first}: #{a.last}"}.join(", ")
|
@@ -738,12 +732,12 @@ module RDF::RDFa
|
|
738
732
|
:uri_mappings => uri_mappings,
|
739
733
|
:term_mappings => term_mappings,
|
740
734
|
:vocab => default_vocabulary,
|
741
|
-
:restrictions => TERMorCURIEorAbsURI
|
735
|
+
:restrictions => TERMorCURIEorAbsURI.fetch(@version, []))
|
742
736
|
revs = process_uris(element, rev, evaluation_context, base,
|
743
737
|
:uri_mappings => uri_mappings,
|
744
738
|
:term_mappings => term_mappings,
|
745
739
|
:vocab => default_vocabulary,
|
746
|
-
:restrictions => TERMorCURIEorAbsURI
|
740
|
+
:restrictions => TERMorCURIEorAbsURI.fetch(@version, []))
|
747
741
|
|
748
742
|
add_debug(element) do
|
749
743
|
"rels: #{rels.join(" ")}, revs: #{revs.join(" ")}"
|
@@ -755,15 +749,15 @@ module RDF::RDFa
|
|
755
749
|
new_subject = if about
|
756
750
|
process_uri(element, about, evaluation_context, base,
|
757
751
|
:uri_mappings => uri_mappings,
|
758
|
-
:restrictions => SafeCURIEorCURIEorURI
|
759
|
-
elsif src
|
760
|
-
process_uri(element, src, evaluation_context, base, :restrictions => [:uri])
|
752
|
+
:restrictions => SafeCURIEorCURIEorURI.fetch(@version, []))
|
761
753
|
elsif resource
|
762
754
|
process_uri(element, resource, evaluation_context, base,
|
763
755
|
:uri_mappings => uri_mappings,
|
764
|
-
:restrictions => SafeCURIEorCURIEorURI
|
756
|
+
:restrictions => SafeCURIEorCURIEorURI.fetch(@version, []))
|
765
757
|
elsif href
|
766
758
|
process_uri(element, href, evaluation_context, base, :restrictions => [:uri])
|
759
|
+
elsif src
|
760
|
+
process_uri(element, src, evaluation_context, base, :restrictions => [:uri])
|
767
761
|
end
|
768
762
|
|
769
763
|
# If no URI is provided by a resource attribute, then the first match from the following rules
|
@@ -786,17 +780,17 @@ module RDF::RDFa
|
|
786
780
|
skip = true unless property
|
787
781
|
evaluation_context.parent_object
|
788
782
|
end
|
789
|
-
add_debug(element, "[Step 5] new_subject: #{new_subject}, skip = #{skip}")
|
783
|
+
add_debug(element, "[Step 5] new_subject: #{new_subject.to_ntriples rescue 'nil'}, skip = #{skip}")
|
790
784
|
else
|
791
785
|
# [7.5 Step 6]
|
792
786
|
# If the current element does contain a @rel or @rev attribute, then the next step is to
|
793
787
|
# establish both a value for new subject and a value for current object resource:
|
794
788
|
new_subject = process_uri(element, about, evaluation_context, base,
|
795
789
|
:uri_mappings => uri_mappings,
|
796
|
-
:restrictions => SafeCURIEorCURIEorURI
|
797
|
-
|
790
|
+
:restrictions => SafeCURIEorCURIEorURI.fetch(@version, []))
|
791
|
+
new_subject ||= process_uri(element, src, evaluation_context, base,
|
798
792
|
:uri_mappings => uri_mappings,
|
799
|
-
:restrictions => [:uri])
|
793
|
+
:restrictions => [:uri]) if @version == :"rdfa1.0"
|
800
794
|
|
801
795
|
# If no URI is provided then the first match from the following rules will apply
|
802
796
|
new_subject ||= if element == @doc.root && base
|
@@ -818,10 +812,13 @@ module RDF::RDFa
|
|
818
812
|
current_object_resource = if resource
|
819
813
|
process_uri(element, resource, evaluation_context, base,
|
820
814
|
:uri_mappings => uri_mappings,
|
821
|
-
:restrictions => SafeCURIEorCURIEorURI
|
815
|
+
:restrictions => SafeCURIEorCURIEorURI.fetch(@version, []))
|
822
816
|
elsif href
|
823
817
|
process_uri(element, href, evaluation_context, base,
|
824
818
|
:restrictions => [:uri])
|
819
|
+
elsif src && @version != :"rdfa1.0"
|
820
|
+
process_uri(element, src, evaluation_context, base,
|
821
|
+
:restrictions => [:uri])
|
825
822
|
end
|
826
823
|
|
827
824
|
add_debug(element, "[Step 6] new_subject: #{new_subject}, current_object_resource = #{current_object_resource.nil? ? 'nil' : current_object_resource}")
|
@@ -834,40 +831,41 @@ module RDF::RDFa
|
|
834
831
|
:uri_mappings => uri_mappings,
|
835
832
|
:term_mappings => term_mappings,
|
836
833
|
:vocab => default_vocabulary,
|
837
|
-
:restrictions => TERMorCURIEorAbsURI
|
834
|
+
:restrictions => TERMorCURIEorAbsURI.fetch(@version, []))
|
838
835
|
add_debug(element, "typeof: #{typeof}")
|
839
836
|
types.each do |one_type|
|
840
837
|
add_triple(element, new_subject, RDF["type"], one_type)
|
841
838
|
end
|
842
839
|
end
|
843
840
|
|
844
|
-
#
|
845
|
-
#
|
846
|
-
# the
|
847
|
-
|
848
|
-
|
841
|
+
# Create new List mapping [step 8]
|
842
|
+
#
|
843
|
+
# If in any of the previous steps a new subject was set to a non-null value different from the parent object;
|
844
|
+
# The list mapping taken from the evaluation context is set to a new, empty mapping.
|
845
|
+
if (new_subject && (new_subject != evaluation_context.parent_subject || list_mapping.nil?))
|
846
|
+
list_mapping = {}
|
849
847
|
add_debug(element) do
|
850
|
-
"
|
851
|
-
"ns: #{new_subject}, " +
|
852
|
-
"ps: #{evaluation_context.parent_subject}"
|
848
|
+
"[Step 8]: create new list mapping(#{list_mapping.object_id}) " +
|
849
|
+
"ns: #{new_subject.to_ntriples}, " +
|
850
|
+
"ps: #{evaluation_context.parent_subject.to_ntriples rescue 'nil'}"
|
853
851
|
end
|
854
852
|
end
|
855
853
|
|
856
|
-
# Generate triples with given object [Step
|
854
|
+
# Generate triples with given object [Step 9]
|
857
855
|
#
|
858
|
-
#
|
859
|
-
#
|
856
|
+
# If the current element has a @inlist attribute, add the property to the
|
857
|
+
# list associated with that property, creating a new list if necessary.
|
860
858
|
if new_subject and current_object_resource
|
861
859
|
rels.each do |r|
|
862
|
-
if
|
863
|
-
# If the current
|
864
|
-
# instantiate a new
|
865
|
-
unless
|
866
|
-
|
867
|
-
add_debug(element) {"
|
860
|
+
if inlist
|
861
|
+
# If the current list mapping does not contain a list associated with this IRI,
|
862
|
+
# instantiate a new list
|
863
|
+
unless list_mapping[r]
|
864
|
+
list_mapping[r] = RDF::List.new
|
865
|
+
add_debug(element) {"list(#{r}): create #{list_mapping[r].inspect}"}
|
868
866
|
end
|
869
|
-
add_debug(element, "
|
870
|
-
|
867
|
+
add_debug(element, "[Step 9] add #{current_object_resource.to_ntriples} to #{r} #{list_mapping[r].inspect}")
|
868
|
+
list_mapping[r] << current_object_resource
|
871
869
|
else
|
872
870
|
add_triple(element, new_subject, r, current_object_resource)
|
873
871
|
end
|
@@ -877,23 +875,23 @@ module RDF::RDFa
|
|
877
875
|
add_triple(element, current_object_resource, r, new_subject)
|
878
876
|
end
|
879
877
|
elsif rel || rev
|
880
|
-
# Incomplete triples and bnode creation [Step
|
881
|
-
add_debug(element) {"[Step
|
878
|
+
# Incomplete triples and bnode creation [Step 10]
|
879
|
+
add_debug(element) {"[Step 10] incompletes: rels: #{rels}, revs: #{revs}"}
|
882
880
|
current_object_resource = RDF::Node.new
|
883
881
|
|
884
882
|
# predicate: full IRI
|
885
883
|
# direction: forward/reverse
|
886
|
-
#
|
884
|
+
# lists: Save into list, don't generate triple
|
887
885
|
|
888
886
|
rels.each do |r|
|
889
|
-
if
|
890
|
-
# If the current
|
891
|
-
# instantiate a new
|
892
|
-
unless
|
893
|
-
|
894
|
-
add_debug(element) {"
|
887
|
+
if inlist
|
888
|
+
# If the current list mapping does not contain a list associated with this IRI,
|
889
|
+
# instantiate a new list
|
890
|
+
unless list_mapping[r]
|
891
|
+
list_mapping[r] = RDF::List.new
|
892
|
+
add_debug(element) {"[Step 10] list(#{r}): create #{list_mapping[r].inspect}"}
|
895
893
|
end
|
896
|
-
incomplete_triples << {:
|
894
|
+
incomplete_triples << {:list => list_mapping[r], :direction => :none}
|
897
895
|
else
|
898
896
|
incomplete_triples << {:predicate => r, :direction => :forward}
|
899
897
|
end
|
@@ -904,22 +902,22 @@ module RDF::RDFa
|
|
904
902
|
end
|
905
903
|
end
|
906
904
|
|
907
|
-
# Establish current object literal [Step
|
905
|
+
# Establish current object literal [Step 11]
|
908
906
|
#
|
909
|
-
#
|
910
|
-
#
|
907
|
+
# If the current element has a @inlist attribute, add the property to the
|
908
|
+
# list associated with that property, creating a new list if necessary.
|
911
909
|
if property
|
912
910
|
properties = process_uris(element, property, evaluation_context, base,
|
913
911
|
:uri_mappings => uri_mappings,
|
914
912
|
:term_mappings => term_mappings,
|
915
913
|
:vocab => default_vocabulary,
|
916
|
-
:restrictions => TERMorCURIEorAbsURIprop
|
914
|
+
:restrictions => TERMorCURIEorAbsURIprop.fetch(@version, []))
|
917
915
|
|
918
916
|
properties.reject! do |p|
|
919
917
|
if p.is_a?(RDF::URI)
|
920
918
|
false
|
921
919
|
else
|
922
|
-
add_debug(element, "predicate #{p.
|
920
|
+
add_debug(element, "[Step 11] predicate #{p.to_ntriples} must be a URI")
|
923
921
|
true
|
924
922
|
end
|
925
923
|
end
|
@@ -932,16 +930,16 @@ module RDF::RDFa
|
|
932
930
|
:uri_mappings => uri_mappings,
|
933
931
|
:term_mappings => term_mappings,
|
934
932
|
:vocab => default_vocabulary,
|
935
|
-
:restrictions => TERMorCURIEorAbsURI
|
933
|
+
:restrictions => TERMorCURIEorAbsURI.fetch(@version, [])) unless datatype.to_s.empty?
|
936
934
|
begin
|
937
935
|
current_object_literal = if !datatype.to_s.empty? && datatype.to_s != RDF.XMLLiteral.to_s
|
938
936
|
# typed literal
|
939
|
-
add_debug(element, "[Step
|
937
|
+
add_debug(element, "[Step 11] typed literal (#{datatype})")
|
940
938
|
RDF::Literal.new(content || element.inner_text.to_s, :datatype => datatype, :language => language, :validate => validate?, :canonicalize => canonicalize?)
|
941
939
|
elsif @version == :"rdfa1.1"
|
942
940
|
if datatype.to_s == RDF.XMLLiteral.to_s
|
943
941
|
# XML Literal
|
944
|
-
add_debug(element) {"[Step
|
942
|
+
add_debug(element) {"[Step 11(1.1)] XML Literal: #{element.inner_html}"}
|
945
943
|
|
946
944
|
# In order to maintain maximum portability of this literal, any children of the current node that are
|
947
945
|
# elements must have the current in scope XML namespace declarations (if any) declared on the
|
@@ -961,17 +959,17 @@ module RDF::RDFa
|
|
961
959
|
end
|
962
960
|
else
|
963
961
|
# plain literal
|
964
|
-
add_debug(element, "[Step
|
962
|
+
add_debug(element, "[Step 11(1.1)] plain literal")
|
965
963
|
RDF::Literal.new(content || element.inner_text.to_s, :language => language, :validate => validate?, :canonicalize => canonicalize?)
|
966
964
|
end
|
967
965
|
else
|
968
966
|
if content || (children_node_types == [Nokogiri::XML::Text]) || (element.children.length == 0) || datatype == ""
|
969
967
|
# plain literal
|
970
|
-
add_debug(element, "[Step
|
968
|
+
add_debug(element, "[Step 11 (1.0)] plain literal")
|
971
969
|
RDF::Literal.new(content || element.inner_text.to_s, :language => language, :validate => validate?, :canonicalize => canonicalize?)
|
972
970
|
elsif children_node_types != [Nokogiri::XML::Text] and (datatype == nil or datatype.to_s == RDF.XMLLiteral.to_s)
|
973
971
|
# XML Literal
|
974
|
-
add_debug(element) {"[Step
|
972
|
+
add_debug(element) {"[Step 11 (1.0)] XML Literal: #{element.inner_html}"}
|
975
973
|
recurse = false
|
976
974
|
RDF::Literal.new(element.inner_html,
|
977
975
|
:datatype => RDF.XMLLiteral,
|
@@ -987,16 +985,16 @@ module RDF::RDFa
|
|
987
985
|
|
988
986
|
# add each property
|
989
987
|
properties.each do |p|
|
990
|
-
#
|
991
|
-
if
|
992
|
-
# If the current
|
993
|
-
# instantiate a new
|
994
|
-
unless
|
995
|
-
|
996
|
-
add_debug(element) {"
|
988
|
+
# Lists: If element has an @inlist attribute, add the value to a list
|
989
|
+
if inlist
|
990
|
+
# If the current list mapping does not contain a list associated with this IRI,
|
991
|
+
# instantiate a new list
|
992
|
+
unless list_mapping[p]
|
993
|
+
list_mapping[p] = RDF::List.new
|
994
|
+
add_debug(element) {"[Step 11] lists(#{p}): create #{list_mapping[p].inspect}"}
|
997
995
|
end
|
998
|
-
add_debug(element) {"
|
999
|
-
|
996
|
+
add_debug(element) {"[Step 11] add #{current_object_literal.to_ntriples} to #{p.to_ntriples} #{list_mapping[p].inspect}"}
|
997
|
+
list_mapping[p] << current_object_literal
|
1000
998
|
elsif new_subject
|
1001
999
|
add_triple(element, new_subject, p, current_object_literal)
|
1002
1000
|
end
|
@@ -1004,26 +1002,27 @@ module RDF::RDFa
|
|
1004
1002
|
end
|
1005
1003
|
|
1006
1004
|
if not skip and new_subject && !evaluation_context.incomplete_triples.empty?
|
1007
|
-
# Complete the incomplete triples from the evaluation context [Step
|
1005
|
+
# Complete the incomplete triples from the evaluation context [Step 12]
|
1008
1006
|
add_debug(element) do
|
1009
|
-
"[Step
|
1010
|
-
"new_subject=#{new_subject.
|
1007
|
+
"[Step 12] complete incomplete triples: " +
|
1008
|
+
"new_subject=#{new_subject.to_ntriples}, " +
|
1011
1009
|
"completes=#{evaluation_context.incomplete_triples.inspect}"
|
1012
1010
|
end
|
1013
1011
|
|
1014
1012
|
evaluation_context.incomplete_triples.each do |trip|
|
1015
|
-
|
1016
|
-
|
1017
|
-
|
1018
|
-
|
1013
|
+
case trip[:direction]
|
1014
|
+
when :none
|
1015
|
+
add_debug(element) {"[Step 12] add #{new_subject.to_ntriples} to #{trip[:list].inspect}"}
|
1016
|
+
trip[:list] << new_subject
|
1017
|
+
when :forward
|
1019
1018
|
add_triple(element, evaluation_context.parent_subject, trip[:predicate], new_subject)
|
1020
|
-
|
1019
|
+
when :reverse
|
1021
1020
|
add_triple(element, new_subject, trip[:predicate], evaluation_context.parent_subject)
|
1022
1021
|
end
|
1023
1022
|
end
|
1024
1023
|
end
|
1025
1024
|
|
1026
|
-
# Create a new evaluation context and proceed recursively [Step
|
1025
|
+
# Create a new evaluation context and proceed recursively [Step 13]
|
1027
1026
|
if recurse
|
1028
1027
|
if skip
|
1029
1028
|
if language == evaluation_context.language &&
|
@@ -1031,9 +1030,9 @@ module RDF::RDFa
|
|
1031
1030
|
term_mappings == evaluation_context.term_mappings &&
|
1032
1031
|
default_vocabulary == evaluation_context.default_vocabulary &&
|
1033
1032
|
base == evaluation_context.base &&
|
1034
|
-
|
1033
|
+
list_mapping == evaluation_context.list_mapping
|
1035
1034
|
new_ec = evaluation_context
|
1036
|
-
add_debug(element, "[Step
|
1035
|
+
add_debug(element, "[Step 13] skip: reused ec")
|
1037
1036
|
else
|
1038
1037
|
new_ec = evaluation_context.clone
|
1039
1038
|
new_ec.base = base
|
@@ -1042,8 +1041,8 @@ module RDF::RDFa
|
|
1042
1041
|
new_ec.namespaces = namespaces
|
1043
1042
|
new_ec.term_mappings = term_mappings
|
1044
1043
|
new_ec.default_vocabulary = default_vocabulary
|
1045
|
-
new_ec.
|
1046
|
-
add_debug(element, "[Step
|
1044
|
+
new_ec.list_mapping = list_mapping
|
1045
|
+
add_debug(element, "[Step 13] skip: cloned ec")
|
1047
1046
|
end
|
1048
1047
|
else
|
1049
1048
|
# create a new evaluation context
|
@@ -1056,8 +1055,8 @@ module RDF::RDFa
|
|
1056
1055
|
new_ec.language = language
|
1057
1056
|
new_ec.term_mappings = term_mappings
|
1058
1057
|
new_ec.default_vocabulary = default_vocabulary
|
1059
|
-
new_ec.
|
1060
|
-
add_debug(element, "[Step
|
1058
|
+
new_ec.list_mapping = list_mapping
|
1059
|
+
add_debug(element, "[Step 13] new ec")
|
1061
1060
|
end
|
1062
1061
|
|
1063
1062
|
element.children.each do |child|
|
@@ -1065,25 +1064,25 @@ module RDF::RDFa
|
|
1065
1064
|
traverse(child, new_ec) if child.class == Nokogiri::XML::Element
|
1066
1065
|
end
|
1067
1066
|
|
1068
|
-
#
|
1067
|
+
# Step 14: after traversing through child elements, for each list associated with
|
1069
1068
|
# a property
|
1070
|
-
|
1071
|
-
# if that
|
1072
|
-
|
1073
|
-
add_debug(element) {"
|
1074
|
-
if
|
1075
|
-
add_debug(element) {"
|
1076
|
-
# Generate an rdf:List with the elements of that
|
1077
|
-
|
1069
|
+
(list_mapping || {}).each do |p, l|
|
1070
|
+
# if that list is different from the evaluation context
|
1071
|
+
ec_list = evaluation_context.list_mapping[p] if evaluation_context.list_mapping
|
1072
|
+
add_debug(element) {"[Step 14] time to create #{l.inspect}? #{(ec_list != l).inspect}"}
|
1073
|
+
if ec_list != l
|
1074
|
+
add_debug(element) {"[Step 14] list(#{p}) create #{l.inspect}"}
|
1075
|
+
# Generate an rdf:List with the elements of that list.
|
1076
|
+
l.each_statement do |st|
|
1078
1077
|
add_triple(element, st.subject, st.predicate, st.object) unless st.object == RDF.List
|
1079
1078
|
end
|
1080
1079
|
|
1081
|
-
# Generate a triple relating new_subject, property and the
|
1082
|
-
# or rdf:nil if the
|
1083
|
-
if
|
1080
|
+
# Generate a triple relating new_subject, property and the list BNode,
|
1081
|
+
# or rdf:nil if the list is empty.
|
1082
|
+
if l.empty?
|
1084
1083
|
add_triple(element, new_subject, p, RDF.nil)
|
1085
1084
|
else
|
1086
|
-
add_triple(element, new_subject, p,
|
1085
|
+
add_triple(element, new_subject, p, l.subject)
|
1087
1086
|
end
|
1088
1087
|
end
|
1089
1088
|
end
|