relaton-render 0.7.1 → 0.7.3
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/lib/relaton/render/fields/date.rb +2 -0
- data/lib/relaton/render/fields/fields.rb +5 -3
- data/lib/relaton/render/general/citations.rb +46 -5
- data/lib/relaton/render/general/render.rb +14 -24
- data/lib/relaton/render/general/uri.rb +56 -0
- data/lib/relaton/render/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b64bd51a5487927e3c700f4658188e342593f85bd56abd0efb92b51d2329fe59
|
|
4
|
+
data.tar.gz: 21fb237d1d039c9c136bc5e3f64396437f007f690fdc1e54d557e40c722c98c5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ab48727b2054c7d8f665d409545ff07912de7170b9fdaf539bc8788b4185f9a1c7a02a90c068f00980ab98edba5c05ea1e4c60024b13c3a4e0fc855bc34be6a5
|
|
7
|
+
data.tar.gz: 769716704f5d77011d281ae8eac4abc6c4332763ce5fa29171537c1c80781e2ad5e6424ef3d25721743c1c8ed2653c3cda8dacc978194814cdf6e9f2658eb845
|
|
@@ -55,7 +55,7 @@ module Relaton
|
|
|
55
55
|
def date_fields_format(hash)
|
|
56
56
|
[%i(date date), %i(date_updated date_updated),
|
|
57
57
|
%i(date_accessed date_accessed)].each do |k|
|
|
58
|
-
hash[k[0]] = dateformat(hash[k[1]], hash)
|
|
58
|
+
hash[k[0]] = dateformat(hash[k[1]], hash, k)
|
|
59
59
|
k[0] == :date && hash[:type] != "standard" and
|
|
60
60
|
hash[k[0]] ||= @r.i18n.get["no_date"]
|
|
61
61
|
end
|
|
@@ -191,10 +191,12 @@ module Relaton
|
|
|
191
191
|
range(hash)
|
|
192
192
|
end
|
|
193
193
|
|
|
194
|
-
def dateformat(date,
|
|
194
|
+
def dateformat(date, hash, type)
|
|
195
195
|
date.nil? and return nil
|
|
196
|
+
date.is_a?(String) and return date
|
|
196
197
|
%i(from to on).each do |k|
|
|
197
|
-
date[k] =
|
|
198
|
+
date[k] = @r.dateklass
|
|
199
|
+
.new(date[k], renderer: @r, bibitem: hash, type: type).render
|
|
198
200
|
end
|
|
199
201
|
date_range(date)
|
|
200
202
|
end
|
|
@@ -10,17 +10,58 @@ module Relaton
|
|
|
10
10
|
# takes array of { id, type, author, date, ord, data_liquid }
|
|
11
11
|
def render(ret)
|
|
12
12
|
cites = citations(ret)
|
|
13
|
+
cites.each_value do |v|
|
|
14
|
+
v[:renderer] = @renderer.renderer(v[:type] || "misc")
|
|
15
|
+
end
|
|
16
|
+
enhance_data(cites)
|
|
13
17
|
cites.each_key do |k|
|
|
14
18
|
cites[k] = render1(cites[k])
|
|
15
19
|
end
|
|
16
20
|
cites
|
|
17
21
|
end
|
|
18
22
|
|
|
23
|
+
def enhance_data(cites)
|
|
24
|
+
ret = extract_uris_for_lookup(cites)
|
|
25
|
+
ret.empty? and return
|
|
26
|
+
@renderer.urls_exist_concurrent(ret.keys).each do |k, v|
|
|
27
|
+
ret[k].each { |u| add_date_accessed(cites[u], k, v) }
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def extract_uris_for_lookup(cites)
|
|
32
|
+
cites.each_with_object({}) do |(k, v), m|
|
|
33
|
+
u = extract_uri_for_lookup(v) or next
|
|
34
|
+
m[u] ||= []
|
|
35
|
+
m[u] << k
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def extract_uri_for_lookup(cite)
|
|
40
|
+
t = cite[:renderer].template_raw
|
|
41
|
+
c = cite[:data_liquid]
|
|
42
|
+
t.is_a?(String) or return
|
|
43
|
+
(/\{\{\s*date_accessed\s*\}\}/.match?(t) &&
|
|
44
|
+
/\{\{\s*uri\s*\}\}/.match?(t) &&
|
|
45
|
+
c[:uri_raw] && !c[:date_accessed]) or return
|
|
46
|
+
c[:uri_raw]
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def add_date_accessed(data, uri, status)
|
|
50
|
+
if status
|
|
51
|
+
data[:data_liquid][:date_accessed] = { on: ::Date.today.to_s }
|
|
52
|
+
data[:data_liquid] = @renderer.fieldsklass.new(renderer: @renderer)
|
|
53
|
+
.compound_fields_format(data[:data_liquid])
|
|
54
|
+
else
|
|
55
|
+
@renderer.url_warn(uri)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
19
59
|
def render1(cit)
|
|
20
|
-
r = @renderer.renderer(cit[:type] || "misc")
|
|
21
60
|
cit[:formattedref] =
|
|
22
|
-
@renderer.valid_parse(
|
|
23
|
-
|
|
61
|
+
@renderer.valid_parse(
|
|
62
|
+
@i18n.l10n(cit[:renderer].render(cit[:data_liquid])),
|
|
63
|
+
)
|
|
64
|
+
%i(type data_liquid renderer).each { |x| cit.delete(x) }
|
|
24
65
|
cit
|
|
25
66
|
end
|
|
26
67
|
|
|
@@ -55,7 +96,7 @@ module Relaton
|
|
|
55
96
|
def sort_ord(ret)
|
|
56
97
|
ret.each do |author, v|
|
|
57
98
|
v.each_key do |date|
|
|
58
|
-
ret[author][date].
|
|
99
|
+
ret[author][date].sort_by! { |a| a[:ord] }
|
|
59
100
|
end
|
|
60
101
|
end
|
|
61
102
|
end
|
|
@@ -82,7 +123,7 @@ module Relaton
|
|
|
82
123
|
|
|
83
124
|
def to_hash(ret)
|
|
84
125
|
ret.each_with_object({}) do |(_k, v), m|
|
|
85
|
-
v.
|
|
126
|
+
v.each_value do |v1|
|
|
86
127
|
v1.each do |b|
|
|
87
128
|
m[b[:id]] = { author: b[:author], date: b[:date],
|
|
88
129
|
citation: "#{b[:author]} #{b[:date]}",
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
require_relative "render_classes"
|
|
2
2
|
require_relative "citations"
|
|
3
|
+
require_relative "uri"
|
|
3
4
|
require "yaml"
|
|
4
5
|
require "liquid"
|
|
5
6
|
require "date"
|
|
6
7
|
require "relaton_bib"
|
|
7
|
-
require "net/http"
|
|
8
8
|
require_relative "../template/template"
|
|
9
9
|
require_relative "../../../isodoc/i18n"
|
|
10
10
|
|
|
@@ -14,7 +14,7 @@ module Relaton
|
|
|
14
14
|
attr_reader :template, :journaltemplate, :seriestemplate, :nametemplate,
|
|
15
15
|
:authorcitetemplate, :extenttemplate, :sizetemplate,
|
|
16
16
|
:lang, :script, :i18n,
|
|
17
|
-
:edition, :edition_ordinal, :date
|
|
17
|
+
:edition, :edition_ordinal, :date, :fieldsklass, :dateklass
|
|
18
18
|
|
|
19
19
|
def initialize(opt = {})
|
|
20
20
|
options = read_config.merge(Utils::string_keys(opt))
|
|
@@ -23,6 +23,9 @@ module Relaton
|
|
|
23
23
|
root_initalize(options)
|
|
24
24
|
render_initialize(options)
|
|
25
25
|
@parse ||= options["parse"]
|
|
26
|
+
@semaphore = Mutex.new
|
|
27
|
+
@urlcache = {}
|
|
28
|
+
@url_warned = {}
|
|
26
29
|
end
|
|
27
30
|
|
|
28
31
|
def read_config
|
|
@@ -37,6 +40,7 @@ module Relaton
|
|
|
37
40
|
@sizetemplateklass = Relaton::Render::Template::Size
|
|
38
41
|
@generaltemplateklass = Relaton::Render::Template::General
|
|
39
42
|
@fieldsklass = Relaton::Render::Fields
|
|
43
|
+
@dateklass = Relaton::Render::Date
|
|
40
44
|
@parseklass = Relaton::Render::Parse
|
|
41
45
|
end
|
|
42
46
|
|
|
@@ -132,7 +136,6 @@ module Relaton
|
|
|
132
136
|
raise "No renderer defined for #{type}"
|
|
133
137
|
@type == "general" || @type == type or
|
|
134
138
|
raise "No renderer defined for #{type}"
|
|
135
|
-
|
|
136
139
|
ret
|
|
137
140
|
end
|
|
138
141
|
|
|
@@ -168,6 +171,7 @@ module Relaton
|
|
|
168
171
|
end
|
|
169
172
|
|
|
170
173
|
# expect array of Relaton objects, in sorted order
|
|
174
|
+
# enhance_data is skipped here, and is done in batch inside Citations
|
|
171
175
|
def render_all(bib, type: "author-date")
|
|
172
176
|
bib = sanitise_citations_input(bib) or return
|
|
173
177
|
Citations.new(type: type, renderer: self, i18n: @i18n)
|
|
@@ -182,7 +186,6 @@ module Relaton
|
|
|
182
186
|
def sanitise_citations_input_string(bib)
|
|
183
187
|
p = Nokogiri::XML(bib) or return
|
|
184
188
|
(p.errors.empty? && p.root.at("./bibitem")) or return nil
|
|
185
|
-
|
|
186
189
|
p.root.xpath("./bibitem").each_with_object([]) do |b, m|
|
|
187
190
|
m << RelatonBib::XMLParser.from_xml(b.to_xml)
|
|
188
191
|
end
|
|
@@ -209,11 +212,16 @@ module Relaton
|
|
|
209
212
|
data[:uri_raw] && !data[:date_accessed]) or return
|
|
210
213
|
if url_exist?(data[:uri_raw])
|
|
211
214
|
data[:date_accessed] = { on: ::Date.today.to_s }
|
|
212
|
-
else
|
|
213
|
-
warn "BIBLIOGRAPHY WARNING: cannot access #{data[:uri_raw]}"
|
|
215
|
+
else url_warn(data[:uri_raw])
|
|
214
216
|
end
|
|
215
217
|
end
|
|
216
218
|
|
|
219
|
+
def url_warn(uri)
|
|
220
|
+
@url_warned[uri] and return
|
|
221
|
+
warn "BIBLIOGRAPHY WARNING: cannot access #{uri}"
|
|
222
|
+
@url_warned[uri] = true
|
|
223
|
+
end
|
|
224
|
+
|
|
217
225
|
private
|
|
218
226
|
|
|
219
227
|
def template_hash_fill(templates)
|
|
@@ -223,24 +231,6 @@ module Relaton
|
|
|
223
231
|
m[type] = template
|
|
224
232
|
end
|
|
225
233
|
end
|
|
226
|
-
|
|
227
|
-
def url_exist?(url_string)
|
|
228
|
-
url = URI.parse(url_string)
|
|
229
|
-
url.host or return true # allow file URLs
|
|
230
|
-
res = access_url(url)
|
|
231
|
-
res.is_a?(Net::HTTPRedirection) and return url_exist?(res["location"])
|
|
232
|
-
res.code[0] != "4"
|
|
233
|
-
rescue Errno::ENOENT, SocketError
|
|
234
|
-
false # false if can't find the server
|
|
235
|
-
end
|
|
236
|
-
|
|
237
|
-
def access_url(url)
|
|
238
|
-
req = Net::HTTP.new(url.host, url.port)
|
|
239
|
-
req.use_ssl = (url.scheme == "https")
|
|
240
|
-
path = url.path or return false
|
|
241
|
-
path.empty? and path = "/"
|
|
242
|
-
req.request_head(path)
|
|
243
|
-
end
|
|
244
234
|
end
|
|
245
235
|
end
|
|
246
236
|
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require "concurrent"
|
|
2
|
+
require "net/http"
|
|
3
|
+
require "uri"
|
|
4
|
+
|
|
5
|
+
module Relaton
|
|
6
|
+
module Render
|
|
7
|
+
class General
|
|
8
|
+
def url_exist?(url_string)
|
|
9
|
+
url = URI.parse(url_string)
|
|
10
|
+
url.host or return true # allow file URLs
|
|
11
|
+
res = access_url(url) or return false
|
|
12
|
+
res.is_a?(Net::HTTPRedirection) and return url_exist?(res["location"])
|
|
13
|
+
res.code[0] != "4"
|
|
14
|
+
rescue Errno::ENOENT, SocketError
|
|
15
|
+
false # false if can't find the server
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def access_url(url)
|
|
19
|
+
path = url.path or return false
|
|
20
|
+
path.empty? and path = "/"
|
|
21
|
+
url_head(url, path)
|
|
22
|
+
rescue StandardError => e
|
|
23
|
+
warn e
|
|
24
|
+
false
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def url_head(url, path)
|
|
28
|
+
ret = nil
|
|
29
|
+
@semaphore.synchronize { ret = @urlcache[url.to_s] }
|
|
30
|
+
ret and return ret
|
|
31
|
+
ret = Net::HTTP.start(url.host, url.port,
|
|
32
|
+
read_timeout: 2, open_timeout: 2,
|
|
33
|
+
use_ssl: url.scheme == "https") do |http|
|
|
34
|
+
http.request_head(path)
|
|
35
|
+
end
|
|
36
|
+
@semaphore.synchronize { @urlcache[url.to_s] = ret }
|
|
37
|
+
ret
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def urls_exist_concurrent(urls)
|
|
41
|
+
responses = Concurrent::Array.new
|
|
42
|
+
thread_pool = Concurrent::FixedThreadPool.new(5)
|
|
43
|
+
urls.each do |u|
|
|
44
|
+
thread_pool.post { responses << url_exist_async?(u) }
|
|
45
|
+
end
|
|
46
|
+
thread_pool.shutdown
|
|
47
|
+
thread_pool.wait_for_termination
|
|
48
|
+
responses.each_with_object({}) { |n, m| m[n[:url]] = n[:status] }
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def url_exist_async?(url_string)
|
|
52
|
+
{ url: url_string, status: url_exist?(url_string) }
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: relaton-render
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.7.
|
|
4
|
+
version: 0.7.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ribose Inc.
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2024-03-
|
|
11
|
+
date: 2024-03-06 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -213,6 +213,7 @@ files:
|
|
|
213
213
|
- lib/relaton/render/general/config.yml
|
|
214
214
|
- lib/relaton/render/general/render.rb
|
|
215
215
|
- lib/relaton/render/general/render_classes.rb
|
|
216
|
+
- lib/relaton/render/general/uri.rb
|
|
216
217
|
- lib/relaton/render/parse/parse.rb
|
|
217
218
|
- lib/relaton/render/parse/parse_contributors.rb
|
|
218
219
|
- lib/relaton/render/parse/parse_extract.rb
|