metanorma-standoc 1.6.1 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +66 -0
  3. data/README.adoc +1 -3
  4. data/lib/asciidoctor/standoc/base.rb +8 -16
  5. data/lib/asciidoctor/standoc/basicdoc.rng +50 -3
  6. data/lib/asciidoctor/standoc/cleanup.rb +52 -4
  7. data/lib/asciidoctor/standoc/cleanup_block.rb +41 -4
  8. data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +47 -20
  9. data/lib/asciidoctor/standoc/cleanup_footnotes.rb +14 -0
  10. data/lib/asciidoctor/standoc/cleanup_inline.rb +9 -3
  11. data/lib/asciidoctor/standoc/cleanup_ref.rb +17 -24
  12. data/lib/asciidoctor/standoc/cleanup_terms.rb +4 -6
  13. data/lib/asciidoctor/standoc/converter.rb +71 -1
  14. data/lib/asciidoctor/standoc/front.rb +6 -0
  15. data/lib/asciidoctor/standoc/front_contributor.rb +8 -4
  16. data/lib/asciidoctor/standoc/inline.rb +6 -5
  17. data/lib/asciidoctor/standoc/isodoc.rng +36 -43
  18. data/lib/asciidoctor/standoc/lists.rb +4 -2
  19. data/lib/asciidoctor/standoc/macros.rb +55 -59
  20. data/lib/asciidoctor/standoc/macros_terms.rb +82 -0
  21. data/lib/asciidoctor/standoc/ref.rb +19 -25
  22. data/lib/asciidoctor/standoc/ref_sect.rb +4 -3
  23. data/lib/asciidoctor/standoc/section.rb +21 -20
  24. data/lib/asciidoctor/standoc/table.rb +12 -0
  25. data/lib/asciidoctor/standoc/term_lookup_cleanup.rb +86 -0
  26. data/lib/asciidoctor/standoc/utils.rb +2 -0
  27. data/lib/metanorma/standoc/version.rb +1 -1
  28. data/metanorma-standoc.gemspec +5 -3
  29. data/spec/asciidoctor-standoc/base_spec.rb +14 -4
  30. data/spec/asciidoctor-standoc/blocks_spec.rb +14 -9
  31. data/spec/asciidoctor-standoc/cleanup_sections_spec.rb +1519 -0
  32. data/spec/asciidoctor-standoc/cleanup_spec.rb +416 -1554
  33. data/spec/asciidoctor-standoc/converter_spec.rb +8 -0
  34. data/spec/asciidoctor-standoc/inline_spec.rb +2 -5
  35. data/spec/asciidoctor-standoc/isobib_cache_spec.rb +16 -9
  36. data/spec/asciidoctor-standoc/lists_spec.rb +10 -1
  37. data/spec/asciidoctor-standoc/macros_lutaml_spec.rb +80 -0
  38. data/spec/asciidoctor-standoc/macros_plantuml_spec.rb +307 -0
  39. data/spec/asciidoctor-standoc/macros_spec.rb +408 -169
  40. data/spec/asciidoctor-standoc/refs_dl_spec.rb +6 -6
  41. data/spec/asciidoctor-standoc/refs_spec.rb +112 -65
  42. data/spec/asciidoctor-standoc/section_spec.rb +17 -12
  43. data/spec/asciidoctor-standoc/table_spec.rb +86 -0
  44. data/spec/asciidoctor-standoc/validate_spec.rb +26 -0
  45. data/spec/fixtures/diagram_definitions.lutaml +22 -0
  46. data/spec/fixtures/test.exp +121 -0
  47. data/spec/spec_helper.rb +33 -0
  48. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +59 -243
  49. data/spec/vcr_cassettes/isobib_get_123.yml +12 -12
  50. data/spec/vcr_cassettes/isobib_get_123_1.yml +27 -119
  51. data/spec/vcr_cassettes/isobib_get_123_1_fr.yml +35 -35
  52. data/spec/vcr_cassettes/isobib_get_123_2001.yml +14 -60
  53. data/spec/vcr_cassettes/isobib_get_124.yml +11 -57
  54. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +8 -8
  55. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +281 -157
  56. metadata +45 -11
  57. data/.github/workflows/macos.yml +0 -41
  58. data/.github/workflows/ubuntu.yml +0 -45
  59. data/.github/workflows/windows.yml +0 -43
