metanorma-nist 0.0.7 → 0.0.8

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.
@@ -1,6 +1,7 @@
1
1
  require "isodoc"
2
2
  require_relative "metadata"
3
3
  require "fileutils"
4
+ require_relative "base_convert"
4
5
 
5
6
  module IsoDoc
6
7
  module NIST
@@ -112,83 +113,17 @@ module IsoDoc
112
113
  end
113
114
  end
114
115
 
115
- # common from here on
116
-
117
- def abstract(isoxml, out)
118
- f = isoxml.at(ns("//preface/abstract")) || return
119
- page_break(out)
120
- out.div **attr_code(id: f["id"]) do |s|
121
- clause_name(nil, @abstract_lbl, s, class: "AbstractTitle")
122
- f.elements.each { |e| parse(e, s) unless e.name == "title" }
123
- end
124
- end
125
-
126
116
  def keywords(_docxml, out)
127
117
  kw = @meta.get[:keywords]
128
118
  kw.empty? and return
129
119
  out.div **{ class: "Section3" } do |div|
130
- clause_name(nil, "Keywords", div, class: "IntroTitle")
131
- div.p kw.sort.join("; ")
132
- end
133
- end
134
-
135
- FRONT_CLAUSE = "//*[parent::preface][not(local-name() = 'abstract')]".freeze
136
-
137
- def preface(isoxml, out)
138
- isoxml.xpath(ns(FRONT_CLAUSE)).each do |c|
139
- foreword(isoxml, out) and next if c.name == "foreword"
140
- authority_parse(c, out) and next if c.name == "authority"
141
- next if skip_render(c, isoxml)
142
- out.div **attr_code(id: c["id"]) do |s|
143
- clause_name(get_anchors[c['id']][:label],
144
- c&.at(ns("./title"))&.content, s, nil)
145
- c.elements.reject { |c1| c1.name == "title" }.each do |c1|
146
- parse(c1, s)
147
- end
120
+ out.div do |div|
121
+ clause_name(nil, "Keywords", div, class: "IntroTitle")
122
+ div.p kw.sort.join("; ")
148
123
  end
149
124
  end
150
125
  end
151
126
 
152
- def skip_render(c, isoxml)
153
- return false unless c.name == "reviewernote"
154
- status = isoxml&.at(ns("//bibdata/status/stage"))&.text
155
- return true if status.nil?
156
- /^final/.match status
157
- end
158
-
159
- def term_defs_boilerplate(div, source, term, preface)
160
- if source.empty? && term.nil?
161
- div << @no_terms_boilerplate
162
- else
163
- div << term_defs_boilerplate_cont(source, term)
164
- end
165
- end
166
-
167
- def i18n_init(lang, script)
168
- super
169
- end
170
-
171
- def fileloc(loc)
172
- File.join(File.dirname(__FILE__), loc)
173
- end
174
-
175
- def requirement_cleanup(docxml)
176
- docxml.xpath("//div[@class = 'recommend' or @class = 'require' "\
177
- "or @class = 'permission'][title]").each do |d|
178
- title = d.at("./title")
179
- title.name = "b"
180
- n = title.next_element
181
- n&.children&.first&.add_previous_sibling(" ")
182
- n&.children&.first&.add_previous_sibling(title.remove)
183
- end
184
- docxml
185
- end
186
-
187
- def figure_parse(node, out)
188
- return pseudocode_parse(node, out) if node["type"] == "pseudocode"
189
- super
190
- end
191
-
192
127
  def pseudocode_parse(node, out)
193
128
  @in_figure = true
194
129
  name = node.at(ns("./name"))
@@ -201,335 +136,6 @@ module IsoDoc
201
136
  @in_figure = false
202
137
  end
203
138
 
