rdf-n3 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,13 @@
1
+ === 0.2.2
2
+ * Ruby 1.9.2 compatibility
3
+ * Added script/tc to run test cases
4
+ * Fixed RDF.to_s != RDF.to_uri.to_s in writer, it worke for every other vocabulary
5
+ * Handle XMLLiteral when value is a Nokogiri node set.
6
+ * Simplify process_uri by not having a special case for ^# type URIs.
7
+ * Unescape values when creating URIs.
8
+ * URI normalization isn't required for N3, so removed.
9
+ * Added Reader#rewind and #close as stubs because document is parsed on initialize and input is closed.
10
+
1
11
  === 0.2.1
2
12
  * Compatible with RDF.rb 0.2.1
3
13
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.2.2
data/lib/rdf/n3.rb CHANGED
@@ -6,7 +6,7 @@ module RDF
6
6
  # **`RDF::N3`** is an Notation-3 plugin for RDF.rb.
7
7
  #
8
8
  # @example Requiring the `RDF::N3` module
9
- # require 'rdf/rdfxml'
9
+ # require 'rdf/n3'
10
10
  #
11
11
  # @example Parsing RDF statements from an N3 file
12
12
  # RDF::N3::Reader.open("etc/foaf.n3") do |reader|
@@ -20,8 +20,7 @@ module RDF; class Literal
20
20
  ##
21
21
  # @param [Object] value
22
22
  # @option options [String] :lexical (nil)
23
- # @option options [Hash] :namespaces (nil)
24
- # @option options [Hash] :namespaces ({})
23
+ # @option options [Hash] :namespaces ({}) Use :__default__ or "" to declare default namespace
25
24
  # @option options [Symbol] :language (nil)
26
25
  # @option options [Symbol] :library (:nokogiri, :libxml, or :rexml)
27
26
  def initialize(value, options = {})
@@ -69,7 +68,8 @@ module RDF; class Literal
69
68
  def parse_value(value, options)
70
69
  ns_hash = {}
71
70
  options[:namespaces].each_pair do |prefix, uri|
72
- attr = prefix.to_s.empty? ? "xmlns" : "xmlns:#{prefix}"
71
+ prefix = prefix == :__default__ ? "" : prefix.to_s
72
+ attr = prefix.empty? ? "xmlns" : "xmlns:#{prefix}"
73
73
  ns_hash[attr] = uri.to_s
74
74
  end
75
75
  ns_strs = []
@@ -94,10 +94,18 @@ module RDF; class Literal
94
94
 
95
95
  # Nokogiri implementations
96
96
  if defined?(::Nokogiri)
97
+ # A somewhat half-hearted attempt at C14N.
98
+ # Main problem is that it promotes all namespaces to top element, instead of demoting them
99
+ # to the required element, and does not properly order either namespaces or attributes.
100
+ #
101
+ # An open-issue in Nokogiri is to add support for C14N from the underlying libxml2 libraries.
97
102
  def parse_value_nokogiri(value, ns_strs, language)
98
- return value if value.is_a?(Nokogiri::XML::NodeSet)
99
- # Add inherited namespaces to created root element so that they're inherited to sub-elements
100
- elements = Nokogiri::XML::Document.parse("<foo #{ns_strs.join(" ")}>#{value.to_s}</foo>").root.children
103
+ elements = if value.is_a?(Nokogiri::XML::NodeSet)
104
+ value
105
+ else
106
+ # Add inherited namespaces to created root element so that they're inherited to sub-elements
107
+ Nokogiri::XML::Document.parse("<foo #{ns_strs.join(" ")}>#{value.to_s}</foo>").root.children
108
+ end
101
109
 
102
110
  elements.map do |c|
103
111
  if c.is_a?(Nokogiri::XML::Element)
@@ -110,9 +118,9 @@ module RDF; class Literal
110
118
  c[prefix] = ns.href.to_s unless c.namespaces[prefix]
111
119
  end
112
120
 
113
- # Add lanuage
121
+ # Add language
114
122
  if language && c["lang"].to_s.empty?
115
- c["xml:lang"] = language
123
+ c["xml:lang"] = language.to_s
116
124
  end
117
125
  end
118
126
  c
@@ -125,6 +133,7 @@ module RDF; class Literal
125
133
  end # Nokogiri
126
134
 
127
135
  if defined?(::LibXML)
