metanorma-nist 1.0.8 → 1.0.9

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d2a45509c5a48e8cc1fe2bbe746de40897468aa8c2bcf89ee859d96818c31e8d
4
- data.tar.gz: da5c38b20db3591806e7b8604890706147beb2be63a37376cf73776a9d6ac2cb
3
+ metadata.gz: 6120113a1a25fe7c901041b783738db95eec32d26fa63c3265a65e46a8da9352
4
+ data.tar.gz: 1b239f36b6030165b2c5558e1fc16f3fb5cd382639086fdad6d7137ee3df3bbd
5
5
  SHA512:
6
- metadata.gz: 29dbbbb218046401e3c6e3ff0f3c6fec171fa32191cac8984f9a80d302857964fc6fa828a15ff39a9d2791a85ce68bb8b118ce3c5ae293b1c2ad101c397145c5
7
- data.tar.gz: 41f297662d5c2b4ae9ddfc33988558b7b26291f7f78b2888afcb82912b4a879262141be42a45648a8328ac5a30a83f2a8802d2a2f203270908e8dcca4d10732a
6
+ metadata.gz: ca4c404c621a96f42795694bb73b993bb397d2ed2bbb37a995d5af1e153934eb6f1e9d1a094c5969294fdf1889d28070365a407d62d9d4ec84f56eedcbff5ac3
7
+ data.tar.gz: 30d92c0a8e10d5e1ad630f7894b844b9ff7a092a2eb567a034a176bafd91643f6f38aef9ed5f219a3d7953b705bb5f65d5902e7657a990d22c263d06981d00c8
@@ -223,6 +223,10 @@ Used to indicate the date of errata releases.
223
223
  The date at which a draft is circulated. Displayed on the cover page of drafts.
224
224
  MANDATORY FOR DRAFTS.
225
225
 
226
+ `:language:`::
227
+ Two-letter code (ISO 639-1) of the language the document is written in. Defaults to `en`.
228
+ If multiple languages are used in the document, comma-delimited; e.g. `en,fr`.
229
+
226
230
  === NIST-specific attributes
227
231
 
228
232
  The following document attributes are specific to this document class:
