metanorma-ieee 0.0.1 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +1 -1
  3. data/lib/html2doc/ieee/lists.rb +44 -0
  4. data/lib/html2doc/ieee/notes.rb +57 -0
  5. data/lib/html2doc/ieee.rb +4 -86
  6. data/lib/isodoc/ieee/base_convert.rb +56 -0
  7. data/lib/isodoc/ieee/html/header.html +1 -2
  8. data/lib/isodoc/ieee/html/header_amd.html +105 -0
  9. data/lib/isodoc/ieee/html/html_ieee_titlepage.html +14 -12
  10. data/lib/isodoc/ieee/html/htmlstyle.css +2 -1
  11. data/lib/isodoc/ieee/html/htmlstyle.scss +1 -0
  12. data/lib/isodoc/ieee/html/ieee.css +46 -273
  13. data/lib/isodoc/ieee/html/ieee.scss +46 -257
  14. data/lib/isodoc/ieee/html/word_ieee_intro.html +1 -1
  15. data/lib/isodoc/ieee/html/word_ieee_titlepage.html +12 -1
  16. data/lib/isodoc/ieee/html/wordstyle.css +20 -23
  17. data/lib/isodoc/ieee/html/wordstyle.scss +20 -17
  18. data/lib/isodoc/ieee/html_convert.rb +37 -1
  19. data/lib/isodoc/ieee/i18n-en.yaml +5 -0
  20. data/lib/isodoc/ieee/ieee.amendment.xsl +5488 -3540
  21. data/lib/isodoc/ieee/ieee.standard.xsl +5488 -3540
  22. data/lib/isodoc/ieee/metadata.rb +35 -51
  23. data/lib/isodoc/ieee/pdf_convert.rb +2 -2
  24. data/lib/isodoc/ieee/presentation_ref.rb +70 -0
  25. data/lib/isodoc/ieee/presentation_terms.rb +105 -32
  26. data/lib/isodoc/ieee/presentation_xml_convert.rb +136 -0
  27. data/lib/isodoc/ieee/word_authority.rb +73 -3
  28. data/lib/isodoc/ieee/word_cleanup.rb +55 -65
  29. data/lib/isodoc/ieee/word_cleanup_blocks.rb +151 -0
  30. data/lib/isodoc/ieee/word_convert.rb +98 -2
  31. data/lib/isodoc/ieee/xref.rb +31 -0
  32. data/lib/metanorma/ieee/boilerplate.xml +72 -23
  33. data/lib/metanorma/ieee/cleanup.rb +142 -77
  34. data/lib/metanorma/ieee/cleanup_ref.rb +126 -0
  35. data/lib/metanorma/ieee/converter.rb +8 -0
  36. data/lib/metanorma/ieee/front.rb +44 -53
  37. data/lib/metanorma/ieee/ieee.rng +44 -6
  38. data/lib/metanorma/ieee/isodoc.rng +32 -1
  39. data/lib/metanorma/ieee/reqt.rng +1 -1
  40. data/lib/metanorma/ieee/term_lookup_cleanup.rb +11 -0
  41. data/lib/metanorma/ieee/validate.rb +105 -57
  42. data/lib/metanorma/ieee/validate_section.rb +14 -7
  43. data/lib/metanorma/ieee/validate_style.rb +58 -1
  44. data/lib/metanorma/ieee/version.rb +1 -1
  45. data/lib/relaton/render/config.yml +44 -0
  46. data/lib/relaton/render/general.rb +13 -0
  47. data/metanorma-itu.gemspec +1 -1
  48. metadata +13 -4
@@ -243,26 +243,61 @@
243
243
  </clause>
244
244
  <clause id="boilerplate-participants">
245
245
  <title>Participants</title>
246
+ <clause id="boilerplate-participants-wg">
246
247
  <p>At the time this draft {{ doctype }} was completed, the {{ working_group }} Working Group had the following membership:</p>
