metanorma-iso 1.3.24 → 1.4.1

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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/macos.yml +8 -1
  3. data/.github/workflows/ubuntu.yml +14 -3
  4. data/.github/workflows/windows.yml +8 -1
  5. data/lib/asciidoctor/iso/base.rb +21 -13
  6. data/lib/asciidoctor/iso/biblio.rng +36 -6
  7. data/lib/asciidoctor/iso/cleanup.rb +10 -1
  8. data/lib/asciidoctor/iso/front.rb +16 -110
  9. data/lib/asciidoctor/iso/front_id.rb +196 -0
  10. data/lib/asciidoctor/iso/isodoc.rng +444 -1
  11. data/lib/asciidoctor/iso/isostandard-amd.rng +98 -0
  12. data/lib/asciidoctor/iso/isostandard.rng +12 -1
  13. data/lib/asciidoctor/iso/reqt.rng +23 -0
  14. data/lib/asciidoctor/iso/section.rb +12 -0
  15. data/lib/asciidoctor/iso/term_lookup_cleanup.rb +7 -10
  16. data/lib/asciidoctor/iso/validate.rb +40 -23
  17. data/lib/asciidoctor/iso/validate_requirements.rb +1 -1
  18. data/lib/asciidoctor/iso/validate_style.rb +6 -5
  19. data/lib/asciidoctor/iso/validate_title.rb +1 -1
  20. data/lib/isodoc/iso/base_convert.rb +68 -87
  21. data/lib/isodoc/iso/html/header.html +5 -1
  22. data/lib/isodoc/iso/html/html_iso_titlepage.html +25 -16
  23. data/lib/isodoc/iso/html/isodoc.scss +25 -0
  24. data/lib/isodoc/iso/html/scripts.html +18 -0
  25. data/lib/isodoc/iso/html/style-human.scss +23 -0
  26. data/lib/isodoc/iso/html/style-iso.scss +18 -0
  27. data/lib/isodoc/iso/html/word_iso_intro.html +4 -0
  28. data/lib/isodoc/iso/html/word_iso_titlepage.html +21 -0
  29. data/lib/isodoc/iso/html/wordstyle.scss +45 -4
  30. data/lib/isodoc/iso/iso.amendment.xsl +5082 -0
  31. data/lib/isodoc/iso/iso.international-standard.xsl +1226 -530
  32. data/lib/isodoc/iso/metadata.rb +67 -23
  33. data/lib/isodoc/iso/pdf_convert.rb +5 -11
  34. data/lib/isodoc/iso/presentation_xml_convert.rb +13 -0
  35. data/lib/isodoc/iso/sections.rb +66 -0
  36. data/lib/isodoc/iso/sts_convert.rb +31 -0
  37. data/lib/isodoc/iso/xref.rb +111 -0
  38. data/lib/metanorma-iso.rb +2 -0
  39. data/lib/metanorma/iso/processor.rb +20 -9
  40. data/lib/metanorma/iso/version.rb +1 -1
  41. data/metanorma-iso.gemspec +5 -2
  42. data/spec/asciidoctor-iso/amd_spec.rb +726 -0
  43. data/spec/asciidoctor-iso/base_spec.rb +24 -20
  44. data/spec/asciidoctor-iso/cleanup_spec.rb +2 -2
  45. data/spec/asciidoctor-iso/macros_spec.rb +33 -17
  46. data/spec/asciidoctor-iso/refs_spec.rb +1 -1
  47. data/spec/asciidoctor-iso/table_spec.rb +1 -1
  48. data/spec/isodoc/amd_spec.rb +652 -0
  49. data/spec/isodoc/blocks_spec.rb +112 -27
  50. data/spec/isodoc/inline_spec.rb +2 -2
  51. data/spec/isodoc/metadata_spec.rb +88 -4
  52. data/spec/isodoc/postproc_spec.rb +11 -11
  53. data/spec/isodoc/ref_spec.rb +7 -7
  54. data/spec/isodoc/section_spec.rb +28 -1
  55. data/spec/isodoc/table_spec.rb +29 -29
  56. data/spec/isodoc/terms_spec.rb +4 -4
  57. data/spec/isodoc/xref_spec.rb +32 -26
  58. data/spec/metanorma/processor_spec.rb +2 -2
  59. data/spec/spec_helper.rb +11 -0
  60. metadata +61 -11
