rdf-n3 0.2.3.2 → 0.3.0

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.
Files changed (44) hide show
  1. data/.gitignore +1 -0
  2. data/.yardopts +4 -3
  3. data/{History.txt → History.md} +30 -6
  4. data/{README.rdoc → README.md} +56 -19
  5. data/Rakefile +15 -29
  6. data/VERSION +1 -1
  7. data/example-files/sp2b.n3 +50177 -0
  8. data/lib/rdf/n3.rb +2 -2
  9. data/lib/rdf/n3/reader.rb +560 -367
  10. data/lib/rdf/n3/reader/meta.rb +640 -0
  11. data/lib/rdf/n3/reader/n3-selectors.n3 +0 -0
  12. data/lib/rdf/n3/reader/parser.rb +229 -0
  13. data/lib/rdf/n3/vocab.rb +1 -0
  14. data/lib/rdf/n3/writer.rb +324 -265
  15. data/rdf-n3.gemspec +24 -26
  16. data/script/build_meta +242 -0
  17. data/script/parse +62 -13
  18. data/script/tc +4 -4
  19. data/spec/cwm_spec.rb +11 -3
  20. data/spec/n3reader_spec.rb +233 -63
  21. data/spec/rdf_helper.rb +15 -15
  22. data/spec/spec_helper.rb +10 -4
  23. data/spec/swap_spec.rb +11 -35
  24. data/spec/swap_test/n3parser.tests +14 -14
  25. data/spec/swap_test/n3parser.yml +0 -19
  26. data/spec/swap_test/nodeID/classes.ref.rdf +1 -1
  27. data/spec/swap_test/ref/contexts-1.n3 +12 -0
  28. data/spec/swap_test/ref/prefix2.rdf +33 -0
  29. data/spec/swap_test/ref/strquot.n3 +0 -1
  30. data/spec/swap_test/ref/xml-syntax-basic-serialization.rdf +1 -1
  31. data/spec/swap_test/regression.n3 +5 -5
  32. data/spec/swap_test/regression.yml +53 -23
  33. data/spec/turtle/manifest-bad.yml +91 -0
  34. data/spec/turtle/manifest.yml +187 -0
  35. data/spec/turtle_spec.rb +12 -20
  36. data/spec/writer_spec.rb +39 -37
  37. metadata +43 -48
  38. data/lib/rdf/n3/patches/qname_hacks.rb +0 -57
  39. data/lib/rdf/n3/patches/seq.rb +0 -34
  40. data/lib/rdf/n3/reader/n3_grammar.rb +0 -3764
  41. data/lib/rdf/n3/reader/n3_grammar.treetop +0 -227
  42. data/lib/rdf/n3/reader/n3_grammar_18.rb +0 -3764
  43. data/lib/rdf/n3/reader/n3_grammar_18.treetop +0 -227
  44. data/spec/literal_spec.rb +0 -245
@@ -5,49 +5,47 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rdf-n3}
8
- s.version = "0.2.3.2"
8
+ s.version = "0.3.0"
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-11-12}
13
- s.description = %q{ RDF::N3 is an Notation-3 (n3-rdf) parser for Ruby using the RDF.rb library suite.
14
- }
12
+ s.date = %q{2010-12-27}
13
+ s.description = %q{RDF::N3 is an Notation-3 (n3-rdf) parser for Ruby using the RDF.rb library suite.}
15
14
  s.email = %q{gregg@kellogg-assoc.com}
16
15
  s.extra_rdoc_files = [
17
16
  "AUTHORS",
18
- "History.txt",
19
- "README.rdoc"
17
+ "History.md",
18
+ "README.md",
19
+ "VERSION"
20
20
  ]