204
- def dl_parse(node, out)
205
- return glossary_parse(node, out) if node["type"] == "glossary"
206
- super
207
- end
208
-
209
- def glossary_parse(node, out)
210
- out.dl **attr_code(id: node["id"], class: "glossary") do |v|
211
- node.elements.select { |n| dt_dd? n }.each_slice(2) do |dt, dd|
212
- v.dt **attr_code(id: dt["id"]) do |term|
213
- dt_parse(dt, term)
214
- end
215
- v.dd **attr_code(id: dd["id"]) do |listitem|
216
- dd.children.each { |n| parse(n, listitem) }
217
- end
218
- end
219
- end
220
- node.elements.reject { |n| dt_dd? n }.each { |n| parse(n, out) }
221
- end
222
-
223
- def error_parse(node, out)
224
- case node.name
225
- when "nistvariable" then nistvariable_parse(node, out)
226
- when "recommendation" then recommendation_parse(node, out)
227
- when "requirement" then requirement_parse(node, out)
228
- when "permission" then permission_parse(node, out)
229
- when "errata" then errata_parse(node, out)
230
- when "authority" then authority_parse(node, out)
231
- when "authority1" then authority1_parse(node, out, "authority1")
232
- when "authority2" then authority1_parse(node, out, "authority2")
233
- when "authority3" then authority1_parse(node, out, "authority3")
234
- when "authority4" then authority1_parse(node, out, "authority4")
235
- when "authority5" then authority1_parse(node, out, "authority5")
236
- else
237
- super
238
- end
239
- end
240
-
241
- def authority_parse(node, out)
242
- out.div **{class: "authority"} do |s|
243
- node.children.each do |n|
244
- if n.name == "title"
245
- s.h1 do |h|
246
- n.children.each { |nn| parse(nn, h) }
247
- end
248
- else
249
- parse(n, s)
250
- end
251
- end
252
- end
253
- end
254
-
255
- def authority1_parse(node, out, classname)
256
- out.div **{class: classname} do |s|
257
- node.children.each do |n|
258
- if n.name == "title"
259
- s.h2 do |h|
260
- n.children.each { |nn| parse(nn, h) }
261
- end
262
- else
263
- parse(n, s)
264
- end
265
- end
266
- end
267
- end
268
-
269
- def nistvariable_parse(node, out)
270
- out.span **{class: "nistvariable"} do |s|
271
- node.children.each { |n| parse(n, s) }
272
- end
273
- end
274
-
275
- def recommendation_parse(node, out)
276
- name = node["type"]
277
- out.div **{ class: "recommend" } do |t|
278
- t.title { |b| b << "Recommendation #{get_anchors[node['id']][:label]}:" }
279
- node.children.each do |n|
280
- parse(n, t)
281
- end
282
- end
283
- end
284
-
285
- def requirement_parse(node, out)
286
- name = node["type"]
287
- out.div **{ class: "require" } do |t|
288
- t.title { |b| b << "Requirement #{get_anchors[node['id']][:label]}:" }
289
- node.children.each do |n|
290
- parse(n, t)
291
- end
292
- end
293
- end
294
-
295
- def permission_parse(node, out)
296
- name = node["type"]
297
- out.div **{ class: "permission" } do |t|
298
- t.title { |b| b << "Permission #{get_anchors[node['id']][:label]}:" }
299
- node.children.each do |n|
300
- parse(n, t)
301
- end
302
- end
303
- end
304
-
305
- def errata_parse(node, out)
306
- out.table **make_table_attr(node) do |t|
307
- t.thead do |h|
308
- h.tr do |tr|
309
- %w(Date Type Change Pages).each do |hdr|
310
- tr.th hdr
311
- end
312
- end
313
- end
314
- t.tbody do |b|
315
- node.xpath(ns("./row")).each do |row|
316
- b.tr do |tr|
317
- tr.td do |td|
318
- row&.at(ns("./date"))&.children.each do |n|
319
- parse(n, td)
320
- end
321
- end
322
- tr.td do |td|
323
- row&.at(ns("./type"))&.children.each do |n|
324
- parse(n, td)
325
- end
326
- end
327
- tr.td do |td|
328
- row&.at(ns("./change"))&.children.each do |n|
329
- parse(n, td)
330
- end
331
- end
332
- tr.td do |td|
333
- row&.at(ns("./pages"))&.children.each do |n|
334
- parse(n, td)
335
- end
336
- end
337
- end
338
- end
339
- end
340
- end
341
- end
342
-
343
- MIDDLE_CLAUSE = "//clause[parent::sections] | "\
344
- "//terms[parent::sections]".freeze
345
-
346
- def middle(isoxml, out)
347
- middle_title(out)
348
- clause isoxml, out
349
- bibliography isoxml, out
350
- annex isoxml, out
351
- end
352
-
353
- def info(isoxml, out)
354
- @meta.keywords isoxml, out
355
- @meta.series isoxml, out
356
- @meta.commentperiod isoxml, out
357
- @meta.commentperiod isoxml, out
358
- super
359
- end
360
-
361
- SECTIONS_XPATH =
362
- "//foreword | //introduction | //reviewnote | //execsummary | //annex | "\
363
- "//sections/clause | //bibliography/references | "\
364
- "//bibliography/clause".freeze
365
-
366
- def initial_anchor_names(d)
367
- d.xpath("//xmlns:preface/child::*").each do |c|
368
- preface_names(c)
369
- end
370
- sequential_asset_names(d.xpath("//xmlns:preface/child::*"))
371
- clause_names(d, 0)
372
- middle_section_asset_names(d)
373
- termnote_anchor_names(d)
374
- termexample_anchor_names(d)
375
- end
376
-
377
- def back_anchor_names(docxml)
378
- docxml.xpath(ns("//annex")).each_with_index do |c, i|
379
- annex_names(c, (65 + i).chr.to_s)
380
- end
381
- docxml.xpath(ns("//bibliography/clause | "\
382
- "//bibliography/references")).each do |b|
383
- preface_names(b)
384
- end
385
- docxml.xpath(ns("//bibitem[not(ancestor::bibitem)]")).each do |ref|
386
- reference_names(ref)
387
- end
388
- end
389
-
390
- def middle_section_asset_names(d)
391
- middle_sections =
392
- "//xmlns:preface/child::* | //xmlns:sections/child::*"
393
- sequential_asset_names(d.xpath(middle_sections))
394
- end
395
-
396
- def sequential_asset_names(clause)
397
- super
398
- sequential_permission_names(clause)
399
- sequential_requirement_names(clause)
400
- sequential_recommendation_names(clause)
401
- end
402
-
403
- def sequential_permission_names(clause)
404
- clause.xpath(ns(".//permission")).each_with_index do |t, i|
405
- next if t["id"].nil? || t["id"].empty?
406
- @anchors[t["id"]] = anchor_struct(i + 1, t, "Permission", "permission")
407
- end
408
- end
409
-
410
- def sequential_requirement_names(clause)
411
- clause.xpath(ns(".//requirement")).each_with_index do |t, i|
412
- next if t["id"].nil? || t["id"].empty?
413
- @anchors[t["id"]] = anchor_struct(i + 1, t, "Requirement", "requirement")
414
- end
415
- end
416
-
417
- def sequential_recommendation_names(clause)
418
- clause.xpath(ns(".//recommendation")).each_with_index do |t, i|
419
- next if t["id"].nil? || t["id"].empty?
420
- @anchors[t["id"]] = anchor_struct(i + 1, t, "Recommendation", "recommendation")
421
- end
422
- end
423
-
424
-
425
- def hierarchical_asset_names(clause, num)
426
- super
427
- hierarchical_permission_names(clause, num)
428
- hierarchical_requirement_names(clause, num)
429
- hierarchical_recommendation_names(clause, num)
430
- end
431
-
432
- def hierarchical_permission_names(clause, num)
433
- clause.xpath(ns(".//permission")).each_with_index do |t, i|
434
- next if t["id"].nil? || t["id"].empty?
435
- @anchors[t["id"]] = anchor_struct("#{num}.#{i + 1}",
436
- t, "Permission", "permission")
437
- end
438
- end
439
-
440
- def hierarchical_requirement_names(clause, num)
441
- clause.xpath(ns(".//requirement")).each_with_index do |t, i|
442
- next if t["id"].nil? || t["id"].empty?
443
- @anchors[t["id"]] = anchor_struct("#{num}.#{i + 1}",
444
- t, "Requirement", "requirement")
445
- end
446
- end
447
-
448
- def hierarchical_recommendation_names(clause, num)
449
- clause.xpath(ns(".//recommendation")).each_with_index do |t, i|
450
- next if t["id"].nil? || t["id"].empty?
451
- @anchors[t["id"]] = anchor_struct("#{num}.#{i + 1}",
452
- t, "Recommendation", "recommendation")
453
- end
454
- end
455
-
456
- def clause_names(docxml, sect_num)
457
- q = "//xmlns:sections/child::*"
458
- docxml.xpath(q).each_with_index do |c, i|
459
- section_names(c, (i + sect_num), 1)
460
- end
461
- end
462
-
463
- def get_linkend(node)
464
- link = anchor_linkend(node, docid_l10n(node["target"] || "[#{node['citeas']}]"))
465
- link += eref_localities(node.xpath(ns("./locality")), link)
466
- contents = node.children.select { |c| c.name != "locality" }
467
- return link if contents.nil? || contents.empty?
468
- Nokogiri::XML::NodeSet.new(node.document, contents).to_xml
469
- # so not <origin bibitemid="ISO7301" citeas="ISO 7301">
470
- # <locality type="section"><reference>3.1</reference></locality></origin>
471
- end
472
-
473
- def load_yaml(lang, script)
474
- y = if @i18nyaml then YAML.load_file(@i18nyaml)
475
- elsif lang == "en"
476
- YAML.load_file(File.join(File.dirname(__FILE__), "i18n-en.yaml"))
477
- else
478
- YAML.load_file(File.join(File.dirname(__FILE__), "i18n-en.yaml"))
479
- end
480
- super.merge(y)
481
- end
482
-
483
- def annex_name_lbl(clause, num)
484
- l10n("<b>#{@annex_lbl} #{num}</b>")
485
- end
486
-
487
- def annex_name(annex, name, div)
488
- div.h1 **{ class: "Annex" } do |t|
489
- t << "#{get_anchors[annex['id']][:label]} &mdash; "
490
- t.b do |b|
491
- if @bibliographycount == 1 && annex.at(ns("./references"))
492
- b << "References"
493
- else
494
- name&.children&.each { |c2| parse(c2, b) }
495
- end
496
- end
497
- end
498
- end
499
-
500
- def hiersep
501
- "-"
502
- end
503
-
504
- def annex_names(clause, num)
505
- @anchors[clause["id"]] = { label: annex_name_lbl(clause, num), type: "clause",
506
- xref: "#{@annex_lbl} #{num}", level: 1 }
507
- clause.xpath(ns("./clause | ./terms | ./term | ./references")).each_with_index do |c, i|
508
- annex_names1(c, "#{num}.#{i + 1}", 2)
509
- end
510
- hierarchical_asset_names(clause, num)
511
- end
512
-
513
- def annex_names1(clause, num, level)
514
- @anchors[clause["id"]] = { label: num, xref: "#{@annex_lbl} #{num}",
515
- level: level, type: "clause" }
516
- clause.xpath(ns("./clause | ./terms | ./term | ./references")).each_with_index do |c, i|
517
- annex_names1(c, "#{num}.#{i + 1}", level + 1)
518
- end
519
- end
520
-
521
- def terms_parse(node, out)
522
- out.div **attr_code(id: node["id"]) do |div|
523
- node.at(ns("./title")) and
524
- clause_parse_title(node, div, node.at(ns("./title")), out)
525
- term_defs_boilerplate(div, node.xpath(ns(".//termdocsource")),
526
- node.at(ns(".//term")), node.at(ns("./p")))
527
- node.elements.each do |e|
528
- parse(e, div) unless %w{title source}.include? e.name
529
- end
530
- end
531
- end
532
-
533
139
  def termdef_parse(node, out)
