metanorma-iso 1.4.3 → 1.5.4

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ubuntu.yml +1 -1
  3. data/lib/asciidoctor/iso/base.rb +9 -20
  4. data/lib/asciidoctor/iso/cleanup.rb +2 -3
  5. data/lib/asciidoctor/iso/front.rb +6 -7
  6. data/lib/asciidoctor/iso/front_id.rb +6 -6
  7. data/lib/asciidoctor/iso/isodoc.rng +16 -7
  8. data/lib/asciidoctor/iso/section.rb +5 -11
  9. data/lib/asciidoctor/iso/term_lookup_cleanup.rb +0 -1
  10. data/lib/asciidoctor/iso/validate_section.rb +40 -44
  11. data/lib/isodoc/iso/base_convert.rb +3 -64
  12. data/lib/isodoc/iso/html/wordstyle.css +10 -9
  13. data/lib/isodoc/iso/html/wordstyle.scss +15 -9
  14. data/lib/isodoc/iso/html_convert.rb +2 -1
  15. data/lib/{asciidoctor → isodoc}/iso/i18n-en.yaml +0 -1
  16. data/lib/{asciidoctor → isodoc}/iso/i18n-fr.yaml +0 -0
  17. data/lib/{asciidoctor → isodoc}/iso/i18n-zh-Hans.yaml +0 -0
  18. data/lib/isodoc/iso/i18n.rb +19 -0
  19. data/lib/isodoc/iso/init.rb +33 -0
  20. data/lib/isodoc/iso/iso.amendment.xsl +1403 -1719
  21. data/lib/isodoc/iso/iso.international-standard.xsl +1403 -1719
  22. data/lib/isodoc/iso/metadata.rb +1 -1
  23. data/lib/isodoc/iso/presentation_xml_convert.rb +99 -1
  24. data/lib/isodoc/iso/sections.rb +3 -8
  25. data/lib/isodoc/iso/word_convert.rb +19 -14
  26. data/lib/isodoc/iso/xref.rb +2 -0
  27. data/lib/metanorma/iso/version.rb +1 -1
  28. data/metanorma-iso.gemspec +2 -2
  29. data/spec/asciidoctor-iso/base_spec.rb +3 -11
  30. data/spec/asciidoctor-iso/cleanup_spec.rb +31 -7
  31. data/spec/asciidoctor-iso/inline_spec.rb +8 -2
  32. data/spec/asciidoctor-iso/refs_spec.rb +3 -3
  33. data/spec/asciidoctor-iso/section_spec.rb +9 -6
  34. data/spec/asciidoctor-iso/table_spec.rb +7 -1
  35. data/spec/asciidoctor-iso/validate_spec.rb +100 -21
  36. data/spec/isodoc/amd_spec.rb +309 -153
  37. data/spec/isodoc/blocks_spec.rb +362 -28
  38. data/spec/isodoc/i18n_spec.rb +468 -108
  39. data/spec/isodoc/inline_spec.rb +99 -31
  40. data/spec/isodoc/iso_spec.rb +95 -29
  41. data/spec/isodoc/postproc_spec.rb +190 -150
  42. data/spec/isodoc/ref_spec.rb +175 -3
  43. data/spec/isodoc/section_spec.rb +148 -82
  44. data/spec/isodoc/table_spec.rb +142 -5
  45. data/spec/isodoc/terms_spec.rb +78 -53
  46. data/spec/isodoc/xref_spec.rb +831 -658
  47. data/spec/metanorma/processor_spec.rb +2 -1
  48. metadata +11 -9
@@ -150,7 +150,13 @@ RSpec.describe Asciidoctor::ISO do
150
150
  <tr>
151
151
  <th rowspan="2" align="left">Defect</th>
152
152
  <th colspan="4" align="center">Maximum permissible mass fraction of defects in husked rice<br/>
153
- <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>w</mi><mo>max</mo></msub></math></stem></th>
153
+ <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mrow>
154
+ <mi>w</mi>
155
+ </mrow>
156
+ <mrow>
157
+ <mo>max</mo>
158
+ </mrow>
159
+ </msub></math></stem></th>
154
160
  </tr>
155
161
  <tr>
156
162
  <th align="left">in husked rice</th>
@@ -3,6 +3,93 @@ require "fileutils"
3
3
 
4
4
  RSpec.describe Asciidoctor::ISO do
