isodoc 1.2.6 → 1.4.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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +69 -0
  3. data/README.adoc +1 -3
  4. data/isodoc.gemspec +2 -1
  5. data/lib/isodoc-yaml/i18n-en.yaml +56 -0
  6. data/lib/isodoc-yaml/i18n-fr.yaml +64 -7
  7. data/lib/isodoc-yaml/i18n-zh-Hans.yaml +1 -0
  8. data/lib/isodoc/base_style/all.css +4 -0
  9. data/lib/isodoc/base_style/blocks.scss +2 -2
  10. data/lib/isodoc/base_style/reset.css +4 -0
  11. data/lib/isodoc/base_style/reset.scss +5 -0
  12. data/lib/isodoc/base_style/typography.scss +1 -1
  13. data/lib/isodoc/convert.rb +13 -98
  14. data/lib/isodoc/css.rb +95 -0
  15. data/lib/isodoc/function/inline.rb +0 -33
  16. data/lib/isodoc/function/inline_simple.rb +4 -1
  17. data/lib/isodoc/function/lists.rb +2 -1
  18. data/lib/isodoc/function/references.rb +8 -13
  19. data/lib/isodoc/function/section.rb +1 -1
  20. data/lib/isodoc/function/table.rb +10 -0
  21. data/lib/isodoc/function/to_word_html.rb +2 -2
  22. data/lib/isodoc/gem_tasks.rb +4 -0
  23. data/lib/isodoc/html_function/html.rb +1 -0
  24. data/lib/isodoc/html_function/mathvariant_to_plain.rb +82 -0
  25. data/lib/isodoc/html_function/postprocess.rb +41 -20
  26. data/lib/isodoc/i18n.rb +15 -2
  27. data/lib/isodoc/metadata.rb +28 -109
  28. data/lib/isodoc/metadata_contributor.rb +91 -0
  29. data/lib/isodoc/metadata_date.rb +6 -0
  30. data/lib/isodoc/presentation_function/bibdata.rb +79 -7
  31. data/lib/isodoc/presentation_function/block.rb +14 -9
  32. data/lib/isodoc/presentation_function/inline.rb +126 -22
  33. data/lib/isodoc/presentation_function/section.rb +9 -0
  34. data/lib/isodoc/presentation_xml_convert.rb +5 -0
  35. data/lib/isodoc/version.rb +1 -1
  36. data/lib/isodoc/word_convert.rb +0 -20
  37. data/lib/isodoc/word_function/body.rb +12 -0
  38. data/lib/isodoc/word_function/postprocess.rb +38 -80
  39. data/lib/isodoc/word_function/postprocess_cover.rb +55 -0
  40. data/lib/isodoc/word_function/table.rb +10 -0
  41. data/lib/isodoc/xref.rb +1 -0
  42. data/lib/isodoc/xref/xref_counter.rb +20 -9
  43. data/lib/isodoc/xref/xref_gen.rb +20 -2
  44. data/lib/isodoc/xref/xref_sect_gen.rb +1 -1
  45. data/spec/assets/html.scss +14 -0
  46. data/spec/assets/i18n.yaml +17 -9
  47. data/spec/isodoc/blocks_spec.rb +89 -241
  48. data/spec/isodoc/cleanup_spec.rb +0 -1
  49. data/spec/isodoc/footnotes_spec.rb +4 -5
  50. data/spec/isodoc/i18n_spec.rb +73 -38
  51. data/spec/isodoc/inline_spec.rb +177 -199
  52. data/spec/isodoc/lists_spec.rb +1 -1
  53. data/spec/isodoc/metadata_spec.rb +50 -7
  54. data/spec/isodoc/postproc_spec.rb +472 -11
  55. data/spec/isodoc/presentation_xml_spec.rb +584 -1
  56. data/spec/isodoc/ref_spec.rb +327 -12
  57. data/spec/isodoc/table_spec.rb +28 -0
  58. data/spec/isodoc/xref_spec.rb +162 -17
  59. data/spec/spec_helper.rb +2 -0
  60. metadata +22 -7
  61. data/.github/workflows/macos.yml +0 -42
  62. data/.github/workflows/ubuntu.yml +0 -62
  63. data/.github/workflows/windows.yml +0 -44
@@ -203,7 +203,7 @@ RSpec.describe IsoDoc do
203
203
  <br/>
204
204
  <div>
205
205
  <h1 class="ForewordTitle">Foreword</h1>
206
- <ol type="a" id="_ae34a226-aab4-496d-987b-1aa7b6314026">
206
+ <ol type="I" id="_ae34a226-aab4-496d-987b-1aa7b6314026">
207
207
  <li id="_ae34a226-aab4-496d-987b-1aa7b6314027">
208
208
  <p id="_0091a277-fb0e-424a-aea8-f0001303fe78">all information necessary for the complete identification of the sample;</p>
209
209
  </li>
@@ -18,6 +18,8 @@ RSpec.describe IsoDoc do
18
18
  <uri type="pdf">URL D</uri>
19
19
  <uri type="doc">URL E</uri>
20
20
  <docidentifier>17301-1</docidentifier>
21
+ <docidentifier type="ISBN">ISBN 13</docidentifier>
22
+ <docidentifier type="ISBN10">ISBN 10</docidentifier>
21
23
  <docnumber>17301</docnumber>
22
24
  <date type="published"><on>2011</on></date>
23
25
  <date type="accessed"><on>2012</on></date>
@@ -58,6 +60,8 @@ RSpec.describe IsoDoc do
58
60
  </name>
59
61
  <affiliation>
60
62
  <organization><name>Slate Inc.</name>
