metanorma-iec 1.4.1 → 1.4.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -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/>