247
- <p align="center" type="officeholder"><strong>{{ wg_members["chair"] }}</strong>, <em>Chair</em></p>
248
- <p align="center" type="officeholder"><strong>{{ wg_members["vice-chair"] }}</strong>, <em>Vice Chair</em></p>
249
- {% if wg_members["secretary"] %}<p align="center" type="officeholder"><strong>{{ wg_members["secretary"] }}</strong>, <em>Secretary</em></p>{% endif %}
250
- {% for m in wg_members["members"] %}
251
- <p type="officemember">{{ m }}</p>
252
- {% endfor %}
253
- <p>The following members of the {{ balloting_group }} Standards Association balloting group voted on this {{ doctype }}. Balloters may have voted for approval, disapproval, or abstention.</p>
254
- {% for m in balloting_group_members %}
255
- <p type="officemember">{{ m }}</p>
256
- {% endfor %}
257
- <p>When the IEEE SA Standards Board approved this {{ doctype }} on {{ confirmed_date }}, it had the following membership:</p>
258
- <p align="center" type="officeholder"><strong>{{ std_board["chair"] }}</strong>, <em>Chair</em></p>
259
- <p align="center" type="officeholder"><strong>{{ std_board["vice-chair"] }}</strong>, <em>Vice Chair</em></p>
260
- <p align="center" type="officeholder"><strong>{{ std_board["past-chair"] }}</strong>, <em>Past Chair</em></p>
261
- <p align="center" type="officeholder"><strong>{{ std_board["secretary"] }}</strong>, <em>Secretary</em></p>
262
- {% for m in std_board["members"] %}
263
- <p type="officemember">{{ m }}</p>
264
- {% endfor %}
248
+ <membership>
249
+ <ul>
250
+ <li><dl><dt>name</dt><dd>&#x3c;Chair Name&#x3e;</dd><dt>role</dt><dd>Chair</dd></dl></li>
251
+ <li><dl><dt>name</dt><dd>&#x3c;Vice-chair Name&#x3e;</dd><dt>role</dt><dd>Vice Chair</dd></dl></li>
252
+ <li><dl><dt>name</dt><dd>Participant1</dd><dt>role</dt><dd>Member</dd></dl></li>
253
+ <li><dl><dt>name</dt><dd>Participant2</dd><dt>role</dt><dd>Member</dd></dl></li>
254
+ <li><dl><dt>name</dt><dd>Participant3</dd><dt>role</dt><dd>Member</dd></dl></li>
255
+ <li><dl><dt>name</dt><dd>Participant4</dd><dt>role</dt><dd>Member</dd></dl></li>
256
+ <li><dl><dt>name</dt><dd>Participant5</dd><dt>role</dt><dd>Member</dd></dl></li>
257
+ <li><dl><dt>name</dt><dd>Participant6</dd><dt>role</dt><dd>Member</dd></dl></li>
258
+ <li><dl><dt>name</dt><dd>Participant7</dd><dt>role</dt><dd>Member</dd></dl></li>
259
+ <li><dl><dt>name</dt><dd>Participant8</dd><dt>role</dt><dd>Member</dd></dl></li>
260
+ <li><dl><dt>name</dt><dd>Participant9</dd><dt>role</dt><dd>Member</dd></dl></li>
261
+ </ul>
262
+ </membership>
263
+ </clause>
264
+ <clause id="boilerplate-participants-bg">
265
+ <p>The following members of the {{ balloting_group_type }} {{ balloting_group }} Standards Association balloting group voted on this {{ doctype }}. Balloters may have voted for approval, disapproval, or abstention.</p>
266
+ <membership>
267
+ <ul>
268
+ <li><dl><dt>name</dt><dd>Balloter1</dd><dt>role</dt><dd>Member</dd></dl></li>
269
+ <li><dl><dt>name</dt><dd>Balloter2</dd><dt>role</dt><dd>Member</dd></dl></li>
270
+ <li><dl><dt>name</dt><dd>Balloter3</dd><dt>role</dt><dd>Member</dd></dl></li>
271
+ <li><dl><dt>name</dt><dd>Balloter4</dd><dt>role</dt><dd>Member</dd></dl></li>
272
+ <li><dl><dt>name</dt><dd>Balloter5</dd><dt>role</dt><dd>Member</dd></dl></li>
273
+ <li><dl><dt>name</dt><dd>Balloter6</dd><dt>role</dt><dd>Member</dd></dl></li>
274
+ <li><dl><dt>name</dt><dd>Balloter7</dd><dt>role</dt><dd>Member</dd></dl></li>
275
+ <li><dl><dt>name</dt><dd>Balloter8</dd><dt>role</dt><dd>Member</dd></dl></li>
276
+ <li><dl><dt>name</dt><dd>Balloter9</dd><dt>role</dt><dd>Member</dd></dl></li>
277
+ </ul>
278
+ </membership>
279
+ </clause>
280
+ <clause id="boilerplate-participants-sb">
281
+ <p>When the IEEE SA Standards Board approved this {{ doctype }} on {{ issueddate }}, it had the following membership:</p>
282
+ <membership>
283
+ <ul>
284
+ <li><dl><dt>name</dt><dd>&#x3c;Name&#x3e;</dd><dt>role</dt><dd>Chair</dd></dl></li>
285
+ <li><dl><dt>name</dt><dd>&#x3c;Name&#x3e;</dd><dt>role</dt><dd>Vice Chair</dd></dl></li>
286
+ <li><dl><dt>name</dt><dd>&#x3c;Name&#x3e;</dd><dt>role</dt><dd>Past Chair</dd></dl></li>
287
+ <li><dl><dt>name</dt><dd>&#x3c;Name&#x3e;</dd><dt>role</dt><dd>Secretary</dd></dl></li>
288
+ <li><dl><dt>name</dt><dd>SBMember1</dd><dt>role</dt><dd>Member</dd></dl></li>
289
+ <li><dl><dt>name</dt><dd>SBMember2</dd><dt>role</dt><dd>Member</dd></dl></li>
290
+ <li><dl><dt>name</dt><dd>SBMember3</dd><dt>role</dt><dd>Member</dd></dl></li>
291
+ <li><dl><dt>name</dt><dd>SBMember4</dd><dt>role</dt><dd>Member</dd></dl></li>
292
+ <li><dl><dt>name</dt><dd>SBMember5</dd><dt>role</dt><dd>Member</dd></dl></li>
293
+ <li><dl><dt>name</dt><dd>SBMember6</dd><dt>role</dt><dd>Member</dd></dl></li>
294
+ <li><dl><dt>name</dt><dd>SBMember7</dd><dt>role</dt><dd>Member</dd></dl></li>
295
+ <li><dl><dt>name</dt><dd>SBMember8</dd><dt>role</dt><dd>Member</dd></dl></li>
296
+ <li><dl><dt>name</dt><dd>SBMember9</dd><dt>role</dt><dd>Member</dd></dl></li>
297
+ </ul>
298
+ </membership>
265
299
  <p type="emeritus_sign">*Member Emeritus</p>