63
+ <subdivision>Hermeneutics Unit</subdivision>
64
+ <subdivision>Exegesis Subunit</subdivision>
61
65
  <address>
62
66
  <formattedAddress>Bedrock</formattedAddress>
63
67
  </address>
@@ -98,15 +102,13 @@ RSpec.describe IsoDoc do
98
102
  <doctype>international-standard</doctype>
99
103
  </ext>
100
104
  </bibdata>
101
- <local_bibdata type="standard">
102
- </local_bibdata>
103
105
  </iso-standard>
104
106
  INPUT
105
107
  {:accesseddate=>"2012",
106
108
  :activateddate=>"2013",
107
109
  :agency=>"ISO",
108
110
  :authors=>["Barney Rubble", "Fred Flintstone"],
109
- :authors_affiliations=>{"Slate Inc., Bedrock"=>["Barney Rubble"], ""=>["Fred Flintstone"]},
111
+ :authors_affiliations=>{"Slate Inc., Hermeneutics Unit, Exegesis Subunit, Bedrock"=>["Barney Rubble"], ""=>["Fred Flintstone"]},
110
112
  :circulateddate=>"2015",
111
113
  :confirmeddate=>"2017",
112
114
  :copieddate=>"2016",
@@ -116,24 +118,31 @@ INPUT
116
118
  :docnumeric=>"17301",
117
119
  :doctitle=>"Cereals and pulses",
118
120
  :doctype=>"International Standard",
121
+ :doctype_display=>"International Standard",
119
122
  :docyear=>"2016",
120
123
  :draft=>"0.4",
121
124
  :draftinfo=>" (draft 0.4, 2016-05-01)",
122
125
  :edition=>"2",
123
126
  :html=>"URL B",
124
127
  :implementeddate=>"XXX",
128
+ :isbn=>"ISBN 13",
129
+ :isbn10=>"ISBN 10",
125
130
  :issueddate=>"XXX",
126
131
  :iteration=>"2",
127
132
  :keywords=>["KW2", "KW1", "KW3"],
133
+ :lang=>"en",
128
134
  :obsoleteddate=>"2014",
129
135
  :pdf=>"URL D",
130
136
  :publisheddate=>"2011",
131
137
  :receiveddate=>"XXX",
132
138
  :revdate=>"2016-05-01",
133
139
  :revdate_monthyear=>"May 2016",
140
+ :script=>"Latn",
134
141
  :stage=>"Committee Draft",
142
+ :stage_display=>"Committee Draft",
135
143
  :stageabbr=>"CD",
136
144
  :substage=>"Withdrawn",
145
+ :substage_display=>"Withdrawn",
137
146
  :title_footnote=>["A footnote", "Another footnote"],
138
147
  :transmitteddate=>"2020",
139
148
  :unchangeddate=>"2019",
@@ -234,11 +243,13 @@ INPUT
234
243
  :docnumeric=>"17301",
235
244
  :doctitle=>"Cereals and pulses",
236
245
  :doctype=>"International Standard",
246
+ :doctype_display=>"International Standard",
237
247
  :docyear=>"2016",
238
248
  :draft=>"12",
239
249
  :draftinfo=>" (draft 12, 2016-05)",
240
250
  :implementeddate=>"XXX",
241
251
  :issueddate=>"XXX",
252
+ :lang=>"en",
242
253
  :obsoleteddate=>"XXX",
243
254
  :obsoletes=>"IEC 8121",
244
255
  :obsoletes_part=>"3.1",
@@ -253,7 +264,9 @@ INPUT
253
264
  :receiveddate=>"XXX",
254
265
  :revdate=>"2016-05",
255
266
  :revdate_monthyear=>"May 2016",
267
+ :script=>"Latn",
256
268
  :stage=>"Published",
269
+ :stage_display=>"Published",
257
270
  :subdivision=>"Subdivision",
258
271
  :transmitteddate=>"XXX",
259
272
  :unchangeddate=>"XXX",
@@ -271,6 +284,17 @@ OUTPUT
271
284
  <bibdata type="standard">
272
285
  <language>fr</language>
273
286
  <script>Latn</script>
287
+ <status>
288
+ <stage lang="">Committee Draft</stage>
289
+ <stage lang=fr">Projet de comité</stage>
290
+ <substage lang="">Withdrawn</substage>
291
+ <substage lang="fr">Rétiré</substage>
292
+ <iteration>2</iteration>
293
+ </status>
294
+ <ext>
295
+ <doctype lang="">international-standard</doctype>
296
+ <doctype lang="fr">Standard international</doctype>
297
+ </ext>
274
298
  </bibdata>
275
299
  </iso-standard>
276
300
  INPUT
@@ -307,7 +331,13 @@ OUTPUT
307
331
  </contributor>
308
332
  <language>fr</language>
309
333
  <script>Latn</script>
310
- <status><stage>Published</stage></status>
334
+ <status>
335
+ <stage language="">Committee Draft</stage>
336
+ <stage language="fr">Projet de comité</stage>
337
+ <substage language="">Withdrawn</substage>
338
+ <substage language="fr">Rétiré</substage>
339
+ <iteration>2</iteration>
340
+ </status>
311
341
  <copyright>
312
342
  <from>2016</from>
313
343
  <owner>
@@ -316,6 +346,10 @@ OUTPUT
316
346
  </organization>
317
347
  </owner>
318
348
  </copyright>
349
+ <ext>
350
+ <doctype language="">international-standard</doctype>
351
+ <doctype language="fr">Standard international</doctype>
352
+ </ext>
319
353
  </bibdata>
320
354
  </iso-standard>
321
355
  INPUT
@@ -327,20 +361,29 @@ INPUT
327
361
  :createddate=>"XXX",
328
362
  :docnumber=>"17301-1-3",
329
363
  :docnumeric=>"17301",
330
- :doctitle=>"Cereals and pulses",
364
+ :doctitle=>"Céréales et légumineuses",
365
+ :doctype=>"International Standard",
366
+ :doctype_display=>"Standard International",
331
367
  :docyear=>"2016",
332
368
  :implementeddate=>"XXX",
333
369
  :issueddate=>"XXX",
370
+ :iteration=>"2",
371
+ :lang=>"fr",
334
372
  :obsoleteddate=>"XXX",
335
373
  :publisheddate=>"2011-01",
336
374
  :publisher=>"International Organization for Standardization et International Electrotechnical Commission",
337
375
  :receiveddate=>"XXX",
338
376
  :revdate=>"2016-05",
339
377
  :revdate_monthyear=>"Mai 2016",
340
- :stage=>"Published",
378
+ :script=>"Latn",
379
+ :stage=>"Committee Draft",
380
+ :stage_display=>"Projet De Comité",
381
+ :stageabbr=>"CD",
382
+ :substage=>"Withdrawn",
383
+ :substage_display=>"Rétiré",
341
384
  :transmitteddate=>"XXX",
342
385
  :unchangeddate=>"XXX",
343
- :unpublished=>false,
386
+ :unpublished=>true,
344
387
  :updateddate=>"XXX",
345
388
  :vote_endeddate=>"XXX",
346
389
  :vote_starteddate=>"XXX"}