5
5
 
6
+ it "Warns of missing scope" do
7
+ FileUtils.rm_f "test.err"
8
+ Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)
9
+ = Document title
10
+ Author
11
+ :docfile: test.adoc
12
+ :nodoc:
13
+ :no-isobib:
14
+ :doctype: pizza
15
+
16
+ text
17
+ INPUT
18
+ expect(File.read("test.err")).to include "Scope clause missing"
19
+ FileUtils.rm_f "test.err"
20
+ Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)
21
+ = Document title
22
+ Author
23
+ :docfile: test.adoc
24
+ :nodoc:
25
+ :no-isobib:
26
+ :doctype: pizza
27
+
28
+ == Scope
29
+ INPUT
30
+ expect(File.read("test.err")).not_to include "Scope clause missing"
31
+
32
+ end
33
+
34
+ it "Warns of missing normative references" do
35
+ FileUtils.rm_f "test.err"
36
+ Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)
37
+ = Document title
38
+ Author
39
+ :docfile: test.adoc
40
+ :nodoc:
41
+ :no-isobib:
42
+ :doctype: pizza
43
+
44
+ text
45
+ INPUT
46
+ expect(File.read("test.err")).to include "Normative references missing"
47
+ FileUtils.rm_f "test.err"
48
+ Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)
49
+ = Document title
50
+ Author
51
+ :docfile: test.adoc
52
+ :nodoc:
53
+ :no-isobib:
54
+ :doctype: pizza
55
+
56
+ [bibliography]
57
+ == Normative references
58
+ INPUT
59
+ expect(File.read("test.err")).not_to include "Normative references missing"
60
+
61
+ end
62
+
63
+ it "Warns of missing terms & definitions" do
64
+ FileUtils.rm_f "test.err"
65
+ Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)
66
+ = Document title
67
+ Author
68
+ :docfile: test.adoc
69
+ :nodoc:
70
+ :no-isobib:
71
+ :doctype: pizza
72
+
73
+ text
74
+ INPUT
75
+ expect(File.read("test.err")).to include "Terms & definitions missing"
76
+ FileUtils.rm_f "test.err"
77
+ Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)
78
+ = Document title
79
+ Author
80
+ :docfile: test.adoc
81
+ :nodoc:
82
+ :no-isobib:
83
+ :doctype: pizza
84
+
85
+ == Terms and definitions
86
+ === Term 1
87
+ INPUT
88
+ expect(File.read("test.err")).not_to include "Terms & definitions missing"
89
+
90
+ end
91
+
92
+
6
93
  it "Warns of illegal doctype" do
7
94
  FileUtils.rm_f "test.err"
8
95
  Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)
@@ -527,7 +614,7 @@ it "Style warning if Symbols and Abbreviated Terms contains extraneous matter" d
527
614
  expect(File.read("test.err")).to include "Symbols and Abbreviated Terms can only contain a definition list"
528
615
  end
529
616
 
530
- it "Warning if do not start with scope or introduction" do
617
+ it "Warning if missing foreword" do
531
618
  FileUtils.rm_f "test.err"
532
619
  Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)
533
620
  #{VALIDATING_BLANK_HDR}
@@ -536,19 +623,15 @@ it "Warning if do not start with scope or introduction" do
536
623
 
537
624
  Paragraph
538
625
  INPUT
539
- expect(File.read("test.err")).to include "Prefatory material must be followed by (clause) Scope"
626
+ expect(File.read("test.err")).to include "Initial section must be (content) Foreword"
540
627
  end
541
628
 
542
- it "Warning if introduction not followed by scope" do
629
+ it "Warning if do not start with scope or introduction" do
543
630
  FileUtils.rm_f "test.err"
544
631
  Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)
545
632
  #{VALIDATING_BLANK_HDR}
546
-
547
- .Foreword
548
633
  Foreword
549
634
 
550
- == Introduction
551
-
552
635
  == Symbols and Abbreviated Terms
553
636
 
554
637
  Paragraph
@@ -556,7 +639,7 @@ it "Warning if introduction not followed by scope" do
556
639
  expect(File.read("test.err")).to include "Prefatory material must be followed by (clause) Scope"
557
640
  end
558
641
 
559
- it "Warning if normative references not followed by terms and definitions" do
642
+ it "Warning if introduction not followed by scope" do
560
643
  FileUtils.rm_f "test.err"