136
+ # This should use Document#canonicalize if as and when it is available in libxml-ruby
128
137
  def parse_value_libxml(value, ns_strs, language)
129
138
  # Fixme
130
139
  end
@@ -135,6 +144,8 @@ module RDF; class Literal
135
144
  end # LibXML
136
145
 
137
146
  # REXML
147
+ # This could make use of the XMLCanonicalizer gem (http://rubygems.org/gems/XMLCanonicalizer)
148
+ # But, it hasn't been touched since 2007 and relies on log4r.
138
149
  def parse_value_rexml(value, ns_strs, language)
139
150
  # Fixme
140
151
  end
@@ -21,7 +21,7 @@ module RDF
21
21
  raise "Vocab #{vocab.inspect} is not a Vocabulary!" if vocab.is_a?(Array)
22
22
  vocab_name = vocab.__name__.to_s.split('::').last.downcase
23
23
  local_name = to_s[vocab.to_uri.to_s.size..-1]
24
- vocab_name && local_name && [vocab_name.to_sym, local_name.to_sym]
24
+ vocab_name && local_name && [vocab_name.to_sym, local_name.empty? ? nil : local_name.to_sym]
25
25
  end
26
26
  end
27
27
  #end
@@ -8,7 +8,7 @@ module RDF
8
8
 
9
9
  #puts "seq; #{rdf_type} #{rdf_type - [RDF.Seq, RDF.Bag, RDF.Alt]}"
10
10
  if !(rdf_type - [RDF.Seq, RDF.Bag, RDF.Alt]).empty?
