isodoc 1.6.2 → 1.6.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +2 -12
  3. data/.hound.yml +3 -1
  4. data/.rubocop.yml +4 -6
  5. data/Rakefile +2 -2
  6. data/isodoc.gemspec +3 -2
  7. data/lib/isodoc-yaml/i18n-en.yaml +1 -0
  8. data/lib/isodoc-yaml/i18n-fr.yaml +1 -0
  9. data/lib/isodoc-yaml/i18n-zh-Hans.yaml +1 -0
  10. data/lib/isodoc.rb +0 -2
  11. data/lib/isodoc/convert.rb +7 -1
  12. data/lib/isodoc/function/blocks.rb +5 -4
  13. data/lib/isodoc/function/cleanup.rb +52 -43
  14. data/lib/isodoc/function/inline.rb +7 -7
  15. data/lib/isodoc/function/references.rb +32 -51
  16. data/lib/isodoc/function/section.rb +28 -16
  17. data/lib/isodoc/function/table.rb +21 -22
  18. data/lib/isodoc/function/terms.rb +6 -7
  19. data/lib/isodoc/function/to_word_html.rb +6 -3
  20. data/lib/isodoc/function/utils.rb +181 -163
  21. data/lib/isodoc/gem_tasks.rb +8 -9
  22. data/lib/isodoc/headlesshtml_convert.rb +8 -7
  23. data/lib/isodoc/html_convert.rb +5 -1
  24. data/lib/isodoc/html_function/comments.rb +14 -12
  25. data/lib/isodoc/html_function/footnotes.rb +14 -7
  26. data/lib/isodoc/html_function/html.rb +30 -26
  27. data/lib/isodoc/html_function/postprocess.rb +191 -182
  28. data/lib/isodoc/html_function/sectionsplit.rb +230 -0
  29. data/lib/isodoc/metadata.rb +22 -20
  30. data/lib/isodoc/metadata_contributor.rb +31 -28
  31. data/lib/isodoc/pdf_convert.rb +11 -13
  32. data/lib/isodoc/presentation_function/bibdata.rb +61 -30
  33. data/lib/isodoc/presentation_function/inline.rb +34 -27
  34. data/lib/isodoc/presentation_function/section.rb +54 -19
  35. data/lib/isodoc/presentation_xml_convert.rb +2 -0
  36. data/lib/isodoc/sassc_importer.rb +1 -1
  37. data/lib/isodoc/version.rb +1 -1
  38. data/lib/isodoc/word_function/postprocess.rb +50 -36
  39. data/lib/isodoc/xref.rb +2 -0
  40. data/lib/isodoc/xref/xref_counter.rb +1 -2
  41. data/lib/isodoc/xref/xref_gen.rb +21 -14
  42. data/lib/isodoc/xref/xref_gen_seq.rb +60 -35
  43. data/lib/isodoc/xref/xref_sect_gen.rb +15 -15
  44. data/spec/assets/scripts_override.html +3 -0
  45. data/spec/isodoc/blocks_spec.rb +624 -997
  46. data/spec/isodoc/cleanup_spec.rb +40 -42
  47. data/spec/isodoc/i18n_spec.rb +694 -821
  48. data/spec/isodoc/inline_spec.rb +482 -328
  49. data/spec/isodoc/metadata_spec.rb +384 -379
  50. data/spec/isodoc/postproc_spec.rb +163 -55
  51. data/spec/isodoc/presentation_xml_spec.rb +355 -278
  52. data/spec/isodoc/ref_spec.rb +5 -5
  53. data/spec/isodoc/section_spec.rb +216 -199
  54. data/spec/isodoc/sectionsplit_spec.rb +190 -0
  55. data/spec/isodoc/table_spec.rb +41 -42
  56. data/spec/isodoc/terms_spec.rb +84 -84
  57. data/spec/isodoc/xref_spec.rb +974 -932
  58. metadata +22 -5
@@ -3,7 +3,7 @@
3
3
  require "spec_helper"
4
4
  require "fileutils"
5
5
 
6
- OPTIONS = { wordstylesheet: "spec/assets/word.css",
6
+ options = { wordstylesheet: "spec/assets/word.css",
7
7
  htmlstylesheet: "spec/assets/html.scss" }
8
8
 
9
9
  RSpec.describe IsoDoc do
@@ -191,6 +191,7 @@ RSpec.describe IsoDoc do
191
191
  htmlcoverpage: "spec/assets/htmlcover.html",
192
192
  htmlintropage: "spec/assets/htmlintro.html",
193
193
  scripts: "spec/assets/scripts.html",
194
+ scripts_override: "spec/assets/scripts_override.html",
194
195
  i18nyaml: "spec/assets/i18n.yaml",
195
196
  ulstyle: "l1",
196
197
  olstyle: "l2" },
@@ -215,6 +216,7 @@ RSpec.describe IsoDoc do
215
216
  expect(html).to match(/an empty html cover page/)
216
217
  expect(html).to match(/an empty html intro page/)
217
218
  expect(html).to match(/This is > a script/)
219
+ expect(html).to match(/This is > also a script/)
218
220
  expect(html).not_to match(/CDATA/)
