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
@@ -46,6 +46,7 @@ module IsoDoc
46
46
  officeholder_style(p)
47
47
  end
48
48
  officemember_style(docxml)
49
+ officeorgrep_style(docxml)
49
50
  three_column_officemembers(docxml
50
51
  .at("//div[@id = 'boilerplate-participants']"))
51
52
  end
@@ -53,9 +54,9 @@ module IsoDoc
53
54
  def officeholder_style(para)
54
55
  n = para.next_element
55
56
  p = para.previous_element
56
- n && n.name == "p" && n["type"] == "officeholder" and
57
+ n && n.name == "p" && n["type"] != "officeholder" and
57
58
  klass = "IEEEStdsNamesCtrCxSpLast"
58
- p && p.name == "p" && p["type"] == "officeholder" and
59
+ p && p.name == "p" && p["type"] != "officeholder" and
59
60
  klass = "IEEEStdsNamesCtrCxSpFirst"
60
61
  para["class"] = klass || "IEEEStdsNamesCtrCxSpMiddle"
61
62
  end
@@ -68,7 +69,8 @@ module IsoDoc
68
69
  BREAK
69
70
 
70
71
  def officemember_style(docxml)
71
- docxml.xpath("//p[@type = 'officemember']").each do |p|
72
+ docxml.xpath("//p[@type = 'officemember' or @type = 'officeorgmember']")
73
+ .each do |p|
72
74
  p["class"] = "IEEEStdsNamesList"
73
75
  end
74
76
  docxml.xpath("//p[@type = 'emeritus_sign']").each do |p|
@@ -76,6 +78,19 @@ module IsoDoc
76
78
  end
77
79
  end
78
80
 
81
+ def officeorgrep_style(docxml)
82
+ docxml.xpath("//p[@type = 'officeorgrepmemberhdr']").each do |p|
83
+ p["class"] = "IEEEStdsNamesList"
84
+ p["style"] =
85
+ "margin-bottom:6.0pt;tab-stops:right 432.0pt;"
86
+ end
87
+ docxml.xpath("//p[@type = 'officeorgrepmember']").each do |p|
88
+ p["class"] = "IEEEStdsNamesList"
89
+ p["style"] =
90
+ "margin-top:6.0pt;tab-stops:right dotted 432.0pt;"
91
+ end
92
+ end
93
+
79
94
  def three_column_officemembers(div)
80
95
  return unless div
81
96
 
@@ -85,6 +100,7 @@ module IsoDoc
85
100
 
86
101
  def three_column_officemembers_split(div)
87
102
  prev = false
103
+ div.xpath(".//div").each { |d| d.replace(d.children) }
88
104
  div.elements.each_with_object([[]]) do |e, m|
89
105
  member = e.name == "p" && e["type"] == "officemember"
90
106
  (prev == member and m[-1] << e.to_xml) or m << [e.to_xml]
@@ -125,6 +141,10 @@ module IsoDoc
125
141
  docxml.at("//div[@class = 'boilerplate-feedback']")&.xpath("./div")
126
142
  &.each_with_index do |div, i|
127
143
  i.zero? or div.elements.first.previous = "<p>&#xa0;</p>"
144
+ i == 4 and
145
+ div.xpath(".//p[br]").each do |p|
146
+ p.replace(p.to_xml.gsub(%r{<br/>}, "</p><p>"))
147
+ end
128
148
  feedback_style1(div, i)
129
149
  end
130
150
  end
@@ -155,6 +175,56 @@ module IsoDoc
155
175
  end
156
176
  end
157
177
  end
