metanorma-iec 1.4.1 → 1.4.5

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.
@@ -4,6 +4,14 @@ require "isodoc"
4
4
  module IsoDoc
5
5
  module Iec
6
6
  class PresentationXMLConvert < IsoDoc::Iso::PresentationXMLConvert
7
+ def i18n_init(lang, script, i18nyaml = nil)
8
+ super
9
+ @i18n_lg = {}
10
+ @i18n_lg["en"] = I18n.new("en", "Latn", i18nyaml || @i18nyaml)
11
+ @i18n_lg["fr"] = I18n.new("fr", "Latn", i18nyaml || @i18nyaml)
12
+ @i18n_lg["default"] = @i18n
13
+ end
14
+
7
15
  def clause(docxml)
8
16
  docxml.xpath(ns("//clause[not(ancestor::annex)] | "\
9
17
  "//definitions | //references | "\
@@ -29,16 +37,196 @@ module IsoDoc
29
37
  .call(elem)
30
38
  end
31
39
 
40
+ DICT_PATHS = { doctype_dict: "./ext/doctype", stage_dict: "./status/stage",
41
+ substage_dict: "./status/substage",
42
+ function_dict: "./ext/function",
43
+ horizontal_dict: "./ext/horizontal" }.freeze
44
+
32
45
  def bibdata_i18n(bib)
33
46
  fr = IsoDoc::Iec::I18n.new("fr", "Latn")
34
47
  en = IsoDoc::Iec::I18n.new("en", "Latn")
35
48
  [{ lang: "en", i18n: en }, { lang: "fr", i18n: fr }].each do |v|
36
- { doctype_dict: "./ext/doctype", stage_dict: "./status/stage",
37
- substage_dict: "./status/substage", function_dict: "./ext/function",
38
- horizontal_dict: "./ext/horizontal" }.each do |lbl, xpath|
39
- hash_translate(bib, v[:i18n].get[lbl.to_s], xpath, v[:lang])
40
- end
49
+ DICT_PATHS.each do |lbl, xpath|
50
+ hash_translate(bib, v[:i18n].get[lbl.to_s], xpath, v[:lang])
51
+ end
52
+ end
53
+ end
54
+
55
+ def concept(docxml)
56
+ @is_iev and concept_iev(docxml)
57
+ super
58
+ end
59
+
60
+ def concept_iev(docxml)
61
+ labels = @xrefs.get_anchors.each_with_object({}) do |(k, v), m|
62
+ m[v[:label]] = k
63
+ end
64
+ docpart = docxml&.at(ns("//bibdata/ext/structuredidentifier/"\
65
+ "project-number/@part"))&.text or return
66
+ docxml.xpath(ns("//termref[@base = 'IEV']")).each do |t|
67
+ concept_iev1(t, docpart, labels)
68
+ end
69
+ end
70
+
71
+ def concept_iev1(termref, docpart, labels)
72
+ /^#{docpart}-/.match?(termref["target"]) or return
73
+ newtarget = labels[termref["target"]] or return
74
+ termref.name = "xref"
75
+ termref.delete("base")
76
+ termref["target"] = newtarget
77
+ end
78
+
79
+ def terms(docxml)
80
+ otherlang_designations(docxml)
81
+ super
82
+ merge_fr_into_en_term(docxml)
83
+ end
84
+
85
+ def merge_fr_into_en_term(docxml)
86
+ return unless @is_iev
87
+
88
+ docxml.xpath(ns("//term[@language = 'en'][@tag]")).each do |en|
89
+ fr = docxml.at(ns("//term[@language = 'fr'][@tag = '#{en['tag']}']"))
90
+ merge_fr_into_en_term1(en, fr) if fr
91
+ end
92
+ @xrefs.parse docxml
93
+ docxml.xpath(ns("//term/name")).each(&:remove)
94
+ term(docxml)
95
+ end
96
+
97
+ def merge_fr_into_en_term1(en_term, fr_term)
98
+ dl = en_term&.at(ns("./dl[@type = 'other-lang']"))&.remove
99
+ en_term << fr_term.remove.children
100
+ en_term << dl if dl
101
+ en_term["language"] = "en,fr"
102
+ en_term.delete("tag")
103
+ end
104
+
105
+ def otherlang_designations(docxml)
106
+ return unless @is_iev
107
+
108
+ docxml.xpath(ns("//term")).each do |t|
109
+ otherlang_designations1(t, t["language"]&.split(/,/) || %w(en fr))
110
+ end
111
+ end
112
+
113
+ def extract_otherlang_designations(term, lgs)
114
+ term.xpath(ns(".//preferred/expression[@language]"))
115
+ .each_with_object([]) do |d, m|
116
+ lg = d["language"]
117
+ d.delete("language")
118
+ next if lgs.include?(lg)
119
+
120
+ p = d.parent
121
+ designation_annotate(p, d.at(ns("./name")))
122
+ m << { lang: lg, script: Metanorma::Utils.default_script(lg),
123
+ designation: l10n_recursive(p.remove, lg).to_xml.strip }
124
+ end
125
+ end
126
+
127
+ def l10n_recursive(xml, lang)
128
+ script = Metanorma::Utils.default_script(lang)
129
+ c = HTMLEntities.new
130
+ xml.traverse do |x|
131
+ next unless x.text?
132
+
133
+ text = c.encode(c.decode(x.text), :hexadecimal)
134
+ x.replace(cleanup_entities(l10n(text, lang, script), is_xml: false))
41
135
  end
136
+ xml
137
+ end
138
+
139
+ def merge_otherlang_designations(desgn)
140
+ h = desgn.each_with_object({}) do |e, m|
141
+ if m[e[:lang]]
142
+ m[e[:lang]][:designation] += e[:designation]
143
+ else m[e[:lang]] = e
144
+ end
145
+ end
146
+ h.keys.sort.each_with_object([]) { |k, m| m << h[k] }
147
+ end
148
+
149
+ def otherlang_designations1(term, lgs)
150
+ pr = merge_otherlang_designations(
151
+ extract_otherlang_designations(term, lgs),
152
+ )
153
+ return if pr.empty?
154
+
155
+ prefs = pr.map do |p|
156
+ "<dt>#{p[:lang]}</dt>"\
157
+ "<dd language='#{p[:lang]}' script='#{p[:script]}'>"\
158
+ "#{cleanup_entities(p[:designation])}</dd>"
159
+ end
160
+ term << "<dl type='other-lang'>#{prefs.join}</dl>"
161
+ end
162
+
163
+ def related(docxml)
164
+ docxml.xpath(ns("//term[related]")).each { |f| move_related(f) }
165
+ super
166
+ end
167
+
168
+ def move_related(term)
169
+ defn = term.at(ns("./definition")) or return
170
+ term.xpath(ns("./related")).reverse.each do |r|
171
+ defn.next = r.remove
172
+ end
173
+ end
174
+
175
+ def related1(node)
176
+ lg = node&.at("./ancestor::xmlns:term/@language")&.text
177
+ @i18n = @i18n_lg[lg] if lg && @i18n_lg[lg]
178
+ p = node.at(ns("./preferred"))
179
+ ref = node.at(ns("./xref | ./eref | ./termref"))
180
+ label = @i18n.relatedterms[node["type"]].upcase
181
+ node.replace(l10n("<p>#{label}: "\
182
+ "#{p.children.to_xml} (#{ref.to_xml})</p>"))
183
+ @i18n = @i18n_lg["default"]
184
+ end
185
+
186
+ def termsource_modification(node)
187
+ lg = node&.at("./ancestor::xmlns:term/@language")&.text
188
+ @i18n = @i18n_lg[lg] if lg && @i18n_lg[lg]
189
+ super
190
+ @i18n = @i18n_lg["default"]
191
+ end
192
+
193
+ def termsource1(node)
194
+ lg = node&.at("./ancestor::xmlns:term/@language")&.text
195
+ @i18n = @i18n_lg[lg] if lg && @i18n_lg[lg]
196
+ if @is_iev then termsource1_iev(node)
197
+ else super
198
+ end
199
+ @i18n = @i18n_lg["default"]
200
+ end
201
+
202
+ def termsource1_iev(elem)
203
+ while elem&.next_element&.name == "termsource"
204
+ elem << l10n("; #{elem.next_element.remove.children.to_xml}")
205
+ end
206
+ elem.children = l10n("#{@i18n.source}: #{elem.children.to_xml.strip}")
207
+ end
208
+
209
+ def termexample(docxml)
210
+ docxml.xpath(ns("//termexample")).each do |f|
211
+ termexample1(f)
212
+ end
213
+ end
214
+
215
+ def termexample1(elem)
216
+ lg = elem&.at("./ancestor::xmlns:term/@language")&.text
217
+ @i18n = @i18n_lg[lg] if lg && @i18n_lg[lg]
218
+ example1(elem)
219
+ @i18n = @i18n_lg["default"]
220
+ end
221
+
222
+ def termnote1(elem)
223
+ lg = elem&.at("./ancestor::xmlns:term/@language")&.text
224
+ @i18n = @i18n_lg[lg] if lg && @i18n_lg[lg]
225
+
226
+ val = @xrefs.anchor(elem["id"], :value) || "???"
227
+ lbl = @i18n.termnote.gsub(/%/, val)
228
+ prefix_name(elem, "", lower2cap(lbl), "name")
229
+ @i18n = @i18n_lg["default"]
42
230
  end
43
231
 
44
232
  include Init
@@ -3,8 +3,7 @@ require "metanorma/processor"
3
3
  module Metanorma
4
4
  module Iec
5
5
  class Processor < Metanorma::Processor
6
-
7
- def initialize
6
+ def initialize # rubocop:disable Lint/MissingSuper
8
7
  @short = :iec
9
8
  @input_format = :asciidoc
10
9
  @asciidoctor_backend = :iec
@@ -14,7 +13,8 @@ module Metanorma
14
13
  super.merge(
15
14
  html: "html",
16
15
  doc: "doc",
17
- pdf: "pdf"
16
+ pdf: "pdf",
17
+ sts: "sts.xml",
18
18
  )
19
19
  end
20
20
 
@@ -33,16 +33,23 @@ module Metanorma
33
33
  "Metanorma::Iec #{Metanorma::Iec::VERSION}"
34
34
  end
35
35
 
36
- def output(isodoc_node, inname, outname, format, options={})
36
+ def output(isodoc_node, inname, outname, format, options = {})
37
37
  case format
38
38
  when :html
39
- IsoDoc::Iec::HtmlConvert.new(options).convert(inname, isodoc_node, nil, outname)
39
+ IsoDoc::Iec::HtmlConvert.new(options).convert(inname, isodoc_node,
40
+ nil, outname)
40
41
  when :doc
41
- IsoDoc::Iec::WordConvert.new(options).convert(inname, isodoc_node, nil, outname)
42
+ IsoDoc::Iec::WordConvert.new(options).convert(inname, isodoc_node,
43
+ nil, outname)
42
44
  when :pdf
43
- IsoDoc::Iec::PdfConvert.new(options).convert(inname, isodoc_node, nil, outname)
45
+ IsoDoc::Iec::PdfConvert.new(options).convert(inname, isodoc_node,
46
+ nil, outname)
47
+ when :sts
48
+ IsoDoc::Iso::StsConvert.new(options).convert(inname, isodoc_node,
49
+ nil, outname)
44
50
  when :presentation
45
- IsoDoc::Iec::PresentationXMLConvert.new(options).convert(inname, isodoc_node, nil, outname)
51
+ IsoDoc::Iec::PresentationXMLConvert.new(options)
52
+ .convert(inname, isodoc_node, nil, outname)
46
53
  else
47
54
  super
48
55
  end
@@ -1,6 +1,6 @@
1
1
  module Metanorma
2
2
  module Iec
3
- VERSION = "1.4.1".freeze
3
+ VERSION = "1.4.5".freeze
4
4
  end
5
5
  end
6
6
 
@@ -30,11 +30,11 @@ Gem::Specification.new do |spec|
30
30
  spec.add_dependency "metanorma-iso", "~> 1.10.0"
31
31
  spec.add_dependency "ruby-jing"
32
32
 
33
- spec.add_development_dependency "byebug"
33
+ spec.add_development_dependency "debug"
34
34
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
35
35
  spec.add_development_dependency "guard", "~> 2.14"
36
36
  spec.add_development_dependency "guard-rspec", "~> 4.7"
37
- spec.add_development_dependency "iev", "~> 0.2.0"
37
+ spec.add_development_dependency "iev", "~> 0.3.0"
38
38
  spec.add_development_dependency "rake", "~> 13.0"
39
39
  spec.add_development_dependency "rspec", "~> 3.6"
40
40
  spec.add_development_dependency "rubocop", "~> 1.5.2"
@@ -166,7 +166,6 @@ RSpec.describe Asciidoctor::Iec do
166
166
  </relation>
167
167
  <ext>
168
168
  <doctype>article</doctype>
169
- <horizontal>false</horizontal>
170
169
  <editorialgroup>
171
170
  <technical-committee number='1' type='A'>TC</technical-committee>
172
171
  <technical-committee number='11' type='A1'>TC1</technical-committee>
@@ -675,7 +674,6 @@ RSpec.describe Asciidoctor::Iec do
675
674
  </copyright>
676
675
  <ext>
677
676
  <doctype>article</doctype>
678
- <horizontal>false</horizontal>
679
677
  <editorialgroup>
680
678
  <technical-committee/>
681
679
  <subcommittee/>
@@ -879,7 +877,6 @@ RSpec.describe Asciidoctor::Iec do
879
877
  </copyright>
880
878
  <ext>
881
879
  <doctype>article</doctype>
882
- <horizontal>false</horizontal>
883
880
  <editorialgroup>
884
881
  <technical-committee/>
885
882
  <subcommittee/>
@@ -947,7 +944,6 @@ RSpec.describe Asciidoctor::Iec do
947
944
  </copyright>
948
945
  <ext>
949
946
  <doctype>article</doctype>
950
- <horizontal>false</horizontal>
951
947
  <editorialgroup>
952
948
  <technical-committee/>
953
949
  <subcommittee/>