metanorma-iso 1.8.5 → 1.9.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.
- checksums.yaml +4 -4
- data/.github/workflows/rake.yml +1 -1
- data/lib/asciidoctor/iso/cleanup.rb +0 -1
- data/lib/asciidoctor/iso/isodoc.rng +62 -8
- data/lib/asciidoctor/iso/isostandard.rng +7 -3
- data/lib/asciidoctor/iso/section.rb +3 -0
- data/lib/asciidoctor/iso/validate.rb +4 -17
- data/lib/asciidoctor/iso/validate_section.rb +50 -34
- data/lib/asciidoctor/iso/validate_style.rb +3 -3
- data/lib/isodoc/iso/base_convert.rb +31 -6
- data/lib/isodoc/iso/iso.amendment.xsl +492 -377
- data/lib/isodoc/iso/iso.international-standard.xsl +492 -377
- data/lib/isodoc/iso/isosts_convert.rb +12 -13
- data/lib/isodoc/iso/presentation_xml_convert.rb +62 -9
- data/lib/isodoc/iso/sts_convert.rb +4 -5
- data/lib/isodoc/iso/xref.rb +17 -1
- data/lib/metanorma/iso/version.rb +1 -1
- data/metanorma-iso.gemspec +3 -3
- data/spec/asciidoctor/blocks_spec.rb +2 -2
- data/spec/asciidoctor/cleanup_spec.rb +2 -2
- data/spec/asciidoctor/section_spec.rb +128 -7
- data/spec/asciidoctor/validate_spec.rb +15 -15
- data/spec/isodoc/amd_spec.rb +2 -2
- data/spec/isodoc/inline_spec.rb +470 -0
- data/spec/isodoc/section_spec.rb +195 -72
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8557db1b500f1f756f6f4c755f1adffd884529b0aa77bdce9dc47cdf38288948
|
4
|
+
data.tar.gz: 4d7f35c2b6ab91853e06d225d9ec679b2696e9392b2695d6002ff9c2fdb9fd90
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0c40cff218ad2aacbeaf1ca44f315398115c9e9fc13e8fa2a845456328e94b743b0c08ede991ff12204ba4da67ce5cc541369082265c4580b0fd23addec64fa8
|
7
|
+
data.tar.gz: 06f917f6556624e961dfb33f59be02c88440b8a842909d280e1c41bbe3540e783931bd309f6f99af8d7f15caf4af42c1de55634270c471889a239f418ec267f4
|
data/.github/workflows/rake.yml
CHANGED
@@ -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="
|
914
|
+
<element name="subdoctype">
|
903
915
|
<ref name="DocumentSubtype"/>
|
904
916
|
</element>
|
905
917
|
</define>
|
@@ -955,7 +967,34 @@
|
|
955
967
|
<define name="concept">
|
956
968
|
<element name="concept">
|
957
969
|
<optional>
|
958
|
-
<attribute name="
|
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>
|
979
|
+
<optional>
|
980
|
+
<element name="refterm">
|
981
|
+
<zeroOrMore>
|
982
|
+
<choice>
|
983
|
+
<ref name="PureTextElement"/>
|
984
|
+
<ref name="stem"/>
|
985
|
+
</choice>
|
986
|
+
</zeroOrMore>
|
987
|
+
</element>
|
988
|
+
</optional>
|
989
|
+
<optional>
|
990
|
+
<element name="renderterm">
|
991
|
+
<zeroOrMore>
|
992
|
+
<choice>
|
993
|
+
<ref name="PureTextElement"/>
|
994
|
+
<ref name="stem"/>
|
995
|
+
</choice>
|
996
|
+
</zeroOrMore>
|
997
|
+
</element>
|
959
998
|
</optional>
|
960
999
|
<choice>
|
961
1000
|
<ref name="eref"/>
|
@@ -972,8 +1011,14 @@
|
|
972
1011
|
<ref name="imagemap"/>
|
973
1012
|
<ref name="svgmap"/>
|
974
1013
|
<ref name="inputform"/>
|
1014
|
+
<ref name="toc"/>
|
975
1015
|
</choice>
|
976
1016
|
</define>
|
1017
|
+
<define name="toc">
|
1018
|
+
<element name="toc">
|
1019
|
+
<ref name="ul"/>
|
1020
|
+
</element>
|
1021
|
+
</define>
|
977
1022
|
<define name="inputform">
|
978
1023
|
<element name="form">
|
979
1024
|
<attribute name="id">
|
@@ -981,6 +1026,9 @@
|
|
981
1026
|
</attribute>
|
982
1027
|
<attribute name="name"/>
|
983
1028
|
<attribute name="action"/>
|
1029
|
+
<optional>
|
1030
|
+
<attribute name="class"/>
|
1031
|
+
</optional>
|
984
1032
|
<zeroOrMore>
|
985
1033
|
<choice>
|
986
1034
|
<ref name="TextElement"/>
|
@@ -1212,6 +1260,12 @@
|
|
1212
1260
|
<optional>
|
1213
1261
|
<attribute name="type"/>
|
1214
1262
|
</optional>
|
1263
|
+
<optional>
|
1264
|
+
<attribute name="identifier"/>
|
1265
|
+
</optional>
|
1266
|
+
<optional>
|
1267
|
+
<attribute name="prefix"/>
|
1268
|
+
</optional>
|
1215
1269
|
<text/>
|
1216
1270
|
</define>
|
1217
1271
|
<define name="ics">
|
@@ -1473,26 +1527,26 @@
|
|
1473
1527
|
<optional>
|
1474
1528
|
<ref name="section-title"/>
|
1475
1529
|
</optional>
|
1476
|
-
<
|
1530
|
+
<choice>
|
1477
1531
|
<choice>
|
1478
1532
|
<group>
|
1479
|
-
<
|
1533
|
+
<oneOrMore>
|
1480
1534
|
<ref name="BasicBlock"/>
|
1481
|
-
</
|
1535
|
+
</oneOrMore>
|
1482
1536
|
<zeroOrMore>
|
1483
1537
|
<ref name="note"/>
|
1484
1538
|
</zeroOrMore>
|
1485
1539
|
</group>
|
1486
1540
|
<ref name="amend"/>
|
1487
1541
|
</choice>
|
1488
|
-
<
|
1542
|
+
<oneOrMore>
|
1489
1543
|
<choice>
|
1490
1544
|
<ref name="clause-subsection"/>
|
1491
1545
|
<ref name="terms"/>
|
1492
1546
|
<ref name="definitions"/>
|
1493
1547
|
</choice>
|
1494
|
-
</
|
1495
|
-
</
|
1548
|
+
</oneOrMore>
|
1549
|
+
</choice>
|
1496
1550
|
</define>
|
1497
1551
|
<define name="Annex-Section">
|
1498
1552
|
<optional>
|
@@ -101,7 +101,11 @@
|
|
101
101
|
<ref name="definitions"/>
|
102
102
|
</optional>
|
103
103
|
<oneOrMore>
|
104
|
-
<
|
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
|
-
<
|
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
|
-
</
|
158
|
+
</choice>
|
155
159
|
</define>
|
156
160
|
<define name="term">
|
157
161
|
<element name="term">
|
@@ -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
|
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
|
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,
|
83
|
+
termdef_warn(para.text, /\A(the|a)\b/i, t, term,
|
84
84
|
"term definition starts with article")
|
85
|
-
termdef_warn(para.text,
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
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
|
-
|
119
|
-
@log.add("Style",
|
128
|
+
elem&.at("./self::clause") ||
|
129
|
+
@log.add("Style", elem, "Document must contain clause after "\
|
120
130
|
"Terms and Definitions")
|
121
|
-
|
122
|
-
@log.add("Style",
|
123
|
-
|
124
|
-
while
|
125
|
-
|
126
|
-
@log.add("Style",
|
127
|
-
|
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
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
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
|
-
|
139
|
-
|
140
|
-
|
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
|
-
|
161
|
+
elem&.at("./self::references[@normative = 'true']") ||
|
146
162
|
@log.add("Style", nil, "Document must include (references) "\
|
147
163
|
"Normative References")
|
148
|
-
|
149
|
-
|
150
|
-
@log.add("Style",
|
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",
|
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(/(
|
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
|
116
|
-
|
117
|
-
|
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)
|
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
|
-
|
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)
|