@@ -239,11 +243,29 @@ Added to authority statement as document contact. Use line breaks (in Asciidocto
239
243
  `:revision:`:: The document revision; e.g. `1` (Revision 1). Will be stored in Metanorma XML
240
244
  under the `<edition>` tag, with the prefix `Revision `.
241
245
 
246
+ `:version:`:: The document version, when titled as version. Will be stored in Metanorma XML
247
+ under the `<edition>` tag, with the prefix `Version `.
248
+
242
249
  `:volume:`::
243
250
  The number of the volume of a standard. Is ignored if a precomposed
244
251
  document identifier (`:docidentifier:`) is supplied.
245
252
  Is prefixed with "Volume" or "Vol." in display.
246
253
 
254
+ `:part:`::
255
+ The part number of a standard. Is only used to generate machine readable NIST identifier (nist-mr).
256
+
257
+ `:section:`::
258
+ The section number of a standard. Is only used to generate machine readable NIST identifier (nist-mr).
259
+
260
+ `:supplement:`::
261
+ The supplement number of a standard. Is only used to generate machine readable NIST identifier (nist-mr).
262
+
263
+ `:index:`::
264
+ The index number of a standard. Is only used to generate machine readable NIST identifier (nist-mr).
265
+
266
+ `:update:`::
267
+ The update number of a standard. Is only used to generate machine readable NIST identifier (nist-mr).
268
+
247
269
  `:title-main:`:: The title of the document.
248
270
  `:title-sub:`:: The subtitle of the document.
249
271
 
@@ -661,9 +661,9 @@
661
661
  <optional>
662
662
  <ref name="status"/>
663
663
  </optional>
664
- <optional>
664
+ <zeroOrMore>
665
665
  <ref name="copyright"/>
666
- </optional>
666
+ </zeroOrMore>
667
667
  <zeroOrMore>
668
668
  <ref name="docrelation"/>
669
669
  </zeroOrMore>
@@ -1021,7 +1021,17 @@
1021
1021
  <optional>
1022
1022
  <ref name="to"/>
1023
1023
  </optional>
1024
- <ref name="owner"/>
1024
+ <oneOrMore>
1025
+ <ref name="owner"/>
1026
+ </oneOrMore>
1027
+ <optional>
1028
+ <ref name="copyright_scope"/>
1029
+ </optional>
1030
+ </element>
1031
+ </define>
1032
+ <define name="copyright_scope">
1033
+ <element name="scope">
1034
+ <text/>
1025
1035
  </element>
1026
1036
  </define>
1027
1037
  <define name="from">
@@ -20,6 +20,7 @@ module Asciidoctor
20
20
  def metadata_version(node, xml)
21
21
  xml.edition node.attr("edition") if node.attr("edition")
22
22
  xml.edition "Revision #{node.attr("revision")}" if node.attr("revision")
23
+ xml.edition "Version #{node.attr("version")}" if node.attr("version")
23
24
  xml.version do |v|
24
25
  v.revision_date node.attr("revdate") if node.attr("revdate")
25
26
  v.draft node.attr("draft") if node.attr("draft")
@@ -1,17 +1,16 @@
1
+ require "iso-639"
2
+
1
3
  module Asciidoctor
2
4
  module NIST
3
5
  class Converter < Standoc::Converter
4
6
  def metadata_id(node, xml)
5
7
  did = node.attr("docidentifier")
6
8
  dn = node.attr("docnumber")
7
- dn = Iso690Render.MMMddyyyy(node.attr("issued-date")) if @series == "nist-cswp" and !dn
8
- if did
9
- xml.docidentifier did, **attr_code(type: "NIST")
10
- xml.docidentifier unabbreviate(did), **attr_code(type: "nist-long")
11
- else
12
- metadata_id_compose(node, xml, dn)
13
- end
14
- xml.docnumber node.attr("docnumber")
9
+ @series == "nist-cswp" && !node.attr("docnumber") and
10
+ dn = Iso690Render.MMMddyyyy(node.attr("issued-date"))
11
+ metadata_id_compose(node, xml, dn, did)
12
+ xml.docnumber node.attr("docnumber") ||
13
+ did&.sub(/^[^0-9]*/, "")&.sub(/[ -].*$/, "")
15
14
  end
16
15
 
17
16
  def unabbreviate(did)
@@ -21,26 +20,42 @@ module Asciidoctor
21
20
  end
22
21
 
23
22
  def id_args(node, dn0)
23
+ return nil unless dn0
24
24
  {
25
25
  id: dn0,
26
26
  series: node.attr("series"),
27
+ edition: node.attr("edition"),
28
+ version: node.attr("version"),
27
29
  revision: node.attr("revision"),
30
+ update: node.attr("update"),
31
+ year: (node.attr("copyright-year") || node.attr("updated-date") ||
32
+ node.attr("revdate") || node.attr("circulated-date") ||
33
+ Date.today.year.to_s).sub(/^(....).*$/, "\\1"),
28
34
  vol: node.attr("volume"),
35
+ part: node.attr("part") || node.attr("part-number"),
36
+ section: node.attr("section") || node.attr("section-number"),
37
+ supplement: node.attr("supplement") || node.attr("supplement-number"),
38
+ index: node.attr("index") || node.attr("index-number"),
29
39
  stage: node.attr("status") || node.attr("docstage"),
30
40
  iter: node.attr("iteration"),
41
+ language: node.attr("language") || "en",
31
42
  date: /^draft/.match(node.attr("status") || node.attr("docstage")) ?
32
43
  (node.attr("circulated-date") || node.attr("revdate")) :
33
44
  node.attr("updated-date")
34
45
  }
35
46
  end
36
47
 
37
- def metadata_id_compose(node, xml, dn0)
38
- return unless dn0
39
- args = id_args(node, dn0)
40
- xml.docidentifier add_id_parts(args, false), **attr_code(type: "NIST")
41
- xml.docidentifier add_id_parts(args, true),
42
- **attr_code(type: "nist-long")
43
- xml.docidentifier add_id_parts_mr(args), **attr_code(type: "nist-mr")
48
+ def metadata_id_compose(node, xml, dn0, did)
49
+ if did
50
+ xml.docidentifier did, **attr_code(type: "NIST")
51
+ xml.docidentifier unabbreviate(did), **attr_code(type: "nist-long")
52
+ else
53
+ args = id_args(node, dn0) || return
54
+ xml.docidentifier add_id_parts(args, false), **attr_code(type: "NIST")
55
+ xml.docidentifier add_id_parts(args, true),
56
+ **attr_code(type: "nist-long")
57
+ xml.docidentifier add_id_parts_mr(args), **attr_code(type: "nist-mr")
58
+ end
44
59
  end
45
60
 
46
61
  def MMMddyyyy(isodate)
@@ -48,26 +63,61 @@ module Asciidoctor
48
63
  Date.parse(isodate).strftime("%B %d, %Y")
49
64
  end
50
65
 
66
+ def status_abbr(stage, iter)
67
+ IsoDoc::NIST::Metadata.new(nil, nil, {}).status_abbr(stage, iter)
68
+ end
69
+
51
70
  def add_id_parts(args, long)
52
- vol_delim = " Volume "
53
- ed_delim = " Revision "
54
71
  args[:series] and series_name = long ?
55
72
  SERIES.dig(args[:series].to_sym) :
56
73
  SERIES_ABBR.dig(args[:series].to_sym)
57
74
  dn = (series_name || "NIST #{args[:series]}") + " " + args[:id]
58
- dn += "#{vol_delim}#{args[:vol]}" if args[:vol]
75
+ dn += " Volume #{args[:vol]}" if args[:vol]
59
76
  dn += "," if args[:vol] && args[:revision]
60
- dn += "#{ed_delim}#{args[:revision]}" if args[:revision]
61
- stage = IsoDoc::NIST::Metadata.new(nil, nil, {}).status_abbr(args[:stage], args[:iter])
62
- dn += " (#{stage})" if stage
77
+ dn += " Revision #{args[:revision]}" if args[:revision]
78
+ dn += "/Upd #{args[:update]}:#{args[:year]}" if args[:update]
79
+ stage = status_abbr(args[:stage], args[:iter]) and dn += " (#{stage})"
63
80
  dn += " (#{MMMddyyyy(args[:date])})" if args[:date]
64
81
  dn
65
82
  end
66
83
 
84
+ def id_parts_mr(args)
85
+ part = []
86
+ part << "v-#{args[:vol]}" if args[:vol]
87
+ part << "pt-#{args[:part]}" if args[:part]
88
+ part << "sec-#{args[:section]}" if args[:section]
89
+ part << "sup-#{args[:supplement]}" if args[:supplement]
90
+ part << "indx-#{args[:index]}" if args[:index]
91
+ part
92
+ end
93
+
94
+ def id_editions_mr(args)
95
+ part = []
96
+ part << "e-#{args[:edition]}" if args[:edition]
97
+ part << "r-#{args[:revision]}" if args[:revision]
98
+ part << "ver-#{args[:version]}" if args[:version]
99
+ part
100
+ end
101
+
102
+ def id_lang_mr(args)
103
+ ret = args[:language].split(/,\s*/).map do |l|
104
+ ISO_639.find(l).alpha3
105
+ end.join(",")
106
+ end
107
+
67
108
  def add_id_parts_mr(args)
109
+ ret = ["NIST"]
68
110
  args[:series] and
69
- name = SERIES_ABBR&.dig(args[:series].to_sym)&.sub(/^NIST /, "")
70
- "NIST.#{name}.#{args[:id]}.#{args[:vol]}.#{args[:revision]}.#{args[:date]}"
111
+ ret << SERIES_ABBR&.dig(args[:series].to_sym)&.sub(/^NIST /, "")
112
+ stage = status_abbr(args[:stage], nil) || ""
113
+ stage += "[-#{args[:iter]}]" if args[:iter]
114
+ ret << stage unless stage.empty?
115
+ ret << args[:id]
116
+ ret += id_parts_mr(args)
117
+ ret += id_editions_mr(args)
118
+ ret << id_lang_mr(args)
119
+ args[:update] and ret << "upd-#{args[:update]}:#{args[:year]}"
120
+ ret.join(".")
71
121
  end
72
122
  end
73
123
  end
@@ -53,6 +53,14 @@
53
53
  <optional>
54
54
  <attribute name="alt"/>
55
55
  </optional>
56
+ <optional>
57
+ <attribute name="case">
58
+ <choice>
59
+ <value>capital</value>
60
+ <value>lowercase</value>
61
+ </choice>
62
+ </attribute>
63
+ </optional>
56
64
  <text/>
57
65
  </element>
58
66
  </define>
@@ -902,7 +910,15 @@
902
910
  <attribute name="id">
903
911
  <data type="ID"/>
904
912
  </attribute>
905
- <ref name="paragraph"/>
913
+ <oneOrMore>
914
+ <choice>
915
+ <ref name="paragraph"/>
916
+ <ref name="ul"/>
917
+ <ref name="ol"/>
918
+ <ref name="dl"/>
919
+ <ref name="formula"/>
920
+ </choice>
921
+ </oneOrMore>
906
922
  </element>
907
923
  </define>
908
924
  <define name="termexample">
@@ -2,20 +2,12 @@ require "isodoc"
2
2
  require_relative "metadata"
3
3
  require_relative "xrefs"
4
4
  require_relative "refs"
5
+ require_relative "section"
5
6
  require "fileutils"
6
7
 
7
8
  module IsoDoc
8
9
  module NIST
9
10
  module BaseConvert
10
- def abstract(isoxml, out)
11
- f = isoxml.at(ns("//preface/abstract")) || return
12
- #page_break(out)
13
- out.div **attr_code(id: f["id"]) do |s|
14
- clause_name(nil, @abstract_lbl, s, class: "AbstractTitle")
15
- f.elements.each { |e| parse(e, s) unless e.name == "title" }
16
- end
17
- end
18
-
19
11
  def keywords(_docxml, out)
20
12
  kw = @meta.get[:keywords]
21
13
  kw.empty? and return
@@ -25,27 +17,8 @@ module IsoDoc
25
17
  end
26
18
  end
27
19
 
28
- FRONT_CLAUSE = "//*[parent::preface][not(local-name() = 'abstract' or local-name() = 'foreword')]".freeze
29
-
30
- # All "[preface]" sections should have class "IntroTitle" to prevent
31
- # page breaks
32
- # But for the Exec Summary
33
- def preface(isoxml, out)
34
- isoxml.xpath(ns(FRONT_CLAUSE)).each do |c|
35
- next if skip_render(c, isoxml)
36
- title = c&.at(ns("./title"))
37
- patent = ["Call for Patent Claims", "Patent Disclosure Notice"].include? title&.text
38
- out.div **attr_code(id: c["id"]) do |s|
39
- page_break(s) if patent
40
- clause_name(anchor(c['id'], :label), title, s,
41
- class: (c.name == "executivesummary") ? "NormalTitle" :
42
- "IntroTitle")
43
- c.elements.reject { |c1| c1.name == "title" }.each do |c1|
44
- parse(c1, s)
45
- end
46
- end
47
- end
48
- end
20
+ FRONT_CLAUSE = "//*[parent::preface][not(local-name() = 'abstract' or "\
21
+ "local-name() = 'foreword')]".freeze
49
22
 
50
23
  def skip_render(c, isoxml)
51
24
  return false unless c.name == "reviewernote"
@@ -157,13 +130,13 @@ module IsoDoc
157
130
  "//terms[parent::sections]".freeze
158
131
 
159
132
  def middle(isoxml, out)
133
+ middle_admonitions(isoxml, out)
160
134
  clause isoxml, out
161
135
  bibliography isoxml, out
162
136
  annex isoxml, out
163
137
  end
164
138
 
165
139
  def info(isoxml, out)
166
- @meta.keywords isoxml, out
167
140
  @meta.series isoxml, out
168
141
  @meta.commentperiod isoxml, out
169
142
  @meta.note isoxml, out
@@ -176,13 +149,15 @@ module IsoDoc
176
149
  end
177
150
 
178
151
  def get_linkend(node)
179
- link = anchor_linkend(node, docid_l10n(node["target"] || wrap_brackets(node['citeas'])))
180
- link += eref_localities(node.xpath(ns("./locality | ./localityStack")), link)
181
- contents = node.children.select { |c| !%w{locality localityStack}.include? c.name }
152
+ link = anchor_linkend(node, docid_l10n(node["target"] ||
153
+ wrap_brackets(node['citeas'])))
154
+ link += eref_localities(node.xpath(ns("./locality | ./localityStack")),
155
+ link)
156
+ contents = node.children.select do |c|
157
+ !%w{locality localityStack}.include? c.name
158
+ end
182
159
  return link if contents.nil? || contents.empty?
183
160
  Nokogiri::XML::NodeSet.new(node.document, contents).to_xml
184
- # so not <origin bibitemid="ISO7301" citeas="ISO 7301">
185
- # <locality type="section"><reference>3.1</reference></locality></origin>
186
161
  end
187
162
 
188
163
  def load_yaml(lang, script)
@@ -205,38 +180,45 @@ module IsoDoc
205
180
  end
206
181
  end
207
182
 
208
- def bibliography_parse(node, out)
209
- title = node&.at(ns("./title"))&.text || ""
210
- out.div do |div|
211
- unless suppress_biblio_title(node)
212
- anchor(node['id'], :label, false) and
213
- clause_parse_title(node, div, node.at(ns("./title")), out) or
214
- div.h2 title, **{ class: "Section3" }
215
- end
216
- biblio_list(node, div, true)
183
+ def termref_parse(node, out)
184
+ end
185
+
186
+ def term_cleanup(docxml)
187
+ docxml.xpath("//table[@class = 'terms_dl']").each do |d|
188
+ prev = d.previous_element
189
+ next unless prev && prev.name == "table" &&
190
+ prev["class"] == "terms_dl"
191
+ d.children.each { |n| prev.add_child(n.remove) }
192
+ d.remove
217
193
  end
194
+ docxml
218
195
  end
219
196
 
220
- def suppress_biblio_title(node)
221
- return false unless node.parent.name == "annex"
222
- return false if node.parent.xpath("./references | ./clause | "\
223
- "./terms | ./definitions").size > 1
224
- title1 = node&.at(ns("./title"))&.text
225
- return true unless title1
226
- title2 = node&.parent&.at(ns("./title"))&.text
227
- title1&.casecmp(title2) == 0
197
+ def term_and_termref_parse(node, dt)
198
+ pref = node.at(ns("./preferred"))
199
+ source = node.xpath(ns("./termsource"))
200
+ pref.children.each { |n| parse(n, dt) }
201
+ return if source.empty?
202
+ dt << "<br/>"
203
+ source.each_with_index do |s, i|
204
+ i > 0 and dt << "; "
205
+ s.elements.each { |n| parse(n, dt) }
206
+ end
228
207
  end
229
208
 
230
- def foreword(isoxml, out)
231
- f = isoxml.at(ns("//foreword")) || return
232
- out.div **attr_code(id: f["id"]) do |s|
233
- title = f.at(ns("./title"))
234
- s.h1(**{ class: "ForewordTitle" }) do |h1|
235
- title and title.children.each { |e| parse(e, h1) }
236
- end
237
- f.elements.each { |e| parse(e, s) unless e.name == "title" }
209
+ def term_rest_parse(node, dd)
210
+ set_termdomain("")
211
+ node.children.each do |n|
212
+ parse(n, dd) unless %w(preferred termsource).include?(n.name)
238
213
  end
239
214
  end
215
+
216
+ def modification_parse(node, out)
217
+ out << @modified_lbl
218
+ node.at(ns("./p[text()[normalize-space() != '']]")) and
219
+ out << " &mdash; "
220
+ node.at(ns("./p")).children.each { |n| parse(n, out) }
221
+ end
240
222
  end
241
223
  end
242
224
  end
@@ -693,7 +693,7 @@ div.Admonition {
693
693
  mso-ansi-language:EN-AU;
694
694
  }
695
695
 
696
- div Admonotion p {
696
+ div.Admonition p {
697
697
  margin-top:6.0pt;margin-right:0cm;
698
698
  margin-bottom:6.0pt;margin-left:0cm;text-align:left;mso-pagination:widow-orphan;
699
699
  mso-hyphenate:auto;background:#dddddd;mso-layout-grid-align:auto;mso-vertical-align-alt:
@@ -643,7 +643,7 @@ div.Admonition {
643
643
  mso-ansi-language:EN-AU;
644
644
  }
645
645
 
646
- div Admonotion p {
646
+ div.Admonition p {
647
647
  margin-top:6.0pt;margin-right:0cm;
648
648
  margin-bottom:6.0pt;margin-left:0cm;text-align:left;mso-pagination:widow-orphan;
649
649
  mso-hyphenate:auto;background:#dddddd;mso-layout-grid-align:auto;mso-vertical-align-alt:
@@ -20,9 +20,11 @@ module IsoDoc
20
20
 
21
21
  def default_fonts(options)
22
22
  {
23
- bodyfont: (options[:script] == "Hans" ? '"SimSun",serif' : '"Libre Baskerville",serif'),
24
- headerfont: (options[:script] == "Hans" ? '"SimHei",sans-serif' : '"Libre Baskerville",serif'),
25
- monospacefont: '"Space Mono",monospace'
23
+ bodyfont: (options[:script] == "Hans" ? '"SimSun",serif' :
24
+ '"Libre Baskerville",serif'),
25
+ headerfont: (options[:script] == "Hans" ? '"SimHei",sans-serif' :
26
+ '"Libre Baskerville",serif'),
27
+ monospacefont: '"Space Mono",monospace'
26
28
  }
27
29
  end
28
30
 
@@ -48,28 +50,34 @@ module IsoDoc
48
50
  end
49
51
 
50
52
  def toclevel
51
- ret = toclevel_classes.map { |l| "#{l}:not(:empty):not(.TermNum):not(.noTOC):not(.AbstractTitle):not(.IntroTitle):not(.ForewordTitle)" }
52
- <<~HEAD.freeze
53
+ ret = toclevel_classes.map do |l|
54
+ "#{l}:not(:empty):not(.TermNum):not(.noTOC):not(.AbstractTitle):"\
55
+ "not(.IntroTitle):not(.ForewordTitle)"
56
+ end
57
+ <<~HEAD.freeze
53
58
  function toclevel() { return "#{ret.join(',')}";}
54
- HEAD
55
- end
59
+ HEAD
60
+ end
56
61
 
57
62
  def html_toc(docxml)
58
- idx = docxml.at("//div[@id = 'toc']") or return docxml
59
- toc = "<ul>"
60
- path = toclevel_classes.map do |l|
61
- "//main//#{l}[not(@class = 'TermNum')][not(@class = 'noTOC')][not(text())][not(@class = 'AbstractTitle')][not(@class = 'IntroTitle')][not(@class = 'ForewordTitle')]"
62
- end
63
- docxml.xpath(path.join(" | ")).each_with_index do |h, tocidx|
64
- h["id"] ||= "toc#{tocidx}"
65
- toc += html_toc_entry(h.name, h)
63
+ idx = docxml.at("//div[@id = 'toc']") or return docxml
64
+ toc = "<ul>"
65
+ path = toclevel_classes.map do |l|
66
+ "//main//#{l}[not(@class = 'TermNum')][not(@class = 'noTOC')]"\
67
+ "[not(text())][not(@class = 'AbstractTitle')]"\
68
+ "[not(@class = 'IntroTitle')][not(@class = 'ForewordTitle')]"
69
+ end
70
+ docxml.xpath(path.join(" | ")).each_with_index do |h, tocidx|
71
+ h["id"] ||= "toc#{tocidx}"
72
+ toc += html_toc_entry(h.name, h)
73
+ end
74
+ idx.children = "#{toc}</ul>"
75
+ docxml
66
76
  end
67
- idx.children = "#{toc}</ul>"
68
- docxml
69
- end
70
77
 
71
78
  def make_body(xml, docxml)
72
- body_attr = { lang: "EN-US", link: "blue", vlink: "#954F72", "xml:lang": "EN-US", class: "container" }
79
+ body_attr = { lang: "EN-US", link: "blue", vlink: "#954F72",
80
+ "xml:lang": "EN-US", class: "container" }
73
81
  xml.body **body_attr do |body|
74
82
  make_body1(body, docxml)
75
83
  make_body2(body, docxml)
@@ -117,56 +125,17 @@ module IsoDoc
117
125
  end
118
126
  end
119
127
 
120
- def bibliography(isoxml, out)
121
- f = isoxml.at(ns("//bibliography/clause | //bibliography/references")) || return
122
- page_break(out)
123
- isoxml.xpath(ns("//bibliography/clause | //bibliography/references")).each do |f|
124
- out.div do |div|
125
- div.h1 **{ class: "Section3" } do |h1|
126
- if @bibliographycount == 1 then h1 << "References"
127
- else
128
- f&.at(ns("./title"))&.children.each { |n| parse(n, h1) }
129
- end
130
- end
131
- biblio_list(f, div, false)
132
- end
133
- end
134
- end
135
-
136
- def keywords(_docxml, out)
137
- kw = @meta.get[:keywords]
138
- kw.empty? and return
139
- out.div **{ class: "Section3" } do |div|
140
- out.div do |div|
141
- clause_name(nil, "Keywords", div, class: "IntroTitle")
142
- div.p kw.sort.join("; ")
143
- end
144
- end
145
- end
146
-
147
128
  def termdef_parse(node, out)
148
- pref = node.at(ns("./preferred"))
149
129
  out.dl **{ class: "terms_dl" } do |dl|
150
130
  dl.dt do |dt|
151
- pref.children.each { |n| parse(n, dt) }
131
+ term_and_termref_parse(node, dt)
152
132
  end
153
- set_termdomain("")
154
133
  dl.dd do |dd|
155
- node.children.each { |n| parse(n, dd) unless n.name == "preferred" }
134
+ term_rest_parse(node, dd)
156
135
  end
157
136
  end
158
137
  end
159
138
 
160
- def term_cleanup(docxml)
161
- docxml.xpath("//table[@class = 'terms_dl']").each do |d|
162
- prev = d.previous_element
163
- next unless prev and prev.name == "table" and prev["class"] == "terms_dl"
164
- d.children.each { |n| prev.add_child(n.remove) }
165
- d.remove
166
- end
167
- docxml
168
- end
169
-
170
139
  include BaseConvert
171
140
  end
172
141
  end