@@ -0,0 +1,98 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <grammar ns="https://www.metanorma.org/ns/iso" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
3
+ <!-- default namespace isostandard = "https://www.metanorma.com/ns/iso" -->
4
+ <include href="isostandard.rng">
5
+ <start>
6
+ <ref name="iso-standard"/>
7
+ </start>
8
+ <define name="sections">
9
+ <element name="sections">
10
+ <oneOrMore>
11
+ <ref name="clause"/>
12
+ </oneOrMore>
13
+ </element>
14
+ </define>
15
+ <define name="clause">
16
+ <element name="clause">
17
+ <optional>
18
+ <attribute name="type"/>
19
+ </optional>
20
+ <optional>
21
+ <attribute name="change">
22
+ <choice>
23
+ <value>add</value>
24
+ <value>delete</value>
25
+ <value>modify</value>
26
+ </choice>
27
+ </attribute>
28
+ </optional>
29
+ <optional>
30
+ <attribute name="locality"/>
31
+ </optional>
32
+ <ref name="Clause-Section"/>
33
+ </element>
34
+ </define>
35
+ <define name="iso-standard">
36
+ <element name="iso-standard">
37
+ <ref name="bibdata"/>
38
+ <optional>
39
+ <ref name="boilerplate"/>
40
+ </optional>
41
+ <ref name="preface"/>
42
+ <oneOrMore>
43
+ <ref name="sections"/>
44
+ </oneOrMore>
45
+ </element>
46
+ </define>
47
+ <define name="documentnumber">
48
+ <element name="project-number">
49
+ <optional>
50
+ <attribute name="part">
51
+ <data type="int"/>
52
+ </attribute>
53
+ </optional>
54
+ <optional>
55
+ <attribute name="subpart">
56
+ <data type="int"/>
57
+ </attribute>
58
+ </optional>
59
+ <optional>
60
+ <attribute name="amendment">
61
+ <data type="int"/>
62
+ </attribute>
63
+ </optional>
64
+ <optional>
65
+ <attribute name="corrigendum">
66
+ <data type="int"/>
67
+ </attribute>
68
+ </optional>
69
+ <optional>
70
+ <attribute name="origyr">
71
+ <data type="int"/>
72
+ </attribute>
73
+ </optional>
74
+ <text/>
75
+ </element>
76
+ </define>
77
+ <define name="BibDataExtensionType">
78
+ <ref name="doctype"/>
79
+ <ref name="editorialgroup"/>
80
+ <zeroOrMore>
81
+ <ref name="ics"/>
82
+ </zeroOrMore>
83
+ <ref name="structuredidentifier"/>
84
+ <optional>
85
+ <ref name="stagename"/>
86
+ </optional>
87
+ <optional>
88
+ <ref name="updates_document_type"/>
89
+ </optional>
90
+ </define>
91
+ </include>
92
+ <!-- end overrides -->
93
+ <define name="updates_document_type">
94
+ <element name="updates-document-type">
95
+ <ref name="DocumentType"/>
96
+ </element>
97
+ </define>
98
+ </grammar>
@@ -91,6 +91,12 @@
91
91
  </define>
92
92
  <define name="sections">
93
93
  <element name="sections">
94
+ <zeroOrMore>
95
+ <choice>
96
+ <ref name="note"/>
97
+ <ref name="admonition"/>
98
+ </choice>
99
+ </zeroOrMore>
94
100
  <ref name="clause"/>
95
101
  <optional>
96
102
  <choice>
@@ -263,6 +269,8 @@
263
269
  <value>publicly-available-specification</value>