219
221
  expect(html).to match(%r{Anta&#x16D;parolo</h1>})
220
222
  expect(html).to match(%r{html-override})
@@ -957,7 +959,9 @@ RSpec.describe IsoDoc do
957
959
  it "moves images in HTML, using relative file location" do
958
960
  FileUtils.rm_f "spec/test.html"
959
961
  FileUtils.rm_rf "spec/test_htmlimages"
960
- IsoDoc::HtmlConvert.new({ wordstylesheet: "assets/word.css", htmlstylesheet: "assets/html.scss" })
962
+ IsoDoc::HtmlConvert
963
+ .new(wordstylesheet: "assets/word.css",
964
+ htmlstylesheet: "assets/html.scss")
961
965
  .convert("spec/test", <<~"INPUT", false)
962
966
  <iso-standard xmlns="http://riboseinc.com/isoxml">
963
967
  <preface><foreword>
@@ -996,14 +1000,15 @@ RSpec.describe IsoDoc do
996
1000
  it "encodes images in HTML as data URIs" do
997
1001
  FileUtils.rm_f "test.html"
998
1002
  FileUtils.rm_rf "test_htmlimages"
999
- IsoDoc::HtmlConvert.new({ htmlstylesheet: "spec/assets/html.scss", datauriimage: true })
1003
+ IsoDoc::HtmlConvert
1004
+ .new(htmlstylesheet: "spec/assets/html.scss", datauriimage: true)
1000
1005
  .convert("test", <<~"INPUT", false)
1001
1006
  <iso-standard xmlns="http://riboseinc.com/isoxml">
1002
1007
  <preface><foreword>
1003
1008
  <figure id="_">
1004
1009
  <name>Split-it-right sample divider</name>
1005
- <image src="#{File.expand_path(File.join(File.dirname(__FILE__), '..', 'assets/rice_image1.png'))}" id="_" mimetype="image/png"/>
1006
- <image src="spec/assets/rice_image1.png" id="_" mimetype="image/png"/>
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"/>
1007
1012
  </figure>
1008
1013
  </foreword></preface>
1009
1014
  </iso-standard>
@@ -1011,7 +1016,8 @@ RSpec.describe IsoDoc do
1011
1016
  html = File.read("test.html")
1012
1017
  .sub(/^.*<main class="main-section">/m, '<main class="main-section">')
1013
1018
  .sub(%r{</main>.*$}m, "</main>")
1014
- expect(xmlpp(html.gsub(%r{src="data:image/png;base64,[^"]+"}, %{src="data:image/png;base64,_"})))
1019
+ expect(xmlpp(html
1020
+ .gsub(%r{src="data:image/png;base64,[^"]+"}, %{src="data:image/png;base64,_"})))
1015
1021
  .to be_equivalent_to xmlpp(<<~"OUTPUT")
1016
1022
  <main class="main-section"><button onclick="topFunction()" id="myBtn" title="Go to top">Top</button>
1017
1023
  <br />
@@ -1030,7 +1036,8 @@ RSpec.describe IsoDoc do
1030
1036
  it "encodes images in HTML as data URIs, using relative file location" do
1031
1037
  FileUtils.rm_f "spec/test.html"
1032
1038
  FileUtils.rm_rf "spec/test_htmlimages"
1033
- IsoDoc::HtmlConvert.new({ htmlstylesheet: "assets/html.scss", datauriimage: true })
1039
+ IsoDoc::HtmlConvert
1040
+ .new({ htmlstylesheet: "assets/html.scss", datauriimage: true })
1034
1041
  .convert("spec/test", <<~"INPUT", false)
1035
1042
  <iso-standard xmlns="http://riboseinc.com/isoxml">
1036
1043
  <preface><foreword>
@@ -1045,7 +1052,8 @@ RSpec.describe IsoDoc do
1045
1052
  html = File.read("spec/test.html")
1046
1053
  .sub(/^.*<main class="main-section">/m, '<main class="main-section">')
1047
1054
  .sub(%r{</main>.*$}m, "</main>")
1048
- expect(xmlpp(html.gsub(%r{src="data:image/png;base64,[^"]+"}, %{src="data:image/png;base64,_"})))
1055
+ expect(xmlpp(html
1056
+ .gsub(%r{src="data:image/png;base64,[^"]+"}, %{src="data:image/png;base64,_"})))
1049
1057
  .to be_equivalent_to xmlpp(<<~"OUTPUT")
1050
1058
  <main class="main-section"><button onclick="topFunction()" id="myBtn" title="Go to top">Top</button>
1051
1059
  <br />
@@ -1064,7 +1072,7 @@ RSpec.describe IsoDoc do
1064
1072
  it "processes IsoXML terms for HTML" do
1065
1073
  FileUtils.rm_f "test.html"
1066
1074
  FileUtils.rm_f "test.doc"
1067
- IsoDoc::HtmlConvert.new(OPTIONS)
1075
+ IsoDoc::HtmlConvert.new(options)
1068
1076
  .convert("test", <<~"INPUT", false)
1069
1077
  <iso-standard xmlns="http://riboseinc.com/isoxml">
1070
1078
  <sections>
@@ -1121,7 +1129,7 @@ RSpec.describe IsoDoc do
1121
1129
  it "processes empty term modifications" do
1122
1130
  FileUtils.rm_f "test.html"
1123
1131
  FileUtils.rm_f "test.doc"
1124
- IsoDoc::HtmlConvert.new(OPTIONS)
1132
+ IsoDoc::HtmlConvert.new(options)
1125
1133
  .convert("test", <<~"INPUT", false)
1126
1134
  <iso-standard xmlns="http://riboseinc.com/isoxml">
1127
1135
  <sections>
@@ -1158,7 +1166,7 @@ RSpec.describe IsoDoc do
1158
1166
  it "creates continuation styles for multiparagraph list items in Word" do
1159
1167
  FileUtils.rm_f "test.doc"
1160
1168
  FileUtils.rm_f "test.html"
1161
- IsoDoc::WordConvert.new(OPTIONS)
1169
+ IsoDoc::WordConvert.new(options)
1162
1170
  .convert("test", <<~"INPUT", false)
1163
1171
  <iso-standard xmlns="http://riboseinc.com/isoxml">
1164
1172
  <preface><foreword>
@@ -1269,7 +1277,7 @@ RSpec.describe IsoDoc do
1269
1277
  it "does not lose HTML escapes in postprocessing" do
1270
1278
  FileUtils.rm_f "test.doc"
1271
1279
  FileUtils.rm_f "test.html"
1272
- IsoDoc::HtmlConvert.new(OPTIONS)
1280
+ IsoDoc::HtmlConvert.new(options)
1273
1281
  .convert("test", <<~"INPUT", false)
1274
1282
  <iso-standard xmlns="http://riboseinc.com/isoxml">
1275
1283
  <preface><foreword>
@@ -1300,7 +1308,7 @@ RSpec.describe IsoDoc do
1300
1308
  it "does not lose HTML escapes in postprocessing (Word)" do
1301
1309
  FileUtils.rm_f "test.doc"
1302
1310
  FileUtils.rm_f "test.html"
1303
- IsoDoc::WordConvert.new(OPTIONS)
1311
+ IsoDoc::WordConvert.new(options)
1304
1312
  .convert("test", <<~"INPUT", false)
1305
1313
  <iso-standard xmlns="http://riboseinc.com/isoxml">
1306
1314
  <preface><foreword>
@@ -1331,7 +1339,7 @@ RSpec.describe IsoDoc do
1331
1339
  it "propagates example style to paragraphs in postprocessing (Word)" do
1332
1340
  FileUtils.rm_f "test.doc"
1333
1341
  FileUtils.rm_f "test.html"
1334
- IsoDoc::WordConvert.new(OPTIONS).convert("test", <<~"INPUT", false)
1342
+ IsoDoc::WordConvert.new(options).convert("test", <<~"INPUT", false)
1335
1343
  <iso-standard xmlns="http://riboseinc.com/isoxml">
1336
1344
  <preface><foreword>
1337
1345
  <example id="samplecode">
@@ -1362,7 +1370,7 @@ RSpec.describe IsoDoc do
1362
1370
  it "deals with image captions (Word)" do
1363
1371
  FileUtils.rm_f "test.doc"
1364
1372
  FileUtils.rm_f "test.html"
1365
- IsoDoc::WordConvert.new(OPTIONS)
1373
+ IsoDoc::WordConvert.new(options)
1366
1374
  .convert("test", <<~"INPUT", false)
1367
1375
  <iso-standard xmlns="http://riboseinc.com/isoxml">
1368
1376
  <preface><foreword>
@@ -1396,7 +1404,7 @@ RSpec.describe IsoDoc do
1396
1404
  it "deals with empty table titles (Word)" do
1397
1405
  FileUtils.rm_f "test.doc"
1398
1406
  FileUtils.rm_f "test.html"
1399
- IsoDoc::WordConvert.new(OPTIONS)
1407
+ IsoDoc::WordConvert.new(options)
1400
1408
  .convert("test", <<~"INPUT", false)
1401
1409
  <iso-standard xmlns="http://riboseinc.com/isoxml">
1402
1410
  <preface><foreword>
@@ -1457,22 +1465,21 @@ RSpec.describe IsoDoc do
1457
1465
  it "propagates alignment of table cells (Word)" do
1458
1466
  FileUtils.rm_f "test.doc"
1459
1467
  FileUtils.rm_f "test.html"
1460
- IsoDoc::WordConvert.new(OPTIONS)
1468
+ IsoDoc::WordConvert.new(options)
1461
1469
  .convert("test", <<~"INPUT", false)
1462
- #{' '}
1463
- <iso-standard xmlns="http://riboseinc.com/isoxml">
1464
- <preface><foreword>
1465
- <table id="_fe12b8f8-6858-4cd6-af7d-d4b6f3ebd1a7" unnumbered="true"><thead><tr>
1466
- <td rowspan="2" align="left">
1467
- <p id="_c47d9b39-adb2-431d-9320-78cb148fdb56">Output wavelength</p>
1468
- <p id="_c47d9b39-adb2-431d-9320-78cb148fdb57">Output wavelength</p>
1469
- </td>
1470
- <th colspan="3" align="right"><p id="_c47d9b39-adb2-431d-9320-78cb148fdb58">Predictive wavelengths</p></th>
1471
- </tr>
1472
- </thead>
1473
- </table>
1474
- </preface>
1475
- </iso-standard>
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>
1476
1483
  INPUT
1477
1484
  word = File.read("test.doc")
1478
1485
  .sub(/^.*<div class="WordSection2">/m, '<div class="WordSection2" xmlns:m="m">')
@@ -1517,7 +1524,7 @@ RSpec.describe IsoDoc do
1517
1524
  end
1518
1525
 
1519
1526
  it "cleans up boilerplate" do
1520
- 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
1521
1528
  <html>
1522
1529
  <head/>
1523
1530
  <body>
@@ -1535,6 +1542,7 @@ RSpec.describe IsoDoc do
1535
1542
  </body>
1536
1543
  </html>
1537
1544
  INPUT
1545
+ html = <<~OUTPUT
1538
1546
  <main class='main-section'>
1539
1547
  <button onclick='topFunction()' id='myBtn' title='Go to top'>Top</button>
1540
1548
  <hr/>
@@ -1552,27 +1560,7 @@ RSpec.describe IsoDoc do
1552
1560
  </div>
1553
1561
  </main>
1554
1562
  OUTPUT
1555
- end
1556
-
1557
- it "cleans up boilerplate (Word)" do
1558
- 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")
1559
- <html>
1560
- <head/>
1561
- <body>
1562
- <div class="main-section">
1563
- <div id="boilerplate-copyright"> <h1>Copyright</h1> </div>
1564
- <div id="boilerplate-license"> <h1>License</h1> </div>
1565
- <div id="boilerplate-legal"> <h1>Legal</h1> </div>
1566
- <div id="boilerplate-feedback"> <h1>Feedback</h1> </div>
1567
- <hr/>
1568
- <div id="boilerplate-feedback-destination"/>
1569
- <div id="boilerplate-legal-destination"/>
1570
- <div id="boilerplate-license-destination"/>
1571
- <div id="boilerplate-copyright-destination"/>
1572
- </div>
1573
- </body>
1574
- </html>
1575
- INPUT
1563
+ doc = <<~OUTPUT
1576
1564
  <html>
1577
1565
  <head/>
1578
1566
  <body>
@@ -1594,6 +1582,18 @@ RSpec.describe IsoDoc do
1594
1582
  </body>
1595
1583
  </html>
1596
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)
1597
1597
  end
1598
1598
 
1599
1599
  it "deals with landscape and portrait pagebreaks (Word)" do
@@ -1796,7 +1796,7 @@ RSpec.describe IsoDoc do
1796
1796
  end
1797
1797
 
1798
1798
  it "expands out nested tables in Word" do
1799
- 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
1800
1800
  <html>
1801
1801
  <head/>
1802
1802
  <body>
@@ -1818,6 +1818,7 @@ RSpec.describe IsoDoc do
1818
1818
  </body>
1819
1819
  </html>
1820
1820
  INPUT
1821
+ output = <<~OUTPUT
1821
1822
  <html>
1822
1823
  <head/>
1823
1824
  <body>
@@ -1913,10 +1914,16 @@ RSpec.describe IsoDoc do
1913
1914
  </body>
1914
1915
  </html>
1915
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)
1916
1923
  end
1917
1924
 
1918
1925
  it "allocate widths to tables (Word)" do
1919
- 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
1920
1927
  <html xmlns:epub="http://www.idpf.org/2007/ops" lang="en">
1921
1928
  <head><style/></head>
1922
1929
  <body lang='EN-US' link='blue' vlink='#954F72'>
@@ -2050,6 +2057,7 @@ RSpec.describe IsoDoc do
2050
2057
  </body>
2051
2058
  </html>
2052
2059
  INPUT
2060
+ output = <<~OUTPUT
2053
2061
  <html xmlns:epub='http://www.idpf.org/2007/ops' lang='en'>
2054
2062
  <head>
2055
2063
  <style/>
@@ -2185,5 +2193,105 @@ RSpec.describe IsoDoc do
2185
2193
  </body>
2186
2194
  </html>
2187
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)
2188
2296
  end
2189
2297
  end
@@ -20,36 +20,55 @@ RSpec.describe IsoDoc do
20
20
  end
21
21
 
22
22
  it "localises numbers in MathML" do
23
- expect(xmlpp(IsoDoc::PresentationXMLConvert.new({})
24
- .convert("test", <<~INPUT, true)).sub(%r{<localized-strings>.*</localized-strings>}m, "")).to be_equivalent_to xmlpp(<<~OUTPUT)
25
- <iso-standard xmlns="http://riboseinc.com/isoxml">
23
+ input = <<~INPUT
24
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
25
+ <bibdata>
26
+ <title language="en">test</title>
27
+ </bibdata>
28
+ <preface>
29
+ <p>
30
+ <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>64212149677264515</mn></math></stem>
31
+ <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>642121496772645.15</mn></math></stem>
32
+ <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>30000</mn></math></stem>
33
+ <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>P</mi><mfenced open="(" close=")"><mrow><mi>X</mi><mo>≥</mo><msub><mrow><mi>X</mi></mrow><mrow><mo>max</mo></mrow></msub></mrow></mfenced><mo>=</mo><munderover><mrow><mo>∑</mo></mrow><mrow><mrow><mi>j</mi><mo>=</mo><msub><mrow><mi>X</mi></mrow><mrow><mo>max</mo></mrow></msub></mrow></mrow><mrow><mn>1000</mn></mrow></munderover><mfenced open="(" close=")"><mtable><mtr><mtd><mn>1000</mn></mtd></mtr><mtr><mtd><mi>j</mi></mtd></mtr></mtable></mfenced><msup><mrow><mi>p</mi></mrow><mrow><mi>j</mi></mrow></msup><msup><mrow><mfenced open="(" close=")"><mrow><mn>1</mn><mo>−</mo><mi>p</mi></mrow></mfenced></mrow><mrow><mrow><mn>1.003</mn><mo>−</mo><mi>j</mi></mrow></mrow></msup></math></stem></p>
34
+ </preface>
35
+ </iso-standard>
36
+ INPUT
37
+ output = <<~OUTPUT
38
+ <iso-standard xmlns='http://riboseinc.com/isoxml' type='presentation'>
26
39
  <bibdata>
27
- <title language="en">test</title>
28
- </bibdata>
29
- <preface>
30
- <p>
31
- <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>64212149677264515</mn></math></stem>
32
- <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>642121496772645.15</mn></math></stem>
33
- <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>30000</mn></math></stem>
34
- <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>P</mi><mfenced open="(" close=")"><mrow><mi>X</mi><mo>≥</mo><msub><mrow><mi>X</mi></mrow><mrow><mo>max</mo></mrow></msub></mrow></mfenced><mo>=</mo><munderover><mrow><mo>∑</mo></mrow><mrow><mrow><mi>j</mi><mo>=</mo><msub><mrow><mi>X</mi></mrow><mrow><mo>max</mo></mrow></msub></mrow></mrow><mrow><mn>1000</mn></mrow></munderover><mfenced open="(" close=")"><mtable><mtr><mtd><mn>1000</mn></mtd></mtr><mtr><mtd><mi>j</mi></mtd></mtr></mtable></mfenced><msup><mrow><mi>p</mi></mrow><mrow><mi>j</mi></mrow></msup><msup><mrow><mfenced open="(" close=")"><mrow><mn>1</mn><mo>−</mo><mi>p</mi></mrow></mfenced></mrow><mrow><mrow><mn>1.003</mn><mo>−</mo><mi>j</mi></mrow></mrow></msup></math></stem></p>
35
- </preface>
36
- </iso-standard>
37
- INPUT
38
- <iso-standard xmlns='http://riboseinc.com/isoxml' type='presentation'>
39
- <bibdata>
40
- <title language='en'>test</title>
41
- </bibdata>
42
- <preface>
43
- <p>
44
- 64,212,149,677,264,515
45
- 642,121,496,772,645.15 30,000
46
- <stem type='MathML'>
47
- <math xmlns='http://www.w3.org/1998/Math/MathML'>
48
- <mi>P</mi>
49
- <mfenced open='(' close=')'>
40
+ <title language='en'>test</title>
41
+ </bibdata>
42
+ <preface>
43
+ <p displayorder="1">
44
+ 64,212,149,677,264,515
45
+ 642,121,496,772,645.15 30,000
46
+ <stem type='MathML'>
47
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
48
+ <mi>P</mi>
49
+ <mfenced open='(' close=')'>
50
+ <mrow>
51
+ <mi>X</mi>
52
+ <mo>&#x2265;</mo>
53
+ <msub>
54
+ <mrow>
55
+ <mi>X</mi>
56
+ </mrow>
57
+ <mrow>
58
+ <mo>max</mo>
59
+ </mrow>
60
+ </msub>
61
+ </mrow>
62
+ </mfenced>
63
+ <mo>=</mo>
64
+ <munderover>
65
+ <mrow>
66
+ <mo>&#x2211;</mo>
67
+ </mrow>
68
+ <mrow>
50
69
  <mrow>
51
- <mi>X</mi>
52
- <mo>&#x2265;</mo>
70
+ <mi>j</mi>
71
+ <mo>=</mo>
53
72
  <msub>
54
73
  <mrow>
55
74
  <mi>X</mi>
@@ -59,76 +78,61 @@ RSpec.describe IsoDoc do
59
78
  </mrow>
60
79
  </msub>
61
80
  </mrow>
62
- </mfenced>
63
- <mo>=</mo>
64
- <munderover>
65
- <mrow>
66
- <mo>&#x2211;</mo>
67
- </mrow>
68
- <mrow>
69
- <mrow>
81
+ </mrow>
82
+ <mrow>
83
+ <mn>1,000</mn>
84
+ </mrow>
85
+ </munderover>
86
+ <mfenced open='(' close=')'>
87
+ <mtable>
88
+ <mtr>
89
+ <mtd>
90
+ <mn>1,000</mn>
91
+ </mtd>
92
+ </mtr>
93
+ <mtr>
94
+ <mtd>
70
95
  <mi>j</mi>
71
- <mo>=</mo>
72
- <msub>
73
- <mrow>
74
- <mi>X</mi>
75
- </mrow>
76
- <mrow>
77
- <mo>max</mo>
78
- </mrow>
79
- </msub>
80
- </mrow>
81
- </mrow>
82
- <mrow>
83
- <mn>1,000</mn>
84
- </mrow>
85
- </munderover>
86
- <mfenced open='(' close=')'>
87
- <mtable>
88
- <mtr>
89
- <mtd>
90
- <mn>1,000</mn>
91
- </mtd>
92
- </mtr>
93
- <mtr>
94
- <mtd>
95
- <mi>j</mi>
96
- </mtd>
97
- </mtr>
98
- </mtable>
99
- </mfenced>
100
- <msup>
101
- <mrow>
102
- <mi>p</mi>
103
- </mrow>
104
- <mrow>
105
- <mi>j</mi>
106
- </mrow>
107
- </msup>
108
- <msup>
109
- <mrow>
110
- <mfenced open='(' close=')'>
111
- <mrow>
112
- <mn>1</mn>
113
- <mo>&#x2212;</mo>
114
- <mi>p</mi>
115
- </mrow>
116
- </mfenced>
117
- </mrow>
118
- <mrow>
96
+ </mtd>
97
+ </mtr>
98
+ </mtable>
99
+ </mfenced>
100
+ <msup>
101
+ <mrow>
102
+ <mi>p</mi>
103
+ </mrow>
104
+ <mrow>
105
+ <mi>j</mi>
106
+ </mrow>
107
+ </msup>
108
+ <msup>
109
+ <mrow>
110
+ <mfenced open='(' close=')'>
119
111
  <mrow>
120
- <mn>1.003</mn>
112
+ <mn>1</mn>
121
113
  <mo>&#x2212;</mo>
122
- <mi>j</mi>
114
+ <mi>p</mi>
123
115
  </mrow>
116
+ </mfenced>
117
+ </mrow>
118
+ <mrow>
119
+ <mrow>
120
+ <mn>1.003</mn>
121
+ <mo>&#x2212;</mo>
122
+ <mi>j</mi>
124
123
  </mrow>
125
- </msup>
126
- </math>
127
- </stem>
128
- </p>
129
- </preface>
130
- </iso-standard>
131
- OUTPUT
124
+ </mrow>
125
+ </msup>
126
+ </math>
127
+ </stem>
128
+ </p>
129
+ </preface>
130
+ </iso-standard>
131
+ OUTPUT
132
+ expect(xmlpp(IsoDoc::PresentationXMLConvert.new({})
133
+ .convert("test", input, true))
134
+ .sub(%r{<localized-strings>.*</localized-strings>}m, ""))
135
+ .to be_equivalent_to xmlpp(output)
132
136
  end
133
137
 
134
138
  context "when twitter_cldr_localiser_symbols has additional options" do
@@ -252,7 +256,7 @@ RSpec.describe IsoDoc do
252
256
  </bibdata>
253
257
 
254
258
  <preface>
255
- <p>
259
+ <p displayorder="1">
256
260
  30,000
257
261
  <stem type='MathML'>
258
262
  <math xmlns='http://www.w3.org/1998/Math/MathML'>
@@ -369,7 +373,8 @@ RSpec.describe IsoDoc do
369
373
 
370
374
  before do
371
375
  allow_any_instance_of(IsoDoc::PresentationXMLConvert)
372
- .to(receive(:twitter_cldr_localiser_symbols).and_return(additional_symbols))
376
+ .to(receive(:twitter_cldr_localiser_symbols)
377
+ .and_return(additional_symbols))
373
378
  end
374
379
 
375
380
  it "Supports twitter_cldr_localiser_symbols fraction options" do
@@ -381,34 +386,53 @@ RSpec.describe IsoDoc do
381
386
  end
382
387
 
383
388
  it "localises numbers in MathML in French" do
384
- expect(xmlpp(IsoDoc::PresentationXMLConvert.new({})
385
- .convert("test", <<~INPUT, true)).sub(%r{<localized-strings>.*</localized-strings>}m, "")).to be_equivalent_to xmlpp(<<~OUTPUT)
386
- <iso-standard xmlns="http://riboseinc.com/isoxml">
389
+ input = <<~INPUT
390
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
391
+ <bibdata>
392
+ <title language="en">test</title>
393
+ <language>fr</language>
394
+ </bibdata>
395
+ <preface>
396
+ <p><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>30000</mn></math>
397
+ <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>P</mi><mfenced open="(" close=")"><mrow><mi>X</mi><mo>≥</mo><msub><mrow><mi>X</mi></mrow><mrow><mo>max</mo></mrow></msub></mrow></mfenced><mo>=</mo><munderover><mrow><mo>∑</mo></mrow><mrow><mrow><mi>j</mi><mo>=</mo><msub><mrow><mi>X</mi></mrow><mrow><mo>max</mo></mrow></msub></mrow></mrow><mrow><mn>1000</mn></mrow></munderover><mfenced open="(" close=")"><mtable><mtr><mtd><mn>1000</mn></mtd></mtr><mtr><mtd><mi>j</mi></mtd></mtr></mtable></mfenced><msup><mrow><mi>p</mi></mrow><mrow><mi>j</mi></mrow></msup><msup><mrow><mfenced open="(" close=")"><mrow><mn>1</mn><mo>−</mo><mi>p</mi></mrow></mfenced></mrow><mrow><mrow><mn>1.003</mn><mo>−</mo><mi>j</mi></mrow></mrow></msup></math></stem></p>
398
+ </preface>
399
+ </iso-standard>
400
+ INPUT
401
+ output = <<~OUTPUT
402
+ <iso-standard xmlns='http://riboseinc.com/isoxml' type='presentation'>
387
403
  <bibdata>
388
- <title language="en">test</title>
389
- <language>fr</language>
390
- </bibdata>
391
- <preface>
392
- <p><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>30000</mn></math>
393
- <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>P</mi><mfenced open="(" close=")"><mrow><mi>X</mi><mo>≥</mo><msub><mrow><mi>X</mi></mrow><mrow><mo>max</mo></mrow></msub></mrow></mfenced><mo>=</mo><munderover><mrow><mo>∑</mo></mrow><mrow><mrow><mi>j</mi><mo>=</mo><msub><mrow><mi>X</mi></mrow><mrow><mo>max</mo></mrow></msub></mrow></mrow><mrow><mn>1000</mn></mrow></munderover><mfenced open="(" close=")"><mtable><mtr><mtd><mn>1000</mn></mtd></mtr><mtr><mtd><mi>j</mi></mtd></mtr></mtable></mfenced><msup><mrow><mi>p</mi></mrow><mrow><mi>j</mi></mrow></msup><msup><mrow><mfenced open="(" close=")"><mrow><mn>1</mn><mo>−</mo><mi>p</mi></mrow></mfenced></mrow><mrow><mrow><mn>1.003</mn><mo>−</mo><mi>j</mi></mrow></mrow></msup></math></stem></p>
394
- </preface>
395
- </iso-standard>
396
- INPUT
397
- <iso-standard xmlns='http://riboseinc.com/isoxml' type='presentation'>
398
- <bibdata>
399
- <title language='en'>test</title>
400
- <language current='true'>fr</language>
401
- </bibdata>
402
- <preface>
403
- <p>
404
- 30&#x202F;000
405
- <stem type='MathML'>
406
- <math xmlns='http://www.w3.org/1998/Math/MathML'>
407
- <mi>P</mi>
408
- <mfenced open='(' close=')'>
404
+ <title language='en'>test</title>
405
+ <language current='true'>fr</language>
406
+ </bibdata>
407
+ <preface>
408
+ <p displayorder="1">
409
+ 30&#x202F;000
410
+ <stem type='MathML'>
411
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
412
+ <mi>P</mi>
413
+ <mfenced open='(' close=')'>
414
+ <mrow>
415
+ <mi>X</mi>
416
+ <mo>&#x2265;</mo>
417
+ <msub>
418
+ <mrow>
419
+ <mi>X</mi>
420
+ </mrow>
421
+ <mrow>
422
+ <mo>max</mo>
423
+ </mrow>
424
+ </msub>
425
+ </mrow>
426
+ </mfenced>
427
+ <mo>=</mo>
428
+ <munderover>
429
+ <mrow>
430
+ <mo>&#x2211;</mo>
431
+ </mrow>
432
+ <mrow>
409
433
  <mrow>
410
- <mi>X</mi>
411
- <mo>&#x2265;</mo>
434
+ <mi>j</mi>
435
+ <mo>=</mo>
412
436
  <msub>
413
437
  <mrow>
414
438
  <mi>X</mi>
@@ -418,109 +442,113 @@ RSpec.describe IsoDoc do
418
442
  </mrow>
419
443
  </msub>
420
444
  </mrow>
421
- </mfenced>
422
- <mo>=</mo>
423
- <munderover>
424
- <mrow>
425
- <mo>&#x2211;</mo>
426
- </mrow>
427
- <mrow>
428
- <mrow>
445
+ </mrow>
446
+ <mrow>
447
+ <mn>1&#x202F;000</mn>
448
+ </mrow>
449
+ </munderover>
450
+ <mfenced open='(' close=')'>
451
+ <mtable>
452
+ <mtr>
453
+ <mtd>
454
+ <mn>1&#x202F;000</mn>
455
+ </mtd>
456
+ </mtr>
457
+ <mtr>
458
+ <mtd>
429
459
  <mi>j</mi>
430
- <mo>=</mo>
431
- <msub>
432
- <mrow>
433
- <mi>X</mi>
434
- </mrow>
435
- <mrow>
436
- <mo>max</mo>
437
- </mrow>
438
- </msub>
439
- </mrow>
440
- </mrow>
441
- <mrow>
442
- <mn>1&#x202F;000</mn>
443
- </mrow>
444
- </munderover>
445
- <mfenced open='(' close=')'>
446
- <mtable>
447
- <mtr>
448
- <mtd>
449
- <mn>1&#x202F;000</mn>
450
- </mtd>
451
- </mtr>
452
- <mtr>
453
- <mtd>
454
- <mi>j</mi>
455
- </mtd>
456
- </mtr>
457
- </mtable>
458
- </mfenced>
459
- <msup>
460
- <mrow>
461
- <mi>p</mi>
462
- </mrow>
463
- <mrow>
464
- <mi>j</mi>
465
- </mrow>
466
- </msup>
467
- <msup>
468
- <mrow>
469
- <mfenced open='(' close=')'>
470
- <mrow>
471
- <mn>1</mn>
472
- <mo>&#x2212;</mo>
473
- <mi>p</mi>
474
- </mrow>
475
- </mfenced>
476
- </mrow>
477
- <mrow>
460
+ </mtd>
461
+ </mtr>
462
+ </mtable>
463
+ </mfenced>
464
+ <msup>
465
+ <mrow>
466
+ <mi>p</mi>
467
+ </mrow>
468
+ <mrow>
469
+ <mi>j</mi>
470
+ </mrow>
471
+ </msup>
472
+ <msup>
473
+ <mrow>
474
+ <mfenced open='(' close=')'>
478
475
  <mrow>
479
- <mn>1,003</mn>
476
+ <mn>1</mn>
480
477
  <mo>&#x2212;</mo>
481
- <mi>j</mi>
478
+ <mi>p</mi>
482
479
  </mrow>
480
+ </mfenced>
481
+ </mrow>
482
+ <mrow>
483
+ <mrow>
484
+ <mn>1,003</mn>
485
+ <mo>&#x2212;</mo>
486
+ <mi>j</mi>
483
487
  </mrow>
484
- </msup>
485
- </math>
486
- </stem>
487
- </p>
488
- </preface>
489
- </iso-standard>
490
- OUTPUT
488
+ </mrow>
489
+ </msup>
490
+ </math>
491
+ </stem>
492
+ </p>
493
+ </preface>
494
+ </iso-standard>
495
+ OUTPUT
496
+ expect(xmlpp(IsoDoc::PresentationXMLConvert.new({})
497
+ .convert("test", input, true))
498
+ .sub(%r{<localized-strings>.*</localized-strings>}m, ""))
499
+ .to be_equivalent_to xmlpp(output)
491
500
  end
492
501
 
493
502
  it "customises localisation of numbers" do
494
503
  mock_symbols
495
- expect(xmlpp(IsoDoc::PresentationXMLConvert.new({})
496
- .convert("test", <<~INPUT, true)).sub(%r{<localized-strings>.*</localized-strings>}m, "")).to be_equivalent_to xmlpp(<<~OUTPUT)
497
- <iso-standard xmlns="http://riboseinc.com/isoxml">
498
- <bibdata>
499
- <title language="en">test</title>
500
- <language>fr</language>
504
+ input = <<~INPUT
505
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
506
+ <bibdata>
507
+ <title language="en">test</title>
508
+ <language>fr</language>
509
+ </bibdata>
510
+ <preface>
511
+ <p><stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>30000</mn></math></stem>
512
+ <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>P</mi><mfenced open="(" close=")"><mrow><mi>X</mi><mo>≥</mo><msub><mrow><mi>X</mi></mrow><mrow><mo>max</mo></mrow></msub></mrow></mfenced><mo>=</mo><munderover><mrow><mo>∑</mo></mrow><mrow><mrow><mi>j</mi><mo>=</mo><msub><mrow><mi>X</mi></mrow><mrow><mo>max</mo></mrow></msub></mrow></mrow><mrow><mn>1000</mn></mrow></munderover><mfenced open="(" close=")"><mtable><mtr><mtd><mn>1000</mn></mtd></mtr><mtr><mtd><mi>j</mi></mtd></mtr></mtable></mfenced><msup><mrow><mi>p</mi></mrow><mrow><mi>j</mi></mrow></msup><msup><mrow><mfenced open="(" close=")"><mrow><mn>0.0000032</mn><mo>−</mo><mi>p</mi></mrow></mfenced></mrow><mrow><mrow><mn>1.003</mn><mo>−</mo><mi>j</mi></mrow></mrow></msup></math></stem></p>
513
+ </preface>
514
+ </iso-standard>
515
+ INPUT
516
+ output = <<~OUTPUT
517
+ <iso-standard xmlns='http://riboseinc.com/isoxml' type='presentation'>
518
+ <bibdata>
519
+ <title language='en'>test</title>
520
+ <language current='true'>fr</language>
501
521
  </bibdata>
502
- <preface>
503
- <p><stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>30000</mn></math></stem>
504
- <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>P</mi><mfenced open="(" close=")"><mrow><mi>X</mi><mo>≥</mo><msub><mrow><mi>X</mi></mrow><mrow><mo>max</mo></mrow></msub></mrow></mfenced><mo>=</mo><munderover><mrow><mo>∑</mo></mrow><mrow><mrow><mi>j</mi><mo>=</mo><msub><mrow><mi>X</mi></mrow><mrow><mo>max</mo></mrow></msub></mrow></mrow><mrow><mn>1000</mn></mrow></munderover><mfenced open="(" close=")"><mtable><mtr><mtd><mn>1000</mn></mtd></mtr><mtr><mtd><mi>j</mi></mtd></mtr></mtable></mfenced><msup><mrow><mi>p</mi></mrow><mrow><mi>j</mi></mrow></msup><msup><mrow><mfenced open="(" close=")"><mrow><mn>0.0000032</mn><mo>−</mo><mi>p</mi></mrow></mfenced></mrow><mrow><mrow><mn>1.003</mn><mo>−</mo><mi>j</mi></mrow></mrow></msup></math></stem></p>
505
- </preface>
506
- </iso-standard>
507
- INPUT
508
- <iso-standard xmlns='http://riboseinc.com/isoxml' type='presentation'>
509
- <bibdata>
510
- <title language='en'>test</title>
511
- <language current='true'>fr</language>
512
- </bibdata>
513
522
 
514
- <preface>
515
- <p>
516
- 30'000
517
- <stem type='MathML'>
518
- <math xmlns='http://www.w3.org/1998/Math/MathML'>
519
- <mi>P</mi>
520
- <mfenced open='(' close=')'>
523
+ <preface>
524
+ <p displayorder="1">
525
+ 30'000
526
+ <stem type='MathML'>
527
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
528
+ <mi>P</mi>
529
+ <mfenced open='(' close=')'>
530
+ <mrow>
531
+ <mi>X</mi>
532
+ <mo>&#x2265;</mo>
533
+ <msub>
534
+ <mrow>
535
+ <mi>X</mi>
536
+ </mrow>
537
+ <mrow>
538
+ <mo>max</mo>
539
+ </mrow>
540
+ </msub>
541
+ </mrow>
542
+ </mfenced>
543
+ <mo>=</mo>
544
+ <munderover>
545
+ <mrow>
546
+ <mo>&#x2211;</mo>
547
+ </mrow>
548
+ <mrow>
521
549
  <mrow>
522
- <mi>X</mi>
523
- <mo>&#x2265;</mo>
550
+ <mi>j</mi>
551
+ <mo>=</mo>
524
552
  <msub>
525
553
  <mrow>
526
554
  <mi>X</mi>
@@ -530,81 +558,130 @@ RSpec.describe IsoDoc do
530
558
  </mrow>
531
559
  </msub>
532
560
  </mrow>
533
- </mfenced>
534
- <mo>=</mo>
535
- <munderover>
536
- <mrow>
537
- <mo>&#x2211;</mo>
538
- </mrow>
539
- <mrow>
540
- <mrow>
561
+ </mrow>
562
+ <mrow>
563
+ <mn>1'000</mn>
564
+ </mrow>
565
+ </munderover>
566
+ <mfenced open='(' close=')'>
567
+ <mtable>
568
+ <mtr>
569
+ <mtd>
570
+ <mn>1'000</mn>
571
+ </mtd>
572
+ </mtr>
573
+ <mtr>
574
+ <mtd>
541
575
  <mi>j</mi>
542
- <mo>=</mo>
543
- <msub>
544
- <mrow>
545
- <mi>X</mi>
546
- </mrow>
547
- <mrow>
548
- <mo>max</mo>
549
- </mrow>
550
- </msub>
551
- </mrow>
552
- </mrow>
553
- <mrow>
554
- <mn>1'000</mn>
555
- </mrow>
556
- </munderover>
557
- <mfenced open='(' close=')'>
558
- <mtable>
559
- <mtr>
560
- <mtd>
561
- <mn>1'000</mn>
562
- </mtd>
563
- </mtr>
564
- <mtr>
565
- <mtd>
566
- <mi>j</mi>
567
- </mtd>
568
- </mtr>
569
- </mtable>
570
- </mfenced>
571
- <msup>
572
- <mrow>
573
- <mi>p</mi>
574
- </mrow>
575
- <mrow>
576
- <mi>j</mi>
577
- </mrow>
578
- </msup>
579
- <msup>
580
- <mrow>
581
- <mfenced open='(' close=')'>
582
- <mrow>
583
- <mn>0,0000032</mn>
584
- <mo>&#x2212;</mo>
585
- <mi>p</mi>
586
- </mrow>
587
- </mfenced>
588
- </mrow>
589
- <mrow>
576
+ </mtd>
577
+ </mtr>
578
+ </mtable>
579
+ </mfenced>
580
+ <msup>
581
+ <mrow>
582
+ <mi>p</mi>
583
+ </mrow>
584
+ <mrow>
585
+ <mi>j</mi>
586
+ </mrow>
587
+ </msup>
588
+ <msup>
589
+ <mrow>
590
+ <mfenced open='(' close=')'>
590
591
  <mrow>
591
- <mn>1,003</mn>
592
+ <mn>0,0000032</mn>
592
593
  <mo>&#x2212;</mo>
593
- <mi>j</mi>
594
+ <mi>p</mi>
594
595
  </mrow>
596
+ </mfenced>
597
+ </mrow>
598
+ <mrow>
599
+ <mrow>
600
+ <mn>1,003</mn>
601
+ <mo>&#x2212;</mo>
602
+ <mi>j</mi>
595
603
  </mrow>
596
- </msup>
597
- </math>
598
- </stem>
599
- </p>
600
- </preface>
601
- </iso-standard>
602
- OUTPUT
604
+ </mrow>
605
+ </msup>
606
+ </math>
607
+ </stem>
608
+ </p>
609
+ </preface>
610
+ </iso-standard>
611
+ OUTPUT
612
+ expect(xmlpp(IsoDoc::PresentationXMLConvert.new({})
613
+ .convert("test", input, true))
614
+ .sub(%r{<localized-strings>.*</localized-strings>}m, ""))
615
+ .to be_equivalent_to xmlpp(output)
616
+ end
617
+
618
+ it "resolve address components" do
619
+ input = <<~INPUT
620
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
621
+ <bibdata>
622
+ <contributor>
623
+ <role type='author'/>
624
+ <person>
625
+ <name>
626
+ <completename>Fred Flintstone</completename>
627
+ </name>
628
+ <affiliation>
629
+ <organization>
630
+ <name>Slate Rock and Gravel Company</name>
631
+ <address>
632
+ <street>1 Infinity Loop</street>
633
+ <city>Cupertino</city>
634
+ <state>CA</state>
635
+ <country>USA</country>
636
+ <postcode>95014</postcode>
637
+ </address>
638
+ </organization>
639
+ </affiliation>
640
+ </person>
641
+ </contributor>
642
+ </bibdata>
643
+ </iso-standard>
644
+ INPUT
645
+ output = <<~OUTPUT
646
+ <iso-standard xmlns='http://riboseinc.com/isoxml' type='presentation'>
647
+ <bibdata>
648
+ <contributor>
649
+ <role type='author'/>
650
+ <person>
651
+ <name>
652
+ <completename>Fred Flintstone</completename>
653
+ </name>
654
+ <affiliation>
655
+ <organization>
656
+ <name>Slate Rock and Gravel Company</name>
657
+ <address>
658
+ <formattedAddress>
659
+ 1 Infinity Loop
660
+ <br/>
661
+ Cupertino
662
+ <br/>
663
+ CA
664
+ <br/>
665
+ USA 95014
666
+ </formattedAddress>
667
+ </address>
668
+ </organization>
669
+ </affiliation>
670
+ </person>
671
+ </contributor>
672
+ </bibdata>
673
+ </iso-standard>
674
+ OUTPUT
675
+ expect(xmlpp(IsoDoc::PresentationXMLConvert.new({})
676
+ .convert("test", input, true))
677
+ .sub(%r{<localized-strings>.*</localized-strings>}m, ""))
678
+ .to be_equivalent_to xmlpp(output)
603
679
  end
604
680
 
605
681
  private
606
682
 
607
683
  def mock_symbols
608
- allow_any_instance_of(::IsoDoc::PresentationXMLConvert).to receive(:twitter_cldr_localiser_symbols).and_return(group: "'")
684
+ allow_any_instance_of(::IsoDoc::PresentationXMLConvert)
685
+ .to receive(:twitter_cldr_localiser_symbols).and_return(group: "'")
609
686
  end
610
687
  end