metanorma-ieee 0.0.2 → 0.0.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.
@@ -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)
@@ -128,6 +93,8 @@ module IsoDoc
128
93
  doctype(isoxml, _out)
129
94
  set(:full_doctitle, fulltitle(@metadata[:doctype], draft))
130
95
  set(:abbrev_doctitle, fulltitle(@metadata[:doctype_abbrev], draft))
96
+ prov = isoxml&.at(ns("//bibdata/title[@type='provenance']")) and
97
+ set(:provenance_doctitle, prov.children.to_xml)
131
98
  end
132
99
 
133
100
  def fulltitle(type, draft)
@@ -136,21 +103,17 @@ module IsoDoc
136
103
  title
137
104
  end
138
105
 
139
- def relations(isoxml, _out)
140
- super
141
- relations_get(isoxml, "updates")
142
- relations_get(isoxml, "merges")
143
- end
144
-
145
- def relations_get(isoxml, type)
146
- std = isoxml.xpath(ns("//bibdata/relation[@type = '#{type}']"))
147
- return if std.empty?
106
+ def ddMMMyyyy(isodate)
107
+ return nil if isodate.nil?
148
108
 
149
- ret = std.map do |x|
150
- x.at(ns(".//docidentifier[@primary = 'true']"))&.text ||
151
- x.at(ns(".//docidentifier"))&.text
109
+ arr = isodate.split("-")
110
+ if arr.size == 1 && (/^\d+$/.match isodate)
111
+ Date.new(*arr.map(&:to_i)).strftime("%Y")
112
+ elsif arr.size == 2
113
+ Date.new(*arr.map(&:to_i)).strftime("%b %Y")
114
+ else
115
+ Date.parse(isodate).strftime("%d %b %Y")
152
116
  end
153
- set(type.to_sym, ret)
154
117
  end
155
118
  end
156
119
  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,81 @@
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[:author]} " + 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")) ||
27
+ b.at(ns("./formattedref")))&.text,
28
+ author: @author[b["id"]] || (b.at(ns("./title")) ||
29
+ b.at(ns("./formattedref")))&.text,
30
+ ord: b.at(ns("./docidentifier[@type = 'metanorma' or "\
31
+ "@type = 'metanorma-ordinal']")).text }
32
+ end
33
+ end
34
+
35
+ def bibrenderer
36
+ ::Relaton::Render::IEEE::General.new(language: @lang,
37
+ i18nhash: @i18n.get)
38
+ end
39
+
40
+ def citestyle
41
+ "author-date"
42
+ end
43
+
44
+ def references_render(docxml)
45
+ @author = {}
46
+ super
47
+ end
48
+
49
+ def bibrender_relaton(xml, renderings)
50
+ f = renderings[xml["id"]][:formattedref]
51
+ f &&= "<formattedref>#{f}</formattedref>"
52
+ xml.children =
53
+ "#{f}#{xml.xpath(ns('./docidentifier | ./uri | ./note | ./title'))
54
+ .to_xml}"
55
+ @author[xml["id"]] = renderings[xml["id"]][:author]
56
+ end
57
+
58
+ def creatornames(bibitem)
59
+ ::Relaton::Render::IEEE::General
60
+ .new(language: @lang, i18nhash: @i18n.get,
61
+ template: { (bibitem["type"] || "misc").to_sym =>
62
+ "{{ creatornames }}" })
63
+ .parse1(RelatonBib::XMLParser.from_xml(bibitem.to_xml))
64
+ end
65
+
66
+ def bibliography_bibitem_number1(bibitem, idx)
67
+ if mn = bibitem.at(ns(".//docidentifier[@type = 'metanorma']"))
68
+ /^\[?\d\]?$/.match?(mn&.text) and
69
+ idx = mn.text.sub(/^\[B?/, "").sub(/\]$/, "").to_i
70
+ end
71
+ unless bibliography_bibitem_number_skip(bibitem)
72
+
73
+ idx += 1
74
+ bibitem.at(ns(".//docidentifier")).previous =
75
+ "<docidentifier type='metanorma-ordinal'>[B#{idx}]</docidentifier>"
76
+ end
77
+ idx
78
+ end
79
+ end
80
+ end
81
+ 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,19 +21,29 @@ 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
+ return "<p>#{ret.join}</p>"
35
+ end
36
+ coll.map { |c| c.children.to_xml }.join
26
37
  end
27
38
 
28
39
  def unwrap_definition(docxml)
29
40
  docxml.xpath(ns("//definition/verbal-definition")).each do |v|