@@ -139,7 +139,7 @@ expect(File.exist?("test.doc")).to be true
139
139
  it "generates HTML output docs with complete configuration" do
140
140
  FileUtils.rm_f "test.doc"
141
141
  FileUtils.rm_f "test.html"
142
- IsoDoc::HtmlConvert.new({bodyfont: "Zapf", htmlstylesheet: "spec/assets/html.scss", htmlcoverpage: "spec/assets/htmlcover.html", htmlintropage: "spec/assets/htmlintro.html", scripts: "spec/assets/scripts.html", i18nyaml: "spec/assets/i18n.yaml", ulstyle: "l1", olstyle: "l2"}).convert("test", <<~"INPUT", false)
142
+ IsoDoc::HtmlConvert.new({bodyfont: "Zapf", monospacefont: "Consolas", headerfont: "Comic Sans", normalfontsize: "30pt", monospacefontsize: "29pt", smallerfontsize: "28pt", footnotefontsize: "27pt", htmlstylesheet: "spec/assets/html.scss", htmlcoverpage: "spec/assets/htmlcover.html", htmlintropage: "spec/assets/htmlintro.html", scripts: "spec/assets/scripts.html", i18nyaml: "spec/assets/i18n.yaml", ulstyle: "l1", olstyle: "l2"}).convert("test", <<~"INPUT", false)
143
143
  <iso-standard xmlns="http://riboseinc.com/isoxml">
144
144
  <preface><foreword>
145
145
  <note>
@@ -150,7 +150,13 @@ expect(File.exist?("test.doc")).to be true
150
150
  INPUT
151
151
  html = File.read("test.html")
152
152
  expect(html).to match(/another empty stylesheet/)
153
- expect(html).to match(/font-family: Zapf/)
153
+ expect(html).to match(/p \{[^}]*?font-family: Zapf/m)
154
+ expect(html).to match(/code \{[^}]*?font-family: Consolas/m)
155
+ expect(html).to match(/h1 \{[^}]*?font-family: Comic Sans/m)
156
+ expect(html).to match(/p \{[^}]*?font-size: 30pt/m)
157
+ expect(html).to match(/code \{[^}]*?font-size: 29pt/m)
158
+ expect(html).to match(/p\.note \{[^}]*?font-size: 28pt/m)
159
+ expect(html).to match(/aside \{[^}]*?font-size: 27pt/m)
154
160
  expect(html).to match(/an empty html cover page/)
155
161
  expect(html).to match(/an empty html intro page/)
156
162
  expect(html).to match(/This is > a script/)
@@ -172,7 +178,13 @@ expect(File.exist?("test.doc")).to be true
172
178
  INPUT
173
179
  html = File.read("test.html")
174
180
  expect(html).to match(/another empty stylesheet/)
175
- expect(html).to match(/font-family: Arial/)
181
+ expect(html).to match(/p \{[^}]*?font-family: Arial/m)
182
+ expect(html).to match(/code \{[^}]*?font-family: Courier/m)
183
+ expect(html).to match(/h1 \{[^}]*?font-family: Arial/m)
184
+ expect(html).to match(/p \{[^}]*?font-size: 1em;/m)
185
+ expect(html).to match(/code \{[^}]*?font-size: 0.8em/m)
186
+ expect(html).to match(/p\.note \{[^}]*?font-size: 0.9em/m)
187
+ expect(html).to match(/aside \{[^}]*?font-size: 0.9em/m)
176
188
  expect(html).to match(/an empty html cover page/)
177
189
  expect(html).to match(/an empty html intro page/)
178
190
  expect(html).to match(/This is > a script/)
@@ -183,7 +195,7 @@ expect(File.exist?("test.doc")).to be true
183
195
  it "generates Word output docs with complete configuration" do
184
196
  FileUtils.rm_f "test.doc"
185
197
  FileUtils.rm_f "test.html"
