relaton-render 0.5.10 → 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 (79) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +6 -1
  3. data/.github/workflows/release.yml +6 -4
  4. data/.gitignore +14 -0
  5. data/.rubocop.yml +2 -2
  6. data/Gemfile +17 -1
  7. data/README.adoc +13 -291
  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 +63 -120
  59. data/lib/isodoc/i18n.rb +0 -34
  60. data/lib/isodoc-yaml/i18n-ar.yaml +0 -49
  61. data/lib/isodoc-yaml/i18n-de.yaml +0 -48
  62. data/lib/isodoc-yaml/i18n-en.yaml +0 -45
  63. data/lib/isodoc-yaml/i18n-es.yaml +0 -52
  64. data/lib/isodoc-yaml/i18n-fr.yaml +0 -53
  65. data/lib/isodoc-yaml/i18n-ru.yaml +0 -56
  66. data/lib/isodoc-yaml/i18n-zh-Hans.yaml +0 -45
  67. data/lib/isodoc-yaml/i18n-zh-Hant.yaml +0 -45
  68. data/lib/relaton/render/fields/date.rb +0 -45
  69. data/lib/relaton/render/fields/fields.rb +0 -229
  70. data/lib/relaton/render/general/citations.rb +0 -96
  71. data/lib/relaton/render/general/config.yml +0 -79
  72. data/lib/relaton/render/general/render.rb +0 -187
  73. data/lib/relaton/render/general/render_classes.rb +0 -129
  74. data/lib/relaton/render/parse/parse.rb +0 -67
  75. data/lib/relaton/render/parse/parse_contributors.rb +0 -170
  76. data/lib/relaton/render/parse/parse_extract.rb +0 -208
  77. data/lib/relaton/render/template/liquid.rb +0 -15
  78. data/lib/relaton/render/template/template.rb +0 -218
  79. data/lib/relaton/render/utils/utils.rb +0 -27
