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,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