roadforest 0.1 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/examples/file-management.rb +12 -13
  3. data/lib/roadforest-client.rb +3 -0
  4. data/lib/roadforest-common.rb +2 -0
  5. data/lib/roadforest-server.rb +7 -0
  6. data/lib/roadforest-testing.rb +1 -0
  7. data/lib/roadforest/application.rb +9 -7
  8. data/lib/roadforest/application/dispatcher.rb +39 -63
  9. data/lib/roadforest/application/parameters.rb +1 -1
  10. data/lib/roadforest/application/path-provider.rb +2 -2
  11. data/lib/roadforest/application/route-adapter.rb +130 -18
  12. data/lib/roadforest/application/services-host.rb +0 -4
  13. data/lib/roadforest/augment/affordance.rb +78 -0
  14. data/lib/roadforest/augment/augmentation.rb +97 -0
  15. data/lib/roadforest/augment/augmenter.rb +54 -0
  16. data/lib/roadforest/augmentations.rb +1 -0
  17. data/lib/roadforest/content-handling.rb +1 -0
  18. data/lib/roadforest/content-handling/common-engines.rb +67 -0
  19. data/lib/roadforest/content-handling/engine.rb +2 -14
  20. data/lib/roadforest/content-handling/handler-wrap.rb +29 -31
  21. data/lib/roadforest/content-handling/media-type.rb +6 -0
  22. data/lib/roadforest/{rdf.rb → graph.rb} +1 -1
  23. data/lib/roadforest/{rdf → graph}/access-manager.rb +12 -74
  24. data/lib/roadforest/{rdf → graph}/document.rb +1 -1
  25. data/lib/roadforest/{rdf → graph}/etagging.rb +2 -2
  26. data/lib/roadforest/{rdf → graph}/focus-list.rb +1 -9
  27. data/lib/roadforest/{rdf → graph}/graph-copier.rb +2 -2
  28. data/lib/roadforest/{rdf → graph}/graph-focus.rb +5 -7
  29. data/lib/roadforest/{rdf → graph}/normalization.rb +1 -1
  30. data/lib/roadforest/{rdf → graph}/post-focus.rb +2 -3
  31. data/lib/roadforest/graph/vocabulary.rb +96 -0
  32. data/lib/roadforest/http/graph-transfer.rb +2 -2
  33. data/lib/roadforest/interface/application.rb +145 -0
  34. data/lib/roadforest/interface/blob.rb +38 -0
  35. data/lib/roadforest/interface/rdf.rb +77 -0
  36. data/lib/roadforest/interfaces.rb +2 -0
  37. data/lib/roadforest/remote-host.rb +17 -17
  38. data/lib/roadforest/resource.rb +4 -0
  39. data/lib/roadforest/resource/{rdf/leaf-item.rb → leaf-item.rb} +1 -1
  40. data/lib/roadforest/resource/{rdf/list.rb → list.rb} +1 -1
  41. data/lib/roadforest/resource/{rdf/parent-item.rb → parent-item.rb} +1 -1
  42. data/lib/roadforest/resource/{rdf/read-only.rb → read-only.rb} +18 -18
  43. data/lib/roadforest/resource/role/has-children.rb +1 -1
  44. data/lib/roadforest/resource/role/writable.rb +2 -2
  45. data/lib/roadforest/server.rb +1 -1
  46. data/lib/roadforest/source-rigor.rb +9 -0
  47. data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence-annealer.rb +2 -2
  48. data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence.rb +5 -5
  49. data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/any.rb +1 -1
  50. data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/none-if-role-absent.rb +1 -1
  51. data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/role-if-available.rb +1 -1
  52. data/lib/roadforest/source-rigor/engine.rb +45 -0
  53. data/lib/roadforest/{rdf → source-rigor}/graph-store.rb +9 -9
  54. data/lib/roadforest/{rdf/source-rigor → source-rigor}/http-investigator.rb +2 -2
  55. data/lib/roadforest/{rdf → source-rigor}/investigation.rb +2 -2
  56. data/lib/roadforest/{rdf/source-rigor → source-rigor}/investigator.rb +3 -3
  57. data/lib/roadforest/{rdf/source-rigor → source-rigor}/null-investigator.rb +3 -2
  58. data/lib/roadforest/{rdf → source-rigor}/parcel.rb +5 -5
  59. data/lib/roadforest/{rdf → source-rigor}/resource-pattern.rb +6 -6
  60. data/lib/roadforest/{rdf → source-rigor}/resource-query.rb +2 -2
  61. data/lib/roadforest/source-rigor/rigorous-access.rb +101 -0
  62. data/lib/roadforest/templates/affordance-doc.haml +23 -0
  63. data/lib/roadforest/templates/affordance-property-values.haml +13 -0
  64. data/lib/roadforest/templates/affordance-subject.haml +9 -0
  65. data/lib/roadforest/templates/affordance-uri-object.haml +2 -0
  66. data/lib/roadforest/templates/base/{property_value.haml → property-value.haml} +0 -0
  67. data/lib/roadforest/templates/base/{property_values.haml → property-values.haml} +0 -0
  68. data/lib/roadforest/templates/distiller/{property_value.haml → property-value.haml} +0 -0
  69. data/lib/roadforest/templates/distiller/{property_values.haml → property-values.haml} +0 -0
  70. data/lib/roadforest/templates/min/{property_values.haml → property-values.haml} +0 -0
  71. data/lib/roadforest/templates/rdfpost-curie.haml +6 -0
  72. data/lib/roadforest/test-support/dispatcher-facade.rb +2 -0
  73. data/lib/roadforest/test-support/matchers.rb +169 -5
  74. data/lib/roadforest/test-support/remote-host.rb +2 -2
  75. data/lib/roadforest/type-handlers/handler.rb +74 -0
  76. data/lib/roadforest/type-handlers/jsonld.rb +34 -0
  77. data/lib/roadforest/type-handlers/rdf-handler.rb +36 -0
  78. data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer.rb +2 -2
  79. data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/document-environment.rb +9 -8
  80. data/lib/roadforest/type-handlers/rdfa-writer/environment-decorator.rb +312 -0
  81. data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/object-environment.rb +3 -3
  82. data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/property-environment.rb +5 -11
  83. data/lib/roadforest/type-handlers/rdfa-writer/render-engine.rb +427 -0
  84. data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/render-environment.rb +33 -26
  85. data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/subject-environment.rb +7 -23
  86. data/lib/roadforest/type-handlers/rdfa.rb +73 -0
  87. data/lib/roadforest/type-handlers/rdfpost.rb +301 -0
  88. data/lib/roadforest/utility/class-registry.rb +23 -5
  89. data/spec/.ctrlp-root +0 -0
  90. data/spec/affordance-augmenter.rb +75 -0
  91. data/spec/affordances-flow.rb +438 -0
  92. data/spec/authorization.rb +34 -0
  93. data/spec/client.rb +13 -12
  94. data/spec/credence-annealer.rb +5 -5
  95. data/spec/focus-list.rb +8 -8
  96. data/spec/full-integration.rb +3 -3
  97. data/spec/graph-copier.rb +4 -4
  98. data/spec/graph-store.rb +19 -31
  99. data/spec/keychain.rb +82 -0
  100. data/spec/rdf-normalization.rb +2 -2
  101. data/spec/rdf-parcel.rb +3 -3
  102. data/spec/rdfa-handler.rb +514 -0
  103. data/spec/rdfpost.rb +96 -0
  104. data/spec/source-rigor.rb +57 -0
  105. data/spec/update-focus.rb +11 -10
  106. metadata +91 -66
  107. data/lib/roadforest/blob-model.rb +0 -53
  108. data/lib/roadforest/content-handling/type-handler.rb +0 -76
  109. data/lib/roadforest/content-handling/type-handlers/jsonld.rb +0 -36
  110. data/lib/roadforest/content-handling/type-handlers/rdf-handler.rb +0 -38
  111. data/lib/roadforest/content-handling/type-handlers/rdfa-writer/render-engine.rb +0 -574
  112. data/lib/roadforest/content-handling/type-handlers/rdfa.rb +0 -175
  113. data/lib/roadforest/content-handling/type-handlers/rdfpost.rb +0 -297
  114. data/lib/roadforest/model.rb +0 -209
  115. data/lib/roadforest/models.rb +0 -2
  116. data/lib/roadforest/rdf/source-rigor.rb +0 -44
  117. data/lib/roadforest/rdf/vocabulary.rb +0 -11
  118. data/lib/roadforest/resource/http/form-parsing.rb +0 -81
  119. data/lib/roadforest/resource/rdf.rb +0 -4
  120. data/spec/form-parsing.rb +0 -1
