metanorma-iso 1.8.6 → 1.9.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5a0192dfdd4d26ab4c59d50a8b7e91e36ce83a27c9835f01221444e1ecf2c278
4
- data.tar.gz: 4f4b37c785f3fe5c58777962943ebe8c27a38415cd178d8abab18dc95cf24192
3
+ metadata.gz: b67209d73be23ff04c3933a086c5e9de18463c17472b535305642a81df58820c
4
+ data.tar.gz: e13a27804003551fd7da54476f27b61d98f7a23234a3e5eafc6900fe22265a8a
5
5
  SHA512:
6
- metadata.gz: 91c94f57a7a8437f4c64366aeb1f14a5ede637357fd19485de1311e18d112ec22ff4325e35158c4322fc5a763292add832d4bc02b64c425e59b778e92ca757e8
7
- data.tar.gz: 47e01118ffc205d246a082130c25893e6e3c41bc4c2ce171949d5f3e308e30a64c7ce49b903aa9f3434537eac2f275e50443f1887014b8a256a48061e38d3250
6
+ metadata.gz: 73714b546a1f6a7680400be13c4672e33c38f897688409258085972dc593c0dd45c8327b4340c4d9b535c4f32d0c8b0ea4d58db1855659162b7b9a6eb26d9dca
7
+ data.tar.gz: 3289bacc2f84c35c53f98e6950aafa0530189293340be023eff84a81b917c6287a7f9df48295bad57e617e0de610a54f14b5c8aff394680abfdb41d7e5f29a46
@@ -3,7 +3,6 @@ require "nokogiri"
3
3
  require "htmlentities"
4
4
  require "json"
5
5
  require "pathname"
6
- require "open-uri"
7
6
 
8
7
  module Asciidoctor
9
8
  module ISO
@@ -204,6 +204,18 @@
204
204
  </zeroOrMore>
205
205
  </element>
206
206
  </define>
207
+ <define name="dt">
208
+ <element name="dt">
209
+ <optional>
210
+ <attribute name="id">
211
+ <data type="ID"/>
212
+ </attribute>
213
+ </optional>
214
+ <zeroOrMore>
215
+ <ref name="TextElement"/>
216
+ </zeroOrMore>
217
+ </element>
218
+ </define>
207
219
  <define name="example">
208
220
  <element name="example">
209
221
  <attribute name="id">
@@ -899,7 +911,7 @@
899
911
  </include>
900
912
  <!-- end overrides -->
901
913
  <define name="docsubtype">
902
- <element name="docsubtype">
914
+ <element name="subdoctype">
903
915
  <ref name="DocumentSubtype"/>
904
916
  </element>
905
917
  </define>
@@ -954,6 +966,16 @@
954
966
  </define>
955
967
  <define name="concept">
956
968
  <element name="concept">
969
+ <optional>
970
+ <attribute name="ital">
971
+ <data type="boolean"/>
972
+ </attribute>
973
+ </optional>
974
+ <optional>
975
+ <attribute name="ref">
976
+ <data type="boolean"/>
977
+ </attribute>
978
+ </optional>
957
979
  <optional>
958
980
  <element name="refterm">
959
981
  <zeroOrMore>
@@ -989,8 +1011,14 @@
989
1011
  <ref name="imagemap"/>
990
1012
  <ref name="svgmap"/>
991
1013
  <ref name="inputform"/>
1014
+ <ref name="toc"/>
992
1015
  </choice>
993
1016
  </define>
1017
+ <define name="toc">
1018
+ <element name="toc">
1019
+ <ref name="ul"/>
1020
+ </element>
1021
+ </define>
994
1022
  <define name="inputform">
995
1023
  <element name="form">
996
1024
  <attribute name="id">
@@ -998,6 +1026,9 @@
998
1026
  </attribute>
999
1027
  <attribute name="name"/>
1000
1028
  <attribute name="action"/>
1029
+ <optional>
1030
+ <attribute name="class"/>
1031
+ </optional>
1001
1032
  <zeroOrMore>
1002
1033
  <choice>
1003
1034
  <ref name="TextElement"/>
@@ -1229,6 +1260,12 @@
1229
1260
  <optional>
1230
1261
  <attribute name="type"/>
1231
1262
  </optional>
