metanorma-standoc 1.7.3 → 1.8.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +11 -41
  3. data/.rubocop.yml +1 -1
  4. data/lib/asciidoctor/standoc/base.rb +34 -45
  5. data/lib/asciidoctor/standoc/basicdoc.rng +5 -3
  6. data/lib/asciidoctor/standoc/blocks.rb +20 -11
  7. data/lib/asciidoctor/standoc/blocks_notes.rb +2 -2
  8. data/lib/asciidoctor/standoc/cleanup.rb +29 -77
  9. data/lib/asciidoctor/standoc/cleanup_block.rb +39 -27
  10. data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +56 -0
  11. data/lib/asciidoctor/standoc/cleanup_inline.rb +26 -29
  12. data/lib/asciidoctor/standoc/cleanup_maths.rb +123 -0
  13. data/lib/asciidoctor/standoc/cleanup_ref.rb +4 -98
  14. data/lib/asciidoctor/standoc/cleanup_ref_dl.rb +94 -0
  15. data/lib/asciidoctor/standoc/cleanup_section.rb +5 -0
  16. data/lib/asciidoctor/standoc/cleanup_terms.rb +2 -2
  17. data/lib/asciidoctor/standoc/converter.rb +0 -1
  18. data/lib/asciidoctor/standoc/front.rb +2 -2
  19. data/lib/asciidoctor/standoc/inline.rb +8 -16
  20. data/lib/asciidoctor/standoc/isodoc.rng +108 -2
  21. data/lib/asciidoctor/standoc/lists.rb +2 -2
  22. data/lib/asciidoctor/standoc/macros_plantuml.rb +1 -1
  23. data/lib/asciidoctor/standoc/ref_sect.rb +2 -2
  24. data/lib/asciidoctor/standoc/reqt.rb +6 -1
  25. data/lib/asciidoctor/standoc/section.rb +12 -80
  26. data/lib/asciidoctor/standoc/table.rb +1 -1
  27. data/lib/asciidoctor/standoc/terms.rb +125 -0
  28. data/lib/asciidoctor/standoc/utils.rb +2 -120
  29. data/lib/asciidoctor/standoc/validate.rb +16 -1
  30. data/lib/metanorma/standoc/version.rb +1 -1
  31. data/metanorma-standoc.gemspec +4 -4
  32. data/spec/{asciidoctor-standoc → asciidoctor}/base_spec.rb +30 -1
  33. data/spec/{asciidoctor-standoc → asciidoctor}/blocks_spec.rb +0 -0
  34. data/spec/{asciidoctor-standoc → asciidoctor}/cleanup_sections_spec.rb +0 -0
  35. data/spec/{asciidoctor-standoc → asciidoctor}/cleanup_spec.rb +408 -6
  36. data/spec/{asciidoctor-standoc → asciidoctor}/datamodel/attributes_table_preprocessor_spec.rb +0 -0
  37. data/spec/{asciidoctor-standoc → asciidoctor}/datamodel/diagram_preprocessor_spec.rb +0 -0
  38. data/spec/{asciidoctor-standoc → asciidoctor}/inline_spec.rb +2 -0
  39. data/spec/{asciidoctor-standoc → asciidoctor}/isobib_cache_spec.rb +4 -4
  40. data/spec/{asciidoctor-standoc → asciidoctor}/lists_spec.rb +0 -0
  41. data/spec/{asciidoctor-standoc → asciidoctor}/macros_json2text_spec.rb +0 -0
  42. data/spec/{asciidoctor-standoc → asciidoctor}/macros_lutaml_spec.rb +0 -0
  43. data/spec/{asciidoctor-standoc → asciidoctor}/macros_plantuml_spec.rb +0 -0
  44. data/spec/{asciidoctor-standoc → asciidoctor}/macros_spec.rb +0 -0
  45. data/spec/{asciidoctor-standoc → asciidoctor}/macros_yaml2text_spec.rb +0 -0
  46. data/spec/{asciidoctor-standoc → asciidoctor}/refs_dl_spec.rb +13 -1
  47. data/spec/{asciidoctor-standoc → asciidoctor}/refs_spec.rb +175 -153
  48. data/spec/{asciidoctor-standoc → asciidoctor}/section_spec.rb +22 -3
  49. data/spec/{asciidoctor-standoc → asciidoctor}/table_spec.rb +0 -0
  50. data/spec/{asciidoctor-standoc → asciidoctor}/validate_spec.rb +20 -0
  51. data/spec/fixtures/action_schemaexpg1.svg +122 -0
  52. data/spec/spec_helper.rb +8 -0
  53. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +47 -47
  54. data/spec/vcr_cassettes/isobib_get_123.yml +14 -14
  55. data/spec/vcr_cassettes/isobib_get_123_1.yml +27 -27
  56. data/spec/vcr_cassettes/isobib_get_123_1_fr.yml +36 -36
  57. data/spec/vcr_cassettes/isobib_get_123_2001.yml +13 -13
  58. data/spec/vcr_cassettes/isobib_get_124.yml +13 -13
  59. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +94 -30
  60. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +45 -45
  61. metadata +49 -46
  62. data/lib/asciidoctor/standoc/log.rb +0 -59
