rdf-rdfa 2.2.2 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +7 -7
- data/VERSION +1 -1
- data/lib/rdf/rdfa.rb +2 -2
- data/lib/rdf/rdfa/context.rb +15 -15
- data/lib/rdf/rdfa/context/html.rb +2 -2
- data/lib/rdf/rdfa/context/xhtml.rb +2 -2
- data/lib/rdf/rdfa/context/xml.rb +11 -2
- data/lib/rdf/rdfa/expansion.rb +4 -4
- data/lib/rdf/rdfa/patches/string_hacks.rb +1 -1
- data/lib/rdf/rdfa/reader.rb +106 -95
- data/lib/rdf/rdfa/reader/nokogiri.rb +17 -21
- data/lib/rdf/rdfa/reader/rexml.rb +17 -17
- data/lib/rdf/rdfa/writer.rb +20 -18
- data/lib/rdf/rdfa/writer/haml_templates.rb +4 -4
- metadata +39 -60
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 41a438683b553f9eaa31a244a4fbbeeb2413b999f040b4a46980fe939d1891d2
|
4
|
+
data.tar.gz: a191ff7cf36e120aa52491c8eea5b4cab05b48d5595c0486a6e9ed774093b39e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e95a2ef75396bfead46f171d2366bf4019c7a6ffd9be70e1ae24614671d7f20719eb00476906ef17047bbf9ef9ed1ac7f711b5905e42c64094ac85134a48469
|
7
|
+
data.tar.gz: b1cd79507874df6cb7f516a6ad87450b9d0e14e63784fe90191c862cd38c35a5520b33c315b287483aadc14800de677b200d7e94dcdb5ae6c54ae9fbf0c282d1
|
data/README.md
CHANGED
@@ -16,7 +16,7 @@ RDF::RDFa parses [RDFa][RDFa 1.1 Core] into statements or triples.
|
|
16
16
|
* Fully compliant RDFa 1.1 parser.
|
17
17
|
* Template-based Writer to generate XHTML+RDFa.
|
18
18
|
* Writer uses user-replacable [Haml][Haml]-based templates to generate RDFa.
|
19
|
-
* If available, uses [Nokogiri][] for parsing HTML/SVG, falls back to REXML otherwise. For HTML5, include the [Nokogumbo][] gem for
|
19
|
+
* If available, uses [Nokogiri][] for parsing HTML/SVG, falls back to REXML otherwise. For HTML5, include the [Nokogumbo][] gem for a pure-HTML5 parser with better error detection.
|
20
20
|
|
21
21
|
Install with `gem install rdf-rdfa`
|
22
22
|
|
@@ -397,12 +397,12 @@ The template hash defines four Haml templates:
|
|
397
397
|
}
|
398
398
|
|
399
399
|
## Dependencies
|
400
|
-
* [Ruby](http://ruby-lang.org/) (>= 2.
|
401
|
-
* [RDF.rb](http://rubygems.org/gems/rdf) (
|
402
|
-
* [Haml](https://rubygems.org/gems/haml) (
|
403
|
-
* [HTMLEntities](https://rubygems.org/gems/htmlentities) (>= 4.3
|
404
|
-
* Soft dependency on [Nokogiri](http://rubygems.org/gems/nokogiri) (>= 1.
|
405
|
-
* Soft dependency on [Nokogumbo](https://github.com/rubys/nokogumbo) (>=
|
400
|
+
* [Ruby](http://ruby-lang.org/) (>= 2.4)
|
401
|
+
* [RDF.rb](http://rubygems.org/gems/rdf) (~> 3.1)
|
402
|
+
* [Haml](https://rubygems.org/gems/haml) (~> 5.1)
|
403
|
+
* [HTMLEntities](https://rubygems.org/gems/htmlentities) (>= 4.3)
|
404
|
+
* Soft dependency on [Nokogiri](http://rubygems.org/gems/nokogiri) (>= 1.10)
|
405
|
+
* Soft dependency on [Nokogumbo](https://github.com/rubys/nokogumbo) (>= 2.0)
|
406
406
|
|
407
407
|
## Documentation
|
408
408
|
Full documentation available on [Rubydoc.info][RDFa doc]
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
3.1.0
|
data/lib/rdf/rdfa.rb
CHANGED
@@ -31,9 +31,9 @@ module RDF
|
|
31
31
|
autoload :Reader, 'rdf/rdfa/reader'
|
32
32
|
autoload :Writer, 'rdf/rdfa/writer'
|
33
33
|
autoload :VERSION, 'rdf/rdfa/version'
|
34
|
-
|
34
|
+
|
35
35
|
HTML_RDFA_CONTEXT = "http://www.w3.org/2011/rdfa-context/html-rdfa-1.1"
|
36
36
|
XHTML_RDFA_CONTEXT = "http://www.w3.org/2011/rdfa-context/xhtml-rdfa-1.1"
|
37
37
|
XML_RDFA_CONTEXT = "http://www.w3.org/2011/rdfa-context/rdfa-1.1"
|
38
38
|
end
|
39
|
-
end
|
39
|
+
end
|
data/lib/rdf/rdfa/context.rb
CHANGED
@@ -19,7 +19,7 @@ module RDF::RDFa
|
|
19
19
|
# @!attribute [r] terms
|
20
20
|
# @return [Hash{Symbol => RDF::URI}]
|
21
21
|
attr_reader :terms
|
22
|
-
|
22
|
+
|
23
23
|
# Default URI defined for this vocabulary
|
24
24
|
# @!attribute [r] vocabulary
|
25
25
|
# @return [RDF::URI]
|
@@ -29,7 +29,7 @@ module RDF::RDFa
|
|
29
29
|
# @!attribute [r] uri
|
30
30
|
# @return [RDF::URI]
|
31
31
|
attr_reader :uri
|
32
|
-
|
32
|
+
|
33
33
|
##
|
34
34
|
# Initialize a new context from the given URI.
|
35
35
|
#
|
@@ -40,17 +40,17 @@ module RDF::RDFa
|
|
40
40
|
# @yieldparam [RDF::RDFa::Context] context
|
41
41
|
# @yieldreturn [void] ignored
|
42
42
|
# @return [RDF::RDFa::Context]
|
43
|
-
def initialize(uri, options
|
43
|
+
def initialize(uri, **options, &block)
|
44
44
|
@uri = RDF::URI.intern(uri)
|
45
45
|
@prefixes = options.fetch(:prefixes, {})
|
46
46
|
@terms = options.fetch(:terms, {})
|
47
47
|
@vocabulary = options[:vocabulary]
|
48
48
|
@options = options.dup
|
49
|
-
|
49
|
+
|
50
50
|
yield(self) if block_given?
|
51
51
|
self
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
##
|
55
55
|
# @return [RDF::Util::Cache]
|
56
56
|
# @private
|
@@ -67,7 +67,7 @@ module RDF::RDFa
|
|
67
67
|
def self.repository
|
68
68
|
@repository ||= RDF::Repository.new(title: "RDFa Contexts")
|
69
69
|
end
|
70
|
-
|
70
|
+
|
71
71
|
##
|
72
72
|
# Set repository used for saving contexts
|
73
73
|
# @param [RDF::Repository] repo
|
@@ -82,14 +82,14 @@ module RDF::RDFa
|
|
82
82
|
end
|
83
83
|
@repository = repo
|
84
84
|
end
|
85
|
-
|
85
|
+
|
86
86
|
# Return a context faulting through the cache
|
87
87
|
# @return [RDF::RDFa::Context]
|
88
88
|
def self.find(uri)
|
89
89
|
uri = RDF::URI.intern(uri)
|
90
|
-
|
90
|
+
|
91
91
|
return cache[uri] unless cache[uri].nil?
|
92
|
-
|
92
|
+
|
93
93
|
# Two part creation to prevent re-entrancy problems if p1 => p2 and p2 => p1
|
94
94
|
# Return something to make the caller happy if we're re-entered
|
95
95
|
cache[uri] = Struct.new(:prefixes, :terms, :vocabulary).new({}, {}, nil)
|
@@ -97,7 +97,7 @@ module RDF::RDFa
|
|
97
97
|
cache[uri] = new(uri) do |context|
|
98
98
|
log_debug("process_context: retrieve context <#{uri}>") if respond_to?(:log_debug)
|
99
99
|
Context.load(uri)
|
100
|
-
context.parse(repository.query(graph_name: uri))
|
100
|
+
context.parse(repository.query({graph_name: uri}))
|
101
101
|
end
|
102
102
|
rescue Exception => e
|
103
103
|
if respond_to?(:log_fatal)
|
@@ -112,12 +112,12 @@ module RDF::RDFa
|
|
112
112
|
uri = RDF::URI.intern(uri)
|
113
113
|
repository.load(uri.to_s, base_uri: uri, graph_name: uri) unless repository.has_graph?(uri)
|
114
114
|
end
|
115
|
-
|
115
|
+
|
116
116
|
# @return [RDF::Repository]
|
117
117
|
def repository
|
118
118
|
Context.repository
|
119
119
|
end
|
120
|
-
|
120
|
+
|
121
121
|
##
|
122
122
|
# Defines the given named URI prefix for this context.
|
123
123
|
#
|
@@ -151,7 +151,7 @@ module RDF::RDFa
|
|
151
151
|
name = name.to_s.empty? ? nil : (name.respond_to?(:to_sym) ? name.to_sym : name.to_s.to_sym)
|
152
152
|
uri.nil? ? terms[name] : terms[name] = uri
|
153
153
|
end
|
154
|
-
|
154
|
+
|
155
155
|
##
|
156
156
|
# Extract vocabulary, prefix mappings and terms from a enumerable object into an instance
|
157
157
|
#
|
@@ -179,14 +179,14 @@ module RDF::RDFa
|
|
179
179
|
log_debug("process_context: uri=#{uri.inspect}, term=#{term.inspect}, prefix=#{prefix.inspect}, vocabulary=#{vocab.inspect}") if respond_to?(:log_debug)
|
180
180
|
|
181
181
|
@vocabulary = vocab if vocab
|
182
|
-
|
182
|
+
|
183
183
|
# For every extracted triple that is the common subject of an rdfa:prefix and an rdfa:uri
|
184
184
|
# predicate, create a mapping from the object literal of the rdfa:prefix predicate to the
|
185
185
|
# object literal of the rdfa:uri predicate. Add or update this mapping in the local list of
|
186
186
|
# URI mappings after transforming the 'prefix' component to lower-case.
|
187
187
|
# For every extracted
|
188
188
|
prefix(prefix.downcase, uri) if uri && prefix && prefix != "_"
|
189
|
-
|
189
|
+
|
190
190
|
# triple that is the common subject of an rdfa:term and an rdfa:uri predicate, create a
|
191
191
|
# mapping from the object literal of the rdfa:term predicate to the object literal of the
|
192
192
|
# rdfa:uri predicate. Add or update this mapping in the local term mappings.
|
@@ -4,8 +4,8 @@
|
|
4
4
|
class RDF::RDFa::Context
|
5
5
|
def self.find_with_html_rdfa_1_1(uri)
|
6
6
|
if uri.to_s == "http://www.w3.org/2011/rdfa-context/html-rdfa-1.1"
|
7
|
-
@_html_rdfa_1_1_prof ||= RDF::RDFa::Context.new(RDF::URI("http://www.w3.org/2011/rdfa-context/html-rdfa-1.1"),
|
8
|
-
|
7
|
+
@_html_rdfa_1_1_prof ||= RDF::RDFa::Context.new(RDF::URI("http://www.w3.org/2011/rdfa-context/html-rdfa-1.1"),
|
8
|
+
)
|
9
9
|
else
|
10
10
|
find_without_html_rdfa_1_1(uri)
|
11
11
|
end
|
@@ -4,7 +4,7 @@
|
|
4
4
|
class RDF::RDFa::Context
|
5
5
|
def self.find_with_xhtml_rdfa_1_1(uri)
|
6
6
|
if uri.to_s == "http://www.w3.org/2011/rdfa-context/xhtml-rdfa-1.1"
|
7
|
-
@_xhtml_rdfa_1_1_prof ||= RDF::RDFa::Context.new(RDF::URI("http://www.w3.org/2011/rdfa-context/xhtml-rdfa-1.1"),
|
7
|
+
@_xhtml_rdfa_1_1_prof ||= RDF::RDFa::Context.new(RDF::URI("http://www.w3.org/2011/rdfa-context/xhtml-rdfa-1.1"),
|
8
8
|
terms: {
|
9
9
|
alternate: "http://www.w3.org/1999/xhtml/vocab#alternate",
|
10
10
|
appendix: "http://www.w3.org/1999/xhtml/vocab#appendix",
|
@@ -32,7 +32,7 @@ class RDF::RDFa::Context
|
|
32
32
|
top: "http://www.w3.org/1999/xhtml/vocab#top",
|
33
33
|
up: "http://www.w3.org/1999/xhtml/vocab#up",
|
34
34
|
},
|
35
|
-
|
35
|
+
)
|
36
36
|
else
|
37
37
|
find_without_xhtml_rdfa_1_1(uri)
|
38
38
|
end
|
data/lib/rdf/rdfa/context/xml.rb
CHANGED
@@ -4,8 +4,9 @@
|
|
4
4
|
class RDF::RDFa::Context
|
5
5
|
def self.find_with_rdfa_1_1(uri)
|
6
6
|
if uri.to_s == "http://www.w3.org/2011/rdfa-context/rdfa-1.1"
|
7
|
-
@_rdfa_1_1_prof ||= RDF::RDFa::Context.new(RDF::URI("http://www.w3.org/2011/rdfa-context/rdfa-1.1"),
|
7
|
+
@_rdfa_1_1_prof ||= RDF::RDFa::Context.new(RDF::URI("http://www.w3.org/2011/rdfa-context/rdfa-1.1"),
|
8
8
|
prefixes: {
|
9
|
+
as: "https://www.w3.org/ns/activitystreams#",
|
9
10
|
cc: "http://creativecommons.org/ns#",
|
10
11
|
csvw: "http://www.w3.org/ns/csvw#",
|
11
12
|
ctag: "http://commontag.org/ns#",
|
@@ -13,11 +14,16 @@ class RDF::RDFa::Context
|
|
13
14
|
dc11: "http://purl.org/dc/elements/1.1/",
|
14
15
|
dcat: "http://www.w3.org/ns/dcat#",
|
15
16
|
dcterms: "http://purl.org/dc/terms/",
|
17
|
+
dqv: "http://www.w3.org/ns/dqv#",
|
18
|
+
duv: "https://www.w3.org/ns/duv#",
|
16
19
|
foaf: "http://xmlns.com/foaf/0.1/",
|
17
20
|
gr: "http://purl.org/goodrelations/v1#",
|
18
21
|
grddl: "http://www.w3.org/2003/g/data-view#",
|
19
22
|
ical: "http://www.w3.org/2002/12/cal/icaltzd#",
|
23
|
+
ldp: "http://www.w3.org/ns/ldp#",
|
20
24
|
ma: "http://www.w3.org/ns/ma-ont#",
|
25
|
+
oa: "http://www.w3.org/ns/oa#",
|
26
|
+
odrl: "http://www.w3.org/ns/odrl/2/",
|
21
27
|
og: "http://ogp.me/ns#",
|
22
28
|
org: "http://www.w3.org/ns/org#",
|
23
29
|
owl: "http://www.w3.org/2002/07/owl#",
|
@@ -34,6 +40,9 @@ class RDF::RDFa::Context
|
|
34
40
|
sioc: "http://rdfs.org/sioc/ns#",
|
35
41
|
skos: "http://www.w3.org/2004/02/skos/core#",
|
36
42
|
skosxl: "http://www.w3.org/2008/05/skos-xl#",
|
43
|
+
sosa: "http://www.w3.org/ns/sosa/",
|
44
|
+
ssn: "http://www.w3.org/ns/ssn/",
|
45
|
+
time: "http://www.w3.org/2006/time#",
|
37
46
|
v: "http://rdf.data-vocabulary.org/#",
|
38
47
|
vcard: "http://www.w3.org/2006/vcard/ns#",
|
39
48
|
void: "http://rdfs.org/ns/void#",
|
@@ -48,7 +57,7 @@ class RDF::RDFa::Context
|
|
48
57
|
license: "http://www.w3.org/1999/xhtml/vocab#license",
|
49
58
|
role: "http://www.w3.org/1999/xhtml/vocab#role",
|
50
59
|
},
|
51
|
-
|
60
|
+
)
|
52
61
|
else
|
53
62
|
find_without_rdfa_1_1(uri)
|
54
63
|
end
|
data/lib/rdf/rdfa/expansion.rb
CHANGED
@@ -17,7 +17,7 @@ module RDF::RDFa
|
|
17
17
|
add_debug("expand") {"Repository has #{repository.count} statements"}
|
18
18
|
|
19
19
|
# Load missing vocabularies
|
20
|
-
vocabs = repository.query(predicate: RDF::RDFA.usesVocabulary).to_a.map(&:object)
|
20
|
+
vocabs = repository.query({predicate: RDF::RDFA.usesVocabulary}).to_a.map(&:object)
|
21
21
|
vocabs.map! do |vocab|
|
22
22
|
begin
|
23
23
|
# Create the name with a predictable name so that it is enumerated and can be found
|
@@ -108,7 +108,7 @@ module RDF::RDFa
|
|
108
108
|
def consequent(subject, prediate, object)
|
109
109
|
consequents << RDF::Query::Pattern.new(subject, prediate, object)
|
110
110
|
end
|
111
|
-
|
111
|
+
|
112
112
|
##
|
113
113
|
# Execute the rule against queryable, yielding each consequent with bindings
|
114
114
|
#
|
@@ -227,7 +227,7 @@ module RDF::RDFa
|
|
227
227
|
to_add << statement
|
228
228
|
end
|
229
229
|
end
|
230
|
-
|
230
|
+
|
231
231
|
repository.insert(*to_add)
|
232
232
|
end
|
233
233
|
end
|
@@ -250,7 +250,7 @@ module RDF::RDFa
|
|
250
250
|
to_add << statement
|
251
251
|
end
|
252
252
|
end
|
253
|
-
|
253
|
+
|
254
254
|
repository.insert(*to_add)
|
255
255
|
end
|
256
256
|
|
data/lib/rdf/rdfa/reader.rb
CHANGED
@@ -31,7 +31,7 @@ module RDF::RDFa
|
|
31
31
|
include RDF::Util::Logger
|
32
32
|
|
33
33
|
XHTML = "http://www.w3.org/1999/xhtml"
|
34
|
-
|
34
|
+
|
35
35
|
# Content model for @about and @resource. In RDFa 1.0, this was URIorSafeCURIE
|
36
36
|
SafeCURIEorCURIEorIRI = {
|
37
37
|
:"rdfa1.0" => [:safe_curie, :uri, :bnode],
|
@@ -83,17 +83,17 @@ module RDF::RDFa
|
|
83
83
|
# @!attribute [r] host_language
|
84
84
|
# @return [:xml, :xhtml1, :xhtml5, :html4, :html5, :svg]
|
85
85
|
attr_reader :host_language
|
86
|
-
|
86
|
+
|
87
87
|
# Version
|
88
88
|
# @!attribute [r] version
|
89
89
|
# @return [:"rdfa1.0", :"rdfa1.1"]
|
90
90
|
attr_reader :version
|
91
|
-
|
91
|
+
|
92
92
|
# Repository used for collecting triples.
|
93
93
|
# @!attribute [r] repository
|
94
94
|
# @return [RDF::Repository]
|
95
95
|
attr_reader :repository
|
96
|
-
|
96
|
+
|
97
97
|
# Returns the XML implementation module for this reader instance.
|
98
98
|
#
|
99
99
|
# @!attribute [rw] implementation
|
@@ -124,7 +124,7 @@ module RDF::RDFa
|
|
124
124
|
# @!attribute [rw] parent_subject
|
125
125
|
# @return [RDF::URI]
|
126
126
|
attr_accessor :parent_subject
|
127
|
-
|
127
|
+
|
128
128
|
##
|
129
129
|
# The parent object.
|
130
130
|
#
|
@@ -138,14 +138,14 @@ module RDF::RDFa
|
|
138
138
|
# @!attribute [rw] parent_object
|
139
139
|
# @return [RDF::URI]
|
140
140
|
attr_accessor :parent_object
|
141
|
-
|
141
|
+
|
142
142
|
##
|
143
143
|
# A list of current, in-scope URI mappings.
|
144
144
|
#
|
145
145
|
# @!attribute [rw] uri_mappings
|
146
146
|
# @return [Hash{Symbol => String}]
|
147
147
|
attr_accessor :uri_mappings
|
148
|
-
|
148
|
+
|
149
149
|
##
|
150
150
|
# A list of current, in-scope Namespaces. This is the subset of uri_mappings
|
151
151
|
# which are defined using xmlns.
|
@@ -153,7 +153,7 @@ module RDF::RDFa
|
|
153
153
|
# @!attribute [rw] namespaces
|
154
154
|
# @return [Hash{String => Namespace}]
|
155
155
|
attr_accessor :namespaces
|
156
|
-
|
156
|
+
|
157
157
|
##
|
158
158
|
# A list of incomplete triples.
|
159
159
|
#
|
@@ -165,14 +165,14 @@ module RDF::RDFa
|
|
165
165
|
# @!attribute [rw] incomplete_triples
|
166
166
|
# @return [Array<Array<RDF::URI, RDF::Resource>>]
|
167
167
|
attr_accessor :incomplete_triples
|
168
|
-
|
168
|
+
|
169
169
|
##
|
170
170
|
# The language. Note that there is no default language.
|
171
171
|
#
|
172
172
|
# @!attribute [rw] language
|
173
173
|
# @return [Symbol]
|
174
174
|
attr_accessor :language
|
175
|
-
|
175
|
+
|
176
176
|
##
|
177
177
|
# The term mappings, a list of terms and their associated URIs.
|
178
178
|
#
|
@@ -183,7 +183,7 @@ module RDF::RDFa
|
|
183
183
|
# @!attribute [rw] term_mappings
|
184
184
|
# @return [Hash{Symbol => RDF::URI}]
|
185
185
|
attr_accessor :term_mappings
|
186
|
-
|
186
|
+
|
187
187
|
##
|
188
188
|
# The default vocabulary
|
189
189
|
#
|
@@ -230,7 +230,7 @@ module RDF::RDFa
|
|
230
230
|
@namespaces = from.namespaces.clone
|
231
231
|
@list_mapping = from.list_mapping # Don't clone
|
232
232
|
end
|
233
|
-
|
233
|
+
|
234
234
|
def inspect
|
235
235
|
v = ['base', 'parent_subject', 'parent_object', 'language', 'default_vocabulary'].map do |a|
|
236
236
|
"#{a}=#{o = self.send(a); o.respond_to?(:to_ntriples) ? o.to_ntriples : o.inspect}"
|
@@ -297,7 +297,7 @@ module RDF::RDFa
|
|
297
297
|
# @yieldparam [RDF::Reader] reader
|
298
298
|
# @yieldreturn [void] ignored
|
299
299
|
# @raise [RDF::ReaderError] if _validate_
|
300
|
-
def initialize(input = $stdin, options
|
300
|
+
def initialize(input = $stdin, **options, &block)
|
301
301
|
super do
|
302
302
|
@options = {reference_folding: true}.merge(@options)
|
303
303
|
@repository = RDF::Repository.new
|
@@ -327,12 +327,24 @@ module RDF::RDFa
|
|
327
327
|
end
|
328
328
|
self.extend(@implementation)
|
329
329
|
|
330
|
-
detect_host_language_version(input, options)
|
330
|
+
detect_host_language_version(input, **options)
|
331
331
|
|
332
|
-
|
332
|
+
parse_lib = if @library == :nokogiri && @host_language == :html5
|
333
|
+
begin
|
334
|
+
require 'nokogumbo' unless defined?(::Nokogumbo)
|
335
|
+
:nokobumbo
|
336
|
+
rescue LoadError
|
337
|
+
:nokogiri
|
338
|
+
end
|
339
|
+
else
|
340
|
+
@library
|
341
|
+
end
|
342
|
+
|
343
|
+
parse_lib = @library == :nokogiri && defined?(::Nokogumbo) ? :nokogumbo : @library
|
344
|
+
add_info(@doc, "version = #{@version}, host_language = #{@host_language}, library = #{parse_lib}, rdfagraph = #{@options[:rdfagraph].inspect}, expand = #{@options[:vocab_expansion]}")
|
333
345
|
|
334
346
|
begin
|
335
|
-
initialize_xml(input, options)
|
347
|
+
initialize_xml(input, **options)
|
336
348
|
rescue
|
337
349
|
add_error(nil, "Malformed document: #{$!.message}")
|
338
350
|
end
|
@@ -369,6 +381,38 @@ module RDF::RDFa
|
|
369
381
|
end
|
370
382
|
end
|
371
383
|
|
384
|
+
##
|
385
|
+
# Extracts RDF from script element, or embeded RDF/XML
|
386
|
+
def extract_script(el, input, type, **options, &block)
|
387
|
+
add_debug(el, "script element of type #{type}")
|
388
|
+
begin
|
389
|
+
# Formats don't exist unless they've been required
|
390
|
+
case type.to_s
|
391
|
+
when 'application/csvm+json' then require 'rdf/tabular'
|
392
|
+
when 'application/ld+json' then require 'json/ld'
|
393
|
+
when 'application/rdf+xml' then require 'rdf/rdfxml'
|
394
|
+
when 'text/ntriples' then require 'rdf/ntriples'
|
395
|
+
when 'text/turtle' then require 'rdf/turtle'
|
396
|
+
end
|
397
|
+
rescue LoadError
|
398
|
+
end
|
399
|
+
|
400
|
+
@readers ||= {}
|
401
|
+
reader = @readers[type.to_s] = RDF::Reader.for(content_type: type.to_s) unless @readers.has_key?(type.to_s)
|
402
|
+
if reader = @readers[type.to_s]
|
403
|
+
add_debug(el, "=> reader #{reader.to_sym}")
|
404
|
+
# Wrap input in a RemoteDocument with appropriate content-type and base
|
405
|
+
doc = if input.is_a?(String)
|
406
|
+
RDF::Util::File::RemoteDocument.new(input, content_type: type.to_s, **options)
|
407
|
+
else
|
408
|
+
input
|
409
|
+
end
|
410
|
+
reader.new(doc, **options).each(&block)
|
411
|
+
else
|
412
|
+
add_debug(el, "=> no reader found")
|
413
|
+
end
|
414
|
+
end
|
415
|
+
|
372
416
|
##
|
373
417
|
# Iterates the given block for each RDF statement in the input.
|
374
418
|
#
|
@@ -388,62 +432,19 @@ module RDF::RDFa
|
|
388
432
|
# parse
|
389
433
|
parse_whole_document(@doc, RDF::URI(base_uri))
|
390
434
|
|
391
|
-
def extract_script(el, input, type, options, &block)
|
392
|
-
add_debug(el, "script element of type #{type}")
|
393
|
-
begin
|
394
|
-
# Formats don't exist unless they've been required
|
395
|
-
case type.to_s
|
396
|
-
when 'application/csvm+json' then require 'rdf/tabular'
|
397
|
-
when 'application/ld+json' then require 'json/ld'
|
398
|
-
when 'application/rdf+xml' then require 'rdf/rdfxml'
|
399
|
-
when 'text/ntriples' then require 'rdf/ntriples'
|
400
|
-
when 'text/turtle' then require 'rdf/turtle'
|
401
|
-
end
|
402
|
-
rescue LoadError
|
403
|
-
end
|
404
|
-
|
405
|
-
if reader = RDF::Reader.for(content_type: type.to_s)
|
406
|
-
add_debug(el, "=> reader #{reader.to_sym}")
|
407
|
-
# Wrap input in a RemoteDocument with appropriate content-type and base
|
408
|
-
doc = if input.is_a?(String)
|
409
|
-
RDF::Util::File::RemoteDocument.new(input,
|
410
|
-
options.merge(
|
411
|
-
content_type: type.to_s,
|
412
|
-
base_uri: base_uri
|
413
|
-
))
|
414
|
-
else
|
415
|
-
input
|
416
|
-
end
|
417
|
-
reader.new(doc, options).each(&block)
|
418
|
-
else
|
419
|
-
add_debug(el, "=> no reader found")
|
420
|
-
end
|
421
|
-
end
|
422
|
-
|
423
435
|
# Look for Embedded RDF/XML
|
424
436
|
unless @root.xpath("//rdf:RDF", "rdf" => "http://www.w3.org/1999/02/22-rdf-syntax-ns#").empty?
|
425
|
-
extract_script(@root, @doc, "application/rdf+xml",
|
437
|
+
extract_script(@root, @doc, "application/rdf+xml", **@options.merge(base_uri: base_uri)) do |statement|
|
426
438
|
@repository << statement
|
427
439
|
end
|
428
440
|
end
|
429
441
|
|
430
|
-
# Look for Embedded scripts
|
431
|
-
@root.css("script[type]").each do |el|
|
432
|
-
type = el.attribute("type")
|
433
|
-
|
434
|
-
text = el.inner_html.sub(%r(\A\s*\<!\[CDATA\[)m, '').sub(%r(\]\]>\s*\Z)m, '')
|
435
|
-
|
436
|
-
extract_script(el, text, type, @options) do |statement|
|
437
|
-
@repository << statement
|
438
|
-
end
|
439
|
-
end
|
440
|
-
|
441
442
|
# Look for Embedded microdata
|
442
443
|
unless @root.xpath("//@itemscope").empty?
|
443
444
|
begin
|
444
445
|
require 'rdf/microdata'
|
445
446
|
add_debug(@doc, "process microdata")
|
446
|
-
@repository << RDF::Microdata::Reader.new(@doc, options)
|
447
|
+
@repository << RDF::Microdata::Reader.new(@doc, **options)
|
447
448
|
rescue LoadError
|
448
449
|
add_debug(@doc, "microdata detected, not processed")
|
449
450
|
end
|
@@ -454,7 +455,7 @@ module RDF::RDFa
|
|
454
455
|
|
455
456
|
# Perform vocabulary expansion
|
456
457
|
expand(@repository) if @options[:vocab_expansion]
|
457
|
-
|
458
|
+
|
458
459
|
@processed = true
|
459
460
|
end
|
460
461
|
|
@@ -493,7 +494,7 @@ module RDF::RDFa
|
|
493
494
|
end
|
494
495
|
enum_for(:each_triple)
|
495
496
|
end
|
496
|
-
|
497
|
+
|
497
498
|
private
|
498
499
|
|
499
500
|
# Keep track of allocated BNodes
|
@@ -501,12 +502,12 @@ module RDF::RDFa
|
|
501
502
|
@bnode_cache ||= {}
|
502
503
|
@bnode_cache[value.to_s] ||= RDF::Node.new(value)
|
503
504
|
end
|
504
|
-
|
505
|
+
|
505
506
|
# Figure out the document path, if it is an Element or Attribute
|
506
507
|
def node_path(node)
|
507
508
|
"<#{base_uri}>#{node.respond_to?(:display_path) ? node.display_path : node}"
|
508
509
|
end
|
509
|
-
|
510
|
+
|
510
511
|
# Add debug event to debug array, if specified
|
511
512
|
#
|
512
513
|
# @param [#display_path, #to_s] node XML Node or string for showing context
|
@@ -519,15 +520,15 @@ module RDF::RDFa
|
|
519
520
|
def add_info(node, message, process_class = RDF::RDFA.Info, &block)
|
520
521
|
add_processor_message(node, message, process_class, &block)
|
521
522
|
end
|
522
|
-
|
523
|
+
|
523
524
|
def add_warning(node, message, process_class = RDF::RDFA.Warning)
|
524
525
|
add_processor_message(node, message, process_class)
|
525
526
|
end
|
526
|
-
|
527
|
+
|
527
528
|
def add_error(node, message, process_class = RDF::RDFA.Error)
|
528
529
|
add_processor_message(node, message, process_class)
|
529
530
|
end
|
530
|
-
|
531
|
+
|
531
532
|
def add_processor_message(node, message, process_class, &block)
|
532
533
|
case process_class
|
533
534
|
when RDF::RDFA.Error then log_error(node_path(node), message, &block)
|
@@ -552,7 +553,7 @@ module RDF::RDFa
|
|
552
553
|
RDF::Statement.new(nc, RDF::PTR.expression, node.path, graph_name: RDF::RDFA.ProcessorGraph)
|
553
554
|
]
|
554
555
|
end
|
555
|
-
|
556
|
+
|
556
557
|
@repository.insert(*processor_statements)
|
557
558
|
if cb = @options[:processor_callback]
|
558
559
|
processor_statements.each {|s| cb.call(s)}
|
@@ -591,7 +592,7 @@ module RDF::RDFa
|
|
591
592
|
|
592
593
|
# initialize the evaluation context with the appropriate base
|
593
594
|
evaluation_context = EvaluationContext.new(base, @host_defaults)
|
594
|
-
|
595
|
+
|
595
596
|
if @version != :"rdfa1.0"
|
596
597
|
# Process default vocabularies
|
597
598
|
load_initial_contexts(@host_defaults[:initial_contexts]) do |which, value|
|
@@ -603,11 +604,11 @@ module RDF::RDFa
|
|
603
604
|
end
|
604
605
|
end
|
605
606
|
end
|
606
|
-
|
607
|
+
|
607
608
|
traverse(root, evaluation_context)
|
608
609
|
add_debug("", "parse_whole_doc: traversal complete'")
|
609
610
|
end
|
610
|
-
|
611
|
+
|
611
612
|
# Parse and process URI mappings, Term mappings and a default vocabulary from @context
|
612
613
|
#
|
613
614
|
# Yields each mapping
|
@@ -725,7 +726,7 @@ module RDF::RDFa
|
|
725
726
|
add_error(element, "Can't parse nil element")
|
726
727
|
return nil
|
727
728
|
end
|
728
|
-
|
729
|
+
|
729
730
|
add_debug(element) { "ec: #{evaluation_context.inspect}" }
|
730
731
|
|
731
732
|
# local variables [7.5 Step 1]
|
@@ -763,6 +764,7 @@ module RDF::RDFa
|
|
763
764
|
rev
|
764
765
|
role
|
765
766
|
src
|
767
|
+
type
|
766
768
|
typeof
|
767
769
|
value
|
768
770
|
vocab
|
@@ -807,17 +809,26 @@ module RDF::RDFa
|
|
807
809
|
"[Step 2] default_vocaulary: #{default_vocabulary.inspect}"
|
808
810
|
}
|
809
811
|
end
|
810
|
-
|
812
|
+
|
811
813
|
# Local term mappings [7.5 Step 3]
|
812
814
|
# Next, the current element is then examined for URI mapping s and these are added to the local list of URI mappings.
|
813
815
|
# Note that a URI mapping will simply overwrite any current mapping in the list that has the same name
|
814
816
|
extract_mappings(element, uri_mappings, namespaces)
|
815
|
-
|
817
|
+
|
816
818
|
# Language information [7.5 Step 4]
|
817
819
|
language = element.language || language
|
818
820
|
language = nil if language.to_s.empty?
|
819
821
|
add_debug(element) {"HTML5 [3.2.3.3] lang: #{language.inspect}"} if language
|
820
822
|
|
823
|
+
# Embedded scripts
|
824
|
+
if element.name == 'script'
|
825
|
+
text = element.inner_html.sub(%r(\A\s*\<!\[CDATA\[)m, '').sub(%r(\]\]>\s*\Z)m, '')
|
826
|
+
|
827
|
+
extract_script(element, text, attrs[:type], **@options.merge(base_uri: base)) do |statement|
|
828
|
+
@repository << statement
|
829
|
+
end
|
830
|
+
end
|
831
|
+
|
821
832
|
# From HTML5, if the property attribute and the rel and/or rev attribute exists on the same element, the non-CURIE and non-URI rel and rev values are ignored. If, after this, the value of rel and/or rev becomes empty, then the processor must act as if the respective attribute is not present.
|
822
833
|
if [:html5, :xhtml5].include?(@host_language) && attrs[:property] && (attrs[:rel] || attrs[:rev])
|
823
834
|
old_rel, old_rev = attrs[:rel], attrs[:rev]
|
@@ -844,14 +855,14 @@ module RDF::RDFa
|
|
844
855
|
term_mappings: term_mappings,
|
845
856
|
vocab: default_vocabulary,
|
846
857
|
restrictions: TERMorCURIEorAbsIRI.fetch(@version, []))
|
847
|
-
|
858
|
+
|
848
859
|
add_debug(element) do
|
849
860
|
"rels: #{rels.join(" ")}, revs: #{revs.join(" ")}"
|
850
861
|
end unless (rels + revs).empty?
|
851
862
|
|
852
863
|
if !(attrs[:rel] || attrs[:rev])
|
853
864
|
# Establishing a new subject if no rel/rev [7.5 Step 5]
|
854
|
-
|
865
|
+
|
855
866
|
if @version == :"rdfa1.0"
|
856
867
|
new_subject = if attrs[:about]
|
857
868
|
process_uri(element, attrs[:about], evaluation_context, base,
|
@@ -989,7 +1000,7 @@ module RDF::RDFa
|
|
989
1000
|
new_subject ||= process_uri(element, attrs[:src], evaluation_context, base,
|
990
1001
|
uri_mappings: uri_mappings,
|
991
1002
|
restrictions: [:uri]) if @version == :"rdfa1.0"
|
992
|
-
|
1003
|
+
|
993
1004
|
# if the @typeof attribute is present, set typed resource to new subject
|
994
1005
|
typed_resource = new_subject if attrs[:typeof]
|
995
1006
|
|
@@ -1008,7 +1019,7 @@ module RDF::RDFa
|
|
1008
1019
|
evaluation_context.parent_object
|
1009
1020
|
# no skip flag set this time
|
1010
1021
|
end
|
1011
|
-
|
1022
|
+
|
1012
1023
|
# Then the current object resource is set to the URI obtained from the first match from the following rules:
|
1013
1024
|
current_object_resource = process_uri(element, attrs[:resource], evaluation_context, base,
|
1014
1025
|
uri_mappings: uri_mappings,
|
@@ -1034,7 +1045,7 @@ module RDF::RDFa
|
|
1034
1045
|
"typed_resource: #{typed_resource.to_ntriples rescue 'nil'}, "
|
1035
1046
|
}
|
1036
1047
|
end
|
1037
|
-
|
1048
|
+
|
1038
1049
|
# [Step 7] If in any of the previous steps a typed resource was set to a non-null value, it is now used to provide a subject for type values;
|
1039
1050
|
if typed_resource
|
1040
1051
|
# Typeof is TERMorCURIEorAbsIRIs
|
@@ -1082,7 +1093,7 @@ module RDF::RDFa
|
|
1082
1093
|
add_triple(element, new_subject, r, current_object_resource)
|
1083
1094
|
end
|
1084
1095
|
end
|
1085
|
-
|
1096
|
+
|
1086
1097
|
revs.each do |r|
|
1087
1098
|
add_triple(element, current_object_resource, r, new_subject)
|
1088
1099
|
end
|
@@ -1090,7 +1101,7 @@ module RDF::RDFa
|
|
1090
1101
|
# Incomplete triples and bnode creation [Step 10]
|
1091
1102
|
add_debug(element) {"[Step 10] incompletes: rels: #{rels}, revs: #{revs}"}
|
1092
1103
|
current_object_resource = RDF::Node.new
|
1093
|
-
|
1104
|
+
|
1094
1105
|
# predicate: full IRI
|
1095
1106
|
# direction: forward/reverse
|
1096
1107
|
# lists: Save into list, don't generate triple
|
@@ -1108,12 +1119,12 @@ module RDF::RDFa
|
|
1108
1119
|
incomplete_triples << {predicate: r, direction: :forward}
|
1109
1120
|
end
|
1110
1121
|
end
|
1111
|
-
|
1122
|
+
|
1112
1123
|
revs.each do |r|
|
1113
1124
|
incomplete_triples << {predicate: r, direction: :reverse}
|
1114
1125
|
end
|
1115
1126
|
end
|
1116
|
-
|
1127
|
+
|
1117
1128
|
# Establish current object literal [Step 11]
|
1118
1129
|
#
|
1119
1130
|
# If the current element has a @inlist attribute, add the property to the
|
@@ -1267,11 +1278,11 @@ module RDF::RDFa
|
|
1267
1278
|
add_debug(element) {"[Step 11] add #{current_property_value.to_ntriples} to #{p.to_ntriples} #{list_mapping[p].inspect}"}
|
1268
1279
|
list_mapping[p] << current_property_value
|
1269
1280
|
elsif new_subject
|
1270
|
-
add_triple(element, new_subject, p, current_property_value)
|
1281
|
+
add_triple(element, new_subject, p, current_property_value)
|
1271
1282
|
end
|
1272
1283
|
end
|
1273
1284
|
end
|
1274
|
-
|
1285
|
+
|
1275
1286
|
if !skip and new_subject && !evaluation_context.incomplete_triples.empty?
|
1276
1287
|
# Complete the incomplete triples from the evaluation context [Step 12]
|
1277
1288
|
add_debug(element) do
|
@@ -1329,12 +1340,12 @@ module RDF::RDFa
|
|
1329
1340
|
new_ec.list_mapping = list_mapping
|
1330
1341
|
add_debug(element, "[Step 13] new ec")
|
1331
1342
|
end
|
1332
|
-
|
1343
|
+
|
1333
1344
|
element.children.each do |child|
|
1334
1345
|
# recurse only if it's an element
|
1335
1346
|
traverse(child, new_ec) if child.element?
|
1336
1347
|
end
|
1337
|
-
|
1348
|
+
|
1338
1349
|
# Step 14: after traversing through child elements, for each list associated with
|
1339
1350
|
# a property
|
1340
1351
|
(list_mapping || {}).each do |p, l|
|
@@ -1380,13 +1391,13 @@ module RDF::RDFa
|
|
1380
1391
|
end
|
1381
1392
|
|
1382
1393
|
# space-separated TERMorCURIEorAbsIRI or SafeCURIEorCURIEorIRI
|
1383
|
-
def process_uris(element, value, evaluation_context, base, options)
|
1394
|
+
def process_uris(element, value, evaluation_context, base, **options)
|
1384
1395
|
return [] if value.to_s.empty?
|
1385
1396
|
add_debug(element) {"process_uris: #{value}"}
|
1386
|
-
value.to_s.split(/\s+/).map {|v| process_uri(element, v, evaluation_context, base, options)}.compact
|
1397
|
+
value.to_s.split(/\s+/).map {|v| process_uri(element, v, evaluation_context, base, **options)}.compact
|
1387
1398
|
end
|
1388
1399
|
|
1389
|
-
def process_uri(element, value, evaluation_context, base, options
|
1400
|
+
def process_uri(element, value, evaluation_context, base, **options)
|
1390
1401
|
return if value.nil?
|
1391
1402
|
restrictions = options[:restrictions]
|
1392
1403
|
add_debug(element) {"process_uri: #{value}, restrictions = #{restrictions.inspect}"}
|
@@ -1407,7 +1418,7 @@ module RDF::RDFa
|
|
1407
1418
|
# TERMorCURIEorAbsIRI
|
1408
1419
|
# If the value is an NCName, then it is evaluated as a term according to General Use of Terms in
|
1409
1420
|
# Attributes. Note that this step may mean that the value is to be ignored.
|
1410
|
-
uri = process_term(element, value.to_s, options)
|
1421
|
+
uri = process_term(element, value.to_s, **options)
|
1411
1422
|
add_debug(element) {"process_uri: #{value} => term => #{uri ? uri.to_base : 'nil'}"}
|
1412
1423
|
uri
|
1413
1424
|
else
|
@@ -1444,16 +1455,16 @@ module RDF::RDFa
|
|
1444
1455
|
add_warning(element, "Relative URI #{value}")
|
1445
1456
|
end
|
1446
1457
|
end
|
1447
|
-
|
1458
|
+
|
1448
1459
|
# [7.4.3] General Use of Terms in Attributes
|
1449
|
-
def process_term(element, value, options)
|
1460
|
+
def process_term(element, value, **options)
|
1450
1461
|
if options[:vocab]
|
1451
1462
|
# If there is a local default vocabulary, the IRI is obtained by concatenating that value and the term
|
1452
1463
|
return uri(options[:vocab] + value)
|
1453
1464
|
elsif options[:term_mappings].is_a?(Hash)
|
1454
1465
|
# If the term is in the local term mappings, use the associated URI (case sensitive).
|
1455
1466
|
return uri(options[:term_mappings][value.to_s.to_sym]) if options[:term_mappings].has_key?(value.to_s.to_sym)
|
1456
|
-
|
1467
|
+
|
1457
1468
|
# Otherwise, check for case-insensitive match
|
1458
1469
|
options[:term_mappings].each_pair do |term, uri|
|
1459
1470
|
return uri(uri) if term.to_s.downcase == value.to_s.downcase
|