21
21
  s.files = [
22
22
  ".gitignore",
23
23
  ".yardopts",
24
24
  "AUTHORS",
25
- "History.txt",
26
- "README.rdoc",
25
+ "History.md",
26
+ "README.md",
27
27
  "Rakefile",
28
28
  "VERSION",
29
+ "example-files/sp2b.n3",
29
30
  "example.rb",
30
31
  "lib/rdf/n3.rb",
31
32
  "lib/rdf/n3/format.rb",
32
33
  "lib/rdf/n3/patches/array_hacks.rb",
33
34
  "lib/rdf/n3/patches/graph_properties.rb",
34
- "lib/rdf/n3/patches/qname_hacks.rb",
35
- "lib/rdf/n3/patches/seq.rb",
36
35
  "lib/rdf/n3/reader.rb",
37
- "lib/rdf/n3/reader/n3_grammar.rb",
38
- "lib/rdf/n3/reader/n3_grammar.treetop",
39
- "lib/rdf/n3/reader/n3_grammar_18.rb",
40
- "lib/rdf/n3/reader/n3_grammar_18.treetop",
36
+ "lib/rdf/n3/reader/meta.rb",
37
+ "lib/rdf/n3/reader/n3-selectors.n3",
38
+ "lib/rdf/n3/reader/parser.rb",
41
39
  "lib/rdf/n3/version.rb",
42
40
  "lib/rdf/n3/vocab.rb",
43
41
  "lib/rdf/n3/writer.rb",
44
42
  "rdf-n3.gemspec",
43
+ "script/build_meta",
45
44
  "script/console",
46
45
  "script/parse",
47
46
  "script/tc",
48
47
  "spec/cwm_spec.rb",
49
48
  "spec/format_spec.rb",
50
- "spec/literal_spec.rb",
51
49
  "spec/matchers.rb",
52
50
  "spec/n3reader_spec.rb",
53
51
  "spec/rdf_helper.rb",
@@ -451,6 +449,7 @@ Gem::Specification.new do |s|
451
449
  "spec/swap_test/ref/bnode.n3",
452
450
  "spec/swap_test/ref/bnode.rdf",
453
451
  "spec/swap_test/ref/colon-in-uri.n3",
452
+ "spec/swap_test/ref/contexts-1.n3",
454
453
  "spec/swap_test/ref/daml-ex.n3",
455
454
  "spec/swap_test/ref/daml-ont.n3",
456
455
  "spec/swap_test/ref/djb1a-out.n3",
@@ -468,6 +467,7 @@ Gem::Specification.new do |s|
468
467
  "spec/swap_test/ref/path1.n3",
469
468
  "spec/swap_test/ref/path2.n3",
470
469
  "spec/swap_test/ref/prefix1.rdf",
470
+ "spec/swap_test/ref/prefix2.rdf",
471
471
  "spec/swap_test/ref/prefix3.rdf",
472
472
  "spec/swap_test/ref/rdf-redefine.rdf",
473
473
  "spec/swap_test/ref/reluri-1.rdf",
@@ -533,7 +533,9 @@ Gem::Specification.new do |s|
533
533
  "spec/turtle/bad-13.ttl",
534
534
  "spec/turtle/bad-14.ttl",
535
535
  "spec/turtle/manifest-bad.ttl",
536
+ "spec/turtle/manifest-bad.yml",
536
537
  "spec/turtle/manifest.ttl",
538
+ "spec/turtle/manifest.yml",
537
539
  "spec/turtle/rdf-schema.out",
538
540
  "spec/turtle/rdf-schema.ttl",
539
541
  "spec/turtle/rdfq-results.out",
@@ -606,7 +608,7 @@ Gem::Specification.new do |s|
606
608
  "spec/turtle_spec.rb",
607
609
  "spec/writer_spec.rb"
608
610
  ]
