isodoc 1.6.2 → 1.6.7

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