@@ -1,8 +1,8 @@
1
- require 'roadforest/content-handling/type-handlers/rdfa-writer/render-environment'
2
- module RoadForest::MediaType
1
+ require 'roadforest/type-handlers/rdfa-writer/render-environment'
2
+ module RoadForest::TypeHandlers
3
3
  class RDFaWriter
4
4
  class ObjectEnvironment < RenderEnvironment
5
- attr_accessor :predicate, :object, :inlist, :element
5
+ attr_accessor :predicate, :object, :inlist
6
6
 
7
7
  def simple_attrs
8
8
  {:property => get_curie(predicate), :content => get_content(object), :lang => get_lang(object), :datatype => get_dt_curie(object), :inlist => inlist}
@@ -1,23 +1,17 @@
1
- require 'roadforest/content-handling/type-handlers/rdfa-writer/render-environment'
2
- module RoadForest::MediaType
1
+ require 'roadforest/type-handlers/rdfa-writer/render-environment'
2
+ module RoadForest::TypeHandlers
3
3
  class RDFaWriter
4
4
  class PropertyEnvironment < RenderEnvironment
5
5
  attr_accessor :object_terms, :predicate, :inlist
6
6
 
7
- def yielded(item)
8
- @_engine.render(item)
9
- end
10
-
11
7
  def objects