@@ -35,10 +35,25 @@ module Asciidoctor
35
35
 
36
36
  def content_validate(doc)
37
37
  section_validate(doc)
38
+ norm_ref_validate(doc)
38
39
  repeat_id_validate(doc.root)
39
40
  iev_validate(doc.root)
40
41
  end
41
42
 
43
+ def norm_ref_validate(doc)
44
+ found = false
45
+ doc.xpath("//references[@normative = 'true']/bibitem").each do |b|
46
+ next unless docid = b.at("./docidentifier[@type = 'metanorma']")
47
+ next unless /^\[\d+\]$/.match(docid.text)
48
+ @log.add("Bibliography", b, "Numeric reference in normative references")
49
+ found = true
50
+ end
51
+ if found
52
+ clean_exit
53
+ abort("Numeric reference in normative references")
54
+ end
55
+ end
56
+
42
57
  def repeat_id_validate1(ids, x)
43
58
  if ids[x["id"]]
44
59
  @log.add("Anchors", x, "Anchor #{x['id']} has already been used "\
@@ -89,7 +104,7 @@ module Asciidoctor
89
104
  def formattedstr_strip(doc)
90
105
  doc.xpath("//*[@format] | //stem | //bibdata//description | "\
91
106
  "//formattedref | //bibdata//note | //bibdata/abstract | "\
92
- "//bibitem/abstract | //bibitem/note").each do |n|
107
+ "//bibitem/abstract | //bibitem/note | //misc-container").each do |n|
93
108
  n.elements.each do |e|
94
109
  e.traverse do |e1|
95
110
  e1.element? and e1.each { |k, _v| e1.delete(k) }
@@ -19,6 +19,6 @@ module Metanorma
19
19
  end
20
20
 
21
21
  module Standoc
22
- VERSION = "1.7.3".freeze
22
+ VERSION= "1.8.5".freeze
23
23
  end
24
24
  end
@@ -28,26 +28,26 @@ Gem::Specification.new do |spec|
28
28
 
29
29
  spec.add_dependency "asciidoctor", "~> 2.0.0"
30
30
  spec.add_dependency "ruby-jing"
31
- spec.add_dependency "isodoc", "~> 1.4.2"
31
+ spec.add_dependency "isodoc", "~> 1.5.0"
32
32
  spec.add_dependency "iev", "~> 0.2.1"
33
33
  spec.add_dependency "metanorma-plugin-datastruct"
34
34
  spec.add_dependency "metanorma-plugin-lutaml", "~> 0.2.1"
35
35
  # relaton-cli not just relaton, to avoid circular reference in metanorma
36
36
  spec.add_dependency "relaton-cli", "~> 1.7.0"
