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 +4 -4
- data/lib/asciidoctor/iso/cleanup.rb +0 -1
- data/lib/asciidoctor/iso/isodoc.rng +44 -7
- data/lib/asciidoctor/iso/isostandard.rng +7 -3
- data/lib/asciidoctor/iso/reqt.rng +15 -4
- 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 +268 -122
- data/lib/isodoc/iso/iso.international-standard.xsl +268 -122
- data/lib/isodoc/iso/isosts_convert.rb +12 -13
- data/lib/isodoc/iso/presentation_xml_convert.rb +51 -7
- data/lib/isodoc/iso/sts_convert.rb +4 -5
- data/lib/isodoc/iso/xref.rb +17 -1
- data/lib/metanorma/iso/processor.rb +1 -1
- data/lib/metanorma/iso/version.rb +1 -1
- data/metanorma-iso.gemspec +1 -1
- 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 +312 -122
- data/spec/isodoc/section_spec.rb +194 -71
- metadata +3 -3
@@ -1,31 +1,30 @@
|
|
1
1
|
require "isodoc"
|
2
|
-
require "
|
2
|
+
require "mnconvert"
|
3
3
|
|
4
4
|
module IsoDoc
|
5
5
|
module Iso
|
6
|
-
|
7
6
|
# A {Converter} implementation that generates HTML output, and a document
|
8
7
|
# schema encapsulation of the document for validation
|
9
8
|
#
|
10
9
|
class IsoStsConvert < IsoDoc::XslfoPdfConvert
|
11
|
-
def initialize(
|
10
|
+
def initialize(_options)
|
12
11
|
@libdir = File.dirname(__FILE__)
|
13
12
|
@format = :isosts
|
14
13
|
@suffix = "isosts.xml"
|
15
14
|
end
|
16
15
|
|
17
|
-
def convert(
|
18
|
-
file = File.read(
|
19
|
-
|
20
|
-
/\.xml$/.match(
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
16
|
+
def convert(input_fname, file = nil, debug = false, output_fname = nil)
|
17
|
+
file = File.read(input_fname, encoding: "utf-8") if file.nil?
|
18
|
+
_, fname, dir = convert_init(file, input_fname, debug)
|
19
|
+
/\.xml$/.match(input_fname) or
|
20
|
+
input_fname = Tempfile.open([fname, ".xml"], encoding: "utf-8") do |f|
|
21
|
+
f.write file
|
22
|
+
f.path
|
23
|
+
end
|
25
24
|
FileUtils.rm_rf dir
|
26
|
-
|
25
|
+
MnConvert.convert(input_fname, output_fname || "#{fname}.#{@suffix}",
|
26
|
+
MnConvert::InputFormat::MN, { output_format: :iso })
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
@@ -112,14 +112,58 @@ module IsoDoc
|
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
115
|
+
def concept(docxml)
|
116
|
+
docxml.xpath(ns("//terms//concept")).each_with_object({}) do |f, m|
|
117
|
+
concept_term(f, m)
|
118
|
+
end
|
119
|
+
docxml.xpath(ns("//concept")).each do |node|
|
120
|
+
concept_render(node, node["ital"] || "false", node["ref"] || "false")
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def concept_term(node, seen)
|
125
|
+
term = node&.at(ns("./refterm"))&.to_xml
|
126
|
+
if term && seen[term]
|
127
|
+
concept_render(node, node["ital"] || "false", node["ref"] || "false")
|
128
|
+
else concept_render(node, node["ital"] || "true", node["ref"] || "true")
|
129
|
+
end
|
130
|
+
seen[term] = true if term
|
131
|
+
seen
|
132
|
+
end
|
133
|
+
|
134
|
+
def concept1_ref(node, ref)
|
135
|
+
if r = node.at(ns("./xref | ./eref | ./termref"))
|
136
|
+
return r.remove if ref == "false"
|
137
|
+
|
138
|
+
r.name == "termref" and
|
139
|
+
r.replace(@i18n.term_defined_in.sub(/%/, r.to_xml)) or
|
140
|
+
r.replace("(#{r.to_xml})")
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
115
144
|
def concept1(node)
|
116
|
-
node&.at(ns("./
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
145
|
+
node.replace(node&.at(ns("./renderterm"))&.children ||
|
146
|
+
node&.at(ns("./refterm"))&.children ||
|
147
|
+
node.children)
|
148
|
+
end
|
149
|
+
|
150
|
+
# we're assuming terms and clauses in the right place for display,
|
151
|
+
# to cope with multiple terms sections
|
152
|
+
|
153
|
+
def display_order(docxml)
|
154
|
+
i = 0
|
155
|
+
i = display_order_xpath(docxml, "//preface/*", i)
|
156
|
+
i = display_order_at(docxml, "//clause[@type = 'scope']", i)
|
157
|
+
i = display_order_at(docxml, @xrefs.klass.norm_ref_xpath, i)
|
158
|
+
# i = display_order_at(docxml, "//sections/terms | "\
|
159
|
+
# "//sections/clause[descendant::terms]", i)
|
160
|
+
# i = display_order_at(docxml, "//sections/definitions", i)
|
161
|
+
# i = display_order_xpath(docxml, @xrefs.klass.middle_clause(docxml), i)
|
162
|
+
i = display_order_xpath(docxml, "//sections/clause[not(@type = 'scope')] | "\
|
163
|
+
"//sections/terms | //sections/definitions", i)
|
164
|
+
i = display_order_xpath(docxml, "//annex", i)
|
165
|
+
i = display_order_xpath(docxml, @xrefs.klass.bibliography_xpath, i)
|
166
|
+
display_order_xpath(docxml, "//indexsect", i)
|
123
167
|
end
|
124
168
|
|
125
169
|
include Init
|
@@ -1,9 +1,8 @@
|
|
1
1
|
require "isodoc"
|
2
|
-
require "
|
2
|
+
require "mnconvert"
|
3
3
|
|
4
4
|
module IsoDoc
|
5
5
|
module Iso
|
6
|
-
|
7
6
|
class StsConvert < IsoDoc::XslfoPdfConvert
|
8
7
|
def initialize(_options) # rubocop:disable Lint/MissingSuper
|
9
8
|
@libdir = File.dirname(__FILE__)
|
@@ -14,14 +13,14 @@ module IsoDoc
|
|
14
13
|
def convert(in_fname, file = nil, debug = false, out_fname = nil)
|
15
14
|
file = File.read(in_fname, encoding: "utf-8") if file.nil?
|
16
15
|
_docxml, filename, dir = convert_init(file, in_fname, debug)
|
17
|
-
|
16
|
+
/\.xml$/.match?(in_fname) or
|
18
17
|
in_fname = Tempfile.open([filename, ".xml"], encoding: "utf-8") do |f|
|
19
18
|
f.write file
|
20
19
|
f.path
|
21
20
|
end
|
22
|
-
end
|
23
21
|
FileUtils.rm_rf dir
|
24
|
-
|
22
|
+
MnConvert.convert(in_fname, out_fname || "#{filename}.#{@suffix}",
|
23
|
+
MnConvert::InputFormat::MN)
|
25
24
|
end
|
26
25
|
end
|
27
26
|
end
|
data/lib/isodoc/iso/xref.rb
CHANGED
@@ -8,7 +8,7 @@ module IsoDoc
|
|
8
8
|
if @klass.amd(doc)
|
9
9
|
initial_anchor_names_amd(doc)
|
10
10
|
else
|
11
|
-
|
11
|
+
initial_anchor_names1(doc)
|
12
12
|
end
|
13
13
|
introduction_names(doc.at(ns("//introduction")))
|
14
14
|
end
|
@@ -26,6 +26,22 @@ module IsoDoc
|
|
26
26
|
termexample_anchor_names(doc)
|
27
27
|
end
|
28
28
|
|
29
|
+
def initial_anchor_names1(doc)
|
30
|
+
doc.xpath(ns("//preface/*")).each { |c| c.element? and preface_names(c) }
|
31
|
+
# potentially overridden in middle_section_asset_names()
|
32
|
+
sequential_asset_names(doc.xpath(ns("//preface/*")))
|
33
|
+
n = Counter.new
|
34
|
+
n = section_names(doc.at(ns("//clause[@type = 'scope']")), n, 1)
|
35
|
+
n = section_names(doc.at(ns(@klass.norm_ref_xpath)), n, 1)
|
36
|
+
doc.xpath(ns("//sections/clause[not(@type = 'scope')] | "\
|
37
|
+
"//sections/terms | //sections/definitions")).each do |c|
|
38
|
+
n = section_names(c, n, 1)
|
39
|
+
end
|
40
|
+
middle_section_asset_names(doc)
|
41
|
+
termnote_anchor_names(doc)
|
42
|
+
termexample_anchor_names(doc)
|
43
|
+
end
|
44
|
+
|
29
45
|
# we can reference 0-number clauses in introduction
|
30
46
|
def introduction_names(clause)
|
31
47
|
return if clause.nil?
|
data/metanorma-iso.gemspec
CHANGED
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
|
|
31
31
|
|
32
32
|
spec.add_dependency "isodoc", "~> 1.7.0"
|
33
33
|
spec.add_dependency "metanorma-standoc", "~> 1.10.0"
|
34
|
-
spec.add_dependency "
|
34
|
+
spec.add_dependency "mnconvert", "~> 1.8.0"
|
35
35
|
spec.add_dependency "ruby-jing"
|
36
36
|
spec.add_dependency "tokenizer", "~> 0.3.0"
|
37
37
|
spec.add_dependency "twitter_cldr"
|
@@ -2,7 +2,7 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
RSpec.describe Asciidoctor::ISO do
|
4
4
|
it "processes sections" do
|
5
|
-
|
5
|
+
input = <<~INPUT
|
6
6
|
#{ASCIIDOC_BLANK_HDR}
|
7
7
|
== Foreword
|
8
8
|
|
@@ -56,6 +56,7 @@ RSpec.describe Asciidoctor::ISO do
|
|
56
56
|
|
57
57
|
=== Bibliography Subsection
|
58
58
|
INPUT
|
59
|
+
output = <<~OUTPUT
|
59
60
|
#{BLANK_HDR}
|
60
61
|
<preface>
|
61
62
|
<foreword id="_" obligation="informative">
|
@@ -151,10 +152,12 @@ RSpec.describe Asciidoctor::ISO do
|
|
151
152
|
</bibliography>
|
152
153
|
</iso-standard>
|
153
154
|
OUTPUT
|
155
|
+
expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
|
156
|
+
.to be_equivalent_to xmlpp(output)
|
154
157
|
end
|
155
158
|
|
156
159
|
it "processes section obligations" do
|
157
|
-
|
160
|
+
input = <<~INPUT
|
158
161
|
#{ASCIIDOC_BLANK_HDR}
|
159
162
|
[obligation=informative]
|
160
163
|
== Clause 1
|
@@ -167,6 +170,7 @@ RSpec.describe Asciidoctor::ISO do
|
|
167
170
|
[appendix,obligation=informative]
|
168
171
|
== Annex
|
169
172
|
INPUT
|
173
|
+
output = <<~OUTPUT
|
170
174
|
#{BLANK_HDR}
|
171
175
|
<sections>
|
172
176
|
<clause id="_" inline-header="false" obligation="informative">
|
@@ -184,10 +188,12 @@ RSpec.describe Asciidoctor::ISO do
|
|
184
188
|
</annex>
|
185
189
|
</iso-standard>
|
186
190
|
OUTPUT
|
191
|
+
expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
|
192
|
+
.to be_equivalent_to xmlpp(output)
|
187
193
|
end
|
188
194
|
|
189
195
|
it "processes inline headers" do
|
190
|
-
|
196
|
+
input = <<~INPUT
|
191
197
|
#{ASCIIDOC_BLANK_HDR}
|
192
198
|
== Clause 1
|
193
199
|
|
@@ -200,6 +206,7 @@ RSpec.describe Asciidoctor::ISO do
|
|
200
206
|
[%inline-header]
|
201
207
|
=== Clause Aa
|
202
208
|
INPUT
|
209
|
+
output = <<~OUTPUT
|
203
210
|
#{BLANK_HDR}
|
204
211
|
<sections>
|
205
212
|
<clause id="_" inline-header="false" obligation="normative">
|
@@ -217,16 +224,19 @@ RSpec.describe Asciidoctor::ISO do
|
|
217
224
|
</annex>
|
218
225
|
</iso-standard>
|
219
226
|
OUTPUT
|
227
|
+
expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
|
228
|
+
.to be_equivalent_to xmlpp(output)
|
220
229
|
end
|
221
230
|
|
222
231
|
it "processes blank headers" do
|
223
|
-
|
232
|
+
input = <<~INPUT
|
224
233
|
#{ASCIIDOC_BLANK_HDR}
|
225
234
|
== Clause 1
|
226
235
|
|
227
236
|
=== {blank}
|
228
237
|
|
229
238
|
INPUT
|
239
|
+
output = <<~OUTPUT
|
230
240
|
#{BLANK_HDR}
|
231
241
|
<sections>
|
232
242
|
<clause id="_" inline-header="false" obligation="normative">
|
@@ -236,10 +246,12 @@ RSpec.describe Asciidoctor::ISO do
|
|
236
246
|
</sections>
|
237
247
|
</iso-standard>
|
238
248
|
OUTPUT
|
249
|
+
expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
|
250
|
+
.to be_equivalent_to xmlpp(output)
|
239
251
|
end
|
240
252
|
|
241
253
|
it "processes terms & definitions with external source" do
|
242
|
-
|
254
|
+
input = <<~INPUT
|
243
255
|
#{ASCIIDOC_BLANK_HDR}
|
244
256
|
|
245
257
|
Foreword
|
@@ -250,6 +262,7 @@ RSpec.describe Asciidoctor::ISO do
|
|
250
262
|
=== Term1
|
251
263
|
|
252
264
|
INPUT
|
265
|
+
output = <<~OUTPUT
|
253
266
|
#{BLANK_HDR.sub(/<boilerplate>/, '<termdocsource bibitemid="iso1234"/><termdocsource bibitemid="iso5678"/><boilerplate>')}
|
254
267
|
<preface>
|
255
268
|
<foreword id="_" obligation="informative">
|
@@ -285,10 +298,12 @@ RSpec.describe Asciidoctor::ISO do
|
|
285
298
|
</sections>
|
286
299
|
</iso-standard>
|
287
300
|
OUTPUT
|
301
|
+
expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
|
302
|
+
.to be_equivalent_to xmlpp(output)
|
288
303
|
end
|
289
304
|
|
290
305
|
it "processes empty terms & definitions" do
|
291
|
-
|
306
|
+
input = <<~INPUT
|
292
307
|
#{ASCIIDOC_BLANK_HDR}
|
293
308
|
|
294
309
|
Foreword
|
@@ -297,6 +312,7 @@ RSpec.describe Asciidoctor::ISO do
|
|
297
312
|
|
298
313
|
|
299
314
|
INPUT
|
315
|
+
output = <<~OUTPUT
|
300
316
|
#{BLANK_HDR}
|
301
317
|
<preface>
|
302
318
|
<foreword id="_" obligation="informative">
|
@@ -331,10 +347,12 @@ RSpec.describe Asciidoctor::ISO do
|
|
331
347
|
</iso-standard>
|
332
348
|
|
333
349
|
OUTPUT
|
350
|
+
expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
|
351
|
+
.to be_equivalent_to xmlpp(output)
|
334
352
|
end
|
335
353
|
|
336
354
|
it "processes empty terms & definitions with external source" do
|
337
|
-
|
355
|
+
input = <<~INPUT
|
338
356
|
#{ASCIIDOC_BLANK_HDR}
|
339
357
|
|
340
358
|
Foreword
|
@@ -343,6 +361,7 @@ RSpec.describe Asciidoctor::ISO do
|
|
343
361
|
== Terms and Definitions
|
344
362
|
|
345
363
|
INPUT
|
364
|
+
output = <<~OUTPUT
|
346
365
|
#{BLANK_HDR.sub(/<boilerplate>/, '<termdocsource bibitemid="iso1234"/><termdocsource bibitemid="iso5678"/><boilerplate>')}
|
347
366
|
<preface>
|
348
367
|
<foreword id="_" obligation="informative">
|
@@ -375,5 +394,107 @@ RSpec.describe Asciidoctor::ISO do
|
|
375
394
|
</sections>
|
376
395
|
</iso-standard>
|
377
396
|
OUTPUT
|
397
|
+
expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
|
398
|
+
.to be_equivalent_to xmlpp(output)
|
399
|
+
end
|
400
|
+
|
401
|
+
it "ignores multiple terms & definitions in default documents" do
|
402
|
+
input = <<~INPUT
|
403
|
+
#{ASCIIDOC_BLANK_HDR}
|
404
|
+
|
405
|
+
== Terms and Definitions
|
406
|
+
|
407
|
+
== Clause
|
408
|
+
|
409
|
+
[heading=terms and definitions]
|
410
|
+
== More terms
|
411
|
+
|
412
|
+
INPUT
|
413
|
+
output = <<~OUTPUT
|
414
|
+
#{BLANK_HDR}
|
415
|
+
<sections>
|
416
|
+
<terms id='_' obligation='normative'>
|
417
|
+
<title>Terms and definitions</title>
|
418
|
+
<p id='_'>No terms and definitions are listed in this document.</p>
|
419
|
+
<p id='_'>
|
420
|
+
ISO and IEC maintain terminological databases for use in standardization
|
421
|
+
at the following addresses:
|
422
|
+
</p>
|
423
|
+
<ul id='_'>
|
424
|
+
<li>
|
425
|
+
<p id='_'>
|
426
|
+
ISO Online browsing platform: available at
|
427
|
+
<link target='http://www.iso.org/obp'/>
|
428
|
+
</p>
|
429
|
+
</li>
|
430
|
+
<li>
|
431
|
+
<p id='_'>
|
432
|
+
IEC Electropedia: available at
|
433
|
+
<link target='http://www.electropedia.org'/>
|
434
|
+
</p>
|
435
|
+
</li>
|
436
|
+
</ul>
|
437
|
+
</terms>
|
438
|
+
<clause id='_' inline-header='false' obligation='normative'>
|
439
|
+
<title>Clause</title>
|
440
|
+
</clause>
|
441
|
+
<clause id='_' inline-header='false' obligation='normative'>
|
442
|
+
<title>More terms</title>
|
443
|
+
</clause>
|
444
|
+
</sections>
|
445
|
+
</iso-standard>
|
446
|
+
OUTPUT
|
447
|
+
expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
|
448
|
+
.to be_equivalent_to xmlpp(output)
|
449
|
+
end
|
450
|
+
|
451
|
+
it "permits multiple terms & definitions in vocabulary documents" do
|
452
|
+
input = <<~INPUT
|
453
|
+
#{ASCIIDOC_BLANK_HDR.sub(/:nodoc:/, ":nodoc:\n:docsubtype: vocabulary")}
|
454
|
+
|
455
|
+
== Terms and Definitions
|
456
|
+
|
457
|
+
== Clause
|
458
|
+
|
459
|
+
[heading=terms and definitions]
|
460
|
+
== More terms
|
461
|
+
|
462
|
+
INPUT
|
463
|
+
output = <<~OUTPUT
|
464
|
+
#{BLANK_HDR.sub(%r{<doctype>article</doctype>}, "<doctype>article</doctype><subdoctype>vocabulary</subdoctype>")}
|
465
|
+
<sections>
|
466
|
+
<terms id='_' obligation='normative'>
|
467
|
+
<title>Terms and definitions</title>
|
468
|
+
<p id='_'>No terms and definitions are listed in this document.</p>
|
469
|
+
<p id='_'>
|
470
|
+
ISO and IEC maintain terminological databases for use in standardization
|
471
|
+
at the following addresses:
|
472
|
+
</p>
|
473
|
+
<ul id='_'>
|
474
|
+
<li>
|
475
|
+
<p id='_'>
|
476
|
+
ISO Online browsing platform: available at
|
477
|
+
<link target='http://www.iso.org/obp'/>
|
478
|
+
</p>
|
479
|
+
</li>
|
480
|
+
<li>
|
481
|
+
<p id='_'>
|
482
|
+
IEC Electropedia: available at
|
483
|
+
<link target='http://www.electropedia.org'/>
|
484
|
+
</p>
|
485
|
+
</li>
|
486
|
+
</ul>
|
487
|
+
</terms>
|
488
|
+
<clause id='_' inline-header='false' obligation='normative'>
|
489
|
+
<title>Clause</title>
|
490
|
+
</clause>
|
491
|
+
<terms id='_' obligation='normative'>
|
492
|
+
<title>More terms</title>
|
493
|
+
</terms>
|
494
|
+
</sections>
|
495
|
+
</iso-standard>
|
496
|
+
OUTPUT
|
497
|
+
expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
|
498
|
+
.to be_equivalent_to xmlpp(output)
|
378
499
|
end
|
379
500
|
end
|