1263
+ <optional>
1264
+ <attribute name="identifier"/>
1265
+ </optional>
1266
+ <optional>
1267
+ <attribute name="prefix"/>
1268
+ </optional>
1232
1269
  <text/>
1233
1270
  </define>
1234
1271
  <define name="ics">
@@ -1490,26 +1527,26 @@
1490
1527
  <optional>
1491
1528
  <ref name="section-title"/>
1492
1529
  </optional>
1493
- <group>
1530
+ <choice>
1494
1531
  <choice>
1495
1532
  <group>
1496
- <zeroOrMore>
1533
+ <oneOrMore>
1497
1534
  <ref name="BasicBlock"/>
1498
- </zeroOrMore>
1535
+ </oneOrMore>
1499
1536
  <zeroOrMore>
1500
1537
  <ref name="note"/>
1501
1538
  </zeroOrMore>
1502
1539
  </group>
1503
1540
  <ref name="amend"/>
1504
1541
  </choice>
1505
- <zeroOrMore>
1542
+ <oneOrMore>
1506
1543
  <choice>
1507
1544
  <ref name="clause-subsection"/>
1508
1545
  <ref name="terms"/>
1509
1546
  <ref name="definitions"/>
1510
1547
  </choice>
1511
- </zeroOrMore>
1512
- </group>
1548
+ </oneOrMore>
1549
+ </choice>
1513
1550
  </define>
1514
1551
  <define name="Annex-Section">
1515
1552
  <optional>
@@ -101,7 +101,11 @@
101
101
  <ref name="definitions"/>
102
102
  </optional>
103
103
  <oneOrMore>
104
- <ref name="clause"/>
104
+ <choice>
105
+ <ref name="clause"/>
106
+ <ref name="term-clause"/>
107
+ <ref name="terms"/>
108
+ </choice>
105
109
  </oneOrMore>
106
110
  </element>
107
111
  </define>
@@ -136,7 +140,7 @@
136
140
  <optional>
137
141
  <ref name="section-title"/>
138
142
  </optional>
139
- <group>
143
+ <choice>
140
144
  <choice>
141
145
  <group>
142
146
  <oneOrMore>
@@ -151,7 +155,7 @@
151
155
  <oneOrMore>
152
156
  <ref name="clause-subsection"/>
153
157
  </oneOrMore>
154
- </group>
158
+ </choice>
155
159
  </define>
156
160
  <define name="term">
157
161
  <element name="term">
@@ -64,9 +64,9 @@
64
64
  <optional>
65
65
  <ref name="label"/>
66
66
  </optional>
67
- <optional>
67
+ <zeroOrMore>
68
68
  <ref name="subject"/>
69
- </optional>
69
+ </zeroOrMore>
70
70
  <zeroOrMore>
71
71
  <ref name="reqinherit"/>
72
72
  </zeroOrMore>
@@ -80,6 +80,7 @@
80
80
  <ref name="verification"/>
81
81
  <ref name="import"/>
82
82
  <ref name="description"/>
83
+ <ref name="component"/>
83
84
  </choice>
84
85
  </zeroOrMore>
85
86
  <optional>
@@ -105,12 +106,16 @@
105
106
  </define>
106
107
  <define name="subject">
107
108
  <element name="subject">
108
- <text/>
109
+ <oneOrMore>
110
+ <ref name="TextElement"/>
111
+ </oneOrMore>
109
112
  </element>
110
113
  </define>
111
114
  <define name="reqinherit">
112
115
  <element name="inherit">
113
- <text/>
116
+ <oneOrMore>
117
+ <ref name="TextElement"/>
118
+ </oneOrMore>
114
119
  </element>
115
120
  </define>
116
121
  <define name="measurementtarget">
@@ -138,6 +143,12 @@
138
143
  <ref name="RequirementSubpart"/>
139
144
  </element>
140
145
  </define>
146
+ <define name="component">
147
+ <element name="component">
148
+ <attribute name="class"/>
149
+ <ref name="RequirementSubpart"/>
150
+ </element>
151
+ </define>
141
152
  <define name="reqt_references">
142
153
  <element name="references">
143
154
  <oneOrMore>
@@ -33,6 +33,9 @@ module Asciidoctor
33
33
  def sectiontype(node, level = true)
