rdf-rdfa 1.99.3 → 2.0.0.beta1

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/VERSION CHANGED
@@ -1 +1 @@
1
- 1.99.3
1
+ 2.0.0.beta1
data/lib/rdf/rdfa.rb CHANGED
@@ -35,8 +35,5 @@ module RDF
35
35
  HTML_RDFA_CONTEXT = "http://www.w3.org/2011/rdfa-context/html-rdfa-1.1"
36
36
  XHTML_RDFA_CONTEXT = "http://www.w3.org/2011/rdfa-context/xhtml-rdfa-1.1"
37
37
  XML_RDFA_CONTEXT = "http://www.w3.org/2011/rdfa-context/rdfa-1.1"
38
-
39
- def self.debug?; @debug; end
40
- def self.debug=(value); @debug = value; end
41
38
  end
42
39
  end
@@ -8,6 +8,8 @@ module RDF::RDFa
8
8
  # The class may be backed by an RDF::Repository, which will be used to retrieve a context graph
9
9
  # or to load into, if no such graph exists
10
10
  class Context
11
+ include RDF::Util::Logger
12
+
11
13
  # Prefix mappings defined in this context
12
14
  # @!attribute [r] prefixes
13
15
  # @return [Hash{Symbol => RDF::URI}]
@@ -43,6 +45,7 @@ module RDF::RDFa
43
45
  @prefixes = options.fetch(:prefixes, {})
44
46
  @terms = options.fetch(:terms, {})
45
47
  @vocabulary = options[:vocabulary]
48
+ @options = options.dup
46
49
 
47
50
  yield(self) if block_given?
48
51
  self
@@ -61,7 +64,6 @@ module RDF::RDFa
61
64
  ##
62
65
  # Repository used for saving contexts
63
66
  # @return [RDF::Repository]
64
- # @raise [RDF::RDFa::ContextError] if context does not support contexts
65
67
  def self.repository
66
68
  @repository ||= RDF::Repository.new(title: "RDFa Contexts")
67
69
  end
@@ -71,7 +73,13 @@ module RDF::RDFa
71
73
  # @param [RDF::Repository] repo
72
74
  # @return [RDF::Repository]
73
75
  def self.repository=(repo)
74
- raise ContextError, "Context Repository must support context" unless repo.supports?(:context)
76
+ unless repo.supports?(:graph_name)
77
+ if respond_to?(:log_fatal)
78
+ log_fatal("Context Repository must support graph_name", exception: ContextError)
79
+ else
80
+ abort("Context Repository must support graph_name")
81
+ end
82
+ end
75
83
  @repository = repo
76
84
  end
77
85
 
@@ -87,18 +95,22 @@ module RDF::RDFa
87
95
  cache[uri] = Struct.new(:prefixes, :terms, :vocabulary).new({}, {}, nil)
88
96
  # Now do the actual load
89
97
  cache[uri] = new(uri) do |context|
90
- STDERR.puts("process_context: retrieve context <#{uri}>") if RDF::RDFa.debug?
98
+ log_debug("process_context: retrieve context <#{uri}>") if respond_to?(:log_debug)
91
99
  Context.load(uri)
92
- context.parse(repository.query(context: uri))
100
+ context.parse(repository.query(graph_name: uri))
93
101
  end
94
102
  rescue Exception => e
95
- raise ContextError, "Context #{uri}: #{e.message}", e.backtrace
103
+ if respond_to?(:log_fatal)
104
+ log_error("Context #{uri}: #{e.message}")
105
+ else
106
+ abort("Context #{uri}: #{e.message}")
107
+ end
96
108
  end
97
109
 
98
110
  # Load context into repository
99
111
  def self.load(uri)
100
112
  uri = RDF::URI.intern(uri)
101
- repository.load(uri.to_s, base_uri: uri, context: uri) unless repository.has_context?(uri)
113
+ repository.load(uri.to_s, base_uri: uri, graph_name: uri) unless repository.has_graph?(uri)
102
114
  end
103
115
 
104
116
  # @return [RDF::Repository]
@@ -146,12 +158,12 @@ module RDF::RDFa
146
158
  # @param [RDF::Enumerable, Enumerator] enumerable
147
159
  # @return [void] ignored
148
160
  def parse(enumerable)
149
- STDERR.puts("process_context: parse context <#{uri}>") if RDF::RDFa.debug?
161
+ log_debug("process_context: parse context <#{uri}>") if respond_to?(:log_debug)
150
162
  resource_info = {}
151
163
  enumerable.each do |statement|
152
164
  res = resource_info[statement.subject] ||= {}
153
165
  next unless statement.object.is_a?(RDF::Literal)
154
- STDERR.puts("process_context: statement=#{statement.inspect}") if RDF::RDFa.debug?
166
+ log_debug("process_context: statement=#{statement.inspect}") if respond_to?(:log_debug)
155
167
  %w(uri term prefix vocabulary).each do |term|
156
168
  res[term] ||= statement.object.value if statement.predicate == RDF::RDFA[term]
157
169
  end
@@ -164,7 +176,7 @@ module RDF::RDFa
164
176
  term = res["term"]
165
177
  prefix = res["prefix"]
166
178
  vocab = res["vocabulary"]
167
- STDERR.puts("process_context: uri=#{uri.inspect}, term=#{term.inspect}, prefix=#{prefix.inspect}, vocabulary=#{vocab.inspect}") if RDF::RDFa.debug?
179
+ log_debug("process_context: uri=#{uri.inspect}, term=#{term.inspect}, prefix=#{prefix.inspect}, vocabulary=#{vocab.inspect}") if respond_to?(:log_debug)
168
180
 