@@ -44,6 +44,109 @@ RSpec.describe Asciidoctor::Standoc do
44
44
  OUTPUT
45
45
  end
46
46
 
47
+ it "processes the Asciidoctor::Standoc index macros" do
48
+ expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
49
+ #{ASCIIDOC_BLANK_HDR}
50
+ index:also[]
51
+ index:see[A]
52
+ index:also[B,C~x~]
53
+ index:see[D,_E_,F]
54
+ index:also[G,H,I,J]
55
+ index:see[K,L,M,N,O]
56
+ index-range:id2[P]
57
+ index-range:id3[((_P_))]
58
+ index-range:id3[(((Q, R, S)))]
59
+
60
+ Text [[id2]]
61
+
62
+ Text [[id3]]
63
+ INPUT
64
+ #{BLANK_HDR}
65
+ <sections>
66
+ <p id='_'>
67
+ <index-xref also='true'>
68
+ <primary>B</primary>
69
+ <target>
70
+ C
71
+ <sub>x</sub>
72
+ </target>
73
+ </index-xref>
74
+ <index-xref also='false'>
75
+ <primary>D</primary>
76
+ <secondary>
77
+ <em>E</em>
78
+ </secondary>
79
+ <target>F</target>
80
+ </index-xref>
81
+ <index-xref also='true'>
82
+ <primary>G</primary>
83
+ <secondary>H</secondary>
84
+ <tertiary>I</tertiary>
85
+ <target>J</target>
86
+ </index-xref>
87
+ P
88
+ <index to="id2">
89
+ <primary>P</primary>
90
+ </index>
91
+ <em>P</em>
92
+ <index to="id3">
93
+ <primary>
94
+ <em>P</em>
95
+ </primary>
96
+ </index>
97
+ <index to="id3">
98
+ <primary>Q</primary>
99
+ <secondary>R</secondary>
100
+ <tertiary>S</tertiary>
101
+ </index>
102
+ </p>
103
+ <p id='_'>
104
+ Text
105
+ <bookmark id='id2'/>
106
+ </p>
107
+ <p id='_'>
108
+ Text
109
+ <bookmark id='id3'/>
110
+ </p>
111
+ </sections>
112
+ </standard-document>
113
+ OUTPUT
114
+ end
115
+
116
+ it "processes the Asciidoctor::Standoc variant macros" do
117
+ expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
118
+ #{ASCIIDOC_BLANK_HDR}
119
+ == lang:en[English] lang:fr-Latn[Français]
120
+
121
+ this lang:en[English] lang:fr-Latn[Français] section is lang:en[silly] lang:fr[fou]
122
+
123
+ INPUT
124
+ #{BLANK_HDR}
125
+ <sections>
126
+ <clause id='_' inline-header='false' obligation='normative'>
127
+ <title>
128
+ <variant lang='en'>English</variant>
129
+ <variant lang='fr' script='Latn'>Français</variant>
130
+ </title>
131
+ <p id='_'>
132
+ this
133
+ <variant>
134
+ <variant lang='en'>English</variant>
135
+ <variant lang='fr' script='Latn'>Français</variant>
136
+ </variant>
137
+ section is
138
+ <variant>
139
+ <variant lang='en'>silly</variant>
140
+ <variant lang='fr'>fou</variant>
141
+ </variant>
142
+ </p>
143
+ </clause>
144
+ </sections>
145
+ </standard-document>
146
+ OUTPUT
147
+ end
148
+
149
+
47
150
  it "processes the Asciidoctor::Standoc concept macros" do
48
151
  expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
49
152
  #{ASCIIDOC_BLANK_HDR}
@@ -295,13 +398,11 @@ OUTPUT
295
398
  <formula id='_'>
296
399
  <stem type='MathML'>
297
400
  <math xmlns='http://www.w3.org/1998/Math/MathML'>