30
41
  next unless v.elements.all? { |e| %w(termsource p).include?(e.name) }
31
42
 
32
- s = v.xpath(ns("./termsource"))
33
43
  p = v.xpath(ns("./p"))
34
44
  v.children =
35
- "<p>#{p.map(&:children).map(&:to_xml).join("\n")}</p>#{s.to_xml}"
45
+ "<p>#{p.map(&:children).map(&:to_xml).join("\n")}</p>"\
46
+ "#{v.xpath(ns('./termsource')).to_xml}"
36
47
  end
37
48
  super
38
49
  end
@@ -49,21 +60,28 @@ module IsoDoc
49
60
  def term_related_collapse(coll)
50
61
  prev = 0
51
62
  coll[1..-1].each_with_index do |r, i|
52
- if coll[prev]["type"] == r["type"]
53
- coll[prev].at(ns("./preferred")) << "; #{r.at(ns('./preferred'))
54
- .children.to_xml}"
55
- r.remove
56
- else prev = i
63
+ if coll[prev]["type"] != r["type"]
64
+ prev = i
65
+ next
57
66
  end
67
+ coll[prev].at(ns("./preferred")) << "; #{r.at(ns('./preferred'))
68
+ .children.to_xml}"
69
+ r.remove
58
70
  end
59
71
  end
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
- "./preferred/graphical-symbol/figure/@id"))
66
- d&.text&.downcase
77
+ "./preferred/graphical-symbol/figure/@id | "\
78
+ "./preferred"))
79
+ f = term.at(ns("./field-of-application")) || term.at(ns("./domain"))
80
+ HTMLEntities.new.decode("#{sort_terms_key1(d)} :: #{sort_terms_key1(f)}")
81
+ end
82
+
83
+ def sort_terms_key1(elem)
84
+ elem&.text&.strip&.downcase || "zzzz"
67
85
  end
68
86
 
69
87
  def term_related_reorder(coll)
@@ -98,22 +116,52 @@ module IsoDoc
98
116
  end
99
117
 
100
118
  def admitted_to_related(docxml)
101
- 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>"
119
+ docxml.xpath(ns("//term")).each do |t|
120
+ t.xpath(ns("./admitted | ./preferred")).each_with_index do |a, i|
121
+ (i.zero? ||
122
+ a.at(ns("./abbreviation-type | ./graphical-symbol"))) and next
123
+ admitted_to_related1(a, t.at(ns("./preferred")))
124
+ end
105
125
  end
126
+ term_reorder(docxml)
106
127
  end
107
128
 
108
- def collapse_term(docxml)
109
- docxml.xpath(ns("//term")).each do |t|
110
- collapse_term1(t)
129
+ def admitted_to_related1(adm, pref)
130
+ new = adm.dup
131
+ adm["type"] = "equivalent"
132
+ adm.name = "related"
133
+ adm.children = "<preferred>#{adm.children.to_xml}</preferred>"
134
+ adm.parent.next = <<~TERM
135
+ <term><preferred>#{new.children.to_xml}</preferred>
136
+ <related type='see'><preferred>#{pref.children.to_xml}</preferred></related></term>
137
+ TERM
138
+ end
139
+
140
+ def term_reorder(xmldoc)
141
+ xmldoc.xpath(ns("//terms")).each { |t| term_reorder1(t) }
142
+ end
143
+
144
+ def term_reorder1(terms)
145
+ ins = terms.at(ns("./term"))&.previous_element or return
146
+ coll = terms.xpath(ns("./term"))
147
+ ret = sort_terms(coll)
148
+ coll.each(&:remove)
149
+ ret.reverse.each { |t| ins.next = t }
150
+ end
151
+
152
+ def sort_terms(terms)
153
+ terms.sort do |a, b|
154
+ sort_terms_key(a) <=> sort_terms_key(b)
111
155
  end
112
156
  end
113
157
 
158
+ def collapse_term(docxml)
159
+ docxml.xpath(ns("//term")).each { |t| collapse_term1(t) }
160
+ end
161
+
114
162
  def collapse_term1(term)
