isodoc 1.6.1 → 1.6.6

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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +2 -12
  3. data/.hound.yml +3 -1
  4. data/.rubocop.yml +4 -8
  5. data/Rakefile +2 -2
  6. data/isodoc.gemspec +4 -3
  7. data/lib/isodoc-yaml/i18n-ar.yaml +152 -0
  8. data/lib/isodoc-yaml/i18n-de.yaml +149 -0
  9. data/lib/isodoc-yaml/i18n-en.yaml +1 -0
  10. data/lib/isodoc-yaml/i18n-es.yaml +151 -0
  11. data/lib/isodoc-yaml/i18n-fr.yaml +1 -0
  12. data/lib/isodoc-yaml/i18n-ru.yaml +154 -0
  13. data/lib/isodoc-yaml/i18n-zh-Hans.yaml +1 -0
  14. data/lib/isodoc.rb +0 -2
  15. data/lib/isodoc/common.rb +2 -0
  16. data/lib/isodoc/convert.rb +8 -2
  17. data/lib/isodoc/function/blocks.rb +15 -4
  18. data/lib/isodoc/function/cleanup.rb +52 -43
  19. data/lib/isodoc/function/form.rb +51 -0
  20. data/lib/isodoc/function/inline.rb +8 -7
  21. data/lib/isodoc/function/references.rb +71 -77
  22. data/lib/isodoc/function/section.rb +28 -16
  23. data/lib/isodoc/function/table.rb +22 -22
  24. data/lib/isodoc/function/terms.rb +6 -7
  25. data/lib/isodoc/function/to_word_html.rb +19 -25
  26. data/lib/isodoc/function/utils.rb +181 -163
  27. data/lib/isodoc/gem_tasks.rb +8 -9
  28. data/lib/isodoc/headlesshtml_convert.rb +8 -7
  29. data/lib/isodoc/html_convert.rb +6 -0
  30. data/lib/isodoc/html_function/comments.rb +14 -12
  31. data/lib/isodoc/html_function/footnotes.rb +14 -7
  32. data/lib/isodoc/html_function/form.rb +62 -0
  33. data/lib/isodoc/html_function/html.rb +30 -26
  34. data/lib/isodoc/html_function/postprocess.rb +191 -182
  35. data/lib/isodoc/html_function/sectionsplit.rb +230 -0
  36. data/lib/isodoc/i18n.rb +13 -11
  37. data/lib/isodoc/metadata.rb +22 -20
  38. data/lib/isodoc/metadata_contributor.rb +31 -28
  39. data/lib/isodoc/pdf_convert.rb +11 -13
  40. data/lib/isodoc/presentation_function/bibdata.rb +54 -30
  41. data/lib/isodoc/presentation_function/inline.rb +70 -120
  42. data/lib/isodoc/presentation_function/math.rb +84 -0
  43. data/lib/isodoc/presentation_function/section.rb +55 -19
  44. data/lib/isodoc/presentation_xml_convert.rb +3 -0
  45. data/lib/isodoc/sassc_importer.rb +1 -1
  46. data/lib/isodoc/version.rb +1 -1
  47. data/lib/isodoc/word_function/body.rb +28 -24
  48. data/lib/isodoc/word_function/postprocess.rb +50 -36
  49. data/lib/isodoc/xref.rb +2 -0
  50. data/lib/isodoc/xref/xref_counter.rb +1 -2
  51. data/lib/isodoc/xref/xref_gen.rb +21 -14
  52. data/lib/isodoc/xref/xref_gen_seq.rb +60 -35
  53. data/lib/isodoc/xref/xref_sect_gen.rb +15 -15
  54. data/spec/assets/scripts_override.html +3 -0
  55. data/spec/isodoc/blocks_spec.rb +624 -997
  56. data/spec/isodoc/cleanup_spec.rb +40 -42
  57. data/spec/isodoc/form_spec.rb +156 -0
  58. data/spec/isodoc/i18n_spec.rb +694 -821
  59. data/spec/isodoc/inline_spec.rb +1105 -921
  60. data/spec/isodoc/metadata_spec.rb +384 -379
  61. data/spec/isodoc/postproc_spec.rb +461 -333
  62. data/spec/isodoc/presentation_xml_spec.rb +355 -278
  63. data/spec/isodoc/ref_spec.rb +5 -5
  64. data/spec/isodoc/section_spec.rb +216 -199
  65. data/spec/isodoc/sectionsplit_spec.rb +190 -0
  66. data/spec/isodoc/table_spec.rb +41 -42
  67. data/spec/isodoc/terms_spec.rb +84 -84
  68. data/spec/isodoc/xref_spec.rb +974 -932
  69. metadata +32 -7
@@ -3,6 +3,9 @@
3
3
  require "spec_helper"
4
4
  require "fileutils"
5
5
 
6
+ options = { wordstylesheet: "spec/assets/word.css",
7
+ htmlstylesheet: "spec/assets/html.scss" }
8
+
6
9
  RSpec.describe IsoDoc do
7
10
  it "generates file based on string input" do
8
11
  FileUtils.rm_f "test.doc"
@@ -10,7 +13,7 @@ RSpec.describe IsoDoc do
10
13
  IsoDoc::HtmlConvert.new(
11
14
  { wordstylesheet: "spec/assets/word.css",
12
15
  htmlstylesheet: "spec/assets/html.scss",
13
- filename: "test" }
16
+ filename: "test" },
14
17
  ).convert("test", <<~"INPUT", false)
15
18
  <iso-standard xmlns="http://riboseinc.com/isoxml">
16
19
  <bibdata>
@@ -37,7 +40,7 @@ RSpec.describe IsoDoc do
37
40
  IsoDoc::HtmlConvert.new(
38
41
  { wordstylesheet: "word.css",
39
42
  htmlstylesheet: "html.scss",
40
- filename: "test" }
43
+ filename: "test" },
41
44
  ).convert("spec/assets/test", <<~"INPUT", false)
42
45
  <iso-standard xmlns="http://riboseinc.com/isoxml">
43
46
  <bibdata>
@@ -111,7 +114,7 @@ RSpec.describe IsoDoc do
111
114
  FileUtils.rm_f "test.html"
112
115
  IsoDoc::WordConvert.new(
113
116
  { wordstylesheet: "spec/assets/word.css",
114
- htmlstylesheet: "spec/assets/html.scss" }
117
+ htmlstylesheet: "spec/assets/html.scss" },
115
118
  ).convert("test", <<~"INPUT", false)
116
119
  <iso-standard xmlns="http://riboseinc.com/isoxml">
117
120
  <preface><foreword>
@@ -133,7 +136,7 @@ RSpec.describe IsoDoc do
133
136
  FileUtils.rm_f "spec/assets/iso.html"
134
137
  IsoDoc::HtmlConvert.new(
135
138
  { wordstylesheet: "word.css",
136
- htmlstylesheet: "html.scss" }
139
+ htmlstylesheet: "html.scss" },
137
140
  ).convert("spec/assets/iso.xml", nil, false)
138
141
  expect(File.exist?("spec/assets/iso.html")).to be true
139
142
  html = File.read("spec/assets/iso.html")
@@ -148,7 +151,7 @@ RSpec.describe IsoDoc do
148
151
  FileUtils.rm_f "spec/assets/iso.html"
149
152
  IsoDoc::HeadlessHtmlConvert.new(
150
153
  { wordstylesheet: "word.css",
151
- htmlstylesheet: "html.scss" }
154
+ htmlstylesheet: "html.scss" },
152
155
  ).convert("spec/assets/iso.xml", nil, false)
153
156
  expect(File.exist?("spec/assets/iso.headless.html")).to be true
154
157
  html = File.read("spec/assets/iso.headless.html")
@@ -165,7 +168,7 @@ RSpec.describe IsoDoc do
165
168
  FileUtils.rm_f "spec/assets/iso.doc"
166
169
  IsoDoc::WordConvert.new(
167
170
  { wordstylesheet: "word.css",
168
- htmlstylesheet: "html.scss" }
171
+ htmlstylesheet: "html.scss" },
169
172
  ).convert("spec/assets/iso.xml", nil, false)
170
173
  expect(File.exist?("spec/assets/iso.doc")).to be true
171
174
  word = File.read("spec/assets/iso.doc")
@@ -188,9 +191,10 @@ RSpec.describe IsoDoc do
188
191
  htmlcoverpage: "spec/assets/htmlcover.html",
189
192
  htmlintropage: "spec/assets/htmlintro.html",
190
193
  scripts: "spec/assets/scripts.html",