37
37
  spec.add_dependency "relaton-iev", "~> 1.1.0"
38
- spec.add_dependency "sterile", "~> 1.0.14"
39
38
  spec.add_dependency "concurrent-ruby"
40
39
  spec.add_dependency "unicode2latex", "~> 0.0.1"
41
- spec.add_dependency "mimemagic"
40
+ spec.add_dependency "metanorma-utils", "~> 1.0.2"
42
41
  spec.add_dependency "mathml2asciimath"
43
42
  spec.add_dependency "latexmath"
43
+ spec.add_dependency "asciimath2unitsml", "~> 0.2.0"
44
44
 
45
45
  spec.add_development_dependency "byebug"
46
46
  spec.add_development_dependency "sassc", "2.4.0"
47
47
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
48
48
  spec.add_development_dependency "guard", "~> 2.14"
49
49
  spec.add_development_dependency "guard-rspec", "~> 4.7"
50
- spec.add_development_dependency "rake", "~> 12.0"
50
+ spec.add_development_dependency "rake", "~> 13.0"
51
51
  spec.add_development_dependency "rspec", "~> 3.6"
52
52
  spec.add_development_dependency "rubocop", "= 0.54.0"
53
53
  spec.add_development_dependency "simplecov", "~> 0.15"
@@ -32,7 +32,36 @@ RSpec.describe Asciidoctor::Standoc do
32
32
  expect(File.exist?("htmlstyle.css")).to be false
33
33
  end
34
34
 
