metanorma-ieee 0.0.2 → 0.0.3

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.
@@ -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