roadforest 0.1 → 0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,13 +1,18 @@
1
- require 'roadforest/content-handling/type-handlers/rdfa-writer'
2
- module RoadForest::MediaType
1
+ require 'roadforest/type-handlers/rdfa-writer'
2
+ module RoadForest::TypeHandlers
3
3
  class RDFaWriter
4
4
  class RenderEnvironment
5
- attr_accessor :heading_predicates, :lang
5
+ attr_accessor :heading_predicates, :lang, :parent
6
+ attr_reader :_engine
6
7
 
7
8
  def initialize(engine)
8
9
  @_engine = engine
9
10
  end
10
11
 
12
+ def _base_env_
13
+ self
14
+ end
15
+
11
16
  def add_debug(msg = nil, &block)
12
17
  @_engine.add_debug(msg, &block)
13
18
  end
@@ -18,27 +23,9 @@ module RoadForest::MediaType
18
23
  "#{name}=#{instance_variable_get(name).inspect}"
19
24
  end.compact.join(" ")}>"
20
25
  end
21
- # Display a subject.
22
- #
23
- # If the Haml template contains an entry matching the subject's rdf:type URI, that entry will be used as the template for this subject and it's properties.
24
- #
25
- # @example Displays a subject as a Resource Definition:
26
- # <div typeof="rdfs:Resource" about="http://example.com/resource">
27
- # <h1 property="dc:title">label</h1>
28
- # <ul>
29
- # <li content="2009-04-30T06:15:51Z" property="dc:created">2009-04-30T06:15:51+00:00</li>
30
- # </ul>
31
- # </div>
32
- #
33
- # @param [RDF::Resource] subject
34
- # @param [Hash{Symbol => Object}] options
35
- # @option options [:li, nil] :element(:div)
36
- # Serialize using &lt;li&gt; rather than template default element
37
- # @option options [RDF::Resource] :rel (nil)
38
- # Optional @rel property
39
- # @return [String]
40
- def subject(subject, &block)
41
- @_engine.render_subject(subject, &block)
26
+
27
+ def like_a?(klass)
28
+ is_a?(klass)
42
29
  end
43
30
 
44
31
  def is_subject?
@@ -53,6 +40,26 @@ module RoadForest::MediaType
53
40
  false
54
41
  end
55
42
 
43
+ def yielded(item)
44
+ _engine.render(item)
45
+ end
46
+
47
+ def subject_env(term)
48
+ _engine.subject_env(term)
49
+ end
50
+
51
+ def simple_property_env(predicate, nonlists)
52
+ _engine.simple_property_env(predicate, nonlists)
53
+ end
54
+
55
+ def list_property_envs(predicate, lists)
56
+ _engine.list_property_envs(predicate, lists)
57
+ end
58
+
59
+ def object_env(predicate, term)
60
+ _engine.object_env(predicate, term)
61
+ end
62
+
56
63
  # Haml rendering helper. Return CURIE for the literal datatype, if the
57
64
  # literal is a typed literal.
58
65
  #
@@ -71,7 +78,7 @@ module RoadForest::MediaType
71
78
  # @raise [RDF::WriterError]
72
79
  def get_lang(literal)
73
80
  raise RDF::WriterError, "Getting datatype CURIE for #{literal.inspect}, which must be a literal" unless literal.is_a?(RDF::Literal)
74
- literal.language if literal.literal? && literal.language && literal.language.to_s != @_engine.lang.to_s
81
+ literal.language if literal.literal? && literal.language && literal.language.to_s != _engine.lang.to_s
75
82
  end
76
83
 
77
84
  # Haml rendering helper. Data to be added to a @content value
@@ -125,7 +132,7 @@ module RoadForest::MediaType
125
132
  # @return [String] value to use to identify URI
126
133
  # @raise [RDF::WriterError]
127
134
  def get_curie(resource)
128
- @_engine.get_curie(resource)
135
+ _engine.get_curie(resource)
129
136
  end
130
137
 
131
138
  ##
