rdf-rdfa 1.0.3 → 1.1.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.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NGNkNDNjNTFhOGVmMTM1ZjY0OTgxNzVlOGU2NmJiOTU0ZTU2ZTkyMw==
5
- data.tar.gz: !binary |-
6
- YzEzZGE3MThjNDhkZDE2NWY4MGRlN2MxY2I5NGQ0YWQ0ZWExYjk3ZA==
7
- !binary "U0hBNTEy":
8
- metadata.gz: !binary |-
9
- ZjE0YjkwNTI4ZGFkOWVmZjkyY2Y1ODBkYjQ3OWRmYTUyOTI3MzdjMTg4M2Ey
10
- ZjY0NDg0ZTEyNTU3YTQyYjZkOWEzY2VmMjY5ZDI4YWFkODI5NTlkZTE5OGRm
11
- MGY4YWI4ZjNjNmNiYWUzZDcwMzhlZmEyNDAwM2I5YTRhMWYzODg=
12
- data.tar.gz: !binary |-
13
- YjUyNmVjMTZkNTY0MjA3ZWQ1YTVmZGUyZjgxYWZlYWM3ZGEyZTcxZjA2ZmJh
14
- YjMwMWEyY2YyOTE4YjFmZjI2NTBhMDNjZDY5ZjI1OTdlMDQwMTRkOGU1MzA1
15
- OTM5YTc5OTYwNjcwOTAyMjI2OGFkNTY3OTIwYmMxYjAyY2NkZWE=
2
+ SHA1:
3
+ metadata.gz: 25263c074d89ac953e6d510f14cfc79decf2488d
4
+ data.tar.gz: 82285470e7f772da635a4def20ef9b088150d6b4
5
+ SHA512:
6
+ metadata.gz: ea526b09ce230b681d1240e50516d0a30687f2192f98d8b850350648746c35f320dd41c7593d7af34ce6551299d9485d143396de3facf61c941ace1fa648b27d
7
+ data.tar.gz: c0358eb529b5401e229315a7168636912f49b8522b78773ece8f72360043e1d445d227a986048c13c06567c45fc1579c1cf6f1689963bb4975ad86ad94a206c5
data/README CHANGED
@@ -1,3 +1,4 @@
1
+ This repository uses [Git Flow](https://github.com/nvie/gitflow) to mange development and release activity. All submissions _must_ be on a feature branch based on the _develop_ branch to ease staging and integration.
1
2
  # RDF::RDFa reader/writer
2
3
 
3
4
  [RDFa][RDFa 1.1 Core] parser for RDF.rb.
@@ -387,8 +388,8 @@ The template hash defines four Haml templates:
387
388
  }
388
389
 
389
390
  ## Dependencies