34
34
  return nil if @amd
35
35
 
36
+ ret = sectiontype_streamline(sectiontype1(node))
37
+ return ret if ret == "terms and definitions" && @vocab
38
+
36
39
  super
37
40
  end
38
41
  end
@@ -32,7 +32,7 @@ module Asciidoctor
32
32
  root.xpath("//xref").each do |t|
33
33
  preceding = t.at("./preceding-sibling::text()[last()]")
34
34
  next unless !preceding.nil? &&
35
- /\b(see| refer to)\s*$/mi.match(preceding)
35
+ /\b(see| refer to)\s*\Z/mi.match(preceding)
36
36
 
37
37
  (target = root.at("//*[@id = '#{t['target']}']")) || next
38
38
  if target&.at("./ancestor-or-self::*[@obligation = 'normative']")
@@ -46,7 +46,7 @@ module Asciidoctor
46
46
  def see_erefs_validate(root)
47
47
  root.xpath("//eref").each do |t|
48
48
  prec = t.at("./preceding-sibling::text()[last()]")
49
- next unless !prec.nil? && /\b(see|refer to)\s*$/mi.match(prec)
49
+ next unless !prec.nil? && /\b(see|refer to)\s*\Z/mi.match(prec)
50
50
 
51
51
  unless target = root.at("//*[@id = '#{t['bibitemid']}']")
