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.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +6 -1
  3. data/.github/workflows/release.yml +24 -0
  4. data/.gitignore +14 -0
  5. data/.rubocop.yml +2 -2
  6. data/Gemfile +17 -1
  7. data/README.adoc +13 -258
  8. data/docs/citation-style-pack.adoc +370 -0
  9. data/lib/relaton/render/general.rb +305 -0
  10. data/lib/relaton/render/iso690/element.rb +153 -0
  11. data/lib/relaton/render/iso690/elements/access.rb +44 -0
  12. data/lib/relaton/render/iso690/elements/authorizer.rb +30 -0
  13. data/lib/relaton/render/iso690/elements/citeid.rb +39 -0
  14. data/lib/relaton/render/iso690/elements/component_part.rb +99 -0
  15. data/lib/relaton/render/iso690/elements/creator.rb +258 -0
  16. data/lib/relaton/render/iso690/elements/edition.rb +92 -0
  17. data/lib/relaton/render/iso690/elements/extent.rb +71 -0
  18. data/lib/relaton/render/iso690/elements/identifier.rb +46 -0
  19. data/lib/relaton/render/iso690/elements/location.rb +73 -0
  20. data/lib/relaton/render/iso690/elements/medium.rb +32 -0
  21. data/lib/relaton/render/iso690/elements/numeration.rb +26 -0
  22. data/lib/relaton/render/iso690/elements/production.rb +92 -0
  23. data/lib/relaton/render/iso690/elements/pub_date.rb +56 -0
  24. data/lib/relaton/render/iso690/elements/series.rb +66 -0
  25. data/lib/relaton/render/iso690/elements/size.rb +41 -0
  26. data/lib/relaton/render/iso690/elements/status.rb +30 -0
  27. data/lib/relaton/render/iso690/elements/stddoc.rb +40 -0
  28. data/lib/relaton/render/iso690/elements/title.rb +56 -0
  29. data/lib/relaton/render/iso690/elements/updated.rb +38 -0
  30. data/lib/relaton/render/iso690/elements.rb +67 -0
  31. data/lib/relaton/render/iso690/fields.rb +142 -0
  32. data/lib/relaton/render/iso690/i18n/en.yml +47 -0
  33. data/lib/relaton/render/iso690/i18n/fr.yml +14 -0
  34. data/lib/relaton/render/iso690/i18n/ja.yml +38 -0
  35. data/lib/relaton/render/iso690/i18n.rb +83 -0
  36. data/lib/relaton/render/iso690/identifier_kinds.rb +29 -0
  37. data/lib/relaton/render/iso690/index_renderer.rb +57 -0
  38. data/lib/relaton/render/iso690/kinds.rb +53 -0
  39. data/lib/relaton/render/iso690/renderer.rb +148 -0
  40. data/lib/relaton/render/iso690/rules.rb +36 -0
  41. data/lib/relaton/render/iso690/style/locale.rb +53 -0
  42. data/lib/relaton/render/iso690/style/name_form.rb +87 -0
  43. data/lib/relaton/render/iso690/style/scheme.rb +33 -0
  44. data/lib/relaton/render/iso690/style/sort_rule.rb +25 -0
  45. data/lib/relaton/render/iso690/style/template_map.rb +40 -0
  46. data/lib/relaton/render/iso690/style/type_template.rb +37 -0
  47. data/lib/relaton/render/iso690/style.rb +222 -0
  48. data/lib/relaton/render/iso690/styles/apa.yml +45 -0
  49. data/lib/relaton/render/iso690/styles/author-date.yml +31 -0
  50. data/lib/relaton/render/iso690/styles/chicago.yml +48 -0
  51. data/lib/relaton/render/iso690/styles/ieee-sa.yml +45 -0
  52. data/lib/relaton/render/iso690/styles/lncs.yml +54 -0
  53. data/lib/relaton/render/iso690/template.rb +248 -0
  54. data/lib/relaton/render/iso690.rb +27 -0
  55. data/lib/relaton/render/version.rb +1 -1
  56. data/lib/relaton-render.rb +11 -5
  57. data/relaton-render.gemspec +6 -13
  58. metadata +61 -116
  59. data/lib/isodoc/i18n.rb +0 -33
  60. data/lib/isodoc-yaml/i18n-ar.yaml +0 -44
  61. data/lib/isodoc-yaml/i18n-de.yaml +0 -43
  62. data/lib/isodoc-yaml/i18n-en.yaml +0 -40
  63. data/lib/isodoc-yaml/i18n-es.yaml +0 -47
  64. data/lib/isodoc-yaml/i18n-fr.yaml +0 -48
  65. data/lib/isodoc-yaml/i18n-ru.yaml +0 -51
  66. data/lib/isodoc-yaml/i18n-zh-Hans.yaml +0 -40
  67. data/lib/relaton/render/fields/date.rb +0 -45
  68. data/lib/relaton/render/fields/fields.rb +0 -245
  69. data/lib/relaton/render/general/citations.rb +0 -96
  70. data/lib/relaton/render/general/config.yml +0 -79
  71. data/lib/relaton/render/general/render.rb +0 -185
  72. data/lib/relaton/render/general/render_classes.rb +0 -129
  73. data/lib/relaton/render/parse/parse.rb +0 -64
  74. data/lib/relaton/render/parse/parse_contributors.rb +0 -132
  75. data/lib/relaton/render/parse/parse_extract.rb +0 -180
  76. data/lib/relaton/render/template/liquid.rb +0 -15
  77. data/lib/relaton/render/template/template.rb +0 -188
  78. 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]}&#x2013;#{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]}&#x2013;#{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