metanorma-standoc 2.2.0.1 → 2.2.2

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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +1 -1
  3. data/.github/workflows/release.yml +24 -0
  4. data/lib/metanorma/standoc/base.rb +16 -0
  5. data/lib/metanorma/standoc/biblio.rng +8 -5
  6. data/lib/metanorma/standoc/blocks.rb +26 -13
  7. data/lib/metanorma/standoc/cleanup_biblio.rb +16 -10
  8. data/lib/metanorma/standoc/cleanup_reqt.rb +3 -136
  9. data/lib/metanorma/standoc/converter.rb +0 -7
  10. data/lib/metanorma/standoc/front.rb +6 -1
  11. data/lib/metanorma/standoc/front_contributor.rb +0 -10
  12. data/lib/metanorma/standoc/macros_terms.rb +5 -4
  13. data/lib/metanorma/standoc/reqt.rb +24 -73
  14. data/lib/metanorma/standoc/section.rb +35 -3
  15. data/lib/metanorma/standoc/terms.rb +13 -7
  16. data/lib/metanorma/standoc/utils.rb +9 -43
  17. data/lib/metanorma/standoc/validate.rb +18 -0
  18. data/lib/metanorma/standoc/version.rb +1 -1
  19. data/lib/metanorma-standoc.rb +1 -1
  20. data/metanorma-standoc.gemspec +5 -4
  21. data/spec/assets/correct.png +0 -0
  22. data/spec/assets/corrupt.png +0 -0
  23. data/spec/metanorma/base_spec.rb +6 -7
  24. data/spec/metanorma/biblio_spec.rb +8 -8
  25. data/spec/metanorma/blocks_spec.rb +20 -266
  26. data/spec/metanorma/cleanup_blocks_spec.rb +0 -168
  27. data/spec/metanorma/macros_concept_spec.rb +1052 -0
  28. data/spec/metanorma/macros_spec.rb +0 -1126
  29. data/spec/metanorma/reqt_spec.rb +130 -0
  30. data/spec/metanorma/section_spec.rb +5 -0
  31. data/spec/metanorma/validate_spec.rb +49 -0
  32. data/spec/requirements/default/blocks_spec.rb +250 -0
  33. data/spec/requirements/default/cleanup_spec.rb +173 -0
  34. data/spec/requirements/modspec/cleanup_spec.rb +333 -0
  35. data/spec/requirements/modspec/validate_spec.rb +330 -0
  36. data/spec/vcr_cassettes/bsi16341.yml +52 -36
  37. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +88 -88
  38. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec1.yml +10 -10
  39. data/spec/vcr_cassettes/hide_refs.yml +65 -65
  40. data/spec/vcr_cassettes/isobib_get_123.yml +12 -12
  41. data/spec/vcr_cassettes/isobib_get_123_1.yml +22 -22
  42. data/spec/vcr_cassettes/isobib_get_123_1_fr.yml +30 -30
  43. data/spec/vcr_cassettes/isobib_get_123_2.yml +21 -21
  44. data/spec/vcr_cassettes/isobib_get_123_2001.yml +11 -11
  45. data/spec/vcr_cassettes/isobib_get_124.yml +11 -11
  46. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +34 -58
  47. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +45 -45
  48. data/spec/vcr_cassettes/std-link.yml +11 -11
  49. metadata +50 -28
  50. data/lib/isodoc/html/htmlstyle.css +0 -998