35
- it "processes publisher abbreviations" do
35
+ it "assigns default scripts to major languages" do
36
+ FileUtils.rm_f "test.doc"
37
+ expect(xmlpp(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
38
+ = Document title
39
+ Author
40
+ :docfile: test.adoc
41
+ :novalid:
42
+ :language: ar
43
+ INPUT
44
+ <standard-document xmlns='https://www.metanorma.org/ns/standoc' type='semantic' version='#{Metanorma::Standoc::VERSION}'>
45
+ <bibdata type='standard'>
46
+ <title language='en' format='text/plain'>Document title</title>
47
+ <language>ar</language>
48
+ <script>Arab</script>
49
+ <status>
50
+ <stage>published</stage>
51
+ </status>
52
+ <copyright>
53
+ <from>2021</from>
54
+ </copyright>
55
+ <ext>
56
+ <doctype>article</doctype>
57
+ </ext>
58
+ </bibdata>
59
+ <sections> </sections>
60
+ </standard-document>
61
+ OUTPUT
62
+ end
63
+
64
+ it "processes publisher abbreviations" do
36
65
  mock_org_abbrevs
37
66
  expect(xmlpp(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
38
67
  = Document title
@@ -3,6 +3,170 @@ require "relaton_iec"
3
3
  require "fileutils"
4
4
 
5
5
  RSpec.describe Asciidoctor::Standoc do
6
+ it "processes svgmap" do
7
+ FileUtils.cp "spec/fixtures/action_schemaexpg1.svg", "action_schemaexpg1.svg"
8
+ FileUtils.cp "spec/fixtures/action_schemaexpg1.svg", "action_schemaexpg2.svg"
9
+ expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
10
+ #{ASCIIDOC_BLANK_HDR}
11
+
12
+ [svgmap]
13
+ ====
14
+ * <<ref1,Computer>>; http://www.example.com
15
+ ====
16
+
17
+ [[ref1]]
18
+ [.svgmap]
19
+ ====
20
+ image::action_schemaexpg1.svg[]
21
+
22
+ * <<ref1,Computer>>; mn://action_schema
23
+ * http://www.example.com[Phone]; http://www.example.com
24
+ ====
25
+
26
+ [svgmap]
27
+ ====
28
+ [alt=Workmap]
29
+ image::action_schemaexpg2.svg[]
30
+
31
+ * <<ref1,Computer>>; href1.htm
32
+ * http://www.example.com[Phone]; mn://basic_attribute_schema
33
+ * <<express:action_schema:action_schema.basic,Coffee>>; mn://support_resource_schema
34
+ ====
35
+ INPUT
36
+ #{BLANK_HDR}
37
+ <sections>
38
+ <svgmap id='_'>
39
+ <target href='http://www.example.com'>
40
+ <xref target='ref1'>Computer</xref>
41
+ </target>
42
+ </svgmap>
43
+ <figure id='_'>
44
+ <image src='action_schemaexpg1.svg' id='_' mimetype='image/svg+xml' height='auto' width='auto'/>
45
+ </figure>
46
+ <svgmap id='_'>
47
+ <figure id='_'>
48
+ <image src='action_schemaexpg2.svg' id='_' mimetype='image/svg+xml' height='auto' width='auto' alt='Workmap'/>
49
+ </figure>
50
+ <target href='mn://support_resource_schema'>
51
+ <eref bibitemid='express_action_schema' citeas=''>
52
+ <localityStack>
53
+ <locality type='anchor'>
54
+ <referenceFrom>action_schema.basic</referenceFrom>
55
+ </locality>
56
+ </localityStack>
57
+ Coffee
58
+ </eref>
59
+ </target>
60
+ </svgmap>
61
+ </sections>
62
+ <bibliography>
63
+ <references hidden='true' normative='false'>
64
+ <bibitem id='express_action_schema' type='internal'>
65
+ <docidentifier type='repository'>express/action_schema</docidentifier>
66
+ </bibitem>
67
+ </references>
68
+ </bibliography>
69
+ </standard-document>
70
+ OUTPUT
71
+ expect(xmlpp(File.read("action_schemaexpg1.svg", encoding: "utf-8").sub(%r{<image .*</image>}m, ""))).to be_equivalent_to <<~OUTPUT
72
+ <?xml version='1.0' encoding='UTF-8'?>
73
+ <!-- Generator: Adobe Illustrator 25.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
74
+ <svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' id='Layer_1' x='0px' y='0px' viewBox='0 0 595.28 841.89' style='enable-background:new 0 0 595.28 841.89;' xml:space='preserve'>
75
+ <style type='text/css'> .st0{fill:none;stroke:#000000;stroke-miterlimit:10;} </style>
76
+ <a xlink:href='#ref1'>
77
+ <rect x='123.28' y='273.93' class='st0' width='88.05' height='41.84'/>
78
+ </a>
79
+ <a xlink:href='mn://basic_attribute_schema'>
80
+ <rect x='324.69' y='450.52' class='st0' width='132.62' height='40.75'/>
81
+ </a>
82
+ <a xlink:href='mn://support_resource_schema'>
83
+ <rect x='324.69' y='528.36' class='st0' width='148.16' height='40.75'/>
84
+ </a>
85
+ </svg>
86
+ OUTPUT
87
+ expect(xmlpp(File.read("action_schemaexpg2.svg", encoding: "utf-8").sub(%r{<image .*</image>}m, ""))).to be_equivalent_to <<~OUTPUT
88
+ <?xml version='1.0' encoding='UTF-8'?>
89
+ <!-- Generator: Adobe Illustrator 25.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
90
+ <svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' id='Layer_1' x='0px' y='0px' viewBox='0 0 595.28 841.89' style='enable-background:new 0 0 595.28 841.89;' xml:space='preserve'>
91
+ <style type='text/css'> .st0{fill:none;stroke:#000000;stroke-miterlimit:10;} </style>
92
+ <a xlink:href='mn://action_schema'>
93
+ <rect x='123.28' y='273.93' class='st0' width='88.05' height='41.84'/>
94
+ </a>
95
+ <a xlink:href='http://www.example.com'>
96
+ <rect x='324.69' y='450.52' class='st0' width='132.62' height='40.75'/>
97
+ </a>
98
+ <a xlink:href='mn://support_resource_schema'>
99
+ <rect x='324.69' y='528.36' class='st0' width='148.16' height='40.75'/>
100
+ </a>
101
+ </svg>
102
+ OUTPUT
103
+ end
104
+
105
+ it "processes markup in sourcecode" do
106
+ expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
107
+ #{ASCIIDOC_BLANK_HDR}
108
+
109
+ [source]
110
+ ----
111
+ <tag/>
112
+ ----
113
+
114
+ [[A]]
115
+ [source]
116
+ ----
117
+ var {{{*x*}}} : {{{<<A,recursive>>}}} <tag/>
118
+ ----
119
+
120
+
121
+ INPUT
122
+ #{BLANK_HDR}
123
+ <sections>
124
+ <sourcecode id='_'>&lt;tag/&gt;</sourcecode>
125
+ <sourcecode id='A'>
126
+ var
127
+ <strong>x</strong>
128
+ :
129
+ <xref target='A'>recursive</xref>
130
+ &lt;tag/&gt;
131
+ </sourcecode>
132
+ </sections>
133
+ </standard-document>
134
+ OUTPUT
135
+ end
136
+
137
+ it "processes markup in sourcecode with custom delimiters" do
138
+ expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
139
+ = Document title
140
+ Author
141
+ :docfile: test.adoc
142
+ :nodoc:
143
+ :novalid:
144
+ :no-isobib:
145
+ :sourcecode-markup-start: [[[
146
+ :sourcecode-markup-end: ]]]
147
+
148
+ [[A]]
149
+ [source]
150
+ ----
151
+ var [[[*x*]]] : [[[<<A,recursive>>]]]
152
+ ----
153
+
154
+
155
+ INPUT
156
+ #{BLANK_HDR}
157
+ <sections>
158
+ <sourcecode id='A'>
159
+ var
160
+ <strong>x</strong>
161
+ :
162
+ <xref target='A'>recursive</xref>
163
+ </sourcecode>
164
+ </sections>
165
+ </standard-document>
166
+ OUTPUT
167
+ end
168
+
169
+
6
170
  it "applies smartquotes by default" do
7
171
  expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
8
172
  #{ASCIIDOC_BLANK_HDR}
@@ -1597,7 +1761,7 @@ it "sorts symbols lists" do
1597
1761
  == Symbols and abbreviated terms
1598
1762
 
1599
1763
  α:: Definition 1
1600
- xa:: Definition 2
1764
+ Xa:: Definition 2
1601
1765
  x_1_:: Definition 3
1602
1766
  x_m_:: Definition 4
1603
1767
  x:: Definition 5
@@ -1635,7 +1799,7 @@ it "sorts symbols lists" do
1635
1799
  <dd>
1636
1800
  <p id='_'>Definition 3</p>
1637
1801
  </dd>
1638
- <dt>xa</dt>
1802
+ <dt>Xa</dt>
1639
1803
  <dd>
1640
1804
  <p id='_'>Definition 2</p>
1641
1805
  </dd>
@@ -1867,6 +2031,8 @@ input = <<~INPUT
1867
2031
  <<1:>>
1868
2032
  <<1#b>>
1869
2033
  <<:a#b:>>
2034
+ <</%ab>>
2035
+ <<1!>>
1870
2036
 
1871
2037
  INPUT
1872
2038
  expect(xmlpp(Asciidoctor.convert(input, backend: :standoc, header_footer: true).gsub(/<p id="_[^"]+">/, "").gsub('</p>', ""))).to be_equivalent_to (<<~"OUTPUT")
@@ -1888,18 +2054,27 @@ expect(xmlpp(Asciidoctor.convert(input, backend: :standoc, header_footer: true).
1888
2054
  <sections>
1889
2055
  <clause id='a_b' inline-header='false' obligation='normative'>
1890
2056
  <title>A</title>
1891
- <xref target='__ab'/>
2057
+ <eref bibitemid='__ab' citeas=''/>
1892
2058
  <xref target='_'/>
1893
2059
  <xref target='_1'/>
1894
2060
  <xref target='_1_'/>
1895
2061
  <xref target='1#b'/>
1896
2062
  <xref target='_a#b_'/>
2063
+ <xref target='_%ab'/>
2064
+ <xref target='_1_'/>
1897
2065
  </clause>
1898
2066
  </sections>
2067
+ <bibliography>
2068
+ <references hidden='true' normative='false'>
2069
+ <bibitem id='__ab' type='internal'>
2070
+ <docidentifier type='repository'>//ab</docidentifier>
2071
+ </bibitem>
2072
+ </references>
2073
+ </bibliography>
1899
2074
  </standard-document>
1900
2075
  OUTPUT
1901
2076
  expect{Asciidoctor.convert(input, backend: :standoc, header_footer: true)}.to output(%r{normalised identifier in <clause id="a_b" inline-header="false" obligation="normative"/> from a:b}).to_stderr
1902
- expect{Asciidoctor.convert(input, backend: :standoc, header_footer: true)}.to output(%r{normalised identifier in <xref target="__ab"/> from /:ab}).to_stderr
2077
+ expect{Asciidoctor.convert(input, backend: :standoc, header_footer: true)}.to output(%r{normalised identifier in <eref bibitemid="__ab" citeas=""/> from /_ab}).to_stderr
1903
2078
  expect{Asciidoctor.convert(input, backend: :standoc, header_footer: true)}.to output(%r{normalised identifier in <xref target="_"/> from :}).to_stderr
1904
2079
  expect{Asciidoctor.convert(input, backend: :standoc, header_footer: true)}.to output(%r{normalised identifier in <xref target="_1"/> from 1}).to_stderr
1905
2080
  expect{Asciidoctor.convert(input, backend: :standoc, header_footer: true)}.to output(%r{normalised identifier in <xref target="_1_"/> from 1:}).to_stderr
@@ -1943,6 +2118,123 @@ expect(xmlpp(Asciidoctor.convert(input, backend: :standoc, header_footer: true))
1943
2118
  OUTPUT
1944
2119
 
1945
2120
  end
2121
+
2122
+ it "converts UnitsML to MathML" do
2123
+ expect(xmlpp(strip_guid(Asciidoctor.convert(<<~INPUT, backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
2124
+ = Document title
2125
+ Author
2126
+ :stem:
2127
+
2128
+ [stem]
2129
+ ++++
2130
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
2131
+ <mrow>
2132
+ <mn>7</mn>
2133
+ <mtext>unitsml(m*kg^-2)</mtext>
2134
+ <mo>+</mo>
2135
+ <mn>8</mn>
2136
+ <mtext>unitsml(m*kg^-2)</mtext>
2137
+ </mrow>
2138
+ </math>
2139
+ ++++
2140
+ INPUT
2141
+ #{BLANK_HDR}
2142
+ <misc-container>
2143
+ <UnitsML xmlns='http://unitsml.nist.gov/2005'>
2144
+ <UnitSet>
2145
+ <Unit xml:id='U_m.kg-2' dimensionURL='#D_LM-2'>
2146
+ <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
2147
+ <UnitName xml:lang='en'>m*kg^-2</UnitName>
2148
+ <UnitSymbol type='HTML'>
2149
+ m&#160;kg
2150
+ <sup>&#8722;2</sup>
2151
+ </UnitSymbol>
2152
+ <UnitSymbol type='MathML'>
2153
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
2154
+ <mrow>
2155
+ <mi mathvariant='normal'>m</mi>
2156
+ <mo rspace='thickmathspace'>&#8290;</mo>
2157
+ <msup>
2158
+ <mrow>
2159
+ <mi mathvariant='normal'>kg</mi>
2160
+ </mrow>
2161
+ <mrow>
2162
+ <mo>&#8722;</mo>
2163
+ <mn>2</mn>
2164
+ </mrow>
2165
+ </msup>
2166
+ </mrow>
2167
+ </math>
2168
+ </UnitSymbol>
2169
+ <RootUnits>
2170
+ <EnumeratedRootUnit unit='meter'/>
2171
+ <EnumeratedRootUnit unit='gram' prefix='k' powerNumerator='-2'/>
2172
+ </RootUnits>
2173
+ </Unit>
2174
+ </UnitSet>
2175
+ <DimensionSet>
2176
+ <Dimension xml:id='D_LM-2'>
2177
+ <Length symbol='L' powerNumerator='1'/>
2178
+ <Mass symbol='M' powerNumerator='-2'/>
2179
+ </Dimension>
2180
+ </DimensionSet>
2181
+ <PrefixSet>
2182
+ <Prefix prefixBase='10' prefixPower='3' xml:id='NISTp10_3'>
2183
+ <PrefixName xml:lang='en'>kilo</PrefixName>
2184
+ <PrefixSymbol type='ASCII'>k</PrefixSymbol>
2185
+ <PrefixSymbol type='unicode'>k</PrefixSymbol>
2186
+ <PrefixSymbol type='LaTeX'>k</PrefixSymbol>
2187
+ <PrefixSymbol type='HTML'>k</PrefixSymbol>
2188
+ </Prefix>
2189
+ </PrefixSet>
2190
+ </UnitsML>
2191
+ </misc-container>
2192
+ <sections>
2193
+ <formula id='_'>
2194
+ <stem type='MathML'>
2195
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
2196
+ <mrow>
2197
+ <mn>7</mn>
2198
+ <mo rspace='thickmathspace'>&#8290;</mo>
2199
+ <mrow xref='U_m.kg-2'>
2200
+ <mi mathvariant='normal'>m</mi>
2201
+ <mo rspace='thickmathspace'>&#8290;</mo>
2202
+ <msup>
2203
+ <mrow>
2204
+ <mi mathvariant='normal'>kg</mi>
2205
+ </mrow>
2206
+ <mrow>
2207
+ <mo>&#8722;</mo>
2208
+ <mn>2</mn>
2209
+ </mrow>
2210
+ </msup>
2211
+ </mrow>
2212
+ <mo>+</mo>
2213
+ <mn>8</mn>
2214
+ <mo rspace='thickmathspace'>&#8290;</mo>
2215
+ <mrow xref='U_m.kg-2'>
2216
+ <mi mathvariant='normal'>m</mi>
2217
+ <mo rspace='thickmathspace'>&#8290;</mo>
2218
+ <msup>
2219
+ <mrow>
2220
+ <mi mathvariant='normal'>kg</mi>
2221
+ </mrow>
2222
+ <mrow>
2223
+ <mo>&#8722;</mo>
2224
+ <mn>2</mn>
2225
+ </mrow>
2226
+ </msup>
2227
+ </mrow>
2228
+ </mrow>
2229
+ </math>
2230
+ </stem>
2231
+ </formula>
2232
+ </sections>
2233
+ </standard-document>
2234
+ OUTPUT
2235
+
2236
+ end
2237
+
1946
2238
  it "customises italicisation of MathML" do
1947
2239
  input = <<~INPUT
1948
2240
  = Document title
@@ -2109,6 +2401,118 @@ mock_mathml_italicise({ uppergreek: true, upperroman: true, lowergreek: true, lo
2109
2401
 
2110
2402
  end
2111
2403
 
2404
+ it "process express_ref macro with existing bibliography" do
2405
+ expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true, agree_to_terms: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
2406
+ #{ASCIIDOC_BLANK_HDR}
2407
+ == Clause
2408
+
2409
+ <<uml:A:A.B.C,C>>
2410
+ <<uml:A>>
2411
+ <<express-schema:action:action.AA,AA>>
2412
+ <<express-schema:action:action.AB>>
2413
+
2414
+ [[action]]
2415
+ [type="express-schema"]
2416
+ == Action
2417
+
2418
+ [[action.AA]]
2419
+ === AA
2420
+
2421
+ [bibliography]
2422
+ == Bibliography
2423
+ * [[[D,E]]] F
2424
+ INPUT
2425
+ #{BLANK_HDR}
2426
+ <sections>
2427
+ <clause id='_' inline-header='false' obligation='normative'>
2428
+ <title>Clause</title>
2429
+ <p id='_'>
2430
+ <eref bibitemid='uml_A' citeas="">
2431
+ <localityStack>
2432
+ <locality type='anchor'><referenceFrom>A.B.C</referenceFrom></locality>
2433
+ </localityStack>
2434
+ C
2435
+ </eref>
2436
+ <eref bibitemid='uml_A' citeas=""/>
2437
+ <xref target='action.AA'>AA</xref>
2438
+ <xref target='action'>** Missing target action.AB</xref>
2439
+ </p>
2440
+ </clause>
2441
+ <clause id='action' type='express-schema' inline-header='false' obligation='normative'>
2442
+ <title>Action</title>
2443
+ <clause id='action.AA' inline-header='false' obligation='normative'>
2444
+ <title>AA</title>
2445
+ </clause>
2446
+ </clause>
2447
+ </sections>
2448
+ <bibliography>
2449
+ <references id='_' normative='false' obligation='informative'>
2450
+ <title>Bibliography</title>
2451
+ <bibitem id='D'>
2452
+ <formattedref format='application/x-isodoc+xml'>F</formattedref>
2453
+ <docidentifier>E</docidentifier>
2454
+ </bibitem>
2455
+ </references>
2456
+ <references hidden='true' normative='false'>
2457
+ <bibitem id='uml_A' type='internal'>
2458
+ <docidentifier type='repository'>uml/A</docidentifier>
2459
+ </bibitem>
2460
+ </references>
2461
+ </bibliography>
2462
+ </standard-document>
2463
+ OUTPUT
2464
+ end
2465
+
2466
+
2467
+ it "process express_ref macro with no existing bibliography" do
2468
+ expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true, agree_to_terms: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
2469
+ #{ASCIIDOC_BLANK_HDR}
2470
+ [[B]]
2471
+ [type="express-schema"]
2472
+ == Clause
2473
+
2474
+ [[B1]]
2475
+ NOTE: X
2476
+
2477
+ <<express-schema:A:A.B.C,C>>
2478
+ <<express-schema:A>>
2479
+ <<express-schema:B>>
2480
+ <<express-schema:B1>>
2481
+ INPUT
2482
+ #{BLANK_HDR}
2483
+ <sections>
2484
+ <clause id='B' type='express-schema' inline-header='false' obligation='normative'>
2485
+ <title>Clause</title>
2486
+ <note id='B1'>
2487
+ <p id='_'>X</p>
2488
+ </note>
2489
+ <p id='_'>
2490
+ <eref bibitemid='express-schema_A' citeas=''>
2491
+ <localityStack>
2492
+ <locality type='anchor'>
2493
+ <referenceFrom>A.B.C</referenceFrom>
2494
+ </locality>
2495
+ </localityStack>
2496
+ C
2497
+ </eref>
2498
+ <eref bibitemid='express-schema_A' citeas=''/>
2499
+ <xref target='B'/>
2500
+ <xref target='B1'/>
2501
+ </p>
2502
+ </clause>
2503
+ </sections>
2504
+ <bibliography>
2505
+ <references hidden='true' normative='false'>
2506
+ <bibitem id='express-schema_A' type='internal'>
2507
+ <docidentifier type='repository'>express-schema/A</docidentifier>
2508
+ </bibitem>
2509
+ </references>
2510
+ </bibliography>
2511
+ </standard-document>
2512
+ OUTPUT
2513
+ end
2514
+
2515
+
2112
2516
  private
2113
2517
 
2114
2518
  def mock_mathml_italicise(x)
@@ -2230,6 +2634,4 @@ OUTPUT
2230
2634
  end.at_least :once
2231
2635
  end
2232
2636
 
2233
-
2234
-
2235
2637
  end