300
+ </clause>
266
301
  </clause>
267
302
  </legal-statement>
268
303
  <feedback-statement>
@@ -272,7 +307,7 @@
272
307
 
273
308
  <clause>
274
309
  <p>Copyright © {{ docyear }} by The Institute of Electrical and Electronics Engineers, Inc.</p>
275
- <p>All rights reserved. Published {{ issued_date }}. Printed in the United States of America.</p>
310
+ <p>All rights reserved. Published {{ issueddate }}. Printed in the United States of America.</p>
276
311
  </clause>
277
312
 
278
313
  <clause>
@@ -280,7 +315,7 @@
280
315
  </clause>
281
316
 
282
317
  <clause>
283
- <table unnumbered="true">
318
+ <table unnumbered="true" id="_isbn_pdf_print">
284
319
  <tbody>
285
320
  <tr><td>PDF:</td> <td>ISBN {{ isbn_pdf }}</td> <td>{{ stdid_pdf}}</td></tr>
286
321
  <tr><td>Print:</td> <td>ISBN {{ isbn_print}}</td> <td>{{ stdid_print}}</td></tr>
@@ -289,10 +324,24 @@
289
324
  </clause>
290
325
 
291
326
  <clause>
292
- <p>IEEE prohibits discrimination, harassment, and bullying.</p>
293
- <p>For more information, visit <link target="https://www.ieee.org/about/corporate/governance/p9-26.html"/>.</p>
294
- <p>No part of this publication may be reproduced in any form, in an electronic retrieval system or otherwise, without the prior written permission of the publisher.</p>
327
+ <p><em>IEEE prohibits discrimination, harassment, and bullying.</em><br/>
328
+ <em>For more information, visit <link target="https://www.ieee.org/about/corporate/governance/p9-26.html"/>.</em><br/>
329
+ <em>No part of this publication may be reproduced in any form, in an electronic retrieval system or otherwise, without the prior written permission of the publisher.</em></p>
295
330
  </clause>