298
- <mover>
401
+ <mover accent="true">
299
402
  <mrow>
300
403
  <mi>X</mi>
301
404
  </mrow>
302
- <mrow>
303
405
  <mo>¯</mo>
304
- </mrow>
305
406
  </mover>
306
407
  <mo>′</mo>
307
408
  <mo>=</mo>
@@ -361,198 +462,336 @@ OUTPUT
361
462
  OUTPUT
362
463
  end
363
464
 
364
- it "processes the PlantUML macro" do
365
- expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)).gsub(%r{plantuml/plantuml[^./]+\.}, "plantuml/_."))).to be_equivalent_to xmlpp(<<~"OUTPUT")
465
+ it "processes the footnoteblock macro" do
466
+ expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
366
467
  #{ASCIIDOC_BLANK_HDR}
367
468
 
368
- [plantuml]
369
- ....
370
- @startuml
371
- Alice -> Bob: Authentication Request
372
- Bob --> Alice: Authentication Response
373
-
374
- Alice -> Bob: Another authentication Request
375
- Alice <-- Bob: another authentication Response
376
- @enduml
377
- ....
378
-
379
- [plantuml]
380
- ....
381
- Alice -> Bob: Authentication Request
382
- Bob --> Alice: Authentication Response
383
-
384
- Alice -> Bob: Another authentication Request
385
- Alice <-- Bob: another authentication Response
386
- ....
387
-
388
- [plantuml]
389
- ....
390
- @startuml filename
391
- Alice -> Bob: Authentication Request
392
- Bob --> Alice: Authentication Response
393
-
394
- Alice -> Bob: Another authentication Request
395
- Alice <-- Bob: another authentication Response
396
- @enduml
397
- ....
398
- INPUT
399
- #{BLANK_HDR}
400
- <sections><figure id="_">
401
- <image src="plantuml/_.png" id="_" mimetype="image/png" height="auto" width="auto"/>
402
- </figure>
403
- <figure id="_">
404
- <image src="plantuml/_.png" id="_" mimetype="image/png" height="auto" width="auto"/>
405
- </figure>
406
- <figure id="_">
407
- <image src="plantuml/filename.png" id="_" mimetype="image/png" height="auto" width="auto"/>
408
- </figure>
409
- </sections>
469
+ footnoteblock:[id1]
470
+
471
+ [[id1]]
472
+ [NOTE]
473
+ --
474
+ |===
475
+ |a |b
410
476
 
477
+ |c |d
478
+ |===
479
+
480
+ * A
481
+ * B
482
+ * C
483
+ --
484
+ INPUT
485
+ #{BLANK_HDR}
486
+ <sections>
487
+ <p id="_">
488
+ <fn reference='1'>
489
+ <table id='_'>
490
+ <thead>
491
+ <tr>
492
+ <th valign='top' align='left'>a</th>
493
+ <th valign='top' align='left'>b</th>
494
+ </tr>
495
+ </thead>
496
+ <tbody>
497
+ <tr>
498
+ <td valign='top' align='left'>c</td>
499
+ <td valign='top' align='left'>d</td>
500
+ </tr>
501
+ </tbody>
502
+ </table>
503
+ <ul id='_'>
504
+ <li>
505
+ <p id='_'>A</p>
506
+ </li>
507
+ <li>
508
+ <p id='_'>B</p>
509
+ </li>
510
+ <li>
511
+ <p id='_'>C</p>
512
+ </li>
513
+ </ul>
514
+ </fn>
515
+ </p>
516
+ </sections>
411
517
  </standard-document>
412
518
  OUTPUT
413
519
  end
414
520
 
