metanorma-ieee 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,11 +6,13 @@ module IsoDoc
6
6
  class Metadata < IsoDoc::Metadata
7
7
  def initialize(lang, script, i18n, fonts_options = {})
8
8
  super
9
- @metadata[:confirmeddate] = "&lt;Date Approved&gt;"
9
+ @metadata[:issueddate] = "&lt;Date Approved&gt;"
10
10
  end
11
11
 
12
12
  def bibdate(isoxml, _out)
13
- super
13
+ isoxml.xpath(ns("//bibdata/date[@format = 'ddMMMyyyy']")).each do |d|
14
+ set("#{d['type'].gsub(/-/, '_')}date".to_sym, Common::date_range(d))
15
+ end
14
16
  draft = isoxml.at(ns("//bibdata/date[@type = 'issued']")) ||
15
17
  isoxml.at(ns("//bibdata/date[@type = 'circulated']")) ||
16
18
  isoxml.at(ns("//bibdata/date[@type = 'created']")) ||
@@ -25,8 +27,10 @@ module IsoDoc
25
27
  b = isoxml.at(ns("//bibdata/ext/doctype"))&.text or return
26
28
  set(:doctype, b.split(/[- ]/).map(&:capitalize).join(" "))
27
29
  set(:doctype_abbrev, @labels["doctype_abbrev"][b])
28
- s = isoxml.at(ns("//bibdata/ext/docsubtype"))&.text and
30
+ s = isoxml.at(ns("//bibdata/ext/subdoctype"))&.text and
29
31
  set(:docsubtype, s.split(/[- ]/).map(&:capitalize).join(" "))
32
+ s = isoxml.at(ns("//bibdata/ext/trial-use"))&.text and s == "true" and
33
+ set(:trial_use, true)
30
34
  end
31
35
 
32
36
  def author(xml, _out)
@@ -35,7 +39,6 @@ module IsoDoc
35
39
  tc(xml)
36
40
  wg(xml)
37
41
  bg(xml)
38
- std_group(xml)
39
42
  end
40
43
 
41
44
  def society(xml)
@@ -50,59 +53,17 @@ module IsoDoc
50
53
  set(:technical_committee, tc)
51
54
  end
52
55
 
53
- def editor_names(xml, role)
54
- xml.xpath(ns("//bibdata/contributor[role/@type = 'editor']"\
55
- "[role = '#{role}']/person/name/completename"))
56
- &.each&.map(&:text)
57
- end
58
-
59
- def editor_name(xml, role)
60
- editor_names(xml, role)&.first
61
- end
62
-
63
56
  def wg(xml)
64
57
  wg = xml.at(ns("//bibdata/ext/editorialgroup/"\
65
58
  "working-group")) or return nil
66
59
  set(:working_group, wg.text)
67
- m = {}
68
- ["Chair", "Vice-Chair", "Secretary"].each do |r|
69
- a = editor_name(xml, "Working Group #{r}") and
70
- m[r.downcase.gsub(/ /, "-")] = a
71
- end
72
- wg_members(xml, m)
73
- end
74
-
75
- def wg_members(xml, members)
76
- a = editor_names(xml, "Working Group Member") and members["members"] = a
77
- members["members"].empty? and (1..9).each do |i|
78
- members["members"] << "Participant#{i}"
79
- end
80
- set(:wg_members, members)
81
60
  end
82
61
 
83
62
  def bg(xml)
84
63
  bg = xml.at(ns("//bibdata/ext/editorialgroup/"\
85
64
  "balloting-group")) or return nil
86
65
  set(:balloting_group, bg.text)