534
140
  pref = node.at(ns("./preferred"))
535
141
  out.dl **{ class: "terms_dl" } do |dl|
@@ -544,26 +150,16 @@ module IsoDoc
544
150
  end
545
151
 
546
152
  def term_cleanup(docxml)
547
- docxml.xpath("//dl[@class = 'terms_dl']").each do |d|
153
+ docxml.xpath("//table[@class = 'terms_dl']").each do |d|
548
154
  prev = d.previous_element
549
- next unless prev.name == "dl" and prev["class"] == "terms_dl"
155
+ next unless prev.name == "table" and prev["class"] == "terms_dl"
550
156
  d.children.each { |n| prev.add_child(n.remove) }
551
157
  d.remove
552
158
  end
553
159
  docxml
554
160
  end
555
161
 
556
- def bibliography_parse(node, out)
557
- title = node&.at(ns("./title"))&.text || ""
558
- out.div do |div|
559
- node.parent.name == "annex" or
560
- div.h2 title, **{ class: "Section3" }
561
- node.elements.reject do |e|
562
- ["reference", "title", "bibitem"].include? e.name
563
- end.each { |e| parse(e, div) }
564
- biblio_list(node, div, true)
565
- end
566
- end
162
+ include BaseConvert
567
163
  end
568
164
  end
569
165
  end