561
644
  Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)
562
645
  #{VALIDATING_BLANK_HDR}
@@ -564,19 +647,16 @@ it "Warning if normative references not followed by terms and definitions" do
564
647
  .Foreword
565
648
  Foreword
566
649
 
567
- == Scope
568
-
569
- [bibliography]
570
- == Normative References
650
+ == Introduction
571
651
 
572
652
  == Symbols and Abbreviated Terms
573
653
 
574
654
  Paragraph
575
655
  INPUT
576
- expect(File.read("test.err")).to include "Normative References must be followed by Terms and Definitions"
656
+ expect(File.read("test.err")).to include "Prefatory material must be followed by (clause) Scope"
577
657
  end
578
658
 
579
- it "Warning if there are no clauses in the document" do
659
+ it "Warning if normative references not followed by terms and definitions" do
580
660
  FileUtils.rm_f "test.err"
581
661
  Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)
582
662
  #{VALIDATING_BLANK_HDR}
@@ -589,20 +669,19 @@ it "Warning if there are no clauses in the document" do
589
669
  [bibliography]
590
670
  == Normative References
591
671
 
592
- == Terms and Definitions
593
-
594
672
  == Symbols and Abbreviated Terms
595
673
 
674
+ Paragraph
596
675
  INPUT
597
- expect(File.read("test.err")).to include "Document must contain clause after Terms and Definitions"
676
+ expect(File.read("test.err")).to include "Normative References must be followed by Terms and Definitions"
598
677
  end
599
678
 
600
- it "Warning if scope occurs after Terms and Definitions" do
679
+ it "Warning if there are no clauses in the document" do
601
680
  FileUtils.rm_f "test.err"
602
681
  Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)
603
682
  #{VALIDATING_BLANK_HDR}
604
683
 
605
- .Foreword
684
+ .Foreword
606
685
  Foreword
607
686
 
608
687
  == Scope
@@ -612,10 +691,10 @@ it "Warning if scope occurs after Terms and Definitions" do
612
691
 
613
692
  == Terms and Definitions
614
693
 
615
- == Scope
694
+ == Symbols and Abbreviated Terms
616
695
 
617
696
  INPUT
618
- expect(File.read("test.err")).to include "Scope must occur before Terms and Definitions"
697
+ expect(File.read("test.err")).to include "Document must contain at least one clause"
619
698
  end
620
699
 
621
700
  it "Warning if scope occurs after Terms and Definitions" do
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
 
3
3
  RSpec.describe IsoDoc do
4
4
  it "cross-references notes in amendments" do
