rdf-n3 0.0.3 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +3 -0
- data/Rakefile +3 -3
- data/VERSION +1 -1
- data/lib/rdf/n3/patches/literal_normalization.rb +126 -99
- data/lib/rdf/n3/reader.rb +10 -9
- data/lib/rdf/n3/version.rb +2 -2
- data/lib/rdf/n3/writer.rb +1 -1
- data/lib/rdf/n3.rb +0 -2
- data/rdf-n3.gemspec +13 -17
- data/spec/literal_spec.rb +22 -343
- data/spec/n3reader_spec.rb +19 -19
- data/spec/spec_helper.rb +1 -0
- metadata +12 -33
- data/lib/rdf/n3/patches/literal_hacks.rb +0 -23
- data/lib/rdf/n3/patches/rdf_escape.rb +0 -131
- data/spec/turtle_serializer_spec.rb +0 -226
data/History.txt
CHANGED
data/Rakefile
CHANGED
@@ -13,11 +13,11 @@ begin
|
|
13
13
|
gemspec.email = "gregg@kellogg-assoc.com"
|
14
14
|
gemspec.homepage = "http://github.com/gkellogg/rdf-rdfa"
|
15
15
|
gemspec.authors = ["Gregg Kellogg"]
|
16
|
-
gemspec.add_dependency('rdf', '>= 0.2.
|
16
|
+
gemspec.add_dependency('rdf', '>= 0.2.1')
|
17
17
|
gemspec.add_dependency('treetop', '>= 1.4.0')
|
18
18
|
gemspec.add_development_dependency('rspec')
|
19
|
-
gemspec.add_development_dependency('rdf-spec')
|
20
|
-
gemspec.add_development_dependency('rdf-rdfxml', '>= 0.2.
|
19
|
+
gemspec.add_development_dependency('rdf-spec', '>= 0.2.1')
|
20
|
+
gemspec.add_development_dependency('rdf-rdfxml', '>= 0.2.1')
|
21
21
|
gemspec.add_development_dependency('rdf-isomorphic')
|
22
22
|
gemspec.add_development_dependency('yard')
|
23
23
|
gemspec.extra_rdoc_files = %w(README.rdoc History.txt AUTHORS)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.1
|
@@ -1,120 +1,147 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
# Use Nokogiri or LibXML when available, and REXML otherwise:
|
2
|
+
begin
|
3
|
+
require 'nokogiri'
|
4
|
+
rescue LoadError => e
|
5
|
+
begin
|
6
|
+
require 'libxml'
|
7
|
+
rescue LoadError => e
|
8
|
+
:rexml
|
9
|
+
end
|
10
|
+
end
|
4
11
|
|
5
|
-
module RDF
|
6
|
-
|
12
|
+
module RDF; class Literal
|
13
|
+
##
|
14
|
+
# An XML literal.
|
15
|
+
#
|
16
|
+
# @see http://www.w3.org/TR/rdf-concepts/#section-XMLLiteral
|
17
|
+
# @see http://www.w3.org/TR/rdfa-core/#s_xml_literals
|
18
|
+
# @since 0.2.1
|
19
|
+
class XML < Literal
|
7
20
|
##
|
8
|
-
#
|
9
|
-
# @
|
21
|
+
# @param [Object] value
|
22
|
+
# @option options [String] :lexical (nil)
|
23
|
+
# @option options [Hash] :namespaces (nil)
|
24
|
+
# @option options [Hash] :namespaces ({})
|
10
25
|
# @option options [Symbol] :language (nil)
|
11
|
-
# @option options [
|
12
|
-
|
13
|
-
|
14
|
-
initialize_without_normalization(value, options)
|
15
|
-
normalize(options)
|
16
|
-
end
|
17
|
-
|
18
|
-
alias_method :initialize_without_normalization, :initialize
|
19
|
-
alias_method :initialize, :initialize_with_normalization
|
26
|
+
# @option options [Symbol] :library (:nokogiri, :libxml, or :rexml)
|
27
|
+
def initialize(value, options = {})
|
28
|
+
options[:namespaces] ||= {}
|
20
29
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
30
|
+
@library = case options[:library]
|
31
|
+
when nil
|
32
|
+
case
|
33
|
+
when defined?(::Nokogiri) then :nokogiri
|
34
|
+
when defined?(::LibXML) then :libxml
|
35
|
+
else :rexml
|
36
|
+
end
|
37
|
+
when :nokogiri, :libxml, :rexml
|
38
|
+
options[:library]
|
39
|
+
else
|
40
|
+
raise ArgumentError.new("expected :rexml, :libxml or :nokogiri, but got #{options[:library].inspect}")
|
28
41
|
end
|
42
|
+
|
43
|
+
@datatype = options[:datatype] || DATATYPE
|
44
|
+
@string = options[:lexical] if options.has_key?(:lexical)
|
45
|
+
@object = parse_value(value, options)
|
46
|
+
@string = serialize_nodeset(@object)
|
29
47
|
end
|
30
48
|
|
31
|
-
|
32
|
-
|
33
|
-
# Normalize literal value
|
49
|
+
##
|
50
|
+
# Converts the literal into its canonical lexical representation.
|
34
51
|
#
|
35
|
-
#
|
36
|
-
|
37
|
-
|
52
|
+
# @return [Literal]
|
53
|
+
# @see http://www.w3.org/TR/xml-exc-c14n/
|
54
|
+
def canonicalize
|
55
|
+
# This is the opportunity to use exclusive canonicalization library
|
56
|
+
self
|
57
|
+
end
|
38
58
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
when XSD.dateTime then @value.is_a?(DateTime) ? @value.strftime("%Y-%m-%dT%H:%M:%S%Z").sub(/\+00:00|UTC/, "Z") : @value.to_s
|
46
|
-
when XSD.date then @value.is_a?(Date) ? @value.strftime("%Y-%m-%d%Z").sub(/\+00:00|UTC/, "Z") : @value.to_s
|
47
|
-
when RDF.XMLLiteral then normalize_xmlliteral(@value, options)
|
48
|
-
else @value.to_s
|
49
|
-
end
|
59
|
+
##
|
60
|
+
# Returns the value as a string.
|
61
|
+
#
|
62
|
+
# @return [String]
|
63
|
+
def to_s
|
64
|
+
@string
|
50
65
|
end
|
51
66
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
67
|
+
private
|
68
|
+
|
69
|
+
def parse_value(value, options)
|
70
|
+
ns_hash = {}
|
71
|
+
options[:namespaces].each_pair do |prefix, uri|
|
72
|
+
attr = prefix.to_s.empty? ? "xmlns" : "xmlns:#{prefix}"
|
73
|
+
ns_hash[attr] = uri.to_s
|
74
|
+
end
|
75
|
+
ns_strs = []
|
76
|
+
ns_hash.each_pair {|a, u| ns_strs << "#{a}=\"#{u}\""}
|
77
|
+
|
78
|
+
case @library
|
79
|
+
when :nokogiri then parse_value_nokogiri(value, ns_strs, options[:language])
|
80
|
+
when :libxml then parse_value_libxml(value, ns_strs, options[:language])
|
81
|
+
when :rexml then parse_value_rexml(value, ns_strs, options[:language])
|
82
|
+
else value.to_s
|
83
|
+
end
|
60
84
|
end
|
61
85
|
|
62
|
-
def
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
86
|
+
def serialize_nodeset(object)
|
87
|
+
case @library
|
88
|
+
when :nokogiri then serialize_nodeset_nokogiri(object)
|
89
|
+
when :libxml then serialize_nodeset_libxml(object)
|
90
|
+
when :rexml then serialize_nodeset_rexml(object)
|
91
|
+
else object
|
92
|
+
end
|
68
93
|
end
|
69
94
|
|
70
|
-
#
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
95
|
+
# Nokogiri implementations
|
96
|
+
if defined?(::Nokogiri)
|
97
|
+
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
|
76
101
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
102
|
+
elements.map do |c|
|
103
|
+
if c.is_a?(Nokogiri::XML::Element)
|
104
|
+
c = Nokogiri::XML.parse(c.dup.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS)).root
|
105
|
+
# Gather namespaces from self and decendant nodes
|
106
|
+
c.traverse do |n|
|
107
|
+
ns = n.namespace
|
108
|
+
next unless ns
|
109
|
+
prefix = ns.prefix ? "xmlns:#{ns.prefix}" : "xmlns"
|
110
|
+
c[prefix] = ns.href.to_s unless c.namespaces[prefix]
|
111
|
+
end
|
112
|
+
|
113
|
+
# Add lanuage
|
114
|
+
if language && c["lang"].to_s.empty?
|
115
|
+
c["xml:lang"] = language
|
116
|
+
end
|
117
|
+
end
|
118
|
+
c
|
89
119
|
end
|
90
|
-
|
91
|
-
|
120
|
+
end
|
121
|
+
|
122
|
+
def serialize_nodeset_nokogiri(object)
|
123
|
+
object.map {|c| c.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS)}.join("")
|
124
|
+
end
|
125
|
+
end # Nokogiri
|
126
|
+
|
127
|
+
if defined?(::LibXML)
|
128
|
+
def parse_value_libxml(value, ns_strs, language)
|
129
|
+
# Fixme
|
130
|
+
end
|
92
131
|
|
93
|
-
|
94
|
-
|
132
|
+
def serialize_nodeset_libxml(object)
|
133
|
+
# Fixme
|
95
134
|
end
|
135
|
+
end # LibXML
|
136
|
+
|
137
|
+
# REXML
|
138
|
+
def parse_value_rexml(value, ns_strs, language)
|
139
|
+
# Fixme
|
140
|
+
end
|
96
141
|
|
97
|
-
|
98
|
-
|
99
|
-
if c.is_a?(Nokogiri::XML::Element)
|
100
|
-
c = Nokogiri::XML.parse(c.dup.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS)).root
|
101
|
-
# Gather namespaces from self and decendant nodes
|
102
|
-
c.traverse do |n|
|
103
|
-
ns = n.namespace
|
104
|
-
next unless ns
|
105
|
-
prefix = ns.prefix ? "xmlns:#{ns.prefix}" : "xmlns"
|
106
|
-
c[prefix] = ns.href.to_s unless c.namespaces[prefix]
|
107
|
-
end
|
108
|
-
|
109
|
-
# Add lanuage
|
110
|
-
if options[:language] && c["lang"].to_s.empty?
|
111
|
-
c["xml:lang"] = options[:language]
|
112
|
-
end
|
113
|
-
end
|
114
|
-
c.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS)
|
115
|
-
end.join("")
|
142
|
+
def serialize_nodeset_rexml(object)
|
143
|
+
# Fixme
|
116
144
|
end
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
end
|
145
|
+
|
146
|
+
end # class XML
|
147
|
+
end; end
|
data/lib/rdf/n3/reader.rb
CHANGED
@@ -344,9 +344,9 @@ module RDF::N3
|
|
344
344
|
def process_uri(uri, normalize = true)
|
345
345
|
uri = uri.text_value if uri.respond_to?(:text_value)
|
346
346
|
if uri.match(/^\#/)
|
347
|
-
uri(@uri, uri
|
347
|
+
uri(@uri, RDF::NTriples::Writer.escape(uri), false) # This is probably bogus, but allows tests to pass
|
348
348
|
else
|
349
|
-
uri = uri
|
349
|
+
uri = RDF::NTriples::Writer.escape(uri) unless normalize # Addressable does it's own escaping when normalizing
|
350
350
|
uri(@uri, uri, normalize)
|
351
351
|
end
|
352
352
|
end
|
@@ -392,7 +392,7 @@ module RDF::N3
|
|
392
392
|
|
393
393
|
# Evaluate text_value to remove redundant escapes
|
394
394
|
#puts string.elements[1].text_value.dump
|
395
|
-
lit = RDF::Literal.new(string.elements[1].text_value
|
395
|
+
lit = RDF::Literal.new(RDF::NTriples::Reader.unescape(string.elements[1].text_value), :language => language, :datatype => encoding)
|
396
396
|
raise RDF::ReaderError, %(Typed literal has an invalid lexical value: #{encoding.to_s} "#{lit.value}") if @strict && !lit.valid?
|
397
397
|
lit
|
398
398
|
end
|
@@ -400,7 +400,7 @@ module RDF::N3
|
|
400
400
|
def process_numeric_literal(object)
|
401
401
|
add_debug(*object.info("process_numeric_literal"))
|
402
402
|
|
403
|
-
RDF::Literal.new(object.text_value
|
403
|
+
RDF::Literal.new(RDF::NTriples::Reader.unescape(object.text_value), :datatype => RDF::XSD[object.numericliteral])
|
404
404
|
end
|
405
405
|
|
406
406
|
def build_uri(expression)
|
@@ -408,6 +408,7 @@ module RDF::N3
|
|
408
408
|
localname = expression.localname.text_value if expression.respond_to?(:localname)
|
409
409
|
localname ||= (expression.respond_to?(:text_value) ? expression.text_value : expression).to_s.sub(/^:/, "")
|
410
410
|
localname = nil if localname.empty? # In N3/Turtle "_:" is not named
|
411
|
+
escaped_localname = RDF::NTriples::Writer.escape(localname.to_s)
|
411
412
|
|
412
413
|
if expression.respond_to?(:info)
|
413
414
|
add_debug(*expression.info("build_uri(#{prefix.inspect}, #{localname.inspect})"))
|
@@ -416,23 +417,23 @@ module RDF::N3
|
|
416
417
|
end
|
417
418
|
|
418
419
|
uri = if @uri_mappings[prefix]
|
419
|
-
add_debug(*expression.info("build_uri: (ns): #{@uri_mappings[prefix]}, #{
|
420
|
-
ns(prefix, localname.to_s
|
420
|
+
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))
|
421
422
|
elsif prefix == '_'
|
422
423
|
add_debug(*expression.info("build_uri: (bnode)")) if expression.respond_to?(:info)
|
423
424
|
bnode(localname)
|
424
425
|
elsif prefix == "rdf"
|
425
426
|
add_debug(*expression.info("build_uri: (rdf)")) if expression.respond_to?(:info)
|
426
427
|
# A special case
|
427
|
-
RDF::RDF[
|
428
|
+
RDF::RDF[escaped_localname]
|
428
429
|
elsif prefix == "xsd"
|
429
430
|
add_debug(*expression.info("build_uri: (xsd)")) if expression.respond_to?(:info)
|
430
431
|
# A special case
|
431
|
-
RDF::XSD[
|
432
|
+
RDF::XSD[escaped_localname]
|
432
433
|
else
|
433
434
|
add_debug(*expression.info("build_uri: (default_ns)")) if expression.respond_to?(:info)
|
434
435
|
@default_ns ||= uri("#{@uri}#", nil)
|
435
|
-
ns(nil,
|
436
|
+
ns(nil, escaped_localname)
|
436
437
|
end
|
437
438
|
add_debug(*expression.info("build_uri: #{uri.inspect}")) if expression.respond_to?(:info)
|
438
439
|
uri
|
data/lib/rdf/n3/version.rb
CHANGED
data/lib/rdf/n3/writer.rb
CHANGED
data/lib/rdf/n3.rb
CHANGED
@@ -23,11 +23,9 @@ module RDF
|
|
23
23
|
require 'rdf/n3/format'
|
24
24
|
require 'rdf/n3/vocab'
|
25
25
|
require 'rdf/n3/patches/array_hacks'
|
26
|
-
require 'rdf/n3/patches/literal_hacks'
|
27
26
|
require 'rdf/n3/patches/literal_normalization'
|
28
27
|
require 'rdf/n3/patches/graph_properties'
|
29
28
|
require 'rdf/n3/patches/qname_hacks'
|
30
|
-
require 'rdf/n3/patches/rdf_escape'
|
31
29
|
require 'rdf/n3/patches/seq'
|
32
30
|
require 'rdf/n3/patches/uri_hacks'
|
33
31
|
autoload :Reader, 'rdf/n3/reader'
|
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.
|
8
|
+
s.version = "0.2.1"
|
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-
|
12
|
+
s.date = %q{2010-06-28}
|
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}
|
@@ -31,10 +31,8 @@ Gem::Specification.new do |s|
|
|
31
31
|
"lib/rdf/n3/format.rb",
|
32
32
|
"lib/rdf/n3/patches/array_hacks.rb",
|
33
33
|
"lib/rdf/n3/patches/graph_properties.rb",
|
34
|
-
"lib/rdf/n3/patches/literal_hacks.rb",
|
35
34
|
"lib/rdf/n3/patches/literal_normalization.rb",
|
36
35
|
"lib/rdf/n3/patches/qname_hacks.rb",
|
37
|
-
"lib/rdf/n3/patches/rdf_escape.rb",
|
38
36
|
"lib/rdf/n3/patches/seq.rb",
|
39
37
|
"lib/rdf/n3/patches/uri_hacks.rb",
|
40
38
|
"lib/rdf/n3/reader.rb",
|
@@ -604,14 +602,13 @@ Gem::Specification.new do |s|
|
|
604
602
|
"spec/turtle/test-29.ttl",
|
605
603
|
"spec/turtle/test-30.out",
|
606
604
|
"spec/turtle/test-30.ttl",
|
607
|
-
"spec/turtle_serializer_spec.rb",
|
608
605
|
"spec/turtle_spec.rb",
|
609
606
|
"spec/writer_spec.rb"
|
610
607
|
]
|
611
608
|
s.homepage = %q{http://github.com/gkellogg/rdf-rdfa}
|
612
609
|
s.rdoc_options = ["--charset=UTF-8"]
|
613
610
|
s.require_paths = ["lib"]
|
614
|
-
s.rubygems_version = %q{1.3.
|
611
|
+
s.rubygems_version = %q{1.3.6}
|
615
612
|
s.summary = %q{Notation-3 (n3-rdf) and Turtle reader/writer for RDF.rb.}
|
616
613
|
s.test_files = [
|
617
614
|
"spec/cwm_spec.rb",
|
@@ -622,7 +619,6 @@ Gem::Specification.new do |s|
|
|
622
619
|
"spec/rdf_helper.rb",
|
623
620
|
"spec/spec_helper.rb",
|
624
621
|
"spec/swap_spec.rb",
|
625
|
-
"spec/turtle_serializer_spec.rb",
|
626
622
|
"spec/turtle_spec.rb",
|
627
623
|
"spec/writer_spec.rb"
|
628
624
|
]
|
@@ -631,29 +627,29 @@ Gem::Specification.new do |s|
|
|
631
627
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
632
628
|
s.specification_version = 3
|
633
629
|
|
634
|
-
if Gem::Version.new(Gem::
|
635
|
-
s.add_runtime_dependency(%q<rdf>, [">= 0.2.
|
630
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
631
|
+
s.add_runtime_dependency(%q<rdf>, [">= 0.2.1"])
|
636
632
|
s.add_runtime_dependency(%q<treetop>, [">= 1.4.0"])
|
637
633
|
s.add_development_dependency(%q<rspec>, [">= 0"])
|
638
|
-
s.add_development_dependency(%q<rdf-spec>, [">= 0"])
|
639
|
-
s.add_development_dependency(%q<rdf-rdfxml>, [">= 0.2.
|
634
|
+
s.add_development_dependency(%q<rdf-spec>, [">= 0.2.1"])
|
635
|
+
s.add_development_dependency(%q<rdf-rdfxml>, [">= 0.2.1"])
|
640
636
|
s.add_development_dependency(%q<rdf-isomorphic>, [">= 0"])
|
641
637
|
s.add_development_dependency(%q<yard>, [">= 0"])
|
642
638
|
else
|
643
|
-
s.add_dependency(%q<rdf>, [">= 0.2.
|
639
|
+
s.add_dependency(%q<rdf>, [">= 0.2.1"])
|
644
640
|
s.add_dependency(%q<treetop>, [">= 1.4.0"])
|
645
641
|
s.add_dependency(%q<rspec>, [">= 0"])
|
646
|
-
s.add_dependency(%q<rdf-spec>, [">= 0"])
|
647
|
-
s.add_dependency(%q<rdf-rdfxml>, [">= 0.2.
|
642
|
+
s.add_dependency(%q<rdf-spec>, [">= 0.2.1"])
|
643
|
+
s.add_dependency(%q<rdf-rdfxml>, [">= 0.2.1"])
|
648
644
|
s.add_dependency(%q<rdf-isomorphic>, [">= 0"])
|
649
645
|
s.add_dependency(%q<yard>, [">= 0"])
|
650
646
|
end
|
651
647
|
else
|
652
|
-
s.add_dependency(%q<rdf>, [">= 0.2.
|
648
|
+
s.add_dependency(%q<rdf>, [">= 0.2.1"])
|
653
649
|
s.add_dependency(%q<treetop>, [">= 1.4.0"])
|
654
650
|
s.add_dependency(%q<rspec>, [">= 0"])
|
655
|
-
s.add_dependency(%q<rdf-spec>, [">= 0"])
|
656
|
-
s.add_dependency(%q<rdf-rdfxml>, [">= 0.2.
|
651
|
+
s.add_dependency(%q<rdf-spec>, [">= 0.2.1"])
|
652
|
+
s.add_dependency(%q<rdf-rdfxml>, [">= 0.2.1"])
|
657
653
|
s.add_dependency(%q<rdf-isomorphic>, [">= 0"])
|
658
654
|
s.add_dependency(%q<yard>, [">= 0"])
|
659
655
|
end
|