194
+ scripts_override: "spec/assets/scripts_override.html",
191
195
  i18nyaml: "spec/assets/i18n.yaml",
192
196
  ulstyle: "l1",
193
- olstyle: "l2" }
197
+ olstyle: "l2" },
194
198
  ).convert("test", <<~"INPUT", false)
195
199
  <iso-standard xmlns="http://riboseinc.com/isoxml">
196
200
  <preface><foreword>
@@ -212,6 +216,7 @@ RSpec.describe IsoDoc do
212
216
  expect(html).to match(/an empty html cover page/)
213
217
  expect(html).to match(/an empty html intro page/)
214
218
  expect(html).to match(/This is > a script/)
219
+ expect(html).to match(/This is > also a script/)
215
220
  expect(html).not_to match(/CDATA/)
216
221
  expect(html).to match(%r{Anta&#x16D;parolo</h1>})
217
222
  expect(html).to match(%r{html-override})
@@ -227,7 +232,7 @@ RSpec.describe IsoDoc do
227
232
  scripts: "spec/assets/scripts.html",
228
233
  i18nyaml: "spec/assets/i18n.yaml",
229
234
  ulstyle: "l1",
230
- olstyle: "l2" }
235
+ olstyle: "l2" },
231
236
  ).convert("test", <<~"INPUT", false)
232
237
  <iso-standard xmlns="http://riboseinc.com/isoxml">
233
238
  <preface><foreword>
@@ -272,7 +277,7 @@ RSpec.describe IsoDoc do
272
277
  wordintropage: "spec/assets/wordintro.html",
273
278
  i18nyaml: "spec/assets/i18n.yaml",
274
279
  ulstyle: "l1",
275
- olstyle: "l2" }
280
+ olstyle: "l2" },
276
281
  ).convert("test", <<~"INPUT", false)
277
282
  <iso-standard xmlns="http://riboseinc.com/isoxml">
278
283
  <preface><foreword>
@@ -311,7 +316,7 @@ RSpec.describe IsoDoc do
311
316
  wordintropage: "spec/assets/wordintro.html",
312
317
  i18nyaml: "spec/assets/i18n.yaml",
313
318
  ulstyle: "l1",
314
- olstyle: "l2" }
319
+ olstyle: "l2" },
315
320
  ).convert("test", <<~"INPUT", false)
316
321
  <iso-standard xmlns="http://riboseinc.com/isoxml">
317
322
  <preface><foreword>
@@ -344,7 +349,7 @@ RSpec.describe IsoDoc do
344
349
  FileUtils.rm_f "test.html"
345
350
  IsoDoc::WordConvert.new(
346
351
  { wordstylesheet: "spec/assets/word.css",
347
- htmlstylesheet: "spec/assets/html.scss" }
352
+ htmlstylesheet: "spec/assets/html.scss" },
348
353
  ).convert("test", <<~"INPUT", false)
349
354
  <iso-standard xmlns="http://riboseinc.com/isoxml">
350
355
  <preface><foreword>
@@ -390,7 +395,7 @@ RSpec.describe IsoDoc do
390
395
  FileUtils.rm_f "test.html"
391
396
  IsoDoc::WordConvert.new(
392
397
  { wordstylesheet: "spec/assets/word.css",
393
- htmlstylesheet: "spec/assets/html.scss" }
398
+ htmlstylesheet: "spec/assets/html.scss" },
394
399
  ).convert("test", <<~"INPUT", false)
395
400
  <iso-standard xmlns="http://riboseinc.com/isoxml">
396
401
  <sections>
@@ -426,7 +431,7 @@ RSpec.describe IsoDoc do
426
431
  IsoDoc::WordConvert.new(
427
432
  { wordstylesheet: "spec/assets/word.css",
428
433
  htmlstylesheet: "spec/assets/html.scss",
429
- header: "spec/assets/header.html" }
434
+ header: "spec/assets/header.html" },
430
435
  ).convert("test", <<~"INPUT", false)
431
436
  <iso-standard xmlns="http://riboseinc.com/isoxml">
432
437
  <bibdata type="article">
@@ -454,7 +459,7 @@ RSpec.describe IsoDoc do
454
459
  IsoDoc::WordConvert.new(
455
460
  { wordstylesheet: "spec/assets/word.css",
456
461
  htmlstylesheet: "spec/assets/html.scss",
457
- wordintropage: "spec/assets/wordintro.html" }
462
+ wordintropage: "spec/assets/wordintro.html" },
458
463
  ).convert("test", <<~"INPUT", false)
459
464
  <iso-standard xmlns="http://riboseinc.com/isoxml">
460
465
  <sections>
@@ -478,55 +483,56 @@ RSpec.describe IsoDoc do
478
483
  word = File.read("test.doc")
479
484
  .sub(/^.*<div class="WordSection2">/m, '<div class="WordSection2">')
480
485
  .sub(%r{<p class="MsoNormal">\s*<br clear="all" class="section"/>\s*</p>\s*<div class="WordSection3">.*$}m, "")
481
- expect(xmlpp(word.gsub(/_Toc\d\d+/, "_Toc"))).to be_equivalent_to xmlpp(<<~'OUTPUT')
486
+ expect(xmlpp(word.gsub(/_Toc\d\d+/, "_Toc")))
487
+ .to be_equivalent_to xmlpp(<<~'OUTPUT')
482
488
  <div class="WordSection2">
483
- /* an empty word intro page */
489
+ /* an empty word intro page */
484
490
 
485
- <p class="MsoToc1"><span lang="EN-GB" xml:lang="EN-GB"><span style="mso-element:field-begin"></span><span style="mso-spacerun:yes">&#xA0;</span>TOC
486
- \o "1-2" \h \z \u <span style="mso-element:field-separator"></span></span>
487
- <span class="MsoHyperlink"><span lang="EN-GB" style="mso-no-proof:yes" xml:lang="EN-GB">
488
- <a href="#_Toc">Clause 4<span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">
489
- <span style="mso-tab-count:1 dotted">. </span>
490
- </span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">
491
- <span style="mso-element:field-begin"></span></span>
492
- <span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"> PAGEREF _Toc \h </span>
493
- <span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"><span style="mso-element:field-separator"></span></span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">1</span>
494
- <span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"></span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"><span style="mso-element:field-end"></span></span></a></span></span></p>
495
- <p class="MsoToc2">
496
- <span class="MsoHyperlink">
497
- <span lang="EN-GB" style="mso-no-proof:yes" xml:lang="EN-GB">
498
- <a href="#_Toc">Introduction to this<span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">
499
- <span style="mso-tab-count:1 dotted">. </span>
500
- </span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">
501
- <span style="mso-element:field-begin"></span></span>
502
- <span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"> PAGEREF _Toc \h </span>
503
- <span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"><span style="mso-element:field-separator"></span></span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">1</span>
504
- <span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"></span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"><span style="mso-element:field-end"></span></span></a></span>
505
- </span>
506
- </p>
507
- <p class="MsoToc2">
508
- <span class="MsoHyperlink">
509
- <span lang="EN-GB" style="mso-no-proof:yes" xml:lang="EN-GB">
510
- <a href="#_Toc">Clause 4.2<span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">
511
- <span style="mso-tab-count:1 dotted">. </span>
512
- </span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">
513
- <span style="mso-element:field-begin"></span></span>
514
- <span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"> PAGEREF _Toc \h </span>
515
- <span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"><span style="mso-element:field-separator"></span></span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">1</span>
516
- <span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"></span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"><span style="mso-element:field-end"></span></span></a></span>
517
- </span>
518
- </p>
519
- <p class="MsoToc1">
520
- <span lang="EN-GB" xml:lang="EN-GB">
521
- <span style="mso-element:field-end"></span>
522
- </span>
523
- <span lang="EN-GB" xml:lang="EN-GB">
524
- <p class="MsoNormal">&#xA0;</p>
525
- </span>
526
- </p>
527
- <p class="MsoNormal">&#xA0;</p>
528
- </div>
529
- OUTPUT
491
+ <p class="MsoToc1"><span lang="EN-GB" xml:lang="EN-GB"><span style="mso-element:field-begin"></span><span style="mso-spacerun:yes">&#xA0;</span>TOC
492
+ \o "1-2" \h \z \u <span style="mso-element:field-separator"></span></span>
493
+ <span class="MsoHyperlink"><span lang="EN-GB" style="mso-no-proof:yes" xml:lang="EN-GB">
494
+ <a href="#_Toc">Clause 4<span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">
495
+ <span style="mso-tab-count:1 dotted">. </span>
496
+ </span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">
497
+ <span style="mso-element:field-begin"></span></span>
498
+ <span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"> PAGEREF _Toc \h </span>
499
+ <span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"><span style="mso-element:field-separator"></span></span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">1</span>
500
+ <span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"></span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"><span style="mso-element:field-end"></span></span></a></span></span></p>
501
+ <p class="MsoToc2">
502
+ <span class="MsoHyperlink">
503
+ <span lang="EN-GB" style="mso-no-proof:yes" xml:lang="EN-GB">
504
+ <a href="#_Toc">Introduction to this<span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">
505
+ <span style="mso-tab-count:1 dotted">. </span>
506
+ </span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">
507
+ <span style="mso-element:field-begin"></span></span>
508
+ <span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"> PAGEREF _Toc \h </span>
509
+ <span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"><span style="mso-element:field-separator"></span></span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">1</span>
510
+ <span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"></span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"><span style="mso-element:field-end"></span></span></a></span>
511
+ </span>
512
+ </p>
513
+ <p class="MsoToc2">
514
+ <span class="MsoHyperlink">
515
+ <span lang="EN-GB" style="mso-no-proof:yes" xml:lang="EN-GB">
516
+ <a href="#_Toc">Clause 4.2<span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">
517
+ <span style="mso-tab-count:1 dotted">. </span>
518
+ </span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">
519
+ <span style="mso-element:field-begin"></span></span>
520
+ <span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"> PAGEREF _Toc \h </span>
521
+ <span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"><span style="mso-element:field-separator"></span></span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB">1</span>
522
+ <span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"></span><span lang="EN-GB" class="MsoTocTextSpan" xml:lang="EN-GB"><span style="mso-element:field-end"></span></span></a></span>
523
+ </span>
524
+ </p>
525
+ <p class="MsoToc1">
526
+ <span lang="EN-GB" xml:lang="EN-GB">
527
+ <span style="mso-element:field-end"></span>
528
+ </span>
529
+ <span lang="EN-GB" xml:lang="EN-GB">
530
+ <p class="MsoNormal">&#xA0;</p>
531
+ </span>
532
+ </p>
533
+ <p class="MsoNormal">&#xA0;</p>
534
+ </div>
535
+ OUTPUT
530
536
  end