264
270
  <value>international-workshop-agreement</value>
265
271
  <value>guide</value>
272
+ <value>amendment</value>
273
+ <value>technical-corrigendum</value>
266
274
  </choice>
267
275
  </define>
268
276
  <define name="structuredidentifier">
@@ -354,6 +362,9 @@
354
362
  <data type="boolean"/>
355
363
  </attribute>
356
364
  </optional>
365
+ <optional>
366
+ <attribute name="number"/>
367
+ </optional>
357
368
  <optional>
358
369
  <attribute name="subsequence"/>
359
370
  </optional>
@@ -510,7 +521,7 @@
510
521
  </attribute>
511
522
  </optional>
512
523
  <oneOrMore>
513
- <ref name="paragraph-with-footnote"/>
524
+ <ref name="BasicBlock"/>
514
525
  </oneOrMore>
515
526
  </element>
516
527
  </define>
@@ -30,9 +30,22 @@
30
30
  <data type="boolean"/>
31
31
  </attribute>
32
32
  </optional>
33
+ <optional>
34
+ <attribute name="number"/>
35
+ </optional>
33
36
  <optional>
34
37
  <attribute name="subsequence"/>
35
38
  </optional>
39
+ <optional>
40
+ <attribute name="keep-with-next">
41
+ <data type="boolean"/>
42
+ </attribute>
43
+ </optional>
44
+ <optional>
45
+ <attribute name="keep-lines-together">
46
+ <data type="boolean"/>
47
+ </attribute>
48
+ </optional>
36
49
  <attribute name="id">
37
50
  <data type="ID"/>
38
51
  </attribute>
@@ -141,6 +154,16 @@
141
154
  <data type="boolean"/>
142
155
  </attribute>
143
156
  </optional>
157
+ <optional>
158
+ <attribute name="keep-with-next">
159
+ <data type="boolean"/>
160
+ </attribute>
161
+ </optional>
162
+ <optional>
163
+ <attribute name="keep-lines-together">
164
+ <data type="boolean"/>
165
+ </attribute>
166
+ </optional>
144
167
  <oneOrMore>
145
168
  <ref name="BasicBlock"/>
146
169
  </oneOrMore>
@@ -35,6 +35,18 @@ module Asciidoctor
35
35
  xml_section << content
36
36
  end
37
37
  end
38
+
39
+ def section_attributes(node)
40
+ super.merge(
41
+ change: @amd ? node.attr("change") : nil,
42
+ locality: @amd ? node.attr("locality") : nil,
43
+ )
44
+ end
45
+
46
+ def sectiontype(node, level = true)
47
+ return nil if @amd
48
+ super
49
+ end
38
50
  end
39
51
  end
40
52
  end
@@ -31,23 +31,20 @@ module Asciidoctor
31
31
  remove_missing_ref(node, target)
32
32
  next
33
33
  end
34
-
35
34
  modify_ref_node(node, target)
36
35
  end
37
36
  end
38
37
 
39
38
  def remove_missing_ref(node, target)