296
331
  </feedback-statement>
332
+ {% if docsubtype == "Amendment" or docsubtype == "Corrigendum" %}
333
+ <note id="boilerplate_front">
334
+ <p>The editing instructions contained in this {{ docsubtype | downcase }} define how to merge the material contained therein into the existing base standard and its amendments to form the comprehensive standard.</p>
335
+ <p>The editing instructions are shown in <strong><em>bold italic</em></strong>. Four editing instructions are used: change, delete, insert, and replace. <strong><em>Change</em></strong> is used to make corrections in existing text or tables. The editing instruction specifies the location of the change and describes what is being changed by using <strike>strikethrough</strike> (to remove old material) and <underline>underscore</underline> (to add new material). <strong><em>Delete</em></strong> removes existing material. <strong><em>Insert</em></strong> adds new material without disturbing the existing material. Insertions may require renumbering. If so, renumbering instructions are given in the editing instruction. <strong><em>Replace</em></strong> is used to make changes in figures or equations by removing the existing figure or equation and replacing it with a new one. Editing instructions, change markings, and this NOTE will not be carried over into future editions because the changes will be incorporated into the base standard.</p>
336
+ </note>
337
+ {% else %}
338
+ <clause id="boilerplate_word_usage">
339
+ <title>Word usage</title>
340
+ <p>The word <em>shall</em> indicates mandatory requirements strictly to be followed in order to conform to the standard and from which no deviation is permitted (<em>shall</em> equals <em>is required to</em>).<fn><p>The use of the word <em>must</em> is deprecated and cannot be used when stating mandatory requirements; <em>must</em> is used only to describe unavoidable situations.</p></fn><fn><p>The use of <em>will</em> is deprecated and cannot be used when stating mandatory requirements; <em>will</em> is only used in statements of fact.</p></fn></p>
341
+ <p>The word <em>should</em> indicates that among several possibilities one is recommended as particularly suitable, without mentioning or excluding others; or that a certain course of action is preferred but not necessarily required (<em>should</em> equals <em>is recommended that</em>).</p>
342
+ <p>The word <em>may</em> is used to indicate a course of action permissible within the limits of the standard (<em>may</em> equals <em>is permitted to</em>).</p>
343
+ <p>The word <em>can</em> is used for statements of possibility and capability, whether material, physical, or causal (<em>can</em> equals <em>is able to</em>).</p>
344
+ </clause>
345
+ {% endif %}
297
346
  </boilerplate>
298
347
 
@@ -1,40 +1,45 @@
1
+ require_relative "cleanup_ref"
2
+ require_relative "term_lookup_cleanup"
3
+
1
4
  module Metanorma
2
5
  module IEEE
3
6
  class Converter < Standoc::Converter
4
- BIBLIO =
5
- "//bibliography/references[@normative = 'false'][not(@hidden)] | "\
6
- "//bibliography/clause[.//references[@normative = 'false']] | "\
7
- "//annex//references[@normative = 'false'][not(@hidden)]".freeze
8
-
9
- def boilerplate_cleanup(xmldoc)
10
- f = xmldoc.at(BIBLIO) and biblio_preface(f)
11
- super
12
- end
13
-
14
- def biblio_preface(ref)
15
- if ref.at("./note[@type = 'boilerplate']")
16
- unwrap_boilerplate_clauses(ref, ".")
17
- else
18
- pref = @i18n.biblio_pref
19
- ref.at("./title").next = "<p>#{pref}</p>"
20
- end
21
- end
22
-
23
7
  def initial_boilerplate(xml, isodoc)
24
8
  intro_boilerplate(xml, isodoc)
25
- super
9
+ super if @document_scheme == "ieee-sa-2021"
10
+ initial_note(xml)
11
+ word_usage(xml)
12
+ participants(xml)
26
13
  end
27
14
 
28
15
  def intro_boilerplate(xml, isodoc)
29
16
  return unless intro = xml.at("//introduction/title")
30
17
 
31
18
  template = <<~ADM