5
- expect(xmlpp(IsoDoc::Iso::HtmlConvert.new({}).convert("test", <<~"INPUT", true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
5
+ expect(xmlpp(IsoDoc::Iso::PresentationXMLConvert.new({}).convert("test", <<~"INPUT", true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
6
6
  <iso-standard xmlns="http://riboseinc.com/isoxml">
7
7
  <bibdata> <ext> <doctype>amendment</doctype> </ext> </bibdata>
8
8
  <preface>
@@ -56,66 +56,104 @@ RSpec.describe IsoDoc do
56
56
  </annex>
57
57
  </iso-standard>
58
58
  INPUT
59
- #{HTML_HDR}
60
- <br/>
61
- <div>
62
- <h1 class="ForewordTitle">Foreword</h1>
63
- <p>
64
- <a href="#N">[N]</a>
65
- <a href="#note1">[note1]</a>
66
- <a href="#note2">[note2]</a>
67
- <a href="#AN">A.1, Note</a>
68
- <a href="#Anote1">A.2, Note 1</a>
69
- <a href="#Anote2">A.2, Note 2</a>
70
- </p>
71
- </div>
72
- <p class="zzSTDTitle1"/>
73
- <div id="scope">
74
- <h1>Scope</h1>
75
- <div id="N" class="Note">
76
- <p><span class="note_label">NOTE</span>&#160; These results are based on a study carried out on three different types of kernel.</p>
77
- </div>
78
- <p>
79
- <a href="#N">[n]</a>
80
- </p>
81
- </div>
82
- <div id="terms"><h1/>
83
- </div>
84
- <div id="widgets">
85
- <h1>Widgets</h1>
86
- <div id="widgets1"><span class='zzMoveToFollowing'><b/></span>
87
- <div id="note1" class="Note"><p><span class="note_label">NOTE</span>&#160; These results are based on a study carried out on three different types of kernel.</p></div>
88
- <div id="note2" class="Note"><p><span class="note_label">NOTE</span>&#160; These results are based on a study carried out on three different types of kernel.</p></div>
89
- <p> <a href="#note1">[note1]</a> <a href="#note2">[note2]</a> </p>
90
-
91
- </div>
92
- </div>
93
- <br/>
94
- <div id="annex1" class="Section3">
95
- <h1 class='Annex'>
96
- <b>Annex A</b>
59
+ <?xml version='1.0'?>
60
+ <iso-standard xmlns='http://riboseinc.com/isoxml'>
61
+ <bibdata>
62
+ <ext>
63
+ <doctype>amendment</doctype>
64
+ </ext>
65
+ </bibdata>
66
+ <preface>
67
+ <foreword>
68
+ <p>
69
+ <xref target='N'>[N]</xref>
70
+ <xref target='note1'>[note1]</xref>
71
+ <xref target='note2'>[note2]</xref>
72
+ <xref target='AN'>A.1, Note</xref>
73
+ <xref target='Anote1'>A.2, Note 1</xref>
74
+ <xref target='Anote2'>A.2, Note 2</xref>
75
+ </p>
76
+ </foreword>
77
+ </preface>
78
+ <sections>
79
+ <clause id='scope'>
80
+ <title depth="1">Scope</title>
81
+ <note id='N'>
82
+ <name>NOTE</name>
83
+ <p id='_f06fd0d1-a203-4f3d-a515-0bdba0f8d83f'>
84
+ These results are based on a study carried out on three different
85
+ types of kernel.
86
+ </p>
87
+ </note>
88
+ <p>
89
+ <xref target='N'>[n]</xref>
90
+ </p>
91
+ </clause>
92
+ <terms id='terms'/>
93
+ <clause id='widgets'>
94
+ <title depth="1">Widgets</title>
95
+ <clause id='widgets1' inline-header="true">
96
+ <note id='note1'>
97
+ <name>NOTE</name>
98
+ <p id='_f06fd0d1-a203-4f3d-a515-0bdba0f8d83f'>
99
+ These results are based on a study carried out on three different
100
+ types of kernel.
101
+ </p>
102
+ </note>
103
+ <note id='note2'>
104
+ <name>NOTE</name>
105
+ <p id='_f06fd0d1-a203-4f3d-a515-0bdba0f8d83a'>
106
+ These results are based on a study carried out on three different
107
+ types of kernel.
108
+ </p>
109
+ </note>
110
+ <p>
111
+ <xref target='note1'>[note1]</xref>
112
+ <xref target='note2'>[note2]</xref>
113
+ </p>
114
+ </clause>
115
+ </clause>
116
+ </sections>
117
+ <annex id='annex1'>
118
+ <title>
119
+ <strong>Annex A</strong>
97
120
  <br/>
98
121
  (informative)
99
- <br/>
100
- <br/>
101
- <b/>
102
- </h1>
103
- <div id="annex1a"><span class='zzMoveToFollowing'><b>A.1&#160; </b></span>
104
- <div id="AN" class="Note"><p><span class="note_label">NOTE</span>&#160; These results are based on a study carried out on three different types of kernel.</p></div>
105
- </div>
106
- <div id="annex1b"><span class='zzMoveToFollowing'><b>A.2&#160; </b></span>
107
- <div id="Anote1" class="Note"><p><span class="note_label">NOTE 1</span>&#160; These results are based on a study carried out on three different types of kernel.</p></div>
108
- <div id="Anote2" class="Note"><p><span class="note_label">NOTE 2</span>&#160; These results are based on a study carried out on three different types of kernel.</p></div>
109
- </div>
110
- </div>
111
- </div>
112
- </body>
113
- </html>
122
+ </title>
123
+ <clause id='annex1a' inline-header='true'>
124
+ <title>A.1</title>
125
+ <note id='AN'>
126
+ <name>NOTE</name>
127
+ <p id='_f06fd0d1-a203-4f3d-a515-0bdba0f8d83f'>
128
+ These results are based on a study carried out on three different
129
+ types of kernel.
130
+ </p>
131
+ </note>
132
+ </clause>
133
+ <clause id='annex1b' inline-header="true">
134
+ <title>A.2</title>
135
+ <note id='Anote1'>
136
+ <name>NOTE 1</name>
137
+ <p id='_f06fd0d1-a203-4f3d-a515-0bdba0f8d83f'>
138
+ These results are based on a study carried out on three different
139
+ types of kernel.
140
+ </p>
141
+ </note>
142
+ <note id='Anote2'>
143
+ <name>NOTE 2</name>
144
+ <p id='_f06fd0d1-a203-4f3d-a515-0bdba0f8d83a'>
145
+ These results are based on a study carried out on three different
146
+ types of kernel.
147
+ </p>
148
+ </note>
149
+ </clause>
150
+ </annex>
151
+ </iso-standard>
114
152
  OUTPUT
115
153
  end
116
154
 
117
155
  it "cross-references sections" do
118
- expect(xmlpp(IsoDoc::Iso::HtmlConvert.new({}).convert("test", <<~"INPUT", true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
156
+ expect(xmlpp(IsoDoc::Iso::PresentationXMLConvert.new({}).convert("test", <<~"INPUT", true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
119
157
  <iso-standard xmlns="http://riboseinc.com/isoxml">
120
158
  <bibdata> <ext> <doctype>amendment</doctype> </ext> </bibdata>
121
159
  <preface>
@@ -145,7 +183,7 @@ RSpec.describe IsoDoc do
145
183
  </clause>
146
184
  <clause id="C1" inline-header="false" obligation="informative">Text</clause>
147
185
  </introduction></preface><sections>
148
- <clause id="D" obligation="normative">
186
+ <clause id="D" obligation="normative" type="scope">
149
187
  <title>Scope</title>
150
188
  <p id="E">Text</p>
151
189
  </clause>
@@ -179,85 +217,107 @@ RSpec.describe IsoDoc do
179
217
  </bibliography>
180
218
  </iso-standard>
181
219
  INPUT
182
- #{HTML_HDR}
183
- <br/>
184
- <div>
185
- <h1 class="ForewordTitle">Foreword</h1>
186
- <p id="A">This is a preamble
187
- <a href='#C'>[C]</a>
188
- <a href='#C1'>[C1]</a>
189
- <a href='#D'>[D]</a>
190
- <a href='#H'>[H]</a>
191
- <a href='#I'>[I]</a>
192
- <a href='#J'>[J]</a>
193
- <a href='#K'>[K]</a>
194
- <a href='#L'>[L]</a>
195
- <a href='#M'>[M]</a>
196
- <a href='#N'>[N]</a>
197
- <a href='#O'>[O]</a>
198
- <a href='#P'>Annex A</a>
199
- <a href='#Q'>A.1</a>
200
- <a href='#Q1'>A.1.1</a>
201
- <a href='#Q2'>Annex A, Appendix 1</a>
202
- <a href='#R'>[R]</a>
203
- </p>
204
- </div>
205
- <br/>
206
- <div class="Section3" id="B">
207
- <h1 class="IntroTitle">Introduction</h1>
208
- <div id="C">
209
- <h1>Introduction Subsection</h1>
210
- </div>
211
- <div id="C1"><span class='zzMoveToFollowing'>
212
- <b/>
213
- </span>
214
- Text</div>
215
- </div>
216
- <p class="zzSTDTitle1"/>
217
- <div id="D">
218
- <h1>Scope</h1>
219
- <p id="E">Text</p>
220
- </div>
221
- <div>
222
- <h1>Normative references</h1>
223
- </div>
224
- <div id="M">
225
- <h1>Clause 4</h1>
226
- <div id="N">
227
- <h1>Introduction</h1>
228
- </div>
229
- <div id="O">
230
- <h1>Clause 4.2</h1>
231
- </div>
232
- </div>
233
- <br/>
234
- <div id="P" class="Section3">
235
- <h1 class="Annex"><b>Annex A</b><br/>(normative)<br/><br/><b>Annex</b></h1>
236
- <div id="Q">
237
- <h2>A.1&#160; Annex A.1</h2>
238
- <div id="Q1">
239
- <h3>A.1.1&#160; Annex A.1a</h3>
240
- </div>
241
- </div>
242
- <div id="Q2">
243
- <h2>Appendix 1&#160; An Appendix</h2>
244
- </div>
245
- </div>
246
- <br/>
247
- <div>
248
- <h1 class="Section3">Bibliography</h1>
249
- <div>
250
- <h2 class="Section3">Bibliography Subsection</h2>
251
- </div>
252
- </div>
253
- </div>
254
- </body>
255
- </html>
220
+ <?xml version='1.0'?>
221
+ <iso-standard xmlns='http://riboseinc.com/isoxml'>
222
+ <bibdata>
223
+ <ext>
224
+ <doctype>amendment</doctype>
225
+ </ext>
226
+ </bibdata>
227
+ <preface>
228
+ <foreword obligation='informative'>
229
+ <title>Foreword</title>
230
+ <p id='A'>
231
+ This is a preamble
232
+ <xref target='C'>[C]</xref>
233
+ <xref target='C1'>[C1]</xref>
234
+ <xref target='D'>[D]</xref>
235
+ <xref target='H'>[H]</xref>
236
+ <xref target='I'>[I]</xref>
237
+ <xref target='J'>[J]</xref>
238
+ <xref target='K'>[K]</xref>
239
+ <xref target='L'>[L]</xref>
240
+ <xref target='M'>[M]</xref>
241
+ <xref target='N'>[N]</xref>
242
+ <xref target='O'>[O]</xref>
243
+ <xref target='P'>Annex A</xref>
244
+ <xref target='Q'>A.1</xref>
245
+ <xref target='Q1'>A.1.1</xref>
246
+ <xref target='Q2'>Annex A, Appendix 1</xref>
247
+ <xref target='R'>[R]</xref>
248
+ </p>
249
+ </foreword>
250
+ <introduction id='B' obligation='informative'>
251
+ <title depth="1">Introduction</title>
252
+ <clause id='C' inline-header='false' obligation='informative'>
253
+ <title depth="1">Introduction Subsection</title>
254
+ </clause>
255
+ <clause id='C1' inline-header='true' obligation='informative'>Text</clause>
256
+ </introduction>
257
+ </preface>
258
+ <sections>
259
+ <clause id='D' obligation='normative' type="scope">
260
+ <title depth="1">Scope</title>
261
+ <p id='E'>Text</p>
262
+ </clause>
263
+ <clause id='M' inline-header='false' obligation='normative'>
264
+ <title depth="1">Clause 4</title>
265
+ <clause id='N' inline-header='false' obligation='normative'>
266
+ <title depth="1">Introduction</title>
267
+ </clause>
268
+ <clause id='O' inline-header='false' obligation='normative'>
269
+ <title depth="1">Clause 4.2</title>
270
+ </clause>
271
+ </clause>
272
+ </sections>
273
+ <annex id='P' inline-header='false' obligation='normative'>
274
+ <title>
275
+ <strong>Annex A</strong>
276
+ <br/>
277
+ (normative)
278
+ <br/>
279
+ <br/>
280
+ <strong>Annex</strong>
281
+ </title>
282
+ <clause id='Q' inline-header='false' obligation='normative'>
283
+ <title depth='2'>
284
+ A.1
285
+ <tab/>
286
+ Annex A.1
287
+ </title>
288
+ <clause id='Q1' inline-header='false' obligation='normative'>
289
+ <title depth='3'>
290
+ A.1.1
291
+ <tab/>
292
+ Annex A.1a
293
+ </title>
294
+ </clause>
295
+ </clause>
296
+ <appendix id='Q2' inline-header='false' obligation='normative'>
297
+ <title depth='2'>
298
+ Appendix 1
299
+ <tab/>
300
+ An Appendix
301
+ </title>
302
+ </appendix>
303
+ </annex>
304
+ <bibliography>
305
+ <references id='R' obligation='informative' normative='true'>
306
+ <title depth="1">Normative References</title>
307
+ </references>
308
+ <clause id='S' obligation='informative'>
309
+ <title depth="1">Bibliography</title>
310
+ <references id='T' obligation='informative' normative='false'>
311
+ <title depth="2">Bibliography Subsection</title>
312
+ </references>
313
+ </clause>
314
+ </bibliography>
315
+ </iso-standard>
256
316
  OUTPUT
257
317
  end
258
318
 
259
319
  it "processes section names" do
260
- expect(xmlpp(IsoDoc::Iso::HtmlConvert.new({}).convert("test", <<~"INPUT", true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
320
+ input = <<~INPUT
261
321
  <iso-standard xmlns="http://riboseinc.com/isoxml">
262
322
  <bibdata> <ext> <doctype>amendment</doctype> </ext> </bibdata>
263
323
  <boilerplate>
@@ -284,7 +344,7 @@ Text</div>
284
344
  </boilerplate>
285
345
  <preface>
286
346
  <abstract obligation="informative">
287
- <title>Foreword</title>
347
+ <title>Abstract</title>
288
348
  </abstract>
289
349
  <foreword obligation="informative">
290
350
  <title>Foreword</title>
@@ -300,11 +360,6 @@ Text</div>
300
360
  <title>Acknowledgements</title>
301
361
  </acknowledgements>
302
362
  </preface><sections>
303
- <clause id="D" obligation="normative">
304
- <title>Scope</title>
305
- <p id="E">Text</p>
306
- </clause>
307
-
308
363
  <clause id="M" inline-header="false" obligation="normative"><title>Clause 4</title><clause id="N" inline-header="false" obligation="normative">
309
364
  <title>Introduction</title>
310
365
  </clause>
@@ -314,7 +369,10 @@ Text</div>
314
369
  <clause id="O1" inline-header="false" obligation="normative">
315
370
  </clause>
316
371
  </clause>
317
-
372
+ <clause id="D" obligation="normative">
373
+ <title>Scope</title>
374
+ <p id="E">Text</p>
375
+ </clause>
318
376
  </sections><annex id="P" inline-header="false" obligation="normative">
319
377
  <title>Annex</title>
320
378
  <clause id="Q" inline-header="false" obligation="normative">
@@ -322,7 +380,6 @@ Text</div>
322
380
  <clause id="Q1" inline-header="false" obligation="normative">
323
381
  <title>Annex A.1a</title>
324
382
  </clause>
325
- <references id="Q2" normative="false"><title>Annex Bibliography</title></references>
326
383
  </clause>
327
384
  </annex>
328
385
  <annex id="P1" inline-header="false" obligation="normative">
@@ -338,6 +395,112 @@ Text</div>
338
395
  </bibliography>
339
396
  </iso-standard>
340
397
  INPUT
398
+ presxml = <<~OUTPUT
399
+ <iso-standard xmlns='http://riboseinc.com/isoxml'>
400
+ <bibdata>
401
+ <ext>
402
+ <doctype>amendment</doctype>
403
+ </ext>
404
+ </bibdata>
405
+ <boilerplate>
406
+ <copyright-statement>
407
+ <clause>
408
+ <title depth="1">Copyright</title>
409
+ </clause>
410
+ </copyright-statement>
411
+ <license-statement>
412
+ <clause>
413
+ <title depth="1">License</title>
414
+ </clause>
415
+ </license-statement>
416
+ <legal-statement>
417
+ <clause>
418
+ <title depth="1">Legal</title>
419
+ </clause>
420
+ </legal-statement>
421
+ <feedback-statement>
422
+ <clause>
423
+ <title depth="1">Feedback</title>
424
+ </clause>
425
+ </feedback-statement>
426
+ </boilerplate>
427
+ <preface>
428
+ <abstract obligation='informative'>
429
+ <title>Abstract</title>
430
+ </abstract>
431
+ <foreword obligation='informative'>
432
+ <title>Foreword</title>
433
+ <p id='A'>This is a preamble</p>
434
+ </foreword>
435
+ <introduction id='B' obligation='informative'>
436
+ <title depth='1'>Introduction</title>
437
+ <clause id='C' inline-header='false' obligation='informative'>
438
+ <title depth='1'>Introduction Subsection</title>
439
+ </clause>
440
+ </introduction>
441
+ <clause id='B1'>
442
+ <title depth='1'>Dedication</title>
443
+ </clause>
444
+ <clause id='B2'>
445
+ <title depth='1'>Note to reader</title>
446
+ </clause>
447
+ <acknowledgements obligation='informative'>
448
+ <title>Acknowledgements</title>
449
+ </acknowledgements>
450
+ </preface>
451
+ <sections>
452
+ <clause id='M' inline-header='false' obligation='normative'>
453
+ <title depth='1'>Clause 4</title>
454
+ <clause id='N' inline-header='false' obligation='normative'>
455
+ <title depth='1'>Introduction</title>
456
+ </clause>
457
+ <clause id='O' inline-header='false' obligation='normative'>
458
+ <title depth='1'>Clause 4.2</title>
459
+ </clause>
460
+ <clause id='O1' inline-header='true' obligation='normative'> </clause>
461
+ </clause>
462
+ <clause id='D' obligation='normative'>
463
+ <title depth='1'>Scope</title>
464
+ <p id='E'>Text</p>
465
+ </clause>
466
+ </sections>
467
+ <annex id='P' inline-header='false' obligation='normative'>
468
+ <title>
469
+ <strong>Annex A</strong>
470
+ <br/>
471
+ (normative)
472
+ <br/>
473
+ <br/>
474
+ <strong>Annex</strong>
475
+ </title>
476
+ <clause id='Q' inline-header='false' obligation='normative'>
477
+ <title depth='2'>A.1<tab/>Annex A.1</title>
478
+ <clause id='Q1' inline-header='false' obligation='normative'>
479
+ <title depth='3'>A.1.1<tab/>Annex A.1a</title>
480
+ </clause>
481
+ </clause>
482
+ </annex>
483
+ <annex id='P1' inline-header='false' obligation='normative'>
484
+ <title>
485
+ <strong>Annex B</strong>
486
+ <br/>
487
+ (normative)
488
+ </title>
489
+ </annex>
490
+ <bibliography>
491
+ <references id='R' obligation='informative' normative='true'>
492
+ <title depth='1'>Normative References</title>
493
+ </references>
494
+ <clause id='S' obligation='informative'>
495
+ <title depth='1'>Bibliography</title>
496
+ <references id='T' obligation='informative' normative='false'>
497
+ <title depth='2'>Bibliography Subsection</title>
498
+ </references>
499
+ </clause>
500
+ </bibliography>
501
+ </iso-standard>
502
+ OUTPUT
503
+ html = <<~OUTPUT
341
504
  <html xmlns:epub='http://www.idpf.org/2007/ops' lang='en'>
342
505
  <head/>
343
506
  <body lang='en'>
@@ -401,12 +564,8 @@ Text</div>
401
564
  <h1 class='IntroTitle'>Acknowledgements</h1>
402
565
  </div>
403
566
  <p class='zzSTDTitle1'/>
404
- <div id='D'>
405
- <h1>Scope</h1>
406
- <p id='E'>Text</p>
407
- </div>
408
567
  <div>
409
- <h1>Normative references</h1>
568
+ <h1>Normative References</h1>
410
569
  </div>
411
570
  <div id='M'>
412
571
  <h1>Clause 4</h1>
@@ -417,11 +576,12 @@ Text</div>
417
576
  <h1>Clause 4.2</h1>
418
577
  </div>
419
578
  <div id='O1'>
420
- <span class='zzMoveToFollowing'>
421
- <b/>
422
- </span>
423
579
  </div>
424
580
  </div>
581
+ <div id='D'>
582
+ <h1>Scope</h1>
583
+ <p id='E'>Text</p>
584
+ </div>
425
585
  <br/>
426
586
  <div id='P' class='Section3'>
427
587
  <h1 class='Annex'>
@@ -437,9 +597,6 @@ Text</div>
437
597
  <div id='Q1'>
438
598
  <h3>A.1.1&#160; Annex A.1a</h3>
439
599
  </div>
440
- <div>
441
- <h3>A.1.2&#160; Annex Bibliography</h3>
442
- </div>
443
600
  </div>
444
601
  </div>
445
602
  <br/>
@@ -448,9 +605,6 @@ Text</div>
448
605
  <b>Annex B</b>
449
606
  <br/>
450
607
  (normative)
451
- <br/>
452
- <br/>
453
- <b/>
454
608
  </h1>
455
609
  </div>
456
610
  <br/>
@@ -464,6 +618,8 @@ Text</div>
464
618
  </body>
465
619
  </html>
466
620
  OUTPUT
621
+ expect(xmlpp(IsoDoc::Iso::PresentationXMLConvert.new({}).convert("test", input, true))).to be_equivalent_to xmlpp(presxml)
622
+ expect(xmlpp(IsoDoc::Iso::HtmlConvert.new({}).convert("test", presxml, true))).to be_equivalent_to xmlpp(html)
467
623
  end
468
624
 
469
625
  it "processes IsoXML metadata" do