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
@@ -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
|
-
|
@@ -45,7 +45,7 @@ module IsoDoc
|
|
45
45
|
prefix_name(node, " — ", lbl, "name")
|
46
46
|
end
|
47
47
|
|
48
|
-
def eref_localities1_zh(target, type, from,
|
48
|
+
def eref_localities1_zh(target, type, from, upto, node, delim)
|
49
49
|
subsection = from&.text&.match(/\./)
|
50
50
|
ret = if delim == ";"
|
51
51
|
";"
|
@@ -53,32 +53,31 @@ module IsoDoc
|
|
53
53
|
type == "list" ? "" : delim
|
54
54
|
end
|
55
55
|
ret += " 第#{from.text}" if from
|
56
|
-
ret += "–#{
|
56
|
+
ret += "–#{upto.text}" if upto
|
57
57
|
loc = (@i18n.locality[type] || type.sub(/^locality:/, "").capitalize)
|
58
58
|
ret += " #{loc}" unless subsection && type == "clause" ||
|
59
59
|
type == "list" || target.match(/^IEV$|^IEC 60050-/) ||
|
60
|
-
|
60
|
+
node["droploc"] == "true"
|
61
61
|
ret += ")" if type == "list"
|
62
62
|
ret
|
63
63
|
end
|
64
64
|
|
65
|
-
def eref_localities1(target, type, from,
|
65
|
+
def eref_localities1(target, type, from, upto, delim, node, lang = "en")
|
66
66
|
return "" if type == "anchor"
|
67
67
|
|
68
68
|
subsection = from&.text&.match(/\./)
|
69
69
|
type = type.downcase
|
70
70
|
lang == "zh" and
|
71
|
-
return l10n(eref_localities1_zh(target, type, from,
|
72
|
-
ret = if delim == ";"
|
73
|
-
";"
|
71
|
+
return l10n(eref_localities1_zh(target, type, from, upto, node, delim))
|
72
|
+
ret = if delim == ";" then ";"
|
74
73
|
else
|
75
74
|
type == "list" ? "" : delim
|
76
75
|
end
|
77
|
-
ret += eref_locality_populate(type,
|
76
|
+
ret += eref_locality_populate(type, node) unless subsection &&
|
78
77
|
type == "clause" || type == "list" ||
|
79
78
|
target.match(/^IEV$|^IEC 60050-/)
|
80
79
|
ret += " #{from.text}" if from
|
81
|
-
ret += "–#{
|
80
|
+
ret += "–#{upto.text}" if upto
|
82
81
|
ret += ")" if type == "list"
|
83
82
|
l10n(ret)
|
84
83
|
end
|
@@ -113,6 +112,60 @@ module IsoDoc
|
|
113
112
|
end
|
114
113
|
end
|
115
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
|
+
|
144
|
+
def concept1(node)
|
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)
|
167
|
+
end
|
168
|
+
|
116
169
|
include Init
|
117
170
|
end
|
118
171
|
end
|
@@ -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
@@ -29,9 +29,9 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.test_files = `git ls-files -- {spec}/*`.split("\n")
|
30
30
|
spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
|
31
31
|
|
32
|
-
spec.add_dependency "isodoc", "~> 1.
|
33
|
-
spec.add_dependency "metanorma-standoc", "~> 1.
|
34
|
-
spec.add_dependency "
|
32
|
+
spec.add_dependency "isodoc", "~> 1.7.0"
|
33
|
+
spec.add_dependency "metanorma-standoc", "~> 1.10.0"
|
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
|