relaton-render 0.10.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/isodoc-yaml/i18n-ar.yaml +6 -4
- data/lib/isodoc-yaml/i18n-de.yaml +6 -4
- data/lib/isodoc-yaml/i18n-en.yaml +6 -4
- data/lib/isodoc-yaml/i18n-es.yaml +6 -4
- data/lib/isodoc-yaml/i18n-fr.yaml +6 -4
- data/lib/isodoc-yaml/i18n-ja.yaml +7 -4
- data/lib/isodoc-yaml/i18n-ru.yaml +6 -4
- data/lib/isodoc-yaml/i18n-zh-Hans.yaml +7 -4
- data/lib/isodoc-yaml/i18n-zh-Hant.yaml +7 -4
- data/lib/relaton/render/fields/date.rb +1 -0
- data/lib/relaton/render/fields/fields.rb +95 -54
- data/lib/relaton/render/general/citations.rb +64 -34
- data/lib/relaton/render/general/config.yml +60 -11
- data/lib/relaton/render/general/render.rb +66 -25
- data/lib/relaton/render/general/render_classes.rb +4 -1
- data/lib/relaton/render/i18n/i18n.rb +40 -0
- data/lib/relaton/render/parse/parse.rb +41 -13
- data/lib/relaton/render/parse/parse_contributors.rb +4 -10
- data/lib/relaton/render/parse/parse_extract.rb +21 -4
- data/lib/relaton/render/parse/parse_id.rb +11 -4
- data/lib/relaton/render/template/liquid.rb +18 -12
- data/lib/relaton/render/template/subclasses.rb +117 -0
- data/lib/relaton/render/template/template.rb +78 -122
- data/lib/relaton/render/version.rb +1 -1
- data/lib/relaton-render.rb +1 -0
- data/relaton-render.gemspec +1 -0
- metadata +18 -2
|
@@ -5,6 +5,7 @@ nametemplate:
|
|
|
5
5
|
# disabled the following: they should be provided in inheriting calls
|
|
6
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
|
+
|
|
8
9
|
authorcitetemplate:
|
|
9
10
|
one: "{% if nonpersonal[0] %}{{ nonpersonal[0] }}{% else %}{{surname[0] }}{% endif %}"
|
|
10
11
|
two: "{% if nonpersonal[0] %}{{ nonpersonal[0] }}{% else %}{{surname[0] }}{% endif %} {{ labels['author_and'] }} {% if nonpersonal[1] %}{{ nonpersonal[1] }}{% else %}{{surname[1] }}{% endif %}"
|
|
@@ -12,8 +13,10 @@ authorcitetemplate:
|
|
|
12
13
|
# disabled the following: they should be provided in inheriting calls
|
|
13
14
|
# etal: "{% if nonpersonal[0] %}{{ nonpersonal[0] }}{% else %}{{surname[0] }}{% endif %}, {% if nonpersonal[1] %}{{ nonpersonal[1] }}{% else %}{{surname[1] }}{% endif %} <em>et al.</em>"
|
|
14
15
|
# etal_count: 5
|
|
16
|
+
|
|
15
17
|
seriestemplate: "{% if series_formatted %}{{ series_formatted }}{%else%}{% if series_abbr %}{{series_abbr}}{% else %}{{series_title}}{% endif %} ({{series_run}}) {{series_num}}|({{series_partnumber}}){%endif%}"
|
|
16
18
|
journaltemplate: "<em>{% if series_abbr %}{{series_abbr}}{% else %}{{series_title}}{% endif %}</em> ({{series_run}}) {{ labels['volume'] }}_{{series_num}} {{ labels['part'] }}_{{series_partnumber}}"
|
|
19
|
+
|
|
17
20
|
extenttemplate:
|
|
18
21
|
book: "{{ volume }}, {{ page }}"
|
|
19
22
|
booklet: book
|
|
@@ -29,39 +32,85 @@ sizetemplate:
|
|
|
29
32
|
electronic resource: dataset
|
|
30
33
|
webresource: dataset
|
|
31
34
|
misc: "{{ volume }}, {{ issue }}, {{ page }}, {{ data }}, {{ duration }}"
|
|
35
|
+
|
|
32
36
|
language: en
|
|
33
37
|
script: Latn
|
|
38
|
+
|
|
39
|
+
citetemplate:
|
|
40
|
+
author_date: "{{ author }} {{ date}}"
|
|
41
|
+
author_date_br: "{{ author }} ({{ date}})"
|
|
42
|
+
author: "{{ author }}"
|
|
43
|
+
date: "{{ date }}"
|
|
44
|
+
reference_tag: "{{ biblio_tag }}"
|
|
45
|
+
title: "{{ title }}"
|
|
46
|
+
title_reference_tag: "{{ title }} {{ biblio_tag }}"
|
|
47
|
+
short:
|
|
48
|
+
book: "{{ creatornames }} ({{role}}) $$$ {{labels['punct']['open-title']}}{{ title }}{{labels['punct']['close-title']}} [{{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: '$$$ ' }}$$$ {{size}}$$$ {{extent}}$$$"
|
|
49
|
+
booklet: book
|
|
50
|
+
manual: book
|
|
51
|
+
proceedings: book
|
|
52
|
+
inbook: "{{ creatornames }} ({{role}}) $$$ {{labels['punct']['open-secondary-title']}}{{ title }}{{labels['punct']['close-secondary-title']}} $$$ {{ labels['in'] | capitalize }}: {{ host_creatornames}} ({{ host_role}}) : {{labels['punct']['open-title']}}{{host_title}}{{labels['punct']['close-title']}} [{{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: '$$$ ' }}$$$"
|
|
53
|
+
inproceedings: inbook
|
|
54
|
+
incollection: inbook
|
|
55
|
+
journal: "{{labels['punct']['open-title']}}{{ title}}{{labels['punct']['close-title']}} [{{medium}}] $$$ {{ edition | capitalize_first }}$$$ {{place}}: {{publisher}}$$$ {{date}}$$$ {{size}}$$$ {{extent}}$$$ {{ authoritative_identifier | join: '$$$ ' }}$$$ {{ other_identifier | join: '$$$ ' }}$$$"
|
|
56
|
+
article: "{{ creatornames }} ({{role}}) $$$ {{labels['punct']['open-secondary-title']}}{{ title }}{{labels['punct']['close-secondary-title']}}$$$ {{ series }} [{{medium}}] $$$ {{ edition | capitalize_first }}$$$ {{size}}$$$ {{ extent }}$$$ {{place}}: {{publisher}}$$$ {{date}}$$$ {{ labels['updated'] | capitalize }}:_{{date_updated}}$$$ {{ authoritative_identifier | join: '$$$ ' }}$$$ {{ other_identifier | join: '$$$ ' }}$$$"
|
|
57
|
+
software: "{{ creatornames }} ({{ role}}) $$$ {{labels['punct']['open-title']}}{{ title }}{{labels['punct']['close-title']}} $$$ {{ labels['version'] | capitalize }}_{{ edition_raw }}$$$ {{medium | capitalize}}$$$ {{place}}: {{publisher}}$$$ {{date}}$$$ {{ labels['updated'] | capitalize }}:_{{date_updated}}$$$ {{ authoritative_identifier | join: '$$$ ' }}$$$ {{ other_identifier | join: '$$$ ' }}$$$ {{ uri }}$$$ {{size}}$$$ {{ extent}}$$$"
|
|
58
|
+
electronic resource: software
|
|
59
|
+
standard: "{{ creatornames }} ({{ role}}) $$$ {{ authoritative_identifier | join: '|' }}: {{labels['punct']['open-title']}}{{ title }}{{labels['punct']['close-title']}} $$$ {{ medium | capitalize }}$$$ {{ edition | capitalize_first }}$$$ {{ place }}: {{ publisher }}$$$ {{date}}$$$ {{size}}$$$ {{ extent }}$$$ {{ other_identifier | join: '$$$ ' }}"
|
|
60
|
+
techreport: standard
|
|
61
|
+
dataset: "{{ creatornames }} ({{ role }}) $$$ {{labels['punct']['open-title']}}{{ title }}{{labels['punct']['close-title']}} $$$ {{ 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}}$$$"
|
|
62
|
+
website: "{{ creatornames }} ({{ role }}) $$$ {{labels['punct']['open-title']}}{{ title }}{{labels['punct']['close-title']}} $$$ {{ labels['version'] | capitalize }}_{{ edition_raw }}$$$ {{medium | capitalize }}$$$ {{ place }}: {{ publisher }}$$$ {{date}}$$$ {{ labels['updated'] | capitalize }}:_{{date_updated}}$$$ {{ authoritative_identifier | join: '$$$ ' }}$$$ {{ other_identifier | join: '$$$ ' }}$$$ {{ uri }}$$$"
|
|
63
|
+
webresource: website
|
|
64
|
+
unpublished: "{{ creatornames }} ({{ role }}) $$$ {{labels['punct']['open-title']}}{{ title }}{{labels['punct']['close-title']}} $$$ {{ medium | capitalize }}$$$ {{ date }}$$$ {{ labels['at'] | capitalize}}:_{{ access_location }}$$$ {{ authoritative_identifier | join: '$$$ ' }}$$$ {{ other_identifier | join: '$$$ ' }}$$$"
|
|
65
|
+
thesis: "{{ creatornames }} ({{ role }}) $$$ {{labels['punct']['open-title']}}{{ title }}{{labels['punct']['close-title']}} $$$ {{ medium | capitalize }}$$$ {{ place }}: {{ publisher }}$$$ {{ date }}$$$ {{ labels['at'] | capitalize}}:_{{ access_location }}$$$ {{ authoritative_identifier | join: '$$$ ' }}$$$ {{ other_identifier | join: '$$$ ' }}$$$"
|
|
66
|
+
misc: "{{ creatornames }} ({{ role }}) $$$ {{labels['punct']['open-title']}}{{ title }}{{labels['punct']['close-title']}} $$$ {{ date }}$$$"
|
|
67
|
+
map: misc
|
|
68
|
+
audiovisual: misc
|
|
69
|
+
film: misc
|
|
70
|
+
video: misc
|
|
71
|
+
broadcast: misc
|
|
72
|
+
graphic_work: misc
|
|
73
|
+
music: misc
|
|
74
|
+
performance: misc
|
|
75
|
+
patent: misc
|
|
76
|
+
archival: misc
|
|
77
|
+
social_media: misc
|
|
78
|
+
alert: misc
|
|
79
|
+
message: misc
|
|
80
|
+
conversation: misc
|
|
81
|
+
internal: misc
|
|
82
|
+
|
|
34
83
|
template:
|
|
35
|
-
book: "{{ creatornames }} ({{role}})
|
|
84
|
+
book: "{{ creatornames }} ({{role}}) $$$ {{labels['punct']['open-title']}}{{ title }}{{labels['punct']['close-title']}} [{{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}}$$$"
|
|
36
85
|
# TODO: omitted: author ids, subsidiary titles, subsidiary creators, rights metadata, distributor, item attributes, relationships
|
|
37
86
|
booklet: book
|
|
38
87
|
manual: book
|
|
39
88
|
proceedings: book
|
|
40
|
-
inbook: "{{ creatornames }} ({{role}})
|
|
89
|
+
inbook: "{{ creatornames }} ({{role}}) $$$ {{labels['punct']['open-secondary-title']}}{{ title }}{{labels['punct']['close-secondary-title']}} $$$ {{ labels['in'] | capitalize }}: {{ host_creatornames}} ({{ host_role}}) : {{labels['punct']['open-title']}}{{host_title}}{{labels['punct']['close-title']}} [{{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}}]$$$"
|
|
41
90
|
inproceedings: inbook
|
|
42
91
|
incollection: inbook
|
|
43
92
|
# TODO: omitted: author ids, additional info for component part, subsidiary titles of host resource, rights metadata, distributor, relationships
|
|
44
|
-
journal: "{{labels['
|
|
93
|
+
journal: "{{labels['punct']['open-title']}}{{ title}}{{labels['punct']['close-title']}} [{{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}}]$$$"
|
|
45
94
|
# TODO subsidiary titles, rights metadata, item attributes, relationships
|
|
46
|
-
article: "{{ creatornames }} ({{role}})
|
|
95
|
+
article: "{{ creatornames }} ({{role}}) $$$ {{labels['punct']['open-secondary-title']}}{{ title }}{{labels['punct']['close-secondary-title']}}$$$ {{ 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}}]$$$"
|
|
47
96
|
# TODO: omitted: author ids, subsidiary titles, rights metadata, distributor, item attributes, relationships; newspapers
|
|
48
|
-
software: "{{ creatornames }} ({{ role}})
|
|
97
|
+
software: "{{ creatornames }} ({{ role}}) $$$ {{labels['punct']['open-title']}}{{ title }}{{labels['punct']['close-title']}} $$$ {{ 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}}]$$$ "
|
|
49
98
|
# TODO: omitted: author ids, subsidiary titles, subsidiary creators, copyright, license, distributor, system requirements, relationships
|
|
50
99
|
electronic resource: software
|
|
51
|
-
standard: "{{ creatornames }} ({{ role}})
|
|
100
|
+
standard: "{{ creatornames }} ({{ role}}) $$$ {{ authoritative_identifier | join: '|' }}: {{labels['punct']['open-title']}}{{ title }}{{labels['punct']['close-title']}} $$$ {{ medium | capitalize }}$$$ {{ edition | capitalize_first }}$$$ {{ place }}: {{ publisher }}$$$ {{date}}$$$ {{size}}$$$ {{ extent }}$$$ {{ other_identifier | join: '$$$ ' }}$$$ {{ uri }}$$$ {{ labels['at'] | capitalize}}:_{{ access_location }}$$$ [{{ labels['viewed'] }}:_{{date_accessed}}]$$$"
|
|
52
101
|
# TODO: omitted: author ids, subsidiary titles, rights metadata, distributor, persistent identifier, item attributes, relationships
|
|
53
102
|
techreport: standard
|
|
54
|
-
dataset: "{{ creatornames }} ({{ role }})
|
|
103
|
+
dataset: "{{ creatornames }} ({{ role }}) $$$ {{labels['punct']['open-title']}}{{ title }}{{labels['punct']['close-title']}} $$$ {{ 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}}]$$$ "
|
|
55
104
|
# TODO: omitted: author ids, system requirements, host archive, copyright, license, data source, distributor, usage instructions, relationships, provenance
|
|
56
|
-
website: "{{ creatornames }} ({{ role }})
|
|
105
|
+
website: "{{ creatornames }} ({{ role }}) $$$ {{labels['punct']['open-title']}}{{ title }}{{labels['punct']['close-title']}} $$$ {{ 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}}]$$$ "
|
|
57
106
|
# TODO: omitted: author ids, page title, system requirements, subsidiary creator, rights metadata, distributor, persistent identifier, archive location, archive date and time, relationships
|
|
58
107
|
webresource: website
|
|
59
108
|
# TODO: component part
|
|
60
|
-
unpublished: "{{ creatornames }} ({{ role }})
|
|
109
|
+
unpublished: "{{ creatornames }} ({{ role }}) $$$ {{labels['punct']['open-title']}}{{ title }}{{labels['punct']['close-title']}} $$$ {{ medium | capitalize }}$$$ {{ date }}$$$ {{ labels['at'] | capitalize}}:_{{ access_location }}$$$ {{ authoritative_identifier | join: '$$$ ' }}$$$ {{ other_identifier | join: '$$$ ' }}$$$ {{ uri }}$$$ [{{ labels['viewed'] }}:_{{date_accessed}}]$$$"
|
|
61
110
|
# TODO: omitted: author ids, subsidiary titles, subsidiary creators, host archive, item attributes, relationships
|
|
62
111
|
presentation: unpublished
|
|
63
|
-
thesis: "{{ creatornames }} ({{ role }})
|
|
64
|
-
misc: "{{ creatornames }} ({{ role }})
|
|
112
|
+
thesis: "{{ creatornames }} ({{ role }}) $$$ {{labels['punct']['open-title']}}{{ title }}{{labels['punct']['close-title']}} $$$ {{ medium | capitalize }}$$$ {{ place }}: {{ publisher }}$$$ {{ date }}$$$ {{ labels['at'] | capitalize}}:_{{ access_location }}$$$ {{ authoritative_identifier | join: '$$$ ' }}$$$ {{ other_identifier | join: '$$$ ' }}$$$ {{ uri }}$$$ [{{ labels['viewed'] }}:_{{date_accessed}}]$$$"
|
|
113
|
+
misc: "{{ creatornames }} ({{ role }}) $$$ {{labels['punct']['open-title']}}{{ title }}{{labels['punct']['close-title']}} $$$ {{ date }}$$$ {{ uri }}$$$"
|
|
65
114
|
# following are # unsupported types:
|
|
66
115
|
map: misc
|
|
67
116
|
audiovisual: misc
|
|
@@ -13,16 +13,21 @@ module Relaton
|
|
|
13
13
|
class General
|
|
14
14
|
attr_reader :template, :journaltemplate, :seriestemplate, :nametemplate,
|
|
15
15
|
:authorcitetemplate, :extenttemplate, :sizetemplate,
|
|
16
|
-
:lang, :script, :i18n,
|
|
17
|
-
:edition, :
|
|
16
|
+
:citetemplate, :citeshorttemplate, :lang, :script, :i18n,
|
|
17
|
+
:edition, :date, :fieldsklass, :dateklass, :config
|
|
18
18
|
|
|
19
19
|
def initialize(opt = {})
|
|
20
|
-
|
|
20
|
+
@config = read_config
|
|
21
|
+
options = @config.merge(Utils::string_keys(opt))
|
|
21
22
|
@type = self.class.name.downcase.split("::").last
|
|
22
23
|
klass_initialize(options)
|
|
23
24
|
root_initalize(options)
|
|
24
25
|
render_initialize(options)
|
|
25
26
|
@parse ||= options["parse"]
|
|
27
|
+
init_misc
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def init_misc
|
|
26
31
|
@semaphore = Mutex.new
|
|
27
32
|
@urlcache = {}
|
|
28
33
|
@url_warned = {}
|
|
@@ -32,9 +37,11 @@ module Relaton
|
|
|
32
37
|
YAML.load_file(File.join(File.dirname(__FILE__), "config.yml"))
|
|
33
38
|
end
|
|
34
39
|
|
|
35
|
-
def klass_initialize(
|
|
40
|
+
def klass_initialize(options)
|
|
36
41
|
@nametemplateklass = Relaton::Render::Template::Name
|
|
37
42
|
@authorcitetemplateklass = Relaton::Render::Template::AuthorCite
|
|
43
|
+
@citetemplateklass = Relaton::Render::Template::Cite
|
|
44
|
+
@citeshorttemplateklass = Relaton::Render::Template::Cite
|
|
38
45
|
@seriestemplateklass = Relaton::Render::Template::Series
|
|
39
46
|
@extenttemplateklass = Relaton::Render::Template::Extent
|
|
40
47
|
@sizetemplateklass = Relaton::Render::Template::Size
|
|
@@ -42,6 +49,7 @@ module Relaton
|
|
|
42
49
|
@fieldsklass = Relaton::Render::Fields
|
|
43
50
|
@dateklass = Relaton::Render::Date
|
|
44
51
|
@parseklass = Relaton::Render::Parse
|
|
52
|
+
@i18nklass = options["i18nklass"] || Relaton::Render::I18n
|
|
45
53
|
end
|
|
46
54
|
|
|
47
55
|
def root_initalize(opt)
|
|
@@ -49,6 +57,7 @@ module Relaton
|
|
|
49
57
|
@parse = @parseklass.new(lang: @lang, script: @script, i18n: @i18n)
|
|
50
58
|
@nametemplate = @nametemplateklass
|
|
51
59
|
.new(template: opt["nametemplate"], i18n: @i18n)
|
|
60
|
+
@citetemplate, @citeshorttemplate = citerenderers(opt)
|
|
52
61
|
@authorcitetemplate = @authorcitetemplateklass
|
|
53
62
|
&.new(template: opt["authorcitetemplate"], i18n: @i18n)
|
|
54
63
|
@seriestemplate = @seriestemplateklass
|
|
@@ -63,12 +72,17 @@ module Relaton
|
|
|
63
72
|
@lang = opt["language"]
|
|
64
73
|
@script = opt["script"]
|
|
65
74
|
@locale = opt["locale"]
|
|
66
|
-
|
|
75
|
+
default_i18n = opt["i18n"] ||
|
|
67
76
|
i18n_klass(language: @lang, script: @script, locale: @locale,
|
|
68
77
|
i18nhash: opt["i18nhash"])
|
|
69
|
-
@
|
|
70
|
-
|
|
71
|
-
|
|
78
|
+
@i18n = @i18nklass.new(opt.merge({"i18n" => default_i18n}))
|
|
79
|
+
i18n_default_strs(opt)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# avoid using these, they are document-set not citation-specific
|
|
83
|
+
def i18n_default_strs(opt)
|
|
84
|
+
@edition = opt["edition"] || @i18n.select(nil).edition
|
|
85
|
+
@date = opt["date"] || @i18n.select(nil).get["date_formats"] ||
|
|
72
86
|
{ "month_year" => "yMMMM", "day_month_year" => "to_long_s",
|
|
73
87
|
"date_time" => "to_long_s" }
|
|
74
88
|
end
|
|
@@ -86,9 +100,9 @@ module Relaton
|
|
|
86
100
|
def renderers(opt)
|
|
87
101
|
template_hash_fill(opt["template"]).each_with_object({}) do |(k, v), m|
|
|
88
102
|
@type == "general" || @type == k or next
|
|
89
|
-
m[k] =
|
|
90
|
-
.new(template: v, parse: @parse,
|
|
91
|
-
language: @lang, script: @script)
|
|
103
|
+
m[k] = self.class.subclass(k)
|
|
104
|
+
.new(template: v, parse: @parse, i18n_multi: @i18n.config,
|
|
105
|
+
language: @lang, script: @script, i18nklass: @i18nklass)
|
|
92
106
|
end
|
|
93
107
|
end
|
|
94
108
|
|
|
@@ -102,6 +116,16 @@ module Relaton
|
|
|
102
116
|
.new(template: template_hash_fill(opt["sizetemplate"]), i18n: @i18n)
|
|
103
117
|
end
|
|
104
118
|
|
|
119
|
+
def citerenderers(opt)
|
|
120
|
+
s = opt["citetemplate"]["short"]
|
|
121
|
+
r = opt["citetemplate"].reject { |k, _| k == "short" }
|
|
122
|
+
short = @citetemplateklass
|
|
123
|
+
&.new(template: template_hash_fill(s), i18n: @i18n)
|
|
124
|
+
ret = @citetemplateklass
|
|
125
|
+
&.new(template: r, i18n: @i18n)
|
|
126
|
+
[ret, short]
|
|
127
|
+
end
|
|
128
|
+
|
|
105
129
|
def default_template
|
|
106
130
|
"{{creatornames}}. {{title}}. {{date}}."
|
|
107
131
|
end
|
|
@@ -111,19 +135,19 @@ module Relaton
|
|
|
111
135
|
i18nhash: i18nhash)
|
|
112
136
|
end
|
|
113
137
|
|
|
114
|
-
def render(bib, embedded: false)
|
|
115
|
-
require "debug"; binding.b
|
|
138
|
+
def render(bib, embedded: false, terminator: true)
|
|
116
139
|
bib = xml2relaton(bib)
|
|
117
140
|
f = bib.formattedref and
|
|
118
141
|
return embedded ? f.content : fmtref(f.content)
|
|
119
|
-
ret = render1(bib) or return nil
|
|
142
|
+
ret = render1(bib, terminator) or return nil
|
|
120
143
|
embedded and return ret
|
|
121
144
|
fmtref(ret)
|
|
122
145
|
end
|
|
123
146
|
|
|
124
147
|
def xml2relaton(bib)
|
|
125
148
|
bib.is_a?(Nokogiri::XML::Element) and
|
|
126
|
-
bib = bib.to_xml
|
|
149
|
+
bib = bib.to_xml(encoding: "UTF-8", indent: 0,
|
|
150
|
+
save_with: Nokogiri::XML::Node::SaveOptions::AS_XML)
|
|
127
151
|
bib.is_a?(String) && Nokogiri::XML(bib).errors.empty? and
|
|
128
152
|
bib = RelatonBib::XMLParser.from_xml(bib) or bib
|
|
129
153
|
end
|
|
@@ -145,21 +169,33 @@ module Relaton
|
|
|
145
169
|
text.gsub(/<esc>/i, "<esc>").gsub(/<\/esc>/i, "</esc>")
|
|
146
170
|
end
|
|
147
171
|
|
|
148
|
-
def render1(doc)
|
|
172
|
+
def render1(doc, terminator)
|
|
173
|
+
obj, str = render_single_bibitem(doc)
|
|
174
|
+
out = [str] + also_pub_as(doc)
|
|
175
|
+
ret1 = out.join(@i18n.select(obj).get["punct"]["biblio-field-delimiter"] || ". ")
|
|
176
|
+
ret = @i18n.select(obj).l10n(esc_cleanup(ret1)
|
|
177
|
+
.gsub(".</esc>.", ".</esc>").gsub(".. ", ". "))
|
|
178
|
+
final = @i18n.select(obj).get["punct"]["biblio-terminator"] || "."
|
|
179
|
+
terminator && !ret.end_with?(final) && !ret.empty? and ret += final
|
|
180
|
+
ret
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def also_pub_as(doc)
|
|
149
184
|
r = doc.relation.select { |x| x.type == "hasRepresentation" }
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
185
|
+
r.map do |x|
|
|
186
|
+
_, out = render_single_bibitem(x.bibitem)
|
|
187
|
+
@i18n.select(nil).also_pub_as + out
|
|
188
|
+
end
|
|
154
189
|
end
|
|
155
190
|
|
|
156
191
|
def render_single_bibitem(doc)
|
|
157
192
|
data_liquid, r = parse(doc)
|
|
158
|
-
liquid(data_liquid, r)
|
|
193
|
+
out = liquid(data_liquid, r)
|
|
194
|
+
[data_liquid, out]
|
|
159
195
|
end
|
|
160
196
|
|
|
161
197
|
def liquid(data_liquid, renderer)
|
|
162
|
-
valid_parse(renderer.render(data_liquid))
|
|
198
|
+
valid_parse(renderer.render(data_liquid, data_liquid))
|
|
163
199
|
end
|
|
164
200
|
|
|
165
201
|
def parse(doc)
|
|
@@ -173,7 +209,7 @@ module Relaton
|
|
|
173
209
|
end
|
|
174
210
|
|
|
175
211
|
def valid_parse(ret)
|
|
176
|
-
@i18n.get["no_date"] == ret and return nil
|
|
212
|
+
@i18n.select(nil).get["no_date"] == ret and return nil
|
|
177
213
|
ret
|
|
178
214
|
end
|
|
179
215
|
|
|
@@ -181,10 +217,15 @@ module Relaton
|
|
|
181
217
|
# enhance_data is skipped here, and is done in batch inside Citations
|
|
182
218
|
def render_all(bib, type: "author-date")
|
|
183
219
|
bib = sanitise_citations_input(bib) or return
|
|
184
|
-
Citations.new(type: type, renderer:
|
|
220
|
+
Citations.new(type: type, renderer: citation_renderers,
|
|
221
|
+
i18n: @i18n, lang: @lang, script: @script)
|
|
185
222
|
.render(citations1(bib))
|
|
186
223
|
end
|
|
187
224
|
|
|
225
|
+
def citation_renderers
|
|
226
|
+
{ default: self }
|
|
227
|
+
end
|
|
228
|
+
|
|
188
229
|
def sanitise_citations_input(bib)
|
|
189
230
|
bib.is_a?(Array) and return bib
|
|
190
231
|
bib.is_a?(String) and return sanitise_citations_input_string(bib)
|
|
@@ -203,7 +244,7 @@ module Relaton
|
|
|
203
244
|
data_liquid = @fieldsklass.new(renderer: self)
|
|
204
245
|
.compound_fields_format(@parse.extract(b))
|
|
205
246
|
m << { author: data_liquid[:authorcite], date: data_liquid[:date],
|
|
206
|
-
ord: i, id: b.id,
|
|
247
|
+
ord: i, id: b.id, data: data_liquid, type: b.type }
|
|
207
248
|
end
|
|
208
249
|
end
|
|
209
250
|
|
|
@@ -17,7 +17,10 @@ module Relaton
|
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def self.subclass(type)
|
|
20
|
-
|
|
20
|
+
# Always look up from the root General class, not from subclasses
|
|
21
|
+
base = self
|
|
22
|
+
base = base.superclass while base.superclass != Object && base.superclass.name =~ /Relaton::Render/
|
|
23
|
+
base.instance_variable_get(:@descendants)&.[](type)
|
|
21
24
|
end
|
|
22
25
|
end
|
|
23
26
|
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Relaton
|
|
2
|
+
module Render
|
|
3
|
+
class I18n
|
|
4
|
+
# @i18n is a hash of IsoDoc::I18n objects, selected from according to
|
|
5
|
+
# attributes of the parsed Relaton object
|
|
6
|
+
def initialize(opt)
|
|
7
|
+
if opt["i18n_multi"]
|
|
8
|
+
@i18n = opt["i18n_multi"]
|
|
9
|
+
elsif opt["i18n"]
|
|
10
|
+
@i18n = { "" => opt["i18n"] }
|
|
11
|
+
else
|
|
12
|
+
raise error "Bad configuration, Relaton::Render::I18n"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# obj is the biblio hash, extracted by Relaton::Render::Fields
|
|
17
|
+
# There must always be a default selection, for obj = nil,
|
|
18
|
+
# being the document language setting. If select is applied on obj,
|
|
19
|
+
# the i18n selected is appropriate to the citation specifically,
|
|
20
|
+
# and potentially to the field specificaly
|
|
21
|
+
def select(obj)
|
|
22
|
+
if obj.nil? then select_default
|
|
23
|
+
else select_obj(obj)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def select_default
|
|
28
|
+
@i18n[""]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def select_obj(_obj)
|
|
32
|
+
@i18n[""]
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def config
|
|
36
|
+
@i18n
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -15,9 +15,11 @@ module Relaton
|
|
|
15
15
|
|
|
16
16
|
def extract(doc)
|
|
17
17
|
host = host(doc)
|
|
18
|
-
simple_xml2hash(doc).merge(simple_or_host_xml2hash(doc, host))
|
|
18
|
+
ret = simple_xml2hash(doc).merge(simple_or_host_xml2hash(doc, host))
|
|
19
19
|
.merge(host_xml2hash(host))
|
|
20
20
|
.merge(series_xml2hash(doc, host))
|
|
21
|
+
ret
|
|
22
|
+
#i18n(ret)
|
|
21
23
|
end
|
|
22
24
|
|
|
23
25
|
def simple_xml2hash(doc)
|
|
@@ -25,8 +27,9 @@ module Relaton
|
|
|
25
27
|
{ type: type(doc), title: title(doc), extent_raw: extent(doc),
|
|
26
28
|
size_raw: size(doc), uri_raw: uri(doc), doi: doi(doc),
|
|
27
29
|
authoritative_identifier: authoritative_identifier(doc),
|
|
28
|
-
|
|
29
|
-
|
|
30
|
+
other_identifier_raw: other_identifier(doc), biblio_tag: biblio_tag(doc),
|
|
31
|
+
status_raw: status(doc), creators: creators, role_raw: role,
|
|
32
|
+
language: language(doc), script: script(doc), locale: locale(doc) }
|
|
30
33
|
end
|
|
31
34
|
|
|
32
35
|
def simple_or_host_xml2hash(doc, host)
|
|
@@ -54,17 +57,29 @@ module Relaton
|
|
|
54
57
|
end
|
|
55
58
|
|
|
56
59
|
def series_xml2hash1(series, doc)
|
|
57
|
-
return {}
|
|
60
|
+
series or return {}
|
|
61
|
+
ret = { series_formatted: series_formatted(series, doc),
|
|
62
|
+
series_title: series_title(series, doc),
|
|
63
|
+
series_abbr: series_abbr(series, doc),
|
|
64
|
+
series_run: series_run(series, doc),
|
|
65
|
+
series_num: series_num(series, doc),
|
|
66
|
+
series_partnumber: series_partnumber(series, doc),
|
|
67
|
+
series_place: series_place(series, doc),
|
|
68
|
+
series_org: series_org(series, doc),
|
|
69
|
+
series_dates: series_dates(series, doc) }
|
|
70
|
+
ret.each do |k, v|
|
|
71
|
+
%i(series_num series_dates).include?(k) and next
|
|
72
|
+
ret[k] = esc(v)
|
|
73
|
+
end
|
|
74
|
+
ret
|
|
75
|
+
end
|
|
58
76
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
series_place: series_place(series, doc),
|
|
66
|
-
series_org: series_org(series, doc),
|
|
67
|
-
series_dates: series_dates(series, doc) }
|
|
77
|
+
#KILL
|
|
78
|
+
def other_identifier_i18n(hash)
|
|
79
|
+
#ret << "#{type}: #{esc id.id}"
|
|
80
|
+
hash[:other_identifier]&.map! do |i|
|
|
81
|
+
i.include?("<esc>") ? @i18n.select(hash).l10n(i) : i
|
|
82
|
+
end
|
|
68
83
|
end
|
|
69
84
|
|
|
70
85
|
private
|
|
@@ -72,6 +87,19 @@ module Relaton
|
|
|
72
87
|
def blank?(text)
|
|
73
88
|
text.nil? || text.empty?
|
|
74
89
|
end
|
|
90
|
+
|
|
91
|
+
def esc(text)
|
|
92
|
+
blank?(text) and return text
|
|
93
|
+
"<esc>#{text}</esc>"
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def wrap_in_esc(obj)
|
|
97
|
+
case obj
|
|
98
|
+
when String then esc(obj)
|
|
99
|
+
when Array then obj.map { |e| wrap_in_esc(e) }
|
|
100
|
+
else obj
|
|
101
|
+
end
|
|
102
|
+
end
|
|
75
103
|
end
|
|
76
104
|
end
|
|
77
105
|
end
|
|
@@ -4,8 +4,10 @@ module Relaton
|
|
|
4
4
|
def content(node)
|
|
5
5
|
node.nil? and return node
|
|
6
6
|
node.content.is_a?(Array) and return node.content.map { |x| content(x) }
|
|
7
|
-
node.content.strip
|
|
7
|
+
ret = node.content.strip
|
|
8
8
|
.gsub("</title>", "").gsub("<title>", "")
|
|
9
|
+
# safeguard against indented XML
|
|
10
|
+
ret.gsub(/>\n\s*</, "><").gsub(/\n\s*/, " ")
|
|
9
11
|
# node.children.map { |n| n.text? ? n.content : n.to_xml }.join
|
|
10
12
|
# node.text? ? node.content.strip : node.to_xml.strip
|
|
11
13
|
end
|
|
@@ -32,14 +34,6 @@ module Relaton
|
|
|
32
34
|
wrap_in_esc(Array(initials))]
|
|
33
35
|
end
|
|
34
36
|
|
|
35
|
-
def wrap_in_esc(obj)
|
|
36
|
-
case obj
|
|
37
|
-
when String then "<esc>#{obj}</esc>"
|
|
38
|
-
when Array then obj.map { |e| wrap_in_esc(e) }
|
|
39
|
-
else obj
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
37
|
def extract_initials(person)
|
|
44
38
|
initials = content(person.name.initials)&.sub(/(.)\.?$/, "\\1.")
|
|
45
39
|
&.split /(?<=\.) /
|
|
@@ -50,7 +44,7 @@ module Relaton
|
|
|
50
44
|
|
|
51
45
|
def forenames_parse(person)
|
|
52
46
|
person.name.forename.map do |x|
|
|
53
|
-
x.content.empty? ? "
|
|
47
|
+
x.content.empty? ? esc("#{x.initial}.") : content(x)
|
|
54
48
|
end
|
|
55
49
|
end
|
|
56
50
|
|
|
@@ -12,7 +12,8 @@ module Relaton
|
|
|
12
12
|
t.empty? and t = doc.title
|
|
13
13
|
t1 = t.select { |x| x.type == "main" }
|
|
14
14
|
t1.empty? and t1 = t
|
|
15
|
-
|
|
15
|
+
t1.first or return
|
|
16
|
+
esc(content(t1.first.title))
|
|
16
17
|
end
|
|
17
18
|
|
|
18
19
|
def medium(doc, host)
|
|
@@ -31,7 +32,9 @@ module Relaton
|
|
|
31
32
|
end
|
|
32
33
|
|
|
33
34
|
def edition(doc, host)
|
|
34
|
-
content(doc.edition || host&.edition)
|
|
35
|
+
ret = content(doc.edition || host&.edition)
|
|
36
|
+
ret &&= esc(ret)
|
|
37
|
+
ret
|
|
35
38
|
end
|
|
36
39
|
|
|
37
40
|
def edition_num(doc, host)
|
|
@@ -51,7 +54,8 @@ module Relaton
|
|
|
51
54
|
n = place.country
|
|
52
55
|
c.nil? && r.empty? && n.empty? and return place.name
|
|
53
56
|
ret = [c] + r.map(&:name) + n.map(&:name)
|
|
54
|
-
|
|
57
|
+
ret.compact
|
|
58
|
+
#@i18n.l10n(ret.compact.join(", "))
|
|
55
59
|
end
|
|
56
60
|
|
|
57
61
|
def series(doc)
|
|
@@ -121,6 +125,19 @@ module Relaton
|
|
|
121
125
|
"book"
|
|
122
126
|
end
|
|
123
127
|
|
|
128
|
+
def language(doc)
|
|
129
|
+
doc.language&.first || @lang
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def script(doc)
|
|
133
|
+
doc.script&.first || @script
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def locale(doc)
|
|
137
|
+
# TODO not yet implemented in relaton-bib
|
|
138
|
+
# doc.locale&.first
|
|
139
|
+
end
|
|
140
|
+
|
|
124
141
|
def extent1(localities)
|
|
125
142
|
localities.each_with_object({}) do |l, ret|
|
|
126
143
|
ret[(l.type || "page").to_sym] = {
|
|
@@ -168,7 +185,7 @@ module Relaton
|
|
|
168
185
|
|
|
169
186
|
def status(doc)
|
|
170
187
|
v = doc&.status&.stage&.value
|
|
171
|
-
|
|
188
|
+
#@i18n.get.dig("stage", v) || v
|
|
172
189
|
end
|
|
173
190
|
end
|
|
174
191
|
end
|
|
@@ -49,7 +49,7 @@ module Relaton
|
|
|
49
49
|
out.empty? or break
|
|
50
50
|
end
|
|
51
51
|
# prevent l10n of identifier contents
|
|
52
|
-
out.map(&:id).map { |i|
|
|
52
|
+
out.map(&:id).map { |i| esc(i.strip) }
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
def authoritative_identifier_select(idents)
|
|
@@ -65,14 +65,14 @@ module Relaton
|
|
|
65
65
|
end
|
|
66
66
|
|
|
67
67
|
def authoritative_identifier_exclude
|
|
68
|
-
%w(METANORMA METANORMA-ORDINAL TITLE) + other_identifier_include
|
|
68
|
+
%w(METANORMA METANORMA-ORDINAL TITLE URN ISO-REFERENCE) + other_identifier_include
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
def other_identifier(doc)
|
|
72
72
|
doc.docidentifier.each_with_object([]) do |id, ret|
|
|
73
73
|
type = id_type_norm(id)
|
|
74
74
|
other_identifier_include.include? type or next
|
|
75
|
-
ret <<
|
|
75
|
+
ret << [type, id.id]
|
|
76
76
|
end
|
|
77
77
|
end
|
|
78
78
|
|
|
@@ -86,7 +86,7 @@ module Relaton
|
|
|
86
86
|
type.casecmp("doi").zero? or next
|
|
87
87
|
ret << id.id
|
|
88
88
|
end
|
|
89
|
-
out.empty? ? nil : out.map { |i|
|
|
89
|
+
out.empty? ? nil : out.map { |i| esc(i.strip) }
|
|
90
90
|
end
|
|
91
91
|
|
|
92
92
|
def id_type_norm(id)
|
|
@@ -95,6 +95,13 @@ module Relaton
|
|
|
95
95
|
m[1].upcase
|
|
96
96
|
end
|
|
97
97
|
|
|
98
|
+
def biblio_tag(doc)
|
|
99
|
+
ret = doc.docidentifier.detect do |id|
|
|
100
|
+
id.scope&.downcase == "biblio-tag"
|
|
101
|
+
end
|
|
102
|
+
ret&.id
|
|
103
|
+
end
|
|
104
|
+
|
|
98
105
|
def uri(doc)
|
|
99
106
|
uri = nil
|
|
100
107
|
%w(citation uri src).each do |t|
|