390
- * [Ruby](http://ruby-lang.org/) (>= 1.9) or (>= 1.8.7 with [Backports][])
391
- * [RDF.rb](http://rubygems.org/gems/rdf) (>= 1.0)
391
+ * [Ruby](http://ruby-lang.org/) (>= 1.9.3)
392
+ * [RDF.rb](http://rubygems.org/gems/rdf) (>= 1.1)
392
393
  * [Haml](https://rubygems.org/gems/haml) (>= 4.0)
393
394
  * [HTMLEntities](https://rubygems.org/gems/htmlentities) ('>= 4.3.1')
394
395
  * Soft dependency on [Nokogiri](http://rubygems.org/gems/nokogiri) (>= 1.5.9)
@@ -414,7 +415,6 @@ Full documentation available on [Rubydoc.info][RDFa doc]
414
415
  ### Additional vocabularies
415
416
  * {RDF::PTR}
416
417
  * {RDF::RDFA}
417
- * {RDF::XHV}
418
418
  * {RDF::XML}
419
419
  * {RDF::XSI}
420
420
 
@@ -438,6 +438,7 @@ Full documentation available on [Rubydoc.info][RDFa doc]
438
438
  * [Nicholas Humfrey](http://github.com/njh) - <http://njh.me/>
439
439
 
440
440
  ## Contributing
441
+ This repository uses [Git Flow](https://github.com/nvie/gitflow) to mange development and release activity. All submissions _must_ be on a feature branch based on the _develop_ branch to ease staging and integration.
441
442
 
442
443
  * Do your best to adhere to the existing coding conventions and idioms.
443
444
  * Don't use hard tabs, and don't leave trailing whitespace on any line.
@@ -458,7 +459,7 @@ see <http://unlicense.org/> or the accompanying {file:UNLICENSE} file.
458
459
 
459
460
  ## FEEDBACK
460
461
 
461
- * gregg@kellogg-assoc.com
462
+ * gregg@greggkellogg.net
462
463
  * <http://rubygems.org/rdf-rdfa>
463
464
  * <http://github.com/ruby-rdf/rdf-rdfa>
464
465
  * <http://lists.w3.org/Archives/Public/public-rdf-ruby/>
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.3
1
+ 1.1.0
@@ -92,7 +92,7 @@ module RDF::RDFa
92
92
  context.parse(repository.query(:context => uri))
93
93
  end
94
94
  rescue Exception => e
95
- raise ContextError, "Context #{uri}: #{e.message}"
95
+ raise ContextError, "Context #{uri}: #{e.message}", e.backtrace
96
96
  end
97
97
 
98
98
  # Load context into repository
@@ -1,5 +1,4 @@
1
1
  begin
2
- raise LoadError, "not with java" if RUBY_PLATFORM == "java"
3
2
  require 'nokogiri'
4
3
  rescue LoadError => e
5
4
  :rexml
@@ -290,7 +289,7 @@ module RDF::RDFa
290
289
  @library = case options[:library]
291
290
  when nil
292
291
  # Use Nokogiri when available, and REXML otherwise:
293
- (defined?(::Nokogiri) && RUBY_PLATFORM != 'java') ? :nokogiri : :rexml
292
+ defined?(::Nokogiri) ? :nokogiri : :rexml
294
293
  when :nokogiri, :rexml
295
294
  options[:library]
296
295
  else
@@ -404,7 +403,7 @@ module RDF::RDFa
404
403
  require 'rdf/microdata'
405
404
  add_debug(@doc, "process microdata")
406
405
  @repository << RDF::Microdata::Reader.new(@doc, options)
407
- rescue
406
+ rescue LoadError
408
407
  add_debug(@doc, "microdata detected, not processed")
409
408
  end
410
409
  end
@@ -566,15 +565,23 @@ module RDF::RDFa
566
565
  each do |uri|
567
566
  # Don't try to open ourselves!
568
567
  if base_uri == uri
569
- add_debug(root) {"load_initial_contexts: skip recursive context <#{uri}>"}
568
+ add_debug(root) {"load_initial_contexts: skip recursive context #{uri.to_base}"}
570
569
  next
571
570
  end
572
571
 
573
572
  old_debug = RDF::RDFa.debug?
574
573
  begin
575
- add_info(root, "load_initial_contexts: load <#{uri}>")
574
+ add_info(root, "load_initial_contexts: load #{uri.to_base}")
576
575
  RDF::RDFa.debug = false
577
576
  context = Context.find(uri)
577
+
578
+ # Add URI Mappings to prefixes
579
+ context.prefixes.each_pair do |prefix, value|
580
+ prefix(prefix, value)
581
+ end
582
+ yield :uri_mappings, context.prefixes unless context.prefixes.empty?
583
+ yield :term_mappings, context.terms unless context.terms.empty?
584
+ yield :default_vocabulary, context.vocabulary if context.vocabulary
578
585
  rescue Exception => e
579
586
  RDF::RDFa.debug = old_debug
580
587
  add_error(root, e.message)
@@ -582,14 +589,6 @@ module RDF::RDFa
582
589
  ensure
583
590
  RDF::RDFa.debug = old_debug
584
591
  end
585
-
586
- # Add URI Mappings to prefixes
587
- context.prefixes.each_pair do |prefix, value|
588
- prefix(prefix, value)
589
- end
590
- yield :uri_mappings, context.prefixes unless context.prefixes.empty?
591
- yield :term_mappings, context.terms unless context.terms.empty?
592
- yield :default_vocabulary, context.vocabulary if context.vocabulary
593
592
  end
594
593
  end
595
594
 
@@ -614,13 +613,14 @@ module RDF::RDFa
614
613
  next unless attr =~ /^xmlns(?:\:(.+))?/
615
614
  prefix = $1
616
615
  add_debug("extract_mappings") { "ns(attr): #{prefix}: #{href}"}
617
- ns_defs[prefix] = href.to_s
616
+ ns_defs[prefix] = href
618
617
  end
619
618
  end
620
619
 
621
620
  ns_defs.each do |prefix, href|
622
621
  # A Conforming RDFa Processor must ignore any definition of a mapping for the '_' prefix.
623
622
  next if prefix == "_"
623
+ href = uri(base_uri, href).to_s
624
624
 
625
625
  # Downcase prefix for RDFa 1.1
626
626
  pfx_lc = (@version == :"rdfa1.0" || prefix.nil?) ? prefix : prefix.downcase
@@ -644,17 +644,18 @@ module RDF::RDFa
644
644
  mappings = element.attribute("prefix").to_s.strip.split(/\s+/)
645
645
  while mappings.length > 0 do
646
646
  prefix, uri = mappings.shift.downcase, mappings.shift
647
- #puts "uri_mappings prefix #{prefix} <#{uri}>"
647
+ #puts "uri_mappings prefix #{prefix} #{uri.to_base}"
648
648
  next unless prefix.match(/:$/)
649
649
  prefix.chop!
650
650
 
651
- unless prefix.match(NC_REGEXP)
651
+ unless prefix.empty? || prefix.match(NC_REGEXP)
652
652
  add_error(element, "extract_mappings: Prefix #{prefix.inspect} does not match NCName production")
653
653
  next
654
654
  end
655
655
 
656
656
  # A Conforming RDFa Processor must ignore any definition of a mapping for the '_' prefix.
657
657
  next if prefix == "_"
658
+ uri = uri(base_uri, uri).to_s
658
659
 
659
660
  pfx_index = prefix.to_s.empty? ? nil : prefix.to_s.to_sym
660
661
  if uri_mappings.fetch(pfx_index, uri) != uri
@@ -1090,7 +1091,7 @@ module RDF::RDFa
1090
1091
  when datatype && ![RDF.XMLLiteral, RDF.HTML].include?(datatype)
1091
1092
  # typed literal
1092
1093
  add_debug(element, "[Step 11] typed literal (#{datatype})")
1093
- RDF::Literal.new(attrs[:datetime] || attrs[:content] || element.inner_text.to_s, :datatype => datatype, :validate => validate?, :canonicalize => canonicalize?)
1094
+ RDF::Literal.new(attrs[:content] || attrs[:datetime] || element.inner_text.to_s, :datatype => datatype, :validate => validate?, :canonicalize => canonicalize?)
1094
1095
  when @version == :"rdfa1.1"
1095
1096
  case
1096
1097
  when datatype == RDF.XMLLiteral
@@ -1144,7 +1145,7 @@ module RDF::RDFa
1144
1145
  when element.name == 'time'
1145
1146
  # HTML5 support
1146
1147
  # Lexically scan value and assign appropriate type, otherwise, leave untyped
1147
- v = (attrs[:datetime] || element.inner_text).to_s
1148
+ v = (attrs[:content] || attrs[:datetime] || element.inner_text).to_s
1148
1149
  datatype = %w(Date Time DateTime Year YearMonth Duration).map {|t| RDF::Literal.const_get(t)}.detect do |dt|
1149
1150
  v.match(dt::GRAMMAR)
1150
1151
  end || RDF::Literal
@@ -1334,7 +1335,7 @@ module RDF::RDFa
1334
1335
  # value must be ignored.
1335
1336
  uri = curie_to_resource_or_bnode(element, $1, options[:uri_mappings], evaluation_context.parent_subject, restrictions)
1336
1337
  if uri
1337
- add_debug(element) {"process_uri: #{value} => safeCURIE => <#{uri}>"}
1338
+ add_debug(element) {"process_uri: #{value} => safeCURIE => #{uri.to_base}"}
1338
1339
  else
1339
1340
  add_warning(element, "#{value} not matched as a safeCURIE", RDF::RDFA.UnresolvedCURIE)
1340
1341
  end
@@ -1344,7 +1345,7 @@ module RDF::RDFa
1344
1345
  # If the value is an NCName, then it is evaluated as a term according to General Use of Terms in
1345
1346
  # Attributes. Note that this step may mean that the value is to be ignored.
1346
1347
  uri = process_term(element, value.to_s, options)
1347
- add_debug(element) {"process_uri: #{value} => term => <#{uri}>"}
1348
+ add_debug(element) {"process_uri: #{value} => term => #{uri ? uri.to_base : 'nil'}"}
1348
1349
  uri
1349
1350
  else
1350
1351
  # SafeCURIEorCURIEorIRI or TERMorCURIEorAbsIRI
@@ -1352,35 +1353,33 @@ module RDF::RDFa
1352
1353
  # If it is a valid CURIE, the resulting URI is used; otherwise, the value will be processed as a URI.
1353
1354
  uri = curie_to_resource_or_bnode(element, value, options[:uri_mappings], evaluation_context.parent_subject, restrictions)
1354
1355
  if uri
1355
- add_debug(element) {"process_uri: #{value} => CURIE => <#{uri}>"}
1356
+ add_debug(element) {"process_uri: #{value} => CURIE => #{uri.to_base}"}
1356
1357
  elsif @version == :"rdfa1.0" && value.to_s.match(/^xml/i)
1357
1358
  # Special case to not allow anything starting with XML to be treated as a URI
1358
1359
  elsif restrictions.include?(:absuri) || restrictions.include?(:uri)
1359
- begin
1360
- # AbsURI does not use xml:base
1361
- if restrictions.include?(:absuri)
1362
- uri = uri(value)
1363
- unless uri.absolute?
1364
- uri = nil
1365
- add_warning(element, "Malformed IRI #{uri.inspect}")
1366
- end
1367
- else
1368
- uri = uri(base, value)
1369
- end
1370
- rescue ArgumentError => e
1371
- add_warning(element, "Malformed IRI #{value}")
1372
- rescue RDF::ReaderError => e
1373
- add_debug(element, e.message)
1374
- if value.to_s =~ /^\(^\w\):/
1375
- add_warning(element, "Undefined prefix #{$1}")
1376
- else
1377
- add_warning(element, "Relative URI #{value}")
1360
+ # AbsURI does not use xml:base
1361
+ if restrictions.include?(:absuri)
1362
+ uri = uri(value)
1363
+ unless uri.absolute?
1364
+ uri = nil
1365
+ add_warning(element, "Malformed IRI #{uri.inspect}")
1378
1366
  end
1367
+ else
1368
+ uri = uri(base, value)
1379
1369
  end
1380
- add_debug(element) {"process_uri: #{value} => URI => <#{uri}>"}
1370
+ add_debug(element) {"process_uri: #{value} => URI => #{uri ? uri.to_base : nil}"}
1381
1371
  end
1382
1372
  uri
1383
1373
  end
1374
+ rescue ArgumentError => e
1375
+ add_warning(element, "Malformed IRI #{value}")
1376
+ rescue RDF::ReaderError => e
1377
+ add_debug(element, e.message)
1378
+ if value.to_s =~ /^\(^\w\):/
1379
+ add_warning(element, "Undefined prefix #{$1}")
1380
+ else
1381
+ add_warning(element, "Relative URI #{value}")
1382
+ end
1384
1383
  end
1385
1384
 
1386
1385
  # [7.4.3] General Use of Terms in Attributes
@@ -1409,9 +1408,10 @@ module RDF::RDFa
1409
1408
  prefix, reference = curie.to_s.split(":", 2)
1410
1409
 
1411
1410
  # consider the bnode situation
1412
- if prefix == "_" && restrictions.include?(:bnode)
1411
+ if prefix == "_"
1413
1412
  # we force a non-nil name, otherwise it generates a new name
1414
1413
  # As a special case, _: is also a valid reference for one specific bnode.
1414
+ raise ArgumentError, "BNode not allowed in this position" unless restrictions.include?(:bnode)
1415
1415
  bnode(reference)
1416
1416
  elsif curie.to_s.match(/^:/)
1417
1417
  # Default prefix
@@ -1,7 +1,6 @@
1
1
  module RDF
2
2
  class PTR < Vocabulary("http://www.w3.org/2009/pointers#"); end
3
3
  class RDFA < Vocabulary("http://www.w3.org/ns/rdfa#"); end
4
- class XHV < Vocabulary("http://www.w3.org/1999/xhtml/vocab#"); end
5
4
  class XML < Vocabulary("http://www.w3.org/XML/1998/namespace"); end
6
5
  class XSI < Vocabulary("http://www.w3.org/2001/XMLSchema-instance"); end
7
6
  end
@@ -84,6 +84,8 @@ module RDF::RDFa
84
84
  # the prefix mappings to use
85
85
  # @option options [#to_s] :base_uri (nil)
86
86
  # the base URI to use when constructing relative URIs, set as html>head>base.href
87
+ # @option options [Boolean] :validate (false)
88
+ # whether to validate terms when serializing
87
89
  # @option options [#to_s] :lang (nil)
88
90
  # Output as root @lang attribute, and avoid generation _@lang_ where possible
89
91
  # @option options [Boolean] :standard_prefixes (false)
@@ -135,7 +137,9 @@ module RDF::RDFa
135
137
  # Addes a statement to be serialized
136
138
  # @param [RDF::Statement] statement
137
139
  # @return [void]
140
+ # @raise [RDF::WriterError] if validating and attempting to write an invalid {RDF::Term}.
138
141
  def write_statement(statement)
142
+ raise RDF::WriterError, "Statement #{statement.inspect} is invalid" if validate? && statement.invalid?
139
143
  @graph.insert(statement)
140
144
  end
141
145
 
@@ -147,8 +151,9 @@ module RDF::RDFa
147
151
  # @return [void]
148
152
  # @raise [NotImplementedError] unless implemented in subclass
149
153
  # @abstract
154
+ # @raise [RDF::WriterError] if validating and attempting to write an invalid {RDF::Term}.
150
155
  def write_triple(subject, predicate, object)
151
- @graph.insert(Statement.new(subject, predicate, object))
156
+ write_statement Statement.new(subject, predicate, object)
152
157
  end
153
158
 
154
159
  ##
@@ -290,18 +295,19 @@ module RDF::RDFa
290
295
  # @param [Array<RDF::Resource>] objects
291
296
  # List of objects to render. If the list contains only a single element, the :property_value template will be used. Otherwise, the :property_values template is used.
292
297
  # @param [Hash{Symbol => Object}] options Rendering options passed to Haml render.
293
- # @option options [String] haml (haml_template[:property_value], haml_template[:property_values])
298
+ # @option options [String] :haml (haml_template[:property_value], haml_template[:property_values])
294
299
  # Haml template to render. Otherwise, uses `haml_template[:property_value] or haml_template[:property_values]`
295
300
  # depending on the cardinality of objects.
296
- # @yield [object]
297
- # Yields object.
301
+ # @yield object, inlist
302
+ # Yields object and if it is contained in a list.
298
303
  # @yieldparam [RDF::Resource] object
304
+ # @yieldparam [Boolean] inlist
299
305
  # @yieldreturn [String, nil]
300
306
  # The block should only return a string for recursive object definitions.
301
307
  # @return String
302
308
  # The rendered document is returned as a string
303
309
  def render_property(predicate, objects, options = {}, &block)
304
- add_debug {"render_property(#{predicate}): #{objects.inspect}"}
310
+ add_debug {"render_property(#{predicate}): #{objects.inspect}, #{options.inspect}"}
305
311
  # If there are multiple objects, and no :property_values is defined, call recursively with
306
312
  # each object
307
313
 
@@ -309,25 +315,32 @@ module RDF::RDFa
309
315
  template ||= objects.length > 1 ? haml_template[:property_values] : haml_template[:property_value]
310
316
 
311
317
  # Separate out the objects which are lists and render separately
312
- list_objects = objects.select {|o| o != RDF.nil && RDF::List.new(o, @graph).valid?}
318
+ list_objects = objects.reject do |o|
319
+ o == RDF.nil ||
320
+ (l = RDF::List.new(o, @graph)).invalid?
321
+ end
313
322
  unless list_objects.empty?
314
323
  # Render non-list objects
315
- add_debug {"properties with lists: non-lists: #{objects - list_objects} lists: #{list_objects}"}
316
- nl = render_property(predicate, objects - list_objects, options, &block) unless objects == 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
317
326
  return nl.to_s + list_objects.map do |object|
318
327
  # Render each list as multiple properties and set :inlist to true
319
328
  list = RDF::List.new(object, @graph)
320
329
  list.each_statement {|st| subject_done(st.subject)}
321
330
 
322
331
  add_debug {"list: #{list.inspect} #{list.to_a}"}
323
- render_property(predicate, list.to_a, options.merge(:inlist => "true"), &block)
332
+ depth do
333
+ render_property(predicate, list.to_a, options.merge(:inlist => "true")) do |object|
334
+ yield(object, true) if block_given?
335
+ end
336
+ end
324
337
  end.join(" ")
325
338
  end
326
339
 
327
340
  if objects.length > 1 && template.nil?
328
- # Uf there is no property_values template, render each property using property_value template
341
+ # If there is no property_values template, render each property using property_value template
329
342
  objects.map do |object|
330
- render_property(predicate, [object], options, &block)
343
+ depth {render_property(predicate, [object], options, &block)}
331
344
  end.join(" ")
332
345
  else
333
346
  raise RDF::WriterError, "Missing property template" if template.nil?
@@ -345,9 +358,7 @@ module RDF::RDFa
345
358
  :rel => get_curie(predicate),
346
359
  :inlist => nil,
347
360
  }.merge(options)
348
- hamlify(template, options) do |object|
349
- yield(object) if block_given?
350
- end
361
+ hamlify(template, options, &block)
351
362
  end
352
363
  end
353
364
 
@@ -360,7 +371,7 @@ module RDF::RDFa
360
371
  [XML_RDFA_CONTEXT, HTML_RDFA_CONTEXT].each do |uri|
361
372
  ctx = Context.find(uri)
362
373
  ctx.prefixes.each_pair do |k, v|
363
- @uri_to_prefix[v] = k
374
+ @uri_to_prefix[v] = k unless k.to_s == "dcterms"
364
375
  end
365
376
 
366
377
  ctx.terms.each_pair do |k, v|
@@ -444,8 +455,8 @@ module RDF::RDFa
444
455
  # @return [ignored]
445
456
  def preprocess_statement(statement)
446
457
  #add_debug {"preprocess: #{statement.inspect}"}
447
- references = ref_count(statement.object) + 1
448
- @references[statement.object] = references
458
+ bump_reference(statement.subject)
459
+ bump_reference(statement.object)
449
460
  @subjects[statement.subject] = true
450
461
  get_curie(statement.subject)
451
462
  get_curie(statement.predicate)
@@ -482,50 +493,76 @@ module RDF::RDFa
482
493
  # Serialize using &lt;li&gt; rather than template default element
483
494
  # @option options [RDF::Resource] :rel (nil)
484
495
  # Optional @rel property
485
- # @return [Nokogiri::XML::Element, {Namespace}]
496
+ # @return [String]
486
497
  def subject(subject, options = {})
487
498
  return if is_done?(subject)
488
499
 
489
500
  subject_done(subject)
490
501
 
502
+ properties = properties_for_subject(subject)
503
+ typeof = type_of(properties.delete(RDF.type.to_s), subject)
504
+ prop_list = order_properties(properties)
505
+
506
+ add_debug {"props: #{prop_list.inspect}"}
507
+
508
+ render_opts = {:typeof => typeof, :property_values => properties}.merge(options)
509
+
510
+ render_subject_template(subject, prop_list, render_opts)
511
+ end
512
+
513
+ # @param [RDF::Resource] subject
514
+ # @return [Hash{String => Object}]
515
+ def properties_for_subject(subject)
491
516
  properties = {}
492
517
  @graph.query(:subject => subject) do |st|
493
- properties[st.predicate.to_s] ||= []
494
- properties[st.predicate.to_s] << st.object
518
+ key = st.predicate.to_s.freeze
519
+ properties[key] ||= []
520
+ properties[key] << st.object
495
521
  end
496
- prop_list = order_properties(properties)
522
+ properties
523
+ end
497
524
 
525
+ # @param [Array,NilClass] type
526
+ # @param [RDF::Resource] subject
527
+ # @return [String] string representation of the specific RDF.type uri
528
+ def type_of(type, subject)
498
529
  # Find appropriate template
499
- curie ||= case
530
+ curie = case
500
531
  when subject.node?
501
- subject.to_s if ref_count(subject) >= (@depth == 0 ? 0 : 1)
532
+ subject.to_s if ref_count(subject) > 1
502
533
  else
503
534
  get_curie(subject)
504
535
  end
505
536
 
506
- # See if there's a template based on the sorted concatenation of all types of this subject
507
- # or any type of this subject
508
- tmpl = find_template(subject)
509
-
510
- typeof = Array(properties.delete(RDF.type.to_s)).map {|r| get_curie(r)}.join(" ")
537
+ typeof = Array(type).map {|r| get_curie(r)}.join(" ")
511
538
  typeof = nil if typeof.empty?
512
539
 
513
540
  # Nodes without a curie need a blank @typeof to generate a subject
514
541
  typeof ||= "" unless curie
515
- prop_list -= [RDF.type.to_s]
516
542
 
543
+ add_debug {"subject: #{curie.inspect}, typeof: #{typeof.inspect}" }
544
+
545
+ typeof.freeze
546
+ end
547
+
548
+ # @param [RDF::Resource] subject
549
+ # @param [Array] prop_list
550
+ # @param [Hash] render_opts
551
+ # @return [String]
552
+ def render_subject_template(subject, prop_list, render_opts)
553
+ # See if there's a template based on the sorted concatenation of all types of this subject
554
+ # or any type of this subject
555
+ tmpl = find_template(subject)
517
556
  add_debug {"subject: found template #{tmpl[:identifier] || tmpl.inspect}"} if tmpl
518
- add_debug {"subject: #{curie.inspect}, typeof: #{typeof.inspect}, props: #{prop_list.inspect}"}
519
557
 
520
558
  # Render this subject
521
559
  # If :rel is specified and :typeof is nil, use @resource instead of @about.
522
560
  # Pass other options from calling context
523
- render_opts = {:typeof => typeof}.merge(options)
524
561
  with_template(tmpl) do
525
562
  render_subject(subject, prop_list, render_opts) do |pred|
526
563
  depth do
527
564
  pred = RDF::URI(pred) if pred.is_a?(String)
528
- values = properties[pred.to_s]
565
+ values = render_opts[:property_values][pred.to_s]
529
566
  add_debug {"subject: #{get_curie(subject)}, pred: #{get_curie(pred)}, values: #{values.inspect}"}
530
567
  predicate(pred, values)
531
568
  end
@@ -547,10 +584,10 @@ module RDF::RDFa
547
584
  return if objects.to_a.empty?
548
585
 
549
586
  add_debug {"predicate: #{get_curie(predicate)}"}
550
- render_property(predicate, objects) do |o|
587
+ render_property(predicate, objects) do |o, inlist=nil|
551
588
  # Yields each object, for potential recursive definition.
552
589
  # If nil is returned, a leaf is produced
553
- depth {subject(o, :rel => get_curie(predicate), :element => (:li if objects.length > 1))} if !is_done?(o) && @subjects.include?(o)
590
+ depth {subject(o, :rel => get_curie(predicate), :inlist => inlist, :element => (:li if objects.length > 1 || inlist))} if !is_done?(o) && @subjects.include?(o)
554
591
  end
555
592
  end
556
593
 
@@ -567,11 +604,11 @@ module RDF::RDFa
567
604
  # Haml rendering helper. Return language for plain literal, if there is no language, or it is the same as the document, return nil
568
605
  #
569
606
  # @param [RDF::Literal] literal
570
- # @return [String, nil]
607
+ # @return [Symbol, nil]
571
608
  # @raise [RDF::WriterError]
572
609
  def get_lang(literal)
573
610
  raise RDF::WriterError, "Getting datatype CURIE for #{literal.inspect}, which must be a literal" unless literal.is_a?(RDF::Literal)
574
- literal.language if literal.literal? && literal.language && literal.language != @lang
611
+ literal.language if literal.literal? && literal.language && literal.language.to_s != @lang.to_s
575
612
  end
576
613
 
577
614
  # Haml rendering helper. Data to be added to a @content value
@@ -658,7 +695,7 @@ module RDF::RDFa
658
695
  #add_debug {"get_curie(#{resource}) => #{curie}"}
659
696
 
660
697
  @uri_to_term_or_curie[uri] = curie
661
- rescue Argument => e
698
+ rescue ArgumentError => e
662
699
  raise RDF::WriterError, "Invalid URI #{uri.inspect}: #{e.message}"
663
700
  end
664
701
  private
@@ -676,6 +713,10 @@ module RDF::RDFa
676
713
  end
677
714
 
678
715
  # Increase depth around a method invocation
716
+ # @yield
717
+ # Yields with no arguments
718
+ # @yieldreturn [Object] returns the result of yielding
719
+ # @return [Object]
679
720
  def depth
680
721
  @depth += 1
681
722
  ret = yield
@@ -684,6 +725,11 @@ module RDF::RDFa
684
725
  end
685
726
 
686
727
  # Set the template to use within block
728
+ # @param [Hash{Symbol => String}] templ template to use for block evaluation; merged in with the existing template.
729
+ # @yield
730
+ # Yields with no arguments
731
+ # @yieldreturn [Object] returns the result of yielding
732
+ # @return [Object]
687
733
  def with_template(templ)
688
734
  if templ
689
735
  new_template = @options[:haml].
@@ -734,15 +780,29 @@ module RDF::RDFa
734
780
  def find_template(subject); end
735
781
 
736
782
  # Mark a subject as done.
783
+ # @param [RDF::Resource] subject
784
+ # @return [Boolean]
737
785
  def subject_done(subject)
738
786
  @serialized[subject] = true
739
787
  end
740
788
 
789
+ # Determine if the subject has been completed
790
+ # @param [RDF::Resource] subject
791
+ # @return [Boolean]
741
792
  def is_done?(subject)
742
793
  @serialized.include?(subject)
743
794
  end
744
795
 
796
+ # Increase the reference count of this resource
797
+ # @param [RDF::Resource] resource
798
+ # @return [Integer] resulting reference count
799
+ def bump_reference(resource)
800
+ @references[resource] = ref_count(resource) + 1
801
+ end
802
+
745
803
  # Return the number of times this node has been referenced in the object position
804
+ # @param [RDF::Node] node
805
+ # @return [Boolean]
746
806
  def ref_count(node)
747
807
  @references.fetch(node, 0)
748
808
  end
@@ -756,7 +816,7 @@ module RDF::RDFa
756
816
  message = message + yield if block_given?
757
817
  msg = "#{' ' * @depth}#{message}"
758
818
  STDERR.puts msg if ::RDF::RDFa.debug?
759
- @debug << msg if @debug.is_a?(Array)
819
+ @debug << msg.force_encoding("utf-8") if @debug.is_a?(Array)
760
820
  end
761
821
  end
762
822
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdf-rdfa
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gregg
@@ -9,230 +9,230 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-10-29 00:00:00.000000000 Z
12
+ date: 2013-11-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rdf
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ! '>='
18
+ - - '>='
19
19
  - !ruby/object:Gem::Version
20
- version: 1.0.5
20
+ version: 1.1.0
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - ! '>='
25
+ - - '>='
26
26
  - !ruby/object:Gem::Version
27
- version: 1.0.5
27
+ version: 1.1.0
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: haml
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - ! '>='
32
+ - - '>='
33
33
  - !ruby/object:Gem::Version
34
34
  version: '4.0'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - ! '>='
39
+ - - '>='
40
40
  - !ruby/object:Gem::Version
41
41
  version: '4.0'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: rdf-xsd
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - ! '>='
46
+ - - '>='
47
47
  - !ruby/object:Gem::Version
48
- version: '1.0'
48
+ version: '1.1'
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - ! '>='
53
+ - - '>='
54
54
  - !ruby/object:Gem::Version
55
- version: '1.0'
55
+ version: '1.1'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: htmlentities
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - ! '>='
60
+ - - '>='
61
61
  - !ruby/object:Gem::Version
62
62
  version: 4.3.1
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - ! '>='
67
+ - - '>='
68
68
  - !ruby/object:Gem::Version
69
69
  version: 4.3.1
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: nokogiri
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - ! '>='
74
+ - - '>='
75
75
  - !ruby/object:Gem::Version
76
76
  version: 1.5.9
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - ! '>='
81
+ - - '>='
82
82
  - !ruby/object:Gem::Version
83
83
  version: 1.5.9
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: equivalent-xml
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - ! '>='
88
+ - - '>='
89
89
  - !ruby/object:Gem::Version
90
90
  version: 0.3.0
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - ! '>='
95
+ - - '>='
96
96
  - !ruby/object:Gem::Version
97
97
  version: 0.3.0
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: open-uri-cached
100
100
  requirement: !ruby/object:Gem::Requirement
101
101
  requirements:
102
- - - ! '>='
102
+ - - '>='
103
103
  - !ruby/object:Gem::Version
104
104
  version: 0.0.5
105
105
  type: :development
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
- - - ! '>='
109
+ - - '>='
110
110
  - !ruby/object:Gem::Version
111
111
  version: 0.0.5
112
112
  - !ruby/object:Gem::Dependency
113
113
  name: json-ld
114
114
  requirement: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - ! '>='
116
+ - - '>='
117
117
  - !ruby/object:Gem::Version
118
- version: 0.9.1
118
+ version: '1.1'
119
119
  type: :development
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - ! '>='
123
+ - - '>='
124
124
  - !ruby/object:Gem::Version
125
- version: 0.9.1
125
+ version: '1.1'
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: rspec
128
128
  requirement: !ruby/object:Gem::Requirement
129
129
  requirements:
130
- - - ! '>='
130
+ - - '>='
131
131
  - !ruby/object:Gem::Version
132
132
  version: 2.14.0
133
133
  type: :development
134
134
  prerelease: false
135
135
  version_requirements: !ruby/object:Gem::Requirement
136
136
  requirements:
137
- - - ! '>='
137
+ - - '>='
138
138
  - !ruby/object:Gem::Version
139
139
  version: 2.14.0
140
140
  - !ruby/object:Gem::Dependency
141
141
  name: rdf-microdata
142
142
  requirement: !ruby/object:Gem::Requirement
143
143
  requirements:
144
- - - ! '>='
144
+ - - '>='
145
145
  - !ruby/object:Gem::Version
146
- version: '0'
146
+ version: '1.1'
147
147
  type: :development
148
148
  prerelease: false
149
149
  version_requirements: !ruby/object:Gem::Requirement
150
150
  requirements:
151
- - - ! '>='
151
+ - - '>='
152
152
  - !ruby/object:Gem::Version
153
- version: '0'
153
+ version: '1.1'
154
154
  - !ruby/object:Gem::Dependency
155
155
  name: rdf-spec
156
156
  requirement: !ruby/object:Gem::Requirement
157
157
  requirements:
158
- - - ! '>='
158
+ - - '>='
159
159
  - !ruby/object:Gem::Version
160
- version: '1.0'
160
+ version: '1.1'
161
161
  type: :development
162
162
  prerelease: false
163
163
  version_requirements: !ruby/object:Gem::Requirement
164
164
  requirements:
165
- - - ! '>='
165
+ - - '>='
166
166
  - !ruby/object:Gem::Version
167
- version: '1.0'
167
+ version: '1.1'
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: rdf-turtle
170
170
  requirement: !ruby/object:Gem::Requirement
171
171
  requirements:
172
- - - ! '>='
172
+ - - '>='
173
173
  - !ruby/object:Gem::Version
174
- version: '0'
174
+ version: '1.1'
175
175
  type: :development
176
176
  prerelease: false
177
177
  version_requirements: !ruby/object:Gem::Requirement
178
178
  requirements:
179
- - - ! '>='
179
+ - - '>='
180
180
  - !ruby/object:Gem::Version
181
- version: '0'
181
+ version: '1.1'
182
182
  - !ruby/object:Gem::Dependency
183
183
  name: rdf-rdfxml
184
184
  requirement: !ruby/object:Gem::Requirement
185
185
  requirements:
186
- - - ! '>='
186
+ - - '>='
187
187
  - !ruby/object:Gem::Version
188
- version: '0'
188
+ version: '1.1'
189
189
  type: :development
190
190
  prerelease: false
191
191
  version_requirements: !ruby/object:Gem::Requirement
192
192
  requirements:
193
- - - ! '>='
193
+ - - '>='
194
194
  - !ruby/object:Gem::Version
195
- version: '0'
195
+ version: '1.1'
196
196
  - !ruby/object:Gem::Dependency
197
197
  name: rdf-isomorphic
198
198
  requirement: !ruby/object:Gem::Requirement
199
199
  requirements:
200
- - - ! '>='
200
+ - - '>='
201
201
  - !ruby/object:Gem::Version
202
- version: '0'
202
+ version: '1.1'
203
203
  type: :development
204
204
  prerelease: false
205
205
  version_requirements: !ruby/object:Gem::Requirement
206
206
  requirements:
207
- - - ! '>='
207
+ - - '>='
208
208
  - !ruby/object:Gem::Version
209
- version: '0'
209
+ version: '1.1'
210
210
  - !ruby/object:Gem::Dependency
211
211
  name: sparql
212
212
  requirement: !ruby/object:Gem::Requirement
213
213
  requirements:
214
- - - ! '>='
214
+ - - '>='
215
215
  - !ruby/object:Gem::Version
216
- version: '0'
216
+ version: '1.1'
217
217
  type: :development
218
218
  prerelease: false
219
219
  version_requirements: !ruby/object:Gem::Requirement
220
220
  requirements:
221
- - - ! '>='
221
+ - - '>='
222
222
  - !ruby/object:Gem::Version
223
- version: '0'
223
+ version: '1.1'
224
224
  - !ruby/object:Gem::Dependency
225
225
  name: yard
226
226
  requirement: !ruby/object:Gem::Requirement
227
227
  requirements:
228
- - - ! '>='
228
+ - - '>='
229
229
  - !ruby/object:Gem::Version
230
230
  version: 0.8.5
231
231
  type: :development
232
232
  prerelease: false
233
233
  version_requirements: !ruby/object:Gem::Requirement
234
234
  requirements:
235
- - - ! '>='
235
+ - - '>='
236
236
  - !ruby/object:Gem::Version
237
237
  version: 0.8.5
238
238
  description: RDF::RDFa is an RDFa reader/writer for Ruby using the RDF.rb library
@@ -281,17 +281,17 @@ require_paths:
281
281
  - lib
282
282
  required_ruby_version: !ruby/object:Gem::Requirement
283
283
  requirements:
284
- - - ! '>='
284
+ - - '>='
285
285
  - !ruby/object:Gem::Version
286
- version: 1.8.7
286
+ version: 1.9.3
287
287
  required_rubygems_version: !ruby/object:Gem::Requirement
288
288
  requirements:
289
- - - ! '>='
289
+ - - '>='
290
290
  - !ruby/object:Gem::Version
291
291
  version: '0'
292
292
  requirements: []
293
293
  rubyforge_project: rdf-rdfa
294
- rubygems_version: 2.0.5
294
+ rubygems_version: 2.1.11
295
295
  signing_key:
296
296
  specification_version: 4
297
297
  summary: RDFa reader/writer for RDF.rb.