metanorma-ieee 0.0.1 → 0.0.2

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.
Files changed (38) 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/html_ieee_titlepage.html +11 -0
  9. data/lib/isodoc/ieee/html/htmlstyle.css +2 -1
  10. data/lib/isodoc/ieee/html/htmlstyle.scss +1 -0
  11. data/lib/isodoc/ieee/html/ieee.css +23 -255
  12. data/lib/isodoc/ieee/html/ieee.scss +22 -239
  13. data/lib/isodoc/ieee/html/word_ieee_intro.html +1 -1
  14. data/lib/isodoc/ieee/html/wordstyle.css +20 -23
  15. data/lib/isodoc/ieee/html/wordstyle.scss +20 -17
  16. data/lib/isodoc/ieee/i18n-en.yaml +4 -0
  17. data/lib/isodoc/ieee/ieee.amendment.xsl +1835 -736
  18. data/lib/isodoc/ieee/ieee.standard.xsl +1835 -736
  19. data/lib/isodoc/ieee/metadata.rb +25 -4
  20. data/lib/isodoc/ieee/presentation_terms.rb +15 -2
  21. data/lib/isodoc/ieee/presentation_xml_convert.rb +85 -0
  22. data/lib/isodoc/ieee/word_authority.rb +54 -0
  23. data/lib/isodoc/ieee/word_cleanup.rb +55 -65
  24. data/lib/isodoc/ieee/word_cleanup_blocks.rb +151 -0
  25. data/lib/isodoc/ieee/word_convert.rb +86 -2
  26. data/lib/isodoc/ieee/xref.rb +31 -0
  27. data/lib/metanorma/ieee/boilerplate.xml +4 -4
  28. data/lib/metanorma/ieee/cleanup.rb +37 -73
  29. data/lib/metanorma/ieee/cleanup_ref.rb +117 -0
  30. data/lib/metanorma/ieee/front.rb +14 -10
  31. data/lib/metanorma/ieee/isodoc.rng +16 -0
  32. data/lib/metanorma/ieee/validate.rb +50 -6
  33. data/lib/metanorma/ieee/validate_section.rb +14 -7
  34. data/lib/metanorma/ieee/validate_style.rb +5 -1
  35. data/lib/metanorma/ieee/version.rb +1 -1
  36. data/lib/relaton/render/config.yml +44 -0
  37. data/lib/relaton/render/general.rb +13 -0
  38. metadata +8 -2
@@ -46,7 +46,7 @@ module IsoDoc
46
46
 
47
47
  def tc(xml)
48
48
  tc = xml.at(ns("//bibdata/ext/editorialgroup/"\
49
- "technical-committee"))&.text || "<Committee Name>"
49
+ "committee"))&.text || "<Committee Name>"
50
50
  set(:technical_committee, tc)
51
51
  end
52
52
 
@@ -126,10 +126,31 @@ module IsoDoc
126
126
  super
127
127
  draft = isoxml&.at(ns("//bibdata/version/draft"))
128
128
  doctype(isoxml, _out)
129
- title = "#{@metadata[:doctype_abbrev] || '???'} for "\
130
- "#{@metadata[:doctitle] || '???'}"
129
+ set(:full_doctitle, fulltitle(@metadata[:doctype], draft))
130
+ set(:abbrev_doctitle, fulltitle(@metadata[:doctype_abbrev], draft))
131
+ end
132
+
133
+ def fulltitle(type, draft)
134
+ title = "#{type || '???'} for #{@metadata[:doctitle] || '???'}"
131
135
  draft and title = "Draft #{title}"
132
- set(:full_doctitle, title)
136
+ title
137
+ end
138
+
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?
148
+
149
+ ret = std.map do |x|
150
+ x.at(ns(".//docidentifier[@primary = 'true']"))&.text ||
151
+ x.at(ns(".//docidentifier"))&.text
152
+ end
153
+ set(type.to_sym, ret)
133
154
  end
134
155
  end
135
156
  end
@@ -1,3 +1,5 @@
1
+ require_relative "../../relaton/render/general"
2
+
1
3
  module IsoDoc
2
4
  module IEEE
3
5
  class PresentationXMLConvert < IsoDoc::PresentationXMLConvert
@@ -131,11 +133,12 @@ module IsoDoc
131
133
 
132
134
  def collapse_term_template(opt)
133
135
  defn = collapse_unwrap_definition(opt[:def])
134
- source = opt[:source] ? "(#{opt[:source].remove.children.to_xml})" : nil
136
+ src = nil
137
+ opt[:source] and src = "(#{opt[:source].remove.children.to_xml.strip})"
135
138
  <<~TERM
