isodoc 1.2.6 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
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