32
- This introduction is not part of P{{ docnumeric }}{% if draft %}/D{{ draft }}{% endif %}, {{ doctitle }}
19
+ This introduction is not part of P{{ docnumeric }}{% if draft %}/D{{ draft }}{% endif %}, {{ full_doctitle }}
33
20
  ADM
34
21
  adm = isodoc.populate_template(template)
35
22
  intro.next = "<admonition>#{adm}</admonition>"
36
23
  end
37
24
 
25
+ def initial_note(xml)
26
+ n = xml.at("//boilerplate//note[@id = 'boilerplate_front']")
27
+ s = xml.at("//sections")
28
+ (n && s) or return
29
+ s.children.empty? and s << " "
30
+ s.children.first.previous = n.remove
31
+ end
32
+
33
+ def word_usage(xml)
34
+ return unless @document_scheme == "ieee-sa-2021"
35
+
36
+ n = xml.at("//boilerplate//clause[@id = 'boilerplate_word_usage']")
37
+ &.remove
38
+ s = xml.at("//clause[@type = 'overview']")
39
+ (n && s) or return
40
+ s << n
41
+ end
42
+
38
43
  def obligations_cleanup_norm(xml)
39
44
  super
40
45
  xml.xpath("//sections/clause").each do |r|
@@ -70,90 +75,150 @@ module Metanorma
70
75
  ins << "<fn><p>#{@i18n.note_inform_fn}</p></fn>"
71
76
  end
72
77
 
73
- def sort_biblio(bib)
74
- bib.sort do |a, b|
75
- sort_biblio_key(a) <=> sort_biblio_key(b)
78
+ def table_footnote_renumber1(fnote, idx, seen)
79
+ content = footnote_content(fnote)
80
+ idx += 1
81
+ if seen[content]
82
+ fnote.children = "<p>See Footnote #{seen[content]}.</p>"
83
+ else seen[content] = idx
76
84
  end
85
+ fnote["reference"] = (idx - 1 + "a".ord).chr
86
+ fnote["table"] = true
87
+ [idx, seen]
77
88
  end
78
89
 
79
- OTHERIDS = "@type = 'DOI' or @type = 'metanorma' or @type = 'ISSN' or "\
80
- "@type = 'ISBN'".freeze
90
+ def other_footnote_renumber1(fnote, idx, seen)
91
+ return [idx, seen] if fnote["table"]
81
92
 
82
- def sort_biblio_key(bib)
83
- id = bib.at("./docidentifier[not(#{OTHERIDS})]")
84
- title = bib.at("./title[@type = 'main']") ||
85
- bib.at("./title") || bib.at("./formattedref")
86
- "#{id&.text || 'ZZZZZ'} :: #{title&.text}"
93
+ content = footnote_content(fnote)
94
+ idx += 1
95
+ if seen[content]
96
+ fnote.children = "<p>See Footnote #{seen[content]}.</p>"
97
+ else seen[content] = idx
98
+ end
99
+ fnote["reference"] = idx.to_s
100
+ [idx, seen]
87
101
  end
88
102
 
89
- def normref_cleanup(xmldoc)
103
+ TERM_CLAUSE = "//sections//terms".freeze
104
+
105
+ def termdef_boilerplate_insert(xmldoc, isodoc, once = false)
106
+ once = true
90
107
  super
91
- normref_reorder(xmldoc)
92
108
  end
93
109
 
94
- def normref_reorder(xmldoc)
95
- xmldoc.xpath("//references[@normative = 'true']").each do |r|
96
- biblio_reorder1(r)
97
- end
110
+ def term_defs_boilerplate_cont(src, term, isodoc); end
111
+
112
+ def termlookup_cleanup(xmldoc)
113
+ Metanorma::IEEE::TermLookupCleanup.new(xmldoc, @log).call
98
114
  end
99
115
 
100
- # end of citeas generation
101
- def quotesource_cleanup(xmldoc)
102
- super
103
- trademark_ieee_erefs(xmldoc)
116
+ def boilerplate_isodoc(xmldoc)
117
+ x = xmldoc.dup
118
+ x.root.add_namespace(nil, self.class::XML_NAMESPACE)
119
+ xml = Nokogiri::XML(x.to_xml)
120
+ i = isodoc(@lang, @script)
121
+ i.bibdata_i18n(xml.at("//xmlns:bibdata"))
122
+ i.info(xml, nil)
123
+ i
104
124
  end
