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.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +4 -1
  3. data/.github/workflows/release.yml +24 -0
  4. data/.gitignore +14 -0
  5. data/.rubocop.yml +2 -2
  6. data/Gemfile +17 -1
  7. data/README.adoc +61 -197
  8. data/docs/citation-style-pack.adoc +367 -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/style/locale.rb +53 -0
  41. data/lib/relaton/render/iso690/style/name_form.rb +87 -0
  42. data/lib/relaton/render/iso690/style/scheme.rb +33 -0
  43. data/lib/relaton/render/iso690/style/sort_rule.rb +25 -0
  44. data/lib/relaton/render/iso690/style/template_map.rb +40 -0
  45. data/lib/relaton/render/iso690/style/type_template.rb +37 -0
  46. data/lib/relaton/render/iso690/style.rb +119 -0
  47. data/lib/relaton/render/iso690/styles/author-date.yml +31 -0
  48. data/lib/relaton/render/iso690/template.rb +248 -0
  49. data/lib/relaton/render/iso690.rb +26 -0
  50. data/lib/relaton/render/version.rb +5 -0
  51. data/lib/relaton-render.rb +12 -5
  52. data/relaton-render.gemspec +7 -11
  53. metadata +57 -86
  54. data/lib/isodoc/i18n.rb +0 -24
  55. data/lib/isodoc-yaml/i18n-ar.yaml +0 -2
  56. data/lib/isodoc-yaml/i18n-de.yaml +0 -2
  57. data/lib/isodoc-yaml/i18n-en.yaml +0 -22
  58. data/lib/isodoc-yaml/i18n-es.yaml +0 -2
  59. data/lib/isodoc-yaml/i18n-fr.yaml +0 -2
  60. data/lib/isodoc-yaml/i18n-ru.yaml +0 -23
  61. data/lib/isodoc-yaml/i18n-zh-Hans.yaml +0 -2
  62. data/lib/parse/parse.rb +0 -54
  63. data/lib/parse/parse_contributors.rb +0 -96
  64. data/lib/parse/parse_extract.rb +0 -155
  65. data/lib/relaton/config.yml +0 -67
  66. data/lib/relaton/render.rb +0 -123
  67. data/lib/relaton/render_classes.rb +0 -126
  68. data/lib/relaton/render_fields.rb +0 -151
  69. data/lib/relaton/version.rb +0 -5
  70. data/lib/template/template.rb +0 -152
  71. 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]}&#x2013;#{hash[:to]}" : hash[:from]
93
- else hash
94
- end
95
- end
96
-
97
- def date_range(hash)
98
- if hash[:from]
99
- "#{hash[:from]}&#x2013;#{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
@@ -1,5 +0,0 @@
1
- module Relaton
2
- module Render
3
- VERSION = "0.1.0".freeze
4
- end
5
- end
@@ -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