169
181
  @vocabulary = vocab if vocab
170
182
 
@@ -7,6 +7,7 @@ class RDF::RDFa::Context
7
7
  @_rdfa_1_1_prof ||= RDF::RDFa::Context.new(RDF::URI("http://www.w3.org/2011/rdfa-context/rdfa-1.1"), {
8
8
  prefixes: {
9
9
  cc: "http://creativecommons.org/ns#",
10
+ csvw: "http://www.w3.org/ns/csvw#",
10
11
  ctag: "http://commontag.org/ns#",
11
12
  dc: "http://purl.org/dc/terms/",
12
13
  dc11: "http://purl.org/dc/elements/1.1/",
@@ -19,7 +19,9 @@ module RDF::RDFa
19
19
  # @see http://www.w3.org/TR/rdf-testcases/#ntriples
20
20
  class Format < RDF::Format
21
21
  content_encoding 'utf-8'
22
- content_type 'text/html', extension: :html
22
+ content_type 'text/html',
23
+ aliases: %w(application/xhtml+xml image/svg+xml),
24
+ extensions: [:html, :xhtml, :svg]
23
25
  reader { RDF::RDFa::Reader }
24
26
  writer { RDF::RDFa::Writer }
25
27
 
@@ -37,65 +39,9 @@ module RDF::RDFa
37
39
  sample.match(/<[^>]*DOCTYPE\s+html[^>]*>.*xmlns:/im)
38
40
  ) && !sample.match(/<(\w+:)?(RDF)/)
39
41
  end
40
- end
41
-
42
- # Aliases for RDFa::Format
43
- #
44
- # This allows the following:
45
- #
46
- # @example Obtaining an HTML format class
47
- # RDF::Format.for(:lite) # RDF::RDFa::Lite
48
- # RDF::Format.for(:lite).reader # RDF::RDFa::Reader
49
- # RDF::Format.for(:lite).writer # RDF::RDFa::Writer
50
- class Lite < RDF::Format
51
- content_encoding 'utf-8'
52
- content_type 'text/html', extension: :html
53
- reader { RDF::RDFa::Reader }
54
- writer { RDF::RDFa::Writer }
55
- end
56
-
57
- # Aliases for RDFa::Format
58
- #
59
- # This allows the following:
60
- #
61
- # @example Obtaining an HTML format class
62
- # RDF::Format.for(:html) # RDF::RDFa::HTML
63
- # RDF::Format.for(:html).reader # RDF::RDFa::Reader
64
- # RDF::Format.for(:html).writer # RDF::RDFa::Writer
65
- class HTML < RDF::Format
66
- content_encoding 'utf-8'
67
- content_type 'text/html', extension: :html
68
- reader { RDF::RDFa::Reader }
69
- writer { RDF::RDFa::Writer }
70
- end
71
-
72
- # Aliases for RDFa::Format
73
- #
74
- # This allows the following:
75
- #
76
- # @example Obtaining an HTML format class
77
- # RDF::Format.for(:xhtml) # RDF::RDFa::XHTML
78
- # RDF::Format.for(:xhtml).reader # RDF::RDFa::Reader
79
- # RDF::Format.for(:xhtml).writer # RDF::RDFa::Writer
80
- class XHTML < RDF::Format
81
- content_encoding 'utf-8'
82
- content_type 'application/xhtml+xml', extension: :xhtml
83
- reader { RDF::RDFa::Reader }
84
- writer { RDF::RDFa::Writer }
85
- end
86
42
 
87
- # Aliases for RDFa::Format
88
- #
89
- # This allows the following:
90
- #
91
- # @example Obtaining an HTML format class
92
- # RDF::Format.for(:svg) # RDF::RDFa::SVG
93
- # RDF::Format.for(:svg).reader # RDF::RDFa::Reader
94
- # RDF::Format.for(:svg).writer # RDF::RDFa::Writer
95
- class SVG < RDF::Format
96
- content_encoding 'utf-8'
97
- content_type 'image/svg+xml', extension: :svg
98
- reader { RDF::RDFa::Reader }
99
- writer { RDF::RDFa::Writer }
43
+ def self.symbols
44
+ [:rdfa, :lite, :html, :xhtml, :svg]
45
+ end
100
46
  end
101
47
  end
@@ -1,6 +1,6 @@
1
1
  begin
2
2
  require 'nokogiri'
3
- rescue LoadError => e
3
+ rescue LoadError
4
4
  :rexml
5
5
  end
6
6
  require 'rdf/ntriples'
@@ -28,6 +28,7 @@ module RDF::RDFa
28
28
  class Reader < RDF::Reader
29
29
  format Format
30
30
  include Expansion
31
+ include RDF::Util::Logger
31
32
 
32
33
  XHTML = "http://www.w3.org/1999/xhtml"
33
34
 
@@ -99,16 +100,6 @@ module RDF::RDFa
99
100
  # @return [Module]
100
101
  attr_reader :implementation
101
102
 
102
- ##
103
- # Warnings found during processing
104
- # @return [Array<String>]
105
- attr_reader :warnings
106
-
107
- ##
108
- # Accumulated errors found during processing
109
- # @return [Array<String>]
110
- attr_reader :errors
111
-
112
103
  # The Recursive Baggage
113
104
  # @private
114
105
  class EvaluationContext # :nodoc:
@@ -252,6 +243,31 @@ module RDF::RDFa
252
243
  end
253
244
  end
254
245
 
246
+ ##
247
+ # RDFa Reader options
248
+ # @see http://www.rubydoc.info/github/ruby-rdf/rdf/RDF/Reader#options-class_method
249
+ def self.options
250
+ super + [
251
+ RDF::CLI::Option.new(
252
+ symbol: :vocab_expansion,
253
+ datatype: TrueClass,
254
+ on: ["--vocab-expansion"],
255
+ description: "Perform OWL2 expansion on the resulting graph.") {true},
256
+ RDF::CLI::Option.new(
257
+ symbol: :host_language,
258
+ datatype: %w(xml xhtml1 xhtml5 html4 svg),
259
+ on: ["--host-language HOSTLANG", %w(xml xhtml1 xhtml5 html4 svg)],
260
+ description: "Host Language. One of xml, xhtml1, xhtml5, html4, or svg") do |arg|
261
+ arg.to_sym
262
+ end,
263
+ RDF::CLI::Option.new(
264
+ symbol: :rdfagraph,
265
+ datatype: %w(output processor both),
266
+ on: ["--rdfagraph RDFAGRAPH", %w(output processor both)],
267
+ description: "Used to indicate if either or both of the :output or :processor graphs are output.") {|arg| arg.to_sym},
268
+ ]
269
+ end
270
+
255
271
  ##
256
272
  # Initializes the RDFa reader instance.
257
273
  #
@@ -276,12 +292,6 @@ module RDF::RDFa
276
292
  # Value is an array containing on or both of :output or :processor.
277
293
  # @option options [Repository] :vocab_repository (nil)
278
294
  # Repository to save loaded vocabularies.
279
- # @option options [Array] :errors
280
- # array for placing errors found when parsing
281
- # @option options [Array] :warnings
282
- # array for placing warnings found when parsing
283
- # @option options [Array] :debug
284
- # Array to place debug messages
285
295
  # @return [reader]
286
296
  # @yield [reader] `self`
287
297
  # @yieldparam [RDF::Reader] reader
@@ -289,13 +299,11 @@ module RDF::RDFa
289
299
  # @raise [RDF::ReaderError] if _validate_
290
300
  def initialize(input = $stdin, options = {}, &block)
291
301
  super do
292
- @errors = @options[:errors]
293
- @warnings = @options[:warnings]
294
- @debug = @options[:debug]
295
302
  @options = {reference_folding: true}.merge(@options)
296
303
  @repository = RDF::Repository.new
297
304
 
298
305
  @options[:rdfagraph] = case @options[:rdfagraph]
306
+ when 'all' then [:output, :processor]
299
307
  when String, Symbol then @options[:rdfagraph].to_s.split(',').map(&:strip).map(&:to_sym)
300
308
  when Array then @options[:rdfagraph].map {|o| o.to_s.to_sym}
301
309
  else []
@@ -396,9 +404,13 @@ module RDF::RDFa
396
404
 
397
405
  if reader = RDF::Reader.for(content_type: type.to_s)
398
406
  add_debug(el, "=> reader #{reader.to_sym}")
399
- # Wrap input in a RemoteDocument with appropriate content-type
407
+ # Wrap input in a RemoteDocument with appropriate content-type and base
400
408
  doc = if input.is_a?(String)
401
- RDF::Util::File::RemoteDocument.new(input, options.merge(content_type: type.to_s))
409
+ RDF::Util::File::RemoteDocument.new(input,
410
+ options.merge(
411
+ content_type: type.to_s,
412
+ base_uri: base_uri
413
+ ))
402
414
  else
403
415
  input
404
416
  end
@@ -457,6 +469,10 @@ module RDF::RDFa
457
469
  yield RDF::Statement.new(*statement.to_triple) if @options[:rdfagraph].include?(:processor)
458
470
  end
459
471
  end
472
+
473
+ if validate? && log_statistics[:error]
474
+ raise RDF::ReaderError, "Errors found during processing"
475
+ end
460
476
  end
461
477
  enum_for(:each_statement)
462
478
  end
@@ -496,30 +512,30 @@ module RDF::RDFa
496
512
  # @param [#display_path, #to_s] node XML Node or string for showing context
497
513
  # @param [String] message
498
514
  # @yieldreturn [String] appended to message, to allow for lazy-evaulation of message
499
- def add_debug(node, message = "")
500
- return unless ::RDF::RDFa.debug? || @debug
501
- message = message + yield if block_given?
502
- add_processor_message(node, message, RDF::RDFA.Info)
515
+ def add_debug(node, message = "", &block)
516
+ add_processor_message(node, message, nil, &block)
503
517
  end
504
518
 
505
- def add_info(node, message, process_class = RDF::RDFA.Info)
506
- add_processor_message(node, message, process_class)
519
+ def add_info(node, message, process_class = RDF::RDFA.Info, &block)
520
+ add_processor_message(node, message, process_class, &block)
507
521
  end
508
522
 
509
523
  def add_warning(node, message, process_class = RDF::RDFA.Warning)
510
- @warnings << "#{node_path(node)}: #{message}" if @warnings
511
524
  add_processor_message(node, message, process_class)
512
525
  end
513
526
 
514
527
  def add_error(node, message, process_class = RDF::RDFA.Error)
515
- @errors << "#{node_path(node)}: #{message}" if @errors
516
528
  add_processor_message(node, message, process_class)
517
- raise RDF::ReaderError, message if validate?
518
529
  end
519
530
 
520
- def add_processor_message(node, message, process_class)
521
- puts "#{node_path(node)}: #{message}" if ::RDF::RDFa.debug?
522
- @debug << "#{node_path(node)}: #{message}" if @debug.is_a?(Array)
531
+ def add_processor_message(node, message, process_class, &block)
532
+ case process_class
533
+ when RDF::RDFA.Error then log_error(node_path(node), message, &block)
534
+ when RDF::RDFA.Warning then log_warn(node_path(node), message, &block)
535
+ when RDF::RDFA.Info then log_info(node_path(node), message, &block)
536
+ else log_debug(node_path(node), message, &block)
537
+ end
538
+ process_class ||= RDF::RDFA.Info
523
539
  if @options[:processor_callback] || @options[:rdfagraph].include?(:processor)
524
540
  n = RDF::Node.new
525
541
  processor_statements = [
@@ -605,10 +621,10 @@ module RDF::RDFa
605
621
  next
606
622
  end
607
623
 
608
- old_debug = RDF::RDFa.debug?
624
+ old_logger = @options[:logger]
609
625
  begin
610
626
  add_info(root, "load_initial_contexts: load #{uri.to_base}")
611
- RDF::RDFa.debug = false
627
+ @options[:logger] = false
612
628
  context = Context.find(uri)
613
629
 
614
630
  # Add URI Mappings to prefixes
@@ -619,11 +635,11 @@ module RDF::RDFa
619
635
  yield :term_mappings, context.terms unless context.terms.empty?
620
636
  yield :default_vocabulary, context.vocabulary if context.vocabulary
621
637
  rescue Exception => e
622
- RDF::RDFa.debug = old_debug
638
+ options[:logger] = old_logger
623
639
  add_error(root, e.message)
624
640
  raise # In case we're not in strict mode, we need to be sure processing stops
625
641
  ensure
626
- RDF::RDFa.debug = old_debug
642
+ @options[:logger] = old_logger
627
643
  end
628
644
  end
629
645
  end
@@ -1174,7 +1190,7 @@ module RDF::RDFa
1174
1190
  add_debug(element, "[Step 11] value literal (#{attrs[:value]})")
1175
1191
  v = attrs[:value].to_s
1176
1192
  # Figure it out by parsing
1177
- dt_lit = %w(Integer Float Double).map {|t| RDF::Literal.const_get(t)}.detect do |dt|
1193
+ dt_lit = %w(Integer Decimal Double).map {|t| RDF::Literal.const_get(t)}.detect do |dt|
1178
1194
  v.match(dt::GRAMMAR)
1179
1195
  end || RDF::Literal
1180
1196
  dt_lit.new(v)
@@ -280,7 +280,7 @@ module RDF::RDFa
280
280
  # Document errors
281
281
  def doc_errors
282
282
  # FIXME: Nokogiri version 1.5.5 thinks many HTML5 elements are invalid
283
- @doc.errors.reject {|e| e.to_s =~ /(Tag (?:article|aside|audio|canvas|command|data|datalist|details|embed|figure|footer|header|hgroup|keygen|main|mark|meter|nav|output|progress|ruby|section|source|time|track|video|wbr) invalid|Missing attribute name)/}
283
+ @doc.errors.reject {|e| e.to_s =~ /(Tag (?:article|aside|audio|canvas|command|datalist|details|embed|figcaption|figure|footer|header|hgroup|keygen|main|mark|meter|nav|output|progress|ruby|section|time|video|wbr) invalid|Missing attribute name)/}
284
284
  end
285
285
 
286
286
  ##
@@ -49,6 +49,7 @@ module RDF::RDFa
49
49
  # @author [Gregg Kellogg](http://kellogg-assoc.com/)
50
50
  class Writer < RDF::Writer
51
51
  format RDF::RDFa::Format
52
+ include RDF::Util::Logger
52
53
 
53
54
  # Defines rdf:type of subjects to be emitted at the beginning of the document.
54
55
  # @return [Array<URI>]
@@ -62,8 +63,9 @@ module RDF::RDFa
62
63
  # @return [Array<URI>]
63
64
  attr :heading_predicates
64
65
 
65
- # to preserve whitespace without using entities
66
- HAML_OPTIONS = Gem.loaded_specs['haml'].version < Gem::Version.create('5.0') ? { ugly: false } : {}
66
+ HAML_OPTIONS = {
67
+ ugly: false, # to preserve whitespace without using entities
68
+ }
67
69
 
68
70
  # @return [Graph] Graph of statements serialized
69
71
  attr_accessor :graph
@@ -71,6 +73,19 @@ module RDF::RDFa
71
73
  # @return [RDF::URI] Base URI used for relativizing URIs
72
74
  attr_accessor :base_uri
73
75
 
76
+ ##
77
+ # RDFa Writer options
78
+ # @see http://www.rubydoc.info/github/ruby-rdf/rdf/RDF/Writer#options-class_method
79
+ def self.options
80
+ super + [
81
+ RDF::CLI::Option.new(
82
+ symbol: :lang,
83
+ datatype: String,
84
+ on: ["--lang"],
85
+ description: "Output as root @lang attribute, and avoid generation _@lang_ where possible."),
86
+ ]
87
+ end
88
+
74
89
  ##
75
90
  # Initializes the RDFa writer instance.
76
91
  #
@@ -124,25 +139,6 @@ module RDF::RDFa
124
139
  end
125
140
  end
126
141
 
127
- ##
128
- # Write whole graph
129
- #
130
- # @param [Graph] graph
131
- # @return [void]
132
- def write_graph(graph)
133
- @graph = graph
134
- end
135
-
136
- ##
137
- # Addes a statement to be serialized
138
- # @param [RDF::Statement] statement
139
- # @return [void]
140
- # @raise [RDF::WriterError] if validating and attempting to write an invalid {RDF::Term}.
141
- def write_statement(statement)
142
- raise RDF::WriterError, "Statement #{statement.inspect} is invalid" if validate? && statement.invalid?
143
- @graph.insert(statement)
144
- end
145
-
146
142
  ##
147
143
  # Addes a triple to be serialized
148
144
  # @param [RDF::Resource] subject
@@ -153,7 +149,7 @@ module RDF::RDFa
153
149
  # @abstract
154
150
  # @raise [RDF::WriterError] if validating and attempting to write an invalid {RDF::Term}.
155
151
  def write_triple(subject, predicate, object)
156
- write_statement Statement.new(subject, predicate, object)
152
+ @graph.insert(RDF::Statement(subject, predicate, object))
157
153
  end
158
154
 
159
155
  ##
@@ -163,16 +159,15 @@ module RDF::RDFa
163
159
  def write_epilogue
164
160
  @base_uri = RDF::URI(@options[:base_uri]) if @options[:base_uri]
165
161
  @lang = @options[:lang]
166
- @debug = @options[:debug]
167
162
  self.reset
168
163
 
169
- add_debug {"\nserialize: graph size: #{@graph.size}"}
164
+ log_debug {"\nserialize: graph size: #{@graph.size}"}
170
165
 
171
166
  preprocess
172
167
 
173
168
  # Prefixes
174
169
  prefix = prefixes.keys.map {|pk| "#{pk}: #{prefixes[pk]}"}.sort.join(" ") unless prefixes.empty?
175
- add_debug {"\nserialize: prefixes: #{prefix.inspect}"}
170
+ log_debug {"\nserialize: prefixes: #{prefix.inspect}"}
176
171
 
177
172
  subjects = order_subjects
178
173
 
@@ -196,6 +191,8 @@ module RDF::RDFa
196
191
  subject(s)
197
192
  end
198
193
  @output.write(doc)
194
+
195
+ super
199
196
  end
200
197
 
201
198
  protected
@@ -307,7 +304,7 @@ module RDF::RDFa
307
304
  # @return String
308
305
  # The rendered document is returned as a string
309
306
  def render_property(predicate, objects, options = {}, &block)
310
- add_debug {"render_property(#{predicate}): #{objects.inspect}, #{options.inspect}"}
307
+ log_debug {"render_property(#{predicate}): #{objects.inspect}, #{options.inspect}"}
311
308
  # If there are multiple objects, and no :property_values is defined, call recursively with
312
309
  # each object
313
310
 
@@ -317,19 +314,19 @@ module RDF::RDFa
317
314
  # Separate out the objects which are lists and render separately
318
315
  list_objects = objects.reject do |o|
319
316
  o == RDF.nil ||
320
- (l = RDF::List.new(o, @graph)).invalid?
317
+ (l = RDF::List.new(subject: o, graph: @graph)).invalid?
321
318
  end
322
319
  unless list_objects.empty?
323
320
  # Render non-list objects
324
- add_debug {"properties with lists: #{list_objects} non-lists: #{objects - list_objects}"}
325
- nl = depth {render_property(predicate, objects - list_objects, options, &block)} unless objects == list_objects
321
+ log_debug {"properties with lists: #{list_objects} non-lists: #{objects - list_objects}"}
322
+ nl = log_depth {render_property(predicate, objects - list_objects, options, &block)} unless objects == list_objects
326
323
  return nl.to_s + list_objects.map do |object|
327
324
  # Render each list as multiple properties and set :inlist to true
328
- list = RDF::List.new(object, @graph)
325
+ list = RDF::List.new(subject: object, graph: @graph)
329
326
  list.each_statement {|st| subject_done(st.subject)}
330
327
 
331
- add_debug {"list: #{list.inspect} #{list.to_a}"}
332
- depth do
328
+ log_debug {"list: #{list.inspect} #{list.to_a}"}
329
+ log_depth do
333
330
  render_property(predicate, list.to_a, options.merge(inlist: "true")) do |object|
334
331
  yield(object, true) if block_given?
335
332
  end
@@ -340,10 +337,10 @@ module RDF::RDFa
340
337
  if objects.length > 1 && template.nil?
341
338
  # If there is no property_values template, render each property using property_value template
342
339
  objects.map do |object|
343
- depth {render_property(predicate, [object], options, &block)}
340
+ log_depth {render_property(predicate, [object], options, &block)}
344
341
  end.join(" ")
345
342
  else
346
- raise RDF::WriterError, "Missing property template" if template.nil?
343
+ log_fatal("Missing property template", exception: RDF::WriterError) if template.nil?
347
344
 
348
345
  template = options[:haml] || (
349
346
  objects.to_a.length > 1 &&
@@ -410,7 +407,7 @@ module RDF::RDFa
410
407
  select {|s| !seen.include?(s)}.
411
408
  each do |class_uri|
412
409
  graph.query(predicate: RDF.type, object: class_uri).map {|st| st.subject}.sort.uniq.each do |subject|
413
- #add_debug {"order_subjects: #{subject.inspect}"}
410
+ #log_debug {"order_subjects: #{subject.inspect}"}
414
411
  subjects << subject
415
412
  seen[subject] = true
416
413
  end
@@ -422,7 +419,7 @@ module RDF::RDFa
422
419
  map {|r| [r.is_a?(RDF::Node) ? 1 : 0, ref_count(r), r]}.
423
420
  sort
424
421
 
425
- add_debug {"order_subjects: #{recursable.inspect}"}
422
+ log_debug {"order_subjects: #{recursable.inspect}"}
426
423
 
427
424
  subjects += recursable.map{|r| r.last}
428
425
  end
@@ -446,7 +443,7 @@ module RDF::RDFa
446
443
  prop_list << prop.to_s
447
444
  end
448
445
 
449
- add_debug {"order_properties: #{prop_list.join(', ')}"}
446
+ log_debug {"order_properties: #{prop_list.join(', ')}"}
450
447
  prop_list
451
448
  end
452
449
 
@@ -454,7 +451,7 @@ module RDF::RDFa
454
451
  # @param [RDF::Statement] statement
455
452
  # @return [ignored]
456
453
  def preprocess_statement(statement)
457
- #add_debug {"preprocess: #{statement.inspect}"}
454
+ #log_debug {"preprocess: #{statement.inspect}"}
458
455
  bump_reference(statement.object)
459
456
  @subjects[statement.subject] = true
460
457
  get_curie(statement.subject)
@@ -465,7 +462,7 @@ module RDF::RDFa
465
462
 
466
463
  # Reset parser to run again
467
464
  def reset
468
- @depth = 0
465
+ @options[:log_depth] = 0
469
466
  prefixes = {}
470
467
  @references = {}
471
468
  @serialized = {}
@@ -502,7 +499,7 @@ module RDF::RDFa
502
499
  typeof = type_of(properties.delete(RDF.type.to_s), subject)
503
500
  prop_list = order_properties(properties)
504
501
 
505
- add_debug {"props: #{prop_list.inspect}"}
502
+ log_debug {"props: #{prop_list.inspect}"}
506
503
 
507
504
  render_opts = {typeof: typeof, property_values: properties}.merge(options)
508
505
 
@@ -539,7 +536,7 @@ module RDF::RDFa
539
536
  # Nodes without a curie need a blank @typeof to generate a subject
540
537
  typeof ||= "" unless curie
541
538
 
542
- add_debug {"subject: #{curie.inspect}, typeof: #{typeof.inspect}" }
539
+ log_debug {"subject: #{curie.inspect}, typeof: #{typeof.inspect}" }
543
540
 
544
541
  typeof.freeze
545
542
  end
@@ -552,17 +549,17 @@ module RDF::RDFa
552
549
  # See if there's a template based on the sorted concatenation of all types of this subject
553
550
  # or any type of this subject
554
551
  tmpl = find_template(subject)
555
- add_debug {"subject: found template #{tmpl[:identifier] || tmpl.inspect}"} if tmpl
552
+ log_debug {"subject: found template #{tmpl[:identifier] || tmpl.inspect}"} if tmpl
556
553
 
557
554
  # Render this subject
558
555
  # If :rel is specified and :typeof is nil, use @resource instead of @about.
559
556
  # Pass other options from calling context
560
557
  with_template(tmpl) do
561
558
  render_subject(subject, prop_list, render_opts) do |pred|
562
- depth do
559
+ log_depth do
563
560
  pred = RDF::URI(pred) if pred.is_a?(String)
564
561
  values = render_opts[:property_values][pred.to_s]
565
- add_debug {"subject: #{get_curie(subject)}, pred: #{get_curie(pred)}, values: #{values.inspect}"}
562
+ log_debug {"subject: #{get_curie(subject)}, pred: #{get_curie(pred)}, values: #{values.inspect}"}
566
563
  predicate(pred, values)
567
564
  end
568
565
  end
@@ -578,15 +575,15 @@ module RDF::RDFa
578
575
  # Objects to serialize
579
576
  # @return [String]
580
577
  def predicate(predicate, objects)
581
- add_debug {"predicate: #{predicate.inspect}, objects: #{objects}"}
578
+ log_debug {"predicate: #{predicate.inspect}, objects: #{objects}"}
582
579
 
583
580
  return if objects.to_a.empty?
584
581
 
585
- add_debug {"predicate: #{get_curie(predicate)}"}
582
+ log_debug {"predicate: #{get_curie(predicate)}"}
586
583
  render_property(predicate, objects) do |o, inlist=nil|
587
584
  # Yields each object, for potential recursive definition.
588
585
  # If nil is returned, a leaf is produced
589
- depth {subject(o, rel: get_curie(predicate), inlist: inlist, element: (:li if objects.length > 1 || inlist))} if !is_done?(o) && @subjects.include?(o)
586
+ log_depth {subject(o, rel: get_curie(predicate), inlist: inlist, element: (:li if objects.length > 1 || inlist))} if !is_done?(o) && @subjects.include?(o)
590
587
  end
591
588
  end
592
589
 
@@ -596,8 +593,12 @@ module RDF::RDFa
596
593
  # @return [String, nil]
597
594
  # @raise [RDF::WriterError]
598
595
  def get_dt_curie(literal)
599
- raise RDF::WriterError, "Getting datatype CURIE for #{literal.inspect}, which must be a literal" unless literal.is_a?(RDF::Literal)
600
- get_curie(literal.datatype) if literal.literal? && literal.datatype?
596
+ if literal.is_a?(RDF::Literal)
597
+ get_curie(literal.datatype) if literal.literal? && literal.datatype?
598
+ else
599
+ log_error("Getting datatype CURIE for #{literal.inspect}, which must be a literal")
600
+ nil
601
+ end
601
602
  end
602
603
 
603
604
  # Haml rendering helper. Return language for plain literal, if there is no language, or it is the same as the document, return nil
@@ -606,8 +607,12 @@ module RDF::RDFa
606
607
  # @return [Symbol, nil]
607
608
  # @raise [RDF::WriterError]
608
609
  def get_lang(literal)
609
- raise RDF::WriterError, "Getting datatype CURIE for #{literal.inspect}, which must be a literal" unless literal.is_a?(RDF::Literal)
610
- literal.language if literal.literal? && literal.language && literal.language.to_s != @lang.to_s
610
+ if literal.is_a?(RDF::Literal)
611
+ literal.language if literal.literal? && literal.language && literal.language.to_s != @lang.to_s
612
+ else
613
+ log_error("Getting language for #{literal.inspect}, which must be a literal")
614
+ nil
615
+ end
611
616
  end
612
617
 
613
618
  # Haml rendering helper. Data to be added to a @content value, for specific datatypes
@@ -616,21 +621,28 @@ module RDF::RDFa
616
621
  # @return [String, nil]
617
622
  # @raise [RDF::WriterError]
618
623
  def get_content(literal)
619
- raise RDF::WriterError, "Getting content for #{literal.inspect}, which must be a literal" unless literal.is_a?(RDF::Literal)
620
624
  case literal
621
625
  when RDF::Literal::Date, RDF::Literal::Time, RDF::Literal::DateTime, RDF::Literal::Duration
622
626
  literal.to_s
627
+ when RDF::Literal then nil
628
+ else
629
+ log_error("Getting content for #{literal.inspect}, which must be a literal")
630
+ nil
623
631
  end
624
632
  end
625
633
 
626
- # Haml rendering helper. Display value for object, may be humanized into a non-canonical form
634
+ # Haml rendering helper. Display value for object, may be humanized into a non-canonical form
627
635
  #
628
636
  # @param [RDF::Literal] literal
629
637
  # @return [String]
630
638
  # @raise [RDF::WriterError]
631
639
  def get_value(literal)
632
- raise RDF::WriterError, "Getting value for #{literal.inspect}, which must be a literal" unless literal.is_a?(RDF::Literal)
633
- literal.humanize
640
+ if literal.is_a?(RDF::Literal)
641
+ literal.humanize
642
+ else
643
+ log_error("Getting value for #{literal.inspect}, which must be a literal")
644
+ nil
645
+ end
634
646
  end
635
647
 
636
648
  # Haml rendering helper. Return an appropriate label for a resource.
@@ -639,8 +651,12 @@ module RDF::RDFa
639
651
  # @return [String]
640
652
  # @raise [RDF::WriterError]
641
653
  def get_predicate_name(resource)
642
- raise RDF::WriterError, "Getting predicate name for #{resource.inspect}, which must be a resource" unless resource.is_a?(RDF::Resource)
643
- get_curie(resource)
654
+ if resource.is_a?(RDF::URI)
655
+ get_curie(resource)
656
+ else
657
+ log_error("Getting predicate name for #{resource.inspect}, which must be a URI")
658
+ nil
659
+ end
644
660
  end
645
661
 
646
662
  # Haml rendering helper. Return appropriate, term, CURIE or URI for the given resource.
@@ -649,42 +665,50 @@ module RDF::RDFa
649
665
  # @return [String] value to use to identify URI
650
666
  # @raise [RDF::WriterError]
651
667
  def get_curie(resource)
652
- raise RDF::WriterError, "Getting CURIE for #{resource.inspect}, which must be an RDF value" unless resource.is_a?(RDF::Value)
653
- return resource.to_s unless resource.uri?
668
+ case resource
669
+ when RDF::URI
670
+ begin
671
+ uri = resource.to_s
672
+
673
+ curie = case
674
+ when @uri_to_term_or_curie.has_key?(uri)
675
+ log_debug {"get_curie(#{uri}): uri_to_term_or_curie #{@uri_to_term_or_curie[uri].inspect}"}
676
+ return @uri_to_term_or_curie[uri]
677
+ when base_uri && uri.index(base_uri.to_s) == 0
678
+ log_debug {"get_curie(#{uri}): base_uri (#{uri.sub(base_uri.to_s, "")})"}
679
+ uri.sub(base_uri.to_s, "")
680
+ when @vocabulary && uri.index(@vocabulary) == 0
681
+ log_debug {"get_curie(#{uri}): vocabulary"}
682
+ uri.sub(@vocabulary, "")
683
+ when u = @uri_to_prefix.keys.detect {|u| uri.index(u.to_s) == 0}
684
+ log_debug {"get_curie(#{uri}): uri_to_prefix"}
685
+ # Use a defined prefix
686
+ prefix = @uri_to_prefix[u]
687
+ prefix(prefix, u) # Define for output
688
+ uri.sub(u.to_s, "#{prefix}:")
689
+ when @options[:standard_prefixes] && vocab = RDF::Vocabulary.detect {|v| uri.index(v.to_uri.to_s) == 0}
690
+ log_debug {"get_curie(#{uri}): standard_prefixes"}
691
+ prefix = vocab.__name__.to_s.split('::').last.downcase
692
+ prefix(prefix, vocab.to_uri) # Define for output
693
+ uri.sub(vocab.to_uri.to_s, "#{prefix}:")
694
+ else
695
+ log_debug {"get_curie(#{uri}): none"}
696
+ uri
697
+ end
654
698
 
655
- uri = resource.to_s
699
+ #log_debug {"get_curie(#{resource}) => #{curie}"}
656
700
 
657
- curie = case
658
- when @uri_to_term_or_curie.has_key?(uri)
659
- add_debug {"get_curie(#{uri}): uri_to_term_or_curie #{@uri_to_term_or_curie[uri].inspect}"}
660
- return @uri_to_term_or_curie[uri]
661
- when base_uri && uri.index(base_uri.to_s) == 0
662
- add_debug {"get_curie(#{uri}): base_uri (#{uri.sub(base_uri.to_s, "")})"}
663
- uri.sub(base_uri.to_s, "")
664
- when @vocabulary && uri.index(@vocabulary) == 0
665
- add_debug {"get_curie(#{uri}): vocabulary"}
666
- uri.sub(@vocabulary, "")
667
- when u = @uri_to_prefix.keys.detect {|u| uri.index(u.to_s) == 0}
668
- add_debug {"get_curie(#{uri}): uri_to_prefix"}
669
- # Use a defined prefix
670
- prefix = @uri_to_prefix[u]
671
- prefix(prefix, u) # Define for output
672
- uri.sub(u.to_s, "#{prefix}:")
673
- when @options[:standard_prefixes] && vocab = RDF::Vocabulary.detect {|v| uri.index(v.to_uri.to_s) == 0}
674
- add_debug {"get_curie(#{uri}): standard_prefixes"}
675
- prefix = vocab.__name__.to_s.split('::').last.downcase
676
- prefix(prefix, vocab.to_uri) # Define for output
677
- uri.sub(vocab.to_uri.to_s, "#{prefix}:")
701
+ @uri_to_term_or_curie[uri] = curie
702
+ rescue ArgumentError => e
703
+ log_error("Invalid URI #{uri.inspect}: #{e.message}")
704
+ nil
705
+ end
706
+ when RDF::Node then resource.to_s
707
+ when RDF::Literal then nil
678
708
  else
679
- add_debug {"get_curie(#{uri}): none"}
680
- uri
709
+ log_error("Getting CURIE for #{resource.inspect}, which must be a resource")
710
+ nil
681
711
  end
682
-
683
- #add_debug {"get_curie(#{resource}) => #{curie}"}
684
-
685
- @uri_to_term_or_curie[uri] = curie
686
- rescue ArgumentError => e
687
- raise RDF::WriterError, "Invalid URI #{uri.inspect}: #{e.message}"
688
712
  end
689
713
  private
690
714
 
@@ -700,18 +724,6 @@ module RDF::RDFa
700
724
  CGI.escapeHTML(str).gsub(/[\n\r]/) {|c| '&#x' + c.unpack('h').first + ';'}
701
725
  end
702
726
 
703
- # Increase depth around a method invocation
704
- # @yield
705
- # Yields with no arguments
706
- # @yieldreturn [Object] returns the result of yielding
707
- # @return [Object]
708
- def depth
709
- @depth += 1
710
- ret = yield
711
- @depth -= 1
712
- ret
713
- end
714
-
715
727
  # Set the template to use within block
716
728
  # @param [Hash{Symbol => String}] templ template to use for block evaluation; merged in with the existing template.
717
729
  # @yield
@@ -743,20 +755,22 @@ module RDF::RDFa
743
755
  # @return [String]
744
756
  # @raise [RDF::WriterError]
745
757
  def hamlify(template, locals = {})
746
- add_debug {"hamlify template: #{template}"}
758
+ log_debug {"hamlify template: #{template}"}
747
759
  template = haml_template[template] if template.is_a?(Symbol)
748
760
 
749
761
  template = template.align_left
750
- add_debug {"hamlify locals: #{locals.inspect}"}
762
+ log_debug {"hamlify locals: #{locals.inspect}"}
751
763
 
752
764
  Haml::Engine.new(template, @options[:haml_options] || HAML_OPTIONS).render(self, locals) do |*args|
753
765
  yield(*args) if block_given?
754
766
  end
755
767
  rescue Haml::Error => e
756
- raise RDF::WriterError, "#{e.inspect}\n" +
768
+ log_fatal("#{e.inspect}\n" +
757
769
  "rendering #{template}\n" +
758
770
  "with options #{(@options[:haml_options] || HAML_OPTIONS).inspect}\n" +
759
- "and locals #{locals.inspect}"
771
+ "and locals #{locals.inspect}",
772
+ exception: RDF::WriterError
773
+ )
760
774
  end
761
775
 
762
776
  ##
@@ -794,18 +808,6 @@ module RDF::RDFa
794
808
  def ref_count(node)
795
809
  @references.fetch(node, 0)
796
810
  end
797
-
798
- # Add debug event to debug array, if specified
799
- #
800
- # @param [String] message
801
- # @yieldreturn [String] appended to message, to allow for lazy-evaulation of message
802
- def add_debug(message = "")
803
- return unless ::RDF::RDFa.debug? || @debug
804
- message = message + yield if block_given?
805
- msg = "#{' ' * @depth}#{message}"
806
- STDERR.puts msg if ::RDF::RDFa.debug?
807
- @debug << msg.force_encoding("utf-8") if @debug.is_a?(Array)
808
- end
809
811
  end
810
812
  end
811
813