609
- s.homepage = %q{http://github.com/gkellogg/rdf-rdfa}
611
+ s.homepage = %q{http://github.com/gkellogg/rdf-n3}
610
612
  s.rdoc_options = ["--charset=UTF-8"]
611
613
  s.require_paths = ["lib"]
612
614
  s.rubygems_version = %q{1.3.7}
@@ -614,7 +616,6 @@ Gem::Specification.new do |s|
614
616
  s.test_files = [
615
617
  "spec/cwm_spec.rb",
616
618
  "spec/format_spec.rb",
617
- "spec/literal_spec.rb",
618
619
  "spec/matchers.rb",
619
620
  "spec/n3reader_spec.rb",
620
621
  "spec/rdf_helper.rb",
@@ -629,26 +630,23 @@ Gem::Specification.new do |s|
629
630
  s.specification_version = 3
630
631
 
631
632
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
632
- s.add_runtime_dependency(%q<rdf>, [">= 0.2.1"])
633
- s.add_runtime_dependency(%q<treetop>, [">= 1.4.0"])
634
- s.add_development_dependency(%q<rspec>, ["= 1.3.0"])
633
+ s.add_runtime_dependency(%q<rdf>, [">= 0.3.0"])
634
+ s.add_development_dependency(%q<rspec>, [">= 2.1.0"])
635
635
  s.add_development_dependency(%q<rdf-spec>, [">= 0.2.1"])
636
636
  s.add_development_dependency(%q<rdf-rdfxml>, [">= 0.2.1"])
637
637
  s.add_development_dependency(%q<rdf-isomorphic>, [">= 0"])
638
638
  s.add_development_dependency(%q<yard>, [">= 0"])
639
639
  else
640
- s.add_dependency(%q<rdf>, [">= 0.2.1"])
641
- s.add_dependency(%q<treetop>, [">= 1.4.0"])
642
- s.add_dependency(%q<rspec>, ["= 1.3.0"])
640
+ s.add_dependency(%q<rdf>, [">= 0.3.0"])
641
+ s.add_dependency(%q<rspec>, [">= 2.1.0"])
643
642
  s.add_dependency(%q<rdf-spec>, [">= 0.2.1"])
644
643
  s.add_dependency(%q<rdf-rdfxml>, [">= 0.2.1"])
645
644
  s.add_dependency(%q<rdf-isomorphic>, [">= 0"])
646
645
  s.add_dependency(%q<yard>, [">= 0"])
647
646
  end
648
647
  else
649
- s.add_dependency(%q<rdf>, [">= 0.2.1"])
650
- s.add_dependency(%q<treetop>, [">= 1.4.0"])
651
- s.add_dependency(%q<rspec>, ["= 1.3.0"])
648
+ s.add_dependency(%q<rdf>, [">= 0.3.0"])
649
+ s.add_dependency(%q<rspec>, [">= 2.1.0"])
652
650
  s.add_dependency(%q<rdf-spec>, [">= 0.2.1"])
653
651
  s.add_dependency(%q<rdf-rdfxml>, [">= 0.2.1"])
654
652
  s.add_dependency(%q<rdf-isomorphic>, [">= 0"])
@@ -0,0 +1,242 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "..", 'lib')))
4
+ require 'rdf/n3'
5
+ require 'getoptlong'
6
+
7
+ # Build rdf/n3/parser/meta.rb from http://www.w3.org/2000/10/swap/grammar/n3-selectors.n3
8
+ # Based on code from http://www.w3.org/2000/10/swap/grammar/predictiveParser.py
9
+
10
+ class BNF < RDF::Vocabulary("http://www.w3.org/2000/10/swap/grammar/bnf#"); end
11
+ class REGEX < RDF::Vocabulary("http://www.w3.org/2000/10/swap/grammar/regex#"); end
12
+ class N3 < RDF::Vocabulary("http://www.w3.org/2000/10/swap/grammar/n3#"); end
13
+
14
+ class PredictiveParser
15
+ attr_accessor :already, :agenda, :errors, :literalTerminals, :branchTable, :tokenRegexps
16
+ attr_accessor :graph
17
+
18
+ def initialize
19
+ @already = []
20
+ @agenda = []
21
+ @errors = []
22
+ @literalTerminals = {}
23
+ @branchTable = {}
24
+ @tokenRegexps = {}
25
+ end
26
+
27
+ def parse(file)
28
+ progress("Loading " + file)
29
+ File.open(file) do |f|
30
+ @graph = RDF::Graph.new do |g|
31
+ RDF::N3::Reader.new(f).each do |statement|
32
+ g << statement
33
+ end
34
+ end
35
+ end
36
+ progress("Loaded #{@graph.count} statements.")
37
+ end
38
+
39
+ def recordError(str)
40
+ errors << str
41
+ "##### ERROR: #{str}"
42
+ end
43
+
44
+ def progress(str); puts(str); end
45
+ def chatty(str); progress(str) if $verbose; end
46
+
47
+ def runProduction(lhs)
48
+ doProduction(lhs)
49
+ while !@agenda.empty?
50
+ x = @agenda.shift
51
+ @already << x
52
+ doProduction(x)
53
+ end
54
+
55
+ if !@errors.empty?
56
+ progress("###### FAILED with #{errors.length} errors.")
57
+ @errors.each {|s| progress(" #{s}")}
58
+ exit(-2)
59
+ else
60
+ progress("Ok for predictive parsing")
61
+ end
62
+ end
63
+
64
+ # Generate branch tables for one production
65
+ def doProduction(lhs)
66
+ if lhs == BNF.void
67
+ progress("\nvoid")
68
+ return
69
+ end
70
+ if lhs == BNF.eof
71
+ progress( "\nEOF")
72
+ return
73
+ end
74
+ if lhs.is_a?(RDF::Literal)
75
+ literalTerminals[lhs.value()] = 1
76
+ return
77
+ end
78
+
79
+ branchDict = {}
80
+
81
+ rhs = graph.first_object(:subject => lhs, :predicate => BNF.matches)
82
+ if rhs
83
+ chatty("\nToken #{lhs} matches regexp #{rhs}")
84
+ tokenRegexps[lhs] = rhs.value
85
+
86
+ cc = graph.query(:subject => lhs, :predicate => BNF.canStartWith)
87
+ progress(recordError("No record of what token #{lhs} can start with")) if cc.empty?
88
+ cc.each {|statement| chatty(" Can start with: #{statement.object}")}
89
+ return
90
+ end
91
+
92
+ rhs = graph.first_object(:subject => lhs, :predicate => BNF.mustBeOneSequence)
93
+ unless rhs
94
+ progress(recordError("No definition of #{lhs}"))
95
+ # raise RuntimeError("No definition of %s in\n %s" %(`lhs`, `g`))
96
+ return
97
+ end
98
+
99
+ options = rhs
100
+ progress("\nProduction #{lhs} :: #{options}")
101
+ graph.query(:subject => lhs, :predicate => BNF.canPrecede) do |statement|
102
+ chatty(" Can precede '#{statement.object}'")
103
+ end
104
+
105
+ graph.query(:subject => lhs, :predicate => BNF.branch) do |statement|
106
+ branch = statement.object
107
+ sequence = graph.first_object(:subject => statement.object, :predicate => BNF.sequence)
108
+ option = RDF::List.new(sequence, graph).to_a
109
+ progress(" option: #{option}")
110
+
111
+ option.each do |part|
112
+ agenda << part unless already.include?(part) || agenda.include?(part)
113
+ end
114
+
115
+ conditions = graph.query(:subject => branch, :predicate => BNF.condition).map(&:object)
116
+ if conditions.empty?
117
+ progress(recordError("NO SELECTOR for #{lhs} option #{option}"))
118
+ if option.empty?
119
+ # Void case - the tricky one
120
+ graph.pattern(:subject => lhs, :predicate => BNF.canPrecede) do |st|
121
+ progress(" Can precede #{st.object}")
122
+ end
123
+ end
124
+ end
125
+
126
+ progress(" Conditions: #{conditions.to_a.map(&:to_s)}")
127
+ conditions.each do |str1|
128
+ if branchDict.has_key?(str1)
129
+ progress(
130
+ "Conflict: #{str1} is also the condition for #{branchDict[str1]}")
131
+ end
132
+ branchDict[str1] = option
133
+ end
134
+ end
135
+
136
+ branchDict.keys.each do |str1|
137
+ branchDict.keys.each do |str2|
138
+ s1, s2 = str1.to_s, str2.to_s
139
+ if (s1.index(s2) == 0 || s2.index(s1) == 0) && branchDict[str1] != branchDict[str2]
140
+ progress("WARNING: for #{lhs}, #{str1} indicates #{branchDict[str1]}, but #{str2} indicates #{branchDict[str2]}")
141
+ end
142
+ end
143
+ end
144
+
145
+ branchTable[lhs] = branchDict
146
+ end
147
+
148
+ def litOrNot(value)
149
+ (value.is_a?(RDF::Literal) ? "" : ":") + value.to_s.dump
150
+ end
151
+
152
+ def outputBranchTable(io, indent = 0)
153
+ ind0 = ' ' * indent
154
+ ind1 = ind0 + ' '
155
+ ind2 = ind1 + ' '
156
+ ind3 = ind2 + ' '
157
+ io.puts "#{ind0}BRANCHES = {"
158
+ branchTable.keys.sort_by(&:to_s).each do |prod|
159
+ # Special case double, integer, and decimal to output just a numericliteral, due to a parser conflict
160
+ next if prod.to_s =~ /numericliteral/
161
+ io.puts "#{ind1}#{litOrNot(prod)} => {"
162
+ branchTable[prod].keys.sort_by(&:to_s).each do |term|
163
+ list = branchTable[prod][term].map {|t2| litOrNot(t2)}.join(",\n#{ind3}")
164
+ io.puts "#{ind2}#{litOrNot(term)} => [#{list}],"
165
+ end
166
+ io.puts "#{ind1}},"
167
+ end
168
+ io.puts "#{ind0}}\n"
169
+ end
170
+
171
+ def outputRegexpTable(io, indent = 0)
172
+ ind0 = ' ' * indent
173
+ ind1 = ind0 + ' '
174
+ io.puts "#{ind0}REGEXPS = {"
175
+ tokenRegexps.keys.sort_by(&:to_s).each do |prod|
176
+ # Special case double, integer, and decimal to output just a numericliteral, due to a parser conflict
177
+ next if prod.to_s =~ /(integer|double|decimal)/
178
+ io.puts "#{ind1}#{litOrNot(prod)} => Regexp.compile(" +
179
+ case prod.to_s
180
+ when /barename/ then %q(%(^[#{BARENAME_START}][#{BARENAME_TAIL}]*))
181
+ when /explicituri/ then %q("^<[^>]*>")
182
+ when /langcode/ then %q("^[a-zA-Z]+(-[a-zA-Z0-9]+)*")
183
+ when /prefix/ then %q(%(^([#{BARENAME_START}][#{BARENAME_TAIL}]*)?:))
184
+ when /qname/ then %q(%(^(([#{BARENAME_START}][#{BARENAME_TAIL}]*)?:)?([#{BARENAME_START}][#{BARENAME_TAIL}]*)?))
185
+ when /variable/ then %q(%(^\\\\?[#{BARENAME_START}][#{BARENAME_TAIL}]*))
186
+ else tokenRegexps[prod].dump
187
+ end + "),"
188
+ end
189
+
190
+ io.puts "\n#{ind1}# Hack to replace integer|double|decimal with numericliteral"
191
+ io.puts "#{ind1}#{litOrNot(N3.numericliteral)} => Regexp.compile(" + %q(%(^[-+]?[0-9]+(\\\\.[0-9]+)?(e[-+]?[0-9]+)?)) + ")"
192
+ io.puts "#{ind0}}\n"
193
+ end
194
+ end
195
+
196
+ $verbose = false
197
+ $debug = false
198
+ grammarFile = File.expand_path(File.join(File.dirname(__FILE__), "../lib/rdf/n3/reader/n3-selectors.n3"))
199
+ parseAs = "document"
200
+ output = STDOUT
201
+
202
+ opts = GetoptLong.new(
203
+ ["--debug", GetoptLong::NO_ARGUMENT],
204
+ ["--verbose", GetoptLong::NO_ARGUMENT],
205
+ ["--grammar", GetoptLong::REQUIRED_ARGUMENT],
206
+ ["--as", GetoptLong::REQUIRED_ARGUMENT],
207
+ ["--output", "-o", GetoptLong::REQUIRED_ARGUMENT]
208
+ )
209
+ opts.each do |opt, arg|
210
+ case opt
211
+ when '--verbose' then $verbose = true
212
+ when '--debug' then $debug = true
213
+ when '--grammar' then grammarFile = arg
214
+ when '--as' then parseAs = arg
215
+ when '--output' then output = File.open(arg, "w")
216
+ end
217
+ end
218
+
219
+ pp = PredictiveParser.new
220
+
221
+ pp.parse(grammarFile)
222
+ pp.runProduction(N3[parseAs])
223
+
224
+ unless output == STDOUT
225
+ output.puts "# This file is automatically generated by #{__FILE__}"
226
+ output.puts "# Branch and Regexp tables derived from http://www.w3.org/2000/10/swap/grammar/n3-selectors.n3"
227
+ output.puts "module RDF::N3::Meta"
228
+ end
229
+ pp.outputBranchTable(output, 1)
230
+ output.puts %q(
231
+ if RUBY_VERSION >= "1.9.0"
232
+ BARENAME_START = "A-Z_a-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02ff\u0370-\u037d\u037f-\u1fff\u200c-\u200d\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd\u{10000}-\u{effff}"
233
+ BARENAME_TAIL = "0-9#{BARENAME_START}\u00b7\u0300-\u036f\u203f-\u2040\\\\-"
234
+ else
235
+ BARENAME_START = "A-Z_a-z\xc0-\xd6\xd8-\xf6\xf8-\xff"
236
+ BARENAME_TAIL = "0-9#{BARENAME_START}\xb7\\\\-"
237
+ end
238
+ )
239
+ pp.outputRegexpTable(output, 1)
240
+ unless output == STDOUT
241
+ output.puts "end"
242
+ end
@@ -2,21 +2,65 @@
2
2
  require 'rubygems'
3
3
  $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "..", 'lib')))
4
4
  require 'rdf/n3'
5
+ require 'rdf/ntriples'
5
6
  require 'getoptlong'
7
+ require 'open-uri'
6
8
 
7
- def parse(input, base)
8
- puts RDF::Writer.for($format.to_sym).buffer(:base_uri => base) { |writer|
9
- RDF::N3::Reader.new(input, :base_uri => base, :strict => true).each do |statement|
10
- writer << statement
9
+ def run(input, base)
10
+ reader_class = RDF::Reader.for($input_format.to_sym)
11
+ writer_class = RDF::Writer.for($output_format.to_sym)
12
+ raise "Reader not found for #{$input_format}" unless reader_class
13
+ raise "Writer not found for #{$output_format}" unless writer_class
14
+
15
+ start = Time.new
16
+ num = 0
17
+ if $parse_only
18
+ include RDF::N3::Meta
19
+ include RDF::N3::Parser
20
+ puts "\nparse #{input.read}---\n\n" unless $quiet
21
+ input.rewind
22
+ if $quiet
23
+ $stdout = StringIO.new
24
+ end
25
+ test(input, BRANCHES, REGEXPS)
26
+ if $quiet
27
+ $stdout = STDOUT
28
+ print "."
29
+ end
30
+ elsif $output_format == :ntriples || $quiet
31
+ reader_class.new(input, :base_uri => base, :strict => true).each do |statement|
32
+ num += 1
33
+ if $quiet
34
+ #print "."
35
+ else
36
+ puts statement.to_ntriples
37
+ end
38
+ end
39
+ elsif $output_format == :inspect
40
+ reader_class.new(input, :base_uri => base, :strict => true).each do |statement|
41
+ num += 1
42
+ puts statement.inspect
11
43
  end
12
- }
44
+ else
45
+ puts writer_class.buffer(:base_uri => base, :standard_prefixes => true) { |writer|
46
+ reader_class.new(input, :base_uri => base, :strict => true).each do |statement|
47
+ num += 1
48
+ writer << statement
49
+ end
50
+ }
51
+ end
52
+ puts
53
+ secs = Time.new - start
54
+ puts "Parsed #{num} statements in #{secs} seconds @ #{num/secs} statements/second."
55
+ rescue
56
+ fname = input.respond_to?(:path) ? input.path : "-stdin-"
57
+ STDERR.puts("Error in #{fname}")
58
+ raise
13
59
  end
14
60
 
15
- mode = ARGV.shift
16
- raise "Mode must be one of 'parse'" unless mode == "parse"
17
-
18
61
  $verbose = false
19
- $format = :ntriples
62
+ $output_format = :ntriples
63
+ $input_format = :n3
20
64
  base_uri = "http://example.com"
21
65
  input = nil
22
66
 
@@ -25,7 +69,9 @@ opts = GetoptLong.new(
25
69
  ["--verbose", GetoptLong::NO_ARGUMENT],
26
70
  ["--quiet", GetoptLong::NO_ARGUMENT],
27
71
  ["--format", GetoptLong::REQUIRED_ARGUMENT],
72
+ ["--input-format", GetoptLong::REQUIRED_ARGUMENT],
28
73
  ["--execute", "-e", GetoptLong::REQUIRED_ARGUMENT],
74
+ ["--parse-only", GetoptLong::NO_ARGUMENT],
29
75
  ["--uri", GetoptLong::REQUIRED_ARGUMENT]
30
76
  )
31
77
  opts.each do |opt, arg|
@@ -34,16 +80,19 @@ opts.each do |opt, arg|
34
80
  when '--quiet' then $quiet = true
35
81
  when '--debug' then ::RDF::N3::debug = true
36
82
  when '--execute' then input = arg
37
- when '--format' then $format = arg
83
+ when '--format' then $output_format = arg.to_sym
84
+ when '--input-format' then $input_format = arg.to_sym
38
85
  when '--uri' then base_uri = arg
86
+ when '--parse-only' then $parse_only = true
39
87
  end
40
88
  end
41
89
 
42
90
  if ARGV.empty?
43
91
  s = input ? input : $stdin.read
44
- parse(StringIO.new(s), base_uri)
92
+ run(StringIO.new(s), base_uri)
45
93
  else
46
94
  ARGV.each do |test_file|
47
- parse(File.open(test_file), base_uri)
95
+ run(Kernel.open(test_file), base_uri)
48
96
  end
49
- end
97
+ end
98
+ puts