metanorma-iso 1.4.0 → 1.5.0

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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/macos.yml +0 -1
  3. data/.github/workflows/ubuntu.yml +6 -3
  4. data/.github/workflows/windows.yml +0 -1
  5. data/Gemfile +1 -0
  6. data/Rakefile +2 -0
  7. data/lib/asciidoctor/iso/base.rb +8 -19
  8. data/lib/asciidoctor/iso/cleanup.rb +2 -3
  9. data/lib/asciidoctor/iso/front.rb +0 -1
  10. data/lib/asciidoctor/iso/front_id.rb +1 -1
  11. data/lib/asciidoctor/iso/isodoc.rng +12 -6
  12. data/lib/asciidoctor/iso/section.rb +5 -11
  13. data/lib/asciidoctor/iso/term_lookup_cleanup.rb +0 -1
  14. data/lib/asciidoctor/iso/validate_section.rb +30 -44
  15. data/lib/isodoc/iso/base_convert.rb +3 -64
  16. data/lib/isodoc/iso/html/htmlstyle.css +47 -0
  17. data/lib/isodoc/iso/html/htmlstyle.scss +0 -1
  18. data/lib/isodoc/iso/html/isodoc.css +862 -0
  19. data/lib/isodoc/iso/html/isodoc.scss +0 -1
  20. data/lib/isodoc/iso/html/style-human.css +968 -0
  21. data/lib/isodoc/iso/html/style-iso.css +996 -0
  22. data/lib/isodoc/iso/html/wordstyle.css +1515 -0
  23. data/lib/isodoc/iso/html/wordstyle.scss +0 -1
  24. data/lib/isodoc/iso/html_convert.rb +2 -1
  25. data/lib/{asciidoctor → isodoc}/iso/i18n-en.yaml +0 -0
  26. data/lib/{asciidoctor → isodoc}/iso/i18n-fr.yaml +0 -0
  27. data/lib/{asciidoctor → isodoc}/iso/i18n-zh-Hans.yaml +0 -0
  28. data/lib/isodoc/iso/i18n.rb +19 -0
  29. data/lib/isodoc/iso/init.rb +33 -0
  30. data/lib/isodoc/iso/iso.amendment.xsl +32 -0
  31. data/lib/isodoc/iso/iso.international-standard.xsl +32 -0
  32. data/lib/isodoc/iso/metadata.rb +1 -1
  33. data/lib/isodoc/iso/pdf_convert.rb +1 -1
  34. data/lib/isodoc/iso/presentation_xml_convert.rb +99 -1
  35. data/lib/isodoc/iso/sections.rb +3 -8
  36. data/lib/isodoc/iso/word_convert.rb +2 -1
  37. data/lib/isodoc/iso/xref.rb +2 -0
  38. data/lib/metanorma/iso/processor.rb +0 -4
  39. data/lib/metanorma/iso/version.rb +1 -1
  40. data/metanorma-iso.gemspec +4 -3
  41. data/spec/asciidoctor-iso/cleanup_spec.rb +4 -4
  42. data/spec/asciidoctor-iso/inline_spec.rb +1 -1
  43. data/spec/asciidoctor-iso/refs_spec.rb +3 -3
  44. data/spec/asciidoctor-iso/section_spec.rb +9 -6
  45. data/spec/asciidoctor-iso/validate_spec.rb +13 -21
  46. data/spec/isodoc/amd_spec.rb +309 -153
  47. data/spec/isodoc/blocks_spec.rb +362 -28
  48. data/spec/isodoc/i18n_spec.rb +468 -108
  49. data/spec/isodoc/inline_spec.rb +99 -31
  50. data/spec/isodoc/iso_spec.rb +95 -29
  51. data/spec/isodoc/postproc_spec.rb +114 -149
  52. data/spec/isodoc/ref_spec.rb +176 -4
  53. data/spec/isodoc/section_spec.rb +148 -82
  54. data/spec/isodoc/table_spec.rb +142 -5
  55. data/spec/isodoc/terms_spec.rb +78 -53
  56. data/spec/isodoc/xref_spec.rb +831 -658
  57. data/spec/metanorma/processor_spec.rb +2 -1
  58. metadata +34 -13
@@ -1,8 +1,256 @@
1
1
  require "spec_helper"
2
2
 
3
3
  RSpec.describe IsoDoc do