186
- IsoDoc::WordConvert.new({bodyfont: "Zapf", wordstylesheet: "spec/assets/html.scss", standardstylesheet: "spec/assets/std.css", header: "spec/assets/header.html", wordcoverpage: "spec/assets/wordcover.html", wordintropage: "spec/assets/wordintro.html", i18nyaml: "spec/assets/i18n.yaml", ulstyle: "l1", olstyle: "l2"}).convert("test", <<~"INPUT", false)
198
+ IsoDoc::WordConvert.new({bodyfont: "Zapf", monospacefont: "Consolas", headerfont: "Comic Sans", normalfontsize: "30pt", monospacefontsize: "29pt", smallerfontsize: "28pt", footnotefontsize: "27pt", wordstylesheet: "spec/assets/html.scss", standardstylesheet: "spec/assets/std.css", header: "spec/assets/header.html", wordcoverpage: "spec/assets/wordcover.html", wordintropage: "spec/assets/wordintro.html", i18nyaml: "spec/assets/i18n.yaml", ulstyle: "l1", olstyle: "l2"}).convert("test", <<~"INPUT", false)
187
199
  <iso-standard xmlns="http://riboseinc.com/isoxml">
188
200
  <preface><foreword>
189
201
  <note>
@@ -194,7 +206,13 @@ expect(File.exist?("test.doc")).to be true
194
206
  INPUT
195
207
  word = File.read("test.doc")
196
208
  expect(word).to match(/another empty stylesheet/)
197
- expect(word).to match(/font-family: Zapf/)
209
+ expect(word).to match(/p \{[^}]*?font-family: Zapf/m)
210
+ expect(word).to match(/code \{[^}]*?font-family: Consolas/m)
211
+ expect(word).to match(/h1 \{[^}]*?font-family: Comic Sans/m)
212
+ expect(word).to match(/p \{[^}]*?font-size: 30pt/m)
213
+ expect(word).to match(/code \{[^}]*?font-size: 29pt/m)
214
+ expect(word).to match(/p\.note \{[^}]*?font-size: 28pt/m)
215
+ expect(word).to match(/aside \{[^}]*?font-size: 27pt/m)
198
216
  expect(word).to match(/a third empty stylesheet/)
199
217
  #expect(word).to match(/<title>test<\/title>/)
200
218
  expect(word).to match(/test_files\/header.html/)
@@ -217,7 +235,13 @@ expect(File.exist?("test.doc")).to be true
217
235
  INPUT
218
236
  word = File.read("test.doc")
219
237
  expect(word).to match(/another empty stylesheet/)
220
- expect(word).to match(/font-family: Arial/)
238
+ expect(word).to match(/p \{[^}]*?font-family: Arial/m)
239
+ expect(word).to match(/code \{[^}]*?font-family: Courier/m)
240
+ expect(word).to match(/h1 \{[^}]*?font-family: Arial/m)
241
+ expect(word).to match(/p \{[^}]*?font-size: 12pt/m)
242
+ expect(word).to match(/code \{[^}]*?font-size: 11pt/m)
243
+ expect(word).to match(/p\.note \{[^}]*?font-size: 10pt/m)
244
+ expect(word).to match(/aside \{[^}]*?font-size: 9pt/m)
221
245
  expect(word).to match(/a third empty stylesheet/)
222
246
  #expect(word).to match(/<title>test<\/title>/)
223
247
  expect(word).to match(/test_files\/header.html/)
@@ -512,7 +536,7 @@ TOCLEVEL
512
536
  <p id="_ff27c067-2785-4551-96cf-0a73530ff1e6">This is a footnote.</p>
513
537
  </fn><clause id="N" inline-header="false" obligation="normative">
514
538
  <title>Introduction to this<fn reference="2">
515
- <p id="_ff27c067-2785-4551-96cf-0a73530ff1e6">Formerly denoted as 15 % (m/m).</p>
539
+ Formerly denoted as 15 % (m/m).
516
540
  </fn></title>
517
541
  </clause>
518
542
  <clause id="O" inline-header="false" obligation="normative">
@@ -548,7 +572,7 @@ TOCLEVEL
548
572
  </a>This is a footnote.</p>
549
573
  <a href="#fnref:1">&#x21A9;</a></aside>
550
574
  <aside id="fn:2" class="footnote">
551
- <p id="_ff27c067-2785-4551-96cf-0a73530ff1e6"><a class='FootnoteRef' href='#fn:2'><sup>2</sup></a>Formerly denoted as 15 % (m/m).</p>
575
+ <a class='FootnoteRef' href='#fn:2'><sup>2</sup></a>Formerly denoted as 15 % (m/m).
552
576
  <a href="#fnref:2">&#x21A9;</a></aside>
553
577
  </main>
554
578
  OUTPUT
@@ -593,6 +617,169 @@ TOCLEVEL
593
617
 
594
618
  end
595
619
 