40
- log.add('AsciiDoc Input',
41
- node,
39
+ log.add('AsciiDoc Input', node,
42
40
  %(Error: Term reference in `term[#{target}]` missing: \
43
41
  "#{target}" is not defined in document))
44
- # Term ref have parentess around it - (ref),
45
- # if no target remove parentes and render as text
46
- node.next.remove
47
42
  term_name_node = node.previous.previous
48
43
  term_name_node.remove
49
- node.previous.remove
50
- node.add_previous_sibling(term_name_node.text)
44
+ term_name_node.name = "strong"
45
+ term_name_node.children.first.content =
46
+ %(term "#{term_name_node.text}" not resolved)
47
+ node.add_previous_sibling(term_name_node)
51
48
  node.remove
52
49
  end
53
50
 
@@ -60,15 +57,15 @@ module Asciidoctor
60
57
 
61
58
  def replace_automatic_generated_ids_terms
62
59
  xmldoc.xpath('//term').each.with_object({}) do |term_node, res|
63
- next if AUTOMATIC_GENERATED_ID_REGEXP.match(term_node['id']).nil?
64
-
65
60
  normalize_id_and_memorize(term_node, res, './preferred')
66
61
  end
67
62
  end
68
63
 
69
64
  def normalize_id_and_memorize(term_node, res_table, text_selector)
70
65
  term_text = normalize_ref_id(term_node.at(text_selector).text)
66
+ unless AUTOMATIC_GENERATED_ID_REGEXP.match(term_node['id']).nil?
71
67
  term_node['id'] = unique_text_id(term_text)
68
+ end
72
69
  res_table[term_text] = term_node['id']
73
70
  end
74
71
 
@@ -24,12 +24,14 @@ module Asciidoctor
24
24
  def isosubgroup_validate(root)
25
25
  root.xpath("//technical-committee/@type").each do |t|
26
26
  unless %w{TC PC JTC JPC}.include? t.text
27
- @log.add("Document Attributes", nil, "invalid technical committee type #{t}")
27
+ @log.add("Document Attributes", nil,
28
+ "invalid technical committee type #{t}")
28
29
  end
29
30
  end
30
31
  root.xpath("//subcommittee/@type").each do |t|
31
32
  unless %w{SC JSC}.include? t.text
32
- @log.add("Document Attributes", nil, "invalid subcommittee type #{t}")
33
+ @log.add("Document Attributes", nil,
34
+ "invalid subcommittee type #{t}")
33
35
  end
34
36
  end
35
37
  end
@@ -39,10 +41,12 @@ module Asciidoctor
39
41
  root.xpath("//xref").each do |t|
40
42
  # does not deal with preceding text marked up
41
43
  preceding = t.at("./preceding-sibling::text()[last()]")
42
- next unless !preceding.nil? && /\b(see| refer to)\s*$/mi.match(preceding)
44
+ next unless !preceding.nil? &&
45
+ /\b(see| refer to)\s*$/mi.match(preceding)
43
46
  (target = root.at("//*[@id = '#{t['target']}']")) || next
44
47
  if target&.at("./ancestor-or-self::*[@obligation = 'normative']")
45
- @log.add("Style", t, "'see #{t['target']}' is pointing to a normative section")
48
+ @log.add("Style", t,
49
+ "'see #{t['target']}' is pointing to a normative section")
46
50
  end
47
51
  end
48
52
  end
@@ -51,13 +55,16 @@ module Asciidoctor
51
55
  def see_erefs_validate(root)
52
56
  root.xpath("//eref").each do |t|
53
57
  preceding = t.at("./preceding-sibling::text()[last()]")
54
- next unless !preceding.nil? && /\b(see|refer to)\s*$/mi.match(preceding)
58
+ next unless !preceding.nil? &&
59
+ /\b(see|refer to)\s*$/mi.match(preceding)
55
60
  unless target = root.at("//*[@id = '#{t['bibitemid']}']")
56
- @log.add("Bibliography", t, "'#{t} is not pointing to a real reference")
61
+ @log.add("Bibliography", t,
62
+ "'#{t} is not pointing to a real reference")
57
63
  next
58
64
  end
59
65
  if target.at("./ancestor::references[@normative = 'true']")
60
- @log.add("Style", t, "'see #{t}' is pointing to a normative reference")
66
+ @log.add("Style", t,
67
+ "'see #{t}' is pointing to a normative reference")
61
68
  end
62
69
  end
63
70
  end
@@ -67,8 +74,9 @@ module Asciidoctor
67
74
  root.xpath("//eref[descendant::locality]").each do |t|
68
75
  if /^(ISO|IEC)/.match t["citeas"]
69
76
  unless /:[ ]?(\d+{4}|–)$/.match t["citeas"]
70
- @log.add("Style", t, "undated reference #{t['citeas']} should not contain "\
71
- "specific elements")
77
+ @log.add("Style", t,
78
+ "undated reference #{t['citeas']} should not contain "\
79
+ "specific elements")
72
80
  end
73
81
  end
74
82
  end
@@ -105,32 +113,37 @@ module Asciidoctor
105
113
  doctype = xmldoc&.at("//bibdata/ext/doctype")&.text
106
114
  %w(international-standard technical-specification technical-report
107
115
  publicly-available-specification international-workshop-agreement
108
- guide).include? doctype or
109
- @log.add("Document Attributes", nil, "#{doctype} is not a recognised document type")
116
+ guide amendment technical-corrigendum).include? doctype or
117
+ @log.add("Document Attributes", nil,
118
+ "#{doctype} is not a recognised document type")
110
119
  end
