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,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(/&#x3c;/i, LT_DELIM).gsub(/&#x3e;/i, GT_DELIM)
80
- str = template_clean1(@htmlentities.decode(str))
81
- /[[:alnum:]]/.match?(str) or return nil
82
- str.strip.gsub(/#{LT_DELIM}/o, "&#x3c;")
83
- .gsub(/#{GT_DELIM}/o, "&#x3e;")
84
- .gsub(/&(?!#\S+?;)/, "&#x26;")
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