531
537
 
532
538
  it "populates Word ToC with custom levels" do
@@ -535,7 +541,7 @@ RSpec.describe IsoDoc do
535
541
  { wordstylesheet: "spec/assets/word.css",
536
542
  htmlstylesheet: "spec/assets/html.scss",
537
543
  wordintropage: "spec/assets/wordintro.html",
538
- doctoclevels: 3 }
544
+ doctoclevels: 3 },
539
545
  ).convert("test", <<~"INPUT", false)
540
546
  <iso-standard xmlns="http://riboseinc.com/isoxml">
541
547
  <sections>
@@ -648,7 +654,7 @@ RSpec.describe IsoDoc do
648
654
  IsoDoc::HtmlConvert.new(
649
655
  { wordstylesheet: "spec/assets/word.css",
650
656
  htmlstylesheet: "spec/assets/html.scss",
651
- wordintropage: "spec/assets/wordintro.html" }
657
+ wordintropage: "spec/assets/wordintro.html" },
652
658
  ).convert("test", <<~"INPUT", false)
653
659
  <iso-standard xmlns="http://riboseinc.com/isoxml">
654
660
  <sections>
@@ -669,7 +675,8 @@ RSpec.describe IsoDoc do
669
675
  </iso-standard>
670
676
  INPUT
671
677
  html = File.read("test.html")
672
- .sub(/^.*<main class="main-section">/m, '<main xmlns:epub="epub" class="main-section">')
678
+ .sub(/^.*<main class="main-section">/m,
679
+ '<main xmlns:epub="epub" class="main-section">')
673
680
  .sub(%r{</main>.*$}m, "</main>")
674
681
  expect(xmlpp(html)).to be_equivalent_to xmlpp(<<~"OUTPUT")
675
682
  <main xmlns:epub="epub" class="main-section"><button onclick="topFunction()" id="myBtn" title="Go to top">Top</button>
@@ -704,7 +711,7 @@ RSpec.describe IsoDoc do
704
711
  FileUtils.rm_rf "test_htmlimages"
705
712
  IsoDoc::HtmlConvert.new(
706
713
  { wordstylesheet: "spec/assets/word.css",
707
- htmlstylesheet: "spec/assets/html.scss" }
714
+ htmlstylesheet: "spec/assets/html.scss" },
708
715
  ).convert("test", <<~"INPUT", false)
709
716
  <iso-standard xmlns="http://riboseinc.com/isoxml">
710
717
  <preface><foreword>
@@ -913,7 +920,7 @@ RSpec.describe IsoDoc do
913
920
  FileUtils.rm_rf "test_htmlimages"
914
921
  IsoDoc::HtmlConvert.new(
915
922
  { wordstylesheet: "spec/assets/word.css",
916
- htmlstylesheet: "spec/assets/html.scss" }
923
+ htmlstylesheet: "spec/assets/html.scss" },
917
924
  ).convert("test", <<~"INPUT", false)
918
925
  <iso-standard xmlns="http://riboseinc.com/isoxml">
919
926
  <preface><foreword>
@@ -952,154 +959,167 @@ RSpec.describe IsoDoc do
952
959
  it "moves images in HTML, using relative file location" do
953
960
  FileUtils.rm_f "spec/test.html"
954
961
  FileUtils.rm_rf "spec/test_htmlimages"
955
- IsoDoc::HtmlConvert.new({ wordstylesheet: "assets/word.css", htmlstylesheet: "assets/html.scss" }).convert("spec/test", <<~"INPUT", false)
956
- <iso-standard xmlns="http://riboseinc.com/isoxml">
957
- <preface><foreword>
958
- <figure id="_">
959
- <name>Split-it-right sample divider</name>
960
- <image src="#{File.expand_path(File.join(File.dirname(__FILE__), '..', 'assets/rice_image1.png'))}" id="_" mimetype="image/png"/>
961
- <image src="assets/rice_image1.png" id="_" mimetype="image/png"/>
962
- <image src="assets/rice_image1.png" id="_" width="20000" height="300000" mimetype="image/png"/>
963
- <image src="assets/rice_image1.png" id="_" width="99" height="auto" mimetype="image/png"/>
964
- </figure>
965
- </foreword></preface>
966
- </iso-standard>
967
- INPUT
962
+ IsoDoc::HtmlConvert
963
+ .new(wordstylesheet: "assets/word.css",
964
+ htmlstylesheet: "assets/html.scss")
965
+ .convert("spec/test", <<~"INPUT", false)
966
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
967
+ <preface><foreword>
968
+ <figure id="_">
969
+ <name>Split-it-right sample divider</name>
970
+ <image src="#{File.expand_path(File.join(File.dirname(__FILE__), '..', 'assets/rice_image1.png'))}" id="_" mimetype="image/png"/>
971
+ <image src="assets/rice_image1.png" id="_" mimetype="image/png"/>
972
+ <image src="assets/rice_image1.png" id="_" width="20000" height="300000" mimetype="image/png"/>
973
+ <image src="assets/rice_image1.png" id="_" width="99" height="auto" mimetype="image/png"/>
974
+ </figure>
975
+ </foreword></preface>
976
+ </iso-standard>
977
+ INPUT
968
978
  html = File.read("spec/test.html")
969
979
  .sub(/^.*<main class="main-section">/m, '<main class="main-section">')
970
980
  .sub(%r{</main>.*$}m, "</main>")
971
981
  expect(`ls test_htmlimages`).to match(/\.png$/)
972
- expect(xmlpp(html.gsub(/\/[0-9a-f-]+\.png/, "/_.png"))).to be_equivalent_to xmlpp(<<~"OUTPUT")
973
- <main class="main-section"><button onclick="topFunction()" id="myBtn" title="Go to top">Top</button>
974
- <br />
975
- <div>
976
- <h1 class="ForewordTitle">Foreword</h1>
977
- <div id="_" class="figure">
978
- <img src="test_htmlimages/_.png" height="776" width="922" />
979
- <img src="test_htmlimages/_.png" height="776" width="922" />
980
- <img src="test_htmlimages/_.png" height="800" width="53" />
981
- <img src="test_htmlimages/_.png" height="83" width="99" />
982
- <p class="FigureTitle" style="text-align:center;">Split-it-right sample divider</p></div>
983
- </div>
984
- <p class="zzSTDTitle1"></p>
985
- </main>
986
- OUTPUT
982
+ expect(xmlpp(html.gsub(/\/[0-9a-f-]+\.png/, "/_.png")))
983
+ .to be_equivalent_to xmlpp(<<~"OUTPUT")
984
+ <main class="main-section"><button onclick="topFunction()" id="myBtn" title="Go to top">Top</button>
985
+ <br />
986
+ <div>
987
+ <h1 class="ForewordTitle">Foreword</h1>
988
+ <div id="_" class="figure">
989
+ <img src="test_htmlimages/_.png" height="776" width="922" />
990
+ <img src="test_htmlimages/_.png" height="776" width="922" />
991
+ <img src="test_htmlimages/_.png" height="800" width="53" />
992
+ <img src="test_htmlimages/_.png" height="83" width="99" />
993
+ <p class="FigureTitle" style="text-align:center;">Split-it-right sample divider</p></div>
994
+ </div>
995
+ <p class="zzSTDTitle1"></p>
996
+ </main>
997
+ OUTPUT
987
998
  end