52
52
  @log.add("Bibliography", t,
@@ -80,23 +80,11 @@ module Asciidoctor
80
80
  xmldoc.xpath("//term").each do |t|
81
81
  para = t.at("./definition") || return
82
82
  term = t.at("./preferred").text
83
- termdef_warn(para.text, /^(the|a)\b/i, t, term,
83
+ termdef_warn(para.text, /\A(the|a)\b/i, t, term,
84
84
  "term definition starts with article")
85
- termdef_warn(para.text, /\.$/i, t, term,
85
+ termdef_warn(para.text, /\.\Z/i, t, term,
86
86
  "term definition ends with period")
87
87
  end
88
- cited_term_style(xmldoc)
89
- end
90
-
91
- # ISO/IEC DIR 2, 16.5.10
92
- def cited_term_style(xmldoc)
93
- xmldoc.xpath("//term//xref").each do |x|
94
- next unless xmldoc.at("//term[@id = '#{x['target']}']")
95
-
96
- x&.previous&.text == " (" and x&.previous&.previous&.name == "em" or
97
- style_warning(x, "term citation not preceded with italicised term",
98
- x.parent.text)
99
- end
100
88
  end
101
89
 
102
90
  def doctype_validate(xmldoc)
@@ -150,7 +138,6 @@ module Asciidoctor
150
138
  isosubgroup_validate(doc.root)
151
139
  onlychild_clause_validate(doc.root)
152
140
  termdef_style(doc.root)
153
- iev_validate(doc.root)
154
141
  see_xrefs_validate(doc.root)
155
142
  see_erefs_validate(doc.root)
156
143
  locality_erefs_validate(doc.root)
@@ -42,7 +42,7 @@ module Asciidoctor
42
42
  f.empty? && return
43
43
  (f.size == 1) || @log.add("Style", f.first, ONE_SYMBOLS_WARNING)
44
44
  f.first.elements.each do |e|
45
- unless e.name == "dl"
45
+ unless %w(title dl).include? e.name
46
46
  @log.add("Style", f.first, NON_DL_SYMBOLS_WARNING)
47
47
  return
48
48
  end
@@ -99,57 +99,73 @@ module Asciidoctor
99
99
  "//clause[descendant::references][not(parent::clause)]".freeze
100
100
 
101
101
  def sections_sequence_validate(root)
102
- vocab = root&.at("//bibdata/ext/subdoctype")&.text == "vocabulary"
102
+ names, n = sections_sequence_validate_start(root)
103
+ if root&.at("//bibdata/ext/subdoctype")&.text == "vocabulary"
104
+ names, n = sections_sequence_validate_body_vocab(names, n)
105
+ else
106
+ names, n = sections_sequence_validate_body(names, n)
107
+ end
108
+ sections_sequence_validate_end(names, n)
109
+ end
110
+
111
+ def sections_sequence_validate_start(root)
103
112
  names = root.xpath(SECTIONS_XPATH)
104
113
  names = seqcheck(names, SEQ[0][:msg], SEQ[0][:val])
105
114
  n = names[0]
106
115
  names = seqcheck(names, SEQ[1][:msg], SEQ[1][:val])
107
- if n&.at("./self::introduction")
116
+ n&.at("./self::introduction") and
108
117
  names = seqcheck(names, SEQ[2][:msg], SEQ[2][:val])
109
- end
110
118
  names = seqcheck(names, SEQ[3][:msg], SEQ[3][:val])
111
119
  n = names.shift
112
- if n&.at("./self::definitions")
113
- n = names.shift
114
- end
115
- if n.nil? || n.name != "clause"
116
- @log.add("Style", n, "Document must contain at least one clause")
120
+ n = names.shift if n&.at("./self::definitions")
121
+ [names, n]
122
+ end
123
+
124
+ def sections_sequence_validate_body(names, elem)
125
+ if elem.nil? || elem.name != "clause"
126
+ @log.add("Style", elem, "Document must contain at least one clause")
117
127
  end
118
- n&.at("./self::clause") ||
119
- @log.add("Style", n, "Document must contain clause after "\
128
+ elem&.at("./self::clause") ||
129
+ @log.add("Style", elem, "Document must contain clause after "\
120
130
  "Terms and Definitions")
121
- n&.at("./self::clause[@type = 'scope']") &&
122
- @log.add("Style", n, "Scope must occur before Terms and Definitions")
123
- n = names.shift
124
- while n&.name == "clause" || (vocab && n&.name == "terms")
125
- n&.at("./self::clause[@type = 'scope']")
126
- @log.add("Style", n, "Scope must occur before Terms and Definitions")
127
- n = names.shift
131
+ elem&.at("./self::clause[@type = 'scope']") &&
132
+ @log.add("Style", elem, "Scope must occur before Terms and Definitions")
133
+ elem = names.shift
134
+ while elem&.name == "clause"
135
+ elem&.at("./self::clause[@type = 'scope']")
136
+ @log.add("Style", elem, "Scope must occur before Terms and Definitions")
137
+ elem = names.shift
128
138
  end
129
- if vocab
130
- unless %w(annex references terms).include? n&.name
131
- @log.add("Style", n, "Only terms, annexes and references can follow clauses")
132
- end
133
- else
134
- unless %w(annex references).include? n&.name
135
- @log.add("Style", n, "Only annexes and references can follow clauses")
136
- end
139
+ %w(annex references).include? elem&.name or
140
+ @log.add("Style", elem, "Only annexes and references can follow clauses")
141
+ [names, elem]
142
+ end
143
+
144
+ def sections_sequence_validate_body_vocab(names, elem)
145
+ while elem && %w(clause terms).include?(elem.name)
146
+ elem = names.shift
137
147
  end
138
- while n&.name == "annex"
139
- n = names.shift
140
- if n.nil?
148
+ %w(annex references).include? elem&.name or
149
+ @log.add("Style", elem, "Only annexes and references can follow terms and clauses")
150
+ [names, elem]
151
+ end
152
+
153
+ def sections_sequence_validate_end(names, elem)
154
+ while elem&.name == "annex"
155
+ elem = names.shift
156
+ if elem.nil?
141
157
  @log.add("Style", nil, "Document must include (references) "\
142
158
  "Normative References")
143
159
  end
144
160
  end
145
- n&.at("./self::references[@normative = 'true']") ||
161
+ elem&.at("./self::references[@normative = 'true']") ||
146
162
  @log.add("Style", nil, "Document must include (references) "\
147
163
  "Normative References")
148
- n = names&.shift
149
- n&.at("./self::references[@normative = 'false']") ||
150
- @log.add("Style", n, "Final section must be (references) Bibliography")
164
+ elem = names&.shift
165
+ elem&.at("./self::references[@normative = 'false']") ||
166
+ @log.add("Style", elem, "Final section must be (references) Bibliography")
151
167
  names.empty? ||
152
- @log.add("Style", n, "There are sections after the final Bibliography")
168
+ @log.add("Style", elem, "There are sections after the final Bibliography")
153
169
  end
154
170
 
155
171
  def style_warning(node, msg, text = nil)
@@ -102,8 +102,8 @@ module Asciidoctor
102
102
  # ISO/IEC DIR 2, Table B.1
103
103
  def style_number(node, text)
104
104
  style_two_regex_not_prev(
105
- node, text, /^(?<num>-?[0-9]{4,}[,0-9]*)$/,
106
- %r{\b(ISO|IEC|IEEE/|(in|January|February|March|April|May|June|August|September|October|November|December)\b)$},
105
+ node, text, /^(?<num>-?[0-9]{4,}[,0-9]*)\Z/,
106
+ %r{\b(ISO|IEC|IEEE/|(in|January|February|March|April|May|June|August|September|October|November|December)\b)\Z},
107
107
  "number not broken up in threes"
108
108
  )
109
109
  style_regex(/\b(?<num>[0-9]+\.[0-9]+)/i,
@@ -123,7 +123,7 @@ module Asciidoctor
123
123
  # ISO/IEC DIR 2, 8.4
124
124
  # ISO/IEC DIR 2, 9.3
125
125
  def style_abbrev(node, text)
126
- style_regex(/(^|\s)(?!e\.g\.|i\.e\.)
126
+ style_regex(/(\A|\s)(?!e\.g\.|i\.e\.)
127
127
  (?<num>[a-z]{1,2}\.([a-z]{1,2}|\.))\b/ix,
128
128
  "no dots in abbreviations", node, text)
129
129
  style_regex(/\b(?<num>ppm)\b/i,
@@ -112,9 +112,9 @@ module IsoDoc
112
112
 
113
113
  def formula_where(dlist, out)
114
114
  return if dlist.nil?
115
- return super unless (dlist&.xpath(ns("./dt"))&.size == 1 &&
116
- dlist&.at(ns("./dd"))&.elements&.size == 1 &&
117
- dlist&.at(ns("./dd/p")))
115
+ return super unless dlist&.xpath(ns("./dt"))&.size == 1 &&
116
+ dlist&.at(ns("./dd"))&.elements&.size == 1 &&
117
+ dlist&.at(ns("./dd/p"))
118
118
 
119
119
  out.span **{ class: "zzMoveToFollowing" } do |s|
120
120
  s << "#{@i18n.where} "
@@ -128,8 +128,11 @@ module IsoDoc
128
128
  type = node["type"]
129
129
  name = admonition_name(node, type)
130
130
  out.div **{ id: node["id"], class: admonition_class(node) } do |div|
131
- node.first_element_child.name == "p" ?
132
- admonition_p_parse(node, div, name) : admonition_parse1(node, div, name)
131
+ if node.first_element_child.name == "p"
132
+ admonition_p_parse(node, div, name)
133
+ else
134
+ admonition_parse1(node, div, name)
135
+ end
133
136
  end
134
137
  end
135
138
 
@@ -160,10 +163,32 @@ module IsoDoc
160
163
  end
161
164
 
162
165
  def middle(isoxml, out)
163
- super
166
+ middle_title(isoxml, out)
167
+ middle_admonitions(isoxml, out)
168
+ i = scope isoxml, out, 0
169
+ i = norm_ref isoxml, out, i
170
+ # i = terms_defs isoxml, out, i
171
+ # symbols_abbrevs isoxml, out, i
172
+ clause_etc isoxml, out, i
173
+ annex isoxml, out
174
+ bibliography isoxml, out
164
175
  indexsect isoxml, out
165
176
  end
166
177
 
178
+ def clause_etc(isoxml, out, num)
179
+ isoxml.xpath(ns("//sections/clause[not(@type = 'scope')] | "\
180
+ "//sections/terms | //sections/definitions")).each do |f|
181
+ out.div **attr_code(id: f["id"],
182
+ class: f.name == "definitions" ? "Symbols" : nil) do |div|
183
+ num = num + 1
184
+ clause_name(num, f&.at(ns("./title")), div, nil)
185
+ f.elements.each do |e|
186
+ parse(e, div) unless %w{title source}.include? e.name
187
+ end
188
+ end
189
+ end
190
+ end
191
+
167
192
  def indexsect(isoxml, out)
168
193
  isoxml.xpath(ns("//indexsect")).each do |i|
169
194
  clause_parse(i, out)