annotations2triannon 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.env_example +44 -0
- data/.travis.yml +15 -0
- data/Gemfile +5 -0
- data/LICENSE +202 -0
- data/README.md +31 -0
- data/Rakefile +50 -0
- data/annotations2triannon.gemspec +58 -0
- data/bin/console +5 -0
- data/bin/ctags.rb +8 -0
- data/bin/dms.rb +175 -0
- data/bin/revs.rb +17 -0
- data/bin/revs_annotations2csv.sh +66 -0
- data/lib/annotations2triannon/annotation_list.rb +37 -0
- data/lib/annotations2triannon/configuration.rb +52 -0
- data/lib/annotations2triannon/iiif_annotation_list.rb +17 -0
- data/lib/annotations2triannon/iiif_collection.rb +56 -0
- data/lib/annotations2triannon/iiif_manifest.rb +32 -0
- data/lib/annotations2triannon/iiif_navigator.rb +172 -0
- data/lib/annotations2triannon/manifest.rb +86 -0
- data/lib/annotations2triannon/open_annotation.rb +262 -0
- data/lib/annotations2triannon/open_annotation_harvest.rb +37 -0
- data/lib/annotations2triannon/resource.rb +264 -0
- data/lib/annotations2triannon/revs.rb +263 -0
- data/lib/annotations2triannon/revs_db.rb +69 -0
- data/lib/annotations2triannon/shared_canvas_annotation_list.rb +18 -0
- data/lib/annotations2triannon/shared_canvas_manifest.rb +32 -0
- data/lib/annotations2triannon.rb +27 -0
- data/lib/rdf/vocab/Content.rb +112 -0
- data/lib/rdf/vocab/sc.rb +233 -0
- data/lib/requires.rb +69 -0
- data/log/.gitignore +4 -0
- data/spec/lib/annotations2triannon/configuration_spec.rb +24 -0
- data/spec/lib/annotations2triannon/open_annotation_spec.rb +176 -0
- data/spec/lib/annotations2triannon/resource_spec.rb +53 -0
- data/spec/lib/annotations2triannon_spec.rb +45 -0
- data/spec/spec_helper.rb +10 -0
- metadata +387 -0
@@ -0,0 +1,66 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
#===============================================================================
|
3
|
+
#
|
4
|
+
# FILE: revs_annotations2csv.sh
|
5
|
+
#
|
6
|
+
# USAGE: ./revs_annotations2csv.sh
|
7
|
+
#
|
8
|
+
# DESCRIPTION:
|
9
|
+
#
|
10
|
+
# OPTIONS: ---
|
11
|
+
# REQUIREMENTS: ---
|
12
|
+
# BUGS: ---
|
13
|
+
# NOTES: ---
|
14
|
+
# AUTHOR: Darren L. Weber, Ph.D. (), darren.weber@stanford.edu
|
15
|
+
# COMPANY: Stanford University
|
16
|
+
# VERSION: 1.0
|
17
|
+
# CREATED: 02/04/2015 02:24:13 PM PST
|
18
|
+
# REVISION: ---
|
19
|
+
#===============================================================================
|
20
|
+
|
21
|
+
source .env
|
22
|
+
# .env should export:
|
23
|
+
#export REVS_SRC_USER - user with login privilege on REVS_SRC_HOST
|
24
|
+
#export REVS_SRC_HOST - REVS_SRC_HOST should have access to REVS mysql db
|
25
|
+
# There should be a script in $REVS_SRC_USER@$REVS_SRC_HOST:~/revs_annotations_dump.sh
|
26
|
+
# That script should dump mysql tables into $REVS_SRC_USER@$REVS_SRC_HOST:~/revs_annotations.sql
|
27
|
+
# These ssh/scp connections may rely on Kerberos authentication.
|
28
|
+
ssh ${REVS_SRC_USER}@${REVS_SRC_HOST} '~/revs_annotations_dump.sh'
|
29
|
+
scp ${REVS_SRC_USER}@${REVS_SRC_HOST}:~/revs_annotations.sql .
|
30
|
+
|
31
|
+
sleep 1
|
32
|
+
if [ ! -s revs_annotations.sql ]; then
|
33
|
+
echo 'failed to dump and retrieve revs_annotations.sql'
|
34
|
+
exit 1
|
35
|
+
fi
|
36
|
+
|
37
|
+
# assumes the 'revs' db has been created and the current
|
38
|
+
# shell $USER has required privileges to run SQL in revs_annotations.sql,
|
39
|
+
# such as DROP/CREATE/LOCK table, INSERT etc. Also note that the
|
40
|
+
# $USER must have a MySQL password stored in ~/.mysql_pass
|
41
|
+
pass4mysql=$(cat ~/.mysql_pass)
|
42
|
+
mysql --user=$USER --password=${pass4mysql} revs < revs_annotations.sql
|
43
|
+
if [ $? -ne 0 ]; then echo 'failed to import revs_annotations.sql'; exit 1; fi
|
44
|
+
echo "Imported revs annotations into local MySQL db."
|
45
|
+
|
46
|
+
out_path='/tmp/revs'
|
47
|
+
|
48
|
+
mkdir -p $out_path
|
49
|
+
if [ $? -ne 0 ]; then echo "failed to create ${out_path}"; exit 1; fi
|
50
|
+
|
51
|
+
chmod a+rwx /tmp/revs
|
52
|
+
if [ $? -ne 0 ]; then echo "failed to chmod ${out_path}"; exit 1; fi
|
53
|
+
|
54
|
+
# Assumes the $USER has FILE permission, i.e.
|
55
|
+
# GRANT FILE ON *.* TO 'USER'@'localhost';
|
56
|
+
mysqldump --tab="${out_path}" \
|
57
|
+
--fields-enclosed-by="'" \
|
58
|
+
--fields-terminated-by=';' \
|
59
|
+
--fields-escaped-by='"' \
|
60
|
+
--lines-terminated-by='\n' \
|
61
|
+
--user=$USER --password=${pass4mysql} revs annotations users
|
62
|
+
|
63
|
+
if [ $? -ne 0 ]; then echo 'failed to export revs to CSV'; exit 1; fi
|
64
|
+
echo "Exported revs annotations to CSV files at ${out_path}: "
|
65
|
+
ls -lh /tmp/revs/
|
66
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
|
2
|
+
module Annotations2triannon
|
3
|
+
|
4
|
+
class AnnotationList < Resource
|
5
|
+
|
6
|
+
include OpenAnnotationHarvest
|
7
|
+
|
8
|
+
attr_reader :open_annotations
|
9
|
+
|
10
|
+
def annotation_list?
|
11
|
+
sc_annotation_list? || iiif_annotation_list?
|
12
|
+
end
|
13
|
+
|
14
|
+
def iiif_annotation_list?
|
15
|
+
iri_type? RDF::IIIFPresentation.AnnotationList
|
16
|
+
end
|
17
|
+
|
18
|
+
def sc_annotation_list?
|
19
|
+
iri_type? RDF::SC.AnnotationList
|
20
|
+
end
|
21
|
+
|
22
|
+
def open_annotations
|
23
|
+
return @open_annotations unless @open_annotations.nil?
|
24
|
+
begin
|
25
|
+
oa_graphs = collect_open_annotations(rdf)
|
26
|
+
oa_graphs = oa_graphs.sample(@@config.limit_openannos) if @@config.limit_openannos > 0
|
27
|
+
oa_graphs.collect {|oa| Annotations2triannon::OpenAnnotation.new(oa)}
|
28
|
+
rescue => e
|
29
|
+
binding.pry if @@config.debug
|
30
|
+
@@config.logger.error(e.message)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
|
2
|
+
module Annotations2triannon
|
3
|
+
|
4
|
+
class Configuration
|
5
|
+
|
6
|
+
attr_reader :log_file
|
7
|
+
attr_reader :log_path
|
8
|
+
attr_reader :logger
|
9
|
+
|
10
|
+
attr_accessor :debug
|
11
|
+
attr_accessor :limit_manifests
|
12
|
+
attr_accessor :limit_annolists
|
13
|
+
attr_accessor :limit_openannos
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@debug = env_boolean('DEBUG')
|
17
|
+
|
18
|
+
# In development, enable options for random sampling the data
|
19
|
+
@limit_manifests = ENV['ANNO_LIMIT_MANIFESTS'].to_i # 0 disables sampling
|
20
|
+
@limit_annolists = ENV['ANNO_LIMIT_ANNOLISTS'].to_i # 0 disables sampling
|
21
|
+
@limit_openannos = ENV['ANNO_LIMIT_OPENANNOS'].to_i # 0 disables sampling
|
22
|
+
|
23
|
+
# logger
|
24
|
+
log_file = ENV['ANNO_LOG_FILE'] || 'annotations2triannon.log'
|
25
|
+
log_file = File.absolute_path log_file
|
26
|
+
@log_file = log_file
|
27
|
+
@log_path = File.dirname log_file
|
28
|
+
unless File.directory? @log_path
|
29
|
+
# try to create the log directory
|
30
|
+
Dir.mkdir @log_path rescue nil
|
31
|
+
end
|
32
|
+
begin
|
33
|
+
log_dev = File.new(@log_file, 'w+')
|
34
|
+
rescue
|
35
|
+
log_dev = $stderr
|
36
|
+
@log_file = 'STDERR'
|
37
|
+
end
|
38
|
+
log_dev.sync = true if @debug # skip IO buffering in debug mode
|
39
|
+
@logger = Logger.new(log_dev, 'monthly')
|
40
|
+
@logger.level = @debug ? Logger::DEBUG : Logger::INFO
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
def env_boolean(var)
|
45
|
+
# check if an ENV variable is true, use false as default
|
46
|
+
ENV[var].to_s.upcase == 'TRUE' rescue false
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
|
2
|
+
module Annotations2triannon
|
3
|
+
|
4
|
+
# A filter to exclude any Shared Canvas namespace content
|
5
|
+
class IIIFAnnotationList < AnnotationList
|
6
|
+
|
7
|
+
def annotation_list?
|
8
|
+
iiif_annotation_list?
|
9
|
+
end
|
10
|
+
|
11
|
+
def sc_annotation_list?
|
12
|
+
false
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
|
2
|
+
module Annotations2triannon
|
3
|
+
|
4
|
+
class IIIFCollection < Resource
|
5
|
+
|
6
|
+
attr_reader :manifests
|
7
|
+
attr_reader :iiif_manifests
|
8
|
+
attr_reader :sc_manifests
|
9
|
+
|
10
|
+
def collection?
|
11
|
+
iri_type? RDF::IIIFPresentation.Collection
|
12
|
+
end
|
13
|
+
|
14
|
+
def manifests
|
15
|
+
return @manifests unless @manifests.nil?
|
16
|
+
manifests = []
|
17
|
+
manifests.push(* manifest_uris(query_iiif_manifests))
|
18
|
+
manifests.push(* manifest_uris(query_sc_manifests))
|
19
|
+
@manifests = manifests.collect {|m| Annotations2triannon::Manifest.new(m)}
|
20
|
+
end
|
21
|
+
|
22
|
+
def sc_manifests
|
23
|
+
return @sc_manifests unless @sc_manifests.nil?
|
24
|
+
@sc_manifests = manifest_uris(query_sc_manifests).collect do |s|
|
25
|
+
Annotations2triannon::SharedCanvasManifest.new(s.subject)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def iiif_manifests
|
30
|
+
return @iiif_manifests unless @iiif_manifests.nil?
|
31
|
+
@iiif_manifests = manifest_uris(query_iiif_manifests).collect do |s|
|
32
|
+
Annotations2triannon::IIIFManifest.new(s.subject)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def manifest_uris(q)
|
40
|
+
uris = rdf.query(q).collect {|s| s.subject }
|
41
|
+
uris = uris.sample(@@config.limit_manifests) if @@config.limit_manifests > 0
|
42
|
+
uris
|
43
|
+
end
|
44
|
+
|
45
|
+
def query_iiif_manifests
|
46
|
+
[nil, RDF.type, RDF::IIIFPresentation.Manifest]
|
47
|
+
end
|
48
|
+
|
49
|
+
def query_sc_manifests
|
50
|
+
[nil, RDF.type, RDF::SC.Manifest]
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
|
2
|
+
module Annotations2triannon
|
3
|
+
|
4
|
+
# A filter to exclude any Shared Canvas namespace content
|
5
|
+
class IIIFManifest < Manifest
|
6
|
+
|
7
|
+
def manifest?
|
8
|
+
iiif_manifest?
|
9
|
+
end
|
10
|
+
|
11
|
+
def sc_manifest?
|
12
|
+
false
|
13
|
+
end
|
14
|
+
|
15
|
+
def annotation_lists
|
16
|
+
return @annotation_lists unless @annotation_lists.nil?
|
17
|
+
uris = collect_annotation_list_uris(query_iiif_annotation_list)
|
18
|
+
@annotation_lists = uris.collect do |uri|
|
19
|
+
Annotations2triannon::AnnotationList.new(uri)
|
20
|
+
end
|
21
|
+
@annotation_lists
|
22
|
+
end
|
23
|
+
|
24
|
+
def sc_annotation_lists
|
25
|
+
return @sc_annotation_lists unless @sc_annotation_lists.nil?
|
26
|
+
@sc_annotation_lists = []
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
@@ -0,0 +1,172 @@
|
|
1
|
+
|
2
|
+
module Annotations2triannon
|
3
|
+
|
4
|
+
class IIIFNavigator
|
5
|
+
|
6
|
+
@@config = nil
|
7
|
+
|
8
|
+
attr_accessor :collection
|
9
|
+
attr_accessor :manifests
|
10
|
+
attr_accessor :annotation_lists
|
11
|
+
attr_accessor :open_annotations
|
12
|
+
|
13
|
+
attr_accessor :iiif_collection
|
14
|
+
attr_accessor :iiif_manifests
|
15
|
+
attr_accessor :iiif_annotation_lists
|
16
|
+
attr_accessor :iiif_open_annotations
|
17
|
+
|
18
|
+
attr_accessor :sc_manifests
|
19
|
+
attr_accessor :sc_annotation_lists
|
20
|
+
attr_accessor :sc_open_annotations
|
21
|
+
|
22
|
+
|
23
|
+
# @param collection_uri [URI|String] an HTTP URI for a collection
|
24
|
+
def initialize(collection_uri)
|
25
|
+
@@config ||= Annotations2triannon.configuration
|
26
|
+
@uri = RDF::URI.parse(collection_uri)
|
27
|
+
@collection = nil
|
28
|
+
@manifests = nil
|
29
|
+
@annotation_lists = nil
|
30
|
+
@open_annotations = nil
|
31
|
+
@iiif_collection = nil
|
32
|
+
@iiif_manifests = nil
|
33
|
+
@iiif_annotation_lists = nil
|
34
|
+
@iiif_open_annotations = nil
|
35
|
+
@sc_manifests = nil
|
36
|
+
@sc_annotation_lists = nil
|
37
|
+
@sc_open_annotations = nil
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
# ----
|
42
|
+
# Collection utilities
|
43
|
+
|
44
|
+
# @return collection - a IIIF Presentation collection
|
45
|
+
def collection
|
46
|
+
# There may be no distinction between IIIF and SC at the collection level
|
47
|
+
iiif_collection
|
48
|
+
end
|
49
|
+
|
50
|
+
# @return iiif_collection - a IIIF Presentation collection
|
51
|
+
def iiif_collection
|
52
|
+
@iiif_collection ||= Annotations2triannon::IIIFCollection.new(@uri)
|
53
|
+
end
|
54
|
+
|
55
|
+
# There is no RDF::SC.Collection because SC uses alternate
|
56
|
+
# vocabularies for this level of discovery.
|
57
|
+
# def sc_collection
|
58
|
+
# @sc_collection ||= Annotations2triannon::SCCollection.new(@uri)
|
59
|
+
# end
|
60
|
+
|
61
|
+
|
62
|
+
# ----
|
63
|
+
# Manifest utilities
|
64
|
+
|
65
|
+
# @return [boolean] are there any manifests in the collection?
|
66
|
+
def manifests?
|
67
|
+
! manifests.empty?
|
68
|
+
end
|
69
|
+
# @return manifests [Array] generic manifests, either IIIF or SC manifests
|
70
|
+
def manifests
|
71
|
+
@manifests ||= collection.manifests
|
72
|
+
end
|
73
|
+
|
74
|
+
# IIIF manifests (excluding SC manifests)
|
75
|
+
# The RDF type of these manifests is declared in the parent collection.
|
76
|
+
# But, watch out, the manifest itself may declare a different RDF type!
|
77
|
+
|
78
|
+
# @return [boolean] are there any IIIF manifests in the collection?
|
79
|
+
def iiif_manifests?
|
80
|
+
! iiif_manifests.empty?
|
81
|
+
end
|
82
|
+
# @return iiif_manifests [Array] IIIF presentation manifests
|
83
|
+
def iiif_manifests
|
84
|
+
@iiif_manifests ||= collection.iiif_manifests
|
85
|
+
end
|
86
|
+
|
87
|
+
# SC manifests (excluding IIIF manifests)
|
88
|
+
# The RDF type of these manifests is declared in the parent collection.
|
89
|
+
# But, watch out, the manifest itself may declare a different RDF type!
|
90
|
+
|
91
|
+
# @return [boolean] are there any Shared Canvas manifests in the collection?
|
92
|
+
def sc_manifests?
|
93
|
+
! sc_manifests.empty?
|
94
|
+
end
|
95
|
+
# @return sc_manifests [Array] Shared Canvas manifests
|
96
|
+
def sc_manifests
|
97
|
+
@sc_manifests ||= collection.sc_manifests
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
# ----
|
102
|
+
# Annotation List utilities
|
103
|
+
|
104
|
+
# @return annotation_lists [Array] generic annotation lists
|
105
|
+
def annotation_lists
|
106
|
+
@annotation_lists ||= collect_annotation_lists(manifests)
|
107
|
+
end
|
108
|
+
|
109
|
+
# @return iiif_annotation_lists [Array] IIIF Presentation annotation lists
|
110
|
+
def iiif_annotation_lists
|
111
|
+
@iiif_annotation_lists ||= collect_annotation_lists(iiif_manifests)
|
112
|
+
end
|
113
|
+
|
114
|
+
# @return sc_annotation_lists [Array] Shared Canvas annotation lists
|
115
|
+
def sc_annotation_lists
|
116
|
+
@sc_annotation_lists ||= collect_annotation_lists(sc_manifests)
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
# ----
|
121
|
+
# Open Annotation utilities
|
122
|
+
# Note that these open annotations are from annotation lists, not
|
123
|
+
# directly from manifests.
|
124
|
+
|
125
|
+
# @return open_annotations [Array] Open Annotations from Annotation Lists
|
126
|
+
def open_annotations
|
127
|
+
@open_annotations ||= collect_open_annotations(annotation_lists)
|
128
|
+
end
|
129
|
+
|
130
|
+
# @return iiif_open_annotations [Array] Open Annotations from a IIIF Annotation Lists
|
131
|
+
def iiif_open_annotations
|
132
|
+
@iiif_open_annotations ||= collect_open_annotations(iiif_annotation_lists)
|
133
|
+
end
|
134
|
+
|
135
|
+
# @return sc_open_annotations [Array] Open Annotations from a Shared Canvas Annotation Lists
|
136
|
+
def sc_open_annotations
|
137
|
+
@sc_open_annotations ||= collect_open_annotations(sc_annotation_lists)
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
# def oa2triannon
|
142
|
+
#
|
143
|
+
# # TODO: - post the open_annotation to triannon-app
|
144
|
+
# # TODO: - check the http status on the post
|
145
|
+
# # TODO: - log.debug on success; log.error on errors
|
146
|
+
#
|
147
|
+
# end
|
148
|
+
|
149
|
+
private
|
150
|
+
|
151
|
+
def collect_annotation_lists(manifests)
|
152
|
+
anno_lists = {}
|
153
|
+
manifests.collect {|m| anno_lists[m.iri.to_s] = m.annotation_lists }
|
154
|
+
anno_lists
|
155
|
+
end
|
156
|
+
|
157
|
+
def collect_open_annotations(annotation_lists)
|
158
|
+
oa = {}
|
159
|
+
annotation_lists.each_pair do |manifest_uri, annotations_list|
|
160
|
+
oa[manifest_uri] = {} if oa[manifest_uri].nil?
|
161
|
+
annotations_list.each do |list|
|
162
|
+
list_uri = list.iri.to_s
|
163
|
+
oa[manifest_uri][list_uri] = list.open_annotations
|
164
|
+
end
|
165
|
+
end
|
166
|
+
oa
|
167
|
+
end
|
168
|
+
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
172
|
+
|
@@ -0,0 +1,86 @@
|
|
1
|
+
|
2
|
+
module Annotations2triannon
|
3
|
+
|
4
|
+
class Manifest < Resource
|
5
|
+
|
6
|
+
include OpenAnnotationHarvest
|
7
|
+
|
8
|
+
attr_reader :annotation_lists
|
9
|
+
attr_reader :open_annotations
|
10
|
+
|
11
|
+
def manifest?
|
12
|
+
iiif_manifest? || sc_manifest?
|
13
|
+
end
|
14
|
+
|
15
|
+
def iiif_manifest?
|
16
|
+
iri_type? RDF::IIIFPresentation.Manifest
|
17
|
+
end
|
18
|
+
|
19
|
+
def sc_manifest?
|
20
|
+
iri_type? RDF::SC.Manifest
|
21
|
+
end
|
22
|
+
|
23
|
+
def annotation_lists
|
24
|
+
return @annotation_lists unless @annotation_lists.nil?
|
25
|
+
uris = []
|
26
|
+
uris.push(* collect_annotation_list_uris(query_iiif_annotation_list))
|
27
|
+
uris.push(* collect_annotation_list_uris(query_sc_annotation_list))
|
28
|
+
@annotation_lists = uris.collect do |uri|
|
29
|
+
Annotations2triannon::AnnotationList.new(uri)
|
30
|
+
end
|
31
|
+
@annotation_lists
|
32
|
+
end
|
33
|
+
|
34
|
+
def iiif_annotation_lists
|
35
|
+
return @iiif_annotation_lists unless @iiif_annotation_lists.nil?
|
36
|
+
uris = collect_annotation_list_uris(query_iiif_annotation_list)
|
37
|
+
@iiif_annotation_lists = uris.collect do |uri|
|
38
|
+
Annotations2triannon::IIIFAnnotationList.new(uri)
|
39
|
+
end
|
40
|
+
@iiif_annotation_lists
|
41
|
+
end
|
42
|
+
|
43
|
+
def sc_annotation_lists
|
44
|
+
return @sc_annotation_lists unless @sc_annotation_lists.nil?
|
45
|
+
uris = collect_annotation_list_uris(query_sc_annotation_list)
|
46
|
+
@sc_annotation_lists = uris.collect do |uri|
|
47
|
+
Annotations2triannon::SharedCanvasAnnotationList.new(uri)
|
48
|
+
end
|
49
|
+
@sc_annotation_lists
|
50
|
+
end
|
51
|
+
|
52
|
+
def open_annotations
|
53
|
+
return @open_annotations unless @open_annotations.nil?
|
54
|
+
begin
|
55
|
+
oa_graphs = collect_open_annotations(rdf)
|
56
|
+
oa_graphs = oa_graphs.sample(@@config.limit_openannos) if @@config.limit_openannos > 0
|
57
|
+
oa_graphs
|
58
|
+
rescue => e
|
59
|
+
binding.pry if @@config.debug
|
60
|
+
@@config.logger.error(e.message)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
protected
|
66
|
+
|
67
|
+
# @return a query triple to find RDF::SC.AnnotationList
|
68
|
+
def query_sc_annotation_list
|
69
|
+
[nil, RDF.type, RDF::SC.AnnotationList]
|
70
|
+
end
|
71
|
+
|
72
|
+
# @return a query triple to find RDF::IIIFPresentation.AnnotationList
|
73
|
+
def query_iiif_annotation_list
|
74
|
+
[nil, RDF.type, RDF::IIIFPresentation.AnnotationList]
|
75
|
+
end
|
76
|
+
|
77
|
+
def collect_annotation_list_uris(q)
|
78
|
+
uris = rdf.query(q).collect {|s| s.subject }
|
79
|
+
uris = uris.sample(@@config.limit_annolists) if @@config.limit_annolists > 0
|
80
|
+
uris
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|