105
125
 
106
- # Style manual 12.3.5
107
- def trademark_ieee_erefs(xmldoc)
108
- ieee = xmldoc.xpath("//references/bibitem")
109
- .each_with_object({}) do |b, m|
110
- n = b.at("./contributor[role/@type = 'publisher']/organization/name")
111
- n&.text == "Institute of Electrical and Electronics Engineers" and
112
- m[b["id"]] = true
113
- end
114
- trademark_ieee_erefs1(xmldoc, "//preface//eref", ieee)
115
- trademark_ieee_erefs1(xmldoc, "//sections//eref | //annex//eref", ieee)
126
+ def participants(xml)
127
+ return unless @document_scheme == "ieee-sa-2021"
128
+
129
+ { "boilerplate-participants-wg": "working group",
130
+ "boilerplate-participants-bg": "balloting group",
131
+ "boilerplate-participants-sb": "standards board" }.each do |k, v|
132
+ populate_participants(xml, k.to_s, v)
133
+ end
134
+ p = xml.at(".//p[@type = 'emeritus_sign']")
135
+ ul = xml.at("//clause[@id = 'boilerplate-participants-sb']//ul")
136
+ p && ul and ul.next = p
137
+ xml.at("//clause[@type = 'participants']")&.remove
116
138
  end
117
139
 
118
- def trademark_ieee_erefs1(xmldoc, path, ieee)
119
- xmldoc.xpath(path).each_with_object({}) do |e, m|
120
- ieee[e["bibitemid"]] or next
121
- m[e["bibitemid"]] or e["citeas"] += "\u2122"
122
- m[e["bibitemid"]] = true
140
+ def populate_participants(xml, target, subtitle)
141
+ t = xml.at("//clause[@id = '#{target}']/membership")
142
+ s = xml.xpath("//clause[@type = 'participants']/clause").detect do |x|
143
+ n = x.at("./title") and n.text.strip.downcase == subtitle
123
144
  end
145
+ t.replace(populate_participants1(s || t))
124
146
  end
125
147
 
126
- def termdef_cleanup(xmldoc)
127
- term_reorder(xmldoc)
128
- super
148
+ def populate_participants1(clause)
149
+ participants_dl_to_ul(clause)
150
+ clause.xpath(".//ul | .//ol").each do |ul|
151
+ ul.name = "ul"
152
+ ul.xpath("./li").each { |li| populate_participants2(li) }
153
+ ul.xpath(".//p[normalize-space() = '']").each(&:remove)
154
+ end
155
+ clause.children.to_xml
129
156
  end
130
157
 
131
- def term_reorder(xmldoc)
132
- xmldoc.xpath("//terms").each do |t|
133
- term_reorder1(t)
158
+ def participants_dl_to_ul(clause)
159
+ clause.xpath(".//dl").each do |dl|
160
+ next unless dl.ancestors("dl, ul, ol").empty?
161
+
162
+ dl.name = "ul"
163
+ dl.xpath("./dt").each(&:remove)
164
+ dl.xpath("./dd").each { |li| li.name = "li" }
134
165
  end
135
166
  end
136
167
 
137
- def term_reorder1(terms)
138
- ins = terms.at("./term")&.previous_element or return
139
- coll = terms.xpath("./term")
140
- ret = sort_terms(coll)
141
- coll.each(&:remove)
142
- ret.reverse.each { |t| ins.next = t }
168
+ def populate_participants2(list)
169
+ if dl = list.at("./dl")
170
+ ret = extract_participants(dl)
171
+ dl.children = ret.keys.map do |k|
172
+ "<dt>#{k}</dt><dd>#{ret[k]}</dd>"
173
+ end.join
174
+ else
175
+ list.children = "<dl><dt>name</dt><dd>#{list.children.to_xml}</dd>"\
176
+ "<dt>role</dt><dd>member</dd></dl>"
177
+ end
143
178
  end
144
179
 
145
- def sort_terms(terms)
146
- terms.sort do |a, b|
147
- sort_terms_key(a) <=> sort_terms_key(b)
180
+ def extract_participants(dlist)
181
+ key = ""
182
+ map = dlist.xpath("./dt | ./dd").each_with_object({}) do |dtd, m|
183
+ (dtd.name == "dt" and key = dtd.text.sub(/:+$/, "")) or
184
+ m[key.strip.downcase] =
185
+ @c.encode(@c.decode(dtd.text.strip), :hexadecimal)
148
186
  end