@@ -1,20 +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 SubjectEnvironment < RenderEnvironment
5
- attr_accessor :base, :element, :predicate_terms, :property_objects, :rel, :inlist, :subject, :typeof
6
-
7
- # Write a predicate with one or more values.
8
- #
9
- # Values may be a combination of Literal and Resource (Node or URI).
10
- # @param [RDF::Resource] predicate
11
- # Predicate to serialize
12
- # @param [Array<RDF::Resource>] objects
13
- # Objects to serialize
14
- # @return [String]
15
- def predicate(predicate)
16
- @_engine.render_predicate(subject, predicate)
17
- end
5
+ attr_accessor :base, :predicate_terms, :property_objects, :rel, :inlist, :subject, :typeof
18
6
 
19
7
  def attrs
20
8
  {:rel => rel, :resource => (about || resource), :typeof => typeof, :inlist => inlist}
@@ -35,12 +23,12 @@ module RoadForest::MediaType
35
23
  next if objects.nil? or objects.empty?
36
24
 
37
25
  nonlists, lists = objects.partition do |object|
38
- !@_engine.is_list?(object)
26
+ !_engine.is_list?(object)
39
27
  end
40
28
 
41
29
  add_debug {"properties with lists: #{lists} non-lists: #{nonlists}"}
42
30
 
43
- ([@_engine.simple_property_env(predicate, nonlists)] + @_engine.list_property_envs(predicate, lists)).compact.each do |env|
31
+ ([simple_property_env(predicate, nonlists)] + list_property_envs(predicate, lists)).compact.each do |env|
44
32
  yield(env)
45
33
  end
46
34
  end
@@ -51,8 +39,8 @@ module RoadForest::MediaType
51
39
  end
52
40
 
53
41
  def render_checked
54
- return true if @_engine.is_done?(subject)
55
- @_engine.subject_done(subject)
42
+ return true if _engine.is_done?(subject)
43
+ _engine.subject_done(subject)
56
44
  return false
57
45
  end
58
46
 
@@ -71,10 +59,6 @@ module RoadForest::MediaType
71
59
  get_curie(subject)
72
60
  end
73
61
  end
74
-
75
- def yielded(pred)
76
- @_engine.render(pred)
77
- end
78
62
  end
79
63
  end
80
64
  end