415
- it "processes the PlantUML macro with imagesdir" do
416
- expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)).gsub(%r{spec/assets/[^./]+\.}, "spec/assets/_."))).to be_equivalent_to xmlpp(<<~"OUTPUT")
417
- = Document title
418
- Author
419
- :docfile: test.adoc
420
- :nodoc:
421
- :novalid:
422
- :no-isobib:
423
- :imagesdir: spec/assets
424
-
425
- [plantuml]
426
- ....
427
- @startuml
428
- Alice -> Bob: Authentication Request
429
- Bob --> Alice: Authentication Response
430
-
431
- Alice -> Bob: Another authentication Request
432
- Alice <-- Bob: another authentication Response
433
- @enduml
434
- ....
435
- INPUT
436
- #{BLANK_HDR}
437
- <sections>
438
- <figure id="_">
439
- <image src="spec/assets/_.png" id="_" mimetype="image/png" height="auto" width="auto"/>
440
- </figure>
441
- </sections>
442
- </standard-document>
443
- OUTPUT
444
- end
445
-
446
- it "processes the PlantUML macro with PlantUML disabled" do
447
- mock_plantuml_disabled
448
- expect { Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true) }.to output(%r{PlantUML not installed}).to_stderr
521
+ it "processes the footnoteblock macro with failed reference" do
522
+ expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
449
523
  #{ASCIIDOC_BLANK_HDR}
450
524
 
451
- [plantuml]
452
- ....
453
- @startuml
454
- Alice -> Bob: Authentication Request
455
- Bob --> Alice: Authentication Response
456
-
457
- Alice -> Bob: Another authentication Request
458
- Alice <-- Bob: another authentication Response
459
- @enduml
460
- ....
461
- INPUT
525
+ footnoteblock:[id1]
462
526
 
463
- mock_plantuml_disabled
464
- expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
465
- #{ASCIIDOC_BLANK_HDR}
527
+ [[id2]]
528
+ [NOTE]
529
+ --
530
+ |===
531
+ |a |b
466
532
 
467
- [plantuml]
468
- ....
469
- @startuml
470
- Alice -> Bob: Authentication Request
471
- Bob --> Alice: Authentication Response
533
+ |c |d
534
+ |===
472
535
 
473
- Alice -> Bob: Another authentication Request
474
- Alice <-- Bob: another authentication Response
475
- @enduml
476
- ....
536
+ * A
537
+ * B
538
+ * C
539
+ --
477
540
  INPUT
478
- #{BLANK_HDR}
479
- <sections>
480
- <sourcecode id="_" lang="plantuml">@startuml
481
- Alice -&gt; Bob: Authentication Request
482
- Bob --&gt; Alice: Authentication Response
483
-
484
- Alice -&gt; Bob: Another authentication Request
485
- Alice &lt;-- Bob: another authentication Response
486
- @enduml</sourcecode>
487
- </sections>
541
+ #{BLANK_HDR}
542
+ <sections>
543
+ <p id='_'>
544
+ <fn reference='1'>[ERROR]</fn>
545
+ </p>
546
+ <note id='id2'>
547
+ <table id='_'>
548
+ <thead>
549
+ <tr>
550
+ <th valign='top' align='left'>a</th>
551
+ <th valign='top' align='left'>b</th>
552
+ </tr>
553
+ </thead>
554
+ <tbody>
555
+ <tr>
556
+ <td valign='top' align='left'>c</td>
557
+ <td valign='top' align='left'>d</td>
558
+ </tr>
559
+ </tbody>
560
+ </table>
561
+ <ul id='_'>
562
+ <li>
563
+ <p id='_'>A</p>
564
+ </li>
565
+ <li>
566
+ <p id='_'>B</p>
567
+ </li>
568
+ <li>
569
+ <p id='_'>C</p>
570
+ </li>
571
+ </ul>
572
+ </note>
573
+ </sections>
488
574
  </standard-document>
489
575
  OUTPUT
490
576
  end
491
577
 
492
- it "processes the PlantUML macro with localdir unwritable" do
493
- mock_localdir_unwritable
494
- expect { Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true) }.to output(%r{not writable for PlantUML}).to_stderr
495
- #{ASCIIDOC_BLANK_HDR}
578
+ describe 'term inline macros' do
579
+ subject(:convert) do
580
+ xmlpp(
581
+ strip_guid(
582
+ Asciidoctor.convert(
583
+ input, backend: :standoc, header_footer: true)))
584
+ end
585
+ let(:input) do
586
+ <<~XML
587
+ #{ASCIIDOC_BLANK_HDR}
588
+ == Terms and Definitions
496
589
 