111
120
 
112
121
  def script_validate(xmldoc)
113
122
  script = xmldoc&.at("//bibdata/script")&.text
114
123
  script == "Latn" or
115
- @log.add("Document Attributes", nil, "#{script} is not a recognised script")
124
+ @log.add("Document Attributes", nil,
125
+ "#{script} is not a recognised script")
116
126
  end
117
127
 
118
128
  def stage_validate(xmldoc)
119
129
  stage = xmldoc&.at("//bibdata/status/stage")&.text
120
130
  %w(00 10 20 30 40 50 60 90 95).include? stage or
121
- @log.add("Document Attributes", nil, "#{stage} is not a recognised stage")
131
+ @log.add("Document Attributes", nil,
132
+ "#{stage} is not a recognised stage")
122
133
  end
123
134
 
124
135
  def substage_validate(xmldoc)
125
136
  substage = xmldoc&.at("//bibdata/status/substage")&.text or return
126
137
  %w(00 20 60 90 92 93 98 99).include? substage or
127
- @log.add("Document Attributes", nil, "#{substage} is not a recognised substage")
138
+ @log.add("Document Attributes", nil,
139
+ "#{substage} is not a recognised substage")
128
140
  end
129
141
 
130
142
  def iteration_validate(xmldoc)
131
143
  iteration = xmldoc&.at("//bibdata/status/iteration")&.text or return
132
144
  /^\d+/.match(iteration) or
133
- @log.add("Document Attributes", nil, "#{iteration} is not a recognised iteration")
145
+ @log.add("Document Attributes", nil,
146
+ "#{iteration} is not a recognised iteration")
134
147
  end
135
148
 
136
149
  def bibdata_validate(doc)
@@ -157,20 +170,24 @@ module Asciidoctor
157
170
 
158
171
  def bibitem_validate(xmldoc)
159
172
  xmldoc.xpath("//bibitem[date/on = '–']").each do |b|
160
- found = false
161
- b.xpath("./note").each do |n|
162
- found = true if /^ISO DATE:/.match n.text
163
- end
164
- found or
165
- @log.add("Style", b, "Reference #{b&.at("./@id")&.text} does not have an "\
166
- "associated footnote indicating unpublished status")
173
+ b.at("./note[@type = 'ISO DATE']") or
174
+ @log.add("Style", b,
175
+ "Reference #{b&.at("./@id")&.text} does not have an "\
176
+ "associated footnote indicating unpublished status")
167
177
  end
168
178
  end
169
179
 
170
180
  def validate(doc)
171
181
  content_validate(doc)
182
+ doctype = doc&.at("//bibdata/ext/doctype")&.text
183
+ schema = case doctype
184
+ when "amendment", "technical-corrigendum" # @amd
185
+ "isostandard-amd.rng"
186
+ else
187
+ "isostandard.rng"
188
+ end
172
189
  schema_validate(formattedstr_strip(doc.dup),
173
- File.join(File.dirname(__FILE__), "isostandard.rng"))
190
+ File.join(File.dirname(__FILE__), schema))
174
191
  end
175
192
  end
176
193
  end
@@ -16,7 +16,7 @@ module Asciidoctor
16
16
  (is|are)_not_(allowed | permitted |
17
17
  acceptable | permissible) |
18
18
  (is|are)_not_to_be |
