Class: Annotations2triannon::OpenAnnotation
- Inherits:
-
Object
- Object
- Annotations2triannon::OpenAnnotation
- Defined in:
- lib/annotations2triannon/open_annotation.rb
Overview
class OpenAnnotation < Resource
Constant Summary collapse
- CONTENT =
RDF::Vocab::CNT
- OA =
RDF::Vocab::OA
- OA_CONTEXT =
'http://www.w3.org/ns/oa.jsonld'- IIIF_CONTEXT =
'http://iiif.io/api/presentation/2/context.json'
Instance Attribute Summary collapse
-
#graph ⇒ Object
an RDF::Graph.
-
#id ⇒ Object
Returns the value of attribute id.
Instance Method Summary collapse
-
#annotatedAt ⇒ Array<String>|nil
The datetime from the annotatedAt object(s).
-
#annotatedBy ⇒ Array<String>|nil
The identity for the annotatedBy object(s).
-
#annotatedBy?(uri = nil) ⇒ boolean
True if the open annotation has any annotatedBy ‘uri’.
-
#as_jsonld ⇒ Object
A json-ld representation of the open annotation.
- #body_contentAsText ⇒ Object
- #body_contentAsText? ⇒ Boolean
-
#body_contentChars ⇒ Array<String>
For all bodies that are of type ContentAsText, get the characters as a single String in the returned Array.
- #body_graph ⇒ Object
- #body_semanticTag ⇒ Object
- #body_semanticTag? ⇒ Boolean
- #body_type(uri = nil) ⇒ Object
- #get_id ⇒ Object
-
#hasBody ⇒ Array
The hasBody object(s).
- #hasBody? ⇒ Boolean
-
#hasTarget ⇒ Array
The hasTarget object(s).
- #hasTarget? ⇒ Boolean
-
#initialize(graph = RDF::Graph.new, id = nil) ⇒ OpenAnnotation
constructor
instantiate this class.
- #insert_annotatedAt(datetime = rdf_now) ⇒ Object
- #insert_annotatedBy(annotator = nil) ⇒ Object
- #insert_annotation ⇒ Object
- #insert_hasBody(body) ⇒ Object
- #insert_hasTarget(target) ⇒ Object
-
#insert_motivatedBy(motivation) ⇒ Object
Insert an ?o for [id, OA.motivatedBy, ?o] where ?o is ‘motivation’.
-
#insert_motivatedByCommenting ⇒ Object
Insert [id, OA.motivatedBy, OA.commenting].
-
#insert_motivatedByTagging ⇒ Object
Insert [id, OA.motivatedBy, OA.tagging].
-
#is_annotation? ⇒ boolean
True if RDF.type is OA.Annotation.
-
#motivatedBy(uri = nil) ⇒ Array
Find any matching ?o for ?s OA.motivatedBy ?o where ?o is ‘uri’.
-
#motivatedBy?(uri = nil) ⇒ boolean
Are there any matching ?o for [?s, OA.motivatedBy, ?o] where ?o is ‘uri’.
-
#motivatedByCommenting ⇒ Object
Find all the matching ?s for [?s, OA.motivatedBy, OA.commenting].
-
#motivatedByCommenting? ⇒ Boolean
Are there any matching ?s for [?s, OA.motivatedBy, OA.commenting].
-
#motivatedByTagging ⇒ Object
Find all the matching ?s for [?s, OA.motivatedBy, OA.tagging].
-
#motivatedByTagging? ⇒ Boolean
Are there any matching ?s for [?s, OA.motivatedBy, OA.tagging].
-
#open_annotation? ⇒ boolean
True if RDF.type is OA.Annotation, with OA.hasBody and OA.hasTarget.
- #provenance ⇒ Object
- #rdf_now ⇒ Object
-
#to_jsonld(context = nil) ⇒ Object
Json-ld representation of graph with default context.
-
#to_jsonld_iiif ⇒ Object
Json-ld representation of graph with IIIF context.
-
#to_jsonld_oa ⇒ Object
Json-ld representation of graph with OpenAnnotation context.
-
#to_ttl ⇒ Object
A turtle string representation of the open annotation.
Constructor Details
#initialize(graph = RDF::Graph.new, id = nil) ⇒ OpenAnnotation
instantiate this class
19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/annotations2triannon/open_annotation.rb', line 19 def initialize(graph=RDF::Graph.new, id=nil) @@agent ||= Annotations2triannon::AGENT raise ArgumentError, 'graph must be RDF::Graph instance' unless graph.instance_of? RDF::Graph if graph.empty? # create a new open annotation @graph = graph id.nil? ? @id = get_id : @id = RDF::URI.parse(id) insert_annotation else @graph = graph raise ArgumentError, 'graph must be an open annotation' unless is_annotation? id.nil? ? @id = get_id : @id = id end end |
Instance Attribute Details
#graph ⇒ Object
an RDF::Graph
14 15 16 |
# File 'lib/annotations2triannon/open_annotation.rb', line 14 def graph @graph end |
#id ⇒ Object
Returns the value of attribute id.
13 14 15 |
# File 'lib/annotations2triannon/open_annotation.rb', line 13 def id @id end |
Instance Method Details
#annotatedAt ⇒ Array<String>|nil
Returns The datetime from the annotatedAt object(s).
219 220 221 222 |
# File 'lib/annotations2triannon/open_annotation.rb', line 219 def annotatedAt q = [nil, OA.annotatedAt, nil] @graph.query(q).collect {|s| s.object } end |
#annotatedBy ⇒ Array<String>|nil
Returns The identity for the annotatedBy object(s).
201 202 203 204 |
# File 'lib/annotations2triannon/open_annotation.rb', line 201 def annotatedBy q = [:s, OA.annotatedBy, :o] @graph.query(q).collect {|s| s.object } end |
#annotatedBy?(uri = nil) ⇒ boolean
Returns True if the open annotation has any annotatedBy ‘uri’.
208 209 210 211 212 |
# File 'lib/annotations2triannon/open_annotation.rb', line 208 def annotatedBy?(uri=nil) uri = RDF::URI.parse(uri) unless uri.nil? q = [nil, OA.annotatedBy, uri] @graph.query(q).size > 0 end |
#as_jsonld ⇒ Object
A json-ld representation of the open annotation
239 240 241 242 |
# File 'lib/annotations2triannon/open_annotation.rb', line 239 def as_jsonld provenance JSON::LD::API::fromRDF(@graph) end |
#body_contentAsText ⇒ Object
110 111 112 |
# File 'lib/annotations2triannon/open_annotation.rb', line 110 def body_contentAsText body_type CONTENT.ContentAsText end |
#body_contentAsText? ⇒ Boolean
114 115 116 |
# File 'lib/annotations2triannon/open_annotation.rb', line 114 def body_contentAsText? body_contentAsText.size > 0 end |
#body_contentChars ⇒ Array<String>
For all bodies that are of type ContentAsText, get the characters as a single String in the returned Array.
120 121 122 123 124 125 |
# File 'lib/annotations2triannon/open_annotation.rb', line 120 def body_contentChars q = RDF::Query.new q << [:body, RDF.type, CONTENT.ContentAsText] q << [:body, CONTENT.chars, :body_chars] body_graph.query(q).collect {|s| s.body_chars.value } end |
#body_graph ⇒ Object
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
# File 'lib/annotations2triannon/open_annotation.rb', line 92 def body_graph return @body_graph unless @body_graph.nil? g = RDF::Graph.new hasBody.each do |b| @graph.query( [b, :p, :o] ).each_statement {|s| g << s} # if b.uri? # begin # b_resource = Resource.new(b) # b_resource.rdf.each_statement {|s| g << s} # rescue # # Nothing to be done here; the Resource#rdf method # # will log errors in RDF retrieval # end # end end @body_graph = g end |
#body_semanticTag ⇒ Object
127 128 129 |
# File 'lib/annotations2triannon/open_annotation.rb', line 127 def body_semanticTag body_type OA.SemanticTag end |
#body_semanticTag? ⇒ Boolean
131 132 133 |
# File 'lib/annotations2triannon/open_annotation.rb', line 131 def body_semanticTag? body_semanticTag.size > 0 end |
#body_type(uri = nil) ⇒ Object
135 136 137 138 |
# File 'lib/annotations2triannon/open_annotation.rb', line 135 def body_type(uri=nil) uri = RDF::URI.parse(uri) unless uri.nil? body_graph.query([:body, RDF.type, uri]) end |
#get_id ⇒ Object
34 35 36 37 38 |
# File 'lib/annotations2triannon/open_annotation.rb', line 34 def get_id return @id unless @id.nil? q = [nil, RDF.type, OA.Annotation] @id = @graph.query(q).collect {|s| s.subject }.first || RDF::URI.parse(UUID.generate) end |
#hasBody ⇒ Array
Returns The hasBody object(s).
83 84 85 86 |
# File 'lib/annotations2triannon/open_annotation.rb', line 83 def hasBody q = [nil, OA.hasBody, nil] @graph.query(q).collect {|s| s.object } end |
#hasBody? ⇒ Boolean
88 89 90 |
# File 'lib/annotations2triannon/open_annotation.rb', line 88 def hasBody? hasBody.length > 0 end |
#hasTarget ⇒ Array
Returns The hasTarget object(s).
68 69 70 71 |
# File 'lib/annotations2triannon/open_annotation.rb', line 68 def hasTarget q = [nil, OA.hasTarget, nil] @graph.query(q).collect {|s| s.object } end |
#hasTarget? ⇒ Boolean
73 74 75 |
# File 'lib/annotations2triannon/open_annotation.rb', line 73 def hasTarget? hasTarget.length > 0 end |
#insert_annotatedAt(datetime = rdf_now) ⇒ Object
214 215 216 |
# File 'lib/annotations2triannon/open_annotation.rb', line 214 def insert_annotatedAt(datetime=rdf_now) @graph.insert([@id, OA.annotatedAt, datetime]) end |
#insert_annotatedBy(annotator = nil) ⇒ Object
196 197 198 |
# File 'lib/annotations2triannon/open_annotation.rb', line 196 def insert_annotatedBy(annotator=nil) @graph.insert([@id, OA.annotatedBy, annotator]) end |
#insert_annotation ⇒ Object
50 51 52 53 54 |
# File 'lib/annotations2triannon/open_annotation.rb', line 50 def insert_annotation s = [@id, RDF.type, OA.Annotation] @graph.delete(s) @graph.insert(s) end |
#insert_hasBody(body) ⇒ Object
77 78 79 80 |
# File 'lib/annotations2triannon/open_annotation.rb', line 77 def insert_hasBody(body) # TODO: raise ValueError when body is outside hasBody range? @graph.insert([@id, OA.hasBody, body]) end |
#insert_hasTarget(target) ⇒ Object
62 63 64 65 |
# File 'lib/annotations2triannon/open_annotation.rb', line 62 def insert_hasTarget(target) # TODO: raise ValueError when target is outside hasTarget range? @graph.insert([@id, OA.hasTarget, target]) end |
#insert_motivatedBy(motivation) ⇒ Object
Insert an ?o for [id, OA.motivatedBy, ?o] where ?o is ‘motivation’
142 143 144 145 146 |
# File 'lib/annotations2triannon/open_annotation.rb', line 142 def insert_motivatedBy(motivation) # TODO: only accept values allowed by OA.motivationBy range? motivation = RDF::URI.parse(motivation) @graph.insert([@id, OA.motivatedBy, motivation]) end |
#insert_motivatedByCommenting ⇒ Object
Insert [id, OA.motivatedBy, OA.commenting]
165 166 167 |
# File 'lib/annotations2triannon/open_annotation.rb', line 165 def insert_motivatedByCommenting insert_motivatedBy OA.commenting end |
#insert_motivatedByTagging ⇒ Object
Insert [id, OA.motivatedBy, OA.tagging]
181 182 183 |
# File 'lib/annotations2triannon/open_annotation.rb', line 181 def insert_motivatedByTagging insert_motivatedBy OA.tagging end |
#is_annotation? ⇒ boolean
Returns true if RDF.type is OA.Annotation.
57 58 59 60 |
# File 'lib/annotations2triannon/open_annotation.rb', line 57 def is_annotation? q = [@id, RDF.type, OA.Annotation] @graph.query(q).size > 0 end |
#motivatedBy(uri = nil) ⇒ Array
Find any matching ?o for ?s OA.motivatedBy ?o where ?o is ‘uri’
151 152 153 154 155 |
# File 'lib/annotations2triannon/open_annotation.rb', line 151 def motivatedBy(uri=nil) uri = RDF::URI.parse(uri) unless uri.nil? q = [nil, OA.motivatedBy, uri] @graph.query(q).collect {|s| s.object } end |
#motivatedBy?(uri = nil) ⇒ boolean
Are there any matching ?o for [?s, OA.motivatedBy, ?o] where ?o is ‘uri’
160 161 162 |
# File 'lib/annotations2triannon/open_annotation.rb', line 160 def motivatedBy?(uri=nil) motivatedBy(uri).length > 0 end |
#motivatedByCommenting ⇒ Object
Find all the matching ?s for [?s, OA.motivatedBy, OA.commenting]
170 171 172 173 |
# File 'lib/annotations2triannon/open_annotation.rb', line 170 def motivatedByCommenting q = [nil, OA.motivatedBy, OA.commenting] @graph.query(q).collect {|s| s.subject } end |
#motivatedByCommenting? ⇒ Boolean
Are there any matching ?s for [?s, OA.motivatedBy, OA.commenting]
176 177 178 |
# File 'lib/annotations2triannon/open_annotation.rb', line 176 def motivatedByCommenting? motivatedByCommenting.length > 0 end |
#motivatedByTagging ⇒ Object
Find all the matching ?s for [?s, OA.motivatedBy, OA.tagging]
186 187 188 189 |
# File 'lib/annotations2triannon/open_annotation.rb', line 186 def motivatedByTagging q = [nil, OA.motivatedBy, OA.tagging] @graph.query(q).collect {|s| s.subject } end |
#motivatedByTagging? ⇒ Boolean
Are there any matching ?s for [?s, OA.motivatedBy, OA.tagging]
192 193 194 |
# File 'lib/annotations2triannon/open_annotation.rb', line 192 def motivatedByTagging? motivatedByTagging.length > 0 end |
#open_annotation? ⇒ boolean
Returns true if RDF.type is OA.Annotation, with OA.hasBody and OA.hasTarget.
41 42 43 44 45 46 47 48 |
# File 'lib/annotations2triannon/open_annotation.rb', line 41 def open_annotation? # TODO: check rules for basic open annotation q = RDF::Query.new q << [@id, RDF.type, OA.Annotation] q << [@id, OA.hasBody, :b] q << [@id, OA.hasTarget, :t] @graph.query(q).size > 0 end |
#provenance ⇒ Object
228 229 230 231 232 233 234 235 236 |
# File 'lib/annotations2triannon/open_annotation.rb', line 228 def provenance # http://www.openannotation.org/spec/core/core.html#Provenance # When adding the agent, ensure it's not there already, also # an open annotation cannot have more than one oa:serializedAt. @graph.delete([nil,nil,@@agent]) @graph.delete([nil, OA.serializedAt, nil]) @graph << [@id, OA.serializedAt, rdf_now] @graph << [@id, OA.serializedBy, @@agent] end |
#rdf_now ⇒ Object
224 225 226 |
# File 'lib/annotations2triannon/open_annotation.rb', line 224 def rdf_now RDF::Literal.new(Time.now.utc, :datatype => RDF::XSD.dateTime) end |
#to_jsonld(context = nil) ⇒ Object
Returns json-ld representation of graph with default context.
246 247 248 249 250 251 252 253 |
# File 'lib/annotations2triannon/open_annotation.rb', line 246 def to_jsonld(context=nil) provenance if context.nil? @graph.dump(:jsonld, standard_prefixes: true) else @graph.dump(:jsonld, standard_prefixes: true, context: context) end end |
#to_jsonld_iiif ⇒ Object
Returns json-ld representation of graph with IIIF context.
256 257 258 |
# File 'lib/annotations2triannon/open_annotation.rb', line 256 def to_jsonld_iiif to_jsonld IIIF_CONTEXT end |
#to_jsonld_oa ⇒ Object
Returns json-ld representation of graph with OpenAnnotation context.
261 262 263 |
# File 'lib/annotations2triannon/open_annotation.rb', line 261 def to_jsonld_oa to_jsonld OA_CONTEXT end |
#to_ttl ⇒ Object
A turtle string representation of the open annotation
266 267 268 269 |
# File 'lib/annotations2triannon/open_annotation.rb', line 266 def to_ttl provenance @graph.dump(:ttl, standard_prefixes: true) end |