136
139
  <p>#{opt[:pref].children.to_xml}: #{defn}
137
140
  #{collapse_term_related(opt[:rels])}
138
- #{source}</p>
141
+ #{src}</p>
139
142
  TERM
140
143
  end
141
144
 
@@ -175,7 +178,17 @@ module IsoDoc
175
178
  end
176
179
  end
177
180
 
181
+ def termnote1(elem)
182
+ lbl = l10n(@xrefs.anchor(elem["id"], :label)&.strip || "???")
183
+ prefix_name(elem, block_delim, lower2cap(lbl), "name")
184
+ end
185
+
178
186
  def term(docxml); end
187
+
188
+ def concept1(node)
189
+ concept_render(node, ital: "false", ref: "false",
190
+ linkref: "false", linkmention: "false")
191
+ end
179
192
  end
180
193
  end
181
194
  end
@@ -53,6 +53,35 @@ module IsoDoc
53
53
  l10n(ret)
54
54
  end
55
55
 
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
+
56
85
  def anchor_linkend1(node)
57
86
  linkend = @xrefs.anchor(node["target"], :xref)
58
87
  @xrefs.anchor(node["target"], :type) == "clause" &&
@@ -69,6 +98,18 @@ module IsoDoc
69
98
  "&#x2014;"
70
99
  end
71
100
 
101
+ def note1(elem)
102
+ return if elem.parent.name == "bibitem" || elem["notag"] == "true"
103
+
104
+ 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]}")
109
+ end
110
+ prefix_name(elem, block_delim, lbl, "name")
111
+ end
112
+
72
113
  def display_order(docxml)
73
114
  i = 0
74
115
  i = display_order_xpath(docxml, "//preface/*", i)
@@ -83,6 +124,50 @@ module IsoDoc
83
124
  display_order_xpath(docxml, "//indexsect", i)
84
125
  end
85
126
 
127
+ def bibrenderer
128
+ ::Relaton::Render::IEEE::General.new(language: @lang,
129
+ i18nhash: @i18n.get)
130
+ end
131
+
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}"
139
+ end
140
+
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))
147
+ end
148
+
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
153
+ end
154
+ unless bibliography_bibitem_number_skip(bibitem)
155
+
156
+ idx += 1
157
+ bibitem.at(ns(".//docidentifier")).previous =
158
+ "<docidentifier type='metanorma-ordinal'>[B#{idx}]</docidentifier>"
159
+ end
160
+ idx
161
+ end
162
+
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>"
167
+ end
168
+ prefix_name(elem, "<br/>", lbl, "title")
169
+ end
170
+
86
171
  include Init
87
172
  end
88
173
  end
@@ -125,6 +125,10 @@ module IsoDoc
125
125
  docxml.at("//div[@class = 'boilerplate-feedback']")&.xpath("./div")
126
126
  &.each_with_index do |div, i|
127
127
  i.zero? or div.elements.first.previous = "<p>&#xa0;</p>"
128
+ i == 4 and
129
+ div.xpath(".//p[br]").each do |p|
130
+ p.replace(p.to_xml.gsub(%r{<br/>}, "</p><p>"))
131
+ end
128
132
  feedback_style1(div, i)
129
133
  end
130
134
  end
@@ -155,6 +159,56 @@ module IsoDoc
155
159
  end
156
160
  end
157
161
  end
162
+
163
+ def abstract_cleanup(docxml)
164
+ dest = docxml.at("div[@id = 'abstract-destination']") or return
165
+ if f = docxml.at("//div[@class = 'abstract']")
166
+ f.previous_element.remove
167
+ abstract_cleanup1(f, dest)
168
+ f.remove
169
+ elsif f = docxml.at("//div[@type = 'scope']")
170
+ abstract_cleanup1(f, dest)
171
+ abstract_header(dest)
172
+ end
173
+ end
174
+
175
+ def abstract_cleanup1(source, dest)
176
+ source.elements.reject { |e| %w(h1 h2).include?(e.name) }.each do |e|
177
+ e1 = e.dup
178
+ e1.xpath(".//p").each do |p|
179
+ p["style"] ||= ""
180
+ p["style"] = 'font-family: "Arial", sans-serif;' + p["style"]
181
+ end
182
+ %w(ul ol).include?(e1.name) or e1["class"] = "IEEEStdsAbstractBody"
183
+ dest << e1
184
+ end
185
+ end
186
+
187
+ def abstract_header(dest)
188
+ dest.elements.first.children.first.previous =
189
+ "<span class='IEEEStdsAbstractHeader'><span lang='EN-US'>"\
190
+ "Abstract:</span></span> "
191
+ end
192
+
193
+ def introduction_cleanup(docxml)
194
+ dest = docxml.at("div[@id = 'introduction-destination']") or return
195
+ unless i = docxml.at("//h1[@class = 'IntroTitle']")&.parent
196
+ dest.parent.remove
197
+ return
198
+ end
199
+ introduction_cleanup1(i, dest)
200
+ end
201
+
202
+ def introduction_cleanup1(intro, dest)
203
+ docxml = intro.document
204
+ intro.previous_element.remove
205
+ dest.replace(intro.remove)
206
+ i = docxml.at("//h1[@class = 'IntroTitle']")
207
+ if i.next_element.name == "div" &&
208
+ i.next_element["class"] == "IEEEStdsIntroduction"
209
+ i.next_element.name = "p"
210
+ end
211
+ end
158
212
  end