@@ -1,45 +0,0 @@
1
- module Relaton
2
- module Render
3
- class Date
4
- def initialize(date, options)
5
- @date = date
6
- @r = options[:renderer]
7
- end
8
-
9
- def render
10
- return @date if @date.nil? || /^\d+$/.match?(@date)
11
-
12
- render1(granularity)
13
- end
14
-
15
- def render1(format)
16
- datef = dateparse(format, @r.lang.to_sym)
17
- case @r.date[format]
18
- when "to_full_s", "to_long_s", "to_medium_s", "to_short_s"
19
- datef.send @r.date[format]
20
- else
21
- datef.to_additional_s(@r.date[format])
22
- end
23
- end
24
-
25
- def granularity
26
- case @date
27
- when /^\d+-\d+$/ then "month_year"
28
- when /^\d+-\d+-\d+$/ then "day_month_year"
29
- else "date_time"
30
- end
31
- end
32
-
33
- def dateparse(format, lang)
34
- case format
35
- when "date_time"
36
- DateTime.parse(@date).localize(lang, timezone: "Zulu")
37
- when "day_month_year"
38
- DateTime.parse(@date).localize(lang, timezone: "Zulu").to_date
39
- when "month_year"
40
- DateTime.parse("#{@date}-01").localize(lang, timezone: "Zulu").to_date
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,229 +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
- %i(authorizer authorizer_raw)]
22
- .each do |k|
23
- hash[k[0]] = nameformat(hash[k[1]])
24
- end
25
- hash[:publisher_abbrev] = hash[:publisher_abbrev_raw]&.join(", ")
26
- hash[:authorcite] = authorciteformat(hash[:creators])
27
- place_format(hash)
28
- end
29
-
30
- def place_format(hash)
31
- hash[:place] =
32
- nameformat(hash[:place_raw].map { |x| { nonpersonal: x } })
33
- end
34
-
35
- def role_fields_format(hash)
36
- hash[:role] = role_inflect(hash[:creators], hash[:role_raw])
37
- hash[:host_role] =
38
- role_inflect(hash[:host_creators], hash[:host_role_raw])
39
- end
40
-
41
- def edition_fields_format(hash)
42
- hash[:edition] = editionformat(hash[:edition_raw], hash[:edition_num])
43
- hash[:draft] = draftformat(hash[:draft_raw], hash)
44
- end
45
-
46
- def misc_fields_format(hash)
47
- hash[:series] = seriesformat(hash)
48
- hash[:medium] = mediumformat(hash[:medium_raw])
49
- hash[:extent] = extentformat(hash[:extent_raw], hash)
50
- hash[:size] = sizeformat(hash[:size_raw], hash)
51
- hash[:uri] = uriformat(hash[:uri_raw])
52
- hash
53
- end
54
-
55
- def date_fields_format(hash)
56
- [%i(date date), %i(date_updated date_updated),
57
- %i(date_accessed date_accessed)].each do |k|
58
- hash[k[0]] = dateformat(hash[k[1]], hash)
59
- k[0] == :date && hash[:type] != "standard" and
60
- hash[k[0]] ||= @r.i18n.get["no_date"]
61
- end
62
- end
63
-
64
- # TODO is not being i18n-alised
65
- def mediumformat(hash)
66
- hash.nil? and return nil
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
- names.nil? and return names
85
- parts = %i(surname initials given middle nonpersonal)
86
- names_out = names.each_with_object({}) do |n, m|
87
- parts.each do |i|
88
- m[i] ||= []
89
- m[i] << n[i]
90
- end
91
- end
92
- @r.nametemplate.render(names_out)
93
- end
94
-
95
- def authorciteformat(names)
96
- names.nil? || @r.authorcitetemplate.nil? and return names
97
- parts = %i(surname initials given middle nonpersonal)
98
- names_out = names.each_with_object({}) do |n, m|
99
- parts.each do |i|
100
- m[i] ||= []
101
- m[i] << n[i]
102
- end
103
- end
104
- @r.authorcitetemplate.render(names_out)
105
- end
106
-
107
- def role_inflect(contribs, role)
108
- role.nil? || contribs.size.zero? ||
109
- %w(author publisher distributor
110
- authorizer).include?(role) and return nil
111
- number = contribs.size > 1 ? "pl" : "sg"
112
- @r.i18n.get[role][number] || role
113
- end
114
-
115
- def editionformat(edn, num)
116
- return edn unless num || /^\d+$/.match?(edn)
117
-
118
- ret = edition_translate1(num || edn.to_i)
119
- @r.edition_ordinal.sub(/%(Spellout|Ordinal)?/, ret)
120
- end
121
-
122
- def edition_translate1(num)
123
- ruleset = case @r.i18n.edition_ordinal
124
- when /%Spellout/ then "SpelloutRules"
125
- when /%Ordinal/ then "OrdinalRules"
126
- else "Digit"
127
- end
128
- ruleset == "Digit" and return num.to_s
129
- ed = HTMLEntities.new.decode(@r.i18n.edition)
130
- @r.i18n.inflect_ordinal(num, @r.i18n.get["inflection"]&.dig(ed) || {},
131
- ruleset)
132
- end
133
-
134
- def draftformat(num, _hash)
135
- num.nil? ||
136
- (num.is_a?(Hash) && num[:status].nil? &&
137
- num[:iteration].nil?) and return nil
138
- @r.i18n.draft.sub(/%/, num)
139
- end
140
-
141
- def extentformat(extent, hash)
142
- extent.map do |e|
143
- e1 = e.transform_values { |v| v.is_a?(Hash) ? range(v) : v }
144
- ret = e.each_with_object({}) do |(k, v), m|
145
- extentformat1(k, v, m, e1)
146
- m
147
- end
148
- @r.extenttemplate.render(ret.merge(type: hash[:type]))
149
- end.join("; ")
150
- end
151
-
152
- def extentformat1(key, val, hash, norm_hash)
153
- if %i(volume issue page).include?(key)
154
- hash["#{key}_raw".to_sym] = norm_hash[key]
155
- hash[key] = pagevolformat(norm_hash[key], val, key.to_s, false)
156
- end
157
- end
158
-
159
- def range(hash)
160
- hash[:on] and return hash[:on]
161
- hash.has_key?(:from) && hash[:from].nil? and return nil
162
- !hash[:from] and return hash
163
- hash[:to] && hash[:to] != hash[:from] and
164
- return "#{hash[:from]}&#x2013;#{hash[:to]}"
165
- hash[:from]
166
- end
167
-
168
- def sizeformat(size, hash)
169
- return nil unless size
170
-
171
- ret = size.transform_values { |v| @r.i18n.l10n(v.join(" + ")) }
172
- .each_with_object({}) do |(k, v), m|
173
- sizeformat1(k, v, m)
174
- m
175
- end
176
- @r.sizetemplate.render(ret.merge(type: hash[:type]))
177
- end
178
-
179
- def sizeformat1(key, val, hash)
180
- case key
181
- when "volume", "issue", "page"
182
- hash["#{key}_raw".to_sym] = val
183
- hash[key.to_sym] = pagevolformat(val, nil, key, true)
184
- when "data" then hash[:data] = val
185
- when "duration" then hash[:duration] = val
186
- end
187
- end
188
-
189
- def pagevolformat(value, value_raw, type, is_size)
190
- value.nil? and return nil
191
- num = "pl"
192
- if is_size
193
- value == "1" and num = "sg"
194
- else
195
- value_raw[:to] or num = "sg"
196
- end
197
- @r.i18n.l10n(@r.i18n.get[is_size ? "size" : "extent"][type][num]
198
- .sub(/%/, value))
199
- end
200
-
201
- def date_range(hash)
202
- hash[:from] && !hash[:to] and return "#{hash[:from]}&#x2013;"
203
- range(hash)
204
- end
205
-
206
- def dateformat(date, _hash)
207
- date.nil? and return nil
208
- %i(from to on).each do |k|
209
- date[k] = ::Relaton::Render::Date.new(date[k], renderer: @r).render
210
- end
211
- date_range(date)
212
- end
213
-
214
- def uriformat(uri)
215
- uri.nil? || uri.empty? and return nil
216
- "<link target='#{uri}'>#{uri}</link>"
217
- end
218
-
219
- private
220
-
221
- def tw_cldr_lang
222
- if @r.lang != "zh" then @r.lang.to_sym
223
- elsif @r.script == "Hant" then :"zh-tw"
224
- else :"zh-cn"
225
- end
226
- end
227
- end
228
- end
229
- 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['author_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['author_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['author_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['author_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}}) . {{labels['qq-open']}}{{ title }}{{labels['qq-close']}} [{{medium}}] . {{ edition | capitalize_first }}. ({{ series }}.) {% if place %}{{place}}{%else%}{{ labels['no_place']}}{%endif%}: {{publisher}}. {{date}}. {{ labels['updated'] | capitalize }}:_{{date_updated}}. {{ authoritative_identifier | join: '. ' }}. {{ other_identifier | join: '. ' }}. {{ 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}}) . {{labels['q-open']}}{{ title }}{{labels['q-close']}} . {{ labels['in'] | capitalize }}: {{ host_creatornames}} ({{ host_role}}) : {{labels['qq-open']}}{{host_title}}{{labels['qq-close']}} [{{medium}}] . {{ edition | capitalize_first }}. ({{ series }}.) {% if place %}{{place}}{%else%}{{ labels['no_place']}}{%endif%}: {{publisher}}. {{date}}. {{size}}. {{extent}}. {{ labels['updated'] | capitalize }}:_{{date_updated}}. {{ authoritative_identifier | join: '. ' }}. {{ other_identifier | join: '. ' }}. {{ 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: "{{labels['qq-open']}}{{ title}}{{labels['qq-close']}} [{{medium}}] . {{ edition | capitalize_first }}. {{place}}: {{publisher}}. {{date}}. {{size}}. {{extent}}. {{ authoritative_identifier | join: '. ' }}. {{ other_identifier | join: '. ' }}. {{ uri }}. {{ labels['at'] | capitalize}}:_{{ access_location }}. [{{ labels['viewed'] }}:_{{date_accessed}}]."
44
- # TODO subsidiary titles, rights metadata, item attributes, relationships
45
- article: "{{ creatornames }} ({{role}}) . {{labels['q-open']}}{{ title }}{{labels['q-close']}}. {{ series }} [{{medium}}] . {{ edition | capitalize_first }}. {{size}}. {{ extent }}. {{place}}: {{publisher}}. {{date}}. {{ labels['updated'] | capitalize }}:_{{date_updated}}. {{ authoritative_identifier | join: '. ' }}. {{ other_identifier | join: '. ' }}. {{ 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}}) . {{labels['qq-open']}}{{ title }}{{labels['qq-close']}} . {{ labels['version'] | capitalize }}_{{ edition_raw }}. {{medium | capitalize}}. {{place}}: {{publisher}}. {{date}}. {{ labels['updated'] | capitalize }}:_{{date_updated}}. {{ authoritative_identifier | join: '. ' }}. {{ other_identifier | join: '. ' }}. {{ 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}}) . {{ authoritative_identifier | join '|' }}: {{labels['qq-open']}}{{ title }}{{labels['qq-close']}} . {{ labels['in'] | capitalize }}:_{{ series_title }}. {{ medium | capitalize }}. {{ edition | capitalize_first }}. {{ place }}: {{ publisher }}. {{date}}. {{size}}. {{ extent }}. {{ other_identifier | join: '. ' }}. {{ 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 }}) . {{labels['qq-open']}}{{ title }}{{labels['qq-close']}} . {{ labels['version'] | capitalize }}_{{ edition_raw }}. {{medium | capitalize }}. {{ labels['in'] | capitalize }}:_{{series}}. {{date}}. {{ labels['updated'] | capitalize }}:_{{date_updated}}. {{ authoritative_identifier | join: '. ' }}. {{ other_identifier | join: '. ' }}. {{ 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 }}) . {{labels['qq-open']}}{{ title }}{{labels['qq-close']}} . {{ labels['version'] | capitalize }}_{{ edition_raw }}. {{medium | capitalize }}. {{ place }}: {{ publisher }}. {{date}}. {{ labels['updated'] | capitalize }}:_{{date_updated}}. {{ authoritative_identifier | join: '. ' }}. {{ other_identifier | join: '. ' }}. {{ 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 }}) . {{labels['qq-open']}}{{ title }}{{labels['qq-close']}} . {{ medium | capitalize }}. {{ date }}. {{ labels['at'] | capitalize}}:_{{ access_location }}. {{ authoritative_identifier | join: '. ' }}. {{ other_identifier | join: '. ' }}. {{ 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 }}) . {{labels['qq-open']}}{{ title }}{{labels['qq-close']}} . {{ medium | capitalize }}. {{ place }}: {{ publisher }}. {{ date }}. {{ labels['at'] | capitalize}}:_{{ access_location }}. {{ authoritative_identifier | join: '. ' }}. {{ other_identifier | join: '. ' }}. {{ uri }}. [{{ labels['viewed'] }}:_{{date_accessed}}]."
63
- misc: "{{ creatornames }} ({{ role }}) . {{labels['qq-open']}}{{ title }}{{labels['qq-close']}} . {{ 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,187 +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, i18n: @i18n)
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
- @locale = opt["locale"]
60
- @i18n = opt["i18n"] ||
61
- i18n_klass(language: @lang, script: @script, locale: @locale,
62
- i18nhash: opt["i18nhash"])
63
- @edition_ordinal = opt["edition_ordinal"] || @i18n.edition_ordinal
64
- @edition = opt["edition"] || @i18n.edition
65
- @date = opt["date"] || @i18n.get["date_formats"] ||
66
- { "month_year" => "yMMMM", "day_month_year" => "to_long_s",
67
- "date_time" => "to_long_s" }
68
- end
69
-
70
- def render_initialize(opt)
71
- case opt["template"]
72
- when String
73
- @template = @generaltemplateklass
74
- .new(template: opt["template"], i18n: @i18n)
75
- when Hash
76
- @render = renderers(opt)
77
- end
78
- end
79
-
80
- def renderers(opt)
81
- template_hash_fill(opt["template"]).each_with_object({}) do |(k, v), m|
82
- @type == "general" || @type == k or next
83
- m[k] = General.subclass(k)
84
- .new(template: v, parse: @parse, i18n: @i18n,
85
- language: @lang, script: @script)
86
- end
87
- end
88
-
89
- def extentrenderers(opt)
90
- @extenttemplateklass
91
- .new(template: template_hash_fill(opt["extenttemplate"]), i18n: @i18n)
92
- end
93
-
94
- def sizerenderers(opt)
95
- @sizetemplateklass
96
- .new(template: template_hash_fill(opt["sizetemplate"]), i18n: @i18n)
97
- end
98
-
99
- def default_template
100
- "{{creatornames}}. {{title}}. {{date}}."
101
- end
102
-
103
- def i18n_klass(language: "en", script: "Latn", locale: nil, i18nhash: nil)
104
- ::IsoDoc::RelatonRenderI18n.new(language, script, locale: locale,
105
- i18nhash: i18nhash)
106
- end
107
-
108
- def render(bib, embedded: false)
109
- if bib.is_a?(String) && Nokogiri::XML(bib).errors.empty?
110
- bib = RelatonBib::XMLParser.from_xml bib
111
- end
112
- parse(bib, embedded: embedded)
113
- end
114
-
115
- def parse(doc, embedded: false)
116
- f = doc.formattedref and
117
- return embedded ? f.children.to_xml : doc.to_xml
118
-
119
- ret = parse1(doc) or return nil
120
- embedded and return ret
121
- "<formattedref>#{ret}</formattedref>"
122
- end
123
-
124
- def renderer(type)
125
- ret = @template || @render[type]&.template or
126
- raise "No renderer defined for #{type}"
127
- @type == "general" || @type == type or
128
- raise "No renderer defined for #{type}"
129
-
130
- ret
131
- end
132
-
133
- def parse1(doc)
134
- r = renderer(doc.type || "misc")
135
- data = @parse.extract(doc)
136
- data_liquid = @fieldsklass.new(renderer: self)
137
- .compound_fields_format(data)
138
- valid_parse(@i18n.l10n(r.render(data_liquid)))
139
- end
140
-
141
- def valid_parse(ret)
142
- @i18n.get["no_date"] == ret and return nil
143
- ret
144
- end
145
-
146
- # expect array of Relaton objects, in sorted order
147
- def render_all(bib, type: "author-date")
148
- bib = sanitise_citations_input(bib) or return
149
- Citations.new(type: type, renderer: self, i18n: @i18n)
150
- .render(citations1(bib))
151
- end
152
-
153
- def sanitise_citations_input(bib)
154
- bib.is_a?(Array) and return bib
155
- bib.is_a?(String) and return sanitise_citations_input_string(bib)
156
- end
157
-
158
- def sanitise_citations_input_string(bib)
159
- p = Nokogiri::XML(bib) or return
160
- (p.errors.empty? && p.root.at("./bibitem")) or return nil
161
-
162
- p.root.xpath("./bibitem").each_with_object([]) do |b, m|
163
- m << RelatonBib::XMLParser.from_xml(b.to_xml)
164
- end
165
- end
166
-
167
- def citations1(bib)
168
- bib.each_with_object([]).with_index do |(b, m), i|
169
- data_liquid = @fieldsklass.new(renderer: self)
170
- .compound_fields_format(@parse.extract(b))
171
- m << { author: data_liquid[:authorcite], date: data_liquid[:date],
172
- ord: i, id: b.id, data_liquid: data_liquid, type: b.type }
173
- end
174
- end
175
-
176
- private
177
-
178
- def template_hash_fill(templates)
179
- BIBTYPE.each_with_object({}) do |type, m|
180
- template = templates[type] || templates["misc"] || default_template
181
- BIBTYPE.include?(template) and template = templates[template]
182
- m[type] = template
183
- end
184
- end
185
- end
186
- end
187
- end