rdf-rdfa 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/.yardopts +11 -0
- data/CONTRIBUTORS +1 -0
- data/History.txt +3 -0
- data/README.rdoc +21 -3
- data/Rakefile +4 -4
- data/VERSION +1 -1
- data/etc/basic.html +15 -0
- data/example.rb +13 -17
- data/lib/rdf/rdfa.rb +4 -11
- data/lib/rdf/rdfa/reader.rb +79 -128
- data/lib/rdf/rdfa/version.rb +16 -18
- data/lib/rdf/rdfa/vocab.rb +0 -1
- data/rdf-rdfa.gemspec +13 -11
- data/spec/matchers.rb +205 -0
- data/spec/rdfa_reader_spec.rb +449 -140
- metadata +18 -30
- data/lib/rdf/rdfa/reader/exceptions.rb +0 -14
data/.gitignore
ADDED
data/.yardopts
ADDED
data/CONTRIBUTORS
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
* Nicholas Humfrey <nicholas.humfrey@bbc.co.uk>
|
data/History.txt
CHANGED
data/README.rdoc
CHANGED
@@ -4,12 +4,14 @@ RDFa parser for RDF.rb.
|
|
4
4
|
|
5
5
|
== DESCRIPTION:
|
6
6
|
|
7
|
-
RDF::RDFa is an RDFa
|
7
|
+
RDF::RDFa is an RDFa reader for Ruby using the RDF.rb library suite.
|
8
8
|
|
9
9
|
== FEATURES:
|
10
|
-
RDF::RDFa parses RDFa into
|
10
|
+
RDF::RDFa parses RDFa into statements or triples.
|
11
11
|
|
12
|
-
* Fully compliant XHTML/RDFa 1.
|
12
|
+
* Fully compliant XHTML/RDFa 1.1 parser.
|
13
|
+
* Uses Nokogiri for parsing XHTML
|
14
|
+
* RDFa tests use SPARQL for most tests due to Rasqal limitations. Other tests compare directly against N-triples.
|
13
15
|
|
14
16
|
Install with 'gem install rdf-rdfa'
|
15
17
|
|
@@ -22,10 +24,26 @@ Instantiate a parser and parse source, specifying type and base-URL
|
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
27
|
+
== Dependencies
|
28
|
+
* [RDF.rb](http://rubygems.org/gems/rdf) (>= 0.1.6)
|
29
|
+
* [Nokogiri](http://rubygems.org/gems/nokogiri) (>= 1.3.3)
|
30
|
+
* [Patron](http://rubygems.org/gems/patron) (>= 0.4.6) -- For RDFa profiles
|
31
|
+
|
32
|
+
== TODO
|
33
|
+
* Add support for LibXML and REXML bindings, and use the best available
|
34
|
+
* Consider a SAX-based parser for improved performance
|
35
|
+
* Port SPARQL tests to native SPARQL processor, when one becomes available.
|
36
|
+
* Add generic XHTML+RDFa Writer
|
37
|
+
* Only parse profiles if Patron included, don't force otherwise
|
38
|
+
|
25
39
|
== Resources:
|
40
|
+
* RDF.rb[http://rdf.rubyforge.org/]
|
26
41
|
* Distiller[http://kellogg-assoc/distiller]
|
27
42
|
* RDoc[http://rdoc.info/projects/gkellogg/rdf-rdfa]
|
28
43
|
* History[http://github.com/gkellogg/rdf-rdfa/blob/master/History.txt]
|
44
|
+
* "RDFa 1.1 Core"[http://www.w3.org/TR/2010/WD-rdfa-core-20100422/]
|
45
|
+
* "XHTML+RDFa 1.1 Core"[http://www.w3.org/TR/2010/WD-xhtml-rdfa-20100422/]
|
46
|
+
* "RDFa test suite"[http://rdfa.digitalbazaar.com/test-suite/]
|
29
47
|
|
30
48
|
== LICENSE:
|
31
49
|
|
data/Rakefile
CHANGED
@@ -5,16 +5,15 @@ begin
|
|
5
5
|
require 'jeweler'
|
6
6
|
Jeweler::Tasks.new do |gemspec|
|
7
7
|
gemspec.name = "rdf-rdfa"
|
8
|
-
gemspec.summary = "RDFa
|
8
|
+
gemspec.summary = "RDFa reader for RDF.rb."
|
9
9
|
gemspec.description = <<-DESCRIPTION
|
10
|
-
RDF::RDFa is an RDFa
|
10
|
+
RDF::RDFa is an RDFa reader for Ruby using the RDF.rb library suite.
|
11
11
|
DESCRIPTION
|
12
12
|
gemspec.email = "gregg@kellogg-assoc.com"
|
13
13
|
gemspec.homepage = "http://github.com/gkellogg/rdf-rdfa"
|
14
|
-
gemspec.authors = ["Gregg Kellogg"
|
14
|
+
gemspec.authors = ["Gregg Kellogg"]
|
15
15
|
gemspec.add_dependency('rdf', '>= 0.1.6')
|
16
16
|
gemspec.add_dependency('nokogiri', '>= 1.3.3')
|
17
|
-
gemspec.add_dependency('patron', '>= 0.4.6')
|
18
17
|
gemspec.add_development_dependency('rspec')
|
19
18
|
gemspec.add_development_dependency('rdf-spec')
|
20
19
|
gemspec.add_development_dependency('activesupport', '>= 2.3.0')
|
@@ -36,6 +35,7 @@ Spec::Rake::SpecTask.new("spec:rcov") do |spec|
|
|
36
35
|
spec.libs << 'lib' << 'spec'
|
37
36
|
spec.pattern = 'spec/*_spec.rb'
|
38
37
|
spec.rcov = true
|
38
|
+
spec.rcov_opts = ['-x', '/Library', '-x', '/System/Library', '-x', 'spec']
|
39
39
|
end
|
40
40
|
|
41
41
|
desc "Generate HTML report specs"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
data/etc/basic.html
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
|
3
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
4
|
+
<head>
|
5
|
+
<title>W3C standard prefixes</title>
|
6
|
+
</head>
|
7
|
+
<body xmlns:rdfa="http://www.w3.org/ns/rdfa#">
|
8
|
+
<p typeof="">The URI "<span property="rdfa:uri">http://purl.org/dc/terms/</span>" can be used with the "<span property="rdfa:prefix">dc</span>" prefix.</p>
|
9
|
+
<p typeof="">The URI "<span property="rdfa:uri">http://xmlns.com/foaf/0.1/</span>" can be used with the "<span property="rdfa:prefix">foaf</span>" prefix.</p>
|
10
|
+
<p typeof="">The URI "<span property="rdfa:uri">http://www.w3.org/2001/vcard-rdf/3.0#</span>" can be used with the "<span property="rdfa:prefix">vcard</span>" prefix.</p>
|
11
|
+
<p typeof="">The URI "<span property="rdfa:uri">http://rdf.data-vocabulary.org/#</span>" can be used with the "<span property="rdfa:prefix">g</span>" prefix.</p>
|
12
|
+
<p typeof="">The URI "<span property="rdfa:uri">http://rdfs.org/sioc/ns#</span>" can be used with the "<span property="rdfa:prefix">sioc</span>" prefix.</p>
|
13
|
+
<p typeof="">The URI "<span property="rdfa:uri">http://creativecommons.org/ns#</span>" can be used with the "<span property="rdfa:prefix">cc</span>" prefix.</p>
|
14
|
+
</body>
|
15
|
+
</html>
|
data/example.rb
CHANGED
@@ -1,27 +1,23 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
$:.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
4
|
-
|
5
3
|
require 'rubygems'
|
6
|
-
require 'rdfa
|
4
|
+
require 'rdf/rdfa'
|
7
5
|
|
8
6
|
data = <<-EOF;
|
9
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
10
|
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
|
11
|
-
<html xmlns="http://www.w3.org/1999/xhtml"
|
12
|
-
|
13
|
-
<head>
|
14
|
-
|
15
|
-
</head>
|
16
|
-
<body>
|
17
|
-
|
18
|
-
</body>
|
19
|
-
</html>
|
7
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
8
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
|
9
|
+
<html xmlns="http://www.w3.org/1999/xhtml" version="XHTML+RDFa 1.0"
|
10
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
11
|
+
<head>
|
12
|
+
<title>Test 0001</title>
|
13
|
+
</head>
|
14
|
+
<body>
|
15
|
+
<p>This photo was taken by <span class="author" about="photo1.jpg" property="dc:creator">Mark Birbeck</span>.</p>
|
16
|
+
</body>
|
17
|
+
</html>
|
20
18
|
EOF
|
21
19
|
|
22
|
-
|
23
|
-
|
24
|
-
reader = RDFa::Reader.new(data, :debug => false)
|
20
|
+
reader = RDF::RDFa::Reader.new(data, :base_uri => 'http://rdfa.digitalbazaar.com/test-suite/test-cases/xhtml1/0001.xhtml')
|
25
21
|
reader.each_statement do |statement|
|
26
22
|
statement.inspect!
|
27
23
|
end
|
data/lib/rdf/rdfa.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
$:.unshift(File.
|
1
|
+
$:.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..')))
|
2
2
|
require 'rdf'
|
3
3
|
|
4
4
|
module RDF
|
@@ -15,13 +15,6 @@ module RDF
|
|
15
15
|
# end
|
16
16
|
# end
|
17
17
|
#
|
18
|
-
# @example Serializing RDF statements into a XHTML+RDFa file
|
19
|
-
# RDF::RDFa::Writer.open("etc/test.xml") do |writer|
|
20
|
-
# reader.each_statement do |statement|
|
21
|
-
# writer << statement
|
22
|
-
# end
|
23
|
-
# end
|
24
|
-
#
|
25
18
|
# @see http://rdf.rubyforge.org/
|
26
19
|
# @see http://www.w3.org/TR/xhtml-rdfa-primer/
|
27
20
|
# @see http://www.w3.org/2010/02/rdfa/wiki/Main_Page
|
@@ -30,9 +23,9 @@ module RDF
|
|
30
23
|
#
|
31
24
|
# @author [Gregg Kellogg](http://kellogg-assoc.com/)
|
32
25
|
module RDFa
|
33
|
-
require 'rdfa/format'
|
26
|
+
require 'rdf/rdfa/format'
|
27
|
+
require 'rdf/rdfa/vocab'
|
34
28
|
autoload :Reader, 'rdf/rdfa/reader'
|
35
|
-
autoload :Writer, 'rdf/rdfa/writer'
|
36
29
|
autoload :VERSION, 'rdf/rdfa/version'
|
37
30
|
end
|
38
|
-
end
|
31
|
+
end
|
data/lib/rdf/rdfa/reader.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
require 'nokogiri' # FIXME: Implement using different modules as in RDF::TriX
|
2
|
-
require 'rdf'
|
3
|
-
require 'rdf/rdfa/vocab'
|
4
2
|
|
5
3
|
module RDF::RDFa
|
6
4
|
##
|
@@ -9,8 +7,7 @@ module RDF::RDFa
|
|
9
7
|
# @author [Gregg Kellogg](http://kellogg-assoc.com/)
|
10
8
|
class Reader < RDF::Reader
|
11
9
|
format Format
|
12
|
-
|
13
|
-
|
10
|
+
|
14
11
|
NC_REGEXP = Regexp.new(
|
15
12
|
%{^
|
16
13
|
(?!\\\\u0301) # ́ is a non-spacing acute accent.
|
@@ -26,12 +23,6 @@ module RDF::RDFa
|
|
26
23
|
|
27
24
|
XML_LITERAL = RDF['XMLLiteral']
|
28
25
|
|
29
|
-
attr_reader :debug
|
30
|
-
|
31
|
-
##
|
32
|
-
# @return [RDF::Graph]
|
33
|
-
attr_reader :graph
|
34
|
-
|
35
26
|
# Host language, One of:
|
36
27
|
# :xhtml_rdfa_1_0
|
37
28
|
# :xhtml_rdfa_1_1
|
@@ -89,9 +80,9 @@ module RDF::RDFa
|
|
89
80
|
|
90
81
|
# Copy this Evaluation Context
|
91
82
|
def initialize_copy(from)
|
92
|
-
|
93
|
-
|
94
|
-
|
83
|
+
# clone the evaluation context correctly
|
84
|
+
@uri_mappings = from.uri_mappings.clone
|
85
|
+
@incomplete_triples = from.incomplete_triples.clone
|
95
86
|
end
|
96
87
|
|
97
88
|
def inspect
|
@@ -103,38 +94,22 @@ module RDF::RDFa
|
|
103
94
|
end
|
104
95
|
end
|
105
96
|
|
106
|
-
# Parse XHTML+RDFa document from a string or input stream to closure or graph.
|
107
|
-
#
|
108
|
-
# If the parser is called with a block, triples are passed to the block rather
|
109
|
-
# than added to the graph.
|
110
|
-
#
|
111
|
-
# Optionally, the stream may be a Nokogiri::HTML::Document or Nokogiri::XML::Document
|
112
|
-
# With a block, yeilds each statement with URI, BNode or Literal elements
|
113
|
-
#
|
114
|
-
# @param [IO] stream:: the HTML+RDFa IO stream, string, Nokogiri::HTML::Document or Nokogiri::XML::Document
|
115
|
-
# @param [String] uri:: the URI of the document
|
116
|
-
# @param [Hash] options:: Parser options, one of
|
117
|
-
# <em>options[:debug]</em>:: Array to place debug messages
|
118
|
-
# <em>options[:strict]</em>:: Raise Error if true, continue with lax parsing, otherwise
|
119
|
-
# @return [Graph]:: Returns the graph containing parsed triples
|
120
|
-
# @raise [Error]:: Raises RdfError if _strict_
|
121
|
-
|
122
97
|
##
|
123
98
|
# Initializes the RDFa reader instance.
|
124
99
|
#
|
125
|
-
# @param [IO, File, String] input
|
126
|
-
# @param [Hash{Symbol => Object}] options
|
100
|
+
# @param [IO, File, String]:: input
|
101
|
+
# @param [Hash{Symbol => Object}]:: options
|
102
|
+
# <em>options[:debug]</em>:: Array to place debug messages
|
103
|
+
# <em>options[:strict]</em>:: Raise Error if true, continue with lax parsing, otherwise
|
104
|
+
# <em>options[:base_uri]</em>:: Base URI to use for relative URIs.
|
127
105
|
# @yield [reader]
|
128
106
|
# @yieldparam [Reader] reader
|
107
|
+
# @raise [RDF::ReaderError]:: Raises RDF::ReaderError if _strict_
|
129
108
|
def initialize(input = $stdin, options = {}, &block)
|
130
|
-
super
|
131
|
-
|
132
|
-
@graph = RDF::Graph.new
|
109
|
+
super do
|
133
110
|
@debug = options[:debug]
|
134
111
|
@strict = options[:strict]
|
135
|
-
@base_uri = options[:base_uri]
|
136
|
-
@base_uri = RDF::URI.parse(@base_uri) if @base_uri.is_a?(String)
|
137
|
-
@named_bnodes = {}
|
112
|
+
@base_uri = RDF::URI.new(options[:base_uri])
|
138
113
|
@@vocabulary_cache ||= {}
|
139
114
|
|
140
115
|
@doc = case input
|
@@ -143,37 +118,10 @@ module RDF::RDFa
|
|
143
118
|
else Nokogiri::XML.parse(input, @base_uri.to_s)
|
144
119
|
end
|
145
120
|
|
146
|
-
raise
|
147
|
-
@
|
148
|
-
|
149
|
-
# Determine host language
|
150
|
-
# XXX - right now only XHTML defined
|
151
|
-
@host_language = case @doc.root.attributes["version"].to_s
|
152
|
-
when /XHTML+RDFa/ then :xhtml
|
153
|
-
end
|
154
|
-
|
155
|
-
# If none found, assume xhtml
|
156
|
-
@host_language ||= :xhtml
|
157
|
-
|
158
|
-
@host_defaults = {}
|
159
|
-
@host_defaults = case @host_language
|
160
|
-
when :xhtml
|
161
|
-
{
|
162
|
-
:vocabulary => RDF::XHV["uri"],
|
163
|
-
:prefix => "xhv",
|
164
|
-
:term_mappings => %w(
|
165
|
-
alternate appendix bookmark cite chapter contents copyright first glossary help icon index
|
166
|
-
last license meta next p3pv1 prev role section stylesheet subsection start top up
|
167
|
-
).inject({}) { |hash, term| hash[term] = RDF::XHV[term]; hash },
|
168
|
-
}
|
169
|
-
else
|
170
|
-
{}
|
171
|
-
end
|
172
|
-
|
173
|
-
# parse
|
174
|
-
parse_whole_document(@doc, @base_uri)
|
175
|
-
|
121
|
+
raise RDF::ReaderError, "Synax errors:\n#{@doc.errors}" if !@doc.errors.empty? && @strict
|
122
|
+
raise RDF::ReaderError, "Empty document" if (@doc.nil? || @doc.root.nil?) && @strict
|
176
123
|
block.call(self) if block_given?
|
124
|
+
end
|
177
125
|
end
|
178
126
|
|
179
127
|
|
@@ -185,7 +133,34 @@ module RDF::RDFa
|
|
185
133
|
# @yieldparam [RDF::Statement] statement
|
186
134
|
# @return [void]
|
187
135
|
def each_statement(&block)
|
188
|
-
@
|
136
|
+
@callback = block
|
137
|
+
|
138
|
+
# Determine host language
|
139
|
+
# XXX - right now only XHTML defined
|
140
|
+
@host_language = case @doc.root.attributes["version"].to_s
|
141
|
+
when /XHTML+RDFa/ then :xhtml
|
142
|
+
end
|
143
|
+
|
144
|
+
# If none found, assume xhtml
|
145
|
+
@host_language ||= :xhtml
|
146
|
+
|
147
|
+
@host_defaults = {}
|
148
|
+
@host_defaults = case @host_language
|
149
|
+
when :xhtml
|
150
|
+
{
|
151
|
+
:vocabulary => RDF::XHV.to_s,
|
152
|
+
:prefix => "xhv",
|
153
|
+
:term_mappings => %w(
|
154
|
+
alternate appendix bookmark cite chapter contents copyright first glossary help icon index
|
155
|
+
last license meta next p3pv1 prev role section stylesheet subsection start top up
|
156
|
+
).inject({}) { |hash, term| hash[term] = RDF::XHV[term]; hash },
|
157
|
+
}
|
158
|
+
else
|
159
|
+
{}
|
160
|
+
end
|
161
|
+
|
162
|
+
# parse
|
163
|
+
parse_whole_document(@doc, @base_uri)
|
189
164
|
end
|
190
165
|
|
191
166
|
##
|
@@ -197,7 +172,9 @@ module RDF::RDFa
|
|
197
172
|
# @yieldparam [RDF::Value] object
|
198
173
|
# @return [void]
|
199
174
|
def each_triple(&block)
|
200
|
-
|
175
|
+
each_statement do |statement|
|
176
|
+
block.call(*statement.to_triple)
|
177
|
+
end
|
201
178
|
end
|
202
179
|
|
203
180
|
private
|
@@ -227,17 +204,11 @@ module RDF::RDFa
|
|
227
204
|
# @param [URI] predicate:: the predicate of the statement
|
228
205
|
# @param [URI, BNode, Literal] object:: the object of the statement
|
229
206
|
# @return [Statement]:: Added statement
|
230
|
-
# @raise [
|
207
|
+
# @raise [ReaderError]:: Checks parameter types and raises if they are incorrect if parsing mode is _strict_.
|
231
208
|
def add_triple(node, subject, predicate, object)
|
232
209
|
statement = RDF::Statement.new(subject, predicate, object)
|
233
210
|
add_debug(node, "statement: #{statement}")
|
234
|
-
@
|
235
|
-
statement
|
236
|
-
# FIXME: rescue RdfException => e
|
237
|
-
rescue Exception => e
|
238
|
-
add_debug(node, "add_triple raised #{e.class}: #{e.message}")
|
239
|
-
puts e.backtrace if $DEBUG
|
240
|
-
raise if @strict
|
211
|
+
@callback.call(statement)
|
241
212
|
end
|
242
213
|
|
243
214
|
|
@@ -283,57 +254,40 @@ module RDF::RDFa
|
|
283
254
|
um = @@vocabulary_cache[profile][:uri_mappings]
|
284
255
|
tm = @@vocabulary_cache[profile][:term_mappings]
|
285
256
|
add_debug(element, "extract_mappings: profile open <#{profile}>")
|
286
|
-
|
287
|
-
sess = Patron::Session.new
|
288
|
-
sess.timeout = 10
|
289
|
-
resp = sess.get(profile)
|
290
|
-
raise RuntimeError, "HTTP returned status #{resp.status} when reading #{profile}" if resp.status >= 400
|
291
|
-
|
292
|
-
# Parse profile, and extract mappings from graph
|
257
|
+
|
293
258
|
old_debug, old_verbose, = $DEBUG, $verbose
|
294
259
|
$DEBUG, $verbose = false, false
|
295
|
-
|
296
|
-
|
260
|
+
# FIXME: format shouldn't need to be specified here
|
261
|
+
p_graph = RDF::Graph.load(profile, :base_uri => profile, :format => :rdfa)
|
297
262
|
$DEBUG, $verbose = old_debug, old_verbose
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
# If one of the objects is not a Literal or if there are additional rdfa:uri or rdfa:term
|
304
|
-
# predicates sharing the same subject, no mapping is created.
|
305
|
-
uri = props[RDF::RDFA["uri"].to_s]
|
306
|
-
term = props[RDF::RDFA["term"].to_s]
|
307
|
-
prefix = props[RDF::RDFA["prefix"].to_s]
|
263
|
+
p_graph.each_subject do |subject|
|
264
|
+
# If one of the objects is not a Literal no mapping is created.
|
265
|
+
uri = p_graph.first_object([subject, RDF::RDFA['uri'], nil])
|
266
|
+
term = p_graph.first_object([subject, RDF::RDFA['term'], nil])
|
267
|
+
prefix = p_graph.first_object([subject, RDF::RDFA['prefix'], nil])
|
308
268
|
add_debug(element, "extract_mappings: uri=#{uri.inspect}, term=#{term.inspect}, prefix=#{prefix.inspect}")
|
309
269
|
|
310
270
|
next if !uri || (!term && !prefix)
|
311
|
-
raise
|
312
|
-
raise
|
313
|
-
raise
|
314
|
-
|
315
|
-
uri = uri.first
|
316
|
-
term = term.first if term
|
317
|
-
prefix = prefix.first if prefix
|
318
|
-
raise ParserException, "rdf:uri must be a Literal" unless uri.is_a?(Literal)
|
319
|
-
raise ParserException, "rdf:term must be a Literal" unless term.nil? || term.is_a?(Literal)
|
320
|
-
raise ParserException, "rdf:prefix must be a Literal" unless prefix.nil? || prefix.is_a?(Literal)
|
271
|
+
raise RDF::ReaderError, "rdf:uri must be a Literal" unless uri.is_a?(RDF::Literal)
|
272
|
+
raise RDF::ReaderError, "rdf:term must be a Literal" unless term.nil? || term.is_a?(RDF::Literal)
|
273
|
+
raise RDF::ReaderError, "rdf:prefix must be a Literal" unless prefix.nil? || prefix.is_a?(RDF::Literal)
|
321
274
|
|
322
275
|
# For every extracted triple that is the common subject of an rdfa:prefix and an rdfa:uri
|
323
276
|
# predicate, create a mapping from the object literal of the rdfa:prefix predicate to the
|
324
277
|
# object literal of the rdfa:uri predicate. Add or update this mapping in the local list of
|
325
278
|
# URI mappings after transforming the 'prefix' component to lower-case.
|
326
279
|
# For every extracted
|
327
|
-
um[prefix.
|
280
|
+
um[prefix.value.downcase] = uri.value if prefix
|
328
281
|
|
329
282
|
# triple that is the common subject of an rdfa:term and an rdfa:uri predicate, create a
|
330
283
|
# mapping from the object literal of the rdfa:term predicate to the object literal of the
|
331
284
|
# rdfa:uri predicate. Add or update this mapping in the local term mappings.
|
332
|
-
tm[term.
|
285
|
+
tm[term.value] = RDF::URI.new(uri.value) if term
|
333
286
|
end
|
334
|
-
|
335
|
-
|
336
|
-
|
287
|
+
# FIXME: subject isn't in scope here
|
288
|
+
#rescue RDF::ReaderError
|
289
|
+
# add_debug(element, "extract_mappings: profile subject #{subject.to_s}: #{e.message}")
|
290
|
+
# raise if @strict
|
337
291
|
rescue RuntimeError => e
|
338
292
|
add_debug(element, "extract_mappings: profile: #{e.message}")
|
339
293
|
raise if @strict
|
@@ -353,9 +307,8 @@ module RDF::RDFa
|
|
353
307
|
element.namespaces.each do |attr_name, attr_value|
|
354
308
|
begin
|
355
309
|
abbr, prefix = attr_name.split(":")
|
356
|
-
uri_mappings[prefix.to_s.downcase] =
|
357
|
-
|
358
|
-
rescue Exception => e
|
310
|
+
uri_mappings[prefix.to_s.downcase] = attr_value.to_s if abbr.downcase == "xmlns" && prefix
|
311
|
+
rescue ReaderError => e
|
359
312
|
add_debug(element, "extract_mappings raised #{e.class}: #{e.message}")
|
360
313
|
raise if @strict
|
361
314
|
end
|
@@ -372,18 +325,18 @@ module RDF::RDFa
|
|
372
325
|
next unless prefix.match(/:$/)
|
373
326
|
prefix.chop!
|
374
327
|
|
375
|
-
uri_mappings[prefix] =
|
328
|
+
uri_mappings[prefix] = uri
|
376
329
|
end
|
377
330
|
|
378
|
-
add_debug(element, "uri_mappings: #{uri_mappings.
|
379
|
-
add_debug(element, "term_mappings: #{term_mappings.
|
331
|
+
add_debug(element, "uri_mappings: #{uri_mappings.map{|k,v|"#{k}='#{v}'"}.join(", ")}")
|
332
|
+
add_debug(element, "term_mappings: #{term_mappings.map{|k,v|"#{k}='#{v}'"}.join(", ")}")
|
380
333
|
end
|
381
334
|
|
382
335
|
# The recursive helper function
|
383
336
|
def traverse(element, evaluation_context)
|
384
337
|
if element.nil?
|
385
338
|
add_debug(element, "traverse nil element")
|
386
|
-
raise
|
339
|
+
raise RDF::ReaderError, "Can't parse nil element" if @strict
|
387
340
|
return nil
|
388
341
|
end
|
389
342
|
|
@@ -428,7 +381,7 @@ module RDF::RDFa
|
|
428
381
|
# Set default_vocabulary to host language default
|
429
382
|
@host_defaults.fetch(:voabulary, nil)
|
430
383
|
else
|
431
|
-
|
384
|
+
vocab.to_s
|
432
385
|
end
|
433
386
|
add_debug(element, "[Step 2] traverse, default_vocaulary: #{default_vocabulary.inspect}")
|
434
387
|
end
|
@@ -538,7 +491,7 @@ module RDF::RDFa
|
|
538
491
|
types = process_uris(element, typeof, evaluation_context, :uri_mappings => uri_mappings, :term_mappings => term_mappings, :vocab => default_vocabulary)
|
539
492
|
add_debug(element, "typeof: #{typeof}")
|
540
493
|
types.each do |one_type|
|
541
|
-
add_triple(element, new_subject,
|
494
|
+
add_triple(element, new_subject, RDF.type, one_type)
|
542
495
|
end
|
543
496
|
end
|
544
497
|
|
@@ -681,7 +634,7 @@ module RDF::RDFa
|
|
681
634
|
if uri
|
682
635
|
add_debug(element, "process_uri: #{value} => CURIE => <#{uri}>")
|
683
636
|
else
|
684
|
-
|
637
|
+
## FIXME: throw exception if there is no base uri set?
|
685
638
|
uri = RDF::URI.new(evaluation_context.base + value)
|
686
639
|
add_debug(element, "process_uri: #{value} => URI => <#{uri}>")
|
687
640
|
end
|
@@ -703,7 +656,7 @@ module RDF::RDFa
|
|
703
656
|
options[:term_mappings][value.to_s.downcase]
|
704
657
|
when options[:vocab]
|
705
658
|
# Otherwise, if there is a local default vocabulary the URI is obtained by concatenating that value and the term.
|
706
|
-
options[:vocab]
|
659
|
+
RDF::URI.new(options[:vocab] + value)
|
707
660
|
else
|
708
661
|
# Finally, if there is no local default vocabulary, the term has no associated URI and must be ignored.
|
709
662
|
nil
|
@@ -717,15 +670,13 @@ module RDF::RDFa
|
|
717
670
|
|
718
671
|
# consider the bnode situation
|
719
672
|
if prefix == "_"
|
720
|
-
|
721
|
-
# FIXME: BNode.new(reference || "", @named_bnodes)
|
722
|
-
RDF::Node.new(reference || nil)
|
673
|
+
RDF::Node.new(reference)
|
723
674
|
elsif curie.to_s.match(/^:/)
|
724
675
|
# Default prefix
|
725
676
|
if uri_mappings[""]
|
726
|
-
uri_mappings[""]
|
677
|
+
RDF::URI.new(uri_mappings[""] + reference)
|
727
678
|
elsif @host_defaults[:prefix]
|
728
|
-
@host_defaults[:prefix]
|
679
|
+
RDF::URI.new(@host_defaults[:prefix] + reference)
|
729
680
|
end
|
730
681
|
elsif !curie.to_s.match(/:/)
|
731
682
|
# No prefix, undefined (in this context, it is evaluated as a term elsewhere)
|
@@ -734,7 +685,7 @@ module RDF::RDFa
|
|
734
685
|
# Prefixes always downcased
|
735
686
|
ns = uri_mappings[prefix.to_s.downcase]
|
736
687
|
if ns
|
737
|
-
|
688
|
+
RDF::URI.new(ns +reference)
|
738
689
|
else
|
739
690
|
add_debug(element, "curie_to_resource_or_bnode No namespace mapping for #{prefix.downcase}")
|
740
691
|
nil
|