497
- [plantuml]
498
- ....
499
- @startuml
500
- Alice -> Bob: Authentication Request
501
- Bob --> Alice: Authentication Response
590
+ === name2
502
591
 
503
- Alice -> Bob: Another authentication Request
504
- Alice <-- Bob: another authentication Response
505
- @enduml
506
- ....
507
- INPUT
592
+ == Main
508
593
 
509
- mock_localdir_unwritable
510
- expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
511
- #{ASCIIDOC_BLANK_HDR}
594
+ term:[name,name2] is a term
595
+ XML
596
+ end
597
+ let(:output) do
598
+ <<~XML
599
+ #{BLANK_HDR}
600
+ <sections>
601
+ <terms id='_' obligation='normative'>
602
+ <title>Terms and definitions</title>
603
+ <p id='_'>For the purposes of this document, the following terms and definitions apply.</p>
604
+ <term id='term-name2'>
605
+ <preferred>name2</preferred>
606
+ </term>
607
+ </terms>
608
+ <clause id='_' inline-header='false' obligation='normative'>
609
+ <title>Main</title>
610
+ <p id='_'>
611
+ <em>name</em>
612
+ (
613
+ <xref target='term-name2'/>
614
+ ) is a term
615
+ </p>
616
+ </clause>
617
+ </sections>
618
+ </standard-document>
619
+ XML
620
+ end
512
621
 
513
- [plantuml]
514
- ....
515
- @startuml
516
- Alice -> Bob: Authentication Request
517
- Bob --> Alice: Authentication Response
622
+ it 'converts macro into the correct xml' do
623
+ expect(convert).to(be_equivalent_to(xmlpp(output)))
624
+ end
518
625
 
519
- Alice -> Bob: Another authentication Request
520
- Alice <-- Bob: another authentication Response
521
- @enduml
522
- ....
523
- INPUT
524
- #{BLANK_HDR}
525
- <sections>
526
- <sourcecode id="_" lang="plantuml">@startuml
527
- Alice -&gt; Bob: Authentication Request
528
- Bob --&gt; Alice: Authentication Response
529
-
530
- Alice -&gt; Bob: Another authentication Request
531
- Alice &lt;-- Bob: another authentication Response
532
- @enduml</sourcecode>
533
- </sections>
534
- </standard-document>
535
- OUTPUT
536
- end
626
+ context 'default params' do
627
+ let(:input) do
628
+ <<~XML
629
+ #{ASCIIDOC_BLANK_HDR}
630
+
631
+ == Terms and Definitions
632
+
633
+ === name
537
634
 
538
- private
635
+ == Main
539
636
 
540
- def mock_plantuml_disabled
541
- expect(Asciidoctor::Standoc::PlantUMLBlockMacroBackend).to receive(:plantuml_installed?) do
542
- raise "PlantUML not installed"
543
- false
637
+ term:[name] is a term
638
+ XML
639
+ end
640
+ let(:output) do
641
+ <<~XML
642
+ #{BLANK_HDR}
643
+ <sections>
644
+ <terms id='_' obligation='normative'>
645
+ <title>Terms and definitions</title>
646
+ <p id='_'>For the purposes of this document, the following terms and definitions apply.</p>
647
+ <term id='term-name'>
648
+ <preferred>name</preferred>
649
+ </term>
650
+ </terms>
651
+ <clause id='_' inline-header='false' obligation='normative'>
652
+ <title>Main</title>
653
+ <p id='_'>
654
+ <em>name</em>
655
+ (
656
+ <xref target='term-name' />
657
+ ) is a term
658
+ </p>
659
+ </clause>
660
+ </sections>
661
+ </standard-document>
662
+ XML
663
+ end
664
+
665
+ it 'uses `name` as termref name' do
666
+ expect(convert).to(be_equivalent_to(xmlpp(output)))
667
+ end
544
668
  end
545
- end
546
669
 