@@ -0,0 +1,73 @@
1
+ require 'rdf/rdfa' #XXX Otherwise json-ld grabs RDFa documents. Awaiting fix upstream
2
+ require 'rdf'
3
+ require 'roadforest/type-handlers/rdf-handler'
4
+ require 'roadforest/type-handlers/rdfa-writer/render-engine'
5
+ module RoadForest
6
+ module TypeHandlers
7
+ #text/html;q=1;rdfa
8
+ #image/svg+xml;q=1;rdfa
9
+ #application/xhtml+xml;q=1;rdfa
10
+ #text/html
11
+ #image/svg+xml
12
+ #application/xhtml+xml
13
+ class RDFa < RDFHandler
14
+ include Graph::Normalization
15
+
16
+ attr_writer :valise, :tilt_cache
17
+
18
+ def valise
19
+ @valise ||= Valise.define do
20
+ ro up_to("lib") + "roadforest"
21
+ end
22
+ end
23
+
24
+ def tilt_cache
25
+ @tilt_cache ||= ::Tilt::Cache.new
26
+ end
27
+
28
+ def local_to_network(base_uri, rdf)
29
+ raise "Invalid base uri: #{base_uri}" if base_uri.nil?
30
+
31
+ debug = []
32
+
33
+ templates = RDFaWriter::TemplateHandler.new
34
+ templates.valise = valise
35
+ templates.template_cache = tilt_cache
36
+
37
+ engine = RDFaWriter::RenderEngine.new(rdf, debug) do |engine|
38
+ engine.graph_name = rdf.context
39
+ engine.base_uri = base_uri
40
+ engine.standard_prefixes = true
41
+ engine.template_handler = templates
42
+
43
+ #engine.style_name = options[:haml]
44
+ #engine.lang = options[:lang]
45
+
46
+ engine.top_classes = [::RDF::RDFS.Class]
47
+ engine.predicate_order = [::RDF.type, ::RDF::RDFS.label, ::RDF::DC.title]
48
+ engine.heading_predicates = [::RDF::RDFS.label, ::RDF::DC.title]
49
+ end
50
+
51
+ prefixes = relevant_prefixes_for_graph(rdf)
52
+ prefixes.keys.each do |prefix|
53
+ prefixes[prefix.to_sym] = prefixes[prefix]
54
+ end
55
+ engine.prefixes.merge! prefixes
56
+
57
+ #$stderr.puts debug
58
+
59
+ result = engine.render_document
60
+ end
61
+
62
+ def network_to_local(base_uri, source)
63
+ raise "Invalid base uri: #{base_uri.inspect}" if base_uri.nil?
64
+ graph = ::RDF::Graph.new
65
+ reader = ::RDF::RDFa::Reader.new(source.to_s, :base_uri => base_uri.to_s)
66
+ reader.each_statement do |statement|
67
+ graph.insert(statement)
68
+ end
69
+ graph
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,301 @@
1
+ require 'roadforest/type-handlers/rdf-handler'
2
+
3
+ module RoadForest
4
+ module TypeHandlers
5
+ #application/x-www-form-urlencoded
6
+ class RDFPost < RDFHandler
7
+
8
+ #c.f. http://www.lsrn.org/semweb/rdfpost.html
9
+ class Reader < ::RDF::Reader
10
+ module St
11
+ class State
12
+ def initialize(reader)
13
+ @reader = reader
14
+ @accept_hash = cleanup(accept_list)
15
+ end
16
+
17
+ def cleanup(accept_list)
18
+ hash = Hash.new{ accept_list[nil] }
19
+ accept_list.each_key do |key|
20
+ next if key.nil?
21
+ hash[key.to_s] = accept_list[key]
22
+ end
23
+ hash
24
+ end
25
+
26
+ def blank_node(name)
27
+ ::RDF::Node.new(name)
28
+ end
29
+
30
+ def base_uri
31
+ ::RDF::URI.intern(@reader.options[:base_uri])
32
+ end
33
+
34
+ def uri(string)
35
+ base_uri.join(string)
36
+ end
37
+
38
+ def prefix_uri(name)
39
+ ::RDF::URI.intern(@reader.options[:prefixes][name])
40
+ end
41
+
42
+ def clear_subject
43
+ @reader.subject = nil
44
+ @reader.subject_prefix = nil
45
+ end
46
+
47
+ def clear_predicate
48
+ @reader.predicate = nil
49
+ @reader.predicate_prefix = nil
50
+ end
51
+
52
+ def clear_object
53
+ @reader.object = nil
54
+ @reader.object_prefix = nil
55
+ end
56
+
57
+ def consume_next(name)
58
+ consume
59
+ next_state(name)
60
+ end
61
+
62
+ def consume
63
+ @reader.consume_pair
64
+ end
65
+
66
+ def triple_complete
67
+ @reader.new_triple = true
68
+ end
69
+
70
+ def next_state(name)
71
+ @reader.current_state = @reader.states.fetch(name)
72
+ end
73
+
74
+ def accept(key, value)
75
+ #puts "#{[self.class.to_s.sub(/.*:/,''), key,
76
+ #value.sub(/\s*\Z/,'')].inspect}"
77
+ @accept_hash[key][value.sub(/\s*\Z/,'')]
78
+ end
79
+ end
80
+
81
+ class RDF < State
82
+ def accept_list
83
+ { rdf: proc{|v| consume_next(:def_ns_decl) },
84
+ nil => proc{ consume } }
85
+ end
86
+ end
87
+
88
+ class DefNsDecl < State
89
+ def accept_list
90
+ { v: proc {|v| consume_next(:ns_decl); @reader.options[:prefixes][nil] = v},
91
+ nil => proc{|v| next_state(:ns_decl)}}
92
+ end
93
+ end
94
+
95
+ class NsDecl < State
96
+ def accept_list
97
+ { n: proc{|v| consume_next(:ns_decl_suffix); @reader.namespace_prefix = v},
98
+ nil => proc{|v| next_state(:subject)}}
99
+ end
100
+ end
101
+
102
+ class NsDeclSuffix < State
103
+ def accept_list
104
+ { v: proc{|v| consume_next(:ns_decl); @reader.options[:prefixes][@reader.namespace_prefix] = v},
105
+ nil => proc{ next_state(:ns_decl)}}
106
+ end
107
+ end
108
+
109
+ class SkipToSubject < State
110
+ def accept_list
111
+ next_is_subject = proc{ next_state(:subject); clear_subject; clear_predicate; clear_object }
112
+ {
113
+ sb: next_is_subject,
114
+ su: next_is_subject,
115
+ sv: next_is_subject,
116
+ sn: next_is_subject,
117
+ nil => proc{ consume }
118
+ }
119
+ end
120
+ end
121
+
122
+ class SkipToSubjectOrPred < SkipToSubject
123
+ def accept_list
124
+ next_is_pred = proc{ next_state(:predicate); clear_predicate; clear_object }
125
+ super.merge( pu: next_is_pred, pv: next_is_pred, pn: next_is_pred )
126
+ end
127
+ end
128
+
129
+ class Subject < State
130
+ def accept_list
131
+ {
132
+ sb: proc{|v| consume_next(:predicate); @reader.subject = blank_node(v)},
133
+ su: proc{|v| consume_next(:predicate); @reader.subject = uri(v)},
134
+ sv: proc{|v| consume_next(:predicate); @reader.subject = prefix_url(nil) / v},
135
+ sn: proc{|v| consume_next(:subject_suffix); @reader.subject_prefix = prefix_uri(v)},
136
+ nil => proc{ consume }
137
+ }
138
+ end
139
+ end
140
+
141
+ class SubjectSuffix < State
142
+ def accept_list
143
+ {
144
+ sv: proc{|v| consume_next(:predicate); @reader.subject = @reader.subject_prefix/v},
145
+ nil => proc{ next_state(:skip_to_subject)}
146
+ }
147
+ end
148
+ end
149
+
150
+ class Predicate < State
151
+ def accept_list
152
+ {
153
+ pu: proc {|v| @reader.predicate = uri(v); consume_next(:object)},
154
+ pv: proc {|v| @reader.predicate = prefix_uri(nil) / v; consume_next(:object)},
155
+ pn: proc {|v| @reader.predicate_prefix = prefix_uri(v); consume_next(:predicate_suffix)},
156
+ nil => proc { next_state(:skip_to_subject)}
157
+ }
158
+ end
159
+ end
160
+
161
+ class PredicateSuffix < State
162
+ def accept_list
163
+ {
164
+ pv: proc{|v| consume_next(:object); @reader.predicate = @reader.predicate_prefix/v},
165
+ nil => proc{ next_state(:skip_to_subject)}
166
+ }
167
+ end
168
+ end
169
+
170
+ class Object < State
171
+ def accept_list
172
+ {
173
+ ob: proc{|v| consume; triple_complete; @reader.object = blank_node(v)},
174
+ ou: proc{|v| consume; triple_complete; @reader.object = uri(v)},
175
+ ov: proc{|v| consume; triple_complete; @reader.object = prefix_uri(nil) / v},
176
+ on: proc{|v| consume_next(:object_suffix); @reader.object_prefix = prefix_uri(v)},
177
+ ol: proc{|v| consume_next(:type_or_lang); @reader.object = v},
178
+ ll: proc{|v| consume_next(:object_literal); @reader.object_lang = v},
179
+ lt: proc{|v| consume_next(:object_literal); @reader.object_type = v},
180
+ nil => proc{ next_state(:skip_to_subj_or_pred) }
181
+ }
182
+ end
183
+ end
184
+
185
+ class ObjectSuffix < State
186
+ def accept_list
187
+ {
188
+ ov: proc{|v| consume_next(:object); triple_complete; @reader.object = @reader.object_prefix/v},
189
+ nil => proc{ next_state(:skip_to_subj_or_pred)}
190
+ }
191
+ end
192
+ end
193
+
194
+ class ObjectLiteral < State
195
+ def accept_list
196
+ {
197
+ ol: proc{|v| consume_next(:type_or_lang); @reader.object = v},
198
+ ll: proc{|v| consume; @reader.object_lang = v},
199
+ lt: proc{|v| consume; @reader.object_type = v},
200
+ nil => proc{ next_state(:skip_to_subj_or_pred)}
201
+ }
202
+ end
203
+ end
204
+
205
+ class TypeOrLang < State
206
+ def accept_list
207
+ {
208
+ ll: proc{|v| consume; @reader.object_lang = v},
209
+ lt: proc{|v| consume; @reader.object_type = v},
210
+ nil => proc{ next_state(:object); triple_complete }
211
+ }
212
+ end
213
+ end
214
+ end
215
+
216
+ def initialize(input, options=nil, &block)
217
+ super(input, options||{}, &block)
218
+
219
+ @lineno = 0
220
+ @new_triple = false
221
+
222
+ @states = {
223
+ :rdf => St::RDF.new(self),
224
+ :def_ns_decl => St::DefNsDecl.new(self),
225
+ :ns_decl => St::NsDecl.new(self),
226
+ :ns_decl_suffix => St::NsDeclSuffix.new(self),
227
+ :skip_to_subject => St::SkipToSubject.new(self),
228
+ :skip_to_subj_or_pred => St::SkipToSubjectOrPred.new(self),
229
+ :subject => St::Subject.new(self),
230
+ :subject_suffix => St::SubjectSuffix.new(self),
231
+ :predicate => St::Predicate.new(self),
232
+ :predicate_suffix => St::PredicateSuffix.new(self),
233
+ :object => St::Object.new(self),
234
+ :object_suffix => St::ObjectSuffix.new(self),
235
+ :object_literal => St::ObjectLiteral.new(self),
236
+ :type_or_lang => St::TypeOrLang.new(self)
237
+ }
238
+
239
+ @current_state = @states.fetch(:rdf)
240
+ end
241
+ attr_reader :lineno, :states
242
+ attr_accessor :current_state
243
+ attr_accessor :new_triple, :subject, :predicate, :object
244
+ attr_accessor :object_type, :object_lang
245
+ attr_accessor :namespace_prefix, :subject_prefix, :predicate_prefix, :object_prefix
246
+
247
+ def read_triple
248
+ if @lineno >= @input.length
249
+ raise EOFError
250
+ end
251
+
252
+ while @lineno < @input.length
253
+ @current_state.accept(*@input[@lineno])
254
+ if @new_triple
255
+ @new_triple = false
256
+ return build_triple
257
+ end
258
+ end
259
+
260
+ return build_triple
261
+ end
262
+
263
+ def build_triple
264
+ if @object.nil? or @predicate.nil? or @subject.nil?
265
+ raise EOFError
266
+ end
267
+
268
+ object = @object
269
+ if object.is_a? String
270
+ object = ::RDF::Literal.new(object, :datatype => object_type, :language => object_lang)
271
+ end
272
+ @object_type = nil
273
+ @object_lang = nil
274
+
275
+ [@subject, @predicate, object]
276
+ end
277
+
278
+ def rewind
279
+ @lineno = 0
280
+ end
281
+
282
+ def consume_pair
283
+ @lineno += 1
284
+ end
285
+ end
286
+
287
+ def local_to_network(base_uri, graph)
288
+ end
289
+
290
+ def network_to_local(base_uri, list)
291
+ raise "Invalid base uri: #{base_uri.inspect}" if base_uri.nil?
292
+ graph = ::RDF::Graph.new
293
+ reader = Reader.new(list, :base_uri => base_uri.to_s)
294
+ reader.each_statement do |statement|
295
+ graph.insert(statement)
296
+ end
297
+ graph
298
+ end
299
+ end
300
+ end
301
+ end