187
+ map["role"] ||= "member"
188
+ map
149
189
  end
150
190
 
151
- def sort_terms_key(term)
152
- d = term.at("./preferred/expression/name | "\
153
- "./preferred/letter-designation/name | "\
154
- "./preferred/graphical-symbol/figure/name | "\
155
- "./preferred/graphical-symbol/figure/@id")
156
- d.text.downcase
191
+ def bibdata_cleanup(xmldoc)
192
+ super
193
+ provenance_title(xmldoc)
194
+ end
195
+
196
+ def provenance_title(xmldoc)
197
+ u = xmldoc.xpath("//bibdata/relation[@type = 'updates']")
198
+ m = xmldoc.xpath("//bibdata/relation[@type = 'merges']")
199
+ u.empty? and m.empty? and return
200
+ ins = xmldoc.at("//bibdata/title")
201
+ t = provenance_title1(u, m)
202
+ ins.next = "<title type='provenance' language='en' "\
203
+ "format='application/xml'>#{t}</title>"
204
+ end
205
+
206
+ def provenance_title1(updates, merges)
207
+ ret = ""
208
+ u = @isodoc.i18n.boolean_conj(tm_id_extract(updates), "and")
209
+ m = @isodoc.i18n.boolean_conj(tm_id_extract(merges), "and")
210
+ u.empty? or ret += "Revision of #{u}"
211
+ !u.empty? && !m.empty? and ret += "<br/>"
212
+ m.empty? or ret += "Incorporates #{m}"
213
+ ret
214
+ end
215
+
216
+ def tm_id_extract(relations)
217
+ relations.map do |u|
218
+ u.at("./bibitem/docidentifier[@scope = 'trademark']") ||
219
+ u.at("./bibitem/docidentifier[@primary = 'true']") ||
220
+ u.at("./bibitem/docidentifier")
221
+ end.map(&:text)
157
222
  end
158
223
  end
159
224
  end