87
- m = {}
88
- m["members"] = editor_names(xml, "Balloting Group Member")
89
- m["members"].empty? and (1..9).each do |i|
90
- m["members"] << "Balloter#{i}"
91
- end
92
- set(:balloting_group_members, m["members"])
93
- end
94
-
95
- def std_group(xml)
96
- m = {}
97
- ["Chair", "Vice-Chair", "Past Chair", "Secretary"].each do |r|
98
- m[r.downcase.gsub(/ /, "-")] =
99
- editor_name(xml, "Standards Board #{r}") || "&lt;Name&gt;"
100
- end
101
- m["members"] = editor_names(xml, "Standards Board Member")
102
- m["members"].empty? and (1..9).each do |i|
103
- m["members"] << "SBMember#{i}"
104
- end
105
- set(:std_board, m)
66
+ set(:balloting_group_type, bg["type"])
106
67
  end
107
68
 
108
69
  def otherid(isoxml, _out)
@@ -120,6 +81,10 @@ module IsoDoc
120
81
  set(:stdid_pdf, dn&.text || "STDXXXXX")
121
82
  dn = isoxml.at(ns("//#{id}[@scope = 'print']"))
122
83
  set(:stdid_print, dn&.text || "STDPDXXXXX")
84
+ dn = isoxml.at(ns("//bibdata/ext/structuredidentifier/amendment")) and
85
+ set(:amd, dn.text)
86
+ dn = isoxml.at(ns("//bibdata/ext/structuredidentifier/corrigendum")) and
87
+ set(:corr, dn.text)
123
88
  end
124
89
 
125
90
  def title(isoxml, _out)
@@ -152,6 +117,19 @@ module IsoDoc
152
117
  end
153
118
  set(type.to_sym, ret)
154
119
  end
120
+
121
+ def ddMMMyyyy(isodate)
122
+ return nil if isodate.nil?
123
+
124
+ arr = isodate.split("-")
125
+ if arr.size == 1 && (/^\d+$/.match isodate)
126
+ Date.new(*arr.map(&:to_i)).strftime("%Y")
127
+ elsif arr.size == 2
128
+ Date.new(*arr.map(&:to_i)).strftime("%b %Y")
129
+ else
130
+ Date.parse(isodate).strftime("%d %b %Y")
131
+ end
132
+ end
155
133
  end
156
134
  end
157
135
  end
@@ -12,8 +12,8 @@ module IsoDoc
12
12
  end
13
13
 
14
14
  def pdf_stylesheet(docxml)
15
- doctype = docxml&.at(ns("//bibdata/ext/doctype"))&.text
16
- if doctype == "amendment"
15
+ doctype = docxml&.at(ns("//bibdata/ext/subdoctype"))&.text
16
+ if %w(amendment corrigendum erratum).include?(doctype)
17
17
  "ieee.amendment.xsl"
18
18
  else
19
19
  "ieee.standard.xsl"