178
+
179
+ def abstract_cleanup(docxml)
180
+ dest = docxml.at("div[@id = 'abstract-destination']") or return
181
+ if f = docxml.at("//div[@class = 'abstract']")
182
+ f.previous_element.remove
183
+ abstract_cleanup1(f, dest)
184
+ f.remove
185
+ elsif f = docxml.at("//div[@type = 'scope']")
186
+ abstract_cleanup1(f, dest)
187
+ abstract_header(dest)
188
+ end
189
+ end
190
+
191
+ def abstract_cleanup1(source, dest)
192
+ source.elements.reject { |e| %w(h1 h2).include?(e.name) }.each do |e|
193
+ e1 = e.dup
194
+ e1.xpath(".//p").each do |p|
195
+ p["style"] ||= ""
196
+ p["style"] = 'font-family: "Arial", sans-serif;' + p["style"]
197
+ end
198
+ %w(ul ol).include?(e1.name) or e1["class"] = "IEEEStdsAbstractBody"
199
+ dest << e1
200
+ end
201
+ end
202
+
203
+ def abstract_header(dest)
204
+ dest.elements.first.children.first.previous =
205
+ "<span class='IEEEStdsAbstractHeader'><span lang='EN-US'>"\
206
+ "Abstract:</span></span> "
207
+ end
208
+
209
+ def introduction_cleanup(docxml)
210
+ dest = docxml.at("div[@id = 'introduction-destination']") or return
211
+ unless i = docxml.at("//h1[@class = 'IntroTitle']")&.parent
212
+ dest.parent.remove
213
+ return
214
+ end
215
+ introduction_cleanup1(i, dest)
216
+ end
217
+
218
+ def introduction_cleanup1(intro, dest)
219
+ docxml = intro.document
220
+ intro.previous_element.remove
221
+ dest.replace(intro.remove)
222
+ i = docxml.at("//h1[@class = 'IntroTitle']")
223
+ if i.next_element.name == "div" &&
224
+ i.next_element["class"] == "IEEEStdsIntroduction"
225
+ i.next_element.name = "p"
226
+ end
227
+ end
158
228
  end
159
229
  end
160
230
  end
@@ -17,70 +17,65 @@ module IsoDoc
17
17
  @wordstylesheet.unlink if @wordstylesheet.is_a?(Tempfile)
18
18
  end
19
19
 
20
- def abstract_cleanup(docxml)
21
- dest = docxml.at("div[@id = 'abstract-destination']") or return
22
- if f = docxml.at("//div[@class = 'abstract']")
23
- f.previous_element.remove
24
- abstract_cleanup1(f, dest)
25
- f.remove
26
- elsif f = docxml.at("//div[@type = 'scope']")
27
- abstract_cleanup1(f, dest)
28
- end
29
- end
30
-
31
- def abstract_cleanup1(source, dest)
32
- source.elements.each do |e|
33
- next if %w(h1 h2).include?(e.name)
34
-
35
- dest << e.dup
36
- dest.elements.last["class"] = "IEEEStdsAbstractBody"
37
- end
38
- dest.elements.first.children.first.previous =
39
- "<span class='IEEEStdsAbstractHeader'><span lang='EN-US'>"\
40
- "Abstract:</span></span> "
41
- end
42
-
43
- def introduction_cleanup(docxml)
44
- dest = docxml.at("div[@id = 'introduction-destination']") or return
45
- unless i = docxml.at("//h1[@class = 'IntroTitle']")&.parent
46
- dest.parent.remove
47
- return
48
- end
49
- introduction_cleanup1(i, dest)
50
- end
51
-
52
- def introduction_cleanup1(intro, dest)
53
- docxml = intro.document
54
- intro.previous_element.remove
55
- dest.replace(intro.remove)
56
- i = docxml.at("//h1[@class = 'IntroTitle']")
57
- i.next_element == "div" && i.next_element["class"] == "Admonition" and
58
- i.next_element["class"] = "IEEEStdsIntroduction"
59
- end
60
-
61
20
  def word_cleanup(docxml)
62
21
  super
63
22
  abstract_cleanup(docxml)
64
23
  introduction_cleanup(docxml)
24
+ sourcecode_cleanup(docxml)
65
25
  div_cleanup(docxml)
26
+ biblio_cleanup(docxml)
66
27
  headings_cleanup(docxml)
