rdf_context 0.5.7 → 0.5.8.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +15 -1
- data/README.rdoc +2 -0
- data/Rakefile +2 -4
- data/VERSION +1 -1
- data/bin/rdf_context +5 -54
- data/lib/rdf_context.rb +5 -0
- data/lib/rdf_context/graph.rb +68 -49
- data/lib/rdf_context/n3parser.rb +2 -2
- data/lib/rdf_context/namespace.rb +1 -1
- data/lib/rdf_context/nokogiri_hacks.rb +7 -0
- data/lib/rdf_context/parser.rb +57 -13
- data/lib/rdf_context/rdfaparser.rb +200 -130
- data/lib/rdf_context/rdfxmlparser.rb +8 -8
- data/lib/rdf_context/serializer/recursive_serializer.rb +1 -1
- data/lib/rdf_context/serializer/turtle_serializer.rb +15 -15
- data/lib/rdf_context/serializer/xml_serializer.rb +8 -8
- data/lib/rdf_context/store/memory_store.rb +14 -14
- data/lib/rdf_context/store/sqlite3_store.rb +4 -4
- data/lib/rdf_context/uriref.rb +11 -4
- data/script/console +1 -3
- data/script/tc +44 -0
- data/spec/.gitignore +1 -0
- data/spec/aggregate_graph_spec.rb +1 -0
- data/spec/bnode_spec.rb +2 -1
- data/spec/conjunctive_graph_spec.rb +1 -0
- data/spec/cwm_spec.rb +1 -0
- data/spec/duration_spec.rb +1 -0
- data/spec/graph_spec.rb +27 -0
- data/spec/list_store_spec.rb +1 -0
- data/spec/literal_spec.rb +1 -0
- data/spec/matchers.rb +1 -1
- data/spec/memory_store_spec.rb +1 -0
- data/spec/n3parser_spec.rb +1 -0
- data/spec/namespaces_spec.rb +1 -0
- data/spec/parser_spec.rb +1 -0
- data/spec/rdf_helper.rb +4 -4
- data/spec/rdfa_helper.rb +24 -0
- data/spec/rdfa_parser_spec.rb +6 -36
- data/spec/rdfcore/.gitignore +1 -0
- data/spec/rdfxml_spec.rb +1 -0
- data/spec/sqlite3_store_spec.rb +1 -0
- data/spec/string_hacks_spec.rb +2 -0
- data/spec/swap_test/.gitignore +1 -0
- data/spec/triple_spec.rb +1 -0
- data/spec/turtle/.gitignore +1 -0
- data/spec/turtle_serializer_spec.rb +3 -2
- data/spec/turtle_spec.rb +1 -0
- data/spec/uriref_spec.rb +13 -12
- data/spec/xml_serializer_spec.rb +7 -6
- metadata +26 -61
- data/spec/html4-manifest.yml +0 -4937
- data/spec/html5-manifest.yml +0 -4937
- data/spec/rdfcore/Manifest.yml +0 -6242
- data/spec/swap_test/n3parser.yml +0 -773
- data/spec/swap_test/regression.yml +0 -902
- data/spec/turtle/manifest-bad.yml +0 -807
- data/spec/turtle/manifest.yml +0 -807
- data/spec/xhtml-manifest.yml +0 -3901
- data/spec/xhtml11-manifest.yml +0 -4405
data/History.rdoc
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
=== 0.5.8.1
|
2
|
+
=== 0.5.8
|
3
|
+
* Remove dependency on whatlanguage.
|
4
|
+
* Added support for Processor Graphs.
|
5
|
+
* Change Graph#seq to specifically look for subject type of rdf:Seq, rdf:Bag or rdf:Alt to trigger rdf:_n processing.
|
6
|
+
* Update RDFa processing to WD-rdfa-core-20100803 semantics
|
7
|
+
* Added Processor Graph and required output
|
8
|
+
* Reverse order of processing profiles
|
9
|
+
* Don't process element if any profile fails
|
10
|
+
* XMLLiterals must be explicitly specified as @datatype
|
11
|
+
* TERMorCURIEorAbsURI requires an absolute URI, not document relative
|
12
|
+
* Move @profile parsing before @vocabulary.
|
13
|
+
* Extract a new default vocabulary from @profile.*
|
14
|
+
|
1
15
|
=== 0.5.7
|
2
16
|
* Add back support for RDFa 1.0 as well as RDFa 1.1. Parser checks @version to determine which
|
3
17
|
* Remove specs for html4 and html5 until sorted out.
|
@@ -35,7 +49,7 @@
|
|
35
49
|
* Remove old binding for a namespace URI creating a new binding
|
36
50
|
|
37
51
|
=== 0.5.1
|
38
|
-
* Avoid stack-overflow when checking graph size (if
|
52
|
+
* Avoid stack-overflow when checking graph size (if ::RdfContext::debug? == true)
|
39
53
|
* Refactor serializers to be based on AbstractSerializer
|
40
54
|
* Graph
|
41
55
|
* Add Graph#serialize taking a serializer or symbol identifing a serialzer and a base URI
|
data/README.rdoc
CHANGED
@@ -192,6 +192,8 @@ These interfaces work on contexts and formulae (for stores that are formula-awar
|
|
192
192
|
* Reasoner/inference engine
|
193
193
|
* SPARQL
|
194
194
|
* RDFS logic and RDF entailment tests
|
195
|
+
* OWL 2 Test Cases
|
196
|
+
* http://owl.semanticweb.org/page/OWL_2_Test_Cases
|
195
197
|
|
196
198
|
== Resources:
|
197
199
|
* Distiller[http://kellogg-assoc/distiller]
|
data/Rakefile
CHANGED
@@ -22,12 +22,10 @@ begin
|
|
22
22
|
gemspec.email = "gregg@kellogg-assoc.com"
|
23
23
|
gemspec.homepage = "http://github.com/gkellogg/rdf_context"
|
24
24
|
gemspec.authors = ["Gregg Kellogg"]
|
25
|
-
gemspec.add_dependency('addressable', '>= 2.
|
25
|
+
gemspec.add_dependency('addressable', '>= 2.2.0')
|
26
26
|
gemspec.add_dependency('treetop', '>= 1.4.0')
|
27
|
-
gemspec.add_dependency('
|
28
|
-
gemspec.add_dependency('nokogiri', '>= 1.3.3')
|
27
|
+
gemspec.add_dependency('nokogiri', '>= 1.4.3')
|
29
28
|
gemspec.add_dependency('builder', '>= 2.1.2')
|
30
|
-
gemspec.add_dependency('patron', '>= 0.4.6')
|
31
29
|
gemspec.add_development_dependency('rspec')
|
32
30
|
gemspec.add_development_dependency('activesupport', '>= 2.3.0')
|
33
31
|
gemspec.add_development_dependency('yard')
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.8.1
|
data/bin/rdf_context
CHANGED
@@ -10,9 +10,7 @@ class Parse
|
|
10
10
|
graph_opts[:store] = store if store
|
11
11
|
parser = Parser.new(:graph => Graph.new(graph_opts))
|
12
12
|
parser.parse(file.respond_to?(:read) ? file : File.open(file), base_uri, :strict => true)
|
13
|
-
|
14
|
-
puts output unless $quiet
|
15
|
-
|
13
|
+
puts parser.graph.serialize(:format => $format.to_sym, :base => base_uri) unless $quiet
|
16
14
|
puts parser.debug.to_a.join("\n\t") if $verbose
|
17
15
|
rescue RdfException => e
|
18
16
|
puts "Parse failure: #{e.message}"
|
@@ -25,44 +23,12 @@ class Parse
|
|
25
23
|
end
|
26
24
|
end
|
27
25
|
|
28
|
-
TEST_DIR = File.join(File.dirname(__FILE__), '..', 'spec', 'rdfa-test-suite', 'tests')
|
29
|
-
BASE_MANIFEST_URL = "http://rdfa.digitalbazaar.com/test-suite/"
|
30
|
-
BASE_TEST_CASE_URL = "#{BASE_MANIFEST_URL}test-cases/"
|
31
|
-
|
32
|
-
def rdfa_tc(number, parse, store)
|
33
|
-
f = File.expand_path("#{TEST_DIR}/#{number}.txt")
|
34
|
-
found_head = false
|
35
|
-
namespaces = ""
|
36
|
-
body = File.readlines(f).map do |line|
|
37
|
-
found_head ||= line.match(/<head/)
|
38
|
-
if found_head
|
39
|
-
line.chop
|
40
|
-
else
|
41
|
-
namespaces << line
|
42
|
-
nil
|
43
|
-
end
|
44
|
-
end.compact.join("\n")
|
45
|
-
|
46
|
-
namespaces.chop! # Remove trailing newline
|
47
|
-
|
48
|
-
tcpath = BASE_TEST_CASE_URL + "xhtml1"
|
49
|
-
|
50
|
-
head = "" +
|
51
|
-
%(<?xml version="1.0" encoding="UTF-8"?>\n) +
|
52
|
-
%(<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">\n) +
|
53
|
-
%(<html xmlns="http://www.w3.org/1999/xhtml" version="XHTML+RDFa #{$rdfa_version}"\n)
|
54
|
-
tc = head + "#{namespaces}>\n#{body.gsub(/\$TCPATH/, tcpath)}\n</html>"
|
55
|
-
|
56
|
-
puts "Input file: #{tc}" if $DEBUG || $verbose
|
57
|
-
parse.parse(StringIO.new(tc), "#{tcpath}/#{number}.xhtml")
|
58
|
-
end
|
59
|
-
|
60
26
|
mode = ARGV.shift
|
61
27
|
raise "Mode must be one of 'parse'" unless mode == "parse"
|
62
28
|
|
63
29
|
$verbose = false
|
30
|
+
$quiet = false
|
64
31
|
$format = "ttl"
|
65
|
-
$rdfa_version = "1.1"
|
66
32
|
base_uri = "http://example.com"
|
67
33
|
store = :list_store
|
68
34
|
opts = GetoptLong.new(
|
@@ -71,19 +37,15 @@ opts = GetoptLong.new(
|
|
71
37
|
["--debug", GetoptLong::NO_ARGUMENT],
|
72
38
|
["--format", GetoptLong::REQUIRED_ARGUMENT],
|
73
39
|
["--store", GetoptLong::REQUIRED_ARGUMENT],
|
74
|
-
["--uri", GetoptLong::REQUIRED_ARGUMENT]
|
75
|
-
["--rdfa", GetoptLong::NO_ARGUMENT],
|
76
|
-
["--1_0", GetoptLong::NO_ARGUMENT]
|
40
|
+
["--uri", GetoptLong::REQUIRED_ARGUMENT]
|
77
41
|
)
|
78
42
|
opts.each do |opt, arg|
|
79
43
|
case opt
|
80
44
|
when '--verbose' then $verbose = true
|
81
45
|
when '--quiet' then $quiet = true
|
82
|
-
when '--debug' then
|
46
|
+
when '--debug' then ::RdfContext::debug = true
|
83
47
|
when '--format' then $format = arg
|
84
48
|
when '--uri' then base_uri = arg
|
85
|
-
when '--rdfa' then $rdfa = true
|
86
|
-
when '--1_0' then $rdfa_version = "1.0"
|
87
49
|
when '--store'
|
88
50
|
case arg
|
89
51
|
when /list/
|
@@ -98,20 +60,9 @@ opts.each do |opt, arg|
|
|
98
60
|
end
|
99
61
|
|
100
62
|
x = Parse.new
|
101
|
-
if
|
102
|
-
# Run all RDFa test cases
|
103
|
-
Dir.foreach(TEST_DIR) do |f|
|
104
|
-
next unless f.match(/^(.*)\.txt$/)
|
105
|
-
rdfa_tc($1, x, store)
|
106
|
-
end
|
107
|
-
elsif ARGV.empty?
|
63
|
+
if ARGV.empty?
|
108
64
|
s = $stdin.read
|
109
65
|
x.parse(StringIO.new(s), base_uri, store)
|
110
|
-
elsif $rdfa
|
111
|
-
# Run specified RDFa test cases
|
112
|
-
ARGV.each do |tc|
|
113
|
-
rdfa_tc(tc, x, store)
|
114
|
-
end
|
115
66
|
else
|
116
67
|
ARGV.each do |test_file|
|
117
68
|
x.parse(test_file, base_uri, store)
|
data/lib/rdf_context.rb
CHANGED
@@ -74,4 +74,9 @@ module RdfContext
|
|
74
74
|
WELLKNOWN_NAMESPACES = [DC_NS, OWL_NS, LOG_NS, RDF_NS, RDFA_NS, RDFS_NS, XHV_NS, XML_NS, XSD_NS, XSI_NS]
|
75
75
|
|
76
76
|
XH_MAPPING = {"" => Namespace.new("http://www.w3.org/1999/xhtml/vocab\#", nil)}
|
77
|
+
|
78
|
+
|
79
|
+
# Control debug output.
|
80
|
+
def self.debug?; @debug; end
|
81
|
+
def self.debug=(value); @debug = value; end
|
77
82
|
end
|
data/lib/rdf_context/graph.rb
CHANGED
@@ -265,39 +265,6 @@ module RdfContext
|
|
265
265
|
self
|
266
266
|
end
|
267
267
|
|
268
|
-
##
|
269
|
-
# Adds a list of resources as an RDF list by creating bnodes and first/rest triples
|
270
|
-
# @param [URIRef, BNode] subject the subject of the triple
|
271
|
-
# @param [URIRef] predicate the predicate of the triple
|
272
|
-
# @param [Array] objects List of objects to serialize
|
273
|
-
# @return [Graph] Returns the graph
|
274
|
-
# @raise [Error] Checks parameter types and raises if they are incorrect.
|
275
|
-
def add_seq(subject, predicate, objects)
|
276
|
-
if objects.empty?
|
277
|
-
add_triple(subject, predicate, RDF_NS.nil)
|
278
|
-
return self
|
279
|
-
end
|
280
|
-
|
281
|
-
if RDF_NS.first != predicate
|
282
|
-
bn = BNode.new
|
283
|
-
add_triple(subject, predicate, bn)
|
284
|
-
subject = bn
|
285
|
-
end
|
286
|
-
|
287
|
-
last = objects.pop
|
288
|
-
|
289
|
-
objects.each do |o|
|
290
|
-
add_triple(subject, RDF_NS.first, o)
|
291
|
-
bn = BNode.new
|
292
|
-
add_triple(subject, RDF_NS.rest, bn)
|
293
|
-
subject = bn
|
294
|
-
end
|
295
|
-
|
296
|
-
# Last item in list
|
297
|
-
add_triple(subject, RDF_NS.first, last)
|
298
|
-
add_triple(subject, RDF_NS.rest, RDF_NS.nil)
|
299
|
-
end
|
300
|
-
|
301
268
|
# Remove a triple from the graph. Delegates to store.
|
302
269
|
# Nil matches all triples and thus empties the graph
|
303
270
|
# @param [Triple] triple
|
@@ -316,19 +283,24 @@ module RdfContext
|
|
316
283
|
|
317
284
|
# Returns ordered rdf:_n objects or rdf:first, rdf:rest for a given subject
|
318
285
|
# @param [Resource] subject
|
286
|
+
# @param [Resource] predicate defaults to rdf:first, not used of subject is an rdf:List type
|
319
287
|
# @return [Array<Resource>]
|
320
|
-
def seq(subject)
|
288
|
+
def seq(subject, predicate = RDF_NS.first)
|
321
289
|
props = properties(subject)
|
322
|
-
rdf_type = (props[RDF_TYPE.to_s] || [])
|
290
|
+
rdf_type = (props[RDF_TYPE.to_s] || [])
|
323
291
|
|
324
292
|
#puts "seq; #{rdf_type} #{rdf_type - [RDF_NS.Seq, RDF_NS.Bag, RDF_NS.Alt]}"
|
325
|
-
if
|
293
|
+
if rdf_type.include?(RDF_NS.Seq) || rdf_type.include?(RDF_NS.Bag) || rdf_type.include?(RDF_NS.Alt)
|
326
294
|
props.keys.select {|k| k.match(/#{RDF_NS.uri}_(\d)$/)}.
|
327
295
|
sort_by {|i| i.sub(RDF_NS._.to_s, "").to_i}.
|
328
296
|
map {|key| props[key]}.
|
329
297
|
flatten
|
330
|
-
elsif !self.triples(Triple.new(subject,
|
298
|
+
elsif !self.triples(Triple.new(subject, predicate, nil)).empty?
|
331
299
|
# N3-style first/rest chain
|
300
|
+
unless predicate == RDF_NS.first
|
301
|
+
subject = (properties(subject)[predicate.to_s] || []).first
|
302
|
+
end
|
303
|
+
|
332
304
|
list = []
|
333
305
|
while subject != RDF_NS.nil
|
334
306
|
props = properties(subject)
|
@@ -346,6 +318,53 @@ module RdfContext
|
|
346
318
|
end
|
347
319
|
end
|
348
320
|
|
321
|
+
##
|
322
|
+
# Adds a list of resources as an RDF list by creating bnodes and first/rest triples.
|
323
|
+
# Removes existing sequence nodes.
|
324
|
+
#
|
325
|
+
# @param [URIRef, BNode] subject the subject of the triple
|
326
|
+
# @param [URIRef] predicate the predicate of the triple
|
327
|
+
# @param [Array] objects List of objects to serialize
|
328
|
+
# @return [Graph] Returns the graph
|
329
|
+
# @raise [Error] Checks parameter types and raises if they are incorrect.
|
330
|
+
def add_seq(subject, predicate, objects)
|
331
|
+
self.triples(Triple.new(subject, predicate, nil)).each do |t, ctx|
|
332
|
+
bn = t.object
|
333
|
+
while bn != RDF_NS.nil
|
334
|
+
rest = properties(bn)[RDF_NS.rest.to_s].first
|
335
|
+
remove(Triple.new(bn, nil, nil))
|
336
|
+
bn = rest
|
337
|
+
end
|
338
|
+
end
|
339
|
+
remove(Triple.new(subject, predicate, nil))
|
340
|
+
|
341
|
+
if objects.empty?
|
342
|
+
add_triple(subject, predicate, RDF_NS.nil)
|
343
|
+
return self
|
344
|
+
end
|
345
|
+
|
346
|
+
if RDF_NS.first != predicate
|
347
|
+
bn = BNode.new
|
348
|
+
add_triple(subject, predicate, bn)
|
349
|
+
subject = bn
|
350
|
+
end
|
351
|
+
|
352
|
+
last = objects.pop
|
353
|
+
|
354
|
+
objects.each do |o|
|
355
|
+
add_triple(subject, RDF_NS.first, o)
|
356
|
+
bn = BNode.new
|
357
|
+
add_triple(subject, RDF_NS.rest, bn)
|
358
|
+
subject = bn
|
359
|
+
end
|
360
|
+
|
361
|
+
# Last item in list
|
362
|
+
add_triple(subject, RDF_NS.first, last)
|
363
|
+
add_triple(subject, RDF_NS.rest, RDF_NS.nil)
|
364
|
+
|
365
|
+
self
|
366
|
+
end
|
367
|
+
|
349
368
|
# Resource properties
|
350
369
|
#
|
351
370
|
# Properties arranged as a hash with the predicate Term as index to an array of resources or literals
|
@@ -388,7 +407,7 @@ module RdfContext
|
|
388
407
|
|
389
408
|
# Iterate through and add properties to graph
|
390
409
|
props.each_pair do |pred, list|
|
391
|
-
predicate = URIRef.
|
410
|
+
predicate = URIRef.intern(pred)
|
392
411
|
[list].flatten.compact.each do |object|
|
393
412
|
add(Triple.new(subject, predicate, object))
|
394
413
|
end
|
@@ -472,25 +491,25 @@ module RdfContext
|
|
472
491
|
# @param [Graph] graph
|
473
492
|
# @return [Boolean]
|
474
493
|
def eql?(other)
|
475
|
-
#puts "eql? size #{self.size} vs #{other.size}" if
|
494
|
+
#puts "eql? size #{self.size} vs #{other.size}" if ::RdfContext::debug?
|
476
495
|
return false if !other.is_a?(Graph) || self.size != other.size
|
477
496
|
return false unless other.identifier.to_s == identifier.to_s unless other.identifier.is_a?(BNode) && identifier.is_a?(BNode)
|
478
497
|
|
479
498
|
bn_self = bnodes.values.sort
|
480
499
|
bn_other = other.bnodes.values.sort
|
481
|
-
puts "eql? bnodes '#{bn_self.to_sentence}' vs '#{bn_other.to_sentence}'" if
|
500
|
+
puts "eql? bnodes '#{bn_self.to_sentence}' vs '#{bn_other.to_sentence}'" if ::RdfContext::debug?
|
482
501
|
return false unless bn_self == bn_other
|
483
502
|
|
484
503
|
# Check each triple to see if it's contained in the other graph
|
485
504
|
triples do |t, ctx|
|
486
505
|
next if t.subject.is_a?(BNode) || t.predicate.is_a?(BNode) || t.object.is_a?(BNode)
|
487
|
-
puts "eql? contains '#{t.to_ntriples}: #{other.contains?(t)}'" if
|
506
|
+
puts "eql? contains '#{t.to_ntriples}: #{other.contains?(t)}'" if ::RdfContext::debug?
|
488
507
|
return false unless other.contains?(t)
|
489
508
|
end
|
490
509
|
|
491
510
|
# For each BNode, check permutations of similar bnodes in other graph
|
492
511
|
bnode_permutations(bnodes, other.bnodes) do |bn_map|
|
493
|
-
puts "bnode permutations: #{bn_map.inspect}" if
|
512
|
+
puts "bnode permutations: #{bn_map.inspect}" if ::RdfContext::debug?
|
494
513
|
# bn_map contains 1-1 mapping of bnodes from self to other
|
495
514
|
catch :next_perm do
|
496
515
|
triples do |t, ctx|
|
@@ -500,10 +519,10 @@ module RdfContext
|
|
500
519
|
predicate = bn_map[predicate] if bn_map.has_key?(predicate)
|
501
520
|
object = bn_map[object] if bn_map.has_key?(object)
|
502
521
|
tn = Triple.new(subject, predicate, object)
|
503
|
-
puts " eql? contains '#{tn.inspect}': #{other.contains?(tn)}" if
|
522
|
+
puts " eql? contains '#{tn.inspect}': #{other.contains?(tn)}" if ::RdfContext::debug?
|
504
523
|
next if other.contains?(tn)
|
505
524
|
|
506
|
-
puts " no, next permutation" if
|
525
|
+
puts " no, next permutation" if ::RdfContext::debug?
|
507
526
|
# Not a match, try next permutation
|
508
527
|
throw :next_perm
|
509
528
|
end
|
@@ -543,7 +562,7 @@ module RdfContext
|
|
543
562
|
# Take source keys and run permutations mapping to other keys, if the permutation
|
544
563
|
# maps to the same counts for each
|
545
564
|
def bnode_permutations(bn_source, bn_other)
|
546
|
-
puts "compare #{bn_source.inspect}\n with #{bn_other.inspect}" if
|
565
|
+
puts "compare #{bn_source.inspect}\n with #{bn_other.inspect}" if ::RdfContext::debug?
|
547
566
|
|
548
567
|
source_keys = bn_source.keys
|
549
568
|
other_keys = bn_other.keys
|
@@ -556,14 +575,14 @@ module RdfContext
|
|
556
575
|
when 1
|
557
576
|
# All keys have equivalent counts, yield permutations
|
558
577
|
if source_keys.length == 1
|
559
|
-
puts "yield #{{source_keys.first => other_keys.first}.inspect}" if
|
578
|
+
puts "yield #{{source_keys.first => other_keys.first}.inspect}" if ::RdfContext::debug?
|
560
579
|
yield({source_keys.first => other_keys.first})
|
561
580
|
else
|
562
581
|
(0..(source_keys.length-1)).to_a.permute do |indicies|
|
563
|
-
puts "indicies #{indicies.inspect}" if
|
582
|
+
puts "indicies #{indicies.inspect}" if ::RdfContext::debug?
|
564
583
|
ok = other_keys.dup
|
565
584
|
map = indicies.inject({}) { |hash, i| hash[source_keys[i]] = ok.shift; hash}
|
566
|
-
puts "yield #{map.inspect}" if
|
585
|
+
puts "yield #{map.inspect}" if ::RdfContext::debug?
|
567
586
|
yield(map)
|
568
587
|
end
|
569
588
|
end
|
@@ -581,7 +600,7 @@ module RdfContext
|
|
581
600
|
bn_other_max[bn] = bn_other_min.delete(bn) if v == max
|
582
601
|
end
|
583
602
|
|
584
|
-
puts "yield permutations of multiple with max #{bn_source_max.inspect}\n and #{bn_other_max.inspect}" if
|
603
|
+
puts "yield permutations of multiple with max #{bn_source_max.inspect}\n and #{bn_other_max.inspect}" if ::RdfContext::debug?
|
585
604
|
# Yield for each permutation of max joined with permutations of min
|
586
605
|
bnode_permutations(bn_source_max, bn_other_max) do |bn_perm_max|
|
587
606
|
bnode_permutations(bn_source_min, bn_other_min) do |bn_perm_min|
|
data/lib/rdf_context/n3parser.rb
CHANGED
@@ -35,7 +35,7 @@ module RdfContext
|
|
35
35
|
@graph.allow_n3 = true
|
36
36
|
document = parser.parse(@doc)
|
37
37
|
unless document
|
38
|
-
puts parser.inspect if
|
38
|
+
puts parser.inspect if ::RdfContext::debug?
|
39
39
|
reason = parser.failure_reason
|
40
40
|
raise ParserException.new(reason)
|
41
41
|
end
|
@@ -269,7 +269,7 @@ module RdfContext
|
|
269
269
|
|
270
270
|
def process_uri(uri)
|
271
271
|
uri = uri.text_value if uri.respond_to?(:text_value)
|
272
|
-
URIRef.
|
272
|
+
URIRef.intern(uri, @uri, :normalize => false)
|
273
273
|
end
|
274
274
|
|
275
275
|
def process_properties(properties)
|
@@ -53,7 +53,7 @@ module RdfContext
|
|
53
53
|
prefix = @uri
|
54
54
|
suffix = suffix.to_s.sub(/^\#/, "") if prefix.index("#")
|
55
55
|
suffix = suffix.to_s.sub(/_$/, '')
|
56
|
-
URIRef.
|
56
|
+
URIRef.intern(prefix + suffix.to_s, :normalize => false, :namespace => self)
|
57
57
|
end
|
58
58
|
|
59
59
|
# Make sure to attach fragment
|
@@ -5,4 +5,11 @@ class Nokogiri::XML::Node
|
|
5
5
|
ns = self.namespace ? self.namespace.href : RdfContext::XML_NS.uri.to_s
|
6
6
|
RdfContext::URIRef.new(ns + self.node_name, :normalize => false)
|
7
7
|
end
|
8
|
+
def display_path
|
9
|
+
@display_path ||= case self
|
10
|
+
when Nokogiri::XML::Document then ""
|
11
|
+
when Nokogiri::XML::Element then parent ? "#{parent.display_path}/#{name}" : name
|
12
|
+
when Nokogiri::XML::Attr then "#{parent.display_path}@#{name}"
|
13
|
+
end
|
14
|
+
end
|
8
15
|
end
|
data/lib/rdf_context/parser.rb
CHANGED
@@ -3,20 +3,36 @@ require File.join(File.dirname(__FILE__), 'graph')
|
|
3
3
|
module RdfContext
|
4
4
|
# Generic RdfContext Parser class
|
5
5
|
class Parser
|
6
|
-
attr_reader :debug
|
7
|
-
|
6
|
+
attr_reader :debug
|
7
|
+
|
8
|
+
# URI of parsed document
|
9
|
+
# @return [RdfContext::URIRef]
|
10
|
+
attr_reader :uri
|
11
|
+
|
12
|
+
# Source of parsed document
|
13
|
+
# @return [Nokogiri::XML::Document, #read]
|
14
|
+
attr_accessor :doc
|
8
15
|
|
16
|
+
# Graph instance containing parsed statements
|
17
|
+
# @return [RdfContext::Graph]
|
18
|
+
attr_accessor :graph
|
19
|
+
|
20
|
+
# Graph instance containing informationa, warning and error statements
|
21
|
+
# @return [RdfContext::Graph]
|
22
|
+
attr_accessor :processor_graph
|
23
|
+
|
9
24
|
##
|
10
25
|
# Creates a new parser
|
11
26
|
#
|
12
27
|
# @option options [Graph] :graph (nil) Graph to parse into, otherwise a new RdfContext::Graph instance is created
|
13
|
-
# @option options [
|
28
|
+
# @option options [Graph] :processor_graph (nil) Graph to record information, warnings and errors.
|
14
29
|
# @option options [:rdfxml, :html, :n3] :type (nil)
|
15
30
|
# @option options [Boolean] :strict (false) Raise Error if true, continue with lax parsing, otherwise
|
16
31
|
def initialize(options = {})
|
17
32
|
# initialize the triplestore
|
18
33
|
@graph = options[:graph]
|
19
|
-
@
|
34
|
+
@processor_graph = options[:processor_graph] if options[:processor_graph]
|
35
|
+
@debug = options[:debug] # XXX deprecated
|
20
36
|
@strict = options[:strict]
|
21
37
|
@named_bnodes = {}
|
22
38
|
end
|
@@ -25,7 +41,7 @@ module RdfContext
|
|
25
41
|
#
|
26
42
|
# @param [#read, #to_s] stream the HTML+RDFa IO stream, string, Nokogiri::HTML::Document or Nokogiri::XML::Document
|
27
43
|
# @param [String] uri (nil) the URI of the document
|
28
|
-
# @option options [
|
44
|
+
# @option options [Graph] :processor_graph (nil) Graph to record information, warnings and errors.
|
29
45
|
# @option options [:rdfxml, :html, :n3] :type (nil)
|
30
46
|
# @option options [Boolean] :strict (false) Raise Error if true, continue with lax parsing, otherwise
|
31
47
|
# @return [Graph] Returns the graph containing parsed triples
|
@@ -48,7 +64,7 @@ module RdfContext
|
|
48
64
|
#
|
49
65
|
# @param [#read, #to_s] stream the HTML+RDFa IO stream, string, Nokogiri::HTML::Document or Nokogiri::XML::Document
|
50
66
|
# @param [String] uri (nil) the URI of the document
|
51
|
-
# @option options [
|
67
|
+
# @option options [Graph] :processor_graph (nil) Graph to record information, warnings and errors.
|
52
68
|
# @option options [:rdfxml, :html, :n3] :type (nil)
|
53
69
|
# @option options [Boolean] :strict (false) Raise Error if true, continue with lax parsing, otherwise
|
54
70
|
# @return [Graph] Returns the graph containing parsed triples
|
@@ -62,7 +78,8 @@ module RdfContext
|
|
62
78
|
|
63
79
|
options[:strict] ||= @strict if @strict
|
64
80
|
options[:graph] ||= @graph if @graph
|
65
|
-
options[:debug] ||= @debug if @debug
|
81
|
+
options[:debug] ||= @debug if @debug # XXX deprecated
|
82
|
+
@processor_graph = options[:processor_graph] if options[:processor_graph]
|
66
83
|
# Intuit type, if not provided
|
67
84
|
options[:type] ||= detect_format(stream, uri)
|
68
85
|
|
@@ -89,6 +106,8 @@ module RdfContext
|
|
89
106
|
|
90
107
|
# @return [Graph]
|
91
108
|
def graph; @delegate ? @delegate.graph : (@graph || Graph.new); end
|
109
|
+
# @return [Graph]
|
110
|
+
def processor_graph; @delegate ? @delegate.processor_graph : (@processor_graph || Graph.new); end
|
92
111
|
|
93
112
|
# @return [Array<String>]
|
94
113
|
def debug; @delegate ? @delegate.debug : @debug; end
|
@@ -135,9 +154,8 @@ module RdfContext
|
|
135
154
|
# Figure out the document path, if it is a Nokogiri::XML::Element or Attribute
|
136
155
|
def node_path(node)
|
137
156
|
case node
|
138
|
-
when Nokogiri::XML::
|
139
|
-
|
140
|
-
else ""
|
157
|
+
when Nokogiri::XML::Node then node.display_path
|
158
|
+
else node.to_s
|
141
159
|
end
|
142
160
|
end
|
143
161
|
|
@@ -146,10 +164,36 @@ module RdfContext
|
|
146
164
|
# @param [XML Node, any] node:: XML Node or string for showing context
|
147
165
|
# @param [String] message::
|
148
166
|
def add_debug(node, message)
|
149
|
-
|
150
|
-
@debug << "#{node_path(node)}: #{message}" if @debug.is_a?(Array)
|
167
|
+
add_processor_message(node, message, RDFA_NS.InformationalMessage)
|
151
168
|
end
|
152
169
|
|
170
|
+
def add_info(node, message, process_class = RDFA_NS.InformationalMessage)
|
171
|
+
add_processor_message(node, message, process_class)
|
172
|
+
end
|
173
|
+
|
174
|
+
def add_warning(node, message, process_class = RDFA_NS.MiscellaneousWarning)
|
175
|
+
add_processor_message(node, message, process_class)
|
176
|
+
end
|
177
|
+
|
178
|
+
def add_error(node, message, process_class = RDFA_NS.MiscellaneousError)
|
179
|
+
add_processor_message(node, message, process_class)
|
180
|
+
raise ParserException, message if @strict
|
181
|
+
end
|
182
|
+
|
183
|
+
def add_processor_message(node, message, process_class)
|
184
|
+
puts "#{node_path(node)}: #{message}" if ::RdfContext::debug?
|
185
|
+
@debug << "#{node_path(node)}: #{message}" if @debug.is_a?(Array)
|
186
|
+
if @processor_graph
|
187
|
+
@processor_sequence ||= 0
|
188
|
+
n = BNode.new
|
189
|
+
@processor_graph << Triple.new(n, RDF_TYPE, process_class)
|
190
|
+
@processor_graph << Triple.new(n, DC_NS.description, message)
|
191
|
+
@processor_graph << Triple.new(n, DC_NS.date, Literal.build_from(DateTime.now.to_date))
|
192
|
+
@processor_graph << Triple.new(n, RDFA_NS.sequence, Literal.build_from(@processor_sequence += 1))
|
193
|
+
@processor_graph << Triple.new(n, RDFA_NS.source, node_path(node))
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
153
197
|
# add a triple, object can be literal or URI or bnode
|
154
198
|
#
|
155
199
|
# If the parser is called with a block, triples are passed to the block rather
|
@@ -172,7 +216,7 @@ module RdfContext
|
|
172
216
|
triple
|
173
217
|
rescue RdfException => e
|
174
218
|
add_debug(node, "add_triple raised #{e.class}: #{e.message}")
|
175
|
-
puts e.backtrace if
|
219
|
+
puts e.backtrace if ::RdfContext::debug?
|
176
220
|
raise if @strict
|
177
221
|
end
|
178
222
|
end
|