relaton-render 0.4.2 → 3.0.0.pre.alpha.26
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/.github/workflows/rake.yml +6 -1
- data/.github/workflows/release.yml +24 -0
- data/.gitignore +14 -0
- data/.rubocop.yml +2 -2
- data/Gemfile +17 -1
- data/README.adoc +13 -258
- data/docs/citation-style-pack.adoc +370 -0
- data/lib/relaton/render/general.rb +305 -0
- data/lib/relaton/render/iso690/element.rb +153 -0
- data/lib/relaton/render/iso690/elements/access.rb +44 -0
- data/lib/relaton/render/iso690/elements/authorizer.rb +30 -0
- data/lib/relaton/render/iso690/elements/citeid.rb +39 -0
- data/lib/relaton/render/iso690/elements/component_part.rb +99 -0
- data/lib/relaton/render/iso690/elements/creator.rb +258 -0
- data/lib/relaton/render/iso690/elements/edition.rb +92 -0
- data/lib/relaton/render/iso690/elements/extent.rb +71 -0
- data/lib/relaton/render/iso690/elements/identifier.rb +46 -0
- data/lib/relaton/render/iso690/elements/location.rb +73 -0
- data/lib/relaton/render/iso690/elements/medium.rb +32 -0
- data/lib/relaton/render/iso690/elements/numeration.rb +26 -0
- data/lib/relaton/render/iso690/elements/production.rb +92 -0
- data/lib/relaton/render/iso690/elements/pub_date.rb +56 -0
- data/lib/relaton/render/iso690/elements/series.rb +66 -0
- data/lib/relaton/render/iso690/elements/size.rb +41 -0
- data/lib/relaton/render/iso690/elements/status.rb +30 -0
- data/lib/relaton/render/iso690/elements/stddoc.rb +40 -0
- data/lib/relaton/render/iso690/elements/title.rb +56 -0
- data/lib/relaton/render/iso690/elements/updated.rb +38 -0
- data/lib/relaton/render/iso690/elements.rb +67 -0
- data/lib/relaton/render/iso690/fields.rb +142 -0
- data/lib/relaton/render/iso690/i18n/en.yml +47 -0
- data/lib/relaton/render/iso690/i18n/fr.yml +14 -0
- data/lib/relaton/render/iso690/i18n/ja.yml +38 -0
- data/lib/relaton/render/iso690/i18n.rb +83 -0
- data/lib/relaton/render/iso690/identifier_kinds.rb +29 -0
- data/lib/relaton/render/iso690/index_renderer.rb +57 -0
- data/lib/relaton/render/iso690/kinds.rb +53 -0
- data/lib/relaton/render/iso690/renderer.rb +148 -0
- data/lib/relaton/render/iso690/rules.rb +36 -0
- data/lib/relaton/render/iso690/style/locale.rb +53 -0
- data/lib/relaton/render/iso690/style/name_form.rb +87 -0
- data/lib/relaton/render/iso690/style/scheme.rb +33 -0
- data/lib/relaton/render/iso690/style/sort_rule.rb +25 -0
- data/lib/relaton/render/iso690/style/template_map.rb +40 -0
- data/lib/relaton/render/iso690/style/type_template.rb +37 -0
- data/lib/relaton/render/iso690/style.rb +222 -0
- data/lib/relaton/render/iso690/styles/apa.yml +45 -0
- data/lib/relaton/render/iso690/styles/author-date.yml +31 -0
- data/lib/relaton/render/iso690/styles/chicago.yml +48 -0
- data/lib/relaton/render/iso690/styles/ieee-sa.yml +45 -0
- data/lib/relaton/render/iso690/styles/lncs.yml +54 -0
- data/lib/relaton/render/iso690/template.rb +248 -0
- data/lib/relaton/render/iso690.rb +27 -0
- data/lib/relaton/render/version.rb +1 -1
- data/lib/relaton-render.rb +11 -5
- data/relaton-render.gemspec +6 -13
- metadata +61 -116
- data/lib/isodoc/i18n.rb +0 -33
- data/lib/isodoc-yaml/i18n-ar.yaml +0 -44
- data/lib/isodoc-yaml/i18n-de.yaml +0 -43
- data/lib/isodoc-yaml/i18n-en.yaml +0 -40
- data/lib/isodoc-yaml/i18n-es.yaml +0 -47
- data/lib/isodoc-yaml/i18n-fr.yaml +0 -48
- data/lib/isodoc-yaml/i18n-ru.yaml +0 -51
- data/lib/isodoc-yaml/i18n-zh-Hans.yaml +0 -40
- data/lib/relaton/render/fields/date.rb +0 -45
- data/lib/relaton/render/fields/fields.rb +0 -245
- data/lib/relaton/render/general/citations.rb +0 -96
- data/lib/relaton/render/general/config.yml +0 -79
- data/lib/relaton/render/general/render.rb +0 -185
- data/lib/relaton/render/general/render_classes.rb +0 -129
- data/lib/relaton/render/parse/parse.rb +0 -64
- data/lib/relaton/render/parse/parse_contributors.rb +0 -132
- data/lib/relaton/render/parse/parse_extract.rb +0 -180
- data/lib/relaton/render/template/liquid.rb +0 -15
- data/lib/relaton/render/template/template.rb +0 -188
- data/lib/relaton/render/utils/utils.rb +0 -27
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
require_relative "date"
|
|
2
|
-
|
|
3
|
-
module Relaton
|
|
4
|
-
module Render
|
|
5
|
-
class Fields
|
|
6
|
-
def initialize(options)
|
|
7
|
-
@r = options[:renderer]
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def compound_fields_format(hash)
|
|
11
|
-
name_fields_format(hash)
|
|
12
|
-
role_fields_format(hash)
|
|
13
|
-
date_fields_format(hash)
|
|
14
|
-
edition_fields_format(hash)
|
|
15
|
-
misc_fields_format(hash)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def name_fields_format(hash)
|
|
19
|
-
[%i(creatornames creators), %i(host_creatornames host_creators),
|
|
20
|
-
%i(publisher publisher_raw), %i(distributor distributor_raw)]
|
|
21
|
-
.each do |k|
|
|
22
|
-
hash[k[0]] = nameformat(hash[k[1]])
|
|
23
|
-
end
|
|
24
|
-
hash[:publisher_abbrev] = hash[:publisher_abbrev_raw]&.join(", ")
|
|
25
|
-
hash[:authorcite] = authorciteformat(hash[:creators])
|
|
26
|
-
place_format(hash)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def place_format(hash)
|
|
30
|
-
hash[:place] =
|
|
31
|
-
nameformat(hash[:place_raw].map { |x| { nonpersonal: x } })
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def role_fields_format(hash)
|
|
35
|
-
hash[:role] = role_inflect(hash[:creators], hash[:role_raw])
|
|
36
|
-
hash[:host_role] =
|
|
37
|
-
role_inflect(hash[:host_creators], hash[:host_role_raw])
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def edition_fields_format(hash)
|
|
41
|
-
hash[:edition] = editionformat(hash[:edition_raw], hash[:edition_num])
|
|
42
|
-
hash[:draft] = draftformat(hash[:draft_raw], hash)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def misc_fields_format(hash)
|
|
46
|
-
hash[:series] = seriesformat(hash)
|
|
47
|
-
hash[:medium] = mediumformat(hash[:medium_raw])
|
|
48
|
-
hash[:extent] = extentformat(hash[:extent_raw], hash)
|
|
49
|
-
hash[:size] = sizeformat(hash[:size_raw], hash)
|
|
50
|
-
hash[:uri] = uriformat(hash[:uri_raw])
|
|
51
|
-
hash
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def date_fields_format(hash)
|
|
55
|
-
[%i(date date), %i(date_updated date_updated),
|
|
56
|
-
%i(date_accessed date_accessed)].each do |k|
|
|
57
|
-
hash[k[0]] = dateformat(hash[k[1]], hash)
|
|
58
|
-
k[0] == :date && hash[:type] != "standard" and
|
|
59
|
-
hash[k[0]] ||= @r.i18n.get["no_date"]
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# TODO is not being i18n-alised
|
|
64
|
-
def mediumformat(hash)
|
|
65
|
-
return nil if hash.nil?
|
|
66
|
-
|
|
67
|
-
%w(content genre form carrier size scale).each_with_object([]) do |i, m|
|
|
68
|
-
m << hash[i] if hash[i]
|
|
69
|
-
m
|
|
70
|
-
end.compact.join(", ")
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
def seriesformat(hash)
|
|
74
|
-
parts = %i(series_title series_abbr series_num series_partnumber
|
|
75
|
-
series_run series_formatted)
|
|
76
|
-
series_out = parts.each_with_object({}) do |i, m|
|
|
77
|
-
m[i] = hash[i]
|
|
78
|
-
end
|
|
79
|
-
t = hash[:type] == "article" ? @r.journaltemplate : @r.seriestemplate
|
|
80
|
-
t.render(series_out)
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def nameformat(names)
|
|
84
|
-
return names if names.nil?
|
|
85
|
-
|
|
86
|
-
parts = %i(surname initials given middle nonpersonal)
|
|
87
|
-
names_out = names.each_with_object({}) do |n, m|
|
|
88
|
-
parts.each do |i|
|
|
89
|
-
m[i] ||= []
|
|
90
|
-
m[i] << n[i]
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
@r.nametemplate.render(names_out)
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def authorciteformat(names)
|
|
97
|
-
return names if names.nil? || @r.authorcitetemplate.nil?
|
|
98
|
-
|
|
99
|
-
parts = %i(surname initials given middle nonpersonal)
|
|
100
|
-
names_out = names.each_with_object({}) do |n, m|
|
|
101
|
-
parts.each do |i|
|
|
102
|
-
m[i] ||= []
|
|
103
|
-
m[i] << n[i]
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
@r.authorcitetemplate.render(names_out)
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
def role_inflect(contribs, role)
|
|
110
|
-
return nil if role.nil? || contribs.size.zero? ||
|
|
111
|
-
%w(author publisher).include?(role)
|
|
112
|
-
|
|
113
|
-
number = contribs.size > 1 ? "pl" : "sg"
|
|
114
|
-
@r.i18n.get[role][number] || role
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
def editionformat(edn, num)
|
|
118
|
-
return edn unless num || /^\d+$/.match?(edn)
|
|
119
|
-
|
|
120
|
-
ret = edition_translate1(num || edn.to_i)
|
|
121
|
-
@r.edition_ordinal.sub(/%(Spellout|Ordinal)?/, ret)
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
def edition_translate1(num)
|
|
125
|
-
ruleset = case @r.i18n.edition_ordinal
|
|
126
|
-
when /%Spellout/ then "SpelloutRules"
|
|
127
|
-
when /%Ordinal/ then "OrdinalRules"
|
|
128
|
-
else "Digit"
|
|
129
|
-
end
|
|
130
|
-
ruleset == "Digit" and return num.to_s
|
|
131
|
-
ed = HTMLEntities.new.decode(@r.i18n.edition)
|
|
132
|
-
@r.i18n.inflect_ordinal(num, @r.i18n.get["inflection"]&.dig(ed) || {},
|
|
133
|
-
ruleset)
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
def draftformat(num, _hash)
|
|
137
|
-
return nil if num.nil?
|
|
138
|
-
return nil if num.is_a?(Hash) && num[:status].nil? && num[:iteration].nil?
|
|
139
|
-
|
|
140
|
-
@r.i18n.draft.sub(/%/, num)
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
def extentformat(extent, hash)
|
|
144
|
-
extent.map do |e|
|
|
145
|
-
e1 = e.transform_values { |v| v.is_a?(Hash) ? range(v) : v }
|
|
146
|
-
ret = e.each_with_object({}) do |(k, v), m|
|
|
147
|
-
extentformat1(k, v, m, e1)
|
|
148
|
-
m
|
|
149
|
-
end
|
|
150
|
-
@r.extenttemplate.render(ret.merge(type: hash[:type]))
|
|
151
|
-
end.join("; ")
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
def extentformat1(key, val, hash, norm_hash)
|
|
155
|
-
if %i(volume issue page).include?(key)
|
|
156
|
-
hash["#{key}_raw".to_sym] = norm_hash[key]
|
|
157
|
-
hash[key] = pagevolformat(norm_hash[key], val, key.to_s, false)
|
|
158
|
-
end
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
def range(hash)
|
|
162
|
-
if hash[:on] then hash[:on]
|
|
163
|
-
elsif hash.has_key?(:from) && hash[:from].nil? then nil
|
|
164
|
-
elsif hash[:from]
|
|
165
|
-
hash[:to] ? "#{hash[:from]}–#{hash[:to]}" : hash[:from]
|
|
166
|
-
else hash
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
def sizeformat(size, hash)
|
|
171
|
-
return nil unless size
|
|
172
|
-
|
|
173
|
-
ret = size.transform_values { |v| @r.i18n.l10n(v.join(" + ")) }
|
|
174
|
-
.each_with_object({}) do |(k, v), m|
|
|
175
|
-
sizeformat1(k, v, m)
|
|
176
|
-
m
|
|
177
|
-
end
|
|
178
|
-
@r.sizetemplate.render(ret.merge(type: hash[:type]))
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
def sizeformat1(key, val, hash)
|
|
182
|
-
case key
|
|
183
|
-
when "volume"
|
|
184
|
-
hash[:volume_raw] = val
|
|
185
|
-
hash[:volume] = pagevolformat(val, nil, "volume", true)
|
|
186
|
-
when "issue"
|
|
187
|
-
hash[:issue_raw] = val
|
|
188
|
-
hash[:issue] = pagevolformat(val, nil, "issue", true)
|
|
189
|
-
when "page"
|
|
190
|
-
hash[:page_raw] = val
|
|
191
|
-
hash[:page] = pagevolformat(val, nil, "page", true)
|
|
192
|
-
when "data" then hash[:data] = val
|
|
193
|
-
when "duration" then hash[:duration] = val
|
|
194
|
-
end
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
def pagevolformat(value, value_raw, type, is_size)
|
|
198
|
-
return nil if value.nil?
|
|
199
|
-
|
|
200
|
-
num = "pl"
|
|
201
|
-
if is_size
|
|
202
|
-
value == "1" and num = "sg"
|
|
203
|
-
else
|
|
204
|
-
value_raw[:to] or num = "sg"
|
|
205
|
-
end
|
|
206
|
-
@r.i18n.l10n(@r.i18n.get[is_size ? "size" : "extent"][type][num]
|
|
207
|
-
.sub(/%/, value))
|
|
208
|
-
end
|
|
209
|
-
|
|
210
|
-
def date_range(hash)
|
|
211
|
-
if hash[:from]
|
|
212
|
-
"#{hash[:from]}–#{hash[:to]}"
|
|
213
|
-
else range(hash)
|
|
214
|
-
end
|
|
215
|
-
end
|
|
216
|
-
|
|
217
|
-
def dateformat(date, _hash)
|
|
218
|
-
return nil if date.nil?
|
|
219
|
-
|
|
220
|
-
%i(from to on).each do |k|
|
|
221
|
-
date[k] = ::Relaton::Render::Date.new(date[k], renderer: @r).render
|
|
222
|
-
end
|
|
223
|
-
date_range(date)
|
|
224
|
-
end
|
|
225
|
-
|
|
226
|
-
def uriformat(uri)
|
|
227
|
-
return nil if uri.nil? || uri.empty?
|
|
228
|
-
|
|
229
|
-
"<link target='#{uri}'>#{uri}</link>"
|
|
230
|
-
end
|
|
231
|
-
|
|
232
|
-
private
|
|
233
|
-
|
|
234
|
-
def tw_cldr_lang
|
|
235
|
-
if @r.lang != "zh"
|
|
236
|
-
@r.lang.to_sym
|
|
237
|
-
elsif @r.script == "Hant"
|
|
238
|
-
:"zh-tw"
|
|
239
|
-
else
|
|
240
|
-
:"zh-cn"
|
|
241
|
-
end
|
|
242
|
-
end
|
|
243
|
-
end
|
|
244
|
-
end
|
|
245
|
-
end
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
module Relaton
|
|
2
|
-
module Render
|
|
3
|
-
class Citations
|
|
4
|
-
def initialize(opt = {})
|
|
5
|
-
@type = opt[:type]
|
|
6
|
-
@i18n = opt[:i18n]
|
|
7
|
-
@renderer = opt[:renderer]
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
# takes array of { id, type, author, date, ord, data_liquid }
|
|
11
|
-
def render(ret)
|
|
12
|
-
cites = citations(ret)
|
|
13
|
-
cites.each_key do |k|
|
|
14
|
-
cites[k] = render1(cites[k])
|
|
15
|
-
end
|
|
16
|
-
cites
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def render1(cit)
|
|
20
|
-
r = @renderer.renderer(cit[:type] || "misc")
|
|
21
|
-
cit[:formattedref] =
|
|
22
|
-
@renderer.valid_parse(@i18n.l10n(r.render(cit[:data_liquid])))
|
|
23
|
-
%i(type data_liquid).each { |x| cit.delete(x) }
|
|
24
|
-
cit
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def citations(ret)
|
|
28
|
-
case @type
|
|
29
|
-
when "author-date" then disambig_author_date_citations(ret)
|
|
30
|
-
when nil then generic_citation(ret)
|
|
31
|
-
else raise "Unimplemented citation type"
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def generic_citation(ret)
|
|
36
|
-
ret.each_with_object({}) do |b, m|
|
|
37
|
-
m[b[:id]] = { data_liquid: b[:data_liquid], type: b[:type],
|
|
38
|
-
citation: b[:data_liquid][:docidentifier] }
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
# takes array of { id, type, author, date, ord, data_liquid }
|
|
43
|
-
def disambig_author_date_citations(ret)
|
|
44
|
-
to_hash(suffix_date(sort_ord(breakdown(ret))))
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def breakdown(ret)
|
|
48
|
-
ret.each_with_object({}) do |b, m|
|
|
49
|
-
m[b[:author]] ||= {}
|
|
50
|
-
m[b[:author]][b[:date]] ||= []
|
|
51
|
-
m[b[:author]][b[:date]] << b
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def sort_ord(ret)
|
|
56
|
-
ret.each do |author, v|
|
|
57
|
-
v.each_key do |date|
|
|
58
|
-
ret[author][date].sort! { |a, b| a[:ord] <=> b[:ord] }
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def suffix_date(ret)
|
|
64
|
-
ret.each do |k, v|
|
|
65
|
-
v.each do |k1, v1|
|
|
66
|
-
next if v1.reject { |b| b[:date].nil? }.size < 2
|
|
67
|
-
|
|
68
|
-
suffix_date1(ret, k, k1)
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
ret
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def suffix_date1(ret, key1, key2)
|
|
75
|
-
ret[key1][key2].each_with_index do |b, i|
|
|
76
|
-
next if b[:date].nil?
|
|
77
|
-
|
|
78
|
-
b[:date] += ("a".ord + i).chr.to_s
|
|
79
|
-
b[:data_liquid][:date] = b[:date]
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def to_hash(ret)
|
|
84
|
-
ret.each_with_object({}) do |(_k, v), m|
|
|
85
|
-
v.each do |_k1, v1|
|
|
86
|
-
v1.each do |b|
|
|
87
|
-
m[b[:id]] = { author: b[:author], date: b[:date],
|
|
88
|
-
citation: "#{b[:author]} #{b[:date]}",
|
|
89
|
-
data_liquid: b[:data_liquid], type: b[:type] }
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
end
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
nametemplate:
|
|
2
|
-
one: "{% if nonpersonal[0] %}{{ nonpersonal[0] }}{% else %}{{surname[0] | upcase }} ,_{%if given[0]%}{{given[0]}} {{middle[0]}}{%else%}{{initials[0] | join: '. '}}.{%endif%}{% endif %}"
|
|
3
|
-
two: "{% if nonpersonal[0] %}{{ nonpersonal[0] }}{% else %}{{surname[0] | upcase}} ,_{%if given[0]%}{{given[0]}} {{middle[0]}}{%else%}{{initials[0] | join: '. '}}.{%endif%}{% endif %} {{ labels['and'] }} {% if nonpersonal[1] %}{{ nonpersonal[1] }}{% else %}{%if given[1]%}{{given[1]}} {{middle[1]}}{%else%}{{initials[1] | join: '. '}}.{%endif%} {{surname[1] | upcase}}{% endif %}"
|
|
4
|
-
more: "{% if nonpersonal[0] %}{{ nonpersonal[0] }}{% else %}{{surname[0] | upcase}} ,_{%if given[0]%}{{given[0]}} {{middle[0]}}{%else%}{{initials[0] | join: '. '}}.{%endif%}{% endif %} , {% if nonpersonal[1] %}{{ nonpersonal[1] }}{% else %}{%if given[1]%}{{given[1]}} {{middle[1]}}{%else%}{{initials[1] | join: '. '}}.{%endif%} {{surname[1] | upcase}}{% endif %} {{ labels['and'] }} {% if nonpersonal[2] %}{{ nonpersonal[2] }}{% else %}{%if given[2]%}{{given[2]}} {{middle[2]}}{%else%}{{initials[2] | join: '. '}}.{%endif%} {{surname[2] | upcase}}{% endif %}"
|
|
5
|
-
# disabled the following: they should be provided in inheriting calls
|
|
6
|
-
# etal: "{% if nonpersonal[0] %}{{ nonpersonal[0] }}{% else %}{{surname[0] | upcase}} ,_{%if given[0]%}{{given[0]}} {{middle[0]}}{%else%}{{initials[0] | join: '. '}}.{%endif%}{% endif %}, {% if nonpersonal[1] %}{{ nonpersonal[1] }}{% else %}{%if given[1]%}{{given[1]}} {{middle[1]}}{%else%}{{initials[1] | join: '. '}}.{%endif%} {{surname[1] | upcase}}{% endif %} <em>et al.</em>"
|
|
7
|
-
# etal_count: 5
|
|
8
|
-
authorcitetemplate:
|
|
9
|
-
one: "{% if nonpersonal[0] %}{{ nonpersonal[0] }}{% else %}{{surname[0] }}{% endif %}"
|
|
10
|
-
two: "{% if nonpersonal[0] %}{{ nonpersonal[0] }}{% else %}{{surname[0] }}{% endif %} {{ labels['and'] }} {% if nonpersonal[1] %}{{ nonpersonal[1] }}{% else %}{{surname[1] }}{% endif %}"
|
|
11
|
-
more: "{% if nonpersonal[0] %}{{ nonpersonal[0] }}{% else %}{{surname[0] }}{% endif %}, {% if nonpersonal[1] %}{{ nonpersonal[1] }}{% else %}{{surname[1] }}{% endif %} {{ labels['and'] }} {% if nonpersonal[2] %}{{ nonpersonal[2] }}{% else %}{{surname[2] }}{% endif %}"
|
|
12
|
-
# disabled the following: they should be provided in inheriting calls
|
|
13
|
-
# etal: "{% if nonpersonal[0] %}{{ nonpersonal[0] }}{% else %}{{surname[0] }}{% endif %}, {% if nonpersonal[1] %}{{ nonpersonal[1] }}{% else %}{{surname[1] }}{% endif %} <em>et al.</em>"
|
|
14
|
-
# etal_count: 5
|
|
15
|
-
seriestemplate: "{% if series_formatted %}{{ series_formatted }}{%else%}{% if series_abbr %}{{series_abbr}}{% else %}{{series_title}}{% endif %} ({{series_run}}) {{series_num}}|({{series_partnumber}}){%endif%}"
|
|
16
|
-
journaltemplate: "<em>{% if series_abbr %}{{series_abbr}}{% else %}{{series_title}}{% endif %}</em> ({{series_run}}) {{ labels['volume'] }}_{{series_num}} {{ labels['part'] }}_{{series_partnumber}}"
|
|
17
|
-
extenttemplate:
|
|
18
|
-
book: "{{ volume }}, {{ page }}"
|
|
19
|
-
booklet: book
|
|
20
|
-
proceedings: book
|
|
21
|
-
journal: book
|
|
22
|
-
standard: book
|
|
23
|
-
techreport: book
|
|
24
|
-
inbook: "{{ volume }}: {{ page }}"
|
|
25
|
-
misc: "{{ volume }} {{issue}} , {{ page }}, {{ duration }}"
|
|
26
|
-
sizetemplate:
|
|
27
|
-
dataset: "{{ data }}"
|
|
28
|
-
electronic resource: dataset
|
|
29
|
-
webresource: dataset
|
|
30
|
-
misc: "{{ volume }}, {{ issue }}, {{ page }}, {{ data }}, {{ duration }}"
|
|
31
|
-
language: en
|
|
32
|
-
script: Latn
|
|
33
|
-
template:
|
|
34
|
-
book: "{{ creatornames }} ({{role}}) . <em>{{ title }}</em> [{{medium}}] . {{ edition | capitalize_first }}. ({{ series }}.) {% if place %}{{place}}{%else%}{{ labels['no_place']}}{%endif%}: {{publisher}}. {{date}}. {{ labels['updated'] | capitalize }}:_{{date_updated}}. {{ standardidentifier | first }}. {{ uri }}. {{ labels['at'] | capitalize}}:_{{ access_location }}. [{{ labels['viewed'] }}:_{{date_accessed}}]. {{size}}. {{extent}}."
|
|
35
|
-
# TODO: omitted: author ids, subsidiary titles, subsidiary creators, rights metadata, distributor, item attributes, relationships
|
|
36
|
-
booklet: book
|
|
37
|
-
manual: book
|
|
38
|
-
proceedings: book
|
|
39
|
-
inbook: "{{ creatornames }} ({{role}}) . {{ title }} . {{ labels['in'] | capitalize }}: {{ host_creatornames}} ({{ host_role}}) : <em>{{host_title}}</em> [{{medium}}] . {{ edition | capitalize_first }}. ({{ series }}.) {% if place %}{{place}}{%else%}{{ labels['no_place']}}{%endif%}: {{publisher}}. {{date}}. {{size}}. {{extent}}. {{ labels['updated'] | capitalize }}:_{{date_updated}}. {{ standardidentifier | first }}. {{ uri }}. {{ labels['at'] | capitalize}}:_{{ access_location }}. [{{ labels['viewed'] }}:_{{date_accessed}}]."
|
|
40
|
-
inproceedings: inbook
|
|
41
|
-
incollection: inbook
|
|
42
|
-
# TODO: omitted: author ids, additional info for component part, subsidiary titles of host resource, rights metadata, distributor, relationships
|
|
43
|
-
journal: "<em>{{ title}}</em> [{{medium}}] . {{ edition | capitalize_first }}. {{place}}: {{publisher}}. {{date}}. {{size}}. {{extent}}. {{ standardidentifier | first }}. {{ uri }}. {{ labels['at'] | capitalize}}:_{{ access_location }}. [{{ labels['viewed'] }}:_{{date_accessed}}]."
|
|
44
|
-
# TODO subsidiary titles, rights metadata, item attributes, relationships
|
|
45
|
-
article: "{{ creatornames }} ({{role}}) . {{ title }}. {{ series }} [{{medium}}] . {{ edition | capitalize_first }}. {{size}}. {{ extent }}. {{place}}: {{publisher}}. {{date}}. {{ labels['updated'] | capitalize }}:_{{date_updated}}. {{ standardidentifier | first }}. {{ uri }}. {{ labels['at'] | capitalize}}:_{{ access_location }}. [{{ labels['viewed'] }}:_{{date_accessed}}]."
|
|
46
|
-
# TODO: omitted: author ids, subsidiary titles, rights metadata, distributor, item attributes, relationships; newspapers
|
|
47
|
-
software: "{{ creatornames }} ({{ role}}) . <em>{{ title }}</em> . {{ labels['version'] | capitalize }}_{{ edition_raw }}. {{medium | capitalize}}. {{place}}: {{publisher}}. {{date}}. {{ labels['updated'] | capitalize }}:_{{date_updated}}. {{ standardidentifier | first }}. {{ uri }}. {{size}}. {{ extent}}. [{{ labels['viewed'] }}:_{{date_accessed}}]. "
|
|
48
|
-
# TODO: omitted: author ids, subsidiary titles, subsidiary creators, copyright, license, distributor, system requirements, relationships
|
|
49
|
-
electronic resource: software
|
|
50
|
-
standard: "{{ creatornames }} ({{ role}}) . <em>{{ title }}</em> . {{ labels['in'] | capitalize }}:_{{ series_title }}. {{ medium | capitalize }}. {{ edition | capitalize_first }}. {{place}}: {{publisher}}. {{date}}. {{size}}. {{ extent }}. {{ standardidentifier | first }}. {{ uri }}. {{ labels['at'] | capitalize}}:_{{ access_location }}. [{{ labels['viewed'] }}:_{{date_accessed}}]."
|
|
51
|
-
# TODO: omitted: author ids, subsidiary titles, rights metadata, distributor, persistent identifier, item attributes, relationships
|
|
52
|
-
techreport: standard
|
|
53
|
-
dataset: "{{ creatornames }} ({{ role }}) . <em>{{ title }}</em> . {{ labels['version'] | capitalize }}_{{ edition_raw }}. {{medium | capitalize }}. {{ labels['in'] | capitalize }}:_{{series}}. {{date}}. {{ labels['updated'] | capitalize }}:_{{date_updated}}. {{ standardidentifier | first }}. {{ uri }}. {{ size }}. {{ extent}}. [{{ labels['viewed'] }}:_{{date_accessed}}]. "
|
|
54
|
-
# TODO: omitted: author ids, system requirements, host archive, copyright, license, data source, distributor, usage instructions, relationships, provenance
|
|
55
|
-
website: "{{ creatornames }} ({{ role }}) . <em>{{ title }}</em> . {{ labels['version'] | capitalize }}_{{ edition_raw }}. {{medium | capitalize }}. {{ place }}: {{ publisher }}. {{date}}. {{ labels['updated'] | capitalize }}:_{{date_updated}}. {{ standardidentifier | first }}. {{ uri }}. [{{ labels['viewed'] }}:_{{date_accessed}}]. "
|
|
56
|
-
# TODO: omitted: author ids, page title, system requirements, subsidiary creator, rights metadata, distributor, persistent identifier, archive location, archive date and time, relationships
|
|
57
|
-
webresource: website
|
|
58
|
-
# TODO: component part
|
|
59
|
-
unpublished: "{{ creatornames }} ({{ role }}) . <em>{{ title }}</em> . {{ medium | capitalize }}. {{ date }}. {{ labels['at'] | capitalize}}:_{{ access_location }}. {{ standardidentifier | first }}. {{ uri }}. [{{ labels['viewed'] }}:_{{date_accessed}}]."
|
|
60
|
-
# TODO: omitted: author ids, subsidiary titles, subsidiary creators, host archive, item attributes, relationships
|
|
61
|
-
presentation: unpublished
|
|
62
|
-
thesis: "{{ creatornames }} ({{ role }}) . <em>{{ title }}</em> . {{ medium | capitalize }}. {{ place }}: {{ publisher }}. {{ date }}. {{ labels['at'] | capitalize}}:_{{ access_location }}. {{ standardidentifier | first }}. {{ uri }}. [{{ labels['viewed'] }}:_{{date_accessed}}]."
|
|
63
|
-
misc: "{{ creatornames }} ({{ role }}) . <em>{{ title }}</em> . {{ date }}."
|
|
64
|
-
# following are # unsupported types:
|
|
65
|
-
map: misc
|
|
66
|
-
audiovisual: misc
|
|
67
|
-
film: misc
|
|
68
|
-
video: misc
|
|
69
|
-
broadcast: misc
|
|
70
|
-
graphic_work: misc
|
|
71
|
-
music: misc
|
|
72
|
-
performance: misc
|
|
73
|
-
patent: misc
|
|
74
|
-
archival: misc
|
|
75
|
-
social_media: misc
|
|
76
|
-
alert: misc
|
|
77
|
-
message: misc
|
|
78
|
-
conversation: misc
|
|
79
|
-
internal: misc
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
require_relative "render_classes"
|
|
2
|
-
require_relative "citations"
|
|
3
|
-
require "yaml"
|
|
4
|
-
require "liquid"
|
|
5
|
-
require "relaton_bib"
|
|
6
|
-
require_relative "../template/template"
|
|
7
|
-
require_relative "../../../isodoc/i18n"
|
|
8
|
-
|
|
9
|
-
module Relaton
|
|
10
|
-
module Render
|
|
11
|
-
class General
|
|
12
|
-
attr_reader :template, :journaltemplate, :seriestemplate, :nametemplate,
|
|
13
|
-
:authorcitetemplate, :extenttemplate, :sizetemplate,
|
|
14
|
-
:lang, :script, :i18n,
|
|
15
|
-
:edition, :edition_ordinal, :date
|
|
16
|
-
|
|
17
|
-
def initialize(opt = {})
|
|
18
|
-
options = read_config.merge(Utils::string_keys(opt))
|
|
19
|
-
@type = self.class.name.downcase.split("::").last
|
|
20
|
-
klass_initialize(options)
|
|
21
|
-
root_initalize(options)
|
|
22
|
-
render_initialize(options)
|
|
23
|
-
@parse ||= options["parse"]
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def read_config
|
|
27
|
-
YAML.load_file(File.join(File.dirname(__FILE__), "config.yml"))
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def klass_initialize(_options)
|
|
31
|
-
@nametemplateklass = Relaton::Render::Template::Name
|
|
32
|
-
@authorcitetemplateklass = Relaton::Render::Template::AuthorCite
|
|
33
|
-
@seriestemplateklass = Relaton::Render::Template::Series
|
|
34
|
-
@extenttemplateklass = Relaton::Render::Template::Extent
|
|
35
|
-
@sizetemplateklass = Relaton::Render::Template::Size
|
|
36
|
-
@generaltemplateklass = Relaton::Render::Template::General
|
|
37
|
-
@fieldsklass = Relaton::Render::Fields
|
|
38
|
-
@parseklass = Relaton::Render::Parse
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def root_initalize(opt)
|
|
42
|
-
i18n_initialize(opt)
|
|
43
|
-
@parse = @parseklass.new(lang: @lang, script: @script)
|
|
44
|
-
@nametemplate = @nametemplateklass
|
|
45
|
-
.new(template: opt["nametemplate"], i18n: @i18n)
|
|
46
|
-
@authorcitetemplate = @authorcitetemplateklass
|
|
47
|
-
&.new(template: opt["authorcitetemplate"], i18n: @i18n)
|
|
48
|
-
@seriestemplate = @seriestemplateklass
|
|
49
|
-
.new(template: opt["seriestemplate"], i18n: @i18n)
|
|
50
|
-
@journaltemplate = @seriestemplateklass
|
|
51
|
-
.new(template: opt["journaltemplate"], i18n: @i18n)
|
|
52
|
-
@extenttemplate = extentrenderers(opt)
|
|
53
|
-
@sizetemplate = sizerenderers(opt)
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def i18n_initialize(opt)
|
|
57
|
-
@lang = opt["language"]
|
|
58
|
-
@script = opt["script"]
|
|
59
|
-
@i18n = opt["i18n"] ||
|
|
60
|
-
i18n_klass(opt["language"], opt["script"], opt["i18nhash"])
|
|
61
|
-
@edition_ordinal = opt["edition_ordinal"] || @i18n.edition_ordinal
|
|
62
|
-
@edition = opt["edition"] || @i18n.edition
|
|
63
|
-
@date = opt["date"] || @i18n.get["date_formats"] ||
|
|
64
|
-
{ "month_year" => "yMMMM",
|
|
65
|
-
"day_month_year" => "to_long_s",
|
|
66
|
-
"date_time" => "to_long_s" }
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def render_initialize(opt)
|
|
70
|
-
case opt["template"]
|
|
71
|
-
when String
|
|
72
|
-
@template = @generaltemplateklass
|
|
73
|
-
.new(template: opt["template"], i18n: @i18n)
|
|
74
|
-
when Hash
|
|
75
|
-
@render = renderers(opt)
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def renderers(opt)
|
|
80
|
-
template_hash_fill(opt["template"]).each_with_object({}) do |(k, v), m|
|
|
81
|
-
@type == "general" || @type == k or next
|
|
82
|
-
m[k] = General.subclass(k)
|
|
83
|
-
.new(template: v, parse: @parse, i18n: @i18n,
|
|
84
|
-
language: @lang, script: @script)
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def extentrenderers(opt)
|
|
89
|
-
@extenttemplateklass
|
|
90
|
-
.new(template: template_hash_fill(opt["extenttemplate"]), i18n: @i18n)
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def sizerenderers(opt)
|
|
94
|
-
@sizetemplateklass
|
|
95
|
-
.new(template: template_hash_fill(opt["sizetemplate"]), i18n: @i18n)
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def default_template
|
|
99
|
-
"{{creatornames}}. {{title}}. {{date}}."
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
def i18n_klass(lang = "en", script = "Latn", i18nhash = nil)
|
|
103
|
-
::IsoDoc::RelatonRenderI18n.new(lang, script, i18nhash: i18nhash)
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def render(bib, embedded: false)
|
|
107
|
-
if bib.is_a?(String) && Nokogiri::XML(bib).errors.empty?
|
|
108
|
-
bib = RelatonBib::XMLParser.from_xml bib
|
|
109
|
-
end
|
|
110
|
-
parse(bib, embedded: embedded)
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
def parse(doc, embedded: false)
|
|
114
|
-
f = doc.formattedref and
|
|
115
|
-
return embedded ? f.children.to_xml : doc.to_xml
|
|
116
|
-
|
|
117
|
-
ret = parse1(doc) or return nil
|
|
118
|
-
embedded and return ret
|
|
119
|
-
"<formattedref>#{ret}</formattedref>"
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
def renderer(type)
|
|
123
|
-
ret = @template || @render[type]&.template or
|
|
124
|
-
raise "No renderer defined for #{type}"
|
|
125
|
-
@type == "general" || @type == type or
|
|
126
|
-
raise "No renderer defined for #{type}"
|
|
127
|
-
|
|
128
|
-
ret
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
def parse1(doc)
|
|
132
|
-
r = renderer(doc.type || "misc")
|
|
133
|
-
data = @parse.extract(doc)
|
|
134
|
-
data_liquid = @fieldsklass.new(renderer: self)
|
|
135
|
-
.compound_fields_format(data)
|
|
136
|
-
valid_parse(@i18n.l10n(r.render(data_liquid)))
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
def valid_parse(ret)
|
|
140
|
-
@i18n.get["no_date"] == ret and return nil
|
|
141
|
-
ret
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
# expect array of Relaton objects, in sorted order
|
|
145
|
-
def render_all(bib, type: "author-date")
|
|
146
|
-
bib = sanitise_citations_input(bib) or return
|
|
147
|
-
Citations.new(type: type, renderer: self, i18n: @i18n)
|
|
148
|
-
.render(citations1(bib))
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
def sanitise_citations_input(bib)
|
|
152
|
-
bib.is_a?(Array) and return bib
|
|
153
|
-
bib.is_a?(String) and return sanitise_citations_input_string(bib)
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
def sanitise_citations_input_string(bib)
|
|
157
|
-
p = Nokogiri::XML(bib) or return
|
|
158
|
-
(p.errors.empty? && p.root.at("./bibitem")) or return nil
|
|
159
|
-
|
|
160
|
-
p.root.xpath("./bibitem").each_with_object([]) do |b, m|
|
|
161
|
-
m << RelatonBib::XMLParser.from_xml(b.to_xml)
|
|
162
|
-
end
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
def citations1(bib)
|
|
166
|
-
bib.each_with_object([]).with_index do |(b, m), i|
|
|
167
|
-
data_liquid = @fieldsklass.new(renderer: self)
|
|
168
|
-
.compound_fields_format(@parse.extract(b))
|
|
169
|
-
m << { author: data_liquid[:authorcite], date: data_liquid[:date],
|
|
170
|
-
ord: i, id: b.id, data_liquid: data_liquid, type: b.type }
|
|
171
|
-
end
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
private
|
|
175
|
-
|
|
176
|
-
def template_hash_fill(templates)
|
|
177
|
-
BIBTYPE.each_with_object({}) do |type, m|
|
|
178
|
-
template = templates[type] || templates["misc"] || default_template
|
|
179
|
-
BIBTYPE.include?(template) and template = templates[template]
|
|
180
|
-
m[type] = template
|
|
181
|
-
end
|
|
182
|
-
end
|
|
183
|
-
end
|
|
184
|
-
end
|
|
185
|
-
end
|