4
- it "processes formulae" do
4
+ it "renders figures (HTML)" do
5
5
  expect(xmlpp(IsoDoc::Iso::HtmlConvert.new({}).convert("test", <<~"INPUT", true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
6
+ <iso-standard xmlns='http://riboseinc.com/isoxml'>
7
+ <preface>
8
+ <foreword id='fwd'>
9
+ <p>
10
+ </p>
11
+ </foreword>
12
+ </preface>
13
+ <sections>
14
+ <clause id='scope' type="scope">
15
+ <title>Scope</title>
16
+ <figure id='N'>
17
+ <name>Figure 1&#xA0;&#x2014; Split-it-right sample divider</name>
18
+ <image src='rice_images/rice_image1.png' id='_8357ede4-6d44-4672-bac4-9a85e82ab7f0' mimetype='image/png'/>
19
+ </figure>
20
+ <p>
21
+ </p>
22
+ </clause>
23
+ <terms id='terms'/>
24
+ <clause id='widgets'>
25
+ <title>Widgets</title>
26
+ <clause id='widgets1'>
27
+ <figure id='note1'>
28
+ <name>Figure 2&#xA0;&#x2014; Split-it-right sample divider</name>
29
+ <image src='rice_images/rice_image1.png' id='_8357ede4-6d44-4672-bac4-9a85e82ab7f0' mimetype='image/png'/>
30
+ </figure>
31
+ <figure id='note2'>
32
+ <name>Figure 3&#xA0;&#x2014; Split-it-right sample divider</name>
33
+ <image src='rice_images/rice_image1.png' id='_8357ede4-6d44-4672-bac4-9a85e82ab7f0' mimetype='image/png'/>
34
+ </figure>
35
+ <p>
36
+ </p>
37
+ </clause>
38
+ </clause>
39
+ </sections>
40
+ <annex id='annex1'>
41
+ <clause id='annex1a'>
42
+ <figure id='AN'>
43
+ <name>Figure A.1&#xA0;&#x2014; Split-it-right sample divider</name>
44
+ <image src='rice_images/rice_image1.png' id='_8357ede4-6d44-4672-bac4-9a85e82ab7f0' mimetype='image/png'/>
45
+ </figure>
46
+ </clause>
47
+ <clause id='annex1b'>
48
+ <figure id='Anote1'>
49
+ <name>Figure A.2&#xA0;&#x2014; Split-it-right sample divider</name>
50
+ <image src='rice_images/rice_image1.png' id='_8357ede4-6d44-4672-bac4-9a85e82ab7f0' mimetype='image/png'/>
51
+ </figure>
52
+ <figure id='Anote2'>
53
+ <name>Figure A.3&#xA0;&#x2014; Split-it-right sample divider</name>
54
+ <image src='rice_images/rice_image1.png' id='_8357ede4-6d44-4672-bac4-9a85e82ab7f0' mimetype='image/png'/>
55
+ </figure>
56
+ </clause>
57
+ </annex>
58
+ </iso-standard>
59
+ INPUT
60
+ #{HTML_HDR}
61
+ <br/>
62
+ <div id="fwd">
63
+ <h1 class="ForewordTitle">Foreword</h1>
64
+ <p>
65
+ </p>
66
+ </div>
67
+ <p class="zzSTDTitle1"/>
68
+ <div id="scope">
69
+ <h1>Scope</h1>
70
+ <div id="N" class="figure">
71
+
72
+ <img src="rice_images/rice_image1.png" height="auto" width="auto"/>
73
+ <p class="FigureTitle" style="text-align:center;">Figure 1&#160;&#8212; Split-it-right sample divider</p></div>
74
+ <p>
75
+ </p>
76
+ </div>
77
+ <div id="terms"><h1/>
78
+ </div>
79
+ <div id="widgets">
80
+ <h1>Widgets</h1>
81
+ <div id="widgets1">
82
+ <div id="note1" class="figure">
83
+
84
+ <img src="rice_images/rice_image1.png" height="auto" width="auto"/>
85
+ <p class="FigureTitle" style="text-align:center;">Figure 2&#160;&#8212; Split-it-right sample divider</p></div>
86
+ <div id="note2" class="figure">
87
+
88
+ <img src="rice_images/rice_image1.png" height="auto" width="auto"/>
89
+ <p class="FigureTitle" style="text-align:center;">Figure 3&#160;&#8212; Split-it-right sample divider</p></div>
90
+ <p> </p>
91
+ </div>
92
+ </div>
93
+ <br/>
94
+ <div id="annex1" class="Section3">
95
+ <div id="annex1a">
96
+ <div id="AN" class="figure">
97
+
98
+ <img src="rice_images/rice_image1.png" height="auto" width="auto"/>
99
+ <p class="FigureTitle" style="text-align:center;">Figure A.1&#160;&#8212; Split-it-right sample divider</p></div>
100
+ </div>
101
+ <div id="annex1b">
102
+ <div id="Anote1" class="figure">
103
+
104
+ <img src="rice_images/rice_image1.png" height="auto" width="auto"/>
105
+ <p class="FigureTitle" style="text-align:center;">Figure A.2&#160;&#8212; Split-it-right sample divider</p></div>
106
+ <div id="Anote2" class="figure">
107
+
108
+ <img src="rice_images/rice_image1.png" height="auto" width="auto"/>
109
+ <p class="FigureTitle" style="text-align:center;">Figure A.3&#160;&#8212; Split-it-right sample divider</p></div>
110
+ </div>
111
+ </div>
112
+ </div>
113
+ </body>
114
+ </html>
115
+ OUTPUT
116
+ end
117
+
118
+ it "renders subfigures (HTML)" do
119
+ expect(xmlpp(IsoDoc::Iso::HtmlConvert.new({}).convert("test", <<~"INPUT", true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
120
+ <iso-standard xmlns='http://riboseinc.com/isoxml'>
121
+ <preface>
122
+ <foreword id='fwd'>
123
+ <p>
124
+ <xref target='N'/>
125
+ <xref target='note1'/>
126
+ <xref target='note2'/>
127
+ <xref target='AN'/>
128
+ <xref target='Anote1'/>
129
+ <xref target='Anote2'/>
130
+ </p>
131
+ </foreword>
132
+ </preface>
133
+ <sections>
134
+ <clause id='scope' type="scope">
135
+ <title>Scope</title>
136
+ </clause>
137
+ <terms id='terms'/>
138
+ <clause id='widgets'>
139
+ <title>Widgets</title>
140
+ <clause id='widgets1'>
141
+ <figure id='N'>
142
+ <name>Figure 1</name>
143
+ <figure id='note1'>
144
+ <name>a)&#xA0;&#x2014; Split-it-right sample divider</name>
145
+ <image src='rice_images/rice_image1.png' id='_8357ede4-6d44-4672-bac4-9a85e82ab7f0' mimetype='image/png'/>
146
+ </figure>
147
+ <figure id='note2'>
148
+ <name>b)&#xA0;&#x2014; Split-it-right sample divider</name>
149
+ <image src='rice_images/rice_image1.png' id='_8357ede4-6d44-4672-bac4-9a85e82ab7f0' mimetype='image/png'/>
150
+ </figure>
151
+ </figure>
152
+ <p>
153
+ <xref target='note1'/>
154
+ <xref target='note2'/>
155
+ </p>
156
+ </clause>
157
+ </clause>
158
+ </sections>
159
+ <annex id='annex1'>
160
+ <clause id='annex1a'> </clause>
161
+ <clause id='annex1b'>
162
+ <figure id='AN'>
163
+ <name>Figure A.1</name>
164
+ <figure id='Anote1'>
165
+ <name>a)&#xA0;&#x2014; Split-it-right sample divider</name>
166
+ <image src='rice_images/rice_image1.png' id='_8357ede4-6d44-4672-bac4-9a85e82ab7f0' mimetype='image/png'/>
167
+ </figure>
168
+ <figure id='Anote2'>
169
+ <name>b)&#xA0;&#x2014; Split-it-right sample divider</name>
170
+ <image src='rice_images/rice_image1.png' id='_8357ede4-6d44-4672-bac4-9a85e82ab7f0' mimetype='image/png'/>
171
+ </figure>
172
+ </figure>
173
+ </clause>
174
+ </annex>
175
+ </iso-standard>
176
+ INPUT
177
+ <html lang='en'>
178
+ <head/>
179
+ <body lang='en'>
180
+ <div class='title-section'>
181
+ <p>&#160;</p>
182
+ </div>
183
+ <br/>
184
+ <div class='prefatory-section'>
185
+ <p>&#160;</p>
186
+ </div>
187
+ <br/>
188
+ <div class='main-section'>
189
+ <br/>
190
+ <div id='fwd'>
191
+ <h1 class='ForewordTitle'>Foreword</h1>
192
+ <p>
193
+ <a href='#N'/>
194
+ <a href='#note1'/>
195
+ <a href='#note2'/>
196
+ <a href='#AN'/>
197
+ <a href='#Anote1'/>
198
+ <a href='#Anote2'/>
199
+ </p>
200
+ </div>
201
+ <p class='zzSTDTitle1'/>
202
+ <div id='scope'>
203
+ <h1>Scope</h1>
204
+ </div>
205
+ <div id='terms'>
206
+ <h1/>
207
+ </div>
208
+ <div id='widgets'>
209
+ <h1>Widgets</h1>
210
+ <div id='widgets1'>
211
+ <div id='N' class='figure'>
212
+ <div id='note1' class='figure'>
213
+ <img src='rice_images/rice_image1.png' height='auto' width='auto'/>
214
+ <p class='FigureTitle' style='text-align:center;'>a)&#160;&#8212; Split-it-right sample divider</p>
215
+ </div>
216
+ <div id='note2' class='figure'>
217
+ <img src='rice_images/rice_image1.png' height='auto' width='auto'/>
218
+ <p class='FigureTitle' style='text-align:center;'>b)&#160;&#8212; Split-it-right sample divider</p>
219
+ </div>
220
+ <p class='FigureTitle' style='text-align:center;'>Figure 1</p>
221
+ </div>
222
+ <p>
223
+ <a href='#note1'/>
224
+ <a href='#note2'/>
225
+ </p>
226
+ </div>
227
+ </div>
228
+ <br/>
229
+ <div id='annex1' class='Section3'>
230
+ <div id='annex1a'>
231
+ </div>
232
+ <div id='annex1b'>
233
+ <div id='AN' class='figure'>
234
+ <div id='Anote1' class='figure'>
235
+ <img src='rice_images/rice_image1.png' height='auto' width='auto'/>
236
+ <p class='FigureTitle' style='text-align:center;'>a)&#160;&#8212; Split-it-right sample divider</p>
237
+ </div>
238
+ <div id='Anote2' class='figure'>
239
+ <img src='rice_images/rice_image1.png' height='auto' width='auto'/>
240
+ <p class='FigureTitle' style='text-align:center;'>b)&#160;&#8212; Split-it-right sample divider</p>
241
+ </div>
242
+ <p class='FigureTitle' style='text-align:center;'>Figure A.1</p>
243
+ </div>
244
+ </div>
245
+ </div>
246
+ </div>
247
+ </body>
248
+ </html>
249
+ OUTPUT
250
+ end
251
+
252
+ it "processes formulae (Presentation XML)" do
253
+ expect(xmlpp(IsoDoc::Iso::PresentationXMLConvert.new({}).convert("test", <<~"INPUT", true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
6
254
  <iso-standard xmlns="http://riboseinc.com/isoxml">
7
255
  <preface><foreword>
8
256
  <formula id="_be9158af-7e93-4ee2-90c5-26d31c181934" unnumbered="true">
@@ -22,6 +270,82 @@ RSpec.describe IsoDoc do
22
270
  </formula>
23
271
  </foreword></preface>
24
272
  </iso-standard>
273
+ INPUT
274
+ <?xml version='1.0'?>
275
+ <iso-standard xmlns='http://riboseinc.com/isoxml'>
276
+ <preface>
277
+ <foreword>
278
+ <formula id='_be9158af-7e93-4ee2-90c5-26d31c181934' unnumbered='true'>
279
+ <stem type='AsciiMath'>r = 1 %</stem>
280
+ <dl id='_e4fe94fe-1cde-49d9-b1ad-743293b7e21d'>
281
+ <dt>
282
+ <stem type='AsciiMath'>r</stem>
283
+ </dt>
284
+ <dd>
285
+ <p id='_1b99995d-ff03-40f5-8f2e-ab9665a69b77'>is the repeatability limit.</p>
286
+ </dd>
287
+ <dt>
288
+ <stem type='AsciiMath'>s_1</stem>
289
+ </dt>
290
+ <dd>
291
+ <p id='_1b99995d-ff03-40f5-8f2e-ab9665a69b77'>is the other repeatability limit.</p>
292
+ </dd>
293
+ </dl>
294
+ <note id='_83083c7a-6c85-43db-a9fa-4d8edd0c9fc0'>
295
+ <name>NOTE</name>
296
+ <p id='_511aaa98-4116-42af-8e5b-c87cdf5bfdc8'>
297
+ [durationUnits] is essentially a duration statement without the "P"
298
+ prefix. "P" is unnecessary because between "G" and "U" duration is
299
+ always expressed.
300
+ </p>
301
+ </note>
302
+ </formula>
303
+ <formula id='_be9158af-7e93-4ee2-90c5-26d31c181935'>
304
+ <name>1</name>
305
+ <stem type='AsciiMath'>r = 1 %</stem>
306
+ </formula>
307
+ </foreword>
308
+ </preface>
309
+ </iso-standard>
310
+ OUTPUT
311
+ end
312
+
313
+ it "processes formulae (HTML)" do
314
+ expect(xmlpp(IsoDoc::Iso::HtmlConvert.new({}).convert("test", <<~"INPUT", true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
315
+ <iso-standard xmlns='http://riboseinc.com/isoxml'>
316
+ <preface>
317
+ <foreword>
318
+ <formula id='_be9158af-7e93-4ee2-90c5-26d31c181934' unnumbered='true'>
319
+ <stem type='AsciiMath'>r = 1 %</stem>
320
+ <dl id='_e4fe94fe-1cde-49d9-b1ad-743293b7e21d'>
321
+ <dt>
322
+ <stem type='AsciiMath'>r</stem>
323
+ </dt>
324
+ <dd>
325
+ <p id='_1b99995d-ff03-40f5-8f2e-ab9665a69b77'>is the repeatability limit.</p>
326
+ </dd>
327
+ <dt>
328
+ <stem type='AsciiMath'>s_1</stem>
329
+ </dt>
330
+ <dd>
331
+ <p id='_1b99995d-ff03-40f5-8f2e-ab9665a69b77'>is the other repeatability limit.</p>
332
+ </dd>
333
+ </dl>
334
+ <note id='_83083c7a-6c85-43db-a9fa-4d8edd0c9fc0'>
335
+ <p id='_511aaa98-4116-42af-8e5b-c87cdf5bfdc8'>
336
+ [durationUnits] is essentially a duration statement without the "P"
337
+ prefix. "P" is unnecessary because between "G" and "U" duration is
338
+ always expressed.
339
+ </p>
340
+ </note>
341
+ </formula>
342
+ <formula id='_be9158af-7e93-4ee2-90c5-26d31c181935'>
343
+ <name>1</name>
344
+ <stem type='AsciiMath'>r = 1 %</stem>
345
+ </formula>
346
+ </foreword>
347
+ </preface>
348
+ </iso-standard>
25
349
  INPUT
26
350
  #{HTML_HDR}
27
351
  <br/>
@@ -49,7 +373,6 @@ RSpec.describe IsoDoc do
49
373
  </dl>
50
374
  <div id='_83083c7a-6c85-43db-a9fa-4d8edd0c9fc0' class='Note'>
51
375
  <p>
52
- <span class='note_label'>NOTE</span>
53
376
  &#160; [durationUnits] is essentially a duration statement without
54
377
  the "P" prefix. "P" is unnecessary because between "G" and "U"
55
378
  duration is always expressed.
@@ -73,29 +396,40 @@ RSpec.describe IsoDoc do
73
396
 
74
397
  it "processes formulae (Word)" do
75
398
  expect(xmlpp(IsoDoc::Iso::WordConvert.new({}).convert("test", <<~"INPUT", true).sub(%r{^.*<div>\s*<h1 class="ForewordTitle">}m, '<div><h1 class="ForewordTitle">').sub(%r{<p>\&#160;</p>\s*</div>.*$}m, ""))).to be_equivalent_to xmlpp(<<~"OUTPUT")
76
- <iso-standard xmlns="http://riboseinc.com/isoxml">
77
- <preface><foreword>
78
- <formula id="_be9158af-7e93-4ee2-90c5-26d31c181934" unnumbered="true">
79
- <stem type="AsciiMath">r = 1 %</stem>
80
- <dl id="_e4fe94fe-1cde-49d9-b1ad-743293b7e21d">
81
- <dt>
82
- <stem type="AsciiMath">r</stem>
83
- </dt>
84
- <dd>
85
- <p id="_1b99995d-ff03-40f5-8f2e-ab9665a69b77">is the repeatability limit.</p>
86
- </dd>
87
- <dt> <stem type="AsciiMath">s_1</stem> </dt>
88
- <dd> <p id="_1b99995d-ff03-40f5-8f2e-ab9665a69b77">is the other repeatability limit.</p> </dd>
89
- </dl>
90
- <note id="_83083c7a-6c85-43db-a9fa-4d8edd0c9fc0">
91
- <p id="_511aaa98-4116-42af-8e5b-c87cdf5bfdc8">[durationUnits] is essentially a duration statement without the "P" prefix. "P" is unnecessary because between "G" and "U" duration is always expressed.</p>
92
- </note>
93
- </formula>
94
- <formula id="_be9158af-7e93-4ee2-90c5-26d31c181935">
95
- <stem type="AsciiMath">r = 1 %</stem>
96
- </formula>
97
- </foreword></preface>
98
- </iso-standard>
399
+ <iso-standard xmlns='http://riboseinc.com/isoxml'>
400
+ <preface>
401
+ <foreword>
402
+ <formula id='_be9158af-7e93-4ee2-90c5-26d31c181934' unnumbered='true'>
403
+ <stem type='AsciiMath'>r = 1 %</stem>
404
+ <dl id='_e4fe94fe-1cde-49d9-b1ad-743293b7e21d'>
405
+ <dt>
406
+ <stem type='AsciiMath'>r</stem>
407
+ </dt>
408
+ <dd>
409
+ <p id='_1b99995d-ff03-40f5-8f2e-ab9665a69b77'>is the repeatability limit.</p>
410
+ </dd>
411
+ <dt>
412
+ <stem type='AsciiMath'>s_1</stem>
413
+ </dt>
414
+ <dd>
415
+ <p id='_1b99995d-ff03-40f5-8f2e-ab9665a69b77'>is the other repeatability limit.</p>
416
+ </dd>
417
+ </dl>
418
+ <note id='_83083c7a-6c85-43db-a9fa-4d8edd0c9fc0'>
419
+ <p id='_511aaa98-4116-42af-8e5b-c87cdf5bfdc8'>
420
+ [durationUnits] is essentially a duration statement without the "P"
421
+ prefix. "P" is unnecessary because between "G" and "U" duration is
422
+ always expressed.
423
+ </p>
424
+ </note>
425
+ </formula>
426
+ <formula id='_be9158af-7e93-4ee2-90c5-26d31c181935'>
427
+ <name>1</name>
428
+ <stem type='AsciiMath'>r = 1 %</stem>
429
+ </formula>
430
+ </foreword>
431
+ </preface>
432
+ </iso-standard>
99
433
  INPUT
100
434
  <div>
101
435
  <h1 class='ForewordTitle'>Foreword</h1>
@@ -129,7 +463,7 @@ RSpec.describe IsoDoc do
129
463
  </table>
130
464
  <div id='_83083c7a-6c85-43db-a9fa-4d8edd0c9fc0' class='Note'>
131
465
  <p class='Note'>
132
- <span class='note_label'>NOTE</span>
466
+ <span class='note_label'/>
133
467
  <span style='mso-tab-count:1'>&#160; </span>
134
468
  [durationUnits] is essentially a duration statement without the "P"
135
469
  prefix. "P" is unnecessary because between "G" and "U" duration is
@@ -167,7 +501,7 @@ RSpec.describe IsoDoc do
167
501
  <p id="_511aaa98-4116-42af-8e5b-c87cdf5bfdc8">[durationUnits] is essentially a duration statement without the "P" prefix. "P" is unnecessary because between "G" and "U" duration is always expressed.</p>
168
502
  </note>
169
503
  </formula>
170
- <formula id="_be9158af-7e93-4ee2-90c5-26d31c181935">
504
+ <formula id="_be9158af-7e93-4ee2-90c5-26d31c181935"><name>1</name>
171
505
  <stem type="AsciiMath">r = 1 %</stem>
172
506
  </formula>
173
507
  </foreword></preface>
@@ -184,7 +518,7 @@ RSpec.describe IsoDoc do
184
518
  </span>
185
519
  <p id='_1b99995d-ff03-40f5-8f2e-ab9665a69b77'>is the repeatability limit.</p>
186
520
 
187
- <div id="_83083c7a-6c85-43db-a9fa-4d8edd0c9fc0" class="Note"><p><span class="note_label">NOTE</span>&#160; [durationUnits] is essentially a duration statement without the "P" prefix. "P" is unnecessary because between "G" and "U" duration is always expressed.</p></div>
521
+ <div id="_83083c7a-6c85-43db-a9fa-4d8edd0c9fc0" class="Note"><p>&#160; [durationUnits] is essentially a duration statement without the "P" prefix. "P" is unnecessary because between "G" and "U" duration is always expressed.</p></div>
188
522
  </div>
189
523
 
190
524
  <div id="_be9158af-7e93-4ee2-90c5-26d31c181935"><div class="formula"><p><span class="stem">(#(r = 1 %)#)</span>&#160; (1)</p></div></div>
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
 
3
3
  RSpec.describe IsoDoc do
4
4
  it "processes English" do
5
- expect(xmlpp(IsoDoc::Iso::HtmlConvert.new({}).convert("test", <<~"INPUT", true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
5
+ input = <<~INPUT
6
6
  <iso-standard xmlns="http://riboseinc.com/isoxml">
7
7
  <bibdata>
8
8
  <language>en</language>
@@ -17,7 +17,7 @@ RSpec.describe IsoDoc do
17
17
  </clause>
18
18
  <p>This is patent boilerplate</p>
19
19
  </introduction></preface><sections>
20
- <clause id="D" obligation="normative">
20
+ <clause id="D" obligation="normative" type="scope">
21
21
  <title>Scope</title>
22
22
  <p id="E">Text</p>
23
23
  </clause>
@@ -70,6 +70,98 @@ RSpec.describe IsoDoc do
70
70
  </bibliography>
71
71
  </iso-standard>
72
72
  INPUT
73
+
74
+ presxml = <<~OUTPUT
75
+ <iso-standard xmlns='http://riboseinc.com/isoxml'>
76
+ <bibdata>
77
+ <language>en</language>
78
+ </bibdata>
79
+ <preface>
80
+ <foreword obligation='informative'>
81
+ <title>Foreword</title>
82
+ <p id='A'>This is a preamble</p>
83
+ </foreword>
84
+ <introduction id='B' obligation='informative'>
85
+ <title depth='1'>0<tab/>Introduction</title>
86
+ <clause id='C' inline-header='false' obligation='informative'>
87
+ <title depth='2'>0.1<tab/>Introduction Subsection</title>
88
+ </clause>
89
+ <p>This is patent boilerplate</p>
90
+ </introduction>
91
+ </preface>
92
+ <sections>
93
+ <clause id='D' obligation='normative' type='scope'>
94
+ <title depth='1'>1<tab/>Scope</title>
95
+ <p id='E'>Text</p>
96
+ </clause>
97
+ <clause id='H' obligation='normative'>
98
+ <title depth='1'>3<tab/>Terms, definitions, symbols and abbreviated terms</title>
99
+ <terms id='I' obligation='normative'>
100
+ <title depth='2'>3.1<tab/>Normal Terms</title>
101
+ <term id='J'>
102
+ <name>3.1.1</name>
103
+ <preferred>Term2</preferred>
104
+ </term>
105
+ </terms>
106
+ <definitions id='K' inline-header='true'>
107
+ <title>3.2</title>
108
+ <dl>
109
+ <dt>Symbol</dt>
110
+ <dd>Definition</dd>
111
+ </dl>
112
+ </definitions>
113
+ </clause>
114
+ <definitions id='L'>
115
+ <title>4</title>
116
+ <dl>
117
+ <dt>Symbol</dt>
118
+ <dd>Definition</dd>
119
+ </dl>
120
+ </definitions>
121
+ <clause id='M' inline-header='false' obligation='normative'>
122
+ <title depth='1'>5<tab/>Clause 4</title>
123
+ <clause id='N' inline-header='false' obligation='normative'>
124
+ <title depth='2'>5.1<tab/>Introduction</title>
125
+ </clause>
126
+ <clause id='O' inline-header='false' obligation='normative'>
127
+ <title depth='2'>5.2<tab/>Clause 4.2</title>
128
+ </clause>
129
+ </clause>
130
+ </sections>
131
+ <annex id='P' inline-header='false' obligation='normative'>
132
+ <title>
133
+ <strong>Annex A</strong>
134
+ <br/>
135
+ (normative)
136
+ <br/>
137
+ <br/>
138
+ <strong>Annex</strong>
139
+ </title>
140
+ <clause id='Q' inline-header='false' obligation='normative'>
141
+ <title depth='2'>A.1<tab/>Annex A.1</title>
142
+ <clause id='Q1' inline-header='false' obligation='normative'>
143
+ <title depth='3'>A.1.1<tab/>Annex A.1a</title>
144
+ </clause>
145
+ </clause>
146
+ <appendix id='Q2' inline-header='false' obligation='normative'>
147
+ <title depth='2'>Appendix 1<tab/>An Appendix</title>
148
+ </appendix>
149
+ </annex>
150
+ <bibliography>
151
+ <references id='R' obligation='informative' normative='true'>
152
+ <title depth='1'>2<tab/>Normative References</title>
153
+ </references>
154
+ <clause id='S' obligation='informative'>
155
+ <title depth='1'>Bibliography</title>
156
+ <references id='T' obligation='informative' normative='false'>
157
+ <title depth='2'>Bibliography Subsection</title>
158
+ </references>
159
+ </clause>
160
+ </bibliography>
161
+ </iso-standard>
162
+ OUTPUT
163
+
164
+ html = <<~OUTPUT
73
165
  #{HTML_HDR}
74
166
  <br/>
75
167
  <div>
@@ -90,7 +182,7 @@ RSpec.describe IsoDoc do
90
182
  <p id="E">Text</p>
91
183
  </div>
92
184
  <div>
93
- <h1>2&#160; Normative references</h1>
185
+ <h1>2&#160; Normative References</h1>
94
186
  </div>
95
187
  <div id="H"><h1>3&#160; Terms, definitions, symbols and abbreviated terms</h1>
96
188
  <div id="I"><h2>3.1&#160; Normal Terms</h2>
@@ -98,11 +190,14 @@ RSpec.describe IsoDoc do
98
190
  <p class="TermNum" id="J">3.1.1</p>
99
191
  <p class="Terms" style="text-align:left;">Term2</p>
100
192
 
101
- </div><div id="K"><h2>3.2&#160; Symbols and abbreviated terms</h2>
193
+ </div><div id="K">
194
+ <span class='zzMoveToFollowing'>
195
+ <b>3.2&#160; </b>
196
+ </span>
102
197
  <dl><dt><p>Symbol</p></dt><dd>Definition</dd></dl>
103
198
  </div></div>
104
199
  <div id="L" class="Symbols">
105
- <h1>4&#160; Symbols and abbreviated terms</h1>
200
+ <h1>4</h1>
106
201
  <dl>
107
202
  <dt>
108
203
  <p>Symbol</p>
@@ -143,10 +238,12 @@ RSpec.describe IsoDoc do
143
238
  </body>
144
239
  </html>
145
240
  OUTPUT
241
+ expect(xmlpp(IsoDoc::Iso::PresentationXMLConvert.new({}).convert("test", input, true))).to be_equivalent_to xmlpp(presxml)
242
+ expect(xmlpp(IsoDoc::Iso::HtmlConvert.new({}).convert("test", presxml, true))).to be_equivalent_to xmlpp(html)
146
243
  end
147
244
 
148
245
  it "defaults to English" do
149
- expect(xmlpp(IsoDoc::Iso::HtmlConvert.new({}).convert("test", <<~"INPUT", true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
246
+ expect(xmlpp(IsoDoc::Iso::PresentationXMLConvert.new({}).convert("test", <<~"INPUT", true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
150
247
  <iso-standard xmlns="http://riboseinc.com/isoxml">
151
248
  <bibdata>
152
249
  <language>tlh</language>
@@ -161,7 +258,7 @@ RSpec.describe IsoDoc do
161
258
  </clause>
162
259
  <p>This is patent boilerplate</p>
163
260
  </introduction></preface><sections>
164
- <clause id="D" obligation="normative">
261
+ <clause id="D" obligation="normative" type="scope">
165
262
  <title>Scope</title>
166
263
  <p id="E">Text</p>
167
264
  </clause>
@@ -214,84 +311,147 @@ RSpec.describe IsoDoc do
214
311
  </bibliography>
215
312
  </iso-standard>
216
313
  INPUT
217
- #{HTML_HDR.gsub(/"en"/, '"tlh"')}
218
- <br/>
219
- <div>
220
- <h1 class="ForewordTitle">Foreword</h1>
221
- <p id="A">This is a preamble</p>
222
- </div>
223
- <br/>
224
- <div class="Section3" id="B">
225
- <h1 class="IntroTitle">0&#160; Introduction</h1>
226
- <div id="C"><h2>0.1&#160; Introduction Subsection</h2>
227
-
228
- </div>
229
- <p>This is patent boilerplate</p>
230
- </div>
231
- <p class="zzSTDTitle1"/>
232
- <div id="D">
233
- <h1>1&#160; Scope</h1>
234
- <p id="E">Text</p>
235
- </div>
236
- <div>
237
- <h1>2&#160; Normative references</h1>
238
- </div>
239
- <div id="H"><h1>3&#160; Terms, definitions, symbols and abbreviated terms</h1>
240
- <div id="I"><h2>3.1&#160; Normal Terms</h2>
241
-
242
- <p class="TermNum" id="J">3.1.1</p>
243
- <p class="Terms" style="text-align:left;">Term2</p>
244
-
245
- </div><div id="K"><h2>3.2&#160; Symbols and abbreviated terms</h2>
246
- <dl><dt><p>Symbol</p></dt><dd>Definition</dd></dl>
247
- </div></div>
248
- <div id="L" class="Symbols">
249
- <h1>4&#160; Symbols and abbreviated terms</h1>
314
+ <iso-standard xmlns='http://riboseinc.com/isoxml'>
315
+ <bibdata>
316
+ <language>tlh</language>
317
+ </bibdata>
318
+ <preface>
319
+ <foreword obligation='informative'>
320
+ <title>Foreword</title>
321
+ <p id='A'>This is a preamble</p>
322
+ </foreword>
323
+ <introduction id='B' obligation='informative'>
324
+ <title depth='1'>
325
+ 0
326
+ <tab/>
327
+ Introduction
328
+ </title>
329
+ <clause id='C' inline-header='false' obligation='informative'>
330
+ <title depth='2'>
331
+ 0.1
332
+ <tab/>
333
+ Introduction Subsection
334
+ </title>
335
+ </clause>
336
+ <p>This is patent boilerplate</p>
337
+ </introduction>
338
+ </preface>
339
+ <sections>
340
+ <clause id='D' obligation='normative' type='scope'>
341
+ <title depth='1'>
342
+ 1
343
+ <tab/>
344
+ Scope
345
+ </title>
346
+ <p id='E'>Text</p>
347
+ </clause>
348
+ <clause id='H' obligation='normative'>
349
+ <title depth='1'>
350
+ 3
351
+ <tab/>
352
+ Terms, definitions, symbols and abbreviated terms
353
+ </title>
354
+ <terms id='I' obligation='normative'>
355
+ <title depth='2'>
356
+ 3.1
357
+ <tab/>
358
+ Normal Terms
359
+ </title>
360
+ <term id='J'>
361
+ <name>3.1.1</name>
362
+ <preferred>Term2</preferred>
363
+ </term>
364
+ </terms>
365
+ <definitions id='K' inline-header='true'>
366
+ <title>3.2</title>
250
367
  <dl>
251
- <dt>
252
- <p>Symbol</p>
253
- </dt>
368
+ <dt>Symbol</dt>
254
369
  <dd>Definition</dd>
255
370
  </dl>
256
- </div>
257
- <div id="M">
258
- <h1>5&#160; Clause 4</h1>
259
- <div id="N"><h2>5.1&#160; Introduction</h2>
260
-
261
- </div>
262
- <div id="O"><h2>5.2&#160; Clause 4.2</h2>
263
-
264
- </div>
265
- </div>
371
+ </definitions>
372
+ </clause>
373
+ <definitions id='L'>
374
+ <title>4</title>
375
+ <dl>
376
+ <dt>Symbol</dt>
377
+ <dd>Definition</dd>
378
+ </dl>
379
+ </definitions>
380
+ <clause id='M' inline-header='false' obligation='normative'>
381
+ <title depth='1'>
382
+ 5
383
+ <tab/>
384
+ Clause 4
385
+ </title>
386
+ <clause id='N' inline-header='false' obligation='normative'>
387
+ <title depth='2'>
388
+ 5.1
389
+ <tab/>
390
+ Introduction
391
+ </title>
392
+ </clause>
393
+ <clause id='O' inline-header='false' obligation='normative'>
394
+ <title depth='2'>
395
+ 5.2
396
+ <tab/>
397
+ Clause 4.2
398
+ </title>
399
+ </clause>
400
+ </clause>
401
+ </sections>
402
+ <annex id='P' inline-header='false' obligation='normative'>
403
+ <title>
404
+ <strong>Annex A</strong>
266
405
  <br/>
267
- <div id="P" class="Section3">
268
- <h1 class="Annex"><b>Annex A</b><br/>(normative)<br/><br/><b>Annex</b></h1>
269
- <div id="Q"><h2>A.1&#160; Annex A.1</h2>
270
-
271
- <div id="Q1"><h3>A.1.1&#160; Annex A.1a</h3>
272
-
273
- </div>
274
- </div>
275
- <div id="Q2"><h2>Appendix 1&#160; An Appendix</h2>
276
-
277
- </div>
278
- </div>
406
+ (normative)
279
407
  <br/>
280
- <div>
281
- <h1 class="Section3">Bibliography</h1>
282
- <div>
283
- <h2 class="Section3">Bibliography Subsection</h2>
284
- </div>
285
- </div>
286
- </div>
287
- </body>
288
- </html>
408
+ <br/>
409
+ <strong>Annex</strong>
410
+ </title>
411
+ <clause id='Q' inline-header='false' obligation='normative'>
412
+ <title depth='2'>
413
+ A.1
414
+ <tab/>
415
+ Annex A.1
416
+ </title>
417
+ <clause id='Q1' inline-header='false' obligation='normative'>
418
+ <title depth='3'>
419
+ A.1.1
420
+ <tab/>
421
+ Annex A.1a
422
+ </title>
423
+ </clause>
424
+ </clause>
425
+ <appendix id='Q2' inline-header='false' obligation='normative'>
426
+ <title depth='2'>
427
+ Appendix 1
428
+ <tab/>
429
+ An Appendix
430
+ </title>
431
+ </appendix>
432
+ </annex>
433
+ <bibliography>
434
+ <references id='R' obligation='informative' normative='true'>
435
+ <title depth='1'>
436
+ 2
437
+ <tab/>
438
+ Normative References
439
+ </title>
440
+ </references>
441
+ <clause id='S' obligation='informative'>
442
+ <title depth='1'>Bibliography</title>
443
+ <references id='T' obligation='informative' normative='false'>
444
+ <title depth='2'>Bibliography Subsection</title>
445
+ </references>
446
+ </clause>
447
+ </bibliography>
448
+ </iso-standard>
289
449
  OUTPUT
290
450
  end
291
451
 
292
452
  it "processes French" do
293
- expect(xmlpp(IsoDoc::Iso::HtmlConvert.new({}).convert("test", <<~"INPUT", true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
294
- <iso-standard xmlns="http://riboseinc.com/isoxml">
453
+ input = <<~INPUT
454
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
295
455
  <bibdata>
296
456
  <language>fr</language>
297
457
  </bibdata>
@@ -305,7 +465,7 @@ RSpec.describe IsoDoc do
305
465
  </clause>
306
466
  <p>This is patent boilerplate</p>
307
467
  </introduction></preface><sections>
308
- <clause id="D" obligation="normative">
468
+ <clause id="D" obligation="normative" type="scope">
309
469
  <title>Scope</title>
310
470
  <p id="E">Text</p>
311
471
  </clause>
@@ -344,7 +504,7 @@ RSpec.describe IsoDoc do
344
504
  <title>Annex A.1a</title>
345
505
  </clause>
346
506
  </clause>
347
- <appendix id="Q2" inline-header="false" obligation="normative">
507
+ <appendix id="Q2" inline-header="false" obligation="normative">
348
508
  <title>An Appendix</title>
349
509
  </appendix>
350
510
  </annex><bibliography><references id="R" obligation="informative" normative="true">
@@ -357,11 +517,102 @@ RSpec.describe IsoDoc do
357
517
  </clause>
358
518
  </bibliography>
359
519
  </iso-standard>
360
- INPUT
520
+ INPUT
521
+
522
+ presxml = <<~OUTPUT
523
+ <iso-standard xmlns='http://riboseinc.com/isoxml'>
524
+ <bibdata>
525
+ <language>fr</language>
526
+ </bibdata>
527
+ <preface>
528
+ <foreword obligation='informative'>
529
+ <title>Foreword</title>
530
+ <p id='A'>This is a preamble</p>
531
+ </foreword>
532
+ <introduction id='B' obligation='informative'>
533
+ <title depth='1'>0<tab/>Introduction</title>
534
+ <clause id='C' inline-header='false' obligation='informative'>
535
+ <title depth='2'>0.1<tab/>Introduction Subsection</title>
536
+ </clause>
537
+ <p>This is patent boilerplate</p>
538
+ </introduction>
539
+ </preface>
540
+ <sections>
541
+ <clause id='D' obligation='normative' type='scope'>
542
+ <title depth='1'>1<tab/>Scope</title>
543
+ <p id='E'>Text</p>
544
+ </clause>
545
+ <clause id='H' obligation='normative'>
546
+ <title depth='1'>3<tab/>Terms, definitions, symbols and abbreviated terms</title>
547
+ <terms id='I' obligation='normative'>
548
+ <title depth='2'>3.1<tab/>Normal Terms</title>
549
+ <term id='J'>
550
+ <name>3.1.1</name>
551
+ <preferred>Term2</preferred>
552
+ </term>
553
+ </terms>
554
+ <definitions id='K' inline-header='true'>
555
+ <title>3.2</title>
556
+ <dl>
557
+ <dt>Symbol</dt>
558
+ <dd>Definition</dd>
559
+ </dl>
560
+ </definitions>
561
+ </clause>
562
+ <definitions id='L'>
563
+ <title>4</title>
564
+ <dl>
565
+ <dt>Symbol</dt>
566
+ <dd>Definition</dd>
567
+ </dl>
568
+ </definitions>
569
+ <clause id='M' inline-header='false' obligation='normative'>
570
+ <title depth='1'>5<tab/>Clause 4</title>
571
+ <clause id='N' inline-header='false' obligation='normative'>
572
+ <title depth='2'>5.1<tab/>Introduction</title>
573
+ </clause>
574
+ <clause id='O' inline-header='false' obligation='normative'>
575
+ <title depth='2'>5.2<tab/>Clause 4.2</title>
576
+ </clause>
577
+ </clause>
578
+ </sections>
579
+ <annex id='P' inline-header='false' obligation='normative'>
580
+ <title>
581
+ <strong>Annexe A</strong>
582
+ <br/>
583
+ (normative)
584
+ <br/>
585
+ <br/>
586
+ <strong>Annex</strong>
587
+ </title>
588
+ <clause id='Q' inline-header='false' obligation='normative'>
589
+ <title depth='2'>A.1<tab/>Annex A.1</title>
590
+ <clause id='Q1' inline-header='false' obligation='normative'>
591
+ <title depth='3'>A.1.1<tab/>Annex A.1a</title>
592
+ </clause>
593
+ </clause>
594
+ <appendix id='Q2' inline-header='false' obligation='normative'>
595
+ <title depth='2'>Appendice 1<tab/>An Appendix</title>
596
+ </appendix>
597
+ </annex>
598
+ <bibliography>
599
+ <references id='R' obligation='informative' normative='true'>
600
+ <title depth='1'>2<tab/>Normative References</title>
601
+ </references>
602
+ <clause id='S' obligation='informative'>
603
+ <title depth='1'>Bibliography</title>
604
+ <references id='T' obligation='informative' normative='false'>
605
+ <title depth='2'>Bibliography Subsection</title>
606
+ </references>
607
+ </clause>
608
+ </bibliography>
609
+ </iso-standard>
610
+ OUTPUT
611
+ html = <<~OUTPUT
361
612
  #{HTML_HDR.gsub(/"en"/, '"fr"')}
362
613
  <br/>
363
614
  <div>
364
- <h1 class="ForewordTitle">Avant-propos</h1>
615
+ <h1 class="ForewordTitle">Foreword</h1>
365
616
  <p id="A">This is a preamble</p>
366
617
  </div>
367
618
  <br/>
@@ -374,23 +625,26 @@ RSpec.describe IsoDoc do
374
625
  </div>
375
626
  <p class="zzSTDTitle1"/>
376
627
  <div id="D">
377
- <h1>1&#160; Domaine d'application</h1>
628
+ <h1>1&#160; Scope</h1>
378
629
  <p id="E">Text</p>
379
630
  </div>
380
631
  <div>
381
- <h1>2&#160; R&#233;f&#233;rences normatives</h1>
632
+ <h1>2&#160; Normative References</h1>
382
633
  </div>
383
- <div id="H"><h1>3&#160; Terms, d&#233;finitions, symboles et termes abr&#233;g&#233;s</h1>
634
+ <div id="H"><h1>3&#160; Terms, definitions, symbols and abbreviated terms</h1>
384
635
  <div id="I"><h2>3.1&#160; Normal Terms</h2>
385
636
 
386
637
  <p class="TermNum" id="J">3.1.1</p>
387
638
  <p class="Terms" style="text-align:left;">Term2</p>
388
639
 
389
- </div><div id="K"><h2>3.2&#160; Symboles et termes abr&#233;g&#233;s</h2>
640
+ </div><div id="K">
641
+ <span class='zzMoveToFollowing'>
642
+ <b>3.2&#160; </b>
643
+ </span>
390
644
  <dl><dt><p>Symbol</p></dt><dd>Definition</dd></dl>
391
645
  </div></div>
392
646
  <div id="L" class="Symbols">
393
- <h1>4&#160; Symboles et termes abr&#233;g&#233;s</h1>
647
+ <h1>4</h1>
394
648
  <dl>
395
649
  <dt>
396
650
  <p>Symbol</p>
@@ -422,7 +676,7 @@ RSpec.describe IsoDoc do
422
676
  </div>
423
677
  <br/>
424
678
  <div>
425
- <h1 class="Section3">Bibliographie</h1>
679
+ <h1 class="Section3">Bibliography</h1>
426
680
  <div>
427
681
  <h2 class="Section3">Bibliography Subsection</h2>
428
682
  </div>
@@ -431,10 +685,12 @@ RSpec.describe IsoDoc do
431
685
  </body>
432
686
  </html>
433
687
  OUTPUT
688
+ expect(xmlpp(IsoDoc::Iso::PresentationXMLConvert.new({}).convert("test", input, true))).to be_equivalent_to xmlpp(presxml)
689
+ expect(xmlpp(IsoDoc::Iso::HtmlConvert.new({}).convert("test", presxml, true))).to be_equivalent_to xmlpp(html)
434
690
  end
435
691
 
436
- it "processes Simplified Chinese" do
437
- expect(xmlpp(IsoDoc::Iso::HtmlConvert.new({}).convert("test", <<~"INPUT", true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
692
+ it "processes Simplified Chinese" do
693
+ input = <<~INPUT
438
694
  <iso-standard xmlns="http://riboseinc.com/isoxml">
439
695
  <bibdata>
440
696
  <language>zh</language>
@@ -450,7 +706,7 @@ RSpec.describe IsoDoc do
450
706
  </clause>
451
707
  <p>This is patent boilerplate</p>
452
708
  </introduction></preface><sections>
453
- <clause id="D" obligation="normative">
709
+ <clause id="D" obligation="normative" type="scope">
454
710
  <title>Scope</title>
455
711
  <p id="E"><eref type="inline" bibitemid="ISO712"><locality type="table"><referenceFrom>1</referenceFrom><referenceTo>1</referenceTo></locality></eref></p>
456
712
  </clause>
@@ -513,42 +769,144 @@ RSpec.describe IsoDoc do
513
769
  </bibliography>
514
770
  </iso-standard>
515
771
  INPUT
772
+ presxml = <<~OUTPUT
773
+ <iso-standard xmlns='http://riboseinc.com/isoxml'>
774
+ <bibdata>
775
+ <language>zh</language>
776
+ <script>Hans</script>
777
+ </bibdata>
778
+ <preface>
779
+ <foreword obligation='informative'>
780
+ <title>Foreword</title>
781
+ <p id='A'>This is a preamble</p>
782
+ </foreword>
783
+ <introduction id='B' obligation='informative'>
784
+ <title depth='1'>0<tab/>Introduction</title>
785
+ <clause id='C' inline-header='false' obligation='informative'>
786
+ <title depth='2'>0.1<tab/>Introduction Subsection</title>
787
+ </clause>
788
+ <p>This is patent boilerplate</p>
789
+ </introduction>
790
+ </preface>
791
+ <sections>
792
+ <clause id='D' obligation='normative' type="scope">
793
+ <title depth='1'>1<tab/>Scope</title>
794
+ <p id='E'>
795
+ <eref type='inline' bibitemid='ISO712'><locality type='table'><referenceFrom>1</referenceFrom><referenceTo>1</referenceTo></locality>ISO 712&#x3001;&#x7B2C;1&#x2013;1&#x8868;</eref>
796
+ </p>
797
+ </clause>
798
+ <clause id='H' obligation='normative'>
799
+ <title depth='1'>3<tab/>Terms, definitions, symbols and abbreviated terms</title>
800
+ <terms id='I' obligation='normative'>
801
+ <title depth='2'>3.1<tab/>Normal Terms</title>
802
+ <term id='J'>
803
+ <name>3.1.1</name>
804
+ <preferred>Term2</preferred>
805
+ </term>
806
+ </terms>
807
+ <definitions id='K' inline-header="true">
808
+ <title>3.2</title>
809
+ <dl>
810
+ <dt>Symbol</dt>
811
+ <dd>Definition</dd>
812
+ </dl>
813
+ </definitions>
814
+ </clause>
815
+ <definitions id='L'>
816
+ <title>4</title>
817
+ <dl>
818
+ <dt>Symbol</dt>
819
+ <dd>Definition</dd>
820
+ </dl>
821
+ </definitions>
822
+ <clause id='M' inline-header='false' obligation='normative'>
823
+ <title depth='1'>5<tab/>Clause 4</title>
824
+ <clause id='N' inline-header='false' obligation='normative'>
825
+ <title depth='2'>5.1<tab/>Introduction</title>
826
+ </clause>
827
+ <clause id='O' inline-header='false' obligation='normative'>
828
+ <title depth='2'>5.2<tab/>Clause 4.2</title>
829
+ </clause>
830
+ </clause>
831
+ </sections>
832
+ <annex id='P' inline-header='false' obligation='normative'>
833
+ <title><strong>&#x9644;&#x4EF6;A</strong><br/>&#xFF08;&#x89C4;&#x8303;&#x6027;&#x9644;&#x5F55;&#xFF09;<br/><br/><strong>Annex</strong>
834
+ </title>
835
+ <clause id='Q' inline-header='false' obligation='normative'>
836
+ <title depth='2'>A.1<tab/>Annex A.1</title>
837
+ <clause id='Q1' inline-header='false' obligation='normative'>
838
+ <title depth='3'>A.1.1<tab/>Annex A.1a</title>
839
+ </clause>
840
+ </clause>
841
+ <appendix id='Q2' inline-header='false' obligation='normative'>
842
+ <title depth='2'>&#x9644;&#x5F55;1<tab/>An Appendix</title>
843
+ </appendix>
844
+ </annex>
845
+ <bibliography>
846
+ <references id='R' obligation='informative' normative='true'>
847
+ <title depth='1'>2<tab/>Normative References</title>
848
+ <bibitem id='ISO712' type='standard'>
849
+ <title format='text/plain'>Cereals and cereal products</title>
850
+ <docidentifier>ISO 712</docidentifier>
851
+ <contributor>
852
+ <role type='publisher'/>
853
+ <organization>
854
+ <abbreviation>ISO</abbreviation>
855
+ </organization>
856
+ </contributor>
857
+ </bibitem>
858
+ </references>
859
+ <clause id='S' obligation='informative'>
860
+ <title depth='1'>Bibliography</title>
861
+ <references id='T' obligation='informative' normative='false'>
862
+ <title depth="2">Bibliography Subsection</title>
863
+ </references>
864
+ </clause>
865
+ </bibliography>
866
+ </iso-standard>
867
+ OUTPUT
868
+
869
+ html = <<~OUTPUT
516
870
  #{HTML_HDR.gsub(/"en"/, '"zh"')}
517
871
  <br/>
518
872
  <div>
519
- <h1 class="ForewordTitle">&#21069;&#35328;</h1>
873
+ <h1 class="ForewordTitle">Foreword</h1>
520
874
  <p id="A">This is a preamble</p>
521
875
  </div>
522
876
  <br/>
523
877
  <div class="Section3" id="B">
524
- <h1 class="IntroTitle">0&#160; &#24341;&#35328;</h1>
525
- <div id="C"><h2>0.1&#160; Introduction Subsection</h2>
878
+ <h1 class="IntroTitle">0&#12288;Introduction</h1>
879
+ <div id="C"><h2>0.1&#12288;Introduction Subsection</h2>
526
880
 
527
881
  </div>
528
882
  <p>This is patent boilerplate</p>
529
883
  </div>
530
884
  <p class="zzSTDTitle1"/>
531
885
  <div id="D">
532
- <h1>1&#160; &#33539;&#22260;</h1>
886
+ <h1>1&#12288;Scope</h1>
533
887
  <p id="E">
534
- <a href="#ISO712">ISO 712&#12289;&#31532;1&#8211;<referenceto>1</referenceto>&#34920;</a>
888
+ <a href='#ISO712'>ISO 712&#12289;&#31532;1&#8211;1&#34920;</a>
535
889
  </p>
536
890
  </div>
537
891
  <div>
538
- <h1>2&#160; &#35268;&#33539;&#24615;&#24341;&#29992;&#25991;&#20214;</h1>
539
- <p id="ISO712" class="NormRef">ISO 712, <i> Cereals and cereal products</i></p>
892
+ <h1>2&#12288;Normative References</h1>
893
+ <p id="ISO712" class="NormRef">ISO 712, <i>Cereals and cereal products</i></p>
540
894
  </div>
541
- <div id="H"><h1>3&#160; &#26415;&#35821;&#12289;&#23450;&#20041;&#12289;&#31526;&#21495;&#12289;&#20195;&#21495;&#21644;&#32553;&#30053;&#35821;</h1>
542
- <div id="I"><h2>3.1&#160; Normal Terms</h2>
895
+ <div id="H">
896
+ <h1>3&#12288;Terms, definitions, symbols and abbreviated terms</h1>
897
+ <div id="I"><h2>3.1&#12288;Normal Terms</h2>
543
898
 
544
899
  <p class="TermNum" id="J">3.1.1</p>
545
900
  <p class="Terms" style="text-align:left;">Term2</p>
546
901
 
547
- </div><div id="K"><h2>3.2&#160; &#31526;&#21495;&#12289;&#20195;&#21495;&#21644;&#32553;&#30053;&#35821;</h2>
902
+ </div><div id="K">
903
+ <span class='zzMoveToFollowing'>
904
+ <b>3.2&#12288;</b>
905
+ </span>
548
906
  <dl><dt><p>Symbol</p></dt><dd>Definition</dd></dl>
549
907
  </div></div>
550
908
  <div id="L" class="Symbols">
551
- <h1>4&#160; &#31526;&#21495;&#12289;&#20195;&#21495;&#21644;&#32553;&#30053;&#35821;</h1>
909
+ <h1>4</h1>
552
910
  <dl>
553
911
  <dt>
554
912
  <p>Symbol</p>
@@ -557,30 +915,30 @@ RSpec.describe IsoDoc do
557
915
  </dl>
558
916
  </div>
559
917
  <div id="M">
560
- <h1>5&#160; Clause 4</h1>
561
- <div id="N"><h2>5.1&#160; Introduction</h2>
918
+ <h1>5&#12288;Clause 4</h1>
919
+ <div id="N"><h2>5.1&#12288;Introduction</h2>
562
920
 
563
921
  </div>
564
- <div id="O"><h2>5.2&#160; Clause 4.2</h2>
922
+ <div id="O"><h2>5.2&#12288;Clause 4.2</h2>
565
923
 
566
924
  </div>
567
925
  </div>
568
926
  <br/>
569
927
  <div id="P" class="Section3">
570
- <h1 class="Annex">&#38468;&#20214;A<br/>&#65288;&#35268;&#33539;&#24615;&#38468;&#24405;&#65289;<br/><br/><b>Annex</b></h1>
571
- <div id="Q"><h2>A.1&#160; Annex A.1</h2>
928
+ <h1 class="Annex"><b>&#38468;&#20214;A</b><br/>&#65288;&#35268;&#33539;&#24615;&#38468;&#24405;&#65289;<br/><br/><b>Annex</b></h1>
929
+ <div id="Q"><h2>A.1&#12288;Annex A.1</h2>
572
930
 
573
- <div id="Q1"><h3>A.1.1&#160; Annex A.1a</h3>
931
+ <div id="Q1"><h3>A.1.1&#12288;Annex A.1a</h3>
574
932
 
575
933
  </div>
576
934
  </div>
577
- <div id="Q2"><h2>&#38468;&#24405;1&#160; An Appendix</h2>
935
+ <div id="Q2"><h2>&#38468;&#24405;1&#12288;An Appendix</h2>
578
936
 
579
937
  </div>
580
938
  </div>
581
939
  <br/>
582
940
  <div>
583
- <h1 class="Section3">&#21442;&#32771;&#25991;&#29486;</h1>
941
+ <h1 class="Section3">Bibliography</h1>
584
942
  <div>
585
943
  <h2 class="Section3">Bibliography Subsection</h2>
586
944
  </div>
@@ -589,6 +947,8 @@ RSpec.describe IsoDoc do
589
947
  </body>
590
948
  </html>
591
949
  OUTPUT
950
+ expect(xmlpp(IsoDoc::Iso::PresentationXMLConvert.new({}).convert("test", input, true))).to be_equivalent_to xmlpp(presxml)
951
+ expect(xmlpp(IsoDoc::Iso::HtmlConvert.new({}).convert("test", presxml, true))).to be_equivalent_to xmlpp(html)
592
952
  end
593
953
 
594
954
  end