relaton-render 0.1.0 → 3.0.0.pre.alpha.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/rake.yml +4 -1
- data/.github/workflows/release.yml +24 -0
- data/.gitignore +14 -0
- data/.rubocop.yml +2 -2
- data/Gemfile +17 -1
- data/README.adoc +61 -197
- data/docs/citation-style-pack.adoc +367 -0
- data/lib/relaton/render/general.rb +305 -0
- data/lib/relaton/render/iso690/element.rb +153 -0
- data/lib/relaton/render/iso690/elements/access.rb +44 -0
- data/lib/relaton/render/iso690/elements/authorizer.rb +30 -0
- data/lib/relaton/render/iso690/elements/citeid.rb +39 -0
- data/lib/relaton/render/iso690/elements/component_part.rb +99 -0
- data/lib/relaton/render/iso690/elements/creator.rb +258 -0
- data/lib/relaton/render/iso690/elements/edition.rb +92 -0
- data/lib/relaton/render/iso690/elements/extent.rb +71 -0
- data/lib/relaton/render/iso690/elements/identifier.rb +46 -0
- data/lib/relaton/render/iso690/elements/location.rb +73 -0
- data/lib/relaton/render/iso690/elements/medium.rb +32 -0
- data/lib/relaton/render/iso690/elements/numeration.rb +26 -0
- data/lib/relaton/render/iso690/elements/production.rb +92 -0
- data/lib/relaton/render/iso690/elements/pub_date.rb +56 -0
- data/lib/relaton/render/iso690/elements/series.rb +66 -0
- data/lib/relaton/render/iso690/elements/size.rb +41 -0
- data/lib/relaton/render/iso690/elements/status.rb +30 -0
- data/lib/relaton/render/iso690/elements/stddoc.rb +40 -0
- data/lib/relaton/render/iso690/elements/title.rb +56 -0
- data/lib/relaton/render/iso690/elements/updated.rb +38 -0
- data/lib/relaton/render/iso690/elements.rb +67 -0
- data/lib/relaton/render/iso690/fields.rb +142 -0
- data/lib/relaton/render/iso690/i18n/en.yml +47 -0
- data/lib/relaton/render/iso690/i18n/fr.yml +14 -0
- data/lib/relaton/render/iso690/i18n/ja.yml +38 -0
- data/lib/relaton/render/iso690/i18n.rb +83 -0
- data/lib/relaton/render/iso690/identifier_kinds.rb +29 -0
- data/lib/relaton/render/iso690/index_renderer.rb +57 -0
- data/lib/relaton/render/iso690/kinds.rb +53 -0
- data/lib/relaton/render/iso690/renderer.rb +148 -0
- data/lib/relaton/render/iso690/style/locale.rb +53 -0
- data/lib/relaton/render/iso690/style/name_form.rb +87 -0
- data/lib/relaton/render/iso690/style/scheme.rb +33 -0
- data/lib/relaton/render/iso690/style/sort_rule.rb +25 -0
- data/lib/relaton/render/iso690/style/template_map.rb +40 -0
- data/lib/relaton/render/iso690/style/type_template.rb +37 -0
- data/lib/relaton/render/iso690/style.rb +119 -0
- data/lib/relaton/render/iso690/styles/author-date.yml +31 -0
- data/lib/relaton/render/iso690/template.rb +248 -0
- data/lib/relaton/render/iso690.rb +26 -0
- data/lib/relaton/render/version.rb +5 -0
- data/lib/relaton-render.rb +12 -5
- data/relaton-render.gemspec +7 -11
- metadata +57 -86
- data/lib/isodoc/i18n.rb +0 -24
- data/lib/isodoc-yaml/i18n-ar.yaml +0 -2
- data/lib/isodoc-yaml/i18n-de.yaml +0 -2
- data/lib/isodoc-yaml/i18n-en.yaml +0 -22
- data/lib/isodoc-yaml/i18n-es.yaml +0 -2
- data/lib/isodoc-yaml/i18n-fr.yaml +0 -2
- data/lib/isodoc-yaml/i18n-ru.yaml +0 -23
- data/lib/isodoc-yaml/i18n-zh-Hans.yaml +0 -2
- 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/config.yml +0 -67
- data/lib/relaton/render.rb +0 -123
- data/lib/relaton/render_classes.rb +0 -126
- data/lib/relaton/render_fields.rb +0 -151
- data/lib/relaton/version.rb +0 -5
- data/lib/template/template.rb +0 -152
- data/lib/utils/utils.rb +0 -27
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
module Relaton
|
|
2
|
-
module Render
|
|
3
|
-
class Fields
|
|
4
|
-
def initialize(options)
|
|
5
|
-
@r = options[:renderer]
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
def compound_fields_format(hash)
|
|
9
|
-
name_fields_format(hash)
|
|
10
|
-
role_fields_format(hash)
|
|
11
|
-
date_fields_format(hash)
|
|
12
|
-
misc_fields_format(hash)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def name_fields_format(hash)
|
|
16
|
-
hash[:creatornames] = nameformat(hash[:creators])
|
|
17
|
-
hash[:host_creatornames] = nameformat(hash[:host_creators])
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def role_fields_format(hash)
|
|
21
|
-
hash[:role] = role_inflect(hash[:creators], hash[:role_raw])
|
|
22
|
-
hash[:host_role] =
|
|
23
|
-
role_inflect(hash[:host_creators], hash[:host_role_raw])
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def misc_fields_format(hash)
|
|
27
|
-
hash[:series] = seriesformat(hash)
|
|
28
|
-
hash[:edition] = editionformat(hash[:edition_raw])
|
|
29
|
-
hash[:extent] = extentformat(hash[:extent_raw], hash)
|
|
30
|
-
hash
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def date_fields_format(hash)
|
|
34
|
-
hash[:date] = dateformat(hash[:date], hash)
|
|
35
|
-
hash[:date_updated] = dateformat(hash[:date_updated], hash)
|
|
36
|
-
hash[:date_accessed] = dateformat(hash[:date_accessed], hash)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def seriesformat(hash)
|
|
40
|
-
parts = %i(series_title series_abbr series_num series_partnumber
|
|
41
|
-
series_run)
|
|
42
|
-
series_out = parts.each_with_object({}) do |i, m|
|
|
43
|
-
m[i] = hash[i]
|
|
44
|
-
end
|
|
45
|
-
t = hash[:type] == "article" ? @r.journaltemplate : @r.seriestemplate
|
|
46
|
-
t.render(series_out)
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def nameformat(names)
|
|
50
|
-
return names if names.nil?
|
|
51
|
-
|
|
52
|
-
parts = %i(surname initials given middle)
|
|
53
|
-
names_out = names.each_with_object({}) do |n, m|
|
|
54
|
-
parts.each do |i|
|
|
55
|
-
m[i] ||= []
|
|
56
|
-
m[i] << n[i]
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
@r.nametemplate.render(names_out)
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def role_inflect(contribs, role)
|
|
63
|
-
return nil if role.nil? || contribs.size.zero?
|
|
64
|
-
|
|
65
|
-
number = contribs.size > 1 ? "pl" : "sg"
|
|
66
|
-
@r.i18n.get[role][number] || role
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def editionformat(edn)
|
|
70
|
-
return edn unless /^\d+$/.match?(edn)
|
|
71
|
-
|
|
72
|
-
num = edn.to_i.localize(@r.lang.to_sym)
|
|
73
|
-
.to_rbnf_s(*@r.edition_number)
|
|
74
|
-
@r.edition.sub(/%/, num)
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
def extentformat(extent, hash)
|
|
78
|
-
extent.map do |e|
|
|
79
|
-
extent_out = e.merge(type: hash[:type],
|
|
80
|
-
host_title: hash[:host_title])
|
|
81
|
-
.transform_values do |v|
|
|
82
|
-
v.is_a?(Hash) ? range(v) : v
|
|
83
|
-
end
|
|
84
|
-
@r.extenttemplate.render(extent_out.merge(orig: e))
|
|
85
|
-
end.join("; ")
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def range(hash)
|
|
89
|
-
if hash[:on] then hash[:on]
|
|
90
|
-
elsif hash.has_key?(:from) && hash[:from].nil? then nil
|
|
91
|
-
elsif hash[:from]
|
|
92
|
-
hash[:to] ? "#{hash[:from]}–#{hash[:to]}" : hash[:from]
|
|
93
|
-
else hash
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def date_range(hash)
|
|
98
|
-
if hash[:from]
|
|
99
|
-
"#{hash[:from]}–#{hash[:to]}"
|
|
100
|
-
else range(hash)
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
def dateformat(date, hash)
|
|
105
|
-
return nil if date.nil?
|
|
106
|
-
|
|
107
|
-
%i(from to on).each do |k|
|
|
108
|
-
date[k] = daterender(date[k], hash)
|
|
109
|
-
end
|
|
110
|
-
date_range(date)
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
def daterender(date, _hash)
|
|
114
|
-
return date if date.nil? || /^\d+$/.match?(date)
|
|
115
|
-
|
|
116
|
-
daterender1(date, dategranularity(date), hash)
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
def daterender1(date, format, _hash)
|
|
120
|
-
datef = dateparse(date, format, @r.lang.to_sym)
|
|
121
|
-
case @r.date[format]
|
|
122
|
-
when "to_full_s", "to_long_s", "to_medium_s", "to_short_s"
|
|
123
|
-
datef.send @r.date[format]
|
|
124
|
-
else
|
|
125
|
-
datef.to_additional_s(@r.date[format])
|
|
126
|
-
end
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
private
|
|
130
|
-
|
|
131
|
-
def dategranularity(date)
|
|
132
|
-
case date
|
|
133
|
-
when /^\d+-\d+$/ then "month_year"
|
|
134
|
-
when /^\d+-\d+-\d+$/ then "day_month_year"
|
|
135
|
-
else "date_time"
|
|
136
|
-
end
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
def dateparse(date, format, lang)
|
|
140
|
-
case format
|
|
141
|
-
when "date_time" then DateTime.parse(date)
|
|
142
|
-
.localize(lang, timezone: "Zulu")
|
|
143
|
-
when "day_month_year" then DateTime.parse(date)
|
|
144
|
-
.localize(lang, timezone: "Zulu").to_date
|
|
145
|
-
when "month_year" then Date.parse(date)
|
|
146
|
-
.localize(lang, timezone: "Zulu").to_date
|
|
147
|
-
end
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
end
|
|
151
|
-
end
|
data/lib/relaton/version.rb
DELETED
data/lib/template/template.rb
DELETED
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
require_relative "../utils/utils"
|
|
2
|
-
|
|
3
|
-
module Relaton
|
|
4
|
-
module Render
|
|
5
|
-
class Iso690Template
|
|
6
|
-
def initialize(opt = {})
|
|
7
|
-
opt = Utils::sym_keys(opt)
|
|
8
|
-
@i18n = opt[:i18n]
|
|
9
|
-
@template_raw = opt[:template].dup
|
|
10
|
-
@template =
|
|
11
|
-
case opt[:template]
|
|
12
|
-
when Hash
|
|
13
|
-
opt[:template].transform_values { |x| template_process(x) }
|
|
14
|
-
when Array then opt[:template].map { |x| template_process(x) }
|
|
15
|
-
else { default: template_process(opt[:template]) }
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
# denote start and end of field,
|
|
20
|
-
# so that we can detect empty fields in postprocessing
|
|
21
|
-
FIELD_DELIM = "\u0018".freeze
|
|
22
|
-
|
|
23
|
-
# use tab internally for non-spacing delimiter
|
|
24
|
-
NON_SPACING_DELIM = "\t".freeze
|
|
25
|
-
|
|
26
|
-
def template_process(template)
|
|
27
|
-
t = template.gsub(/\{\{/, "#{FIELD_DELIM}{{")
|
|
28
|
-
.gsub(/\}\}/, "}}#{FIELD_DELIM}")
|
|
29
|
-
.gsub(/\t/, " ")
|
|
30
|
-
t1 = t.split(/(\{\{.+?\}\})/).map do |n|
|
|
31
|
-
n.include?("{{") ? n : n.gsub(/(?<!\\)\|/, "\t")
|
|
32
|
-
end.join
|
|
33
|
-
Liquid::Template.parse(t1)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def render(hash)
|
|
37
|
-
template_clean(template_select(hash)
|
|
38
|
-
.render(liquid_hash(hash.merge("labels" => @i18n.get))))
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def template_select(_hash)
|
|
42
|
-
@template[:default]
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# use tab internally for non-spacing delimiter
|
|
46
|
-
def template_clean(str)
|
|
47
|
-
str = str.gsub(/\S*#{FIELD_DELIM}#{FIELD_DELIM}\S*/o, "")
|
|
48
|
-
.gsub(/#{FIELD_DELIM}/o, "")
|
|
49
|
-
.gsub(/_/, " ")
|
|
50
|
-
.gsub(/([,:;]\s*)+([,:;](\s|$))/, "\\2")
|
|
51
|
-
.gsub(/([,.:;]\s*)+([.](\s|$))/, "\\2")
|
|
52
|
-
.gsub(/(:\s+)(&\s)/, "\\2")
|
|
53
|
-
.gsub(/\s+([,.:;])/, "\\1")
|
|
54
|
-
.gsub(/#{NON_SPACING_DELIM}/o, "").gsub(/\s+/, " ")
|
|
55
|
-
str.strip
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def liquid_hash(hash)
|
|
59
|
-
case hash
|
|
60
|
-
when Hash
|
|
61
|
-
hash.map { |k, v| [k.to_s, liquid_hash(v)] }.to_h
|
|
62
|
-
when Array
|
|
63
|
-
hash.map { |v| liquid_hash(v) }
|
|
64
|
-
when String
|
|
65
|
-
hash.empty? ? nil : hash
|
|
66
|
-
else hash
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
class Iso690SeriesTemplate < Iso690Template
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
class Iso690ExtentTemplate < Iso690Template
|
|
75
|
-
def template_select(hash)
|
|
76
|
-
t = @template_raw[hash[:type].to_sym]
|
|
77
|
-
hash.each do |k, _v|
|
|
78
|
-
next unless hash[:orig][k].is_a?(Hash)
|
|
79
|
-
|
|
80
|
-
num = number(hash[:type], hash[:orig][k])
|
|
81
|
-
t = t.gsub(/labels\[['"]extent['"]\]\[['"]#{k}['"]\]/,
|
|
82
|
-
"\\0['#{num}']")
|
|
83
|
-
end
|
|
84
|
-
t = t.gsub(/labels\[['"]extent['"]\]\[['"][^\]'"]+['"]\](?!\[)/,
|
|
85
|
-
"\\0['sg']")
|
|
86
|
-
template_process(t)
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def number(type, value)
|
|
90
|
-
return "pl" if value[:to]
|
|
91
|
-
return "sg" if %w(article incollection inproceedings inbook)
|
|
92
|
-
.include?(type) || value[:host_title]
|
|
93
|
-
|
|
94
|
-
value[:from] == "1" ? "sg" : "pl"
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
class Iso690NameTemplate < Iso690Template
|
|
99
|
-
def initialize(opt = {})
|
|
100
|
-
@etal_count = opt[:template]["etal_count"]
|
|
101
|
-
opt[:template].delete("etal_count")
|
|
102
|
-
super
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
def template_select(names)
|
|
106
|
-
case names[:surname].size
|
|
107
|
-
when 1 then @template[:one]
|
|
108
|
-
when 2 then @template[:two]
|
|
109
|
-
when 3 then @template[:more]
|
|
110
|
-
else
|
|
111
|
-
if @etal_count && names.size >= @etal_count
|
|
112
|
-
@template[:etal]
|
|
113
|
-
else expand_nametemplate(@template_raw[:more], names.size)
|
|
114
|
-
end
|
|
115
|
-
end
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
# assumes that template contains, consecutively and not interleaved,
|
|
119
|
-
# ...[0], ...[1], ...[2]
|
|
120
|
-
def expand_nametemplate(template, size)
|
|
121
|
-
t = nametemplate_split(template)
|
|
122
|
-
mid = (1..size - 1).each_with_object([]) do |i, m|
|
|
123
|
-
m << t[1].gsub(/\[1\]/, "[#{i}]")
|
|
124
|
-
end
|
|
125
|
-
template_process(t[0] + mid.join + t[2].gsub(/\[2\]/, "[#{size}]"))
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
def nametemplate_split(template)
|
|
129
|
-
curr = 0
|
|
130
|
-
prec = ""
|
|
131
|
-
t = template.split(/(\{\{.+?\}\})/)
|
|
132
|
-
.each_with_object(["", "", ""]) do |n, m|
|
|
133
|
-
m, curr, prec = nametemplate_split1(n, m, curr, prec)
|
|
134
|
-
m
|
|
135
|
-
end
|
|
136
|
-
t[-1] += prec
|
|
137
|
-
t
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
def nametemplate_split1(elem, acc, curr, prec)
|
|
141
|
-
if match = /\{\{.+?\[(\d)\]/.match(elem)
|
|
142
|
-
curr += 1 if match[1].to_i > curr
|
|
143
|
-
acc[curr] += prec
|
|
144
|
-
prec = ""
|
|
145
|
-
acc[curr] += elem
|
|
146
|
-
else prec += elem
|
|
147
|
-
end
|
|
148
|
-
[acc, curr, prec]
|
|
149
|
-
end
|
|
150
|
-
end
|
|
151
|
-
end
|
|
152
|
-
end
|
data/lib/utils/utils.rb
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
module Relaton
|
|
2
|
-
module Render
|
|
3
|
-
module Utils
|
|
4
|
-
def self.string_keys(hash)
|
|
5
|
-
case hash
|
|
6
|
-
when Hash
|
|
7
|
-
hash.each_with_object({}) do |(k, v), ret|
|
|
8
|
-
ret[k.to_s] = string_keys(v)
|
|
9
|
-
end
|
|
10
|
-
when Array then hash.map { |n| string_keys(n) }
|
|
11
|
-
else hash
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def self.sym_keys(hash)
|
|
16
|
-
case hash
|
|
17
|
-
when Hash
|
|
18
|
-
hash.each_with_object({}) do |(k, v), ret|
|
|
19
|
-
ret[k.to_sym] = sym_keys(v)
|
|
20
|
-
end
|
|
21
|
-
when Array then hash.map { |n| sym_keys(n) }
|
|
22
|
-
else hash
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|