115
163
  ret = collapse_term_template(
116
- pref: term.at(ns("./preferred")).remove,
164
+ pref: term.at(ns("./preferred"))&.remove,
117
165
  def: term.at(ns("./definition")),
118
166
  rels: term.xpath(ns("./related")).map(&:remove),
119
167
  source: term.at(ns("./termsource")),
@@ -124,8 +172,9 @@ module IsoDoc
124
172
 
125
173
  def collapse_term_related(rels)
126
174
  ret = rels.map do |r|
175
+ p = r.at(ns("./preferred"))
127
176
  "<em>#{@i18n.relatedterms[r['type']]}:</em> "\
128
- "#{r.at(ns('./preferred')).children.to_xml}"
177
+ "#{p&.children&.to_xml || '**RELATED TERM NOT FOUND**'}"
129
178
  end.join(". ")
130
179
  ret += "." unless ret.empty?
131
180
  ret
@@ -136,7 +185,7 @@ module IsoDoc
136
185
  src = nil
137
186
  opt[:source] and src = "(#{opt[:source].remove.children.to_xml.strip})"
138
187
  <<~TERM
139
- <p>#{opt[:pref].children.to_xml}: #{defn}
188
+ <p>#{opt[:pref]&.children&.to_xml || '**TERM NOT FOUND**'}: #{defn}
140
189
  #{collapse_term_related(opt[:rels])}
141
190
  #{src}</p>
142
191
  TERM
@@ -158,6 +207,14 @@ module IsoDoc
158
207
  while elem&.next_element&.name == "termsource"
159
208
  elem << "; #{elem.next_element.remove.children.to_xml}"
160
209
  end
210
+ adapt = termsource_adapt(elem["status"]) and
211
+ elem.children = l10n("#{adapt}#{elem.children.to_xml.strip}")
212
+ end
213
+
214
+ def termsource_adapt(status)
215
+ case status
216
+ when "adapted" then @i18n.adapted_from
217
+ end
161
218
  end
162
219
 
163
220
  def designation_field(desgn, name)
@@ -170,12 +227,15 @@ module IsoDoc
170
227
  end
171
228
 
172
229
  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
178
- end
230
+ pref =
231
+ term.at(ns("./preferred[not(abbreviation-type)]/expression/name"))
232
+ x = term.xpath(ns("./preferred[expression/name][abbreviation-type] | "\
233
+ "./admitted[expression/name][abbreviation-type]"))
234
+ (pref && !x.empty?) or return
235
+ tail = x.map do |p|
236
+ p.remove.at(ns("./expression/name")).children.to_xml.strip
237
+ end.join(", ")
238
+ pref << " (#{tail})"
179
239
  end
180
240
 
181
241
  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,129 @@ 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
+ affiliation_header(clause)
170
+ end
171
+
172
+ def affiliation_header(clause)
173
+ clause.xpath(ns(".//p[@type = 'officeorgrepmember']")).each do |p|
174
+ prev = p.previous_element
175
+ prev && prev.name == "p" &&
176
+ prev["type"] == "officeorgrepmember" and next
177
+ p.previous = <<~HDR
178
+ <p type='officeorgrepmemberhdr'><em>Organization
179
+ Represented</em><tab/><em>Name of Representative</em></p>
180
+ HDR
181
+ end
182
+ end
183
+
184
+ def participants1(list, idx)
185
+ key = ""
186
+ map = list.xpath(ns(".//dt | .//dd")).each_with_object({}) do |dtd, m|
187
+ (dtd.name == "dt" and key = dtd.text) or
188
+ m[key] = @c.encode(dtd.text.strip, :hexadecimal)
189
+ end
190
+ list.replace(participant_para(map, idx))
191
+ end
192
+
193
+ def participant_para(map, idx)
194
+ name = participant_name(map)
195
+ if map["role"]&.casecmp("member")&.zero?
196
+ participant_member_para(map, name, idx)
197
+ else
198
+ participant_officeholder_para(map, name, idx)
199
+ end
200
+ end
201
+
202
+ def participant_member_para(map, name, _idx)
203
+ if map["company"] && (map["name"] || map["surname"])
204
+ pers = map["name"] || "#{map['given']} #{map['surname']}"
205
+ "<p type='officeorgrepmember'>#{name}<tab/>#{pers}</p>"
206
+ elsif map["company"] then "<p type='officeorgmember'>#{name}</p>"
207
+ else "<p type='officemember'>#{name}</p>"
208
+ end
209
+ end
210
+
211
+ def participant_officeholder_para(map, name, idx)
212
+ name = "<strong>#{name}</strong>" if idx.zero?
213
+ br = map["role"].size > 30 ? "<br/>" : ""
214
+ "<p type='officeholder' align='center'>#{name}, #{br}"\
215
+ "<em>#{map['role']}</em></p>"
216
+ end
217
+
218
+ def participant_name(map)
219
+ map["company"] || map["name"] || "#{map['given']} #{map['surname']}"
169
220
  end
170
221
 
171
222
  include Init