12
8
  enum_for(:each_object)
13
9
  end
14
10
 
15
11
  def each_object
16
12
  object_terms.each do |term|
17
- env = @_engine.object_env(predicate, term)
13
+ env = object_env(predicate, term)
18
14
  env.inlist = inlist
19
- #XXX Remove element=
20
- env.element = :li if object_terms.length > 1 || inlist
21
15
  yield(env)
22
16
  end
23
17
  end
@@ -36,9 +30,9 @@ module RoadForest::MediaType
36
30
 
37
31
  def template_kinds
38
32
  if objects.to_a.length > 1
39
- %w{property_values}
33
+ %w{property-values}
40
34
  else
41
- %w{property_value property_values}
35
+ %w{property-value property-values}
42
36
  end
43
37
  end
44
38
  end
@@ -0,0 +1,427 @@
1
+ require 'roadforest/type-handlers/rdfa-writer'
2
+ require 'roadforest/type-handlers/rdfa-writer/document-environment'
3
+ require 'roadforest/type-handlers/rdfa-writer/subject-environment'
4
+ require 'roadforest/type-handlers/rdfa-writer/property-environment'
5
+ require 'roadforest/type-handlers/rdfa-writer/object-environment'
6
+ require 'roadforest/type-handlers/rdfa-writer/environment-decorator'
7
+ require 'haml'
8
+
9
+ module RoadForest::TypeHandlers
10
+ class RDFaWriter
11
+ class TemplateHandler
12
+ attr_accessor :haml_options, :valise
13
+ attr_accessor :resource_name
14
+ attr_writer :style_name, :template_cache
15
+
16
+ def template_cache
17
+ @template_cache ||= ::Tilt::Cache.new
18
+ end
19
+
20
+ def style_name
21
+ @style_name ||= "base"
22
+ end
23
+
24
+ def templates
25
+ @templates ||= [resource_name, style_name, nil].uniq.map do |name|
26
+ valise.sub_set(["templates", name].compact.join("/"))
27
+ end.inject do |left, right|
28
+ left + right
29
+ end.handle_templates do |config|
30
+ #At some point, should look into using HTML entities to preserve
31
+ #whitespace in XMLLiterals
32
+ config.add_type("haml", { :template_cache => template_cache, :template_options => haml_options || {:ugly => true} })
33
+ end
34
+ end
35
+
36
+ def find_template(kinds)
37
+ kind = kinds.shift
38
+ templates.contents(kind)
39
+ rescue Valise::Errors::NotFound
40
+ if kinds.empty?
41
+ raise
42
+ else
43
+ retry
44
+ end
45
+ end
46
+ end
47
+
48
+
49
+ class RenderEngine
50
+ attr_accessor :top_classes
51
+
52
+ attr_accessor :predicate_order
53
+
54
+ attr_accessor :heading_predicates
55
+
56
+ attr_accessor :prefixes, :base_uri, :lang, :standard_prefixes, :graph, :titles, :doc_title, :graph_name
57
+ attr_accessor :template_handler
58
+ attr_reader :debug
59
+
60
+ attr_reader :decoration_set
61
+
62
+ def initialize(graph, debug=nil)
63
+ @debug = debug
64
+ @graph = graph
65
+ @graph_name = nil
66
+ @decoration_set = DecorationSet.new
67
+ @render_stack = []
68
+
69
+ reset
70
+
71
+ yield self
72
+
73
+ setup
74
+ end
75
+
76
+ # Reset parser to run again
77
+ def reset
78
+ @debug_indent = 0
79
+ @uri_to_term_or_curie = {}
80
+ @uri_to_prefix = {}
81
+ @references = Hash.new{|h,k| h[k] = 0}
82
+ @prefixes = {}
83
+ @serialized = {}
84
+ @subjects = {}
85
+ @ordered_subjects = []
86
+ @titles = {}
87
+ @doc_title = ""
88
+ end
89
+
90
+ def depth
91
+ @debug_indent += 1
92
+ ret = yield
93
+ @debug_indent -= 1
94
+ ret
95
+ end
96
+
97
+ def bump_reference(resource)
98
+ @references[resource] += 1
99
+ end
100
+
101
+ def ref_count(node)
102
+ @references[node]
103
+ end
104
+
105
+ def add_debug(message = nil)
106
+ return unless ::RoadForest.debug_io || @debug
107
+ message ||= ""
108
+ message = message + yield if block_given?
109
+ msg = "#{' ' * @debug_indent}#{message}"
110
+ RoadForest::debug(msg)
111
+ @debug << msg.force_encoding("utf-8") if @debug.is_a?(Array)
112
+ end
113
+
114
+ def setup
115
+ add_debug {"\nserialize setup: graph size: #{@graph.size}"}
116
+
117
+ @base_uri = ::RDF::URI.intern(@base_uri) unless @base_uri.nil? or @base_uri.is_a?(::RDF::URI)
118
+
119
+ preprocess
120
+
121
+ @ordered_subjects = order_subjects
122
+
123
+ # Take title from first subject having a heading predicate
124
+ @doc_title = nil
125
+ heading_predicates.each do |pred|
126
+ @graph.query(:predicate => pred) do |statement|
127
+ titles[statement.subject] ||= statement.object
128
+ end
129
+ end
130
+ title_subject = @ordered_subjects.detect {|subject| titles[subject]}
131
+ @doc_title = titles[title_subject]
132
+ end
133
+
134
+ def preprocess
135
+ [RDF::RDFa::XML_RDFA_CONTEXT, RDF::RDFa::HTML_RDFA_CONTEXT].each do |uri|
136
+ ctx = RDF::RDFa::Context.find(uri)
137
+ ctx.prefixes.each_pair do |k, v|
138
+ @uri_to_prefix[v] = k unless k.to_s == "dcterms"
139
+ end
140
+
141
+ ctx.terms.each_pair do |k, v|
142
+ @uri_to_term_or_curie[v] = k
143
+ end
144
+
145
+ @vocabulary = ctx.vocabulary.to_s if ctx.vocabulary
146
+ end
147
+
148
+ # Load defined prefixes
149
+ (@prefixes || {}).each_pair do |k, v|
150
+ @uri_to_prefix[v.to_s] = k
151
+ end
152
+ @prefixes = {} # Will define actual used when matched
153
+
154
+ # Process each statement to establish CURIEs and Terms
155
+ @graph.each {|statement| preprocess_statement(statement)}
156
+ add_debug{ "preprocess prefixes: #{@prefixes.inspect}" }
157
+ end
158
+
159
+ def order_subjects
160
+ seen = {}
161
+ subjects = []
162
+
163
+ # Start with base_uri
164
+ if base_uri && @subjects.keys.include?(base_uri)
165
+ subjects << base_uri
166
+ seen[base_uri] = true
167
+ end
168
+
169
+ # Add distinguished classes
170
+ top_classes.select do |s|
171
+ !seen.include?(s)
172
+ end.each do |class_uri|
173
+ graph.query(:predicate => RDF.type, :object => class_uri).map {|st| st.subject}.sort.uniq.each do |subject|
174
+ #add_debug {"order_subjects: #{subject.inspect}"}
175
+ subjects << subject
176
+ seen[subject] = true
177
+ end
178
+ end
179
+
180
+ # Sort subjects by resources over nodes, ref_counts and the subject URI itself
181
+ recursable = @subjects.keys.select do |s|
182
+ !seen.include?(s)
183
+ end.map do |r|
184
+ [r.is_a?(RDF::Node) ? 1 : 0, ref_count(r), r]
185
+ end.sort
186
+
187
+ add_debug {"order_subjects: #{recursable.inspect}"}
188
+
189
+ subjects += recursable.map{|r| r.last}
190
+ end
191
+
192
+ def order_properties(properties)
193
+ # Make sorted list of properties
194
+ prop_list = []
195
+
196
+ predicate_order.each do |prop|
197
+ next unless properties[prop.to_s]
198
+ prop_list << prop.to_s
199
+ end
200
+
201
+ properties.keys.sort.each do |prop|
202
+ next if prop_list.include?(prop.to_s)
203
+ prop_list << prop.to_s
204
+ end
205
+
206
+ add_debug {"order_properties: #{prop_list.join(', ')}"}
207
+ prop_list
208
+ end
209
+
210
+ # Perform any statement preprocessing required. This is used to perform reference counts and determine required prefixes.
211
+ # @param [RDF::Statement] statement
212
+ # @return [ignored]
213
+ def preprocess_statement(statement)
214
+ #add_debug {"preprocess: #{statement.inspect}"}
215
+ return unless statement.context == graph_name
216
+ bump_reference(statement.subject)
217
+ bump_reference(statement.object)
218
+ @subjects[statement.subject] = true
219
+ get_curie(statement.subject)
220
+ get_curie(statement.predicate)
221
+ get_curie(statement.object)
222
+ get_curie(statement.object.datatype) if statement.object.literal? && statement.object.has_datatype?
223
+ end
224
+
225
+ def get_curie(resource)
226
+ raise RDF::WriterError, "Getting CURIE for #{resource.inspect}, which must be an RDF value" unless resource.is_a? RDF::Value
227
+ return resource.to_s unless resource.uri?
228
+
229
+ uri = resource.to_s
230
+
231
+ curie =
232
+ case
233
+ when @uri_to_term_or_curie.has_key?(uri)
234
+ add_debug {"get_curie(#{uri}): uri_to_term_or_curie #{@uri_to_term_or_curie[uri].inspect}"}
235
+ return @uri_to_term_or_curie[uri]
236
+ when base_uri && uri.index(base_uri.to_s) == 0
237
+ add_debug {"get_curie(#{uri}): base_uri (#{uri.sub(base_uri.to_s, "")})"}
238
+ uri.sub(base_uri.to_s, "")
239
+ when @vocabulary && uri.index(@vocabulary) == 0
240
+ add_debug {"get_curie(#{uri}): vocabulary"}
241
+ uri.sub(@vocabulary, "")
242
+ when u = @uri_to_prefix.keys.detect {|u| uri.index(u.to_s) == 0}
243
+ add_debug {"get_curie(#{uri}): uri_to_prefix"}
244
+ prefix = @uri_to_prefix[u]
245
+ @prefixes[prefix] = u
246
+ uri.sub(u.to_s, "#{prefix}:")
247
+ when @standard_prefixes && vocab = RDF::Vocabulary.detect {|v| uri.index(v.to_uri.to_s) == 0}
248
+ add_debug {"get_curie(#{uri}): standard_prefixes"}
249
+ prefix = vocab.__name__.to_s.split('::').last.downcase
250
+ @prefixes[prefix] = vocab.to_uri
251
+ uri.sub(vocab.to_uri.to_s, "#{prefix}:")
252
+ else
253
+ add_debug {"get_curie(#{uri}): none"}
254
+ uri
255
+ end
256
+
257
+ add_debug {"get_curie(#{resource}) => #{curie}"}
258
+
259
+ @uri_to_term_or_curie[uri] = curie
260
+ rescue ArgumentError => e
261
+ raise RDF::WriterError, "Invalid URI #{uri.inspect}: #{e.message}"
262
+ end
263
+
264
+ def type_of(type, subject)
265
+ # Find appropriate template
266
+ curie = case
267
+ when subject.node?
268
+ subject.to_s if ref_count(subject) > 1
269
+ else
270
+ get_curie(subject)
271
+ end
272
+
273
+ typeof = Array(type).map {|r| get_curie(r)}.join(" ")
274
+ typeof = nil if typeof.empty?
275
+
276
+ # Nodes without a curie need a blank @typeof to generate a subject
277
+ typeof ||= "" unless curie
278
+
279
+ add_debug {"subject: #{curie.inspect}, typeof: #{typeof.inspect}" }
280
+
281
+ typeof.freeze
282
+ end
283
+
284
+ def find_environment_template(env)
285
+ template_handler.find_template(env.template_kinds)
286
+ rescue Valise::Errors::NotFound
287
+ raise RDF::WriterError, "No template found for #{env.class} in #{template_handler.inspect}"
288
+ end
289
+
290
+ def render(context)
291
+ #puts "\n#{__FILE__.sub(/^#{Dir.pwd}/,'')}:#{__LINE__} =>
292
+ ##{context.class.inspect}"
293
+ add_debug "render"
294
+ if context.render_checked
295
+ return ""
296
+ end
297
+ template = find_environment_template(context)
298
+ depth do
299
+ add_debug{ "template: #{template.file}" }
300
+ add_debug{ "context: #{context.class.name}"}
301
+
302
+ begin
303
+ @render_stack.push context
304
+ template.render(context) do |item|
305
+ context.yielded(item)
306
+ end.sub(/\n\Z/,'')
307
+ ensure
308
+ @render_stack.pop
309
+ end
310
+ end
311
+ end
312
+
313
+ def is_list?(object)
314
+ !(object == RDF.nil || (l = RDF::List.new(object, @graph)).invalid?)
315
+ end
316
+
317
+ def subject_done(subject)
318
+ @serialized[subject] = true
319
+ end
320
+
321
+ def is_done?(subject)
322
+ @serialized.include?(subject)
323
+ end
324
+
325
+ def properties_for_subject(subject)
326
+ properties = {}
327
+ @graph.query(:subject => subject, :context => false) do |st|
328
+ key = st.predicate.to_s.freeze
329
+ properties[key] ||= []
330
+ properties[key] << st.object
331
+ end
332
+ properties
333
+ end
334
+
335
+ def document_env
336
+ build_env(DocumentEnvironment) do |env|
337
+ env.subject_terms = @ordered_subjects
338
+ env.title = doc_title
339
+ env.prefixes = prefixes
340
+ env.lang = lang
341
+ env.base = base_uri
342
+ end
343
+ end
344
+
345
+ def subject_env(subject)
346
+ return unless @subjects.include?(subject)
347
+ properties = properties_for_subject(subject)
348
+
349
+ build_env(SubjectEnvironment) do |env|
350
+ env.base = base_uri
351
+ env.predicate_terms = order_properties(properties)
352
+ env.property_objects = properties
353
+ env.subject = subject
354
+ env.typeof = type_of(properties.delete(RDF.type.to_s), subject)
355
+ end
356
+ end
357
+
358
+ def simple_property_env(predicate, objects)
359
+ return nil if objects.to_a.empty?
360
+
361
+ build_env(PropertyEnvironment) do |env|
362
+ env.object_terms = objects
363
+ env.predicate = predicate
364
+ env.inlist = nil
365
+ end
366
+ end
367
+
368
+ def build_env(klass)
369
+ env = klass.new(self)
370
+ env.heading_predicates = heading_predicates
371
+ env.lang = lang
372
+ env.parent = @render_stack.last
373
+ yield(env)
374
+ return decoration_set.decoration_for(env)
375
+ end
376
+
377
+ def object_env(predicate, object)
378
+ subj = subject_env(object)
379
+ unless subj.nil?
380
+ subj.rel = get_curie(predicate)
381
+ return subj
382
+ end
383
+
384
+ env_klass =
385
+ if get_curie(object) == 'rdf:nil'
386
+ NilObjectEnvironment
387
+ elsif object.node?
388
+ NodeObjectEnvironment
389
+ elsif object.uri?
390
+ UriObjectEnvironment
391
+ elsif object.datatype == RDF.XMLLiteral
392
+ XMLLiteralObjectEnvironment
393
+ else
394
+ ObjectEnvironment
395
+ end
396
+
397
+ build_env(env_klass) do |env|
398
+ env.predicate = predicate
399
+ env.object = object
400
+ env.inlist = nil
401
+ end
402
+ end
403
+
404
+ def list_property_envs(predicate, list_objects)
405
+ return list_objects.map do |object|
406
+ # Render each list as multiple properties and set :inlist to true
407
+ list = RDF::List.new(object, @graph)
408
+ list.each_statement {|st| subject_done(st.subject)}
409
+
410
+ add_debug {"list: #{list.inspect} #{list.to_a}"}
411
+ env = simple_property_env(predicate, list.to_a)
412
+ env.inlist = "true"
413
+ env
414
+ end
415
+ end
416
+
417
+ def render_document
418
+ add_debug{ "engine prefixes: #{prefixes.inspect}"}
419
+ env = document_env
420
+
421
+ yield env if block_given?
422
+
423
+ render(env)
424
+ end
425
+ end
426
+ end
427
+ end