620
+ describe "mathvariant to plain" do
621
+ context "when `mathvariant` attr equal to `script`" do
622
+ it "converts mathvariant text chars into associated plain chars" do
623
+ FileUtils.rm_f "test.html"
624
+ FileUtils.rm_rf "test_htmlimages"
625
+ input = <<~INPUT
626
+ <?xml version="1.0" encoding="UTF-8"?>
627
+ <iso-standard xmlns="https://www.metanorma.org/ns/iso" type="semantic" version="1.5.14">
628
+ <sections>
629
+ <clause id="_clause" inline-header="false" obligation="normative">
630
+ <title>Clause</title>
631
+ <p id="_20514f5a-9f86-454e-b6ce-927f65ba6441">
632
+ <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML">
633
+ <mi>x</mi>
634
+ <mo>=</mo>
635
+ <mstyle mathvariant="script">
636
+ <mi>l</mi>
637
+ </mstyle>
638
+ <mo>+</mo>
639
+ <mn>1</mn>
640
+ </math></stem>
641
+ </p>
642
+ </clause>
643
+ </sections>
644
+ </iso-standard>
645
+ INPUT
646
+ output = <<~OUTPUT
647
+ <main class="main-section"><button onclick="topFunction()" id="myBtn" title="Go to top">Top</button>
648
+ <p class="zzSTDTitle1"></p>
649
+ <div id="_clause">
650
+ <h1>Clause</h1>
651
+ <p id="_20514f5a-9f86-454e-b6ce-927f65ba6441">
652
+ <span class="stem"><math xmlns="http://www.w3.org/1998/Math/MathML">
653
+ <mi>x</mi>
654
+ <mo>=</mo>
655
+ <mstyle mathvariant="script">
656
+ <mi>&#x1D4C1;</mi>
657
+ </mstyle>
658
+ <mo>+</mo>
659
+ <mn>1</mn>
660
+ </math></span>
661
+ </p>
662
+ </div>
663
+ </main>
664
+ OUTPUT
665
+ IsoDoc::HtmlConvert.new({}).convert("test", input, false)
666
+ html = File.read("test.html")
667
+ .sub(/^.*<main class="main-section">/m, '<main class="main-section">')
668
+ .sub(%r{</main>.*$}m, "</main>")
669
+ expect(html).to(be_equivalent_to(output))
670
+ end
671
+ end
672
+
673
+ context "when complex `mathvariant` combinations" do
674
+ it "converts mathvariant text chars into associated plain chars" do
675
+ FileUtils.rm_f "test.html"
676
+ FileUtils.rm_rf "test_htmlimages"
677
+ input = <<~INPUT
678
+ <?xml version="1.0" encoding="UTF-8"?>
679
+ <iso-standard xmlns="https://www.metanorma.org/ns/iso" type="semantic" version="1.5.14">
680
+ <sections>
681
+ <clause id="_clause" inline-header="false" obligation="normative">
682
+ <title>Clause</title>
683
+ <p id="_20514f5a-9f86-454e-b6ce-927f65ba6441">
684
+ <stem type="MathML">
685
+ <math xmlns="http://www.w3.org/1998/Math/MathML">
686
+ <mstyle mathvariant="sans-serif">
687
+ <mfrac>
688
+ <mrow>
689
+ <mrow>
690
+ <mi>n</mi>
691
+ <mfenced open="(" close=")">
692
+ <mrow>
693
+ <mstyle mathvariant="bold">
694
+ <mrow>
695
+ <mi>n</mi>
696
+ <mo>+</mo>
697
+ <mn>1</mn>
698
+ <mo>+</mo>
699
+ <mstyle mathvariant="italic">
700
+ <mi>x</mi>
701
+ </mstyle>
702
+ </mrow>
703
+ </mstyle>
704
+ </mrow>
705
+ </mfenced>
706
+ </mrow>
707
+ </mrow>
708
+ <mrow>
709
+ <mstyle mathvariant="bold">
710
+ <mrow>
711
+ <mi>y</mi>
712
+ <mo>+</mo>
713
+ <mstyle mathvariant="fraktur">
714
+ <mi>z</mi>
715
+ </mstyle>
716
+ </mrow>
717
+ </mstyle>
718
+ </mrow>
719
+ </mfrac>
720
+ </mstyle>
721
+ </math>
722
+ </stem>
723
+ </p>
724
+ </clause>
725
+ </sections>
726
+ </iso-standard>
727
+ INPUT
728
+ output = <<~OUTPUT
729
+ <main class="main-section"><button onclick="topFunction()" id="myBtn" title="Go to top">Top</button>
730
+ <p class="zzSTDTitle1"></p>
731
+ <div id="_clause">
732
+ <h1>Clause</h1>
733
+ <p id="_20514f5a-9f86-454e-b6ce-927f65ba6441">
734
+ <span class="stem"><math xmlns="http://www.w3.org/1998/Math/MathML">
735
+ <mstyle mathvariant="sans-serif">
736
+ <mfrac>
737
+ <mrow>
738
+ <mrow>
739
+ <mi>&#x1D5C7;</mi>
740
+ <mfenced open="(" close=")">
741
+ <mrow>
742
+ <mstyle mathvariant="bold">
743
+ <mrow>
744
+ <mi>&#x1D5FB;</mi>
745
+ <mo>+</mo>
746
+ <mn>&#x1D7ED;</mn>
747
+ <mo>+</mo>
748
+ <mstyle mathvariant="italic">
749
+ <mi>&#x1D66D;</mi>
750
+ </mstyle>
751
+ </mrow>
752
+ </mstyle>
753
+ </mrow>
754
+ </mfenced>
755
+ </mrow>
756
+ </mrow>
757
+ <mrow>
758
+ <mstyle mathvariant="bold">
759
+ <mrow>
760
+ <mi>&#x1D606;</mi>
761
+ <mo>+</mo>
762
+ <mstyle mathvariant="fraktur">
763
+ <mi>&#x1D59F;</mi>
764
+ </mstyle>
765
+ </mrow>
766
+ </mstyle>
767
+ </mrow>
768
+ </mfrac>
769
+ </mstyle>
770
+ </math></span>
771
+ </p>
772
+ </div>
773
+ </main>
774
+ OUTPUT
775
+ IsoDoc::HtmlConvert.new({}).convert("test", input, false)
776
+ html = File.read("test.html")
777
+ .sub(/^.*<main class="main-section">/m, '<main class="main-section">')
778
+ .sub(%r{</main>.*$}m, "</main>")
779
+ expect(html).to(be_equivalent_to(output))
780
+ end
781
+ end
782
+ end
596
783
 
597
784
  it "moves images in HTML with no file suffix" do