67
- span_style_cleanup(docxml)
28
+ caption_cleanup(docxml)
29
+ table_cleanup(docxml)
68
30
  style_cleanup(docxml)
69
31
  para_type_cleanup(docxml)
70
32
  docxml
71
33
  end
72
34
 
35
+ def make_WordToC(docxml, level)
36
+ toc = ""
37
+ xpath = (1..level).each.map do |i|
38
+ "//h#{i}[not(ancestor::*[@class = 'WordSection2'])]"
39
+ end.join (" | ")
40
+ docxml.xpath(xpath).each do |h|
41
+ toc += word_toc_entry(h.name[1].to_i, header_strip(h))
42
+ end
43
+ toc.sub(/(<p class="MsoToc1">)/,
44
+ %{\\1#{word_toc_preface(level)}}) + WORD_TOC_SUFFIX1
45
+ end
46
+
47
+ def biblio_cleanup(docxml)
48
+ docxml.xpath("//p[@class = 'Biblio']").each do |p|
49
+ headings_strip(p)
50
+ end
51
+ end
52
+
73
53
  def headings_cleanup(docxml)
74
- (1..4).each do |i|
75
- docxml.xpath("//h#{i}").each do |h|
76
- headings_cleanup1(h)
77
- h.name = "p"
78
- h["class"] = "IEEEStdsLevel#{i}Header"
79
- end
54
+ (1..9).each { |i| headings_cleanup1(docxml, i) }
55
+ docxml.xpath("//div[@class = 'Annex']").each { |a| a.delete("class") }
56
+ end
57
+
58
+ def headings_cleanup1(docxml, idx)
59
+ docxml.xpath("//h#{idx}").each do |h|
60
+ headings_strip(h)
61
+ headings_style(h, idx)
62
+ end
63
+ end
64
+
65
+ def headings_style(hdr, idx)
66
+ if hdr.at("./ancestor::div[@class = 'Annex']")
67
+ hdr.delete("class")
68
+ hdr["style"] = "mso-list:l13 level#{idx} lfo33;"
69
+ elsif hdr.at("./ancestor::div[@class = 'Section3']")
70
+ hdr.name = "p"
71
+ hdr["class"] = "IEEEStdsLevel#{idx}frontmatter"
72
+ else
73
+ hdr.name = "p"
74
+ hdr["class"] = "IEEEStdsLevel#{idx}Header"
80
75
  end
81
76
  end
82
77
 
83
- def headings_cleanup1(hdr)
78
+ def headings_strip(hdr)
84
79
  if hdr.children.size > 1 && hdr.children[1].name == "span" &&
85
80
  hdr.children[1]["style"] == "mso-tab-count:1"
86
81
  2.times { hdr.children.first.remove }
@@ -100,28 +95,23 @@ module IsoDoc
100
95
  end
101
96
  end
102
97
 
103
- def para_type_cleanup(html)
104
- html.xpath("//p[@type]").each { |p| p.delete("type") }
105
- end
106
-
107
- def span_style_cleanup(html)
108
- html.xpath("//strong").each do |s|
109
- s.name = "span"
110
- s["class"] = "IEEEStdsParaBold"
111
- end
112
- html.xpath("//em").each do |s|
113
- s.name = "span"
114
- s["class"] = "IEEEStdsAddItal"
115
- end
116
- end
117
-
118
98
  STYLESMAP = {
99
+ example: "IEEEStdsParagraph",
119
100
  MsoNormal: "IEEEStdsParagraph",
120
- NormRef: "IEEEStdsBibliographicEntry",
101
+ NormRef: "IEEEStdsParagraph",
121
102
  Biblio: "IEEEStdsBibliographicEntry",
103
+ figure: "IEEEStdsImage",
104
+ formula: "IEEEStdsEquation",
105
+ Sourcecode: "IEEEStdsComputerCode",
106
+ TableTitle: "IEEEStdsRegularTableCaption",
107
+ FigureTitle: "IEEEStdsRegularFigureCaption",
122
108
  }.freeze
123
109
 
124
110
  def style_cleanup(docxml)
111
+ note_style_cleanup(docxml)
112
+ docxml.xpath("//div[@class = 'formula']/p").each do |p|
113
+ p["class"] = "IEEEStdsEquation"
114
+ end
125
115
  STYLESMAP.each do |k, v|
126
116
  docxml.xpath("//*[@class = '#{k}']").each { |s| s["class"] = v }
127
117
  end
@@ -0,0 +1,151 @@
1
+ module IsoDoc
2
+ module IEEE
3
+ class WordConvert < IsoDoc::WordConvert
4
+ def admonition_cleanup(docxml)
5
+ super
6
+ docxml.xpath("//div[@class = 'zzHelp']").each do |d|
7
+ d.xpath(".//p").each do |p|
8
+ %w(IEEEStdsWarning IEEEStdsParagraph).include?(p["class"]) ||
9
+ !p["class"] or next
10
+
11
+ p["class"] = "zzHelp"
12
+ end
13
+ end
14
+ docxml
15
+ end
16
+
17
+ def table_cleanup(docxml)
18
+ thead_cleanup(docxml)
19
+ tbody_cleanup(docxml)
20
+ end
21
+
22
+ def thead_cleanup(docxml)
23
+ docxml.xpath("//thead").each do |h|
24
+ h.xpath(".//td | .//th").each do |t|
25
+ if t.at("./p")
26
+ t.xpath("./p").each do |p|
27
+ p["class"] = "IEEEStdsTableColumnHead"
28
+ end
29
+ else
30
+ t.children =
31
+ "<p class='IEEEStdsTableColumnHead'>#{t.children.to_xml}</p>"
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ def tbody_cleanup(docxml)
38
+ docxml.xpath("//tbody | //tfoot").each do |h|
39
+ next if h.at("./ancestor::div[@class = 'boilerplate-feedback']")
40
+
41
+ h.xpath(".//th").each { |t| tbody_head_cleanup(t) }
42
+ h.xpath(".//td | .//th").each { |t| tbody_cleanup1(t) }
43
+ end
44
+ end
45
+
46
+ def tbody_head_cleanup(cell)
47
+ cell.at("./p") or
48
+ cell.children = "<p>#{cell.children.to_xml}</p>"
49
+ cell.xpath("./p").each do |p|
50
+ p.replace p.to_xml.gsub(%r{<br/>}, "</p><p>")
51
+ end
52
+ end
53
+
54
+ def tbody_cleanup1(cell)
55
+ if cell.at("./p")
56
+ cell.xpath("./p").each_with_index do |p, i|
57
+ p["class"] = td_style(cell, i)
58
+ end
59
+ else
60
+ cell.children =
61
+ "<p class='#{td_style(cell, 0)}'>#{cell.children.to_xml}</p>"
62
+ end
63
+ end
64
+
65
+ def td_style(cell, idx)
66
+ if cell.name == "th" && idx.zero? then "IEEEStdsTableLineHead"
67
+ elsif cell.name == "th" then "IEEEStdsTableLineSubhead"
68
+ elsif cell["align"] == "center" ||
69
+ /text-align:center/.match?(cell["style"])
70
+ "IEEEStdsTableData-Center"
71
+ else "IEEEStdsTableData-Left"
72
+ end
73
+ end
74
+
75
+ def caption_cleanup(docxml)
76
+ table_caption(docxml)
77
+ figure_caption(docxml)
78
+ example_caption(docxml)
79
+ end
80
+
81
+ def table_caption(docxml)
82
+ docxml.xpath("//p[@class = 'TableTitle']").each do |s|
83
+ s.children = s.children.to_xml
84
+ .sub(/^#{@i18n.table}(\s+[A-Z0-9.]+)?/, "")
85
+ end
86
+ end
87
+
88
+ def figure_caption(docxml)
89
+ docxml.xpath("//p[@class = 'FigureTitle']").each do |s|
90
+ s.children = s.children.to_xml
91
+ .sub(/^#{@i18n.figure}(\s+[A-Z0-9.]+)?/, "")
92
+ end
93
+ end
94
+
95
+ def example_caption(docxml)
96
+ docxml.xpath("//p[@class = 'example-title']").each do |s|
97
+ s.children = "<em>#{s.children.to_xml}</em>"
98
+ s["class"] = "IEEEStdsParagraph"
99
+ end
100
+ end
101
+
102
+ def sourcecode_cleanup(docxml)
103
+ docxml.xpath("//p[@class = 'Sourcecode']").each do |s|
104
+ s.replace(s.to_xml.gsub(%r{<br/>}, "</p><p class='Sourcecode'>"))
105
+ end
106
+ end
107
+
108
+ def para_type_cleanup(html)
109
+ html.xpath("//p[@type]").each { |p| p.delete("type") }
110
+ end
111
+
112
+ def note_style_cleanup(docxml)
113
+ docxml.xpath("//span[@class = 'note_label']").each do |s|
114
+ multi = /^#{@i18n.note}\s+[A-Z0-9.]+/.match?(s.text)
115
+ div = s.at("./ancestor::div[@class = 'Note']")
116
+ if multi
117
+ s.remove
118
+ seq = notesequence(div)
119
+ else seq = nil
120
+ end
121
+ note_style_cleanup1(multi, div, seq)
122
+ end
123
+ end
124
+
125
+ def notesequence(div)
126
+ @notesequences ||= { max: 0, lookup: {} }
127
+ unless id = @notesequences[:lookup][@xrefs.anchor(div["id"],
128
+ :sequence)]
129
+ @notesequences[:max] += 1
130
+ id = @notesequences[:max]
131
+ @notesequences[:lookup][@xrefs.anchor(div["id"], :sequence)] =
132
+ id
133
+ end
134
+ id
135
+ end
136
+
137
+ # hardcoded list style for notes
138
+ def note_style_cleanup1(multi, div, seq)
139
+ div.xpath(".//p[@class = 'Note' or not(@class)]")
140
+ .each_with_index do |p, i|
141
+ p["class"] =
142
+ i.zero? && multi ? "IEEEStdsMultipleNotes" : "IEEEStdsSingleNote"
143
+ if multi
144
+ p["style"] ||= ""
145
+ p["style"] += "mso-list:l17 level1 lfo#{seq};"
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end
@@ -1,6 +1,7 @@
1
1
  require "isodoc"
2
2
  require_relative "init"
3
3
  require_relative "word_cleanup"
4
+ require_relative "word_cleanup_blocks"
4
5
  require_relative "word_authority"
5
6
 
6
7
  module IsoDoc
@@ -11,6 +12,14 @@ module IsoDoc
11
12
  super
12
13
  end
13
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
+
14
23
  def default_fonts(options)
15
24
  { bodyfont: (if options[:script] == "Hans"
16
25
  '"Source Han Sans",serif'
@@ -35,8 +44,7 @@ module IsoDoc
35
44
  header: html_doc_path("header.html"),
36
45
  wordcoverpage: html_doc_path("word_ieee_titlepage.html"),
37
46
  wordintropage: html_doc_path("word_ieee_intro.html"),
38
- ulstyle: "l3",
39
- olstyle: "l2" }
47
+ ulstyle: "l11", olstyle: "l16" }
40
48
  end
41
49
 
42
50
  def abstract(isoxml, out)
@@ -65,6 +73,94 @@ 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]}"
80
+ end
81
+ end
82
+
83
+ def admonition_name_parse(_node, div, name)
84
+ div.p **{ class: "IEEEStdsWarning", style: "text-align:center;" } do |p|
85
+ p.b do |b|
86
+ name.children.each { |n| parse(n, b) }
87
+ end
88
+ end
89
+ end
90
+
91
+ def admonition_class(node)
92
+ if node["type"] == "editorial" then "zzHelp"
93
+ elsif node.ancestors("introduction").empty?
94
+ "IEEEStdsWarning"
95
+ else "IEEEStdsIntroduction"
96
+ end
97
+ end
98
+
99
+ def dt_dd?(node)
100
+ %w{dt dd}.include? node.name
101
+ end
102
+
103
+ def formula_where(dlist, out)
104
+ return unless dlist
105
+
106
+ dlist.elements.select { |n| dt_dd? n }.each_slice(2) do |dt, dd|
107
+ formula_where1(out, dt, dd)
108
+ end
109
+ end
110
+
111
+ def formula_where1(out, dterm, ddefn)
112
+ out.p **{ class: "IEEEStdsEquationVariableList" } do |p|
113
+ dterm.children.each { |n| parse(n, p) }
114
+ insert_tab(p, 1)
115
+ if ddefn.at(ns("./p"))
116
+ ddefn.elements.each do |e|
117
+ e.children.each { |n| parse(n, p) }
118
+ end
119
+ else ddefn.children.each { |n| parse(n, p) }
120
+ end
121
+ end
122
+ end
123
+
124
+ def annex_attrs(node)
125
+ { id: node["id"], class: "Annex" }
126
+ end
127
+
128
+ def annex_name(_annex, name, div)
129
+ preceding_floating_titles(name, div)
130
+ return if name.nil?
131
+
132
+ name&.at(ns("./strong"))&.remove # supplied by CSS list numbering
133
+ div.h1 **{ class: "Annex" } do |t|
134
+ annex_name1(name, t)
135
+ clause_parse_subtitle(name, t)
136
+ end
137
+ end
138
+
139
+ def annex_name1(name, out)
140
+ name.children.each do |c2|
141
+ if c2.name == "span" && c2["class"] == "obligation"
142
+ out.span **{ style: "font-weight:normal;" } do |s|
143
+ c2.children.each { |c3| parse(c3, s) }
144
+ end
145
+ else parse(c2, out)
146
+ end
147
+ end
148
+ end
149
+
150
+ def termnote_parse(node, out)
151
+ name = node&.at(ns("./name"))&.remove
152
+ out.div **note_attrs(node) do |div|
153
+ div.p do |p|
154
+ name and termnote_label(p, name)
155
+ para_then_remainder(node.first_element_child, node, p, div)
156
+ end
157
+ end
158
+ end
159
+
160
+ def termnote_label(para, name)
161
+ para.span **{ class: "note_label" } do |s|
162
+ name.children.each { |n| parse(n, s) }
163
+ s << termnote_delim
68
164
  end
69
165
  end
70
166
 
@@ -72,6 +72,37 @@ module IsoDoc
72
72
  )
73
73
  end
74
74
  end
75
+
76
+ def termnote_anchor_names(docxml)
77
+ docxml.xpath(ns("//*[termnote]")).each do |t|
78
+ c = Counter.new
79
+ sequence = UUIDTools::UUID.random_create.to_s
80
+ notes = t.xpath(ns("./termnote"))
81
+ notes.reject { |n| blank?(n["id"]) }.each do |n|
82
+ @anchors[n["id"]] =
83
+ anchor_struct("#{@labels['termnote']} #{increment_label(notes, n, c)}",
84
+ n,
85
+ @labels["note_xref"], "termnote", false)
86
+ .merge(sequence: sequence)
87
+ end
88
+ end
89
+ end
90
+
91
+ def note_anchor_names1(notes, counter)
92
+ sequence = UUIDTools::UUID.random_create.to_s
93
+ notes.each do |n|
94
+ next if @anchors[n["id"]] || blank?(n["id"])
95
+
96
+ @anchors[n["id"]] =
97
+ anchor_struct(increment_label(notes, n, counter), n,
98
+ @labels["note_xref"], "note", false)
99
+ .merge(sequence: sequence)
100
+ end
101
+ end
102
+
103
+ def annex_name_lbl(clause, num)
104
+ super.sub(%r{<br/>(.*)$}, "<br/><span class='obligation'>\\1</span>")
105
+ end
75
106
  end
76
107
  end
77
108
  end