159
213
  end
160
214
  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
@@ -35,8 +36,7 @@ module IsoDoc
35
36
  header: html_doc_path("header.html"),
36
37
  wordcoverpage: html_doc_path("word_ieee_titlepage.html"),
37
38
  wordintropage: html_doc_path("word_ieee_intro.html"),
38
- ulstyle: "l3",
39
- olstyle: "l2" }
39
+ ulstyle: "l11", olstyle: "l16" }
40
40
  end
41
41
 
42
42
  def abstract(isoxml, out)
@@ -68,6 +68,90 @@ module IsoDoc
68
68
  end
69
69
  end
70
70
 
71
+ def admonition_name_parse(_node, div, name)
72
+ div.p **{ class: "IEEEStdsWarning", style: "text-align:center;" } do |p|
73
+ p.b do |b|
74
+ name.children.each { |n| parse(n, b) }
75
+ end
76
+ end
77
+ end
78
+
79
+ def admonition_class(node)
80
+ if node["type"] == "editorial" then "zzHelp"
81
+ elsif node.ancestors("introduction").empty?
82
+ "IEEEStdsWarning"
83
+ else "IEEEStdsIntroduction"
84
+ end
85
+ end
86
+
87
+ def dt_dd?(node)
88
+ %w{dt dd}.include? node.name
89
+ end
90
+
91
+ def formula_where(dlist, out)
92
+ return unless dlist
93
+
94
+ dlist.elements.select { |n| dt_dd? n }.each_slice(2) do |dt, dd|
95
+ formula_where1(out, dt, dd)
96
+ end
97
+ end
98
+
99
+ def formula_where1(out, dterm, ddefn)
100
+ out.p **{ class: "IEEEStdsEquationVariableList" } do |p|
101
+ dterm.children.each { |n| parse(n, p) }
102
+ insert_tab(p, 1)
103
+ if ddefn.at(ns("./p"))
104
+ ddefn.elements.each do |e|
105
+ e.children.each { |n| parse(n, p) }
106
+ end
107
+ else ddefn.children.each { |n| parse(n, p) }
108
+ end
109
+ end
110
+ end
111
+
112
+ def annex_attrs(node)
113
+ { id: node["id"], class: "Annex" }
114
+ end
115
+
116
+ def annex_name(_annex, name, div)
117
+ preceding_floating_titles(name, div)
118
+ return if name.nil?
119
+
120
+ name&.at(ns("./strong"))&.remove # supplied by CSS list numbering
121
+ div.h1 **{ class: "Annex" } do |t|
122
+ annex_name1(name, t)
123
+ clause_parse_subtitle(name, t)
124
+ end
125
+ end
126
+
127
+ def annex_name1(name, out)
128
+ name.children.each do |c2|
129
+ if c2.name == "span" && c2["class"] == "obligation"
130
+ out.span **{ style: "font-weight:normal;" } do |s|
131
+ c2.children.each { |c3| parse(c3, s) }
132
+ end
133
+ else parse(c2, out)
134
+ end
135
+ end
136
+ end
137
+
138
+ def termnote_parse(node, out)
139
+ name = node&.at(ns("./name"))&.remove
140
+ out.div **note_attrs(node) do |div|
141
+ div.p do |p|
142
+ name and termnote_label(p, name)
143
+ para_then_remainder(node.first_element_child, node, p, div)
144
+ end
145
+ end
146
+ end
147
+
148
+ def termnote_label(para, name)
149
+ para.span **{ class: "note_label" } do |s|
150
+ name.children.each { |n| parse(n, s) }
151
+ s << termnote_delim
152
+ end
153
+ end
154
+
71
155
  include BaseConvert
72
156
  include Init
73
157
  end