988
999
 
989
1000
  it "encodes images in HTML as data URIs" do
990
1001
  FileUtils.rm_f "test.html"
991
1002
  FileUtils.rm_rf "test_htmlimages"
992
- IsoDoc::HtmlConvert.new({ htmlstylesheet: "spec/assets/html.scss", datauriimage: true }).convert("test", <<~"INPUT", false)
993
- <iso-standard xmlns="http://riboseinc.com/isoxml">
994
- <preface><foreword>
995
- <figure id="_">
996
- <name>Split-it-right sample divider</name>
997
- <image src="#{File.expand_path(File.join(File.dirname(__FILE__), '..', 'assets/rice_image1.png'))}" id="_" mimetype="image/png"/>
998
- <image src="spec/assets/rice_image1.png" id="_" mimetype="image/png"/>
999
- </figure>
1000
- </foreword></preface>
1001
- </iso-standard>
1002
- INPUT
1003
+ IsoDoc::HtmlConvert
1004
+ .new(htmlstylesheet: "spec/assets/html.scss", datauriimage: true)
1005
+ .convert("test", <<~"INPUT", false)
1006
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
1007
+ <preface><foreword>
1008
+ <figure id="_">
1009
+ <name>Split-it-right sample divider</name>
1010
+ <image src="#{File.expand_path(File.join(File.dirname(__FILE__), '..', 'assets/rice_image1.png'))}" id="_" mimetype="image/png"/>
1011
+ <image src="spec/assets/rice_image1.png" id="_" mimetype="image/png"/>
1012
+ </figure>
1013
+ </foreword></preface>
1014
+ </iso-standard>
1015
+ INPUT
1003
1016
  html = File.read("test.html")
1004
1017
  .sub(/^.*<main class="main-section">/m, '<main class="main-section">')
1005
1018
  .sub(%r{</main>.*$}m, "</main>")