@@ -0,0 +1,70 @@
1
+ module IsoDoc
2
+ module IEEE
3
+ class PresentationXMLConvert < IsoDoc::PresentationXMLConvert
4
+ # Style manual 19
5
+ def anchor_linkend(node, linkend)
6
+ @bibanchors ||= biblio_ids_titles(node.document)
7
+ if node["citeas"] && i = @bibanchors[node["bibitemid"]]
8
+ biblio_anchor_linkend(node, i)
9
+ else super
10
+ end
11
+ end
12
+
13
+ def biblio_anchor_linkend(node, bib)
14
+ if %w(techreport standard).include?(bib[:type])
15
+ node["citeas"] + " #{bib[:ord]}"
16
+ else
17
+ "#{bib[:title]} " + node["citeas"]
18
+ end
19
+ end
20
+
21
+ def biblio_ids_titles(xmldoc)
22
+ xmldoc.xpath(ns("//references[@normative = 'false']/bibitem"))
23
+ .each_with_object({}) do |b, m|
24
+ m[b["id"]] =
25
+ { docid: pref_ref_code(b), type: b["type"],
26
+ title: b.at(ns("./title"))&.text ||
27
+ b.at(ns("./formattedref"))&.text,
28
+ ord: b.at(ns("./docidentifier[@type = 'metanorma' or "\
29
+ "@type = 'metanorma-ordinal']")).text }
30
+ end
31
+ end
32
+
33
+ def bibrenderer
34
+ ::Relaton::Render::IEEE::General.new(language: @lang,
35
+ i18nhash: @i18n.get)
36
+ end
37
+
38
+ def bibrender_relaton(xml)
39
+ bib = xml.dup
40
+ bib["suppress_identifier"] == true and
41
+ bib.xpath(ns("./docidentifier")).each(&:remove)
42
+ xml.children =
43
+ "#{bibrenderer.render(bib.to_xml)}"\
44
+ "#{xml.xpath(ns('./docidentifier | ./uri | ./note | ./title')).to_xml}"
45
+ end
46
+
47
+ def creatornames(bibitem)
48
+ ::Relaton::Render::IEEE::General
49
+ .new(language: @lang, i18nhash: @i18n.get,
50
+ template: { (bibitem["type"] || "misc").to_sym =>
51
+ "{{ creatornames }}" })
52
+ .parse1(RelatonBib::XMLParser.from_xml(bibitem.to_xml))
53
+ end
54
+
55
+ def bibliography_bibitem_number1(bibitem, idx)
56
+ if mn = bibitem.at(ns(".//docidentifier[@type = 'metanorma']"))
57
+ /^\[?\d\]?$/.match?(mn&.text) and
58
+ idx = mn.text.sub(/^\[B?/, "").sub(/\]$/, "").to_i
59
+ end
60
+ unless bibliography_bibitem_number_skip(bibitem)
61
+
62
+ idx += 1
63
+ bibitem.at(ns(".//docidentifier")).previous =
64
+ "<docidentifier type='metanorma-ordinal'>[B#{idx}]</docidentifier>"
65
+ end
66
+ idx
67
+ end
68
+ end
69
+ end
70
+ end
@@ -12,7 +12,8 @@ module IsoDoc
12
12
  c = IsoDoc::XrefGen::Counter.new("@")
13
13
  elem.xpath(ns("./definition")).each do |d|
14
14
  c.increment(d)
15
- d.elements.first.previous = "<strong>(#{c.print})</strong>&#xa0;"
15
+ d.elements.first.children.first.previous =
16
+ "<strong>(#{c.print})</strong>&#xa0;"
16
17
  end
17
18
  end
18
19
 
@@ -20,9 +21,20 @@ module IsoDoc
20
21
  ins = elem.at(ns("./definition")).previous_element
21
22
  coll = elem.xpath(ns("./definition"))
22
23
  coll.each(&:remove)
23
- ins.next = "<definition>#{coll.map do |c|
24
- c.children.to_xml
25
- end }</definition>"
24
+ ins.next = "<definition>#{unwrap_multidef(coll)}</definition>"
25
+ end
26
+
27
+ def unwrap_multidef(coll)
28
+ if coll.all? do |c|
29
+ c.elements.size == 1 && c.elements.first.name == "p"
30
+ end
31
+ ret = coll.map do |c|
32
+ c.elements.first.children.to_xml
33
+ end
34
+ "<p>#{ret.join}</p>"
35
+ else
36
+ coll.map { |c| c.children.to_xml }.join
37
+ end
26
38
  end
27
39
 
28
40
  def unwrap_definition(docxml)
@@ -60,10 +72,10 @@ module IsoDoc
60
72
 
61
73
  def sort_terms_key(term)
62
74
  d = term.at(ns("./preferred/expression/name | "\
63
- "./preferred/letter-designation/name | "\
75
+ "./preferred/letter-symbol/name | "\
64
76
  "./preferred/graphical-symbol/figure/name | "\
65
77
  "./preferred/graphical-symbol/figure/@id"))
66
- d&.text&.downcase
78
+ HTMLEntities.new.decode(d&.text&.strip&.downcase) || "ZZZ"
67
79
  end
68
80
 
69
81
  def term_related_reorder(coll)
@@ -99,21 +111,47 @@ module IsoDoc
99
111
 
100
112
  def admitted_to_related(docxml)
101
113
  docxml.xpath(ns("//term/admitted")).each do |a|
