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.
- checksums.yaml +4 -4
- data/examples/file-management.rb +12 -13
- data/lib/roadforest-client.rb +3 -0
- data/lib/roadforest-common.rb +2 -0
- data/lib/roadforest-server.rb +7 -0
- data/lib/roadforest-testing.rb +1 -0
- data/lib/roadforest/application.rb +9 -7
- data/lib/roadforest/application/dispatcher.rb +39 -63
- data/lib/roadforest/application/parameters.rb +1 -1
- data/lib/roadforest/application/path-provider.rb +2 -2
- data/lib/roadforest/application/route-adapter.rb +130 -18
- data/lib/roadforest/application/services-host.rb +0 -4
- data/lib/roadforest/augment/affordance.rb +78 -0
- data/lib/roadforest/augment/augmentation.rb +97 -0
- data/lib/roadforest/augment/augmenter.rb +54 -0
- data/lib/roadforest/augmentations.rb +1 -0
- data/lib/roadforest/content-handling.rb +1 -0
- data/lib/roadforest/content-handling/common-engines.rb +67 -0
- data/lib/roadforest/content-handling/engine.rb +2 -14
- data/lib/roadforest/content-handling/handler-wrap.rb +29 -31
- data/lib/roadforest/content-handling/media-type.rb +6 -0
- data/lib/roadforest/{rdf.rb → graph.rb} +1 -1
- data/lib/roadforest/{rdf → graph}/access-manager.rb +12 -74
- data/lib/roadforest/{rdf → graph}/document.rb +1 -1
- data/lib/roadforest/{rdf → graph}/etagging.rb +2 -2
- data/lib/roadforest/{rdf → graph}/focus-list.rb +1 -9
- data/lib/roadforest/{rdf → graph}/graph-copier.rb +2 -2
- data/lib/roadforest/{rdf → graph}/graph-focus.rb +5 -7
- data/lib/roadforest/{rdf → graph}/normalization.rb +1 -1
- data/lib/roadforest/{rdf → graph}/post-focus.rb +2 -3
- data/lib/roadforest/graph/vocabulary.rb +96 -0
- data/lib/roadforest/http/graph-transfer.rb +2 -2
- data/lib/roadforest/interface/application.rb +145 -0
- data/lib/roadforest/interface/blob.rb +38 -0
- data/lib/roadforest/interface/rdf.rb +77 -0
- data/lib/roadforest/interfaces.rb +2 -0
- data/lib/roadforest/remote-host.rb +17 -17
- data/lib/roadforest/resource.rb +4 -0
- data/lib/roadforest/resource/{rdf/leaf-item.rb → leaf-item.rb} +1 -1
- data/lib/roadforest/resource/{rdf/list.rb → list.rb} +1 -1
- data/lib/roadforest/resource/{rdf/parent-item.rb → parent-item.rb} +1 -1
- data/lib/roadforest/resource/{rdf/read-only.rb → read-only.rb} +18 -18
- data/lib/roadforest/resource/role/has-children.rb +1 -1
- data/lib/roadforest/resource/role/writable.rb +2 -2
- data/lib/roadforest/server.rb +1 -1
- data/lib/roadforest/source-rigor.rb +9 -0
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence-annealer.rb +2 -2
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence.rb +5 -5
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/any.rb +1 -1
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/none-if-role-absent.rb +1 -1
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/role-if-available.rb +1 -1
- data/lib/roadforest/source-rigor/engine.rb +45 -0
- data/lib/roadforest/{rdf → source-rigor}/graph-store.rb +9 -9
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/http-investigator.rb +2 -2
- data/lib/roadforest/{rdf → source-rigor}/investigation.rb +2 -2
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/investigator.rb +3 -3
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/null-investigator.rb +3 -2
- data/lib/roadforest/{rdf → source-rigor}/parcel.rb +5 -5
- data/lib/roadforest/{rdf → source-rigor}/resource-pattern.rb +6 -6
- data/lib/roadforest/{rdf → source-rigor}/resource-query.rb +2 -2
- data/lib/roadforest/source-rigor/rigorous-access.rb +101 -0
- data/lib/roadforest/templates/affordance-doc.haml +23 -0
- data/lib/roadforest/templates/affordance-property-values.haml +13 -0
- data/lib/roadforest/templates/affordance-subject.haml +9 -0
- data/lib/roadforest/templates/affordance-uri-object.haml +2 -0
- data/lib/roadforest/templates/base/{property_value.haml → property-value.haml} +0 -0
- data/lib/roadforest/templates/base/{property_values.haml → property-values.haml} +0 -0
- data/lib/roadforest/templates/distiller/{property_value.haml → property-value.haml} +0 -0
- data/lib/roadforest/templates/distiller/{property_values.haml → property-values.haml} +0 -0
- data/lib/roadforest/templates/min/{property_values.haml → property-values.haml} +0 -0
- data/lib/roadforest/templates/rdfpost-curie.haml +6 -0
- data/lib/roadforest/test-support/dispatcher-facade.rb +2 -0
- data/lib/roadforest/test-support/matchers.rb +169 -5
- data/lib/roadforest/test-support/remote-host.rb +2 -2
- data/lib/roadforest/type-handlers/handler.rb +74 -0
- data/lib/roadforest/type-handlers/jsonld.rb +34 -0
- data/lib/roadforest/type-handlers/rdf-handler.rb +36 -0
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer.rb +2 -2
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/document-environment.rb +9 -8
- data/lib/roadforest/type-handlers/rdfa-writer/environment-decorator.rb +312 -0
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/object-environment.rb +3 -3
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/property-environment.rb +5 -11
- data/lib/roadforest/type-handlers/rdfa-writer/render-engine.rb +427 -0
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/render-environment.rb +33 -26
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/subject-environment.rb +7 -23
- data/lib/roadforest/type-handlers/rdfa.rb +73 -0
- data/lib/roadforest/type-handlers/rdfpost.rb +301 -0
- data/lib/roadforest/utility/class-registry.rb +23 -5
- data/spec/.ctrlp-root +0 -0
- data/spec/affordance-augmenter.rb +75 -0
- data/spec/affordances-flow.rb +438 -0
- data/spec/authorization.rb +34 -0
- data/spec/client.rb +13 -12
- data/spec/credence-annealer.rb +5 -5
- data/spec/focus-list.rb +8 -8
- data/spec/full-integration.rb +3 -3
- data/spec/graph-copier.rb +4 -4
- data/spec/graph-store.rb +19 -31
- data/spec/keychain.rb +82 -0
- data/spec/rdf-normalization.rb +2 -2
- data/spec/rdf-parcel.rb +3 -3
- data/spec/rdfa-handler.rb +514 -0
- data/spec/rdfpost.rb +96 -0
- data/spec/source-rigor.rb +57 -0
- data/spec/update-focus.rb +11 -10
- metadata +91 -66
- data/lib/roadforest/blob-model.rb +0 -53
- data/lib/roadforest/content-handling/type-handler.rb +0 -76
- data/lib/roadforest/content-handling/type-handlers/jsonld.rb +0 -36
- data/lib/roadforest/content-handling/type-handlers/rdf-handler.rb +0 -38
- data/lib/roadforest/content-handling/type-handlers/rdfa-writer/render-engine.rb +0 -574
- data/lib/roadforest/content-handling/type-handlers/rdfa.rb +0 -175
- data/lib/roadforest/content-handling/type-handlers/rdfpost.rb +0 -297
- data/lib/roadforest/model.rb +0 -209
- data/lib/roadforest/models.rb +0 -2
- data/lib/roadforest/rdf/source-rigor.rb +0 -44
- data/lib/roadforest/rdf/vocabulary.rb +0 -11
- data/lib/roadforest/resource/http/form-parsing.rb +0 -81
- data/lib/roadforest/resource/rdf.rb +0 -4
- data/spec/form-parsing.rb +0 -1
|
@@ -1,13 +1,18 @@
|
|
|
1
|
-
require 'roadforest/
|
|
2
|
-
module RoadForest::
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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 <li> 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 !=
|
|
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
|
-
|
|
135
|
+
_engine.get_curie(resource)
|
|
129
136
|
end
|
|
130
137
|
|
|
131
138
|
##
|
|
@@ -1,20 +1,8 @@
|
|
|
1
|
-
require 'roadforest/
|
|
2
|
-
module RoadForest::
|
|
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, :
|
|
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
|
-
|
|
26
|
+
!_engine.is_list?(object)
|
|
39
27
|
end
|
|
40
28
|
|
|
41
29
|
add_debug {"properties with lists: #{lists} non-lists: #{nonlists}"}
|
|
42
30
|
|
|
43
|
-
([
|
|
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
|
|
55
|
-
|
|
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
|