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.
- checksums.yaml +4 -4
- data/.github/workflows/rake.yml +6 -1
- data/.github/workflows/release.yml +6 -4
- data/.gitignore +14 -0
- data/.rubocop.yml +2 -2
- data/Gemfile +17 -1
- data/README.adoc +13 -291
- data/docs/citation-style-pack.adoc +370 -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/rules.rb +36 -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 +222 -0
- data/lib/relaton/render/iso690/styles/apa.yml +45 -0
- data/lib/relaton/render/iso690/styles/author-date.yml +31 -0
- data/lib/relaton/render/iso690/styles/chicago.yml +48 -0
- data/lib/relaton/render/iso690/styles/ieee-sa.yml +45 -0
- data/lib/relaton/render/iso690/styles/lncs.yml +54 -0
- data/lib/relaton/render/iso690/template.rb +248 -0
- data/lib/relaton/render/iso690.rb +27 -0
- data/lib/relaton/render/version.rb +1 -1
- data/lib/relaton-render.rb +11 -5
- data/relaton-render.gemspec +6 -13
- metadata +63 -120
- data/lib/isodoc/i18n.rb +0 -34
- data/lib/isodoc-yaml/i18n-ar.yaml +0 -49
- data/lib/isodoc-yaml/i18n-de.yaml +0 -48
- data/lib/isodoc-yaml/i18n-en.yaml +0 -45
- data/lib/isodoc-yaml/i18n-es.yaml +0 -52
- data/lib/isodoc-yaml/i18n-fr.yaml +0 -53
- data/lib/isodoc-yaml/i18n-ru.yaml +0 -56
- data/lib/isodoc-yaml/i18n-zh-Hans.yaml +0 -45
- data/lib/isodoc-yaml/i18n-zh-Hant.yaml +0 -45
- data/lib/relaton/render/fields/date.rb +0 -45
- data/lib/relaton/render/fields/fields.rb +0 -229
- data/lib/relaton/render/general/citations.rb +0 -96
- data/lib/relaton/render/general/config.yml +0 -79
- data/lib/relaton/render/general/render.rb +0 -187
- data/lib/relaton/render/general/render_classes.rb +0 -129
- data/lib/relaton/render/parse/parse.rb +0 -67
- data/lib/relaton/render/parse/parse_contributors.rb +0 -170
- data/lib/relaton/render/parse/parse_extract.rb +0 -208
- data/lib/relaton/render/template/liquid.rb +0 -15
- data/lib/relaton/render/template/template.rb +0 -218
- data/lib/relaton/render/utils/utils.rb +0 -27
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
require_relative "../utils/utils"
|
|
2
|
-
require_relative "liquid"
|
|
3
|
-
|
|
4
|
-
module Relaton
|
|
5
|
-
module Render
|
|
6
|
-
module Template
|
|
7
|
-
class General
|
|
8
|
-
def initialize(opt = {})
|
|
9
|
-
@htmlentities = HTMLEntities.new
|
|
10
|
-
customise_liquid
|
|
11
|
-
parse_options(opt)
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def parse_options(opt)
|
|
15
|
-
opt = Utils::sym_keys(opt)
|
|
16
|
-
@i18n = opt[:i18n]
|
|
17
|
-
@template_raw = opt[:template].dup
|
|
18
|
-
@template =
|
|
19
|
-
case opt[:template]
|
|
20
|
-
when Hash
|
|
21
|
-
opt[:template].transform_values { |x| template_process(x) }
|
|
22
|
-
when Array then opt[:template].map { |x| template_process(x) }
|
|
23
|
-
else { default: template_process(opt[:template]) }
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def customise_liquid
|
|
28
|
-
::Liquid::Template
|
|
29
|
-
.register_filter(::Relaton::Render::Template::CapitalizeFirst)
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# denote start and end of field,
|
|
33
|
-
# so that we can detect empty fields in postprocessing
|
|
34
|
-
# FIELD_DELIM = "\u0018".freeze
|
|
35
|
-
FIELD_DELIM = "%%".freeze
|
|
36
|
-
|
|
37
|
-
# escape < >
|
|
38
|
-
LT_DELIM = "\u0019".freeze
|
|
39
|
-
GT_DELIM = "\u001a".freeze
|
|
40
|
-
|
|
41
|
-
# use tab internally for non-spacing delimiter
|
|
42
|
-
NON_SPACING_DELIM = "\t".freeze
|
|
43
|
-
|
|
44
|
-
def punct_field?(name)
|
|
45
|
-
name or return false
|
|
46
|
-
name = name.gsub(/'/, '"')
|
|
47
|
-
%w(labels["qq-open"] labels["qq-close"] labels["q-open"]
|
|
48
|
-
labels["q-close"]).include?(name)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def template_process(template)
|
|
52
|
-
template.is_a?(String) or return template
|
|
53
|
-
::Liquid::Template.parse(add_field_delim_to_template(template))
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def add_field_delim_to_template(template)
|
|
57
|
-
t = template.split(/(\{\{|\}\})/).each_slice(4).map do |a|
|
|
58
|
-
unless !a[2] || punct_field?(a[2]&.strip)
|
|
59
|
-
a[1] = "#{FIELD_DELIM}{{"
|
|
60
|
-
a[3] = "}}#{FIELD_DELIM}"
|
|
61
|
-
end
|
|
62
|
-
a.join
|
|
63
|
-
end.join.gsub(/\t/, " ")
|
|
64
|
-
t.gsub(/\}\}#{FIELD_DELIM}\|/o, "}}#{FIELD_DELIM}\t")
|
|
65
|
-
.gsub(/\|#{FIELD_DELIM}\{\{/o, "\t#{FIELD_DELIM}{{")
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def render(hash)
|
|
69
|
-
t = template_select(hash) or return nil
|
|
70
|
-
|
|
71
|
-
template_clean(t.render(liquid_hash(hash.merge("labels" => @i18n.get))))
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def template_select(_hash)
|
|
75
|
-
@template[:default]
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def template_clean(str)
|
|
79
|
-
str = str.gsub(/</i, LT_DELIM).gsub(/>/i, GT_DELIM)
|
|
80
|
-
str = template_clean1(@htmlentities.decode(str))
|
|
81
|
-
/[[:alnum:]]/.match?(str) or return nil
|
|
82
|
-
str.strip.gsub(/#{LT_DELIM}/o, "<")
|
|
83
|
-
.gsub(/#{GT_DELIM}/o, ">")
|
|
84
|
-
.gsub(/&(?!#\S+?;)/, "&")
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
# use tab internally for non-spacing delimiter
|
|
88
|
-
def template_clean1(str)
|
|
89
|
-
str.gsub(/\S*#{FIELD_DELIM}#{FIELD_DELIM}\S*/o, "")
|
|
90
|
-
.gsub(/#{FIELD_DELIM}/o, "")
|
|
91
|
-
.gsub(/([,:;]\s*)+([,:;](\s|_|$))/, "\\2")
|
|
92
|
-
.gsub(/([,.:;]\s*)+([.](\s|_|$))/, "\\2")
|
|
93
|
-
.gsub(/([,:;]\s*)+(,(\s|_|$))/, "\\2")
|
|
94
|
-
.gsub(/(:\s+)(&\s)/, "\\2")
|
|
95
|
-
.gsub(/\s+([,.:;)])/, "\\1")
|
|
96
|
-
.sub(/^\s*[,.:;]\s*/, "")
|
|
97
|
-
.sub(/[,:;]\s*$/, "")
|
|
98
|
-
.gsub(/(?<!\\)_/, " ")
|
|
99
|
-
.gsub(/\\_/, "_")
|
|
100
|
-
.gsub(/#{NON_SPACING_DELIM}/o, "").gsub(/\s+/, " ")
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
# need non-breaking spaces in fields: "Updated:_nil" ---
|
|
104
|
-
# we want the "Updated:" deleted,
|
|
105
|
-
# even if it's multiple words, as in French Mise_à_jour.
|
|
106
|
-
def liquid_hash(hash)
|
|
107
|
-
case hash
|
|
108
|
-
when Hash
|
|
109
|
-
hash.map { |k, v| [k.to_s, liquid_hash(v)] }.to_h
|
|
110
|
-
when Array
|
|
111
|
-
hash.map { |v| liquid_hash(v) }
|
|
112
|
-
when String
|
|
113
|
-
hash.empty? ? nil : hash.gsub(/ /, "_")
|
|
114
|
-
else hash
|
|
115
|
-
end
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
class Series < General
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
class Extent < General
|
|
123
|
-
def template_select(hash)
|
|
124
|
-
@template[hash[:type].to_sym]
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
class Size < General
|
|
129
|
-
def template_select(hash)
|
|
130
|
-
@template[hash[:type].to_sym]
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
class Name < General
|
|
135
|
-
def initialize(opt = {})
|
|
136
|
-
@etal_count = opt[:template]["etal_count"]
|
|
137
|
-
@etal_display = opt[:template]["etal_display"] || @etal_count
|
|
138
|
-
opt[:template].delete("etal_count")
|
|
139
|
-
opt[:template].delete("etal_display")
|
|
140
|
-
super
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
def template_select(names)
|
|
144
|
-
return nil if names.nil? || names.empty?
|
|
145
|
-
|
|
146
|
-
case names[:surname].size
|
|
147
|
-
when 1 then @template[:one]
|
|
148
|
-
when 2 then @template[:two]
|
|
149
|
-
when 3 then @template[:more]
|
|
150
|
-
else template_select_etal(names)
|
|
151
|
-
end
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
def template_select_etal(names)
|
|
155
|
-
if @etal_count && names[:surname].size >= @etal_count
|
|
156
|
-
expand_nametemplate(@template_raw[:etal], @etal_display)
|
|
157
|
-
else
|
|
158
|
-
expand_nametemplate(@template_raw[:more], names[:surname].size)
|
|
159
|
-
end
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
# assumes that template contains, consecutively and not interleaved,
|
|
163
|
-
# ...[0], ...[1], ...[2]
|
|
164
|
-
def expand_nametemplate(template, size)
|
|
165
|
-
t = nametemplate_split(template)
|
|
166
|
-
|
|
167
|
-
mid = (1..size - 2).each_with_object([]) do |i, m|
|
|
168
|
-
m << t[1].gsub(/\[1\]/, "[#{i}]")
|
|
169
|
-
end
|
|
170
|
-
t[1] = mid.join
|
|
171
|
-
t[2].gsub!(/\[\d+\]/, "[#{size - 1}]")
|
|
172
|
-
template_process(combine_nametemplate(t, size))
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
def combine_nametemplate(parts, size)
|
|
176
|
-
case size
|
|
177
|
-
when 1 then parts[0] + parts[3]
|
|
178
|
-
when 2 then parts[0] + parts[2] + parts[3]
|
|
179
|
-
else parts.join
|
|
180
|
-
end
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
def nametemplate_split(template)
|
|
184
|
-
curr = 0
|
|
185
|
-
prec = ""
|
|
186
|
-
t = template.split(/(\{[{%].+?[}%]\})/)
|
|
187
|
-
.each_with_object([""]) do |n, m|
|
|
188
|
-
m, curr, prec = nametemplate_split1(n, m, curr, prec)
|
|
189
|
-
|
|
190
|
-
m
|
|
191
|
-
end
|
|
192
|
-
[t[0], t[1], t[-1], prec]
|
|
193
|
-
end
|
|
194
|
-
|
|
195
|
-
def nametemplate_split1(elem, acc, curr, prec)
|
|
196
|
-
if match = /\{[{%].+?\[(\d)\]/.match(elem)
|
|
197
|
-
if match[1].to_i > curr
|
|
198
|
-
curr += 1
|
|
199
|
-
acc[curr] ||= ""
|
|
200
|
-
end
|
|
201
|
-
acc[curr] += prec
|
|
202
|
-
prec = ""
|
|
203
|
-
acc[curr] += elem
|
|
204
|
-
elsif /\{%\s*endif/.match?(elem)
|
|
205
|
-
acc[curr] += prec
|
|
206
|
-
prec = ""
|
|
207
|
-
acc[curr] += elem
|
|
208
|
-
else prec += elem
|
|
209
|
-
end
|
|
210
|
-
[acc, curr, prec]
|
|
211
|
-
end
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
class AuthorCite < Name
|
|
215
|
-
end
|
|
216
|
-
end
|
|
217
|
-
end
|
|
218
|
-
end
|
|
@@ -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
|