598
785
  FileUtils.rm_f "test.html"
@@ -905,6 +1092,7 @@ TOCLEVEL
905
1092
  </m:r>
906
1093
  </m:oMath>
907
1094
  </span>
1095
+ <span style='mso-tab-count:1'>&#xA0; </span>
908
1096
  </p>
909
1097
  </div>
910
1098
  </div>
@@ -1022,7 +1210,7 @@ TOCLEVEL
1022
1210
  OUTPUT
1023
1211
  end
1024
1212
 
1025
- it "deals with image captions (Word)" do
1213
+ it "deals with image captions (Word)" do
1026
1214
  FileUtils.rm_f "test.doc"
1027
1215
  FileUtils.rm_f "test.html"
1028
1216
  IsoDoc::WordConvert.new({wordstylesheet: "spec/assets/word.css", htmlstylesheet: "spec/assets/html.scss"}).convert("test", <<~"INPUT", false)
@@ -1341,7 +1529,7 @@ expect(xmlpp(html.sub(/^.*<body /m, "<body ").sub(%r{</body>.*$}m, "</body>"))).
1341
1529
  <div class='Section3' id=''>
1342
1530
  <h1 class='IntroTitle'>Preface 1</h1>
1343
1531
  <p align='center' style='text-align:center;' class='MsoNormal'>
1344
- This is a
1532
+ This is a
1345
1533
  <p class='MsoNormal'>
1346
1534
  <br clear='all' class='section'/>
1347
1535
  </p>
@@ -1387,7 +1575,7 @@ expect(xmlpp(html.sub(/^.*<body /m, "<body ").sub(%r{</body>.*$}m, "</body>"))).
1387
1575
  <p class='Note'>
1388
1576
  <span class='note_label'/>
1389
1577
  <span style='mso-tab-count:1'>&#xA0; </span>
1390
- For further information on the Foreword, see
1578
+ For further information on the Foreword, see
1391
1579
  <b>ISO/IEC Directives, Part 2, 2016, Clause 12.</b>
1392
1580
  </p>
1393
1581
  <p class='Note'>
@@ -1569,4 +1757,277 @@ OUTPUT
1569
1757
  OUTPUT
1570
1758
  end
1571
1759
 