19
- do_not )
19
+ [.,:;]_do_not )
20
20
  \\b
21
21
  REGEXP
22
22
  REQUIREMENT_RE =
@@ -1,6 +1,6 @@
1
1
  require "metanorma-standoc"
2
2
  require "nokogiri"
3
- require "pp"
3
+ require "tokenizer"
4
4
 
5
5
  module Asciidoctor
6
6
  module ISO
@@ -70,7 +70,7 @@ module Asciidoctor
70
70
  # and a negative match on its preceding token
71
71
  def style_two_regex_not_prev(n, text, re, re_prev, warning)
72
72
  return if text.nil?
73
- arr = text.split(/\W+/)
73
+ arr = Tokenizer::WhitespaceTokenizer.new.tokenize(text)
74
74
  arr.each_index do |i|
75
75
  m = re.match arr[i]
76
76
  m_prev = i.zero? ? nil : re_prev.match(arr[i - 1])
@@ -91,9 +91,10 @@ module Asciidoctor
91
91
  # ISO/IEC DIR 2, 9.1
92
92
  # ISO/IEC DIR 2, Table B.1
93
93
  def style_number(n, t)
94
- style_two_regex_not_prev(n, t, /^(?<num>-?[0-9]{4,}[,0-9]*)$/,
95
- %r{(\bISO|\bIEC|\bIEEE/)$},
96
- "number not broken up in threes")
94
+ style_two_regex_not_prev(
95
+ n, t, /^(?<num>-?[0-9]{4,}[,0-9]*)$/,
96
+ %r{\b(ISO|IEC|IEEE/|(in|January|February|March|April|May|June|August|September|October|November|December)\b)$},
97
+ "number not broken up in threes")
97
98
  style_regex(/\b(?<num>[0-9]+\.[0-9]+)/i,
98
99
  "possible decimal point", n, t)