1006
- expect(xmlpp(html.gsub(%r{src="data:image/png;base64,[^"]+"}, %{src="data:image/png;base64,_"}))).to be_equivalent_to xmlpp(<<~"OUTPUT")
1007
- <main class="main-section"><button onclick="topFunction()" id="myBtn" title="Go to top">Top</button>
1008
- <br />
1009
- <div>
1010
- <h1 class="ForewordTitle">Foreword</h1>
1011
- <div id="_" class="figure">
1012
- <img src="data:image/png;base64,_" height="776" width="922" />
1013
- <img src="data:image/png;base64,_" height="776" width="922" />
1014
- <p class="FigureTitle" style="text-align:center;">Split-it-right sample divider</p></div>
1015
- </div>
1016
- <p class="zzSTDTitle1"></p>
1017
- </main>
1018
- OUTPUT
1019
+ expect(xmlpp(html
1020
+ .gsub(%r{src="data:image/png;base64,[^"]+"}, %{src="data:image/png;base64,_"})))
1021
+ .to be_equivalent_to xmlpp(<<~"OUTPUT")
1022
+ <main class="main-section"><button onclick="topFunction()" id="myBtn" title="Go to top">Top</button>
1023
+ <br />
1024
+ <div>
1025
+ <h1 class="ForewordTitle">Foreword</h1>
1026
+ <div id="_" class="figure">
1027
+ <img src="data:image/png;base64,_" height="776" width="922" />
1028
+ <img src="data:image/png;base64,_" height="776" width="922" />
1029
+ <p class="FigureTitle" style="text-align:center;">Split-it-right sample divider</p></div>
1030
+ </div>
1031
+ <p class="zzSTDTitle1"></p>
1032
+ </main>
1033
+ OUTPUT
1019
1034
  end
1020
1035
 
1021
1036
  it "encodes images in HTML as data URIs, using relative file location" do
1022
1037
  FileUtils.rm_f "spec/test.html"
1023
1038
  FileUtils.rm_rf "spec/test_htmlimages"
1024
- IsoDoc::HtmlConvert.new({ htmlstylesheet: "assets/html.scss", datauriimage: true }).convert("spec/test", <<~"INPUT", false)
1025
- <iso-standard xmlns="http://riboseinc.com/isoxml">
1026
- <preface><foreword>
1027
- <figure id="_">
1028
- <name>Split-it-right sample divider</name>
1029
- <image src="#{File.expand_path(File.join(File.dirname(__FILE__), '..', 'assets/rice_image1.png'))}" id="_" mimetype="image/png"/>
1030
- <image src="assets/rice_image1.png" id="_" mimetype="image/png"/>
1031
- </figure>
1032
- </foreword></preface>
1033
- </iso-standard>
1034
- INPUT
1039
+ IsoDoc::HtmlConvert
1040
+ .new({ htmlstylesheet: "assets/html.scss", datauriimage: true })
1041
+ .convert("spec/test", <<~"INPUT", false)
1042
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
1043
+ <preface><foreword>
1044
+ <figure id="_">
1045
+ <name>Split-it-right sample divider</name>
1046
+ <image src="#{File.expand_path(File.join(File.dirname(__FILE__), '..', 'assets/rice_image1.png'))}" id="_" mimetype="image/png"/>
1047
+ <image src="assets/rice_image1.png" id="_" mimetype="image/png"/>
1048
+ </figure>
1049
+ </foreword></preface>
1050
+ </iso-standard>
1051
+ INPUT
1035
1052
  html = File.read("spec/test.html")
1036
1053
  .sub(/^.*<main class="main-section">/m, '<main class="main-section">')
1037
1054
  .sub(%r{</main>.*$}m, "</main>")
1038
- expect(xmlpp(html.gsub(%r{src="data:image/png;base64,[^"]+"}, %{src="data:image/png;base64,_"}))).to be_equivalent_to xmlpp(<<~"OUTPUT")
1039
- <main class="main-section"><button onclick="topFunction()" id="myBtn" title="Go to top">Top</button>
1040
- <br />
1041
- <div>
1042
- <h1 class="ForewordTitle">Foreword</h1>
1043
- <div id="_" class="figure">
1044
- <img src="data:image/png;base64,_" height="776" width="922" />
1045
- <img src="data:image/png;base64,_" height="776" width="922" />
1046
- <p class="FigureTitle" style="text-align:center;">Split-it-right sample divider</p></div>
1047
- </div>
1048
- <p class="zzSTDTitle1"></p>
1049
- </main>
1050
- OUTPUT
1055
+ expect(xmlpp(html
1056
+ .gsub(%r{src="data:image/png;base64,[^"]+"}, %{src="data:image/png;base64,_"})))
1057
+ .to be_equivalent_to xmlpp(<<~"OUTPUT")
1058
+ <main class="main-section"><button onclick="topFunction()" id="myBtn" title="Go to top">Top</button>
1059
+ <br />
1060
+ <div>
1061
+ <h1 class="ForewordTitle">Foreword</h1>
1062
+ <div id="_" class="figure">
1063
+ <img src="data:image/png;base64,_" height="776" width="922" />
1064
+ <img src="data:image/png;base64,_" height="776" width="922" />
1065
+ <p class="FigureTitle" style="text-align:center;">Split-it-right sample divider</p></div>
1066
+ </div>
1067
+ <p class="zzSTDTitle1"></p>
1068
+ </main>
1069
+ OUTPUT
1051
1070
  end
1052
1071
 
1053
1072
  it "processes IsoXML terms for HTML" do
1054
1073
  FileUtils.rm_f "test.html"
1055
1074
  FileUtils.rm_f "test.doc"
1056
- IsoDoc::HtmlConvert.new({ wordstylesheet: "spec/assets/word.css", htmlstylesheet: "spec/assets/html.scss" }).convert("test", <<~"INPUT", false)
1057
- <iso-standard xmlns="http://riboseinc.com/isoxml">
1058
- <sections>
1059
- <terms id="_terms_and_definitions" obligation="normative"><title>Terms and Definitions</title>
1060
- <term id="paddy1"><name>1.1.</name><preferred>paddy</preferred>
1061
- <domain>rice</domain>
1062
- <definition><p id="_eb29b35e-123e-4d1c-b50b-2714d41e747f">rice retaining its husk after threshing</p></definition>
1063
- <termexample id="_bd57bbf1-f948-4bae-b0ce-73c00431f892">
1064
- <p id="_65c9a509-9a89-4b54-a890-274126aeb55c">Foreign seeds, husks, bran, sand, dust.</p>
1065
- <ul>
1066
- <li>A</li>
1067
- </ul>
1068
- </termexample>
1069
- <termexample id="_bd57bbf1-f948-4bae-b0ce-73c00431f894">
1070
- <ul>
1071
- <li>A</li>
1072
- </ul>
1073
- </termexample>
1074
- <termsource status="modified">
1075
- <origin bibitemid="ISO7301" type="inline" citeas="ISO 7301:2011"><locality type="clause"><referenceFrom>3.1</referenceFrom></locality></origin>
1076
- <modification>
1077
- <p id="_e73a417d-ad39-417d-a4c8-20e4e2529489">The term "cargo rice" is shown as deprecated, and Note 1 to entry is not included here</p>
1078
- </modification>
1079
- </termsource></term>
1080
- <term id="paddy"><name>1.2.</name><preferred>paddy</preferred><admitted>paddy rice</admitted>
1081
- <admitted>rough rice</admitted>
1082
- <deprecates>cargo rice</deprecates>
1083
- <definition><p id="_eb29b35e-123e-4d1c-b50b-2714d41e747f">rice retaining its husk after threshing</p></definition>
1084
- <termexample id="_bd57bbf1-f948-4bae-b0ce-73c00431f893">
1085
- <ul>
1086
- <li>A</li>
1087
- </ul>
1088
- </termexample>
1089
- <termnote id="_671a1994-4783-40d0-bc81-987d06ffb74e">
1090
- <p id="_19830f33-e46c-42cc-94ca-a5ef101132d5">The starch of waxy rice consists almost entirely of amylopectin. The kernels have a tendency to stick together after cooking.</p>
1091
- </termnote>
1092
- <termnote id="_671a1994-4783-40d0-bc81-987d06ffb74f">
1093
- <ul><li>A</li></ul>
1094
- <p id="_19830f33-e46c-42cc-94ca-a5ef101132d5">The starch of waxy rice consists almost entirely of amylopectin. The kernels have a tendency to stick together after cooking.</p>
1095
- </termnote>
1096
- <termsource status="identical">
1097
- <origin bibitemid="ISO7301" type="inline" citeas="ISO 7301:2011"><locality type="clause"><referenceFrom>3.1</referenceFrom></locality></origin>
1098
- </termsource></term>
1099
- </terms>
1100
- </sections>
1101
- </iso-standard>
1102
- INPUT
1075
+ IsoDoc::HtmlConvert.new(options)
1076
+ .convert("test", <<~"INPUT", false)
1077
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
1078
+ <sections>
1079
+ <terms id="_terms_and_definitions" obligation="normative"><title>Terms and Definitions</title>
1080
+ <term id="paddy1"><name>1.1.</name><preferred>paddy</preferred>
1081
+ <domain>rice</domain>
1082
+ <definition><p id="_eb29b35e-123e-4d1c-b50b-2714d41e747f">rice retaining its husk after threshing</p></definition>
1083
+ <termexample id="_bd57bbf1-f948-4bae-b0ce-73c00431f892">
1084
+ <p id="_65c9a509-9a89-4b54-a890-274126aeb55c">Foreign seeds, husks, bran, sand, dust.</p>
1085
+ <ul>
1086
+ <li>A</li>
1087
+ </ul>
1088
+ </termexample>
1089
+ <termexample id="_bd57bbf1-f948-4bae-b0ce-73c00431f894">
1090
+ <ul>
1091
+ <li>A</li>
1092
+ </ul>
1093
+ </termexample>
1094
+ <termsource status="modified">
1095
+ <origin bibitemid="ISO7301" type="inline" citeas="ISO 7301:2011"><locality type="clause"><referenceFrom>3.1</referenceFrom></locality></origin>
1096
+ <modification>
1097
+ <p id="_e73a417d-ad39-417d-a4c8-20e4e2529489">The term "cargo rice" is shown as deprecated, and Note 1 to entry is not included here</p>
1098
+ </modification>
1099
+ </termsource></term>
1100
+ <term id="paddy"><name>1.2.</name><preferred>paddy</preferred><admitted>paddy rice</admitted>
1101
+ <admitted>rough rice</admitted>
1102
+ <deprecates>cargo rice</deprecates>
1103
+ <definition><p id="_eb29b35e-123e-4d1c-b50b-2714d41e747f">rice retaining its husk after threshing</p></definition>
1104
+ <termexample id="_bd57bbf1-f948-4bae-b0ce-73c00431f893">
1105
+ <ul>
1106
+ <li>A</li>
1107
+ </ul>
1108
+ </termexample>
1109
+ <termnote id="_671a1994-4783-40d0-bc81-987d06ffb74e">
1110
+ <p id="_19830f33-e46c-42cc-94ca-a5ef101132d5">The starch of waxy rice consists almost entirely of amylopectin. The kernels have a tendency to stick together after cooking.</p>
1111
+ </termnote>
1112
+ <termnote id="_671a1994-4783-40d0-bc81-987d06ffb74f">
1113
+ <ul><li>A</li></ul>
1114
+ <p id="_19830f33-e46c-42cc-94ca-a5ef101132d5">The starch of waxy rice consists almost entirely of amylopectin. The kernels have a tendency to stick together after cooking.</p>
1115
+ </termnote>
1116
+ <termsource status="identical">
1117
+ <origin bibitemid="ISO7301" type="inline" citeas="ISO 7301:2011"><locality type="clause"><referenceFrom>3.1</referenceFrom></locality></origin>
1118
+ </termsource></term>
1119
+ </terms>
1120
+ </sections>
1121
+ </iso-standard>
1122
+ INPUT
1103
1123
  expect(File.exist?("test.html")).to be true
1104
1124
  html = File.read("test.html")
1105
1125
  expect(html).to match(%r{<h2 class="TermNum" id="paddy1">1\.1\.</h2>})
@@ -1109,34 +1129,35 @@ RSpec.describe IsoDoc do
1109
1129
  it "processes empty term modifications" do
1110
1130
  FileUtils.rm_f "test.html"
1111
1131
  FileUtils.rm_f "test.doc"
1112
- IsoDoc::HtmlConvert.new({ wordstylesheet: "spec/assets/word.css", htmlstylesheet: "spec/assets/html.scss" }).convert("test", <<~"INPUT", false)
1113
- <iso-standard xmlns="http://riboseinc.com/isoxml">
1114
- <sections>
1115
- <terms id="_terms_and_definitions" obligation="normative"><title>Terms and Definitions</title>
1116
- <term id="paddy1"><preferred>paddy</preferred>
1117
- <domain>rice</domain>
1118
- <definition><p id="_eb29b35e-123e-4d1c-b50b-2714d41e747f">rice retaining its husk after threshing</p></definition>
1119
- <termexample id="_bd57bbf1-f948-4bae-b0ce-73c00431f892">
1120
- <p id="_65c9a509-9a89-4b54-a890-274126aeb55c">Foreign seeds, husks, bran, sand, dust.</p>
1121
- <ul>
1122
- <li>A</li>
1123
- </ul>
1124
- </termexample>
1125
- <termexample id="_bd57bbf1-f948-4bae-b0ce-73c00431f894">
1126
- <ul>
1127
- <li>A</li>
1128
- </ul>
1129
- </termexample>
1130
- <termsource status="modified">
1131
- <origin bibitemid="ISO7301" type="inline" citeas="ISO 7301:2011">ISO 7301:2011, Clause 3.1</origin>
1132
- <modification>
1133
- <p id="_e73a417d-ad39-417d-a4c8-20e4e2529489"/>
1134
- </modification>
1135
- </termsource></term>
1136
- </terms>
1137
- </sections>
1138
- </iso-standard>
1139
- INPUT
1132
+ IsoDoc::HtmlConvert.new(options)
1133
+ .convert("test", <<~"INPUT", false)
1134
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
1135
+ <sections>
1136
+ <terms id="_terms_and_definitions" obligation="normative"><title>Terms and Definitions</title>
1137
+ <term id="paddy1"><preferred>paddy</preferred>
1138
+ <domain>rice</domain>
1139
+ <definition><p id="_eb29b35e-123e-4d1c-b50b-2714d41e747f">rice retaining its husk after threshing</p></definition>
1140
+ <termexample id="_bd57bbf1-f948-4bae-b0ce-73c00431f892">
1141
+ <p id="_65c9a509-9a89-4b54-a890-274126aeb55c">Foreign seeds, husks, bran, sand, dust.</p>
1142
+ <ul>
1143
+ <li>A</li>
1144
+ </ul>
1145
+ </termexample>
1146
+ <termexample id="_bd57bbf1-f948-4bae-b0ce-73c00431f894">
1147
+ <ul>
1148
+ <li>A</li>
1149
+ </ul>
1150
+ </termexample>
1151
+ <termsource status="modified">
1152
+ <origin bibitemid="ISO7301" type="inline" citeas="ISO 7301:2011">ISO 7301:2011, Clause 3.1</origin>
1153
+ <modification>
1154
+ <p id="_e73a417d-ad39-417d-a4c8-20e4e2529489"/>
1155
+ </modification>
1156
+ </termsource></term>
1157
+ </terms>
1158
+ </sections>
1159
+ </iso-standard>
1160
+ INPUT
1140
1161
  expect(File.exist?("test.html")).to be true
1141
1162
  html = File.read("test.html")
1142
1163
  expect(html).to include '[SOURCE: <a href="#ISO7301">ISO 7301:2011, Clause 3.1</a>, modified]'
@@ -1145,37 +1166,38 @@ RSpec.describe IsoDoc do
1145
1166
  it "creates continuation styles for multiparagraph list items in Word" do
1146
1167
  FileUtils.rm_f "test.doc"
1147
1168
  FileUtils.rm_f "test.html"
1148
- IsoDoc::WordConvert.new({ wordstylesheet: "spec/assets/word.css", htmlstylesheet: "spec/assets/html.scss" }).convert("test", <<~"INPUT", false)
1149
- <iso-standard xmlns="http://riboseinc.com/isoxml">
1150
- <preface><foreword>
1151
- <ul>
1152
- <li><p>A</p>
1153
- <p>B</p></li>
1154
- <li><ol><li><p>C</p>
1155
- <p>D</p>
1156
- <sourcecode>E</sourcecode></li>
1157
- </ol></li>
1158
- </ul>
1159
- <ol>
1160
- <li><p>A1</p>
1161
- <p>B1</p></li>
1162
- <li><ul><li><p>C1</p>
1163
- <formula id="_5fc1ef0f-75d2-4b54-802c-b1bad4a53b62">
1164
- <stem type="AsciiMath">D1</stem>
1165
- </formula>
1166
- <dl id="_f8fb7ed7-7874-44a8-933f-06e0e86fb264">
1167
- <dt>
1168
- <em>n</em>
1169
- </dt>
1170
- <dd>
1171
- <p id="_a27281a4-b20e-4d0b-a780-bab9e851b03e">is the number of coating layers</p>
1172
- </dd>
1173
- </dl>
1174
- </ul></li>
1175
- </ol>
1176
- </foreword></preface>
1177
- </iso-standard>
1178
- INPUT
1169
+ IsoDoc::WordConvert.new(options)
1170
+ .convert("test", <<~"INPUT", false)
1171
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
1172
+ <preface><foreword>
1173
+ <ul>
1174
+ <li><p>A</p>
1175
+ <p>B</p></li>
1176
+ <li><ol><li><p>C</p>
1177
+ <p>D</p>
1178
+ <sourcecode>E</sourcecode></li>
1179
+ </ol></li>
1180
+ </ul>
1181
+ <ol>
1182
+ <li><p>A1</p>
1183
+ <p>B1</p></li>
1184
+ <li><ul><li><p>C1</p>
1185
+ <formula id="_5fc1ef0f-75d2-4b54-802c-b1bad4a53b62">
1186
+ <stem type="AsciiMath">D1</stem>
1187
+ </formula>
1188
+ <dl id="_f8fb7ed7-7874-44a8-933f-06e0e86fb264">
1189
+ <dt>
1190
+ <em>n</em>
1191
+ </dt>
1192
+ <dd>
1193
+ <p id="_a27281a4-b20e-4d0b-a780-bab9e851b03e">is the number of coating layers</p>
1194
+ </dd>
1195
+ </dl>
1196
+ </ul></li>
1197
+ </ol>
1198
+ </foreword></preface>
1199
+ </iso-standard>
1200
+ INPUT
1179
1201
  word = File.read("test.doc")
1180
1202
  .sub(/^.*<div class="WordSection2">/m, '<div class="WordSection2" xmlns:m="m">')
1181
1203
  .sub(%r{<p class="MsoNormal">\s*<br clear="all" class="section"/>\s*</p>\s*<div class="WordSection3">.*$}m, "")
@@ -1255,16 +1277,17 @@ RSpec.describe IsoDoc do
1255
1277
  it "does not lose HTML escapes in postprocessing" do
1256
1278
  FileUtils.rm_f "test.doc"
1257
1279
  FileUtils.rm_f "test.html"
1258
- IsoDoc::HtmlConvert.new({ wordstylesheet: "spec/assets/word.css", htmlstylesheet: "spec/assets/html.scss" }).convert("test", <<~"INPUT", false)
1259
- <iso-standard xmlns="http://riboseinc.com/isoxml">
1260
- <preface><foreword>
1261
- <sourcecode id="samplecode">
1262
- <name>XML code</name>
1263
- &lt;xml&gt; &amp;
1264
- </sourcecode>
1265
- </foreword></preface>
1266
- </iso-standard>
1267
- INPUT
1280
+ IsoDoc::HtmlConvert.new(options)
1281
+ .convert("test", <<~"INPUT", false)
1282
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
1283
+ <preface><foreword>
1284
+ <sourcecode id="samplecode">
1285
+ <name>XML code</name>
1286
+ &lt;xml&gt; &amp;
1287
+ </sourcecode>
1288
+ </foreword></preface>
1289
+ </iso-standard>
1290
+ INPUT
1268
1291
  html = File.read("test.html")
1269
1292
  .sub(/^.*<main class="main-section">/m, '<main class="main-section">')
1270
1293
  .sub(%r{</main>.*$}m, "</main>")
@@ -1285,16 +1308,17 @@ RSpec.describe IsoDoc do
1285
1308
  it "does not lose HTML escapes in postprocessing (Word)" do
1286
1309
  FileUtils.rm_f "test.doc"
1287
1310
  FileUtils.rm_f "test.html"
1288
- IsoDoc::WordConvert.new({ wordstylesheet: "spec/assets/word.css", htmlstylesheet: "spec/assets/html.scss" }).convert("test", <<~"INPUT", false)
1289
- <iso-standard xmlns="http://riboseinc.com/isoxml">
1290
- <preface><foreword>
1291
- <sourcecode id="samplecode">
1292
- <name>XML code</name>
1293
- &lt;xml&gt; &amp;
1294
- </sourcecode>
1295
- </foreword></preface>
1296
- </iso-standard>
1297
- INPUT
1311
+ IsoDoc::WordConvert.new(options)
1312
+ .convert("test", <<~"INPUT", false)
1313
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
1314
+ <preface><foreword>
1315
+ <sourcecode id="samplecode">
1316
+ <name>XML code</name>
1317
+ &lt;xml&gt; &amp;
1318
+ </sourcecode>
1319
+ </foreword></preface>
1320
+ </iso-standard>
1321
+ INPUT
1298
1322
  word = File.read("test.doc")
1299
1323
  .sub(/^.*<div class="WordSection2">/m, '<div class="WordSection2">')
1300
1324
  .sub(%r{<p class="MsoNormal">\s*<br clear="all" class="section"/>\s*</p>\s*<div class="WordSection3">.*$}m, "")
@@ -1315,7 +1339,7 @@ RSpec.describe IsoDoc do
1315
1339
  it "propagates example style to paragraphs in postprocessing (Word)" do
1316
1340
  FileUtils.rm_f "test.doc"
1317
1341
  FileUtils.rm_f "test.html"
1318
- IsoDoc::WordConvert.new({ wordstylesheet: "spec/assets/word.css", htmlstylesheet: "spec/assets/html.scss" }).convert("test", <<~"INPUT", false)
1342
+ IsoDoc::WordConvert.new(options).convert("test", <<~"INPUT", false)
1319
1343
  <iso-standard xmlns="http://riboseinc.com/isoxml">
1320
1344
  <preface><foreword>
1321
1345
  <example id="samplecode">
@@ -1346,16 +1370,17 @@ RSpec.describe IsoDoc do
1346
1370
  it "deals with image captions (Word)" do
1347
1371
  FileUtils.rm_f "test.doc"
1348
1372
  FileUtils.rm_f "test.html"
1349
- IsoDoc::WordConvert.new({ wordstylesheet: "spec/assets/word.css", htmlstylesheet: "spec/assets/html.scss" }).convert("test", <<~"INPUT", false)
1350
- <iso-standard xmlns="http://riboseinc.com/isoxml">
1351
- <preface><foreword>
1352
- <figure id="fig1">
1353
- <name>Typical arrangement of the far-field scan set-up</name>
1354
- <image src="spec/assets/rice_image1.png" id="_" mimetype="image/png"/>
1355
- </figure>
1356
- </foreword></preface>
1357
- </iso-standard>
1358
- INPUT
1373
+ IsoDoc::WordConvert.new(options)
1374
+ .convert("test", <<~"INPUT", false)
1375
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
1376
+ <preface><foreword>
1377
+ <figure id="fig1">
1378
+ <name>Typical arrangement of the far-field scan set-up</name>
1379
+ <image src="spec/assets/rice_image1.png" id="_" mimetype="image/png"/>
1380
+ </figure>
1381
+ </foreword></preface>
1382
+ </iso-standard>
1383
+ INPUT
1359
1384
  word = File.read("test.doc")
1360
1385
  .sub(/^.*<div class="WordSection2">/m, '<div class="WordSection2">')
1361
1386
  .sub(%r{<p class="MsoNormal">\s*<br clear="all" class="section"/>\s*</p>\s*<div class="WordSection3">.*$}m, "")
@@ -1379,20 +1404,21 @@ RSpec.describe IsoDoc do
1379
1404
  it "deals with empty table titles (Word)" do
1380
1405
  FileUtils.rm_f "test.doc"
1381
1406
  FileUtils.rm_f "test.html"
1382
- IsoDoc::WordConvert.new({ wordstylesheet: "spec/assets/word.css", htmlstylesheet: "spec/assets/html.scss" }).convert("test", <<~"INPUT", false)
1383
- <iso-standard xmlns="http://riboseinc.com/isoxml">
1384
- <preface><foreword>
1385
- <table id="_fe12b8f8-6858-4cd6-af7d-d4b6f3ebd1a7" unnumbered="true"><thead><tr>
1386
- <td rowspan="2">
1387
- <p id="_c47d9b39-adb2-431d-9320-78cb148fdb56">Output wavelength <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mo>(</mo><mi>μ</mi><mi>m</mi><mo>)</mo></mrow></math></stem></p>
1388
- </td>
1389
- <th colspan="3" align="left">Predictive wavelengths</th>
1390
- </tr>
1391
- </thead>
1392
- </table>
1393
- </preface>
1394
- </iso-standard>
1395
- INPUT
1407
+ IsoDoc::WordConvert.new(options)
1408
+ .convert("test", <<~"INPUT", false)
1409
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
1410
+ <preface><foreword>
1411
+ <table id="_fe12b8f8-6858-4cd6-af7d-d4b6f3ebd1a7" unnumbered="true"><thead><tr>
1412
+ <td rowspan="2">
1413
+ <p id="_c47d9b39-adb2-431d-9320-78cb148fdb56">Output wavelength <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mo>(</mo><mi>μ</mi><mi>m</mi><mo>)</mo></mrow></math></stem></p>
1414
+ </td>
1415
+ <th colspan="3" align="left">Predictive wavelengths</th>
1416
+ </tr>
1417
+ </thead>
1418
+ </table>
1419
+ </preface>
1420
+ </iso-standard>
1421
+ INPUT
1396
1422
  word = File.read("test.doc")
1397
1423
  .sub(/^.*<div class="WordSection2">/m, '<div class="WordSection2" xmlns:m="m">')
1398
1424
  .sub(%r{<p class="MsoNormal">\s*<br clear="all" class="section"/>\s*</p>\s*<div class="WordSection3">.*$}m, "")
@@ -1439,21 +1465,22 @@ RSpec.describe IsoDoc do
1439
1465
  it "propagates alignment of table cells (Word)" do
1440
1466
  FileUtils.rm_f "test.doc"
1441
1467
  FileUtils.rm_f "test.html"
1442
- IsoDoc::WordConvert.new({ wordstylesheet: "spec/assets/word.css", htmlstylesheet: "spec/assets/html.scss" }).convert("test", <<~"INPUT", false)
1443
- <iso-standard xmlns="http://riboseinc.com/isoxml">
1444
- <preface><foreword>
1445
- <table id="_fe12b8f8-6858-4cd6-af7d-d4b6f3ebd1a7" unnumbered="true"><thead><tr>
1446
- <td rowspan="2" align="left">
1447
- <p id="_c47d9b39-adb2-431d-9320-78cb148fdb56">Output wavelength</p>
1448
- <p id="_c47d9b39-adb2-431d-9320-78cb148fdb57">Output wavelength</p>
1449
- </td>
1450
- <th colspan="3" align="right"><p id="_c47d9b39-adb2-431d-9320-78cb148fdb58">Predictive wavelengths</p></th>
1451
- </tr>
1452
- </thead>
1453
- </table>
1454
- </preface>
1455
- </iso-standard>
1456
- INPUT
1468
+ IsoDoc::WordConvert.new(options)
1469
+ .convert("test", <<~"INPUT", false)
1470
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
1471
+ <preface><foreword>
1472
+ <table id="_fe12b8f8-6858-4cd6-af7d-d4b6f3ebd1a7" unnumbered="true"><thead><tr>
1473
+ <td rowspan="2" align="left">
1474
+ <p id="_c47d9b39-adb2-431d-9320-78cb148fdb56">Output wavelength</p>
1475
+ <p id="_c47d9b39-adb2-431d-9320-78cb148fdb57">Output wavelength</p>
1476
+ </td>
1477
+ <th colspan="3" align="right"><p id="_c47d9b39-adb2-431d-9320-78cb148fdb58">Predictive wavelengths</p></th>
1478
+ </tr>
1479
+ </thead>
1480
+ </table>
1481
+ </preface>
1482
+ </iso-standard>
1483
+ INPUT
1457
1484
  word = File.read("test.doc")
1458
1485
  .sub(/^.*<div class="WordSection2">/m, '<div class="WordSection2" xmlns:m="m">')
1459
1486
  .sub(%r{<p class="MsoNormal">\s*<br clear="all" class="section"/>\s*</p>\s*<div class="WordSection3">.*$}m, "")
@@ -1497,7 +1524,7 @@ RSpec.describe IsoDoc do
1497
1524
  end
1498
1525
 
1499
1526
  it "cleans up boilerplate" do
1500
- expect(xmlpp(IsoDoc::HtmlConvert.new({ wordstylesheet: "spec/assets/word.css", htmlstylesheet: "spec/assets/html.scss", filename: "test" }).html_preface(Nokogiri::XML(<<~INPUT)).to_xml).sub(/^.*<main/m, "<main").sub(%r{</main>.*$}m, "</main>")).to be_equivalent_to xmlpp(<<~"OUTPUT")
1527
+ input = <<~INPUT
1501
1528
  <html>
1502
1529
  <head/>
1503
1530
  <body>
@@ -1515,6 +1542,7 @@ RSpec.describe IsoDoc do
1515
1542
  </body>
1516
1543
  </html>
1517
1544
  INPUT
1545
+ html = <<~OUTPUT
1518
1546
  <main class='main-section'>
1519
1547
  <button onclick='topFunction()' id='myBtn' title='Go to top'>Top</button>
1520
1548
  <hr/>
@@ -1532,27 +1560,7 @@ RSpec.describe IsoDoc do
1532
1560
  </div>
1533
1561
  </main>
1534
1562
  OUTPUT
1535
- end
1536
-
1537
- it "cleans up boilerplate (Word)" do
1538
- 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")
1539
- <html>
1540
- <head/>
1541
- <body>
1542
- <div class="main-section">
1543
- <div id="boilerplate-copyright"> <h1>Copyright</h1> </div>
1544
- <div id="boilerplate-license"> <h1>License</h1> </div>
1545
- <div id="boilerplate-legal"> <h1>Legal</h1> </div>
1546
- <div id="boilerplate-feedback"> <h1>Feedback</h1> </div>
1547
- <hr/>
1548
- <div id="boilerplate-feedback-destination"/>
1549
- <div id="boilerplate-legal-destination"/>
1550
- <div id="boilerplate-license-destination"/>
1551
- <div id="boilerplate-copyright-destination"/>
1552
- </div>
1553
- </body>
1554
- </html>
1555
- INPUT
1563
+ doc = <<~OUTPUT
1556
1564
  <html>
1557
1565
  <head/>
1558
1566
  <body>
@@ -1574,13 +1582,25 @@ RSpec.describe IsoDoc do
1574
1582
  </body>
1575
1583
  </html>
1576
1584
  OUTPUT
1585
+ expect(xmlpp(IsoDoc::HtmlConvert
1586
+ .new(wordstylesheet: "spec/assets/word.css",
1587
+ htmlstylesheet: "spec/assets/html.scss", filename: "test")
1588
+ .html_preface(Nokogiri::XML(input)).to_xml)
1589
+ .sub(/^.*<main/m, "<main").sub(%r{</main>.*$}m, "</main>"))
1590
+ .to be_equivalent_to xmlpp(html)
1591
+ expect(xmlpp(IsoDoc::WordConvert
1592
+ .new(wordstylesheet: "spec/assets/word.css",
1593
+ htmlstylesheet: "spec/assets/html.scss", filename: "test")
1594
+ .word_cleanup(Nokogiri::XML(input)).to_xml)
1595
+ .sub(/^.*<main/m, "<main").sub(%r{</main>.*$}m, "</main>"))
1596
+ .to be_equivalent_to xmlpp(doc)
1577
1597
  end
1578
1598
 
1579
1599
  it "deals with landscape and portrait pagebreaks (Word)" do
1580
1600
  FileUtils.rm_f "test.doc"
1581
1601
  IsoDoc::WordConvert.new(
1582
1602
  { wordstylesheet: "spec/assets/word.css",
1583
- htmlstylesheet: "spec/assets/html.scss", filename: "test" }
1603
+ htmlstylesheet: "spec/assets/html.scss", filename: "test" },
1584
1604
  ).convert("test", <<~"INPUT", false)
1585
1605
  <standard-document xmlns="http://riboseinc.com/isoxml">
1586
1606
  <bibdata type="standard">
@@ -1776,7 +1796,7 @@ RSpec.describe IsoDoc do
1776
1796
  end
1777
1797
 
1778
1798
  it "expands out nested tables in Word" do
1779
- 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")
1799
+ input = <<~INPUT
1780
1800
  <html>
1781
1801
  <head/>
1782
1802
  <body>
@@ -1798,6 +1818,7 @@ RSpec.describe IsoDoc do
1798
1818
  </body>
1799
1819
  </html>
1800
1820
  INPUT
1821
+ output = <<~OUTPUT
1801
1822
  <html>
1802
1823
  <head/>
1803
1824
  <body>
@@ -1893,10 +1914,16 @@ RSpec.describe IsoDoc do
1893
1914
  </body>
1894
1915
  </html>
1895
1916
  OUTPUT
1917
+ expect(xmlpp(IsoDoc::WordConvert
1918
+ .new(wordstylesheet: "spec/assets/word.css",
1919
+ htmlstylesheet: "spec/assets/html.scss", filename: "test")
1920
+ .word_cleanup(Nokogiri::XML(input)).to_xml)
1921
+ .sub(/^.*<main/m, "<main").sub(%r{</main>.*$}m, "</main>"))
1922
+ .to be_equivalent_to xmlpp(output)
1896
1923
  end
1897
1924
 
1898
1925
  it "allocate widths to tables (Word)" do
1899
- 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")
1926
+ input = <<~INPUT
1900
1927
  <html xmlns:epub="http://www.idpf.org/2007/ops" lang="en">
1901
1928
  <head><style/></head>
1902
1929
  <body lang='EN-US' link='blue' vlink='#954F72'>
@@ -2030,6 +2057,7 @@ RSpec.describe IsoDoc do
2030
2057
  </body>
2031
2058
  </html>
2032
2059
  INPUT
2060
+ output = <<~OUTPUT
2033
2061
  <html xmlns:epub='http://www.idpf.org/2007/ops' lang='en'>
2034
2062
  <head>
2035
2063
  <style/>
@@ -2165,5 +2193,105 @@ RSpec.describe IsoDoc do
2165
2193
  </body>
2166
2194
  </html>
2167
2195
  OUTPUT
2196
+ expect(xmlpp(IsoDoc::WordConvert
2197
+ .new(wordstylesheet: "spec/assets/word.css",
2198
+ htmlstylesheet: "spec/assets/html.scss", filename: "test")
2199
+ .word_cleanup(Nokogiri::XML(input)).to_xml)
2200
+ .sub(/^.*<main/m, "<main").sub(%r{</main>.*$}m, "</main>"))
2201
+ .to be_equivalent_to xmlpp(output)
2202
+ end
2203
+
2204
+ it "generates bare HTML file" do
2205
+ FileUtils.rm_f "test.html"
2206
+ IsoDoc::HtmlConvert.new(
2207
+ { bare: true,
2208
+ htmlstylesheet: "spec/assets/html.scss",
2209
+ filename: "test" },
2210
+ ).convert("test", <<~"INPUT", false)
2211
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
2212
+ <bibdata>
2213
+ <title language="en">test</title>
2214
+ </bibdata>
2215
+ <boilerplate>
2216
+ <feedback-statement>
2217
+ <clause><title>I am boilerplate</title></clause>
2218
+ </feedback-statement>
2219
+ </boilerplate>
2220
+ <preface><foreword>
2221
+ <note>
2222
+ <p id="_f06fd0d1-a203-4f3d-a515-0bdba0f8d83f">These results are based on a study carried out on three different types of kernel.</p>
2223
+ </note>
2224
+ </foreword></preface>
2225
+ </iso-standard>
2226
+ INPUT
2227
+ output = <<~OUTPUT
2228
+ <body lang='en' xml:lang='en'>
2229
+ <main class='main-section'>
2230
+ <button onclick='topFunction()' id='myBtn' title='Go to top'>Top</button>
2231
+ <br/>
2232
+ <div>
2233
+ <h1 class='ForewordTitle'>Foreword</h1>
2234
+ <div class='Note'>
2235
+ <p>
2236
+ &#xA0; These results are based on a study carried out on three
2237
+ different types of kernel.
2238
+ </p>
2239
+ </div>
2240
+ </div>
2241
+ <p class='zzSTDTitle1'>test</p>
2242
+ </main>
2243
+ <script/>
2244
+ </body>
2245
+ OUTPUT
2246
+ expect(File.exist?("test.html")).to be true
2247
+ html = File.read("test.html")
2248
+ .sub(%r{^.*<body}m, "<body")
2249
+ .sub(%r{</body>.*$}m, "</body>")
2250
+ .gsub(%r{<script.+?</script>}m, "<script/>")
2251
+ .sub(%r{(<script/>\s+)+}m, "<script/>")
2252
+ expect(xmlpp(html)).to be_equivalent_to xmlpp(output)
2253
+ end
2254
+
2255
+ it "cleans up lists (HTML)" do
2256
+ input = <<~INPUT
2257
+ <html xmlns:epub="http://www.idpf.org/2007/ops">
2258
+ <head/>
2259
+ <body>
2260
+ <div class="main-section">
2261
+ <ul>
2262
+ <div>N1</div>
2263
+ <li>A</li>
2264
+ <li>B</li>
2265
+ <div>N2</div>
2266
+ <li>C</li>
2267
+ <div>N3</div>
2268
+ </div>
2269
+ </body>
2270
+ </html>
2271
+ INPUT
2272
+ output = <<~OUTPUT
2273
+ <main class='main-section'>
2274
+ <button onclick='topFunction()' id='myBtn' title='Go to top'>Top</button>
2275
+ <ul>
2276
+ <li>
2277
+ A
2278
+ <div>N1</div>
2279
+ </li>
2280
+ <li>
2281
+ B
2282
+ <div>N2</div>
2283
+ </li>
2284
+ <li>
2285
+ C
2286
+ <div>N3</div>
2287
+ </li>
2288
+ </ul>
2289
+ </main>
2290
+ OUTPUT
2291
+ expect(xmlpp(IsoDoc::HtmlConvert
2292
+ .new(htmlstylesheet: "spec/assets/html.scss", filename: "test")
2293
+ .html_cleanup(Nokogiri::XML(input)).to_xml)
2294
+ .sub(/^.*<main/m, "<main").sub(%r{</main>.*$}m, "</main>"))
2295
+ .to be_equivalent_to xmlpp(output)
2168
2296
  end
2169
2297
  end