1760
+
1761
+ it "allocate widths to tables (Word)" do
1762
+ expect(xmlpp(IsoDoc::WordConvert.new({wordstylesheet: "spec/assets/word.css", htmlstylesheet: "spec/assets/html.scss", filename: "test"}).word_cleanup(Nokogiri::XML(<<~INPUT)).to_xml).sub(/^.*<main/m, "<main").sub(%r{</main>.*$}m, "</main>")).to be_equivalent_to xmlpp(<<~"OUTPUT")
1763
+ <html xmlns:epub="http://www.idpf.org/2007/ops" lang="en">
1764
+ <head><style/></head>
1765
+ <body lang='EN-US' link='blue' vlink='#954F72'>
1766
+ <div class='WordSection1'>
1767
+ <p>&#160;</p>
1768
+ </div>
1769
+ <p>
1770
+ <br clear='all' class='section'/>
1771
+ </p>
1772
+ <div class='WordSection2'>
1773
+ <p>
1774
+ <br clear='all' style='mso-special-character:line-break;page-break-before:always'/>
1775
+ </p>
1776
+ <div>
1777
+ <h1 class='ForewordTitle'>Foreword</h1>
1778
+ <p class='TableTitle' style='text-align:center;'>
1779
+ Table 1&#160;&#8212; Repeatability and reproducibility of
1780
+ <i>husked</i>
1781
+ rice yield
1782
+ <span style='mso-bookmark:_Ref'>
1783
+ <a class='FootnoteRef' href='#ftn1' epub:type='footnote'>
1784
+ <sup>1</sup>
1785
+ </a>
1786
+ </span>
1787
+ </p>
1788
+ <div align='center' class='table_container'>
1789
+ <table id='tableD-1' class='MsoISOTable' style='mso-table-anchor-horizontal:column;mso-table-overlap:never;border-spacing:0;border-width:1px;page-break-after: avoid;page-break-inside: avoid;' title='tool tip' summary='long desc' width='70%'>
1790
+ <colgroup>
1791
+ <col width='30%'/>
1792
+ <col width='20%'/>
1793
+ <col width='20%'/>
1794
+ <col width='20%'/>
1795
+ <col width='10%'/>
1796
+ </colgroup>
1797
+ <thead>
1798
+ <tr>
1799
+ <td rowspan='2' align='left' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;'>Description</td>
1800
+ <td colspan='4' align='center' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.0pt;mso-border-bottom-alt:solid windowtext 1.0pt;'>Rice sample</td>
1801
+ </tr>
1802
+ <tr>
1803
+ <td align='left' valign="top" style='border-top:none;mso-border-top-alt:none;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;'>Arborio</td>
1804
+ <td align='center' valign="middle" style='border-top:none;mso-border-top-alt:none;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;'>
1805
+ Drago
1806
+ <a href='#tableD-1a' class='TableFootnoteRef'>a</a>
1807
+ <aside>
1808
+ <div id='ftntableD-1a'>
1809
+ <span>
1810
+ <span id='tableD-1a' class='TableFootnoteRef'>a</span>
1811
+ <span style='mso-tab-count:1'>&#160; </span>
1812
+ </span>
1813
+ <p id='_0fe65e9a-5531-408e-8295-eeff35f41a55'>Parboiled rice.</p>
1814
+ </div>
1815
+ </aside>
1816
+ </td>
1817
+ <td align='center' valign="bottom" style='border-top:none;mso-border-top-alt:none;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;'>
1818
+ Balilla
1819
+ <a href='#tableD-1a' class='TableFootnoteRef'>a</a>
1820
+ </td>
1821
+ <td align='center' style='border-top:none;mso-border-top-alt:none;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;'>Thaibonnet</td>
1822
+ </tr>
1823
+ </thead>
1824
+ <tbody>
1825
+ <tr>
1826
+ <th align='left' style='font-weight:bold;border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.0pt;mso-border-bottom-alt:solid windowtext 1.0pt;'>Number of laboratories retained after eliminating outliers</th>
1827
+ <td align='center' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.0pt;mso-border-bottom-alt:solid windowtext 1.0pt;'>13</td>
1828
+ <td align='center' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.0pt;mso-border-bottom-alt:solid windowtext 1.0pt;'>11</td>
1829
+ <td align='center' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.0pt;mso-border-bottom-alt:solid windowtext 1.0pt;'>13</td>
1830
+ <td align='center' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.0pt;mso-border-bottom-alt:solid windowtext 1.0pt;'>13</td>
1831
+ </tr>
1832
+ <tr>
1833
+ <td align='left' style='border-top:none;mso-border-top-alt:none;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;'>Mean value, g/100 g</td>
1834
+ <td align='center' style='border-top:none;mso-border-top-alt:none;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;'>81,2</td>
1835
+ <td align='center' style='border-top:none;mso-border-top-alt:none;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;'>82,0</td>
1836
+ <td align='center' style='border-top:none;mso-border-top-alt:none;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;'>81,8</td>
1837
+ <td align='center' style='border-top:none;mso-border-top-alt:none;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;'>77,7</td>
1838
+ </tr>
1839
+ </tbody>
1840
+ <tfoot>
1841
+ <tr>
1842
+ <td align='left' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;'>
1843
+ Reproducibility limit,
1844
+ <span class='stem'>(#(R)#)</span>
1845
+ (= 2,83
1846
+ <span class='stem'>(#(s_R)#)</span>
1847
+ )
1848
+ </td>
1849
+ <td align='center' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;'>2,89</td>
1850
+ <td align='center' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;'>0,57</td>
1851
+ <td align='center' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;'>2,26</td>
1852
+ <td align='center' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;'>6,06</td>
1853
+ </tr>
1854
+ </tfoot>
1855
+ <table class='dl'>
1856
+ <tr>
1857
+ <td valign='top' align='left'>
1858
+ <p align='left' style='margin-left:0pt;text-align:left;'>Drago</p>
1859
+ </td>
1860
+ <td valign='top'>A type of rice</td>
1861
+ </tr>
1862
+ </table>
1863
+ <div class='Note'>
1864
+ <p class='Note'>
1865
+ <span class='note_label'>NOTE</span>
1866
+ <span style='mso-tab-count:1'>&#160; </span>
1867
+ This is a table about rice
1868
+ </p>
1869
+ </div>
1870
+ </table>
1871
+ </div>
1872
+ <div align='center' class='table_container'>
1873
+ <table id='tableD-2' class='MsoISOTable' style='mso-table-anchor-horizontal:column;mso-table-overlap:never;border-spacing:0;border-width:1px;'>
1874
+ <tbody>
1875
+ <tr>
1876
+ <td style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;'>A</td>
1877
+ </tr>
1878
+ </tbody>
1879
+ </table>
1880
+ </div>
1881
+ </div>
1882
+ <p>&#160;</p>
1883
+ </div>
1884
+ <p>
1885
+ <br clear='all' class='section'/>
1886
+ </p>
1887
+ <div class='WordSection3'>
1888
+ <p class='zzSTDTitle1'/>
1889
+ <aside id='ftn1'>
1890
+ <p>X</p>
1891
+ </aside>
1892
+ </div>
1893
+ </body>
1894
+ </html>
1895
+ INPUT
1896
+ <html xmlns:epub='http://www.idpf.org/2007/ops' lang='en'>
1897
+ <head>
1898
+ <style/>
1899
+ </head>
1900
+ <body lang='EN-US' link='blue' vlink='#954F72'>
1901
+ <div class='WordSection1'>
1902
+ <p>&#xA0;</p>
1903
+ </div>
1904
+ <p>
1905
+ <br clear='all' class='section'/>
1906
+ </p>
1907
+ <div class='WordSection2'>
1908
+ <p>
1909
+ <br clear='all' style='mso-special-character:line-break;page-break-before:always'/>
1910
+ </p>
1911
+ <div>
1912
+ <h1 class='ForewordTitle'>Foreword</h1>
1913
+ <p class='TableTitle' style='text-align:center;'>
1914
+ Table 1&#xA0;&#x2014; Repeatability and reproducibility of
1915
+ <i>husked</i>
1916
+ rice yield
1917
+ <span style='mso-bookmark:_Ref'>
1918
+ <a class='FootnoteRef' href='#ftn1' epub:type='footnote'>
1919
+ <sup>1</sup>
1920
+ </a>
1921
+ </span>
1922
+ </p>
1923
+ <div align='center' class='table_container'>
1924
+ <table id='tableD-1' class='MsoISOTable' style='mso-table-anchor-horizontal:column;mso-table-overlap:never;border-spacing:0;border-width:1px;page-break-after: avoid;page-break-inside: avoid;' title='tool tip' summary='long desc' width='70%'>
1925
+ <colgroup>
1926
+ <col width='30%'/>
1927
+ <col width='20%'/>
1928
+ <col width='20%'/>
1929
+ <col width='20%'/>
1930
+ <col width='10%'/>
1931
+ </colgroup>
1932
+ <thead>
1933
+ <tr>
1934
+ <td rowspan='2' align='left' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;' width='30.0%'>Description</td>
1935
+ <td colspan='4' align='center' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.0pt;mso-border-bottom-alt:solid windowtext 1.0pt;' width='70.0%'>Rice sample</td>
1936
+ </tr>
1937
+ <tr>
1938
+ <td align='left' valign='top' style='border-top:none;mso-border-top-alt:none;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;' width='20.0%'>Arborio</td>
1939
+ <td align='center' valign='middle' style='border-top:none;mso-border-top-alt:none;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;' width='20.0%'>
1940
+ Drago
1941
+ <a href='#tableD-1a' class='TableFootnoteRef'>a</a>
1942
+ <aside>
1943
+ <div id='ftntableD-1a'>
1944
+ <span>
1945
+ <span id='tableD-1a' class='TableFootnoteRef'>a</span>
1946
+ <span style='mso-tab-count:1'>&#xA0; </span>
1947
+ </span>
1948
+ <p id='_0fe65e9a-5531-408e-8295-eeff35f41a55'>Parboiled rice.</p>
1949
+ </div>
1950
+ </aside>
1951
+ </td>
1952
+ <td align='center' valign='bottom' style='border-top:none;mso-border-top-alt:none;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;' width='20.0%'>
1953
+ Balilla
1954
+ <a href='#tableD-1a' class='TableFootnoteRef'>a</a>
1955
+ </td>
1956
+ <td align='center' style='border-top:none;mso-border-top-alt:none;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;' width='10.0%'>Thaibonnet</td>
1957
+ </tr>
1958
+ </thead>
1959
+ <tbody>
1960
+ <tr>
1961
+ <th align='left' style='font-weight:bold;border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.0pt;mso-border-bottom-alt:solid windowtext 1.0pt;' width='30.0%'>Number of laboratories retained after eliminating outliers</th>
1962
+ <td align='center' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.0pt;mso-border-bottom-alt:solid windowtext 1.0pt;' width='20.0%'>13</td>
1963
+ <td align='center' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.0pt;mso-border-bottom-alt:solid windowtext 1.0pt;' width='20.0%'>11</td>
1964
+ <td align='center' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.0pt;mso-border-bottom-alt:solid windowtext 1.0pt;' width='20.0%'>13</td>
1965
+ <td align='center' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.0pt;mso-border-bottom-alt:solid windowtext 1.0pt;' width='10.0%'>13</td>
1966
+ </tr>
1967
+ <tr>
1968
+ <td align='left' style='border-top:none;mso-border-top-alt:none;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;' width='30.0%'>Mean value, g/100 g</td>
1969
+ <td align='center' style='border-top:none;mso-border-top-alt:none;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;' width='20.0%'>81,2</td>
1970
+ <td align='center' style='border-top:none;mso-border-top-alt:none;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;' width='20.0%'>82,0</td>
1971
+ <td align='center' style='border-top:none;mso-border-top-alt:none;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;' width='20.0%'>81,8</td>
1972
+ <td align='center' style='border-top:none;mso-border-top-alt:none;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;' width='10.0%'>77,7</td>
1973
+ </tr>
1974
+ </tbody>
1975
+ <tfoot>
1976
+ <tr>
1977
+ <td align='left' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;' width='30.0%'>
1978
+ Reproducibility limit,
1979
+ <span class='stem'>(#(R)#)</span>
1980
+ (= 2,83
1981
+ <span class='stem'>(#(s_R)#)</span>
1982
+ )
1983
+ </td>
1984
+ <td align='center' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;' width='20.0%'>2,89</td>
1985
+ <td align='center' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;' width='20.0%'>0,57</td>
1986
+ <td align='center' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;' width='20.0%'>2,26</td>
1987
+ <td align='center' style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;' width='10.0%'>6,06</td>
1988
+ </tr>
1989
+ </tfoot>
1990
+ <div class='Note'>
1991
+ <p class='Note'>
1992
+ <span class='note_label'>NOTE</span>
1993
+ <span style='mso-tab-count:1'>&#xA0; </span>
1994
+ This is a table about rice
1995
+ </p>
1996
+ </div>
1997
+ </table>
1998
+ <table class='dl'>
1999
+ <tr>
2000
+ <td valign='top' align='left'>
2001
+ <p align='left' style='margin-left:0pt;text-align:left;'>Drago</p>
2002
+ </td>
2003
+ <td valign='top'>A type of rice</td>
2004
+ </tr>
2005
+ </table>
2006
+ </div>
2007
+ <div align='center' class='table_container'>
2008
+ <table id='tableD-2' class='MsoISOTable' style='mso-table-anchor-horizontal:column;mso-table-overlap:never;border-spacing:0;border-width:1px;'>
2009
+ <tbody>
2010
+ <tr>
2011
+ <td style='border-top:solid windowtext 1.5pt;mso-border-top-alt:solid windowtext 1.5pt;border-bottom:solid windowtext 1.5pt;mso-border-bottom-alt:solid windowtext 1.5pt;'>A</td>
2012
+ </tr>
2013
+ </tbody>
2014
+ </table>
2015
+ </div>
2016
+ </div>
2017
+ <p>&#xA0;</p>
2018
+ </div>
2019
+ <p>
2020
+ <br clear='all' class='section'/>
2021
+ </p>
2022
+ <div class='WordSection3'>
2023
+ <p class='zzSTDTitle1'/>
2024
+ <aside id='ftn1'>
2025
+ <p>X</p>
2026
+ </aside>
2027
+ </div>
2028
+ </body>
2029
+ </html>
2030
+ OUTPUT
2031
+ end
2032
+
1572
2033
  end