metanorma-iso 1.0.3 → 1.0.4
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/README.adoc +19 -0
- data/docs/guidance.adoc +14 -0
- data/docs/quickstart.adoc +2 -0
- data/lib/asciidoctor/iso/section.rb +2 -1
- data/lib/asciidoctor/iso/validate.rb +109 -99
- data/lib/asciidoctor/iso/version.rb +1 -1
- data/spec/asciidoctor-iso/validate_spec.rb +12 -0
- data/spec/assets/iso.doc +7 -7
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: '07499247abd9fb32513b4866fe1ed231c89ab893d360ed817cd215361c31aac1'
|
|
4
|
+
data.tar.gz: 0e72da21b9efc829e6868edaacaf430bccfc816588ad0b209fe7ed3fdb077e74
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c0c76bae355c918ed8dc336e6f00a2145621d7c2c1382331b486381ffc2f57071777d8dd582754c021ec3dfdc45820ec3122c1034ea36048e14fafc1a3505420
|
|
7
|
+
data.tar.gz: c178a3832ede766c0aea9662284179def0fe8df3c45994de3b396714688c06d0170cf29e0dcc8f1351f4885428a9ee7013d9f7d7898f49cbbbd849e4192e7436
|
data/README.adoc
CHANGED
|
@@ -454,6 +454,25 @@ from the image.
|
|
|
454
454
|
image::logo.jpg
|
|
455
455
|
--
|
|
456
456
|
|
|
457
|
+
=== Subclauses in Terms & Definitions sections
|
|
458
|
+
|
|
459
|
+
Normally any terminal subclause in a Terms & Definitions section is treated as a term
|
|
460
|
+
definition. Exceptionally, an introductory section can be tagged to be treated as a clause,
|
|
461
|
+
instead of a term, by prefixing it with the style attribute `[.nonterm]`.
|
|
462
|
+
|
|
463
|
+
[source,asciidoctor]
|
|
464
|
+
--
|
|
465
|
+
== Terms and definitions
|
|
466
|
+
|
|
467
|
+
[.nonterm]
|
|
468
|
+
=== Introduction
|
|
469
|
+
The following terms have non-normative effect, and should be ignored by the ametrical.
|
|
470
|
+
|
|
471
|
+
=== Anapaest
|
|
472
|
+
|
|
473
|
+
metrical foot consisting of a short, a long, and a short
|
|
474
|
+
--
|
|
475
|
+
|
|
457
476
|
=== Sections embedded more than 5 levels
|
|
458
477
|
|
|
459
478
|
Asciidoctor permits only 5 levels of section embedding (not counting the document title).
|
data/docs/guidance.adoc
CHANGED
|
@@ -241,6 +241,20 @@ stem:[t_A]
|
|
|
241
241
|
Time to launch.
|
|
242
242
|
--
|
|
243
243
|
|
|
244
|
+
As defined above, all terminal subclauses of a term section are treated as term definitions. Exceptionally, an introductory section can be treated as a subclause instead of a term, by prefixing it with the style attribute `[.nonterm]`:
|
|
245
|
+
|
|
246
|
+
[source,asciidoctor]
|
|
247
|
+
--
|
|
248
|
+
== Terms and definitions
|
|
249
|
+
|
|
250
|
+
[.nonterm]
|
|
251
|
+
=== Introduction
|
|
252
|
+
The following terms have non-normative effect, and should be ignored by the ametrical.
|
|
253
|
+
|
|
254
|
+
=== Anapaest
|
|
255
|
+
|
|
256
|
+
metrical foot consisting of a short, a long, and a short
|
|
257
|
+
--
|
|
244
258
|
|
|
245
259
|
=== Symbols and Abbreviations
|
|
246
260
|
|
data/docs/quickstart.adoc
CHANGED
|
@@ -323,6 +323,8 @@ and Note 1 to entry is not included here
|
|
|
323
323
|
|
|
324
324
|
Term banks such as the http://www.electropedia.org[IEV] must be treated like any other document, with terms treated as clauses; e.g. `<<IEV,clause "103-01-01">>`. The IEV must be explictly referenced with that label; when the XML is generated, it will be replaced by the official references to `IEC 60050-nnn:2001` standards documents.
|
|
325
325
|
|
|
326
|
+
Exceptionally, an introductory section can be treated as a subclause instead of a term, by prefixing it with the style attribute `[.nonterm]`.
|
|
327
|
+
|
|
326
328
|
=== References (Normative, Informative)
|
|
327
329
|
|
|
328
330
|
All bibliographic entries must be given as unordered lists. Normative references are expected to include only ISO and related standards; informative references may include any source.
|
|
@@ -21,7 +21,8 @@ module Asciidoctor
|
|
|
21
21
|
@term_def = true
|
|
22
22
|
term_def_parse(a, xml, node, true)
|
|
23
23
|
@term_def = false
|
|
24
|
-
when "symbols and abbreviated terms"
|
|
24
|
+
when "symbols and abbreviated terms",
|
|
25
|
+
"abbreviations", "abbreviated terms", "symbols"
|
|
25
26
|
symbols_parse(a, xml, node)
|
|
26
27
|
when "bibliography" then bibliography_parse(a, xml, node)
|
|
27
28
|
else
|
|
@@ -69,122 +69,132 @@ module Asciidoctor
|
|
|
69
69
|
subtitle = ss.at("./title")
|
|
70
70
|
!subtitle.nil? && !subtitle&.text&.empty? ||
|
|
71
71
|
warn("#{title}: each first-level subclause must have a title")
|
|
72
|
+
end
|
|
73
|
+
end
|
|
72
74
|
end
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
76
|
+
def title_all_siblings(xpath, label)
|
|
77
|
+
notitle = false
|
|
78
|
+
withtitle = false
|
|
79
|
+
xpath.each do |s|
|
|
80
|
+
title_all_siblings(s.xpath("./clause | ./terms | ./references"),
|
|
81
|
+
s&.at("./title")&.text || s["id"])
|
|
82
|
+
subtitle = s.at("./title")
|
|
83
|
+
notitle = notitle || (!subtitle || subtitle.text.empty?)
|
|
84
|
+
withtitle = withtitle || (subtitle && !subtitle.text.empty?)
|
|
85
|
+
end
|
|
86
|
+
notitle && withtitle &&
|
|
87
|
+
warn("#{label}: all subclauses must have a title, or none")
|
|
88
|
+
end
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
90
|
+
def title_validate(root)
|
|
91
|
+
title_intro_validate(root)
|
|
92
|
+
title_main_validate(root)
|
|
93
|
+
title_part_validate(root)
|
|
94
|
+
title_subpart_validate(root)
|
|
95
|
+
title_names_type_validate(root)
|
|
96
|
+
title_first_level_validate(root)
|
|
97
|
+
title_all_siblings(root.xpath(SECTIONS_XPATH), "(top level)")
|
|
98
|
+
end
|
|
99
99
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
100
|
+
def onlychild_clause_validate(root)
|
|
101
|
+
root.xpath(Standoc::Utils::SUBCLAUSE_XPATH).each do |c|
|
|
102
|
+
next unless c.xpath("../clause").size == 1
|
|
103
|
+
title = c.at("./title")
|
|
104
|
+
location = c["id"] || c.text[0..60] + "..."
|
|
105
|
+
location += ":#{title.text}" if c["id"] && !title.nil?
|
|
106
|
+
warn "ISO style: #{location}: subclause is only child"
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
109
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
110
|
+
def isosubgroup_validate(root)
|
|
111
|
+
root.xpath("//technical-committee/@type").each do |t|
|
|
112
|
+
unless %w{TC PC JTC JPC}.include? t.text
|
|
113
|
+
warn "ISO: invalid technical committee type #{t}"
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
root.xpath("//subcommittee/@type").each do |t|
|
|
117
|
+
unless %w{SC JSC}.include? t.text
|
|
118
|
+
warn "ISO: invalid subcommittee type #{t}"
|
|
119
|
+
end
|
|
120
|
+
end
|
|
114
121
|
end
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
122
|
+
|
|
123
|
+
def see_xrefs_validate(root)
|
|
124
|
+
root.xpath("//xref").each do |t|
|
|
125
|
+
# does not deal with preceding text marked up
|
|
126
|
+
preceding = t.at("./preceding-sibling::text()[last()]")
|
|
127
|
+
next unless !preceding.nil? && /\bsee\s*$/mi.match(preceding)
|
|
128
|
+
(target = root.at("//*[@id = '#{t['target']}']")) || next
|
|
129
|
+
if target&.at("./ancestor-or-self::*[@obligation = 'normative']")
|
|
130
|
+
warn "ISO: 'see #{t['target']}' is pointing to a normative section"
|
|
131
|
+
end
|
|
132
|
+
end
|
|
119
133
|
end
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
134
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
135
|
+
def see_erefs_validate(root)
|
|
136
|
+
root.xpath("//eref").each do |t|
|
|
137
|
+
preceding = t.at("./preceding-sibling::text()[last()]")
|
|
138
|
+
next unless !preceding.nil? && /\bsee\s*$/mi.match(preceding)
|
|
139
|
+
target = root.at("//*[@id = '#{t['bibitemid']}']")
|
|
140
|
+
if target.at("./ancestor::references"\
|
|
141
|
+
"[title = 'Normative References']")
|
|
142
|
+
warn "ISO: 'see #{t}' is pointing to a normative reference"
|
|
143
|
+
end
|
|
144
|
+
end
|
|
131
145
|
end
|
|
132
|
-
end
|
|
133
|
-
end
|
|
134
146
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
warn "ISO: 'see #{t}' is pointing to a normative reference"
|
|
147
|
+
def locality_erefs_validate(root)
|
|
148
|
+
root.xpath("//eref[locality]").each do |t|
|
|
149
|
+
unless /^IEV$|:[ ]?(\d+{4}|--)$/.match t["citeas"]
|
|
150
|
+
warn "ISO: undated reference #{t['citeas']} should not contain "\
|
|
151
|
+
"specific elements"
|
|
152
|
+
end
|
|
153
|
+
end
|
|
143
154
|
end
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
155
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
unless /^IEV$|:[ ]?(\d+{4}|--)$/.match t["citeas"]
|
|
150
|
-
warn "ISO: undated reference #{t['citeas']} should not contain "\
|
|
151
|
-
"specific elements"
|
|
156
|
+
def termdef_warn(text, re, term, msg)
|
|
157
|
+
re.match(text) && warn("ISO style: #{term}: #{msg}")
|
|
152
158
|
end
|
|
153
|
-
end
|
|
154
|
-
end
|
|
155
159
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
160
|
+
def termdef_style(xmldoc)
|
|
161
|
+
xmldoc.xpath("//term").each do |t|
|
|
162
|
+
para = t.at("./definition") || return
|
|
163
|
+
term = t.at("./preferred").text
|
|
164
|
+
termdef_warn(para.text, /^(the|a)\b/i, term,
|
|
165
|
+
"term definition starts with article")
|
|
166
|
+
termdef_warn(para.text, /\.$/i, term,
|
|
167
|
+
"term definition ends with period")
|
|
168
|
+
end
|
|
169
|
+
cited_term_style(xmldoc)
|
|
170
|
+
end
|
|
159
171
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
end
|
|
169
|
-
end
|
|
172
|
+
def cited_term_style(xmldoc)
|
|
173
|
+
xmldoc.xpath("//term//xref").each do |x|
|
|
174
|
+
next unless xmldoc.at("//term[@id = '#{x['target']}']")
|
|
175
|
+
x&.previous&.text == " (" and x&.previous&.previous&.name == "em" or
|
|
176
|
+
style_warning(x, "term citation not preceded with italicised term",
|
|
177
|
+
x.parent.text)
|
|
178
|
+
end
|
|
179
|
+
end
|
|
170
180
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
181
|
+
def content_validate(doc)
|
|
182
|
+
super
|
|
183
|
+
title_validate(doc.root)
|
|
184
|
+
isosubgroup_validate(doc.root)
|
|
185
|
+
onlychild_clause_validate(doc.root)
|
|
186
|
+
termdef_style(doc.root)
|
|
187
|
+
iev_validate(doc.root)
|
|
188
|
+
see_xrefs_validate(doc.root)
|
|
189
|
+
see_erefs_validate(doc.root)
|
|
190
|
+
locality_erefs_validate(doc.root)
|
|
191
|
+
end
|
|
182
192
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
193
|
+
def validate(doc)
|
|
194
|
+
content_validate(doc)
|
|
195
|
+
schema_validate(formattedstr_strip(doc.dup),
|
|
196
|
+
File.join(File.dirname(__FILE__), "isostandard.rng"))
|
|
197
|
+
end
|
|
188
198
|
end
|
|
189
199
|
end
|
|
190
200
|
end
|
|
@@ -930,4 +930,16 @@ it "Do not warn if not more than 7 levels of subclause" do
|
|
|
930
930
|
|
|
931
931
|
INPUT
|
|
932
932
|
end
|
|
933
|
+
|
|
934
|
+
it "Warn if term citation in Terms & Definitions not preceded with italicised term" do
|
|
935
|
+
expect { Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true) }.to output(%r{term citation not preceded with italicised term}).to_stderr
|
|
936
|
+
#{VALIDATING_BLANK_HDR}
|
|
937
|
+
== Terms and Definitions
|
|
938
|
+
|
|
939
|
+
[[term]]
|
|
940
|
+
=== Term
|
|
941
|
+
|
|
942
|
+
The definition of a term (<<term>>) is a part of the specialized vocabulary of a particular field
|
|
943
|
+
INPUT
|
|
944
|
+
end
|
|
933
945
|
end
|
data/spec/assets/iso.doc
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
MIME-Version: 1.0
|
|
2
|
-
Content-Type: multipart/related; boundary="----=
|
|
2
|
+
Content-Type: multipart/related; boundary="----=_NextPart_64b56c80.e800.431f"
|
|
3
3
|
|
|
4
|
-
------=
|
|
4
|
+
------=_NextPart_64b56c80.e800.431f
|
|
5
5
|
Content-Location: file:///C:/Doc/spec/assets/iso.htm
|
|
6
6
|
Content-Type: text/html; charset="utf-8"
|
|
7
7
|
|
|
@@ -843,11 +843,11 @@ Switzerland<p class="MsoNormal"></p></span></p>
|
|
|
843
843
|
<p class="MsoToc1"><span lang="EN-GB" xml:lang="EN-GB"><span style="mso-element:field-begin"></span><span style="mso-spacerun:yes"> </span>TOC
|
|
844
844
|
\o "1-2" \h \z \u <span style="mso-element:field-separator"></span></span>
|
|
845
845
|
<span class="MsoHyperlink"><span lang="EN-GB" style="mso-no-proof:yes" xml:lang="EN-GB">
|
|
846
|
-
<a href="#
|
|
846
|
+
<a href="#_Toc91959334">Foreword<span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">
|
|
847
847
|
<span style="mso-tab-count:1 dotted">. </span>
|
|
848
848
|
</span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">
|
|
849
849
|
<span style="mso-element:field-begin"></span></span>
|
|
850
|
-
<span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"> PAGEREF
|
|
850
|
+
<span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"> PAGEREF _Toc91959334 \h </span>
|
|
851
851
|
<span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"><span style="mso-element:field-separator"></span></span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">1</span>
|
|
852
852
|
<span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"></span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"><span style="mso-element:field-end"></span></span></a></span></span></p>
|
|
853
853
|
|
|
@@ -880,7 +880,7 @@ Switzerland<p class="MsoNormal"></p></span></p>
|
|
|
880
880
|
</html>
|
|
881
881
|
|
|
882
882
|
|
|
883
|
-
------=
|
|
883
|
+
------=_NextPart_64b56c80.e800.431f
|
|
884
884
|
Content-Location: file:///C:/Doc/spec/assets/iso_files/filelist.xml
|
|
885
885
|
Content-Transfer-Encoding: base64
|
|
886
886
|
Content-Type: application/xml
|
|
@@ -890,7 +890,7 @@ ICAgICAgIDxvOk1haW5GaWxlIEhSZWY9Ii4uL3NwZWMvYXNzZXRzL2lzby5odG0iLz4gIDxvOkZp
|
|
|
890
890
|
bGUgSFJlZj0iZmlsZWxpc3QueG1sIi8+CiAgPG86RmlsZSBIUmVmPSJoZWFkZXIuaHRtbCIvPgo8
|
|
891
891
|
L3htbD4K
|
|
892
892
|
|
|
893
|
-
------=
|
|
893
|
+
------=_NextPart_64b56c80.e800.431f
|
|
894
894
|
Content-Location: file:///C:/Doc/spec/assets/iso_files/header.html
|
|
895
895
|
Content-Transfer-Encoding: base64
|
|
896
896
|
Content-Type: text/html charset="utf-8"
|
|
@@ -1083,4 +1083,4 @@ cD4NCg0KPHAgY2xhc3M9TXNvRm9vdGVyPjxzcGFuIGxhbmc9RU4tQVUgc3R5bGU9J2ZvbnQtc2l6
|
|
|
1083
1083
|
ZToxMC4wcHQ7Jz7CqQ0KJm5ic3A7Jm5ic3A74oCTIEFsbCByaWdodHMgcmVzZXJ2ZWQ8bzpwPjwv
|
|
1084
1084
|
bzpwPjwvc3Bhbj48L3A+DQoNCjwvZGl2Pg0KDQoNCg0KPC9ib2R5Pg0KDQo8L2h0bWw+DQo=
|
|
1085
1085
|
|
|
1086
|
-
------=
|
|
1086
|
+
------=_NextPart_64b56c80.e800.431f--
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: metanorma-iso
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ribose Inc.
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2018-
|
|
11
|
+
date: 2018-09-01 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: asciidoctor
|