@@ -0,0 +1,1052 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Metanorma::Standoc do
4
+ it "processes the Metanorma::Standoc concept and related macros" do
5
+ input = <<~INPUT
6
+ #{ASCIIDOC_BLANK_HDR}
7
+
8
+ {{clause1}}
9
+ {{clause two}}
10
+ {{clause
11
+ two}}
12
+ term:[clause1]
13
+ {{clause1,w\[o\]rd}}
14
+ term:[clause1,w[o&#93;rd]
15
+ {{clause1,w\[o\]rd,term}}
16
+ {{blah}}
17
+ term:[blah]
18
+ {{blah,word}}
19
+ term:[blah,word]
20
+ {{blah,term,word}}
21
+ {{blah,term,word,xref}}
22
+ {{blah,term,word,xref,options="noital,noref,nolinkmention,nolinkref"}}
23
+ {{blah,term,word,xref,options="ital,ref,linkmention,linkref"}}
24
+
25
+ related:contrast[blah]
26
+
27
+ [[clause1]]
28
+ == Clause
29
+ Terms are defined here
30
+ INPUT
31
+ output = <<~OUTPUT
32
+ #{BLANK_HDR}
33
+ <preface>
34
+ <foreword id='_' obligation='informative'>
35
+ <title>Foreword</title>
36
+ <p id='_'>
37
+ <concept>
38
+ <strong>
39
+ term
40
+ <tt>clause1</tt>
41
+ not resolved via ID
42
+ <tt>clause1</tt>
43
+ </strong>
44
+ </concept>
45
+ <concept>
46
+ <strong>
47
+ term
48
+ <tt>clause two</tt>
49
+ not resolved via ID
50
+ <tt>clause-two</tt>
51
+ </strong>
52
+ </concept>
53
+ <concept>
54
+ <strong>
55
+ term
56
+ <tt>clause two</tt>
57
+ not resolved via ID
58
+ <tt>clause-two</tt>
59
+ </strong>
60
+ </concept>
61
+ <concept>
62
+ <strong>
63
+ term
64
+ <tt>clause1</tt>
65
+ not resolved via ID
66
+ <tt>clause1</tt>
67
+ </strong>
68
+ </concept>
69
+ <concept>
70
+ <strong>
71
+ term
72
+ <tt>clause1</tt>, display <tt>w[o]rd</tt>
73
+ not resolved via ID
74
+ <tt>clause1</tt>
75
+ </strong>
76
+ </concept>
77
+ <concept>
78
+ <strong>
79
+ term
80
+ <tt>clause1</tt>, display <tt>w[o]rd</tt>
81
+ not resolved via ID
82
+ <tt>clause1</tt>
83
+ </strong>
84
+ </concept>
85
+ <concept>
86
+ <strong>
87
+ term
88
+ <tt>clause1</tt>, display <tt>w[o]rd</tt>
89
+ not resolved via ID
90
+ <tt>clause1</tt>
91
+ </strong>
92
+ </concept>
93
+ <concept>
94
+ <strong>
95
+ term
96
+ <tt>blah</tt>
97
+ not resolved via ID
98
+ <tt>blah</tt>
99
+ </strong>
100
+ </concept>
101
+ <concept>
102
+ <strong>
103
+ term
104
+ <tt>blah</tt>
105
+ not resolved via ID
106
+ <tt>blah</tt>
107
+ </strong>
108
+ </concept>
109
+ <concept>
110
+ <strong>
111
+ term
112
+ <tt>blah</tt>
113
+ , display
114
+ <tt>word</tt>
115
+ not resolved via ID
116
+ <tt>blah</tt>
117
+ </strong>
118
+ </concept>
119
+ <concept>
120
+ <strong>
121
+ term
122
+ <tt>blah</tt>
123
+ , display
124
+ <tt>word</tt>
125
+ not resolved via ID
126
+ <tt>blah</tt>
127
+ </strong>
128
+ </concept>
129
+ <concept>
130
+ <strong>
131
+ term
132
+ <tt>blah</tt>
133
+ , display
134
+ <tt>term</tt>
135
+ not resolved via ID
136
+ <tt>blah</tt>
137
+ </strong>
138
+ </concept>
139
+ <concept>
140
+ <strong>
141
+ term
142
+ <tt>blah</tt>
143
+ , display
144
+ <tt>term</tt>
145
+ not resolved via ID
146
+ <tt>blah</tt>
147
+ </strong>
148
+ </concept>
149
+ <concept ital='false' ref='false' linkmention='false' linkref='false'>
150
+ <strong>
151
+ term
152
+ <tt>blah</tt>
153
+ , display
154
+ <tt>term</tt>
155
+ not resolved via ID
156
+ <tt>blah</tt>
157
+ </strong>
158
+ </concept>
159
+ <concept ital='true' ref='true' linkmention='true' linkref='true'>
160
+ <strong>
161
+ term
162
+ <tt>blah</tt>
163
+ , display
164
+ <tt>term</tt>
165
+ not resolved via ID
166
+ <tt>blah</tt>
167
+ </strong>
168
+ </concept>
169
+ </p>
170
+ <related type='contrast'>
171
+ <strong>
172
+ term
173
+ <tt>blah</tt>
174
+ not resolved via ID
175
+ <tt>blah</tt>
176
+ </strong>
177
+ </related>
178
+ </foreword>
179
+ </preface>
180
+ <sections>
181
+ <clause id='clause1' inline-header='false' obligation='normative'>
182
+ <title>Clause</title>
183
+ <p id='_'>Terms are defined here</p>
184
+ </clause>
185
+ </sections>
186
+ </standard-document>
187
+ OUTPUT
188
+ expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
189
+ .to be_equivalent_to xmlpp(output)
190
+ end
191
+
192
+ it "processes the Metanorma::Standoc concept macros for acronyms" do
193
+ input = <<~INPUT
194
+ #{ASCIIDOC_BLANK_HDR}
195
+
196
+ {{Clause1}}
197
+ {{Clause1,Clause 1}}
198
+ {{Clause 2}}
199
+ {{Clause 2,Clause 1}}
200
+ {{<<Clause2>>,Clause 2}}
201
+
202
+ symbol:[Clause1]
203
+ symbol:[Clause1,word]
204
+ symbol:[Clause 2]
205
+ symbol:[Clause 2,word]
206
+
207
+ {{<<Clause2>>,word}}
208
+ {{<<Clause2>>,word,term}}
209
+ {{<<Clause2>>,word,term,xref}}
210
+ {{<<Clause2>>,word,term,xref,options="noital,noref,nolinkmention,nolinkref"}}
211
+ {{<<Clause2>>,word,term,xref,options="ital,ref,linkmention,linkref"}}
212
+
213
+ == Terms and definitions
214
+ === Clause1
215
+ == Symbols and Abbreviated Terms
216
+ Clause1:: A
217
+ [[Clause2]]Clause 2:: C
218
+ INPUT
219
+ output = <<~OUTPUT
220
+ #{BLANK_HDR}
221
+ <preface>
222
+ <foreword id='_' obligation='informative'>
223
+ <title>Foreword</title>
224
+ <p id='_'>
225
+ <concept>
226
+ <refterm>Clause1</refterm>
227
+ <renderterm>Clause1</renderterm>
228
+ <xref target='term-Clause1'/>
229
+ </concept>
230
+ <concept>
231
+ <refterm>Clause1</refterm>
232
+ <renderterm>Clause 1</renderterm>
233
+ <xref target='term-Clause1'/>
234
+ </concept>
235
+ <concept>
236
+ <refterm>Clause 2</refterm>
237
+ <renderterm>Clause 2</renderterm>
238
+ <xref target='Clause2'/>
239
+ </concept>
240
+ <concept>
241
+ <refterm>Clause 2</refterm>
242
+ <renderterm>Clause 1</renderterm>
243
+ <xref target='Clause2'/>
244
+ </concept>
245
+ <concept>
246
+ <refterm>Clause 2</refterm>
247
+ <renderterm>Clause 2</renderterm>
248
+ <xref target='Clause2'/>
249
+ </concept>
250
+ </p><p id="_">
251
+ <concept>
252
+ <refterm>Clause1</refterm>
253
+ <renderterm>Clause1</renderterm>
254
+ <xref target='symbol-Clause1'/>
255
+ </concept>
256
+ <concept>
257
+ <refterm>Clause1</refterm>
258
+ <renderterm>word</renderterm>
259
+ <xref target='symbol-Clause1'/>
260
+ </concept>
261
+ <concept>
262
+ <refterm>Clause 2</refterm>
263
+ <renderterm>Clause 2</renderterm>
264
+ <xref target='Clause2'/>
265
+ </concept>
266
+ <concept>
267
+ <refterm>Clause 2</refterm>
268
+ <renderterm>word</renderterm>
269
+ <xref target='Clause2'/>
270
+ </concept>
271
+ </p><p id="_">
272
+ <concept>
273
+ <refterm>word</refterm>
274
+ <renderterm>word</renderterm>
275
+ <xref target='Clause2'/>
276
+ </concept>
277
+ <concept>
278
+ <refterm>word</refterm>
279
+ <renderterm>term</renderterm>
280
+ <xref target='Clause2'/>
281
+ </concept>
282
+ <concept>
283
+ <refterm>word</refterm>
284
+ <renderterm>term</renderterm>
285
+ <xref target='Clause2'>xref</xref>
286
+ </concept>
287
+ <concept ital='false' ref='false' linkmention='false' linkref='false'>
288
+ <refterm>word</refterm>
289
+ <renderterm>term</renderterm>
290
+ <xref target='Clause2'>xref</xref>
291
+ </concept>
292
+ <concept ital='true' ref='true' linkmention='true' linkref='true'>
293
+ <refterm>word</refterm>
294
+ <renderterm>term</renderterm>
295
+ <xref target='Clause2'>xref</xref>
296
+ </concept>
297
+ </p>
298
+ </foreword>
299
+ </preface>
300
+ <sections>
301
+ <terms id='_' obligation='normative'>
302
+ <title>Terms and definitions</title>
303
+ <p id='_'>For the purposes of this document, the following terms and definitions apply.</p>
304
+ <term id='term-Clause1'>
305
+ <preferred><expression><name>Clause1</name></expression></preferred>
306
+ </term>
307
+ </terms>
308
+ <definitions id='_' obligation='normative'>
309
+ <title>Symbols and abbreviated terms</title>
310
+ <dl id='_'>
311
+ <dt id="symbol-Clause1">Clause1</dt>
312
+ <dd>
313
+ <p id='_'>A</p>
314
+ </dd>
315
+ <dt id='Clause2'>Clause 2</dt>
316
+ <dd>
317
+ <p id='_'>C</p>
318
+ </dd>
319
+ </dl>
320
+ </definitions>
321
+ </sections>
322
+ </standard-document>
323
+ OUTPUT
324
+ expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
325
+ .to be_equivalent_to xmlpp(output)
326
+ end
327
+
328
+ it "processes the concept and related macros with xrefs" do
329
+ input = <<~INPUT
330
+ #{ASCIIDOC_BLANK_HDR}
331
+ {{<<clause1>>}}
332
+ {{<<clause1>>,w\[o\]rd}}
333
+ {{<<clause1>>,term,w\[o\]rd}}
334
+ {{<<clause1>>,term,w\[o\]rd,Clause #1}}
335
+
336
+ related:supersedes[<<clause1>>,term]
337
+
338
+ [[clause1]]
339
+ == Clause
340
+ Terms are defined here
341
+ INPUT
342
+ output = <<~OUTPUT
343
+ #{BLANK_HDR}
344
+ <preface>
345
+ <foreword id='_' obligation='informative'>
346
+ <title>Foreword</title>
347
+ <p id='_'>
348
+ <concept>
349
+ <xref target='clause1'/>
350
+ </concept>
351
+ <concept>
352
+ <refterm>w[o]rd</refterm>
353
+ <renderterm>w[o]rd</renderterm>
354
+ <xref target='clause1'/>
355
+ </concept>
356
+ <concept>
357
+ <refterm>term</refterm>
358
+ <renderterm>w[o]rd</renderterm>
359
+ <xref target='clause1'/>
360
+ </concept>
361
+ <concept>
362
+ <refterm>term</refterm>
363
+ <renderterm>w[o]rd</renderterm>
364
+ <xref target='clause1'>Clause #1</xref>
365
+ </concept>
366
+ </p>
367
+ <related type='supersedes'>
368
+ <preferred>
369
+ <expression>
370
+ <name>term</name>
371
+ </expression>
372
+ </preferred>
373
+ <xref target='clause1'/>
374
+ </related>
375
+ </foreword>
376
+ </preface>
377
+ <sections>
378
+ <clause id='clause1' inline-header='false' obligation='normative'>
379
+ <title>Clause</title>
380
+ <p id='_'>Terms are defined here</p>
381
+ </clause>
382
+ </sections>
383
+ </standard-document>
384
+ OUTPUT
385
+ expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
386
+ .to be_equivalent_to xmlpp(output)
387
+ end
388
+
389
+ it "processes the concept and related macros with erefs" do
390
+ input = <<~INPUT
391
+ #{ASCIIDOC_BLANK_HDR}
392
+ {{<<blah>>}}
393
+ {{<<blah>>,word}}
394
+ {{<<blah>>,term,word}}
395
+ {{<<blah>>,term,word,Clause #1}}
396
+ {{<<blah,clause=3.1>>}}
397
+ {{<<blah,clause=3.1>>,word}}
398
+ {{<<blah,clause=3.1>>,term,word}}
399
+ {{<<blah,clause=3.1,figure=a>>}}
400
+ {{<<blah,clause=3.1,figure=a>>,word}}
401
+ {{<<blah,clause=3.1,figure=a>>,term,word,Clause #1}}
402
+
403
+ related:narrower[<<blah,clause=3.1,figure=a>>,term]
404
+
405
+ [bibliography]
406
+ == Bibliography
407
+ * [[[blah,blah]]] _Blah_
408
+ INPUT
409
+ output = <<~OUTPUT
410
+ #{BLANK_HDR}
411
+ <preface>
412
+ <foreword id='_' obligation='informative'>
413
+ <title>Foreword</title>
414
+ <p id='_'>
415
+ <concept>
416
+ <eref bibitemid='blah'/>
417
+ </concept>
418
+ <concept>
419
+ <refterm>word</refterm>
420
+ <renderterm>word</renderterm>
421
+ <eref bibitemid='blah'/>
422
+ </concept>
423
+ <concept>
424
+ <refterm>term</refterm>
425
+ <renderterm>word</renderterm>
426
+ <eref bibitemid='blah'/>
427
+ </concept>
428
+ <concept>
429
+ <refterm>term</refterm>
430
+ <renderterm>word</renderterm>
431
+ <eref bibitemid='blah'>Clause #1</eref>
432
+ </concept>
433
+ <concept>
434
+ <eref bibitemid='blah'>
435
+ <localityStack>
436
+ <locality type='clause'>
437
+ <referenceFrom>3.1</referenceFrom>
438
+ </locality>
439
+ </localityStack>
440
+ </eref>
441
+ </concept>
442
+ <concept>
443
+ <refterm>word</refterm>
444
+ <renderterm>word</renderterm>
445
+ <eref bibitemid='blah'>
446
+ <localityStack>
447
+ <locality type='clause'>
448
+ <referenceFrom>3.1</referenceFrom>
449
+ </locality>
450
+ </localityStack>
451
+ </eref>
452
+ </concept>
453
+ <concept>
454
+ <refterm>term</refterm>
455
+ <renderterm>word</renderterm>
456
+ <eref bibitemid='blah'>
457
+ <localityStack>
458
+ <locality type='clause'>
459
+ <referenceFrom>3.1</referenceFrom>
460
+ </locality>
461
+ </localityStack>
462
+ </eref>
463
+ </concept>
464
+ <concept>
465
+ <eref bibitemid='blah'>
466
+ <localityStack>
467
+ <locality type='clause'>
468
+ <referenceFrom>3.1</referenceFrom>
469
+ </locality>
470
+ <locality type='figure'>
471
+ <referenceFrom>a</referenceFrom>
472
+ </locality>
473
+ </localityStack>
474
+ </eref>
475
+ </concept>
476
+ <concept>
477
+ <refterm>word</refterm>
478
+ <renderterm>word</renderterm>
479
+ <eref bibitemid='blah'>
480
+ <localityStack>
481
+ <locality type='clause'>
482
+ <referenceFrom>3.1</referenceFrom>
483
+ </locality>
484
+ <locality type='figure'>
485
+ <referenceFrom>a</referenceFrom>
486
+ </locality>
487
+ </localityStack>
488
+ </eref>
489
+ </concept>
490
+ <concept>
491
+ <refterm>term</refterm>
492
+ <renderterm>word</renderterm>
493
+ <eref bibitemid='blah'>
494
+ <localityStack>
495
+ <locality type='clause'>
496
+ <referenceFrom>3.1</referenceFrom>
497
+ </locality>
498
+ <locality type='figure'>
499
+ <referenceFrom>a</referenceFrom>
500
+ </locality>
501
+ </localityStack>
502
+ Clause #1
503
+ </eref>
504
+ </concept>
505
+ </p>
506
+ <related type='narrower'>
507
+ <preferred>
508
+ <expression>
509
+ <name>term</name>
510
+ </expression>
511
+ </preferred>
512
+ <eref bibitemid='blah'>
513
+ <localityStack>
514
+ <locality type='clause'>
515
+ <referenceFrom>3.1</referenceFrom>
516
+ </locality>
517
+ <locality type='figure'>
518
+ <referenceFrom>a</referenceFrom>
519
+ </locality>
520
+ </localityStack>
521
+ </eref>
522
+ </related>
523
+ </foreword>
524
+ </preface>
525
+ <sections> </sections>
526
+ <bibliography>
527
+ <references id='_' normative='false' obligation='informative'>
528
+ <title>Bibliography</title>
529
+ <bibitem id='blah'>
530
+ <formattedref format='application/x-isodoc+xml'>
531
+ <em>Blah</em>
532
+ </formattedref>
533
+ <docidentifier>blah</docidentifier>
534
+ </bibitem>
535
+ </references>
536
+ </bibliography>
537
+ </standard-document>
538
+ OUTPUT
539
+ expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
540
+ .to be_equivalent_to xmlpp(output)
541
+ end
542
+
543
+ it "processes the concept and related macros with termbase" do
544
+ input = <<~INPUT
545
+ #{ASCIIDOC_BLANK_HDR}
546
+ {{<<IEV:135-13-13>>}}
547
+ {{<<IEV:135-13-13>>,word}}
548
+ {{<<IEV:135-13-13>>,term,word}}
549
+ {{<<IEV:135-13-13>>,term,word,Clause #1}}
550
+
551
+ related:see[<<IEV:135-13-13>>,term]
552
+ INPUT
553
+ output = <<~OUTPUT
554
+ #{BLANK_HDR}
555
+ <sections>
556
+ <p id='_'>
557
+ <concept>
558
+ <termref base='IEV' target='135-13-13'/>
559
+ </concept>
560
+ <concept>
561
+ <refterm>word</refterm>
562
+ <renderterm>word</renderterm>
563
+ <termref base='IEV' target='135-13-13'/>
564
+ </concept>
565
+ <concept>
566
+ <refterm>term</refterm>
567
+ <renderterm>word</renderterm>
568
+ <termref base='IEV' target='135-13-13'/>
569
+ </concept>
570
+ <concept>
571
+ <refterm>term</refterm>
572
+ <renderterm>word</renderterm>
573
+ <termref base='IEV' target='135-13-13'>Clause #1</termref>
574
+ </concept>
575
+ </p>
576
+ <related type='see'>
577
+ <preferred>
578
+ <expression>
579
+ <name>term</name>
580
+ </expression>
581
+ </preferred>
582
+ <termref base='IEV' target='135-13-13'/>
583
+ </related>
584
+ </sections>
585
+ </standard-document>
586
+ OUTPUT
587
+ expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
588
+ .to be_equivalent_to xmlpp(output)
589
+ end
590
+
591
+ it "processes the concept macros with disambiguation for math symbols" do
592
+ input = <<~INPUT
593
+ #{ASCIIDOC_BLANK_HDR}
594
+ [[clause1]]
595
+
596
+ == Symbols and Abbreviated Terms
597
+ stem:[|~ x ~|]:: A function that returns the smallest integer greater than or equal to stem:[x]; also known as the _ceiling_ function.
598
+ stem:[|__ x __|]:: A function that returns the largest integer less than or equal to stem:[x]; also known as the _floor_ function.
599
+ INPUT
600
+ output = <<~OUTPUT
601
+ #{BLANK_HDR}
602
+ <sections>
603
+ <definitions id='clause1' obligation='normative'>
604
+ <title>Symbols and abbreviated terms</title>
605
+ <dl id='_'>
606
+ <dt id='symbol-__x230a_-x-__x230b_'>
607
+ <stem type='MathML'>
608
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
609
+ <mo>&#8970;</mo>
610
+ <mi>x</mi>
611
+ <mo>&#8971;</mo>
612
+ </math>
613
+ </stem>
614
+ </dt>
615
+ <dd>
616
+ <p id='_'>
617
+ A function that returns the largest integer less than or equal to
618
+ <stem type='MathML'>
619
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
620
+ <mi>x</mi>
621
+ </math>
622
+ </stem>
623
+ ; also known as the
624
+ <em>floor</em>
625
+ function.
626
+ </p>
627
+ </dd>
628
+ <dt id='symbol-__x2308_-x-__x2309_'>
629
+ <stem type='MathML'>
630
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
631
+ <mo>&#8968;</mo>
632
+ <mi>x</mi>
633
+ <mo>&#8969;</mo>
634
+ </math>
635
+ </stem>
636
+ </dt>
637
+ <dd>
638
+ <p id='_'>
639
+ A function that returns the smallest integer greater than or equal
640
+ to
641
+ <stem type='MathML'>
642
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
643
+ <mi>x</mi>
644
+ </math>
645
+ </stem>
646
+ ; also known as the
647
+ <em>ceiling</em>
648
+ function.
649
+ </p>
650
+ </dd>
651
+ </dl>
652
+ </definitions>
653
+ </sections>
654
+ </standard-document>
655
+ OUTPUT
656
+ expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
657
+ .to be_equivalent_to xmlpp(output)
658
+ end
659
+
660
+ describe "term inline macros" do
661
+ subject(:convert) do
662
+ xmlpp(
663
+ strip_guid(
664
+ Asciidoctor.convert(
665
+ input, *OPTIONS
666
+ ),
667
+ ),
668
+ )
669
+ end
670
+ let(:input) do
671
+ <<~XML
672
+ #{ASCIIDOC_BLANK_HDR}
673
+ == Terms and Definitions
674
+
675
+ === name
676
+
677
+ == Main
678
+
679
+ term:[name,name2] is a term
680
+
681
+ {{name,name2}} is a term
682
+
683
+ related:equivalent[name]
684
+ XML
685
+ end
686
+ let(:output) do
687
+ <<~XML
688
+ #{BLANK_HDR}
689
+ <sections>
690
+ <terms id='_' obligation='normative'>
691
+ <title>Terms and definitions</title>
692
+ <p id='_'>For the purposes of this document, the following terms and definitions apply.</p>
693
+ <term id='term-name'>
694
+ <preferred><expression><name>name</name></expression></preferred>
695
+ </term>
696
+ </terms>
697
+ <clause id='_' inline-header='false' obligation='normative'>
698
+ <title>Main</title>
699
+ <p id='_'>
700
+ <concept>
701
+ <refterm>name</refterm>
702
+ <renderterm>name2</renderterm>
703
+ <xref target='term-name'/>
704
+ </concept>
705
+ is a term
706
+ </p>
707
+ <p id='_'>
708
+ <concept>
709
+ <refterm>name</refterm>
710
+ <renderterm>name2</renderterm>
711
+ <xref target='term-name'/>
712
+ </concept>
713
+ is a term
714
+ </p>
715
+ <related type='equivalent'>
716
+ <preferred>
717
+ <expression>
718
+ <name>name</name>
719
+ </expression>
720
+ </preferred>
721
+ <xref target='term-name'>name</xref>
722
+ </related>
723
+ </clause>
724
+ </sections>
725
+ </standard-document>
726
+ XML
727
+ end
728
+
729
+ it "converts macro into the correct xml" do
730
+ expect(convert).to(be_equivalent_to(xmlpp(output)))
731
+ end
732
+
733
+ context "default params" do
734
+ let(:input) do
735
+ <<~XML
736
+ #{ASCIIDOC_BLANK_HDR}
737
+
738
+ == Terms and Definitions
739
+
740
+ === name
741
+
742
+ == Main
743
+
744
+ term:[name] is a term
745
+
746
+ {{name}} is a term
747
+ XML
748
+ end
749
+ let(:output) do
750
+ <<~XML
751
+ #{BLANK_HDR}
752
+ <sections>
753
+ <terms id='_' obligation='normative'>
754
+ <title>Terms and definitions</title>
755
+ <p id='_'>For the purposes of this document, the following terms and definitions apply.</p>
756
+ <term id='term-name'>
757
+ <preferred><expression><name>name</name></expression></preferred>
758
+ </term>
759
+ </terms>
760
+ <clause id='_' inline-header='false' obligation='normative'>
761
+ <title>Main</title>
762
+ <p id='_'>
763
+ <concept>
764
+ <refterm>name</refterm>
765
+ <renderterm>name</renderterm>
766
+ <xref target='term-name'/>
767
+ </concept>
768
+ is a term
769
+ </p>
770
+ <p id='_'>
771
+ <concept>
772
+ <refterm>name</refterm>
773
+ <renderterm>name</renderterm>
774
+ <xref target='term-name'/>
775
+ </concept>
776
+ is a term
777
+ </p>
778
+ </clause>
779
+ </sections>
780
+ </standard-document>
781
+ XML
782
+ end
783
+
784
+ it "uses `name` as termref name" do
785
+ expect(convert).to(be_equivalent_to(xmlpp(output)))
786
+ end
787
+ end
788
+
789
+ context "terms with index terms" do
790
+ let(:input) do
791
+ <<~XML
792
+ #{ASCIIDOC_BLANK_HDR}
793
+
794
+ == Terms and Definitions
795
+
796
+ === name(((name)))
797
+
798
+ == Main
799
+
800
+ term:[name] is a term
801
+
802
+ {{name}} is a term
803
+ XML
804
+ end
805
+ let(:output) do
806
+ <<~XML
807
+ #{BLANK_HDR}
808
+ <sections>
809
+ <terms id='_' obligation='normative'>
810
+ <title>Terms and definitions</title>
811
+ <p id='_'>For the purposes of this document, the following terms and definitions apply.</p>
812
+ <term id='term-name'>
813
+ <preferred><expression><name>name
814
+ <index>
815
+ <primary>name</primary>
816
+ </index>
817
+ </name>
818
+ </expression></preferred>
819
+ </term>
820
+ </terms>
821
+ <clause id='_' inline-header='false' obligation='normative'>
822
+ <title>Main</title>
823
+ <p id='_'>
824
+ <concept>
825
+ <refterm>name</refterm>
826
+ <renderterm>name</renderterm>
827
+ <xref target='term-name'/>
828
+ </concept>
829
+ is a term
830
+ </p>
831
+ <p id='_'>
832
+ <concept>
833
+ <refterm>name</refterm>
834
+ <renderterm>name</renderterm>
835
+ <xref target='term-name'/>
836
+ </concept>
837
+ is a term
838
+ </p>
839
+ </clause>
840
+ </sections>
841
+ </standard-document>
842
+ XML
843
+ end
844
+
845
+ it "strips index terms in terms anchors" do
846
+ expect(convert).to(be_equivalent_to(xmlpp(output)))
847
+ end
848
+ end
849
+
850
+ context "multiply exising ids in document" do
851
+ let(:input) do
852
+ <<~XML
853
+ #{ASCIIDOC_BLANK_HDR}
854
+
855
+ == Terms and Definitions
856
+
857
+ === name
858
+ === name2
859
+
860
+ [[term-name]]
861
+ == Main
862
+
863
+ paragraph
864
+
865
+ [[term-name2]]
866
+ == Second
867
+
868
+ term:[name] is a term
869
+ term:[name2] is a term
870
+ {{name}} is a term
871
+ {{name2}} is a term
872
+ XML
873
+ end
874
+ let(:output) do
875
+ <<~XML
876
+ #{BLANK_HDR}
877
+ <sections>
878
+ <terms id='_' obligation='normative'>
879
+ <title>Terms and definitions</title>
880
+ <p id='_'>For the purposes of this document, the following terms and definitions apply.</p>
881
+ <term id='term-name-1'>
882
+ <preferred><expression><name>name</name></expression></preferred>
883
+ </term>
884
+ <term id='term-name2-1'>
885
+ <preferred><expression><name>name2</name></expression></preferred>
886
+ </term>
887
+ </terms>
888
+ <clause id='term-name' inline-header='false' obligation='normative'>
889
+ <title>Main</title>
890
+ <p id='_'>paragraph</p>
891
+ </clause>
892
+ <clause id='term-name2' inline-header='false' obligation='normative'>
893
+ <title>Second</title>
894
+ <p id='_'>
895
+ <concept>
896
+ <refterm>name</refterm>
897
+ <renderterm>name</renderterm>
898
+ <xref target='term-name-1'/>
899
+ </concept>
900
+ is a term
901
+ <concept>
902
+ <refterm>name2</refterm>
903
+ <renderterm>name2</renderterm>
904
+ <xref target='term-name2-1'/>
905
+ </concept>
906
+ is a term
907
+ <concept>
908
+ <refterm>name</refterm>
909
+ <renderterm>name</renderterm>
910
+ <xref target='term-name-1'/>
911
+ </concept>
912
+ is a term
913
+ <concept>
914
+ <refterm>name2</refterm>
915
+ <renderterm>name2</renderterm>
916
+ <xref target='term-name2-1'/>
917
+ </concept>
918
+ is a term
919
+ </p>
920
+ </clause>
921
+ </sections>
922
+ </standard-document>
923
+ XML
924
+ end
925
+
926
+ it "generates unique ids which do not match existing ids" do
927
+ expect(convert).to(be_equivalent_to(xmlpp(output)))
928
+ end
929
+ end
930
+
931
+ context "when missing actual ref" do
932
+ let(:input) do
933
+ <<~XML
934
+ #{ASCIIDOC_BLANK_HDR}
935
+
936
+ == Terms and Definitions
937
+
938
+ === name identity
939
+
940
+ [[name-check]]
941
+ === name check
942
+
943
+ paragraph
944
+
945
+ term:[name check] is a term
946
+
947
+ term:[name identity] is a term
948
+
949
+ Moreover, term:[missing] is a term
950
+
951
+
952
+ {{name check}} is a term
953
+
954
+ {{name identity}} is a term
955
+
956
+ Moreover, {{missing}} is a term
957
+
958
+ related:equivalent[missing]
959
+ XML
960
+ end
961
+ let(:output) do
962
+ <<~XML
963
+ #{BLANK_HDR}
964
+ <sections>
965
+ <terms id='_' obligation='normative'>
966
+ <title>Terms and definitions</title>
967
+ <p id='_'>For the purposes of this document, the following terms and definitions apply.</p>
968
+ <term id='term-name-identity'>
969
+ <preferred><expression><name>name identity</name></expression></preferred>
970
+ </term>
971
+ <term id='name-check'>
972
+ <preferred><expression><name>name check</name></expression></preferred>
973
+ <related type='equivalent'>
974
+ <strong>
975
+ term
976
+ <tt>missing</tt>
977
+ not resolved via ID
978
+ <tt>missing</tt>
979
+ </strong>
980
+ </related>
981
+ <definition><verbal-definition>
982
+ <p id='_'>paragraph</p>
983
+ <p id='_'>
984
+ <concept>
985
+ <refterm>name check</refterm>
986
+ <renderterm>name check</renderterm>
987
+ <xref target='name-check'/>
988
+ </concept>
989
+ is a term
990
+ </p>
991
+ <p id='_'>
992
+ <concept>
993
+ <refterm>name identity</refterm>
994
+ <renderterm>name identity</renderterm>
995
+ <xref target='term-name-identity'/>
996
+ </concept>
997
+ is a term
998
+ </p>
999
+ <p id='_'>
1000
+ Moreover,
1001
+ <concept>
1002
+ <strong>
1003
+ term
1004
+ <tt>missing</tt>
1005
+ not resolved via ID
1006
+ <tt>missing</tt>
1007
+ </strong>
1008
+ </concept>
1009
+ is a term
1010
+ </p>
1011
+ <p id='_'>
1012
+ <concept>
1013
+ <refterm>name check</refterm>
1014
+ <renderterm>name check</renderterm>
1015
+ <xref target='name-check'/>
1016
+ </concept>
1017
+ is a term
1018
+ </p>
1019
+ <p id='_'>
1020
+ <concept>
1021
+ <refterm>name identity</refterm>
1022
+ <renderterm>name identity</renderterm>
1023
+ <xref target='term-name-identity'/>
1024
+ </concept>
1025
+ is a term
1026
+ </p>
1027
+ <p id='_'>
1028
+ Moreover,
1029
+ <concept>
1030
+ <strong>
1031
+ term
1032
+ <tt>missing</tt>
1033
+ not resolved via ID
1034
+ <tt>missing</tt>
1035
+ </strong>
1036
+ </concept>
1037
+ is a term
1038
+ </p>
1039
+ </verbal-definition></definition>
1040
+ </term>
1041
+ </terms>
1042
+ </sections>
1043
+ </standard-document>
1044
+ XML
1045
+ end
1046
+
1047
+ it "generates unique ids which do not match existing ids" do
1048
+ expect(convert).to(be_equivalent_to(xmlpp(output)))
1049
+ end
1050
+ end
1051
+ end
1052
+ end