102
- a["type"] = "equivalent"
103
- a.name = "related"
104
- a.children = "<preferred>#{a.children.to_xml}</preferred>"
114
+ admitted_to_related1(a, a.parent.at(ns("./preferred")))
105
115
  end
116
+ term_reorder(docxml)
106
117
  end
107
118
 
108
- def collapse_term(docxml)
109
- docxml.xpath(ns("//term")).each do |t|
110
- collapse_term1(t)
119
+ def admitted_to_related1(adm, pref)
120
+ new = adm.dup
121
+ adm["type"] = "equivalent"
122
+ adm.name = "related"
123
+ adm.children = "<preferred>#{adm.children.to_xml}</preferred>"
124
+ adm.parent.next = <<~TERM
125
+ <term><preferred>#{new.children.to_xml}</preferred>
126
+ <related type='see'><preferred>#{pref.children.to_xml}</preferred></related></term>
127
+ TERM
128
+ end
129
+
130
+ def term_reorder(xmldoc)
131
+ xmldoc.xpath(ns("//terms")).each { |t| term_reorder1(t) }
132
+ end
133
+
134
+ def term_reorder1(terms)
135
+ ins = terms.at(ns("./term"))&.previous_element or return
136
+ coll = terms.xpath(ns("./term"))
137
+ ret = sort_terms(coll)
138
+ coll.each(&:remove)
139
+ ret.reverse.each { |t| ins.next = t }
140
+ end
141
+
142
+ def sort_terms(terms)
143
+ terms.sort do |a, b|
144
+ sort_terms_key(a) <=> sort_terms_key(b)
111
145
  end
112
146
  end
113
147
 
148
+ def collapse_term(docxml)
149
+ docxml.xpath(ns("//term")).each { |t| collapse_term1(t) }
150
+ end
151
+
114
152
  def collapse_term1(term)