99
100
  style_regex(/\b(?<num>billion[s]?)\b/i,
@@ -36,7 +36,7 @@ module Asciidoctor
36
36
 
37
37
  # ISO/IEC DIR 2, 11.4
38
38
  def title_subpart_validate(root)
39
- docid = root.at("//bibdata/docidentifier[@type = 'iso']")
39
+ docid = root.at("//bibdata/docidentifier[@type = 'ISO']")
40
40
  subpart = /-\d+-\d+/.match docid
41
41
  iec = root.at("//bibdata/contributor[role/@type = 'publisher']/"\
42
42
  "organization[abbreviation = 'IEC' or "\
@@ -1,5 +1,7 @@
1
1
  require "isodoc"
2
2
  require_relative "metadata"
3
+ require_relative "sections"
4
+ require_relative "xref"
3
5
  require "fileutils"
4
6
 
5
7
  module IsoDoc
@@ -9,43 +11,25 @@ module IsoDoc
9
11
  @meta = Metadata.new(lang, script, labels)
10
12
  end
11
13
 
12
- def implicit_reference(b)
13
- b&.at(ns("./docidentifier"))&.text == "IEV"
14
+ def xref_init(lang, script, klass, labels, options)
15
+ @xrefs = Xref.new(lang, script, klass, labels, options)
14
16
  end
15
17
 
16
- def introduction(isoxml, out)
17
- f = isoxml.at(ns("//introduction")) || return
18
- num = f.at(ns(".//clause")) ? "0" : nil
19
- title_attr = { class: "IntroTitle" }
20
- page_break(out)
21
- out.div **{ class: "Section3", id: f["id"] } do |div|
22
- clause_name(num, @introduction_lbl, div, title_attr)
23
- f.elements.each do |e|
24
- parse(e, div) unless e.name == "title"
25
- end
26
- end
18
+ def amd(docxml)
19
+ doctype = docxml&.at(ns("//bibdata/ext/doctype"))&.text
20
+ %w(amendment technical-corrigendum).include? doctype
27
21
  end
28
22
 
29
- def foreword(isoxml, out)
30
- f = isoxml.at(ns("//foreword")) || return
31
- page_break(out)
32
- out.div **attr_code(id: f["id"]) do |s|
33
- s.h1(**{ class: "ForewordTitle" }) { |h1| h1 << @foreword_lbl }
34
- f.elements.each { |e| parse(e, s) unless e.name == "title" }
23
+ def convert1(docxml, filename, dir)
24
+ if amd(docxml)
25
+ @oldsuppressheadingnumbers = @suppressheadingnumbers
26
+ @suppressheadingnumbers = true
35
27
  end
36
- end
37
-
38
- def initial_anchor_names(d)
39
28
  super
40
- introduction_names(d.at(ns("//introduction")))
41
29
  end
42
30
 
43
- # we can reference 0-number clauses in introduction
44
- def introduction_names(clause)
45
- return if clause.nil?
46
- clause.xpath(ns("./clause")).each_with_index do |c, i|
47
- section_names1(c, "0.#{i + 1}", 2)
48
- end
31
+ def implicit_reference(b)
32
+ b&.at(ns("./docidentifier"))&.text == "IEV"
49
33
  end
50
34
 
51
35
  # terms not defined in standoc
@@ -57,36 +41,6 @@ module IsoDoc
57
41
  end
58
42
  end
59
43
 
60
- def annex_names(clause, num)
61
- appendix_names(clause, num)
62
- super
63
- end
64
-
65
- def appendix_names(clause, num)
66
- clause.xpath(ns("./appendix")).each_with_index do |c, i|
67
- @anchors[c["id"]] = anchor_struct(i + 1, nil, @appendix_lbl, "clause")
68
- @anchors[c["id"]][:level] = 2
69
- @anchors[c["id"]][:container] = clause["id"]
70
- end
71
- end
72
-
73
- def section_names1(clause, num, level)
74
- @anchors[clause["id"]] =
75
- { label: num, level: level, xref: num }
76
- # subclauses are not prefixed with "Clause"
77
- clause.xpath(ns("./clause | ./terms | ./term | ./definitions | ./references")).
78
- each_with_index do |c, i|
79
- section_names1(c, "#{num}.#{i + 1}", level + 1)
80
- end
81
- end
82
-
83
- def annex_names1(clause, num, level)
84
- @anchors[clause["id"]] = { label: num, xref: num, level: level }
85
- clause.xpath(ns("./clause | ./references")).each_with_index do |c, i|
86
- annex_names1(c, "#{num}.#{i + 1}", level + 1)
87
- end
88
- end
89
-
90
44
  def eref_localities1_zh(target, type, from, to, delim)
91
45
  subsection = from&.text&.match(/\./)
92
46
  ret = (delim == ";") ? ";" : (type == "list") ? "" : delim
@@ -100,6 +54,7 @@ module IsoDoc
100
54
  end
101
55
 
102
56
  def eref_localities1(target, type, from, to, delim, lang = "en")
57
+ return "" if type == "anchor"
103
58
  subsection = from&.text&.match(/\./)
104
59
  type = type.downcase
105
60
  return l10n(eref_localities1_zh(target, type, from, to, delim)) if lang == "zh"
@@ -114,12 +69,12 @@ module IsoDoc
114
69
  end
115
70
 
116
71
  def prefix_container(container, linkend, target)
117
- delim = anchor(target, :type) == "listitem" ? " " : ", "
118
- l10n(anchor(container, :xref) + delim + linkend)
72
+ delim = @xrefs.anchor(target, :type) == "listitem" ? " " : ", "
73
+ l10n(@xrefs.anchor(container, :xref) + delim + linkend)
119
74
  end
120
75
 
121
76
  def example_span_label(node, div, name)
122
- n = get_anchors[node["id"]]
77
+ n = @xrefs.get[node["id"]]
123
78
  div.span **{ class: "example_label" } do |p|
124
79
  lbl = (n.nil? || n[:label].nil? || n[:label].empty?) ? @example_lbl :
125
80
  l10n("#{@example_lbl} #{n[:label]}")
@@ -191,23 +146,6 @@ module IsoDoc
191
146
  ""
192
147
  end
193
148
 
194
- def format_ref(ref, prefix, isopub, date, allparts)
195
- ref = ref.sub(/ \(All Parts\)/i, "")
196
- ref = docid_prefix(prefix, ref)
197
- return "[#{ref}]" if /^\d+$/.match(ref) && !prefix &&
198
- !/^\[.*\]$/.match(ref)
199
- ref
200
- end
201
-
202
- def table_footnote_reference_format(a)
203
- a.content = a.content + ")"
204
- end
205
-
206
- def clause_parse_title(node, div, c1, out)
207
- return inline_header_title(out, node, c1) if c1.nil?
208
- super
209
- end
210
-
211
149
  def cleanup(docxml)
212
150
  super
213
151
  table_th_center(docxml)
@@ -221,14 +159,57 @@ module IsoDoc
221
159
  end
222
160
  end
223
161
 
224
- def hierarchical_formula_names(clause, num)
225
- c = IsoDoc::Function::XrefGen::Counter.new
226
- clause.xpath(ns(".//formula")).each do |t|
227
- next if t["id"].nil? || t["id"].empty?
228
- @anchors[t["id"]] =
229
- anchor_struct("#{num}#{hiersep}#{c.increment(t).print}", t,
230
- t["inequality"] ? @inequality_lbl : @formula_lbl,
231
- "formula", t["unnumbered"])
162
+ def formula_where(dl, out)
163
+ return if dl.nil?
164
+ return super unless (dl&.xpath(ns("./dt"))&.size == 1 &&
165
+ dl&.at(ns("./dd"))&.elements&.size == 1 &&
166
+ dl&.at(ns("./dd/p")))
167
+ out.span **{ class: "zzMoveToFollowing" } do |s|
168
+ s << "#{@where_lbl} "
169
+ dl.at(ns("./dt")).children.each { |n| parse(n, s) }
170
+ s << " "
171
+ end
172
+ parse(dl.at(ns("./dd/p")), out)
173
+ end
174
+
175
+ def admonition_parse(node, out)
176
+ type = node["type"]
177
+ name = admonition_name(node, type)
178
+ out.div **{ id: node["id"], class: admonition_class(node) } do |div|
179
+ node.first_element_child.name == "p" ?
180
+ admonition_p_parse(node, div, name) : admonition_parse1(node, div, name)
181
+ end
182
+ end
183
+
184
+ def admonition_parse1(node, div, name)
185
+ div.p do |p|
186
+ admonition_name_parse(node, p, name) if name
187
+ end
188
+ node.children.each { |n| parse(n, div) unless n.name == "name" }
189
+ end
190
+
191
+ def admonition_p_parse(node, div, name)
192
+ div.p do |p|
193
+ admonition_name_parse(node, p, name) if name
194
+ node.first_element_child.children.each { |n| parse(n, p) }
195
+ end
196
+ node.element_children[1..-1].each { |n| parse(n, div) }
197
+ end
198
+
199
+ def admonition_name_parse(_node, div, name)
200
+ name.children.each { |n| parse(n, div) }
201
+ div << " &mdash; "
202
+ end
203
+
204
+ def figure_name_parse(node, div, name)
205
+ lbl = @xrefs.anchor(node['id'], :label, false)
206
+ lbl = nil if labelled_ancestor(node) && node.ancestors("figure").empty?
207
+ return if lbl.nil? && name.nil?
208
+ div.p **{ class: "FigureTitle", style: "text-align:center;" } do |p|
209
+ figname = node.parent.name == "figure" ? "" : "#{@figure_lbl} "
210
+ lbl.nil? or p << l10n("#{figname}#{lbl}")
211
+ name and !lbl.nil? and p << "&nbsp;&mdash; "
212
+ name and name.children.each { |n| parse(n, div) }
232
213
  end
233
214
  end
234
215
  end