metanorma-bsi 0.0.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 +7 -0
- data/.gitignore +6 -0
- data/.hound.yml +3 -0
- data/.rubocop.yml +14 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +7 -0
- data/LICENSE +25 -0
- data/README.adoc +199 -0
- data/Rakefile +8 -0
- data/bin/rspec +18 -0
- data/lib/asciidoctor/bsi/basicdoc.rng +1131 -0
- data/lib/asciidoctor/bsi/biblio.rng +1235 -0
- data/lib/asciidoctor/bsi/bsi.rng +120 -0
- data/lib/asciidoctor/bsi/bsi_intro_en.xml +105 -0
- data/lib/asciidoctor/bsi/cleanup.rb +78 -0
- data/lib/asciidoctor/bsi/cleanup_ref.rb +183 -0
- data/lib/asciidoctor/bsi/converter.rb +83 -0
- data/lib/asciidoctor/bsi/front.rb +67 -0
- data/lib/asciidoctor/bsi/isodoc.rng +1870 -0
- data/lib/asciidoctor/bsi/isostandard.rng +477 -0
- data/lib/asciidoctor/bsi/reqt.rng +194 -0
- data/lib/asciidoctor/bsi/validate.rb +224 -0
- data/lib/asciidoctor/bsi/validate_list.rb +72 -0
- data/lib/asciidoctor/bsi/validate_requirement.rb +163 -0
- data/lib/isodoc/bsi/base_convert.rb +91 -0
- data/lib/isodoc/bsi/bsi.international-standard.xsl +6540 -0
- data/lib/isodoc/bsi/html/html_bsi_intro.html +8 -0
- data/lib/isodoc/bsi/html/html_bsi_titlepage.html +50 -0
- data/lib/isodoc/bsi/html/htmlstyle.css +968 -0
- data/lib/isodoc/bsi/html/htmlstyle.scss +699 -0
- data/lib/isodoc/bsi/html_convert.rb +56 -0
- data/lib/isodoc/bsi/i18n-en.yaml +56 -0
- data/lib/isodoc/bsi/i18n.rb +15 -0
- data/lib/isodoc/bsi/init.rb +24 -0
- data/lib/isodoc/bsi/metadata.rb +33 -0
- data/lib/isodoc/bsi/pdf_convert.rb +17 -0
- data/lib/isodoc/bsi/presentation_xml_convert.rb +72 -0
- data/lib/isodoc/bsi/sts_convert.rb +30 -0
- data/lib/isodoc/bsi/xref.rb +134 -0
- data/lib/metanorma-bsi.rb +15 -0
- data/lib/metanorma/bsi.rb +6 -0
- data/lib/metanorma/bsi/processor.rb +51 -0
- data/lib/metanorma/bsi/version.rb +6 -0
- data/metanorma-bsi.gemspec +47 -0
- data/spec/asciidoctor/base_spec.rb +778 -0
- data/spec/asciidoctor/blocks_spec.rb +553 -0
- data/spec/asciidoctor/cleanup_spec.rb +547 -0
- data/spec/asciidoctor/inline_spec.rb +176 -0
- data/spec/asciidoctor/lists_spec.rb +194 -0
- data/spec/asciidoctor/refs_spec.rb +318 -0
- data/spec/asciidoctor/section_spec.rb +382 -0
- data/spec/asciidoctor/validate_spec.rb +858 -0
- data/spec/assets/header.html +7 -0
- data/spec/assets/html.css +2 -0
- data/spec/assets/iso.xml +71 -0
- data/spec/assets/rice_image1.png +0 -0
- data/spec/assets/word.css +2 -0
- data/spec/assets/wordintro.html +4 -0
- data/spec/assets/xref_error.adoc +7 -0
- data/spec/isodoc/blocks_spec.rb +259 -0
- data/spec/isodoc/i18n_spec.rb +442 -0
- data/spec/isodoc/inline_spec.rb +287 -0
- data/spec/isodoc/iso_spec.rb +116 -0
- data/spec/isodoc/metadata_spec.rb +262 -0
- data/spec/isodoc/postproc_spec.rb +137 -0
- data/spec/isodoc/ref_spec.rb +376 -0
- data/spec/isodoc/section_spec.rb +467 -0
- data/spec/isodoc/terms_spec.rb +246 -0
- data/spec/isodoc/xref_spec.rb +1730 -0
- data/spec/metanorma/processor_spec.rb +76 -0
- data/spec/spec_helper.rb +291 -0
- data/spec/vcr_cassettes/iso-639.yml +182 -0
- data/spec/vcr_cassettes/isobib_get_639_1967.yml +136 -0
- data/spec/vcr_cassettes/multistandard.yml +352 -0
- metadata +343 -0
@@ -0,0 +1,382 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Asciidoctor::BSI do
|
4
|
+
before(:all) do
|
5
|
+
@blank_hdr = blank_hdr_gen
|
6
|
+
end
|
7
|
+
|
8
|
+
it "processes sections" do
|
9
|
+
expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :bsi, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
10
|
+
#{ASCIIDOC_BLANK_HDR}
|
11
|
+
.Foreword
|
12
|
+
|
13
|
+
Text
|
14
|
+
|
15
|
+
== Introduction
|
16
|
+
|
17
|
+
=== Introduction Subsection
|
18
|
+
|
19
|
+
== Scope
|
20
|
+
|
21
|
+
Text
|
22
|
+
|
23
|
+
== Normative References
|
24
|
+
|
25
|
+
== Terms and Definitions
|
26
|
+
|
27
|
+
=== Term1
|
28
|
+
|
29
|
+
== Terms, Definitions, Symbols and Abbreviated Terms
|
30
|
+
|
31
|
+
=== Normal Terms
|
32
|
+
|
33
|
+
==== Term2
|
34
|
+
|
35
|
+
=== Symbols and Abbreviated Terms
|
36
|
+
|
37
|
+
== Symbols and Abbreviated Terms
|
38
|
+
|
39
|
+
== Clause 4
|
40
|
+
|
41
|
+
=== Introduction
|
42
|
+
|
43
|
+
=== Clause 4.2
|
44
|
+
|
45
|
+
== Terms and Definitions
|
46
|
+
|
47
|
+
[appendix]
|
48
|
+
== Annex
|
49
|
+
|
50
|
+
=== Annex A.1
|
51
|
+
|
52
|
+
[%appendix]
|
53
|
+
=== Appendix 1
|
54
|
+
|
55
|
+
== Bibliography
|
56
|
+
|
57
|
+
=== Bibliography Subsection
|
58
|
+
INPUT
|
59
|
+
#{@blank_hdr}
|
60
|
+
<preface><foreword id="_" obligation="informative">
|
61
|
+
<title>FOREWORD</title>
|
62
|
+
<p id="_">Text</p>
|
63
|
+
</foreword><introduction id="_" obligation="informative">
|
64
|
+
<title>INTRODUCTION</title><clause id="_" inline-header="false" obligation="informative">
|
65
|
+
<title>Introduction Subsection</title>
|
66
|
+
</clause>
|
67
|
+
</introduction></preface><sections>
|
68
|
+
<clause id="_" obligation="normative" type="scope" inline-header='false'>
|
69
|
+
<title>Scope</title>
|
70
|
+
<p id="_">Text</p>
|
71
|
+
</clause>
|
72
|
+
|
73
|
+
<terms id="_" obligation="normative">
|
74
|
+
<title>Terms and definitions</title>
|
75
|
+
<p id="_">For the purposes of this British Standard, the following terms and definitions apply.</p>
|
76
|
+
#{TERMS_BOILERPLATE}
|
77
|
+
<term id="term-term1">
|
78
|
+
<preferred>Term1</preferred>
|
79
|
+
</term>
|
80
|
+
</terms>
|
81
|
+
<clause id="_" obligation="normative"><title>Terms, definitions, symbols and abbreviated terms</title><terms id="_" obligation="normative">
|
82
|
+
<title>Normal Terms</title>
|
83
|
+
<p id='_'>For the purposes of this British Standard, the following terms and definitions apply.</p>
|
84
|
+
<p id='_'>
|
85
|
+
ISO and IEC maintain terminological databases for use in
|
86
|
+
standardization at the following addresses:
|
87
|
+
</p>
|
88
|
+
<ul id='_'>
|
89
|
+
<li>
|
90
|
+
<p id='_'>
|
91
|
+
IEC Electropedia: available at
|
92
|
+
<link target='http://www.electropedia.org'/>
|
93
|
+
</p>
|
94
|
+
</li>
|
95
|
+
<li>
|
96
|
+
<p id='_'>
|
97
|
+
ISO Online browsing platform: available at
|
98
|
+
<link target='http://www.iso.org/obp'/>
|
99
|
+
</p>
|
100
|
+
</li>
|
101
|
+
</ul>
|
102
|
+
<term id="term-term2">
|
103
|
+
<preferred>Term2</preferred>
|
104
|
+
</term>
|
105
|
+
</terms>
|
106
|
+
<definitions id="_" obligation="normative"><title>Symbols and abbreviated terms</title></definitions></clause>
|
107
|
+
<definitions id="_" obligation="normative"><title>Symbols and abbreviated terms</title></definitions>
|
108
|
+
<clause id="_" inline-header="false" obligation="normative"><title>Clause 4</title><clause id="_" inline-header="false" obligation="normative">
|
109
|
+
<title>Introduction</title>
|
110
|
+
</clause>
|
111
|
+
<clause id="_" inline-header="false" obligation="normative">
|
112
|
+
<title>Clause 4.2</title>
|
113
|
+
</clause></clause>
|
114
|
+
<clause id="_" inline-header="false" obligation="normative">
|
115
|
+
<title>Terms and Definitions</title>
|
116
|
+
</clause>
|
117
|
+
|
118
|
+
|
119
|
+
</sections><annex id="_" inline-header="false" obligation="normative">
|
120
|
+
<title>Annex</title>
|
121
|
+
<clause id="_" inline-header="false" obligation="normative">
|
122
|
+
<title>Annex A.1</title>
|
123
|
+
</clause>
|
124
|
+
<appendix id="_" inline-header="false" obligation="normative">
|
125
|
+
<title>Appendix 1</title>
|
126
|
+
</appendix></annex><bibliography><references id="_" obligation="informative" normative="true">
|
127
|
+
<title>Normative references</title><p id="_">There are no normative references in this document.</p>
|
128
|
+
</references><clause id="_" obligation="informative">
|
129
|
+
<title>Bibliography</title>
|
130
|
+
<references id="_" obligation="informative" normative="false">
|
131
|
+
<title>Bibliography Subsection</title>
|
132
|
+
<p id='_'>
|
133
|
+
For dated references, only the edition cited applies. For undated
|
134
|
+
references, the latest edition of the referenced document (including
|
135
|
+
any amendments) applies.
|
136
|
+
</p>
|
137
|
+
</references>
|
138
|
+
</clause>
|
139
|
+
</bibliography>
|
140
|
+
</bsi-standard>
|
141
|
+
OUTPUT
|
142
|
+
end
|
143
|
+
|
144
|
+
it "processes sections with title attributes" do
|
145
|
+
expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :bsi, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
146
|
+
#{ASCIIDOC_BLANK_HDR}
|
147
|
+
.Foreword
|
148
|
+
|
149
|
+
Text
|
150
|
+
|
151
|
+
[heading=introduction]
|
152
|
+
== Εισαγωγή
|
153
|
+
|
154
|
+
=== Introduction Subsection
|
155
|
+
|
156
|
+
[heading=scope]
|
157
|
+
== Σκοπός
|
158
|
+
|
159
|
+
Text
|
160
|
+
|
161
|
+
[heading=normative references]
|
162
|
+
== Κανονιστικές Παραπομπές
|
163
|
+
|
164
|
+
[heading=terms and definitions]
|
165
|
+
== Όροι και Ορισμοί
|
166
|
+
|
167
|
+
=== Term1
|
168
|
+
|
169
|
+
[heading="terms, definitions, symbols and abbreviated terms"]
|
170
|
+
== Όροι, Ορισμοί, Σύμβολα και Συντομογραφίες
|
171
|
+
|
172
|
+
=== Normal Terms
|
173
|
+
|
174
|
+
==== Term2
|
175
|
+
|
176
|
+
[heading=symbols and abbreviated terms]
|
177
|
+
=== Σύμβολα και Συντομογραφίες
|
178
|
+
|
179
|
+
[heading=symbols and abbreviated terms]
|
180
|
+
== Σύμβολα και Συντομογραφίες
|
181
|
+
|
182
|
+
== Clause 4
|
183
|
+
|
184
|
+
=== Introduction
|
185
|
+
|
186
|
+
=== Clause 4.2
|
187
|
+
|
188
|
+
[appendix]
|
189
|
+
== Annex
|
190
|
+
|
191
|
+
=== Annex A.1
|
192
|
+
|
193
|
+
[%appendix]
|
194
|
+
=== Appendx 1
|
195
|
+
|
196
|
+
[heading=bibliography]
|
197
|
+
== Βιβλιογραφία
|
198
|
+
|
199
|
+
=== Bibliography Subsection
|
200
|
+
INPUT
|
201
|
+
#{@blank_hdr}
|
202
|
+
<preface>
|
203
|
+
<foreword id="_" obligation="informative">
|
204
|
+
<title>FOREWORD</title>
|
205
|
+
<p id="_">Text</p>
|
206
|
+
</foreword>
|
207
|
+
<introduction id="_" obligation="informative">
|
208
|
+
<title>INTRODUCTION</title><clause id="_" inline-header="false" obligation="informative">
|
209
|
+
<title>Introduction Subsection</title>
|
210
|
+
</clause>
|
211
|
+
</introduction>
|
212
|
+
</preface>
|
213
|
+
<sections>
|
214
|
+
<clause id="_" obligation="normative" type="scope" inline-header='false'>
|
215
|
+
<title>Scope</title>
|
216
|
+
<p id="_">Text</p>
|
217
|
+
</clause>
|
218
|
+
<terms id="_" obligation="normative">
|
219
|
+
<title>Terms and definitions</title>
|
220
|
+
<p id="_">For the purposes of this British Standard, the following terms and definitions apply.</p>
|
221
|
+
#{TERMS_BOILERPLATE}
|
222
|
+
<term id="term-term1">
|
223
|
+
<preferred>Term1</preferred>
|
224
|
+
</term>
|
225
|
+
</terms>
|
226
|
+
<clause id='_' obligation='normative'>
|
227
|
+
<title>Terms, definitions, symbols and abbreviated terms</title>
|
228
|
+
<terms id='_' obligation='normative'>
|
229
|
+
<title>Normal Terms</title>
|
230
|
+
<p id='_'>For the purposes of this British Standard, the following terms and definitions apply.</p>
|
231
|
+
<p id='_'>
|
232
|
+
ISO and IEC maintain terminological databases for use in
|
233
|
+
standardization at the following addresses:
|
234
|
+
</p>
|
235
|
+
<ul id='_'>
|
236
|
+
<li>
|
237
|
+
<p id='_'>
|
238
|
+
IEC Electropedia: available at
|
239
|
+
<link target='http://www.electropedia.org'/>
|
240
|
+
</p>
|
241
|
+
</li>
|
242
|
+
<li>
|
243
|
+
<p id='_'>
|
244
|
+
ISO Online browsing platform: available at
|
245
|
+
<link target='http://www.iso.org/obp'/>
|
246
|
+
</p>
|
247
|
+
</li>
|
248
|
+
</ul>
|
249
|
+
<term id='term-term2'>
|
250
|
+
<preferred>Term2</preferred>
|
251
|
+
</term>
|
252
|
+
</terms>
|
253
|
+
<definitions id='_' obligation="normative">
|
254
|
+
<title>Symbols and abbreviated terms</title>
|
255
|
+
</definitions>
|
256
|
+
</clause>
|
257
|
+
<definitions id='_' obligation="normative">
|
258
|
+
<title>Symbols and abbreviated terms</title>
|
259
|
+
</definitions>
|
260
|
+
<clause id='_' inline-header='false' obligation='normative'>
|
261
|
+
<title>Clause 4</title>
|
262
|
+
<clause id='_' inline-header='false' obligation='normative'>
|
263
|
+
<title>Introduction</title>
|
264
|
+
</clause>
|
265
|
+
<clause id='_' inline-header='false' obligation='normative'>
|
266
|
+
<title>Clause 4.2</title>
|
267
|
+
</clause>
|
268
|
+
</clause>
|
269
|
+
</sections>
|
270
|
+
<annex id='_' inline-header='false' obligation='normative'>
|
271
|
+
<title>Annex</title>
|
272
|
+
<clause id='_' inline-header='false' obligation='normative'>
|
273
|
+
<title>Annex A.1</title>
|
274
|
+
</clause>
|
275
|
+
<appendix id='_' inline-header='false' obligation='normative'>
|
276
|
+
<title>Appendx 1</title>
|
277
|
+
</appendix>
|
278
|
+
</annex>
|
279
|
+
<bibliography>
|
280
|
+
<references id='_' obligation='informative' normative="true">
|
281
|
+
<title>Normative references</title>
|
282
|
+
<p id="_">There are no normative references in this document.</p>
|
283
|
+
</references>
|
284
|
+
<clause id='_' obligation='informative'>
|
285
|
+
<title>Bibliography</title>
|
286
|
+
<references id='_' obligation='informative' normative="false">
|
287
|
+
<title>Bibliography Subsection</title>
|
288
|
+
<p id='_'>
|
289
|
+
For dated references, only the edition cited applies. For undated
|
290
|
+
references, the latest edition of the referenced document (including
|
291
|
+
any amendments) applies.
|
292
|
+
</p>
|
293
|
+
</references>
|
294
|
+
</clause>
|
295
|
+
</bibliography>
|
296
|
+
</bsi-standard>
|
297
|
+
OUTPUT
|
298
|
+
end
|
299
|
+
|
300
|
+
it "processes section obligations" do
|
301
|
+
expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :bsi, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
302
|
+
#{ASCIIDOC_BLANK_HDR}
|
303
|
+
[obligation=informative]
|
304
|
+
== Clause 1
|
305
|
+
|
306
|
+
=== Clause 1a
|
307
|
+
|
308
|
+
[obligation=normative]
|
309
|
+
== Clause 2
|
310
|
+
|
311
|
+
[appendix,obligation=informative]
|
312
|
+
== Annex
|
313
|
+
INPUT
|
314
|
+
#{@blank_hdr}
|
315
|
+
<sections><clause id="_" inline-header="false" obligation="informative">
|
316
|
+
<title>Clause 1</title>
|
317
|
+
<clause id="_" inline-header="false" obligation="informative">
|
318
|
+
<title>Clause 1a</title>
|
319
|
+
</clause>
|
320
|
+
</clause>
|
321
|
+
<clause id="_" inline-header="false" obligation="normative">
|
322
|
+
<title>Clause 2</title>
|
323
|
+
</clause>
|
324
|
+
</sections><annex id="_" inline-header="false" obligation="informative">
|
325
|
+
<title>Annex</title>
|
326
|
+
</annex>
|
327
|
+
</bsi-standard>
|
328
|
+
OUTPUT
|
329
|
+
end
|
330
|
+
|
331
|
+
it "processes inline headers" do
|
332
|
+
expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :bsi, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
333
|
+
#{ASCIIDOC_BLANK_HDR}
|
334
|
+
== Clause 1
|
335
|
+
|
336
|
+
[%inline-header]
|
337
|
+
=== Clause 1a
|
338
|
+
|
339
|
+
[appendix]
|
340
|
+
== Annex A
|
341
|
+
|
342
|
+
[%inline-header]
|
343
|
+
=== Clause Aa
|
344
|
+
INPUT
|
345
|
+
#{@blank_hdr}
|
346
|
+
<sections><clause id="_" inline-header="false" obligation="normative">
|
347
|
+
<title>Clause 1</title>
|
348
|
+
<clause id="_" inline-header="true" obligation="normative">
|
349
|
+
<title>Clause 1a</title>
|
350
|
+
</clause>
|
351
|
+
</clause>
|
352
|
+
</sections><annex id="_" inline-header="false" obligation="normative">
|
353
|
+
<title>Annex A</title>
|
354
|
+
<clause id="_" inline-header="true" obligation="normative">
|
355
|
+
<title>Clause Aa</title>
|
356
|
+
</clause>
|
357
|
+
</annex>
|
358
|
+
</bsi-standard>
|
359
|
+
OUTPUT
|
360
|
+
end
|
361
|
+
|
362
|
+
it "processes blank headers" do
|
363
|
+
expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :bsi, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
364
|
+
#{ASCIIDOC_BLANK_HDR}
|
365
|
+
== Clause 1
|
366
|
+
|
367
|
+
=== {blank}
|
368
|
+
|
369
|
+
INPUT
|
370
|
+
#{@blank_hdr}
|
371
|
+
<sections>
|
372
|
+
<clause id="_" inline-header="false" obligation="normative">
|
373
|
+
<title>Clause 1</title>
|
374
|
+
<clause id="_" inline-header="false" obligation="normative">
|
375
|
+
</clause>
|
376
|
+
</clause>
|
377
|
+
</sections>
|
378
|
+
</bsi-standard>
|
379
|
+
OUTPUT
|
380
|
+
end
|
381
|
+
|
382
|
+
end
|
@@ -0,0 +1,858 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "fileutils"
|
3
|
+
|
4
|
+
RSpec.describe Asciidoctor::BSI do
|
5
|
+
context "when xref_error.adoc compilation" do
|
6
|
+
around do |example|
|
7
|
+
FileUtils.rm_f "spec/assets/xref_error.err"
|
8
|
+
example.run
|
9
|
+
Dir["spec/assets/xref_error*"].each do |file|
|
10
|
+
next if file.match?(/adoc$/)
|
11
|
+
|
12
|
+
FileUtils.rm_f(file)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it "generates error file" do
|
17
|
+
expect do
|
18
|
+
mock_pdf
|
19
|
+
Metanorma::Compile.new
|
20
|
+
.compile("spec/assets/xref_error.adoc", type: "bsi", no_install_fonts: true)
|
21
|
+
end.to(change { File.exist?("spec/assets/xref_error.err") }
|
22
|
+
.from(false).to(true))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "Warns of illegal doctype" do
|
27
|
+
FileUtils.rm_f "test.err"
|
28
|
+
Asciidoctor.convert(<<~"INPUT", backend: :bsi, header_footer: true)
|
29
|
+
= Document title
|
30
|
+
Author
|
31
|
+
:docfile: test.adoc
|
32
|
+
:nodoc:
|
33
|
+
:no-isobib:
|
34
|
+
:doctype: pizza
|
35
|
+
|
36
|
+
text
|
37
|
+
INPUT
|
38
|
+
expect(File.read("test.err"))
|
39
|
+
.to include "pizza is not a recognised document type"
|
40
|
+
end
|
41
|
+
|
42
|
+
it "No style warning if decimal point" do
|
43
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
44
|
+
#{VALIDATING_BLANK_HDR}
|
45
|
+
|
46
|
+
== Clause
|
47
|
+
8.1
|
48
|
+
INPUT
|
49
|
+
expect(File.read("test.err")).not_to include "possible decimal point"
|
50
|
+
end
|
51
|
+
|
52
|
+
it "Style warning if decimal comma" do
|
53
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
54
|
+
#{VALIDATING_BLANK_HDR}
|
55
|
+
|
56
|
+
== Clause
|
57
|
+
8,1
|
58
|
+
INPUT
|
59
|
+
expect(File.read("test.err")).to include "possible decimal comma"
|
60
|
+
end
|
61
|
+
|
62
|
+
it "warns that code of practice may contain requirement" do
|
63
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
64
|
+
= Document title
|
65
|
+
Author
|
66
|
+
:docfile: test.adoc
|
67
|
+
:nodoc:
|
68
|
+
:no-isobib:
|
69
|
+
:doctype: code-of-practice
|
70
|
+
|
71
|
+
== Random clause
|
72
|
+
|
73
|
+
The widget shall not be larger than 15 cm.
|
74
|
+
INPUT
|
75
|
+
expect(File.read("test.err"))
|
76
|
+
.to include "Code Of Practice clause may contain requirement"
|
77
|
+
|
78
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
79
|
+
= Document title
|
80
|
+
Author
|
81
|
+
:docfile: test.adoc
|
82
|
+
:nodoc:
|
83
|
+
:no-isobib:
|
84
|
+
:doctype: technical-report
|
85
|
+
|
86
|
+
== Random clause
|
87
|
+
|
88
|
+
The widget is required not to be larger than 15 cm.
|
89
|
+
INPUT
|
90
|
+
expect(File.read("test.err"))
|
91
|
+
.not_to include "Technical Report clause may contain requirement"
|
92
|
+
end
|
93
|
+
|
94
|
+
it "warns that specification may contain requirement in informative text" do
|
95
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
96
|
+
= Document title
|
97
|
+
Author
|
98
|
+
:docfile: test.adoc
|
99
|
+
:nodoc:
|
100
|
+
:no-isobib:
|
101
|
+
:doctype: specification
|
102
|
+
|
103
|
+
== Random clause
|
104
|
+
|
105
|
+
The widget is not be larger than 15 cm.
|
106
|
+
|
107
|
+
NOTE: the widget shall not be good.
|
108
|
+
|
109
|
+
[appendix,obligation=informative]
|
110
|
+
== Annex
|
111
|
+
|
112
|
+
The widget should not be good
|
113
|
+
INPUT
|
114
|
+
expect(File.read("test.err"))
|
115
|
+
.to include "Specification clause may contain requirement"
|
116
|
+
expect(File.read("test.err"))
|
117
|
+
.not_to include "Specification clause may contain recommendation"
|
118
|
+
end
|
119
|
+
|
120
|
+
it "warns that specification may contain recommendation, permission "\
|
121
|
+
"or possibility in normative text" do
|
122
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
123
|
+
= Document title
|
124
|
+
Author
|
125
|
+
:docfile: test.adoc
|
126
|
+
:nodoc:
|
127
|
+
:no-isobib:
|
128
|
+
:doctype: specification
|
129
|
+
|
130
|
+
== Random clause
|
131
|
+
|
132
|
+
The widget should be larger than 15 cm.
|
133
|
+
|
134
|
+
The widget can be larger than 15 cm.
|
135
|
+
|
136
|
+
[appendix,obligation=normative]
|
137
|
+
== Annex
|
138
|
+
|
139
|
+
The widget may not be good
|
140
|
+
INPUT
|
141
|
+
expect(File.read("test.err"))
|
142
|
+
.not_to include "Specification clause may contain requirement"
|
143
|
+
expect(File.read("test.err"))
|
144
|
+
.to include "Specification clause may contain recommendation"
|
145
|
+
expect(File.read("test.err"))
|
146
|
+
.to include "Specification clause may contain permission"
|
147
|
+
expect(File.read("test.err"))
|
148
|
+
.to include "Specification clause may contain possibility"
|
149
|
+
end
|
150
|
+
|
151
|
+
it "warns that guide may contain recommendation in informative text" do
|
152
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
153
|
+
= Document title
|
154
|
+
Author
|
155
|
+
:docfile: test.adoc
|
156
|
+
:nodoc:
|
157
|
+
:no-isobib:
|
158
|
+
:doctype: guide
|
159
|
+
|
160
|
+
== Random clause
|
161
|
+
|
162
|
+
The widget is not be larger than 15 cm.
|
163
|
+
|
164
|
+
NOTE: the widget shall not be good.
|
165
|
+
|
166
|
+
[appendix,obligation=informative]
|
167
|
+
== Annex
|
168
|
+
|
169
|
+
The widget should not be good
|
170
|
+
INPUT
|
171
|
+
expect(File.read("test.err"))
|
172
|
+
.to include "Guide clause may contain requirement"
|
173
|
+
expect(File.read("test.err"))
|
174
|
+
.to include "Guide clause may contain recommendation"
|
175
|
+
end
|
176
|
+
|
177
|
+
it "warns that guide contains normative annexes" do
|
178
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
179
|
+
= Document title
|
180
|
+
Author
|
181
|
+
:docfile: test.adoc
|
182
|
+
:nodoc:
|
183
|
+
:no-isobib:
|
184
|
+
:doctype: guide
|
185
|
+
|
186
|
+
[appendix,obligation=informative]
|
187
|
+
== Annex 1
|
188
|
+
|
189
|
+
[appendix,obligation=normative]
|
190
|
+
== Annex
|
191
|
+
INPUT
|
192
|
+
expect(File.read("test.err"))
|
193
|
+
.to include "Guide contains normative annex: Annex"
|
194
|
+
expect(File.read("test.err"))
|
195
|
+
.not_to include "Guide contains normative annex: Annex 1"
|
196
|
+
end
|
197
|
+
|
198
|
+
it "warns of ambiguous word 'must'" do
|
199
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
200
|
+
= Document title
|
201
|
+
Author
|
202
|
+
:docfile: test.adoc
|
203
|
+
:nodoc:
|
204
|
+
:no-isobib:
|
205
|
+
:doctype: technical-report
|
206
|
+
|
207
|
+
== Random clause
|
208
|
+
|
209
|
+
The widget must be larger than 15 cm.
|
210
|
+
INPUT
|
211
|
+
expect(File.read("test.err"))
|
212
|
+
.to include "text contains ambiguous 'must'"
|
213
|
+
end
|
214
|
+
|
215
|
+
it "warns of superscript ordinals" do
|
216
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
217
|
+
= Document title
|
218
|
+
Author
|
219
|
+
:docfile: test.adoc
|
220
|
+
:nodoc:
|
221
|
+
:no-isobib:
|
222
|
+
:doctype: technical-report
|
223
|
+
|
224
|
+
== Random clause
|
225
|
+
|
226
|
+
This is the 22^nd^ rule
|
227
|
+
INPUT
|
228
|
+
expect(File.read("test.err"))
|
229
|
+
.to include "text contains ordinal superscript"
|
230
|
+
end
|
231
|
+
|
232
|
+
it "warns of Non-approved reference in Normative References" do
|
233
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
234
|
+
#{VALIDATING_BLANK_HDR}
|
235
|
+
|
236
|
+
[bibliography]
|
237
|
+
== Normative References
|
238
|
+
* [[[XYZ,IESO 121]]] _Standard_
|
239
|
+
INPUT
|
240
|
+
expect(File.read("test.err"))
|
241
|
+
.to include "reference other than BSI, CEN, CENELEC, ISO, IEC "\
|
242
|
+
"not expected as normative"
|
243
|
+
end
|
244
|
+
|
245
|
+
it "warns of withdrawn standards in Normative References" do
|
246
|
+
VCR.use_cassette "isobib_get_639_1967" do
|
247
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
248
|
+
= Document title
|
249
|
+
Author
|
250
|
+
:docfile: test.adoc
|
251
|
+
:nodoc:
|
252
|
+
:no-isobib-cache:
|
253
|
+
|
254
|
+
[bibliography]
|
255
|
+
== Normative References
|
256
|
+
* [[[XYZ,ISO 639:1967]]] _Standard_
|
257
|
+
INPUT
|
258
|
+
expect(File.read("test.err"))
|
259
|
+
.to include "Do not cite withdrawn standards"
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
it "warns of withdrawn standards in Normative References" do
|
264
|
+
mock_fdis
|
265
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
266
|
+
= Document title
|
267
|
+
Author
|
268
|
+
:docfile: test.adoc
|
269
|
+
:nodoc:
|
270
|
+
:no-isobib-cache:
|
271
|
+
|
272
|
+
[bibliography]
|
273
|
+
== Normative References
|
274
|
+
* [[[XYZ,ISO/FDIS 17664-1]]] _Standard_
|
275
|
+
INPUT
|
276
|
+
expect(File.read("test.err"))
|
277
|
+
.to include "Do not cite unpublished standards"
|
278
|
+
end
|
279
|
+
|
280
|
+
it "Warning if main title contains document type" do
|
281
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
282
|
+
= Document title
|
283
|
+
Author
|
284
|
+
:docfile: test.adoc
|
285
|
+
:nodoc:
|
286
|
+
:title-main-en: A British Standard on Widgets
|
287
|
+
:no-isobib:
|
288
|
+
|
289
|
+
INPUT
|
290
|
+
expect(File.read("test.err"))
|
291
|
+
.to include "Main Title may name document type"
|
292
|
+
end
|
293
|
+
|
294
|
+
it "Warning if intro title contains document type" do
|
295
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
296
|
+
= Document title
|
297
|
+
Author
|
298
|
+
:docfile: test.adoc
|
299
|
+
:nodoc:
|
300
|
+
:title-intro-en: A British Standard on Widgets
|
301
|
+
:no-isobib:
|
302
|
+
|
303
|
+
INPUT
|
304
|
+
expect(File.read("test.err"))
|
305
|
+
.to include "Title Intro may name document type"
|
306
|
+
end
|
307
|
+
|
308
|
+
it "Warning if term definition starts with upper case character" do
|
309
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
310
|
+
#{VALIDATING_BLANK_HDR}
|
311
|
+
== Terms and Definitions
|
312
|
+
|
313
|
+
=== Term
|
314
|
+
|
315
|
+
Part of the specialized vocabulary of a particular field.
|
316
|
+
INPUT
|
317
|
+
expect(File.read("test.err"))
|
318
|
+
.to include "term definition starts with upper case character"
|
319
|
+
end
|
320
|
+
|
321
|
+
it "Warning if term definition is circular" do
|
322
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
323
|
+
#{VALIDATING_BLANK_HDR}
|
324
|
+
== Terms and Definitions
|
325
|
+
|
326
|
+
=== Vocabulary
|
327
|
+
|
328
|
+
Part of the specialized vocabulary of a particular field.
|
329
|
+
INPUT
|
330
|
+
expect(File.read("test.err"))
|
331
|
+
.to include "term definition may be circular"
|
332
|
+
end
|
333
|
+
|
334
|
+
it "Warning if symbol definition is circular" do
|
335
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
336
|
+
#{VALIDATING_BLANK_HDR}
|
337
|
+
== Symbols and Abbreviated Terms
|
338
|
+
|
339
|
+
stem:[a_1]:: the notion of the dimension of a particular field
|
340
|
+
a:: Part of the list of the dimension of a particular field.
|
341
|
+
V:: part of the V of a particular field
|
342
|
+
X:: Part of the notion of a particular field
|
343
|
+
INPUT
|
344
|
+
expect(File.read("test.err"))
|
345
|
+
.to include "a: symbol definition ends with period"
|
346
|
+
expect(File.read("test.err"))
|
347
|
+
.to include "a1: symbol definition starts with article"
|
348
|
+
expect(File.read("test.err"))
|
349
|
+
.to include "V: symbol definition may be circular"
|
350
|
+
expect(File.read("test.err"))
|
351
|
+
.to include "X: symbol definition starts with upper case character"
|
352
|
+
end
|
353
|
+
|
354
|
+
it "Warning if annexes do not appear in citation order" do
|
355
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
356
|
+
#{VALIDATING_BLANK_HDR}
|
357
|
+
|
358
|
+
<<a3>>
|
359
|
+
<<a2>>
|
360
|
+
<<a1>>
|
361
|
+
|
362
|
+
[[a1]]
|
363
|
+
[appendix]
|
364
|
+
== First annex
|
365
|
+
|
366
|
+
[[a2]]
|
367
|
+
[appendix]
|
368
|
+
== Second annex
|
369
|
+
|
370
|
+
[[a3]]
|
371
|
+
[appendix]
|
372
|
+
== Third annex
|
373
|
+
INPUT
|
374
|
+
expect(File.read("test.err"))
|
375
|
+
.to include "First annex should be annex #3"
|
376
|
+
expect(File.read("test.err"))
|
377
|
+
.to include "Third annex should be annex #1"
|
378
|
+
end
|
379
|
+
|
380
|
+
it "Warning if annexes not cited properly" do
|
381
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
382
|
+
= Document title
|
383
|
+
Author
|
384
|
+
:docfile: test.adoc
|
385
|
+
:nodoc:
|
386
|
+
:no-isobib:
|
387
|
+
:doctype: specification
|
388
|
+
|
389
|
+
<<a1>> shall be cited.
|
390
|
+
People should cite <<a1>>.
|
391
|
+
<<a2>> should be cited.
|
392
|
+
You may cite <<a2>> at length.
|
393
|
+
|
394
|
+
[[a1]]
|
395
|
+
[appendix,obligation=normative]
|
396
|
+
== First annex
|
397
|
+
|
398
|
+
[[a2]]
|
399
|
+
[appendix,obligation=informative]
|
400
|
+
== Second annex
|
401
|
+
|
402
|
+
INPUT
|
403
|
+
expect(File.read("test.err"))
|
404
|
+
.to include "Specification must cite normative annex as requirement: People should cite"
|
405
|
+
expect(File.read("test.err"))
|
406
|
+
.to include "Specification must cite informative annex as recommendation or statement: You may cite"
|
407
|
+
|
408
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
409
|
+
= Document title
|
410
|
+
Author
|
411
|
+
:docfile: test.adoc
|
412
|
+
:nodoc:
|
413
|
+
:no-isobib:
|
414
|
+
:doctype: code-of-practice
|
415
|
+
|
416
|
+
<<a1>> shall be cited.
|
417
|
+
People should cite <<a1>>.
|
418
|
+
<<a2>> should be cited.
|
419
|
+
You may cite <<a2>> at length.
|
420
|
+
|
421
|
+
[[a1]]
|
422
|
+
[appendix,obligation=normative]
|
423
|
+
== First annex
|
424
|
+
|
425
|
+
[[a2]]
|
426
|
+
[appendix,obligation=informative]
|
427
|
+
== Second annex
|
428
|
+
|
429
|
+
INPUT
|
430
|
+
expect(File.read("test.err"))
|
431
|
+
.to include "Code Of Practice must cite normative annex as recommendation: XREF shall be cited"
|
432
|
+
expect(File.read("test.err"))
|
433
|
+
.to include "Code Of Practice must cite informative annex as statement: People should cite"
|
434
|
+
end
|
435
|
+
|
436
|
+
it "Warn if more than 5 levels of subclause" do
|
437
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
438
|
+
= Document title
|
439
|
+
Author
|
440
|
+
:docfile: test.adoc
|
441
|
+
:nodoc:
|
442
|
+
:no-isobib:
|
443
|
+
|
444
|
+
== Clause
|
445
|
+
|
446
|
+
=== Clause
|
447
|
+
|
448
|
+
==== Clause
|
449
|
+
|
450
|
+
===== Clause
|
451
|
+
|
452
|
+
====== Clause
|
453
|
+
|
454
|
+
[level=6]
|
455
|
+
====== Clause
|
456
|
+
|
457
|
+
INPUT
|
458
|
+
expect(File.read("test.err"))
|
459
|
+
.to include "Exceeds the maximum clause depth of 5"
|
460
|
+
end
|
461
|
+
|
462
|
+
it "Warn if more than three ordered lists in a clause" do
|
463
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
464
|
+
= Document title
|
465
|
+
Author
|
466
|
+
:docfile: test.adoc
|
467
|
+
:nodoc:
|
468
|
+
:no-isobib:
|
469
|
+
|
470
|
+
== Clause
|
471
|
+
|
472
|
+
. A
|
473
|
+
.. B
|
474
|
+
... C
|
475
|
+
|
476
|
+
a
|
477
|
+
|
478
|
+
. A
|
479
|
+
.. B
|
480
|
+
|
481
|
+
a
|
482
|
+
|
483
|
+
. B
|
484
|
+
|
485
|
+
INPUT
|
486
|
+
expect(File.read("test.err"))
|
487
|
+
.not_to include "More than 3 ordered lists in a numbered clause"
|
488
|
+
|
489
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
490
|
+
= Document title
|
491
|
+
Author
|
492
|
+
:docfile: test.adoc
|
493
|
+
:nodoc:
|
494
|
+
:no-isobib:
|
495
|
+
|
496
|
+
== Clause
|
497
|
+
|
498
|
+
. A
|
499
|
+
.. B
|
500
|
+
... C
|
501
|
+
|
502
|
+
a
|
503
|
+
|
504
|
+
. A
|
505
|
+
.. B
|
506
|
+
|
507
|
+
a
|
508
|
+
|
509
|
+
. B
|
510
|
+
.. C
|
511
|
+
|
512
|
+
a
|
513
|
+
|
514
|
+
. C
|
515
|
+
|
516
|
+
INPUT
|
517
|
+
expect(File.read("test.err"))
|
518
|
+
.to include "More than 3 ordered lists in a numbered clause"
|
519
|
+
|
520
|
+
end
|
521
|
+
|
522
|
+
it "Warn if nothing before list" do
|
523
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
524
|
+
= Document title
|
525
|
+
Author
|
526
|
+
:docfile: test.adoc
|
527
|
+
:nodoc:
|
528
|
+
:no-isobib:
|
529
|
+
|
530
|
+
== Clause
|
531
|
+
|
532
|
+
. A
|
533
|
+
.. B
|
534
|
+
... C
|
535
|
+
INPUT
|
536
|
+
expect(File.read("test.err"))
|
537
|
+
.to include "All lists must be preceded by introductory phrase"
|
538
|
+
end
|
539
|
+
|
540
|
+
it "Warn if no introductory text before list" do
|
541
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
542
|
+
= Document title
|
543
|
+
Author
|
544
|
+
:docfile: test.adoc
|
545
|
+
:nodoc:
|
546
|
+
:no-isobib:
|
547
|
+
|
548
|
+
== Clause
|
549
|
+
|
550
|
+
NOTE: X
|
551
|
+
|
552
|
+
* A
|
553
|
+
* B
|
554
|
+
* C
|
555
|
+
INPUT
|
556
|
+
expect(File.read("test.err"))
|
557
|
+
.to include "All lists must be preceded by introductory phrase"
|
558
|
+
end
|
559
|
+
|
560
|
+
it "Do not warn if introductory text before list" do
|
561
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
562
|
+
= Document title
|
563
|
+
Author
|
564
|
+
:docfile: test.adoc
|
565
|
+
:nodoc:
|
566
|
+
:no-isobib:
|
567
|
+
|
568
|
+
== Clause
|
569
|
+
|
570
|
+
X
|
571
|
+
|
572
|
+
* A
|
573
|
+
* B
|
574
|
+
* C
|
575
|
+
INPUT
|
576
|
+
expect(File.read("test.err"))
|
577
|
+
.not_to include "All lists must be preceded by introductory phrase"
|
578
|
+
end
|
579
|
+
|
580
|
+
it "Warn if no colon or full stop before list" do
|
581
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
582
|
+
= Document title
|
583
|
+
Author
|
584
|
+
:docfile: test.adoc
|
585
|
+
:nodoc:
|
586
|
+
:no-isobib:
|
587
|
+
|
588
|
+
== Clause
|
589
|
+
|
590
|
+
X
|
591
|
+
|
592
|
+
* A
|
593
|
+
* B
|
594
|
+
* C
|
595
|
+
INPUT
|
596
|
+
expect(File.read("test.err"))
|
597
|
+
.to include "All lists must be preceded by colon or full stop"
|
598
|
+
end
|
599
|
+
|
600
|
+
it "Do not warn if colon or full stop before list" do
|
601
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
602
|
+
= Document title
|
603
|
+
Author
|
604
|
+
:docfile: test.adoc
|
605
|
+
:nodoc:
|
606
|
+
:no-isobib:
|
607
|
+
|
608
|
+
== Clause
|
609
|
+
|
610
|
+
X.
|
611
|
+
|
612
|
+
* A
|
613
|
+
* B
|
614
|
+
* C
|
615
|
+
|
616
|
+
X:
|
617
|
+
|
618
|
+
. A
|
619
|
+
. B
|
620
|
+
. C
|
621
|
+
INPUT
|
622
|
+
expect(File.read("test.err"))
|
623
|
+
.not_to include "All lists must be preceded by colon or full stop"
|
624
|
+
end
|
625
|
+
|
626
|
+
it "Warn of list punctuation after colon" do
|
627
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
628
|
+
= Document title
|
629
|
+
Author
|
630
|
+
:docfile: test.adoc
|
631
|
+
:nodoc:
|
632
|
+
:no-isobib:
|
633
|
+
|
634
|
+
== Clause
|
635
|
+
|
636
|
+
X:
|
637
|
+
|
638
|
+
* this is;
|
639
|
+
* another;
|
640
|
+
* Sentence.
|
641
|
+
|
642
|
+
X:
|
643
|
+
|
644
|
+
. this is
|
645
|
+
. another;
|
646
|
+
. sentence
|
647
|
+
|
648
|
+
X:
|
649
|
+
|
650
|
+
. sentence.
|
651
|
+
INPUT
|
652
|
+
expect(File.read("test.err"))
|
653
|
+
.to include "List entry after colon must start with lowercase letter: Sentence."
|
654
|
+
expect(File.read("test.err"))
|
655
|
+
.not_to include "List entry after colon must start with lowercase letter: another;."
|
656
|
+
expect(File.read("test.err"))
|
657
|
+
.to include "List entry after colon must end with semicolon: this is"
|
658
|
+
expect(File.read("test.err"))
|
659
|
+
.to include "Final list entry after colon must end with full stop: sentence"
|
660
|
+
expect(File.read("test.err"))
|
661
|
+
.not_to include "Final list entry after colon must end with full stop: sentence."
|
662
|
+
end
|
663
|
+
|
664
|
+
it "Warn of list punctuation after full stop" do
|
665
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
666
|
+
= Document title
|
667
|
+
Author
|
668
|
+
:docfile: test.adoc
|
669
|
+
:nodoc:
|
670
|
+
:no-isobib:
|
671
|
+
|
672
|
+
== Clause
|
673
|
+
|
674
|
+
X.
|
675
|
+
|
676
|
+
* This is;
|
677
|
+
* Another.
|
678
|
+
* sentence.
|
679
|
+
|
680
|
+
INPUT
|
681
|
+
expect(File.read("test.err"))
|
682
|
+
.to include "List entry after full stop must end with full stop: This is;"
|
683
|
+
expect(File.read("test.err"))
|
684
|
+
.not_to include "List entry after full stop must end with full stop: Another."
|
685
|
+
expect(File.read("test.err"))
|
686
|
+
.to include "List entry after full stop must start with uppercase letter: sentence."
|
687
|
+
end
|
688
|
+
|
689
|
+
it "Warn of provisions in admonitions" do
|
690
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
691
|
+
= Document title
|
692
|
+
Author
|
693
|
+
:docfile: test.adoc
|
694
|
+
:nodoc:
|
695
|
+
:no-isobib:
|
696
|
+
|
697
|
+
== Clause
|
698
|
+
|
699
|
+
[WARNING]
|
700
|
+
--
|
701
|
+
This shall be bad. This can be bad. This should be bad. This may be bad.
|
702
|
+
--
|
703
|
+
|
704
|
+
INPUT
|
705
|
+
expect(File.read("test.err"))
|
706
|
+
.to include "admonition may contain requirement"
|
707
|
+
expect(File.read("test.err"))
|
708
|
+
.to include "admonition may contain recommendation"
|
709
|
+
expect(File.read("test.err"))
|
710
|
+
.to include "admonition may contain permission"
|
711
|
+
expect(File.read("test.err"))
|
712
|
+
.to include "admonition may contain possibility"
|
713
|
+
end
|
714
|
+
|
715
|
+
it "warns that example may contain requirement" do
|
716
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
717
|
+
#{VALIDATING_BLANK_HDR}
|
718
|
+
|
719
|
+
== Terms and Definitions
|
720
|
+
|
721
|
+
=== Term
|
722
|
+
|
723
|
+
[example]
|
724
|
+
This shall be bad. This can be bad. This should be bad. This may be bad.
|
725
|
+
INPUT
|
726
|
+
expect(File.read("test.err"))
|
727
|
+
.to include "Example may contain requirement"
|
728
|
+
expect(File.read("test.err"))
|
729
|
+
.not_to include "Example may contain recommendation"
|
730
|
+
end
|
731
|
+
|
732
|
+
it "warns of incorrect spacing around plus-minus sign" do
|
733
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
734
|
+
#{VALIDATING_BLANK_HDR}
|
735
|
+
|
736
|
+
=== Term
|
737
|
+
|
738
|
+
9 ± 2
|
739
|
+
2±9
|
740
|
+
INPUT
|
741
|
+
expect(File.read("test.err"))
|
742
|
+
.to include "no space before plus-minus sign: 2±9"
|
743
|
+
expect(File.read("test.err"))
|
744
|
+
.to include "space after plus-minus sign: 9 ± 2"
|
745
|
+
end
|
746
|
+
|
747
|
+
it "warns of nested subscripts" do
|
748
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
749
|
+
#{VALIDATING_BLANK_HDR}
|
750
|
+
|
751
|
+
=== Term
|
752
|
+
|
753
|
+
stem:[D_{1_max}]
|
754
|
+
stem:[D^{1^max}]
|
755
|
+
INPUT
|
756
|
+
expect(File.read("test.err"))
|
757
|
+
.to include "Nested subscript"
|
758
|
+
expect(File.read("test.err"))
|
759
|
+
.to include "Nested superscript"
|
760
|
+
end
|
761
|
+
|
762
|
+
it "warns of empty table data cells" do
|
763
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
764
|
+
#{VALIDATING_BLANK_HDR}
|
765
|
+
|
766
|
+
=== Term
|
767
|
+
|
768
|
+
|===
|
769
|
+
| | A
|
770
|
+
|
771
|
+
| B | C
|
772
|
+
|===
|
773
|
+
INPUT
|
774
|
+
expect(File.read("test.err"))
|
775
|
+
.to include "Empty table cell"
|
776
|
+
end
|
777
|
+
|
778
|
+
it "warns of empty table header cells" do
|
779
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
780
|
+
#{VALIDATING_BLANK_HDR}
|
781
|
+
|
782
|
+
=== Term
|
783
|
+
|
784
|
+
|===
|
785
|
+
| C | A
|
786
|
+
|
787
|
+
| B |
|
788
|
+
|===
|
789
|
+
INPUT
|
790
|
+
expect(File.read("test.err"))
|
791
|
+
.to include "Empty table cell"
|
792
|
+
end
|
793
|
+
|
794
|
+
it "does not warn of no empty table cells" do
|
795
|
+
Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
796
|
+
#{VALIDATING_BLANK_HDR}
|
797
|
+
|
798
|
+
=== Term
|
799
|
+
|
800
|
+
|===
|
801
|
+
| C | A
|
802
|
+
|
803
|
+
| B | X
|
804
|
+
|===
|
805
|
+
INPUT
|
806
|
+
expect(File.read("test.err"))
|
807
|
+
.not_to include "Empty table cell"
|
808
|
+
|
809
|
+
end
|
810
|
+
|
811
|
+
|
812
|
+
end
|
813
|
+
|
814
|
+
private
|
815
|
+
|
816
|
+
def mock_fdis
|
817
|
+
expect(RelatonIso::IsoBibliography).to receive(:get)
|
818
|
+
.with("ISO/FDIS 17664-1", nil, lang: "en", title: "<em>Standard</em>", usrlbl: nil) do
|
819
|
+
RelatonIsoBib::XMLParser.from_xml(<<~"OUTPUT")
|
820
|
+
<bibitem id="x" type="standard">
|
821
|
+
<fetched>#{Date.today}</fetched>
|
822
|
+
<title format="text/plain" language="fr" script="Latn" type="title-intro">Traitement de produits de soins de santé</title>
|
823
|
+
<title format="text/plain" language="fr" script="Latn" type="title-main">Informations relatives au traitement des dispositifs médicaux à fournir par le fabricant du dispositif</title>
|
824
|
+
<title format="text/plain" language="fr" script="Latn" type="title-part">Partie 1: Titre manque</title>
|
825
|
+
<title format="text/plain" language="fr" script="Latn" type="main">Traitement de produits de soins de santé — Informations relatives au traitement des dispositifs médicaux à fournir par le fabricant du dispositif — Partie 1: Titre manque</title>
|
826
|
+
<uri type="src">https://www.iso.org/standard/81720.html</uri>
|
827
|
+
<uri type="rss">https://www.iso.org/contents/data/standard/08/17/81720.detail.rss</uri>
|
828
|
+
<docidentifier type="ISO">ISO/FDIS 17664-1</docidentifier>
|
829
|
+
<docidentifier type="URN">urn:iso:std:iso-fdis:17664:-1:stage-50.00:ed-1:fr</docidentifier>
|
830
|
+
<docnumber>17664</docnumber>
|
831
|
+
<contributor>
|
832
|
+
<role type="publisher"/>
|
833
|
+
<organization>
|
834
|
+
<name>International Organization for Standardization</name>
|
835
|
+
<abbreviation>ISO</abbreviation>
|
836
|
+
<uri>www.iso.org</uri>
|
837
|
+
</organization>
|
838
|
+
</contributor>
|
839
|
+
<edition>1</edition>
|
840
|
+
<language>en</language>
|
841
|
+
<language>fr</language>
|
842
|
+
<script>Latn</script>
|
843
|
+
<status>
|
844
|
+
<stage>50</stage>
|
845
|
+
<substage>00</substage>
|
846
|
+
</status>
|
847
|
+
<copyright>
|
848
|
+
<from>unknown</from>
|
849
|
+
<owner>
|
850
|
+
<organization>
|
851
|
+
<name>ISO/FDIS</name>
|
852
|
+
</organization>
|
853
|
+
</owner>
|
854
|
+
</copyright>
|
855
|
+
</bibitem>
|
856
|
+
OUTPUT
|
857
|
+
end
|
858
|
+
end
|