relaton-render 0.1.0 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.adoc +64 -19
- data/lib/isodoc/i18n.rb +12 -3
- data/lib/isodoc-yaml/i18n-ar.yaml +29 -0
- data/lib/isodoc-yaml/i18n-de.yaml +27 -0
- data/lib/isodoc-yaml/i18n-en.yaml +14 -5
- data/lib/isodoc-yaml/i18n-es.yaml +28 -0
- data/lib/isodoc-yaml/i18n-fr.yaml +28 -0
- data/lib/isodoc-yaml/i18n-ru.yaml +13 -5
- data/lib/isodoc-yaml/i18n-zh-Hans.yaml +28 -0
- data/lib/relaton/render/fields/date.rb +45 -0
- data/lib/relaton/render/fields/fields.rb +213 -0
- data/lib/relaton/{config.yml → render/general/config.yml} +36 -31
- data/lib/relaton/{render.rb → render/general/render.rb} +52 -33
- data/lib/relaton/{render_classes.rb → render/general/render_classes.rb} +4 -1
- data/lib/relaton/render/parse/parse.rb +63 -0
- data/lib/relaton/render/parse/parse_contributors.rb +129 -0
- data/lib/relaton/render/parse/parse_extract.rb +176 -0
- data/lib/relaton/render/template/liquid.rb +15 -0
- data/lib/relaton/render/template/template.rb +184 -0
- data/lib/{utils → relaton/render/utils}/utils.rb +0 -0
- data/lib/relaton/{version.rb → render/version.rb} +1 -1
- data/lib/relaton-render.rb +5 -4
- data/relaton-render.gemspec +4 -1
- metadata +42 -12
- data/lib/parse/parse.rb +0 -54
- data/lib/parse/parse_contributors.rb +0 -96
- data/lib/parse/parse_extract.rb +0 -155
- data/lib/relaton/render_fields.rb +0 -151
- data/lib/template/template.rb +0 -152
@@ -0,0 +1,213 @@
|
|
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
|
+
hash[:place] = nameformat(hash[:place_raw]&.map do |x|
|
20
|
+
{ nonpersonal: x }
|
21
|
+
end)
|
22
|
+
[%i(creatornames creators), %i(host_creatornames host_creators),
|
23
|
+
%i(publisher publisher_raw), %i(distributor distributor_raw)]
|
24
|
+
.each do |k|
|
25
|
+
hash[k[0]] = nameformat(hash[k[1]])
|
26
|
+
end
|
27
|
+
hash[:publisher_abbrev] = hash[:publisher_abbrev_raw]&.join(", ")
|
28
|
+
end
|
29
|
+
|
30
|
+
def role_fields_format(hash)
|
31
|
+
hash[:role] = role_inflect(hash[:creators], hash[:role_raw])
|
32
|
+
hash[:host_role] =
|
33
|
+
role_inflect(hash[:host_creators], hash[:host_role_raw])
|
34
|
+
end
|
35
|
+
|
36
|
+
def edition_fields_format(hash)
|
37
|
+
hash[:edition] = editionformat(hash[:edition_raw])
|
38
|
+
hash[:draft] = draftformat(hash[:draft_raw], hash)
|
39
|
+
end
|
40
|
+
|
41
|
+
def misc_fields_format(hash)
|
42
|
+
hash[:series] = seriesformat(hash)
|
43
|
+
hash[:medium] = mediumformat(hash[:medium_raw])
|
44
|
+
hash[:extent] = extentformat(hash[:extent_raw], hash)
|
45
|
+
hash[:size] = sizeformat(hash[:size_raw], hash)
|
46
|
+
hash[:uri] = uriformat(hash[:uri_raw])
|
47
|
+
hash
|
48
|
+
end
|
49
|
+
|
50
|
+
def date_fields_format(hash)
|
51
|
+
[%i(date date), %i(date_updated date_updated),
|
52
|
+
%i(date_accessed date_accessed)].each do |k|
|
53
|
+
hash[k[0]] = dateformat(hash[k[1]], hash)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# TODO is not being i18n-alised
|
58
|
+
def mediumformat(hash)
|
59
|
+
return nil if hash.nil?
|
60
|
+
|
61
|
+
%w(content genre form carrier size scale).each_with_object([]) do |i, m|
|
62
|
+
m << hash[i] if hash[i]
|
63
|
+
m
|
64
|
+
end.compact.join(", ")
|
65
|
+
end
|
66
|
+
|
67
|
+
def seriesformat(hash)
|
68
|
+
parts = %i(series_title series_abbr series_num series_partnumber
|
69
|
+
series_run series_formatted)
|
70
|
+
series_out = parts.each_with_object({}) do |i, m|
|
71
|
+
m[i] = hash[i]
|
72
|
+
end
|
73
|
+
t = hash[:type] == "article" ? @r.journaltemplate : @r.seriestemplate
|
74
|
+
t.render(series_out)
|
75
|
+
end
|
76
|
+
|
77
|
+
def nameformat(names)
|
78
|
+
return names if names.nil?
|
79
|
+
|
80
|
+
parts = %i(surname initials given middle nonpersonal)
|
81
|
+
names_out = names.each_with_object({}) do |n, m|
|
82
|
+
parts.each do |i|
|
83
|
+
m[i] ||= []
|
84
|
+
m[i] << n[i]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
@r.nametemplate.render(names_out)
|
88
|
+
end
|
89
|
+
|
90
|
+
def role_inflect(contribs, role)
|
91
|
+
return nil if role.nil? || contribs.size.zero? ||
|
92
|
+
%w(author publisher).include?(role)
|
93
|
+
|
94
|
+
number = contribs.size > 1 ? "pl" : "sg"
|
95
|
+
@r.i18n.get[role][number] || role
|
96
|
+
end
|
97
|
+
|
98
|
+
def editionformat(edn)
|
99
|
+
return edn unless /^\d+$/.match?(edn)
|
100
|
+
|
101
|
+
num = edn
|
102
|
+
@r.edition_number and num = edn.to_i.localize(tw_cldr_lang)
|
103
|
+
.to_rbnf_s(*@r.edition_number)
|
104
|
+
@r.edition.sub(/%/, num)
|
105
|
+
end
|
106
|
+
|
107
|
+
def draftformat(num, _hash)
|
108
|
+
return nil if num.nil?
|
109
|
+
return nil if num.is_a?(Hash) && num[:status].nil? && num[:iteration].nil?
|
110
|
+
|
111
|
+
@r.i18n.draft.sub(/%/, num)
|
112
|
+
end
|
113
|
+
|
114
|
+
def extentformat(extent, hash)
|
115
|
+
extent.map do |e|
|
116
|
+
e1 = e.transform_values { |v| v.is_a?(Hash) ? range(v) : v }
|
117
|
+
ret = e.each_with_object({}) do |(k, v), m|
|
118
|
+
extentformat1(k, v, m, e1)
|
119
|
+
m
|
120
|
+
end
|
121
|
+
@r.extenttemplate.render(ret.merge(type: hash[:type]))
|
122
|
+
end.join("; ")
|
123
|
+
end
|
124
|
+
|
125
|
+
def extentformat1(key, val, hash, norm_hash)
|
126
|
+
if %i(volume page).include?(key)
|
127
|
+
hash["#{key}_raw".to_sym] = norm_hash[key]
|
128
|
+
hash[key] = pagevolformat(norm_hash[key], val, key.to_s, false)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def range(hash)
|
133
|
+
if hash[:on] then hash[:on]
|
134
|
+
elsif hash.has_key?(:from) && hash[:from].nil? then nil
|
135
|
+
elsif hash[:from]
|
136
|
+
hash[:to] ? "#{hash[:from]}–#{hash[:to]}" : hash[:from]
|
137
|
+
else hash
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def sizeformat(size, hash)
|
142
|
+
return nil unless size
|
143
|
+
|
144
|
+
ret = size.transform_values { |v| @r.i18n.l10n(v.join(" + ")) }
|
145
|
+
.each_with_object({}) do |(k, v), m|
|
146
|
+
sizeformat1(k, v, m)
|
147
|
+
m
|
148
|
+
end
|
149
|
+
@r.sizetemplate.render(ret.merge(type: hash[:type]))
|
150
|
+
end
|
151
|
+
|
152
|
+
def sizeformat1(key, val, hash)
|
153
|
+
case key
|
154
|
+
when "volume"
|
155
|
+
hash[:volume_raw] = val
|
156
|
+
hash[:volume] = pagevolformat(val, nil, "volume", true)
|
157
|
+
when "page"
|
158
|
+
hash[:page_raw] = val
|
159
|
+
hash[:page] = pagevolformat(val, nil, "page", true)
|
160
|
+
when "data" then hash[:data] = val
|
161
|
+
when "duration" then hash[:duration] = val
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def pagevolformat(value, value_raw, type, is_size)
|
166
|
+
return nil if value.nil?
|
167
|
+
|
168
|
+
num = "pl"
|
169
|
+
if is_size
|
170
|
+
value == "1" and num = "sg"
|
171
|
+
else
|
172
|
+
value_raw[:to] or num = "sg"
|
173
|
+
end
|
174
|
+
@r.i18n.l10n(@r.i18n.get[is_size ? "size" : "extent"][type][num]
|
175
|
+
.sub(/%/, value))
|
176
|
+
end
|
177
|
+
|
178
|
+
def date_range(hash)
|
179
|
+
if hash[:from]
|
180
|
+
"#{hash[:from]}–#{hash[:to]}"
|
181
|
+
else range(hash)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def dateformat(date, _hash)
|
186
|
+
return nil if date.nil?
|
187
|
+
|
188
|
+
%i(from to on).each do |k|
|
189
|
+
date[k] = ::Relaton::Render::Date.new(date[k], renderer: @r).render
|
190
|
+
end
|
191
|
+
date_range(date)
|
192
|
+
end
|
193
|
+
|
194
|
+
def uriformat(uri)
|
195
|
+
return nil if uri.nil? || uri.empty?
|
196
|
+
|
197
|
+
"<link target='#{uri}'>#{uri}</link>"
|
198
|
+
end
|
199
|
+
|
200
|
+
private
|
201
|
+
|
202
|
+
def tw_cldr_lang
|
203
|
+
if @r.lang != "zh"
|
204
|
+
@r.lang.to_sym
|
205
|
+
elsif @r.script == "Hant"
|
206
|
+
:"zh-tw"
|
207
|
+
else
|
208
|
+
:"zh-cn"
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
@@ -1,45 +1,49 @@
|
|
1
1
|
nametemplate:
|
2
|
-
one: "{{surname[0] | upcase }}, {{given[0]}} {{middle[0}}"
|
3
|
-
two: "{{surname[0] | upcase}}, {{given[0]}} {{middle[0]}} {{ labels['and'] }} {{given[1]}} {{middle[1]}} {{surname[1] | upcase}}"
|
4
|
-
more: "{{surname[0] | upcase}}, {{given[0]}} {{middle[0}} , {{given[1]}} {{middle[1]}} {{surname[1] | upcase}} {{ labels['and'] }} {{given[2]}} {{middle[2]}} {{surname[2] | upcase}}"
|
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
5
|
# disabled the following: they should be provided in inheriting calls
|
6
|
-
# etal: "{{surname[0] | upcase}}, {{given[0]}} {{middle[0]}}, {{given[1]}} {{middle[1]}} {{surname[1] | upcase}} <em>et al.</em>"
|
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
7
|
# etal_count: 5
|
8
|
-
seriestemplate: "{% if series_abbr %}{{series_abbr}}{% else %}{{series_title}}{% endif %} ({{series_run}}) {{series_num}}|({{series_partnumber}})"
|
8
|
+
seriestemplate: "{% if series_formatted %}{{ series_formatted }}{%else%}{% if series_abbr %}{{series_abbr}}{% else %}{{series_title}}{% endif %} ({{series_run}}) {{series_num}}|({{series_partnumber}}){%endif%}"
|
9
9
|
journaltemplate: "<em>{% if series_abbr %}{{series_abbr}}{% else %}{{series_title}}{% endif %}</em> ({{series_run}}) {{ labels['volume'] }}_{{series_num}} {{ labels['part'] }}_{{series_partnumber}}"
|
10
10
|
extenttemplate:
|
11
|
-
book: "{{ volume }}
|
11
|
+
book: "{{ volume }}, {{ page }}"
|
12
12
|
booklet: book
|
13
13
|
proceedings: book
|
14
14
|
journal: book
|
15
15
|
standard: book
|
16
16
|
techreport: book
|
17
17
|
inbook: "{{ volume }}: {{ page }}"
|
18
|
-
misc: "{{
|
19
|
-
|
18
|
+
misc: "{{ volume }}, {{ page }}, {{ duration }}"
|
19
|
+
sizetemplate:
|
20
|
+
dataset: "{{ data }}"
|
21
|
+
electronic resource: dataset
|
22
|
+
webresource: dataset
|
23
|
+
misc: "{{ volume }}, {{ page }}, {{ data }}, {{ duration }}"
|
20
24
|
language: en
|
21
25
|
script: Latn
|
22
26
|
template:
|
23
|
-
book: "{{ creatornames }} ({{role}}) . <em>{{ title }}</em> [{{medium}}] . {{ edition |
|
27
|
+
book: "{{ creatornames }} ({{role}}) . <em>{{ title }}</em> [{{medium}}] . {{ edition | capitalize_first }}. ({{ series }}.) {{place}}: {{publisher}}. {{date}}. {{ labels['updated'] | capitalize }}:_{{date_updated}}. {{ standardidentifier | first }}. {{ uri }}. {{ labels['at'] | capitalize}}:_{{ access_location }}. [{{ labels['viewed'] }}:_{{date_accessed}}]. {{size}}. {{extent}}."
|
24
28
|
# TODO: omitted: author ids, subsidiary titles, subsidiary creators, rights metadata, distributor, item attributes, relationships
|
25
29
|
booklet: book
|
26
30
|
manual: book
|
27
31
|
proceedings: book
|
28
|
-
inbook: "{{ creatornames }} ({{role}}) . {{ title }} . {{ labels['in'] | capitalize }}: {{ host_creatornames}} ({{ host_role}}) : <em>{{host_title}}</em> [{{medium}}] . {{ edition |
|
32
|
+
inbook: "{{ creatornames }} ({{role}}) . {{ title }} . {{ labels['in'] | capitalize }}: {{ host_creatornames}} ({{ host_role}}) : <em>{{host_title}}</em> [{{medium}}] . {{ edition | capitalize_first }}. ({{ series }}.) {{place}}: {{publisher}}. {{date}}. {{size}}. {{extent}}. {{ labels['updated'] | capitalize }}:_{{date_updated}}. {{ standardidentifier | first }}. {{ uri }}. {{ labels['at'] | capitalize}}:_{{ access_location }}. [{{ labels['viewed'] }}:_{{date_accessed}}]."
|
29
33
|
inproceedings: inbook
|
30
34
|
incollection: inbook
|
31
35
|
# TODO: omitted: author ids, additional info for component part, subsidiary titles of host resource, rights metadata, distributor, relationships
|
32
|
-
journal: "<em>{{ title}}</em> [{{medium}}] . {{ edition |
|
36
|
+
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}}]."
|
33
37
|
# TODO subsidiary titles, rights metadata, item attributes, relationships
|
34
|
-
article: "{{ creatornames }} ({{role}}) . {{ title }}. {{ series }} [{{medium}}] . {{ edition |
|
38
|
+
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}}]."
|
35
39
|
# TODO: omitted: author ids, subsidiary titles, rights metadata, distributor, item attributes, relationships; newspapers
|
36
|
-
software: "{{ creatornames }} ({{ role}}) . <em>{{ title }}</em> . {{ labels['version'] | capitalize }}_{{ edition_raw }}. {{medium | capitalize}}. {{place}}: {{publisher}}. {{date}}. {{ labels['updated'] | capitalize }}:_{{date_updated}}. {{ standardidentifier | first }}. {{ uri }}. {{ extent}}. [{{ labels['viewed'] }}:_{{date_accessed}}]. "
|
40
|
+
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}}]. "
|
37
41
|
# TODO: omitted: author ids, subsidiary titles, subsidiary creators, copyright, license, distributor, system requirements, relationships
|
38
42
|
electronic resource: software
|
39
|
-
standard: "{{ creatornames }} ({{ role}}) . <em>{{ title }}</em> . {{ labels['in'] | capitalize }}:_{{ series_title }}. {{ medium | capitalize }}. {{ edition |
|
43
|
+
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}}]."
|
40
44
|
# TODO: omitted: author ids, subsidiary titles, rights metadata, distributor, persistent identifier, item attributes, relationships
|
41
45
|
techreport: standard
|
42
|
-
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 }}. {{ extent}}. [{{ labels['viewed'] }}:_{{date_accessed}}]. "
|
46
|
+
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}}]. "
|
43
47
|
# TODO: omitted: author ids, system requirements, host archive, copyright, license, data source, distributor, usage instructions, relationships, provenance
|
44
48
|
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}}]. "
|
45
49
|
# TODO: omitted: author ids, page title, system requirements, subsidiary creator, rights metadata, distributor, persistent identifier, archive location, archive date and time, relationships
|
@@ -49,19 +53,20 @@ template:
|
|
49
53
|
# TODO: omitted: author ids, subsidiary titles, subsidiary creators, host archive, item attributes, relationships
|
50
54
|
presentation: unpublished
|
51
55
|
thesis: "{{ creatornames }} ({{ role }}) . <em>{{ title }}</em> . {{ medium | capitalize }}. {{ place }}: {{ publisher }}. {{ date }}. {{ labels['at'] | capitalize}}:_{{ access_location }}. {{ standardidentifier | first }}. {{ uri }}. [{{ labels['viewed'] }}:_{{date_accessed}}]."
|
52
|
-
|
53
|
-
#
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
56
|
+
misc: "{{ creatornames }} ({{ role }}) . <em>{{ title }}</em> . {{ date }}."
|
57
|
+
# following are # unsupported types:
|
58
|
+
map: misc
|
59
|
+
audiovisual: misc
|
60
|
+
film: misc
|
61
|
+
video: misc
|
62
|
+
broadcast: misc
|
63
|
+
graphic_work: misc
|
64
|
+
music: misc
|
65
|
+
performance: misc
|
66
|
+
patent: misc
|
67
|
+
archival: misc
|
68
|
+
social_media: misc
|
69
|
+
alert: misc
|
70
|
+
message: misc
|
71
|
+
conversation: misc
|
72
|
+
internal: misc
|
@@ -1,44 +1,58 @@
|
|
1
1
|
require_relative "render_classes"
|
2
|
-
require_relative "render_fields"
|
3
2
|
require "yaml"
|
4
3
|
require "liquid"
|
5
|
-
|
6
|
-
require_relative "../
|
4
|
+
require "relaton_bib"
|
5
|
+
require_relative "../template/template"
|
6
|
+
require_relative "../../../isodoc/i18n"
|
7
7
|
|
8
8
|
module Relaton
|
9
9
|
module Render
|
10
10
|
class General
|
11
11
|
attr_reader :template, :journaltemplate, :seriestemplate, :nametemplate,
|
12
|
-
:extenttemplate, :
|
13
|
-
:date
|
12
|
+
:extenttemplate, :sizetemplate, :lang, :script, :i18n,
|
13
|
+
:edition, :edition_number, :date
|
14
14
|
|
15
15
|
def initialize(opt = {})
|
16
|
-
options =
|
17
|
-
|
18
|
-
|
19
|
-
@type = self.class.name.downcase.sub(/relaton::render::/, "")
|
16
|
+
options = read_config.merge(Utils::string_keys(opt))
|
17
|
+
@type = self.class.name.downcase.split("::").last
|
18
|
+
klass_initialize(options)
|
20
19
|
root_initalize(options)
|
21
20
|
render_initialize(options)
|
22
21
|
@parse ||= options["parse"]
|
23
22
|
@i18n ||= options["i18n"]
|
24
23
|
end
|
25
24
|
|
25
|
+
def read_config
|
26
|
+
YAML.load_file(File.join(File.dirname(__FILE__), "config.yml"))
|
27
|
+
end
|
28
|
+
|
29
|
+
def klass_initialize(_options)
|
30
|
+
@nametemplateklass = Relaton::Render::Template::Name
|
31
|
+
@seriestemplateklass = Relaton::Render::Template::Series
|
32
|
+
@extenttemplateklass = Relaton::Render::Template::Extent
|
33
|
+
@sizetemplateklass = Relaton::Render::Template::Size
|
34
|
+
@generaltemplateklass = Relaton::Render::Template::General
|
35
|
+
@fieldsklass = Relaton::Render::Fields
|
36
|
+
@parseklass = Relaton::Render::Parse
|
37
|
+
end
|
38
|
+
|
26
39
|
def root_initalize(opt)
|
27
40
|
i18n_initialize(opt)
|
28
|
-
@parse =
|
29
|
-
@nametemplate =
|
41
|
+
@parse = @parseklass.new(lang: @lang, script: @script)
|
42
|
+
@nametemplate = @nametemplateklass
|
30
43
|
.new(template: opt["nametemplate"], i18n: @i18n)
|
31
|
-
@seriestemplate =
|
44
|
+
@seriestemplate = @seriestemplateklass
|
32
45
|
.new(template: opt["seriestemplate"], i18n: @i18n)
|
33
|
-
@journaltemplate =
|
46
|
+
@journaltemplate = @seriestemplateklass
|
34
47
|
.new(template: opt["journaltemplate"], i18n: @i18n)
|
35
48
|
@extenttemplate = extentrenderers(opt)
|
49
|
+
@sizetemplate = sizerenderers(opt)
|
36
50
|
end
|
37
51
|
|
38
52
|
def i18n_initialize(opt)
|
39
53
|
@lang = opt["language"]
|
40
54
|
@script = opt["script"]
|
41
|
-
@i18n =
|
55
|
+
@i18n = i18n_klass(opt["language"], opt["script"])
|
42
56
|
@edition_number = opt["edition_number"] || @i18n.edition_number
|
43
57
|
@edition = opt["edition"] || @i18n.edition
|
44
58
|
@date = opt["date"] || @i18n.date
|
@@ -47,8 +61,8 @@ module Relaton
|
|
47
61
|
def render_initialize(opt)
|
48
62
|
case opt["template"]
|
49
63
|
when String
|
50
|
-
@template =
|
51
|
-
|
64
|
+
@template = @generaltemplateklass
|
65
|
+
.new(template: opt["template"], i18n: @i18n)
|
52
66
|
when Hash
|
53
67
|
@render = renderers(opt)
|
54
68
|
end
|
@@ -64,48 +78,53 @@ module Relaton
|
|
64
78
|
end
|
65
79
|
|
66
80
|
def extentrenderers(opt)
|
67
|
-
|
81
|
+
@extenttemplateklass
|
68
82
|
.new(template: template_hash_fill(opt["extenttemplate"]), i18n: @i18n)
|
69
83
|
end
|
70
84
|
|
85
|
+
def sizerenderers(opt)
|
86
|
+
@sizetemplateklass
|
87
|
+
.new(template: template_hash_fill(opt["sizetemplate"]), i18n: @i18n)
|
88
|
+
end
|
89
|
+
|
71
90
|
def default_template
|
72
91
|
"{{creatornames}}. {{title}}. {{date}}."
|
73
92
|
end
|
74
93
|
|
75
|
-
def
|
76
|
-
::IsoDoc::
|
94
|
+
def i18n_klass(lang = "en", script = "Latn")
|
95
|
+
::IsoDoc::RelatonRenderI18n.new(lang, script)
|
77
96
|
end
|
78
97
|
|
79
98
|
def render(bib, embedded: false)
|
80
|
-
|
81
|
-
|
82
|
-
|
99
|
+
if bib.is_a?(String) && Nokogiri::XML(bib).errors.empty?
|
100
|
+
bib = RelatonBib::XMLParser.from_xml bib
|
101
|
+
end
|
102
|
+
parse(bib, embedded: embedded)
|
83
103
|
end
|
84
104
|
|
85
105
|
def parse(doc, embedded: false)
|
86
|
-
f = doc.
|
106
|
+
f = doc.formattedref and
|
87
107
|
return embedded ? f.children.to_xml : doc.to_xml
|
88
108
|
|
89
|
-
ret = parse1(doc)
|
109
|
+
ret = parse1(doc) or return nil
|
90
110
|
embedded and return ret
|
91
111
|
"<formattedref>#{ret}</formattedref>"
|
92
112
|
end
|
93
113
|
|
94
|
-
def renderer(
|
95
|
-
|
96
|
-
raise "No renderer defined for #{
|
97
|
-
|
98
|
-
|
99
|
-
raise "No renderer defined for #{doc['type']}"
|
100
|
-
end
|
114
|
+
def renderer(type)
|
115
|
+
ret = @template || @render[type]&.template or
|
116
|
+
raise "No renderer defined for #{type}"
|
117
|
+
@type == "general" || @type == type or
|
118
|
+
raise "No renderer defined for #{type}"
|
101
119
|
|
102
120
|
ret
|
103
121
|
end
|
104
122
|
|
105
123
|
def parse1(doc)
|
106
|
-
r = renderer(doc)
|
124
|
+
r = renderer(doc.type || "misc")
|
107
125
|
data = @parse.extract(doc)
|
108
|
-
data_liquid =
|
126
|
+
data_liquid = @fieldsklass.new(renderer: self)
|
127
|
+
.compound_fields_format(data)
|
109
128
|
@i18n.l10n(r.render(data_liquid))
|
110
129
|
end
|
111
130
|
|
@@ -5,7 +5,7 @@ module Relaton
|
|
5
5
|
standard unpublished map electronic_resource audiovisual film video
|
6
6
|
broadcast software graphic_work music patent inbook incollection
|
7
7
|
inproceedings journal website webresource dataset archival social_media
|
8
|
-
alert message conversation misc).freeze
|
8
|
+
alert message conversation misc internal).freeze
|
9
9
|
|
10
10
|
class General
|
11
11
|
singleton_class.send(:attr_reader, :descendants)
|
@@ -122,5 +122,8 @@ module Relaton
|
|
122
122
|
|
123
123
|
class Misc < General
|
124
124
|
end
|
125
|
+
|
126
|
+
class Internal < General
|
127
|
+
end
|
125
128
|
end
|
126
129
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require "nokogiri"
|
2
|
+
require "twitter_cldr"
|
3
|
+
require_relative "parse_contributors"
|
4
|
+
require_relative "parse_extract"
|
5
|
+
|
6
|
+
module Relaton
|
7
|
+
module Render
|
8
|
+
class Parse
|
9
|
+
def initialize(options)
|
10
|
+
@lang = options[:lang] || "en"
|
11
|
+
@script = options[:script] || "Latn"
|
12
|
+
end
|
13
|
+
|
14
|
+
def extract(doc)
|
15
|
+
host = host(doc)
|
16
|
+
simple_xml2hash(doc).merge(simple_or_host_xml2hash(doc, host))
|
17
|
+
.merge(host_xml2hash(host))
|
18
|
+
.merge(series_xml2hash(doc, host))
|
19
|
+
end
|
20
|
+
|
21
|
+
def simple_xml2hash(doc)
|
22
|
+
creators, role = creatornames(doc)
|
23
|
+
{ type: type(doc), title: title(doc), extent_raw: extent(doc),
|
24
|
+
size_raw: size(doc),
|
25
|
+
standardidentifier: standardidentifier(doc), uri_raw: uri(doc),
|
26
|
+
status: status(doc), creators: creators, role_raw: role }
|
27
|
+
end
|
28
|
+
|
29
|
+
def simple_or_host_xml2hash(doc, host)
|
30
|
+
{ edition_raw: edition(doc, host), medium_raw: medium(doc, host),
|
31
|
+
place_raw: place(doc, host), publisher_raw: publisher(doc, host),
|
32
|
+
publisher_abbrev_raw: publisher_abbrev(doc, host),
|
33
|
+
distributor_raw: distributor(doc, host), draft_raw: draft(doc, host),
|
34
|
+
access_location: access_location(doc, host),
|
35
|
+
date: date(doc, host), date_updated: date_updated(doc, host),
|
36
|
+
date_accessed: date_accessed(doc, host) }
|
37
|
+
end
|
38
|
+
|
39
|
+
def host_xml2hash(host)
|
40
|
+
creators, role = creatornames(host)
|
41
|
+
{ host_creators: creators, host_role_raw: role,
|
42
|
+
host_title: title(host) }
|
43
|
+
end
|
44
|
+
|
45
|
+
def series_xml2hash(doc, host)
|
46
|
+
series = series(doc)
|
47
|
+
host and series ||= series(host)
|
48
|
+
series_xml2hash1(series, doc)
|
49
|
+
end
|
50
|
+
|
51
|
+
def series_xml2hash1(series, doc)
|
52
|
+
return {} unless series
|
53
|
+
|
54
|
+
{ series_formatted: series_formatted(series, doc),
|
55
|
+
series_title: series_title(series, doc),
|
56
|
+
series_abbr: series_abbr(series, doc),
|
57
|
+
series_run: series_run(series, doc),
|
58
|
+
series_num: series_num(series, doc),
|
59
|
+
series_partnumber: series_partnumber(series, doc) }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|