@@ -0,0 +1,126 @@
1
+ module Metanorma
2
+ module IEEE
3
+ class Converter < Standoc::Converter
4
+ BIBLIO =
5
+ "//bibliography/references[@normative = 'false'][not(@hidden)] | "\
6
+ "//bibliography/clause[.//references[@normative = 'false']] | "\
7
+ "//annex//references[@normative = 'false'][not(@hidden)]".freeze
8
+
9
+ def boilerplate_cleanup(xmldoc)
10
+ f = xmldoc.at(BIBLIO) and biblio_preface(f)
11
+ super
12
+ end
13
+
14
+ def biblio_preface(ref)
15
+ if ref.at("./note[@type = 'boilerplate']")
16
+ unwrap_boilerplate_clauses(ref, ".")
17
+ else
18
+ pref = @i18n.biblio_pref
19
+ ref.at("./title").next = "<p>#{pref}</p>"
20
+ end
21
+ end
22
+
23
+ def sort_biblio(bib)
24
+ bib.sort do |a, b|
25
+ sort_biblio_key(a) <=> sort_biblio_key(b)
26
+ end
27
+ end
28
+
29
+ OTHERIDS = "@type = 'DOI' or @type = 'metanorma' or @type = 'ISSN' or "\
30
+ "@type = 'ISBN'".freeze
31
+
32
+ # Alphabetic by rendering: author surname or designation, followed by title
33
+ def sort_biblio_key(bib)
34
+ name = designator_or_name(bib)
35
+ title = bib.at("./title[@type = 'main']")&.text ||
36
+ bib.at("./title")&.text || bib.at("./formattedref")&.text
37
+ title.gsub!(/[[:punct:]]/, "")
38
+ "#{name}. #{title}"
39
+ end
40
+
41
+ def designator_or_name(bib)
42
+ case bib["type"]
43
+ when "standard", "techreport"
44
+ n = bib.at("./docidentifier[@primary]") ||
45
+ bib.at("./docidentifier[not(#{OTHERIDS})]")
46
+ n&.text || "ZZZZ"
47
+ else
48
+ bib1 = bib.dup
49
+ bib1.add_namespace(nil, self.class::XML_NAMESPACE)
50
+ i = IsoDoc::IEEE::PresentationXMLConvert.new({ lang: @lang,
51
+ script: @script })
52
+ i.i18n_init(@lang, @script)
53
+ i.creatornames(bib1)
54
+ end
55
+ end
56
+
57
+ def normref_cleanup(xmldoc)
58
+ super
59
+ normref_reorder(xmldoc)
60
+ end
61
+
62
+ def normref_reorder(xmldoc)
63
+ xmldoc.xpath("//references[@normative = 'true']").each do |r|
64
+ biblio_reorder1(r)
65
+ end
66
+ end
67
+
68
+ # end of citeas generation
69
+ def quotesource_cleanup(xmldoc)
70
+ super
71
+ trademark_ieee_erefs(xmldoc)
72
+ end
73
+
74
+ # Style manual 12.3.5
75
+ def trademark_ieee_erefs(xmldoc)
76
+ ieee = xmldoc.xpath("//references/bibitem")
77
+ .each_with_object({}) do |b, m|
78
+ n = b.at("./contributor[role/@type = 'publisher']/organization/name")
79
+ n&.text == "Institute of Electrical and Electronics Engineers" and
80
+ m[b["id"]] = b.at("./docidentifier[@scope = 'trademark']")&.text
81
+ end
82
+ trademark_ieee_erefs1(xmldoc, "//preface//eref", ieee)
83
+ trademark_ieee_erefs1(xmldoc, "//sections//eref | //annex//eref", ieee)
84
+ end
85
+
86
+ def trademark_ieee_erefs1(xmldoc, path, ieee)
87
+ xmldoc.xpath(path).each_with_object({}) do |e, m|
88
+ ieee[e["bibitemid"]] or next
89
+ m[e["bibitemid"]] or e["citeas"] = ieee[e["bibitemid"]]
90
+ m[e["bibitemid"]] = true
91
+ end
92
+ end
93
+
94
+ def biblio_renumber(xmldoc)
95
+ i = 0
96
+ xmldoc.xpath("//references[not(@normative = 'true')]"\
97
+ "[not(@hidden = 'true')]").each do |r|
98
+ r.xpath("./bibitem[not(@hidden = 'true')]").each do |b|
99
+ i += 1
100
+ biblio_renumber1(b, i)
101
+ end
102
+ end
103
+ end
104
+
105
+ def biblio_renumber1(bib, idx)
106
+ docid = bib.at("./docidentifier[@type = 'metanorma' or "\
107
+ "@type = 'metanorma-ordinal']")
108
+ if /^\[?\d+\]?$/.match?(docid&.text)
109
+ docid.children = "[B#{idx}]"
110
+ elsif docid = bib.at("./docidentifier") || bib.at("./title[last()]") ||
111
+ bib.at("./formattedref")
112
+ docid.next =
113
+ "<docidentifier type='metanorma-ordinal'>[B#{idx}]</docidentifier>"
114
+ end
115
+ end
116
+
117
+ def select_docid(ref)
118
+ ret = super
119
+ if %w(standard techreport).include?(ref["type"]) then ret
120
+ else
121
+ ref.at("./docidentifier[@type = 'metanorma-ordinal']") || ret
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
@@ -16,6 +16,7 @@ module Metanorma
16
16
 
17
17
  def init(node)
18
18
  super
19
+ @document_scheme ||= "ieee-sa-2021"
19
20
  @hierarchical_assets = node.attr("hierarchical-object-numbering")
20
21
  end
21
22
 
@@ -34,10 +35,17 @@ module Metanorma
34
35
  when "Overview" then attrs[:type] = "overview"
35
36
  when "Scope" then attrs[:type] = "scope"
36
37
  when "Word Usage" then attrs[:type] = "word-usage"
38
+ when "Participants" then attrs[:type] = "participants"
37
39
  end
38
40
  super
39
41
  end
40
42
 
43
+ def termsource_attrs(node, matched)
44
+ ret = super
45
+ node.option? "adapted" and ret[:status] = "adapted"
46
+ ret
47
+ end
48
+
41
49
  def outputs(node, ret)
42
50
  File.open("#{@filename}.xml", "w:UTF-8") { |f| f.write(ret) }
43
51
  presentation_xml_converter(node).convert("#{@filename}.xml")