547
- def mock_localdir_unwritable
548
- expect(Asciidoctor::Standoc::Utils).to receive(:localdir) do
549
- "/"
550
- end.exactly(2).times
551
- end
670
+ context 'multiply exising ids in document' do
671
+ let(:input) do
672
+ <<~XML
673
+ #{ASCIIDOC_BLANK_HDR}
674
+
675
+ == Terms and Definitions
676
+
677
+ === name
678
+ === name2
679
+
680
+ [[term-name]]
681
+ == Main
552
682
 
553
- def mock_localdir_unwritable
554
- expect(File).to receive(:writable?) do
555
- false
683
+ paragraph
684
+
685
+ [[term-name2]]
686
+ == Second
687
+
688
+ term:[name] is a term
689
+ term:[name2] is a term
690
+ XML
691
+ end
692
+ let(:output) do
693
+ <<~XML
694
+ #{BLANK_HDR}
695
+ <sections>
696
+ <terms id='_' obligation='normative'>
697
+ <title>Terms and definitions</title>
698
+ <p id='_'>For the purposes of this document, the following terms and definitions apply.</p>
699
+ <term id='term-name-1'>
700
+ <preferred>name</preferred>
701
+ </term>
702
+ <term id='term-name2-1'>
703
+ <preferred>name2</preferred>
704
+ </term>
705
+ </terms>
706
+ <clause id='term-name' inline-header='false' obligation='normative'>
707
+ <title>Main</title>
708
+ <p id='_'>paragraph</p>
709
+ </clause>
710
+ <clause id='term-name2' inline-header='false' obligation='normative'>
711
+ <title>Second</title>
712
+ <p id='_'>
713
+ <em>name</em>
714
+ (
715
+ <xref target='term-name-1' />
716
+ ) is a term
717
+ <em>name2</em>
718
+ (
719
+ <xref target='term-name2-1' />
720
+ ) is a term
721
+ </p>
722
+ </clause>
723
+ </sections>
724
+ </standard-document>
725
+ XML
726
+ end
727
+
728
+ it 'generates unique ids which do not match existing ids' do
729
+ expect(convert).to(be_equivalent_to(xmlpp(output)))
730
+ end
556
731
  end
557
- end
732
+
733
+ context 'when missing actual ref' do
734
+ let(:input) do
735
+ <<~XML
736
+ #{ASCIIDOC_BLANK_HDR}
737
+
738
+ == Terms and Definitions
739
+
740
+ === name identity
741
+
742
+ [[name-check]]
743
+ === name check
744
+
745
+ paragraph
746
+
747
+ term:[name check] is a term
748
+
749
+ term:[name identity] is a term
750
+
751
+ Moreover, term:[missing] is a term
752
+ XML
753
+ end
754
+ let(:output) do
755
+ <<~XML
756
+ #{BLANK_HDR}
757
+ <sections>
758
+ <terms id='_' obligation='normative'>
759
+ <title>Terms and definitions</title>
760
+ <p id='_'>For the purposes of this document, the following terms and definitions apply.</p>
761
+ <term id='term-name-identity'>
762
+ <preferred>name identity</preferred>
763
+ </term>
764
+ <term id='name-check'>
765
+ <preferred>name check</preferred>
766
+ <definition>
767
+ <p id='_'>paragraph</p>
768
+ <p id='_'>
769
+ <em>name check</em>
770
+ (
771
+ <xref target='name-check'/>
772
+ ) is a term
773
+ </p>
774
+ <p id='_'>
775
+ <em>name identity</em>
776
+ (
777
+ <xref target='term-name-identity'/>
778
+ ) is a term
779
+ </p>
780
+ <p id="_">Moreover, (<strong>term “missing” not resolved</strong>) is a term
781
+ </p>
782
+ </definition>
783
+ </term>
784
+ </terms>
785
+ </sections>
786
+ </standard-document>
787
+ XML
788
+ end
789
+
790
+ it 'generates unique ids which do not match existing ids' do
791
+ expect(convert).to(be_equivalent_to(xmlpp(output)))
792
+ end
793
+ end
794
+
795
+ end
796
+
558
797
  end