11
- props.keys.select {|k| k.match(/#{RDF.to_s}_(\d)$/)}.
11
+ props.keys.select {|k| k.match(/#{RDF._}(\d)$/)}.
12
12
  sort_by {|i| i.sub(RDF._.to_s, "").to_i}.
13
13
  map {|key| props[key]}.
14
14
  flatten
@@ -31,4 +31,4 @@ module RDF
31
31
  end
32
32
  end
33
33
  end
34
- end
34
+ end
@@ -15,5 +15,15 @@ module RDF
15
15
  end
16
16
  self.class.new(result)
17
17
  end
18
+
19
+ # From http://www.w3.org/TR/2004/REC-rdf-concepts-20040210/#section-Graph-URIref
20
+ #
21
+ # A URI Reference within an RDF graph is a Unicode string that:
22
+ # * does not contain any control characters ( #x00 - #x1F, #x7F-#x9F)
23
+ # * and would produce a valid URI character sequence (per RFC2396 [URI], sections 2.1) representing an absolute URI with optional fragment identifier when subjected to the encoding described below.
24
+ #
25
+ # The encoding consists of:
26
+ # 1. encoding the Unicode string as UTF-8 [RFC-2279], giving a sequence of octet values.
27
+ # 2. %-escaping octets that do not correspond to permitted US-ASCII characters.
18
28
  end
19
29
  end
data/lib/rdf/n3/reader.rb CHANGED
@@ -41,7 +41,7 @@ module RDF::N3
41
41
  @debug = options[:debug]
42
42
  @strict = options[:strict]
43
43
  @uri_mappings = {}
44
- @uri = uri(options[:base_uri], nil, true)
44
+ @uri = uri(options[:base_uri], nil, false)
45
45
 
46
46
  @doc = input.respond_to?(:read) ? (input.rewind; input.read) : input
47
47
  @default_ns = uri("#{options[:base_uri]}#", nil, false) if @uri
@@ -51,6 +51,12 @@ module RDF::N3
51
51
  end
52
52
  end
53
53
 
54
+ # No need to rewind, as parsing is done in initialize
55
+ def rewind; end
56
+
57
+ # Document closed when read in initialize
58
+ def close; end
59
+
54
60
  ##
55
61
  # Iterates the given block for each RDF statement in the input.
56
62
  #
@@ -120,8 +126,6 @@ module RDF::N3
120
126
  uri = uri.to_s
121
127
  if uri == "#"
122
128
  uri = @default_ns
123
- elsif !uri.match(/[\/\#]$/)
124
- uri += "#"
125
129
  end
126
130
  add_debug("namesspace", "'#{prefix}' <#{uri}>")
127
131
  @uri_mappings[prefix] = RDF::URI.intern(uri)
@@ -157,16 +161,23 @@ module RDF::N3
157
161
  if s.respond_to?(:nprefix)
158
162
  add_debug(*s.info("process_statements(namespace)"))
159
163
  keyword_check("prefix") if s.text_value.index("prefix") == 0
160
- uri = process_uri(s.explicituri.uri, false)
164
+ uri = process_uri(s.explicituri.uri)
161
165
  namespace(uri, s.nprefix.text_value)
162
166
  elsif s.respond_to?(:base)
163
167
  add_debug(*s.info("process_statements(base)"))
164
168
  keyword_check("base") if s.text_value.index("base") == 0
165
169
  # Base, set or update document URI
166
170
  uri = s.explicituri.uri.text_value
167
- @default_ns = process_uri(uri, false) # Don't normalize
168
- add_debug("@default_ns", "#{@default_ns.inspect}")
169
171
  @uri = process_uri(uri)
172
+
173
+ # The empty prefix "" is by default , bound to "#" -- the local namespace of the file.
174
+ # The parser behaves as though there were a
175
+ # @prefix : <#>.
176
+ # just before the file.
177
+ # This means that <#foo> can be written :foo and using @keywords one can reduce that to foo.
178
+
179
+ @default_ns = uri.match(/[\/\#]$/) ? @uri : process_uri("#{uri}#")
180
+ add_debug("@default_ns", "#{@default_ns.inspect}")
170
181
  add_debug("@base", "#{@uri}")
171
182
  @uri
172
183
  elsif s.respond_to?(:keywords)
@@ -276,7 +287,7 @@ module RDF::N3
276
287
  if @keywords && !@keywords.include?(barename)
277
288
  build_uri(barename)
278
289
  else
279
- RDF::Literal.new(barename.delete("@"), :datatype => RDF::XSD.boolean)
290
+ RDF::Literal.new(barename.delete("@"), :datatype => RDF::XSD.boolean, :validate => @strict, :canonicalize => true)
280
291
  end
281
292
  elsif expression.respond_to?(:barename)
282
293
  add_debug(*expression.info("process_expression(barename)"))
@@ -341,14 +352,9 @@ module RDF::N3
341
352
  end
342
353
  end
343
354
 
344
- def process_uri(uri, normalize = true)
355
+ def process_uri(uri)
345
356
  uri = uri.text_value if uri.respond_to?(:text_value)
346
- if uri.match(/^\#/)
347
- uri(@uri, RDF::NTriples::Writer.escape(uri), false) # This is probably bogus, but allows tests to pass
348
- else
349
- uri = RDF::NTriples::Writer.escape(uri) unless normalize # Addressable does it's own escaping when normalizing
350
- uri(@uri, uri, normalize)
351
- end
357
+ uri(@uri, RDF::NTriples.unescape(uri))
352
358
  end
353
359
 
354
360
  def process_properties(properties)
@@ -392,15 +398,13 @@ module RDF::N3
392
398
 
393
399
  # Evaluate text_value to remove redundant escapes
394
400
  #puts string.elements[1].text_value.dump
395
- lit = RDF::Literal.new(RDF::NTriples::Reader.unescape(string.elements[1].text_value), :language => language, :datatype => encoding)
396
- raise RDF::ReaderError, %(Typed literal has an invalid lexical value: #{encoding.to_s} "#{lit.value}") if @strict && !lit.valid?
397
- lit
401
+ RDF::Literal.new(RDF::NTriples.unescape(string.elements[1].text_value), :language => language, :validate => @strict, :datatype => encoding, :canonicalize => true)
398
402
  end
399
403
 
400
404
  def process_numeric_literal(object)
401
405
  add_debug(*object.info("process_numeric_literal"))
402
406
 
403
- RDF::Literal.new(RDF::NTriples::Reader.unescape(object.text_value), :datatype => RDF::XSD[object.numericliteral])
407
+ RDF::Literal.new(RDF::NTriples.unescape(object.text_value), :datatype => RDF::XSD[object.numericliteral], :validate => @strict, :canonicalize => true)
404
408
  end
405
409
 
406
410
  def build_uri(expression)
@@ -408,7 +412,7 @@ module RDF::N3
408
412
  localname = expression.localname.text_value if expression.respond_to?(:localname)
409
413
  localname ||= (expression.respond_to?(:text_value) ? expression.text_value : expression).to_s.sub(/^:/, "")
410
414
  localname = nil if localname.empty? # In N3/Turtle "_:" is not named
411
- escaped_localname = RDF::NTriples::Writer.escape(localname.to_s)
415
+ escaped_localname = RDF::NTriples.escape(localname.to_s)
412
416
 
413
417
  if expression.respond_to?(:info)
414
418
  add_debug(*expression.info("build_uri(#{prefix.inspect}, #{localname.inspect})"))
@@ -418,7 +422,7 @@ module RDF::N3
418
422
 
419
423
  uri = if @uri_mappings[prefix]
420
424
  add_debug(*expression.info("build_uri: (ns): #{@uri_mappings[prefix]}, #{escaped_localname}")) if expression.respond_to?(:info)
421
- ns(prefix, RDF::NTriples::Writer.escape(localname.to_s))
425
+ ns(prefix, RDF::NTriples.escape(localname.to_s))
422
426
  elsif prefix == '_'
423
427
  add_debug(*expression.info("build_uri: (bnode)")) if expression.respond_to?(:info)
424
428
  bnode(localname)
@@ -446,22 +450,17 @@ module RDF::N3
446
450
  end
447
451
  end
448
452
 
449
- # Create normalized or unnormalized URIs
450
- def uri(value, append, normalize = true)
451
- value = value.to_s.sub(/\#$/, "") if normalize
452
- value = case value
453
- when Addressable::URI then value
454
- else Addressable::URI.parse(value.to_s)
455
- end
456
-
453
+ # Create URIs
454
+ def uri(value, append, normalize = false)
455
+ value = RDF::URI.intern(value)
457
456
  value = value.join(append) if append
458
- value.normalize! if normalize
459
- RDF::URI.intern(value)
457
+ value
460
458
  end
461
459
 
462
460
  def ns(prefix, suffix)
463
461
  prefix = prefix.nil? ? @default_ns.to_s : @uri_mappings[prefix].to_s
464
462
  suffix = suffix.to_s.sub(/^\#/, "") if prefix.index("#")
463
+ add_debug("ns", "prefix: '#{prefix}', suffix: '#{suffix}'")
465
464
  RDF::URI.intern(prefix + suffix)
466
465
  end
467
466
  end
@@ -1,7 +1,7 @@
1
1
  module RDF::N3::VERSION
2
2
  MAJOR = 0
3
3
  MINOR = 2
4
- TINY = 1
4
+ TINY = 2
5
5
  EXTRA = nil
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
data/lib/rdf/n3/writer.rb CHANGED
@@ -379,8 +379,9 @@ module RDF::N3
379
379
 
380
380
  def add_namespace(prefix, ns)
381
381
  return if @namespaces.has_key?(prefix.to_s)
382
- add_debug "add_namespace: '#{prefix}', <#{ns}>"
383
- @namespaces[prefix.to_s] = ns.to_s
382
+ uri = (ns.respond_to?(:to_uri) ? ns.to_uri : ns).to_s
383
+ add_debug "add_namespace: '#{prefix}', <#{uri}>"
384
+ @namespaces[prefix.to_s] = uri
384
385
  end
385
386
 
386
387
  def reset
@@ -428,6 +429,7 @@ module RDF::N3
428
429
  #
429
430
  # @param [String] message::
430
431
  def add_debug(message)
432
+ STDERR.puts message if $DEBUG
431
433
  @debug << message if @debug.is_a?(Array)
432
434
  end
433
435
 
data/rdf-n3.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rdf-n3}
8
- s.version = "0.2.1"
8
+ s.version = "0.2.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Gregg Kellogg"]
12
- s.date = %q{2010-06-28}
12
+ s.date = %q{2010-08-11}
13
13
  s.description = %q{ RDF::N3 is an Notation-3 (n3-rdf) parser for Ruby using the RDF.rb library suite.
14
14
  }
15
15
  s.email = %q{gregg@kellogg-assoc.com}
@@ -44,6 +44,7 @@ Gem::Specification.new do |s|
44
44
  "rdf-n3.gemspec",
45
45
  "script/console",
46
46
  "script/parse",
47
+ "script/tc",
47
48
  "spec/cwm_spec.rb",
48
49
  "spec/format_spec.rb",
49
50
  "spec/literal_spec.rb",
@@ -608,7 +609,7 @@ Gem::Specification.new do |s|
608
609
  s.homepage = %q{http://github.com/gkellogg/rdf-rdfa}
609
610
  s.rdoc_options = ["--charset=UTF-8"]
610
611
  s.require_paths = ["lib"]
611
- s.rubygems_version = %q{1.3.6}
612
+ s.rubygems_version = %q{1.3.7}
612
613
  s.summary = %q{Notation-3 (n3-rdf) and Turtle reader/writer for RDF.rb.}
613
614
  s.test_files = [
614
615
  "spec/cwm_spec.rb",
@@ -627,7 +628,7 @@ Gem::Specification.new do |s|
627
628
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
628
629
  s.specification_version = 3
629
630
 
630
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
631
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
631
632
  s.add_runtime_dependency(%q<rdf>, [">= 0.2.1"])
632
633
  s.add_runtime_dependency(%q<treetop>, [">= 1.4.0"])
633
634
  s.add_development_dependency(%q<rspec>, [">= 0"])
data/script/console CHANGED
@@ -3,6 +3,8 @@
3
3
  irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
4
 
5
5
  libs = " -r irb/completion"
6
- libs << " -r #{File.dirname(__FILE__) + '/../lib/rdf/n3.rb'}"
6
+ RDF = File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "rdf", "lib"))
7
+ libs << " -I #{RDF}" if File.directory?(RDF)
8
+ libs << " -r #{File.join(File.expand_path(File.dirname(__FILE__)), "..", "lib", "rdf", "n3.rb")}"
7
9
  puts "Loading rdf-n3 gem"
8
10
  exec "#{irb} #{libs} --simple-prompt"
data/script/parse CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby -s
2
2
  require 'rubygems'
3
- $:.unshift(File.join(File.dirname(__FILE__), "..", 'lib'))
3
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "..", 'lib')))
4
4
  require 'rdf/n3'
5
5
  require 'getoptlong'
6
6
 
data/script/tc ADDED
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env ruby -s
2
+ require 'rubygems'
3
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "..", 'lib')))
4
+ require 'rdf/n3'
5
+ require 'spec/rdf_helper'
6
+ require 'getoptlong'
7
+
8
+ def run_tc(tc)
9
+ puts "run #{tc.name}"
10
+ puts RDF::Writer.for($format.to_sym).buffer { |writer|
11
+ RDF::N3::Reader.new(tc.input, :base_uri => tc.about, :strict => $strict).each do |statement|
12
+ writer << statement
13
+ end
14
+ }
15
+ end
16
+
17
+ $verbose = false
18
+ $format = :ntriples
19
+ $strict = false
20
+ suite = "turtle"
21
+ opts = GetoptLong.new(
22
+ ["--debug", GetoptLong::NO_ARGUMENT],
23
+ ["--verbose", GetoptLong::NO_ARGUMENT],
24
+ ["--quiet", GetoptLong::NO_ARGUMENT],
25
+ ["--suite", GetoptLong::OPTIONAL_ARGUMENT],
26
+ ["--strict", GetoptLong::NO_ARGUMENT],
27
+ ["--format", GetoptLong::REQUIRED_ARGUMENT]
28
+ )
29
+ opts.each do |opt, arg|
30
+ case opt
31
+ when '--verbose' then $verbose = true
32
+ when '--quiet' then $quiet = true
33
+ when '--debug' then $DEBUG = true
34
+ when '--format' then $format = arg
35
+ when '--suite' then suite = arg
36
+ when '--strict' then $strict = true
37
+ end
38
+ end
39
+
40
+ # Test URI and directory for different suites
41
+ TEST_PARAMS = {
42
+ "rdfxml" => [RDFCORE_TEST, RDFCORE_DIR],
43
+ "cwm" => [CWM_TEST, SWAP_DIR],
44
+ "swap" => [SWAP_TEST, SWAP_DIR],
45
+ "turtle" => [TURTLE_TEST, TURTLE_DIR],
46
+ "turtlebad" => [TURTLE_BAD_TEST, TURTLE_DIR],
47
+ }
48
+ test_cases = RdfHelper::TestCase.test_cases(*TEST_PARAMS[suite])
49
+
50
+ test_cases = test_cases.detect do |tc|
51
+ next unless ARGV.empty? || ARGV.any? {|n| tc.name.match(/#{n}/)}
52
+ run_tc(tc)
53
+ end
data/spec/cwm_spec.rb CHANGED
@@ -1,3 +1,4 @@
1
+ $:.unshift "."
1
2
  require File.join(File.dirname(__FILE__), 'spec_helper')
2
3
  require 'rdf/rdfxml'
3
4
 
data/spec/format_spec.rb CHANGED
@@ -1,3 +1,4 @@
1
+ $:.unshift "."
1
2
  require File.join(File.dirname(__FILE__), 'spec_helper')
2
3
 
3
4
  describe RDF::N3::Format do
data/spec/literal_spec.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # coding: utf-8
2
+ $:.unshift "."
2
3
  require File.join(File.dirname(__FILE__), 'spec_helper')
3
4
  require 'nokogiri'
4
5
 
@@ -22,26 +23,64 @@ describe RDF::Literal do
22
23
  describe "with a namespace" do
23
24
  subject {
24
25
  @new.call("foo <dc:sup>bar</dc:sup> baz!", :datatype => RDF.XMLLiteral,
25
- :namespaces => {"dc" => RDF::DC.to_s})
26
+ :namespaces => {:dc => RDF::DC.to_s})
26
27
  }
27
28
 
28
29
  it "should add namespaces" do subject.to_s.should == "foo <dc:sup xmlns:dc=\"http://purl.org/dc/terms/\">bar</dc:sup> baz!" end
29
30
 
31
+ describe "as string prefix" do
32
+ subject {
33
+ @new.call("foo <dc:sup>bar</dc:sup> baz!", :datatype => RDF.XMLLiteral,
34
+ :namespaces => {"dc" => RDF::DC.to_s})
35
+ }
36
+
37
+ it "should add namespaces" do subject.to_s.should == "foo <dc:sup xmlns:dc=\"http://purl.org/dc/terms/\">bar</dc:sup> baz!" end
38
+ end
39
+
30
40
  describe "and language" do
31
41
  subject {
32
42
  @new.call("foo <dc:sup>bar</dc:sup> baz!", :datatype => RDF.XMLLiteral,
33
- :namespaces => {"dc" => RDF::DC.to_s},
43
+ :namespaces => {:dc => RDF::DC.to_s},
34
44
  :language => :fr)
35
45
  }
36
46
 
37
47
  it "should add namespaces and language" do subject.to_s.should == "foo <dc:sup xmlns:dc=\"http://purl.org/dc/terms/\" xml:lang=\"fr\">bar</dc:sup> baz!" end
38
48
  end
39
49
 
50
+ describe "and node set" do
51
+ subject {
52
+ root = Nokogiri::XML.parse(%(<?xml version="1.0" encoding="UTF-8"?>
53
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
54
+ <html xmlns="http://www.w3.org/1999/xhtml"
55
+ xmlns:dc="http://purl.org/dc/terms/"
56
+ xmlns:ex="http://example.org/rdf/"
57
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
58
+ xmlns:svg="http://www.w3.org/2000/svg">
59
+ <head profile="http://www.w3.org/1999/xhtml/vocab http://www.w3.org/2005/10/profile">
60
+ <title>Test 0100</title>
61
+ </head>
62
+ <body>
63
+ <div about="http://www.example.org">
64
+ <h2 property="ex:example" datatype="rdf:XMLLiteral"><svg:svg/></h2>
65
+ </div>
66
+ </body>
67
+ </html>
68
+ ), nil, nil, Nokogiri::XML::ParseOptions::DEFAULT_XML).root
69
+ content = root.css("h2").children
70
+ @new.call(content, :datatype => RDF.XMLLiteral,
71
+ :namespaces => {
72
+ :svg => "http://www.w3.org/2000/svg",
73
+ :dc => "http://purl.org/dc/terms/",
74
+ })
75
+ }
76
+ it "should add namespace" do subject.to_s.should == "<svg:svg xmlns:svg=\"http://www.w3.org/2000/svg\"></svg:svg>" end
77
+ end
78
+
40
79
  describe "and language with an existing language embedded" do
41
80
  subject {
42
81
  @new.call("foo <dc:sup>bar</dc:sup><dc:sub xml:lang=\"en\">baz</dc:sub>",
43
82
  :datatype => RDF.XMLLiteral,
44
- :namespaces => {"dc" => RDF::DC.to_s},
83
+ :namespaces => {:dc => RDF::DC.to_s},
45
84
  :language => :fr)
46
85
  }
47
86
 
@@ -50,6 +89,15 @@ describe RDF::Literal do
50
89
  end
51
90
 
52
91
  describe "with a default namespace" do
92
+ subject {
93
+ @new.call("foo <sup>bar</sup> baz!", :datatype => RDF.XMLLiteral,
94
+ :namespaces => {:__default__ => RDF::DC.to_s})
95
+ }
96
+
97
+ it "should add namespace" do subject.to_s.should == "foo <sup xmlns=\"http://purl.org/dc/terms/\">bar</sup> baz!" end
98
+ end
99
+
100
+ describe "with a default namespace (as empty string)" do
53
101
  subject {
54
102
  @new.call("foo <sup>bar</sup> baz!", :datatype => RDF.XMLLiteral,
55
103
  :namespaces => {"" => RDF::DC.to_s})
@@ -57,5 +105,141 @@ describe RDF::Literal do
57
105
 
58
106
  it "should add namespace" do subject.to_s.should == "foo <sup xmlns=\"http://purl.org/dc/terms/\">bar</sup> baz!" end
59
107
  end
108
+
109
+ context "rdfcore tests" do
110
+ context "rdfms-xml-literal-namespaces" do
111
+ it "should reproduce test001" do
112
+ l = @new.call("
113
+ <html:h1>
114
+ <b>John</b>
115
+ </html:h1>
116
+ ",
117
+ :datatype => RDF.XMLLiteral,
118
+ :namespaces => {
119
+ "" => "http://www.w3.org/1999/xhtml",
120
+ "rdf" => "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
121
+ "html" => "http://NoHTML.example.org",
122
+ "my" => "http://my.example.org/",
123
+ })
124
+
125
+ pending do
126
+ l.to_s.should == "\n <html:h1 xmlns:html=\"http://NoHTML.example.org\">\n <b xmlns=\"http://www.w3.org/1999/xhtml\">John</b>\n </html:h1>\n "
127
+ end
128
+ end
129
+
130
+ it "should reproduce test002" do
131
+ l = @new.call("
132
+ Ramifications of
133
+ <apply>
134
+ <power/>
135
+ <apply>
136
+ <plus/>
137
+ <ci>a</ci>
138
+ <ci>b</ci>
139
+ </apply>
140
+ <cn>2</cn>
141
+ </apply>
142
+ to World Peace
143
+ ",
144
+ :datatype => RDF.XMLLiteral,
145
+ :namespaces => {
146
+ "" => "http://www.w3.org/TR/REC-mathml",
147
+ })
148
+
149
+ l.to_s.should == "\n Ramifications of\n <apply xmlns=\"http://www.w3.org/TR/REC-mathml\">\n <power></power>\n <apply>\n\t<plus></plus>\n\t<ci>a</ci>\n\t<ci>b</ci>\n </apply>\n <cn>2</cn>\n </apply>\n to World Peace\n "
150
+ end
151
+ end
152
+
153
+ context "rdfms-xmllang" do
154
+ it "should reproduce test001" do
155
+ l = @new.call("chat", :datatype => RDF.XMLLiteral, :language => nil)
156
+
157
+ l.to_s.should == "chat"
158
+ end
159
+ it "should reproduce test002" do
160
+ l = @new.call("chat", :datatype => RDF.XMLLiteral, :language => :fr)
161
+
162
+ l.to_s.should == "chat"
163
+ end
164
+ end
165
+
166
+ context "xml-canon" do
167
+ it "should reproduce test001" do
168
+ l = @new.call("<br />", :datatype => RDF.XMLLiteral)
169
+
170
+ l.to_s.should == "<br></br>"
171
+ end
172
+ end
173
+ end
174
+
175
+ context "rdfa tests" do
176
+ it "should reproduce test 0011: XMLLiteral" do
177
+ l = @new.call("E = mc<sup>2</sup>: The Most Urgent Problem of Our Time",
178
+ :datatype => RDF.XMLLiteral,
179
+ :namespaces => {"" => "http://www.w3.org/1999/xhtml"})
180
+
181
+ l.to_s.should == "E = mc<sup xmlns=\"http://www.w3.org/1999/xhtml\">2</sup>: The Most Urgent Problem of Our Time"
182
+ end
183
+
184
+ it "should reproduce test 0092: Tests XMLLiteral content with explicit @datatype" do
185
+ l = @new.call(%(E = mc<sup>2</sup>: The Most Urgent Problem of Our Time<),
186
+ :datatype => RDF.XMLLiteral,
187
+ :namespaces => {"" => "http://www.w3.org/1999/xhtml"})
188
+
189
+ l.to_s.should == "E = mc<sup xmlns=\"http://www.w3.org/1999/xhtml\">2</sup>: The Most Urgent Problem of Our Time"
190
+ end
191
+
192
+ it "should reproduce test 0100: XMLLiteral with explicit namespace" do
193
+ l = @new.call(%(Some text here in <strong>bold</strong> and an svg rectangle: <svg:svg><svg:rect svg:width="200" svg:height="100"/></svg:svg>),
194
+ :datatype => RDF.XMLLiteral,
195
+ :namespaces => {
196
+ "" => "http://www.w3.org/1999/xhtml",
197
+ "svg" => "http://www.w3.org/2000/svg",
198
+ })
199
+
200
+ pending do
201
+ l.to_s.should == "Some text here in <strong xmlns=\"http://www.w3.org/1999/xhtml\">bold</strong> and an svg rectangle: <svg:svg xmlns:svg=\"http://www.w3.org/2000/svg\"><svg:rect svg:height=\"100\" svg:width=\"200\"></svg:rect></svg:svg>"
202
+ end
203
+ end
204
+
205
+ it "should reproduce 0101: XMLLiteral with explicit namespace and xml:lang" do
206
+ l = @new.call(%(Du texte ici en <strong>gras</strong> et un rectangle en svg: <svg:svg><svg:rect svg:width="200" svg:height="100"/></svg:svg>),
207
+ :datatype => RDF.XMLLiteral, :language => :fr,
208
+ :namespaces => {
209
+ "" => "http://www.w3.org/1999/xhtml",
210
+ "svg" => "http://www.w3.org/2000/svg",
211
+ })
212
+
213
+ pending do
214
+ l.to_s.should == "Du texte ici en <strong xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"fr\">gras</strong> et un rectangle en svg: <svg:svg xmlns:svg=\"http://www.w3.org/2000/svg\" xml:lang=\"fr\"><svg:rect svg:height=\"100\" svg:width=\"200\"></svg:rect></svg:svg>"
215
+ end
216
+ end
217
+
218
+ it "should reproduce test 0102: XMLLiteral with explicit namespace and xml:lang; not overwriting existing langs" do
219
+ l = @new.call(%(Du texte ici en <strong>gras</strong> et un rectangle en svg: <svg:svg xml:lang="hu"><svg:rect svg:width="200" svg:height="100"/></svg:svg>),
220
+ :datatype => RDF.XMLLiteral, :language => :fr,
221
+ :namespaces => {
222
+ "" => "http://www.w3.org/1999/xhtml",
223
+ "svg" => "http://www.w3.org/2000/svg",
224
+ })
225
+
226
+ pending do
227
+ l.to_s.should == "Du texte ici en <strong xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"fr\">gras</strong> et un rectangle en svg: <svg:svg xmlns:svg=\"http://www.w3.org/2000/svg\" xml:lang=\"hu\"><svg:rect svg:height=\"100\" svg:width=\"200\"></svg:rect></svg:svg>"
228
+ end
229
+ end
230
+
231
+ it "should reproduce test 0103: XMLLiteral with explicit namespace; not overwriting local namespaces" do
232
+ l = @new.call(%(Some text here in <strong>bold</strong> and an svg rectangle: <svg xmlns="http://www.w3.org/2000/svg"><rect width="200" height="100"/></svg>),
233
+ :datatype => RDF.XMLLiteral,
234
+ :namespaces => {
235
+ "" => "http://www.w3.org/1999/xhtml",
236
+ "svg" => "http://www.w3.org/2000/svg",
237
+ })
238
+
239
+ pending do
240
+ l.to_s.should == "Some text here in <strong xmlns=\"http://www.w3.org/1999/xhtml\">bold</strong> and an svg rectangle: <svg xmlns=\"http://www.w3.org/2000/svg\"><rect height=\"100\" width=\"200\"></rect></svg>"
241
+ end
242
+ end
243
+ end
60
244
  end if defined?(::Nokogiri)
61
245
  end