115
153
  ret = collapse_term_template(
116
- pref: term.at(ns("./preferred")).remove,
154
+ pref: term.at(ns("./preferred"))&.remove,
117
155
  def: term.at(ns("./definition")),
118
156
  rels: term.xpath(ns("./related")).map(&:remove),
119
157
  source: term.at(ns("./termsource")),
@@ -124,8 +162,9 @@ module IsoDoc
124
162
 
125
163
  def collapse_term_related(rels)
126
164
  ret = rels.map do |r|
165
+ p = r.at(ns("./preferred"))
127
166
  "<em>#{@i18n.relatedterms[r['type']]}:</em> "\
128
- "#{r.at(ns('./preferred')).children.to_xml}"
167
+ "#{p&.children&.to_xml || '**RELATED TERM NOT FOUND**'}"
129
168
  end.join(". ")
130
169
  ret += "." unless ret.empty?
131
170
  ret
@@ -136,7 +175,7 @@ module IsoDoc
136
175
  src = nil
137
176
  opt[:source] and src = "(#{opt[:source].remove.children.to_xml.strip})"
138
177
  <<~TERM
139
- <p>#{opt[:pref].children.to_xml}: #{defn}
178
+ <p>#{opt[:pref]&.children&.to_xml || '**TERM NOT FOUND**'}: #{defn}
140
179
  #{collapse_term_related(opt[:rels])}
141
180
  #{src}</p>
142
181
  TERM
@@ -158,6 +197,14 @@ module IsoDoc
158
197
  while elem&.next_element&.name == "termsource"
159
198
  elem << "; #{elem.next_element.remove.children.to_xml}"
160
199
  end
200
+ adapt = termsource_adapt(elem["status"]) and
201
+ elem.children = l10n("#{adapt}#{elem.children.to_xml.strip}")
202
+ end
203
+
204
+ def termsource_adapt(status)
205
+ case status
206
+ when "adapted" then @i18n.adapted_from
207
+ end
161
208
  end
162
209
 
163
210
  def designation_field(desgn, name)
@@ -170,12 +217,12 @@ module IsoDoc
170
217
  end
171
218
 
172
219
  def merge_second_preferred(term)
173
- super
174
- term.xpath(ns("./preferred[expression/name]")).each_with_index do |p, i|
175
- unless i.zero?
176
- p.remove # whatever was eligible to display has already been merged
177
- end
220
+ prefs = term.xpath(ns("./preferred[expression/name]"))
221
+ prefs.size > 1 or return
222
+ alts = prefs[1..-1].map do |p|
223
+ p.remove.at(ns("./expression/name")).children.to_xml.strip
178
224
  end
225
+ prefs.first.at(ns("./expression/name")) << " (#{alts.join(', ')})"
179
226
  end
180
227
 
181
228
  def termnote1(elem)
@@ -1,5 +1,6 @@
1
1
  require_relative "init"
2
2
  require_relative "presentation_terms"
3
+ require_relative "presentation_ref"
3
4
  require "isodoc"
4
5
 
5
6
  module IsoDoc
@@ -53,35 +54,6 @@ module IsoDoc
53
54
  l10n(ret)
54
55
  end
55
56
 
56
- # Style manual 19
57
- def anchor_linkend(node, linkend)
58
- @bibanchors ||= biblio_ids_titles(node.document)
59
- if node["citeas"] && i = @bibanchors[node["bibitemid"]]
60
- biblio_anchor_linkend(node, i)
61
- else super
62
- end
63
- end
64
-
65
- def biblio_anchor_linkend(node, bib)
66
- if %w(techreport standard).include?(bib[:type])
67
- node["citeas"] + " #{bib[:ord]}"
68
- else
69
- "#{bib[:title]} " + node["citeas"]
70
- end
71
- end
72
-
73
- def biblio_ids_titles(xmldoc)
74
- xmldoc.xpath(ns("//references[@normative = 'false']/bibitem"))
75
- .each_with_object({}) do |b, m|
76
- m[b["id"]] =
77
- { docid: pref_ref_code(b), type: b["type"],
78
- title: b.at(ns("./title"))&.text ||
79
- b.at(ns("./formattedref"))&.text,
80
- ord: b.at(ns("./docidentifier[@type = 'metanorma' or "\
81
- "@type = 'metanorma-ordinal']")).text }
82
- end
83
- end
84
-
85
57
  def anchor_linkend1(node)
86
58
  linkend = @xrefs.anchor(node["target"], :xref)
87
59
  @xrefs.anchor(node["target"], :type) == "clause" &&
@@ -102,10 +74,8 @@ module IsoDoc
102
74
  return if elem.parent.name == "bibitem" || elem["notag"] == "true"
103
75
 
104
76
  n = @xrefs.get[elem["id"]]
105
- lbl = if n.nil? || n[:label].nil? || n[:label].empty?
106
- @i18n.note
107
- else
108
- l10n("#{@i18n.note} #{n[:label]}")
77
+ lbl = if n.nil? || n[:label].nil? || n[:label].empty? then @i18n.note
78
+ else l10n("#{@i18n.note} #{n[:label]}")
109
79
  end
110
80
  prefix_name(elem, block_delim, lbl, "name")
111
81
  end
@@ -124,48 +94,112 @@ module IsoDoc
124
94
  display_order_xpath(docxml, "//indexsect", i)
125
95
  end
126
96
 
127
- def bibrenderer
128
- ::Relaton::Render::IEEE::General.new(language: @lang,
129
- i18nhash: @i18n.get)
97
+ def annex1(elem)
98
+ lbl = @xrefs.anchor(elem["id"], :label)
99
+ if t = elem.at(ns("./title"))
100
+ t.children = "<strong>#{t.children.to_xml}</strong>"
101
+ end
102
+ prefix_name(elem, "<br/>", lbl, "title")
130
103
  end
131
104
 
132
- def bibrender_relaton(xml)
133
- bib = xml.dup
134
- bib["suppress_identifier"] == true and
135
- bib.xpath(ns("./docidentifier")).each(&:remove)
136
- xml.children =
137
- "#{bibrenderer.render(bib.to_xml)}"\
138
- "#{xml.xpath(ns('./docidentifier | ./uri | ./note | ./title')).to_xml}"
105
+ def bibdata_i18n(bib)
106
+ super
107
+ bibdata_dates(bib)
139
108
  end
140
109
 
141
- def creatornames(bibitem)
142
- ::Relaton::Render::IEEE::General
143
- .new(language: @lang, i18nhash: @i18n.get,
144
- template: { (bibitem["type"] || "misc").to_sym =>
145
- "{{ creatornames }}" })
146
- .parse1(RelatonBib::XMLParser.from_xml(bibitem.to_xml))
110
+ def bibdata_dates(bib)
111
+ bib.xpath(ns("./date")).each do |d|
112
+ d.next = d.dup
113
+ d.next["format"] = "ddMMMyyyy"
114
+ d.next.xpath(ns("./from | ./to | ./on")).each do |x|
115
+ x.children = ddMMMyyyy(x.text)
116
+ end
117
+ end
147
118
  end
148
119
 
149
- def bibliography_bibitem_number1(bibitem, idx)
150
- if mn = bibitem.at(ns(".//docidentifier[@type = 'metanorma']"))
151
- /^\[?\d\]?$/.match?(mn&.text) and
152
- idx = mn.text.sub(/^\[B?/, "").sub(/\]$/, "").to_i
120
+ def ddMMMyyyy(isodate)
121
+ return nil if isodate.nil?
122
+
123
+ arr = isodate.split("-")
124
+ if arr.size == 1 && (/^\d+$/.match isodate)
125
+ Date.new(*arr.map(&:to_i)).strftime("%Y")
126
+ elsif arr.size == 2
127
+ Date.new(*arr.map(&:to_i)).strftime("%b %Y")
128
+ else
129
+ Date.parse(isodate).strftime("%d %b %Y")
153
130
  end
154
- unless bibliography_bibitem_number_skip(bibitem)
131
+ end
155
132
 
156
- idx += 1
157
- bibitem.at(ns(".//docidentifier")).previous =
158
- "<docidentifier type='metanorma-ordinal'>[B#{idx}]</docidentifier>"
133
+ def amend1(elem)
134
+ elem.xpath(ns("./description/p")).each do |p|
135
+ p.children = p.children.to_xml.strip
136
+ amend_format(p)
159
137
  end
160
- idx
138
+ super
161
139
  end
162
140
 
163
- def annex1(elem)
164
- lbl = @xrefs.anchor(elem["id"], :label)
165
- if t = elem.at(ns("./title"))
166
- t.children = "<strong>#{t.children.to_xml}</strong>"
141
+ def amend_format(para)
142
+ 2.times do
143
+ para.children.size == 1 &&
144
+ %(em strong).include?(para.children.first.name) and
145
+ para.children = para.elements.first.children
167
146
  end
168
- prefix_name(elem, "<br/>", lbl, "title")
147
+ para.children = "<strong><em>#{para.children.to_xml}</em></strong>"
148
+ end
149
+
150
+ def section(docxml)
151
+ boilerplate(docxml)
152
+ super
153
+ end
154
+
155
+ def boilerplate(docxml)
156
+ docxml.xpath(ns("//clause[@id = 'boilerplate-participants']/"\
157
+ "clause/title")).each(&:remove)
158
+ docxml.xpath(ns("//clause[@id = 'boilerplate-participants']/clause"))
159
+ .each do |clause|
160
+ participants(clause)
161
+ end
162
+ end
163
+
164
+ def participants(clause)
165
+ clause.xpath(ns(".//ul")).each_with_index do |ulist, idx|
166
+ ulist.xpath(ns("./li")).each { |list| participants1(list, idx) }
167
+ ulist.replace(ulist.children)
168
+ end
169
+ end
170
+
171
+ def participants1(list, idx)
172
+ key = ""
173
+ map = list.xpath(ns(".//dt | .//dd")).each_with_object({}) do |dtd, m|
174
+ (dtd.name == "dt" and key = dtd.text) or
175
+ m[key] = dtd.text.strip
176
+ end
177
+ list.replace(participant_para(map, idx))
178
+ end
179
+
180
+ def participant_para(map, idx)
181
+ name = participant_name(map)
182
+ if map["role"]&.casecmp("member")&.zero?
183
+ participant_member_para(map, name, idx)
184
+ else
185
+ participant_officeholder_para(map, name, idx)
186
+ end
187
+ end
188
+
189
+ def participant_member_para(map, name, _idx)
190
+ (map["company"] and "<p type='officeorgmember'>#{name}</p>") or
191
+ "<p type='officemember'>#{name}</p>"
192
+ end
193
+
194
+ def participant_officeholder_para(map, name, idx)
195
+ name = "<strong>#{name}</strong>" if idx.zero?
196
+ br = map["role"].size > 30 ? "<br/>" : ""
197
+ "<p type='officeholder' align='center'>#{name}, #{br}"\
198
+ "<em>#{map['role']}</em></p>"
199
+ end
200
+
201
+ def participant_name(map)
202
+ map["company"] || map["name"] || "#{map['given']} #{map['surname']}"
169
203
  end
170
204
 
171
205
  include Init
@@ -53,9 +53,9 @@ module IsoDoc
53
53
  def officeholder_style(para)
54
54
  n = para.next_element
55
55
  p = para.previous_element
56
- n && n.name == "p" && n["type"] == "officeholder" and
56
+ n && n.name == "p" && n["type"] != "officeholder" and
57
57
  klass = "IEEEStdsNamesCtrCxSpLast"
58
- p && p.name == "p" && p["type"] == "officeholder" and
58
+ p && p.name == "p" && p["type"] != "officeholder" and
59
59
  klass = "IEEEStdsNamesCtrCxSpFirst"
60
60
  para["class"] = klass || "IEEEStdsNamesCtrCxSpMiddle"
61
61
  end
@@ -68,7 +68,8 @@ module IsoDoc
68
68
  BREAK
69
69
 
70
70
  def officemember_style(docxml)
71
- docxml.xpath("//p[@type = 'officemember']").each do |p|
71
+ docxml.xpath("//p[@type = 'officemember' or @type = 'officeorgmember']")
72
+ .each do |p|
72
73
  p["class"] = "IEEEStdsNamesList"
73
74
  end
74
75
  docxml.xpath("//p[@type = 'emeritus_sign']").each do |p|
@@ -85,6 +86,7 @@ module IsoDoc
85
86
 
86
87
  def three_column_officemembers_split(div)
87
88
  prev = false
89
+ div.xpath(".//div").each { |d| d.replace(d.children) }
88
90
  div.elements.each_with_object([[]]) do |e, m|
89
91
  member = e.name == "p" && e["type"] == "officemember"
90
92
  (prev == member and m[-1] << e.to_xml) or m << [e.to_xml]
@@ -12,6 +12,14 @@ module IsoDoc
12
12
  super
13
13
  end
14
14
 
15
+ def convert1(docxml, filename, dir)
16
+ doctype = docxml.at(ns("//bibdata/ext/doctype"))
17
+ if %w(amendment corrigendum).include?(doctype&.text)
18
+ @header = html_doc_path("header_amd.html")
19
+ end
20
+ super
21
+ end
22
+
15
23
  def default_fonts(options)
16
24
  { bodyfont: (if options[:script] == "Hans"
17
25
  '"Source Han Sans",serif'
@@ -65,6 +73,10 @@ module IsoDoc
65
73
  def middle_title_ieee(_docxml, out)
66
74
  out.p(**{ class: "IEEEStdsTitle", style: "margin-top:70.0pt" }) do |p|
67
75
  p << @meta.get[:full_doctitle]
76
+ @meta.get[:amd] || @meta.get[:corr] and p << "<br/>"
77
+ @meta.get[:amd] and p << "Amendment #{@meta.get[:amd]}"
78
+ @meta.get[:amd] && @meta.get[:corr] and p << " "
79
+ @meta.get[:corr] and p << "Corrigenda #{@meta.get[:corr]}"
68
80
  end
69
81
  end
70
82