isodoc 2.0.6.1 → 2.0.8.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c32b98e8156bdafb3ad6549d179b6607cc7811bf67191cf0ee736b6c72d5360f
4
- data.tar.gz: 63236257e5e7f511e6cfe2ea9ff5c7a12dd2059be3bc588c50f15c8946e4a01d
3
+ metadata.gz: a736ad455159e993e2c100d8ac3cd67a09c07705dad2fab7f30c8995636a55d8
4
+ data.tar.gz: b600c452fe5bac0622c27ab05ca4156c46caaea6f56d0cebc2d76b9377c3ae2a
5
5
  SHA512:
6
- metadata.gz: 58a629b21dee494368d7ad6c9f25fc3ac01ccb5f70b82674843cefdcb0959c484f770174ccb9ce75e52f4d4f906918fe1f390405dafd91119c945bade6ff716b
7
- data.tar.gz: 11332100db734b1fd700ecfe164fb80ae0fd4be9843c6e48ffac4ea2c0d2d1ef4c417cb9e78c1a5d9cbae68294acac7f98fcb8365c10808a38153fae1f1dd2dd
6
+ metadata.gz: 6e534774023bcb0212a72808f5167633ecce14af71aaa506388385c5e458fd41a87bb927d87546a3b3a709021d41d1592c99cd008caab5f652023543820137ad
7
+ data.tar.gz: 9b8dfa80516811e6aa87d0cfc80ac3ad79c26eaf61edf6366b12a89c30b429d0b96e15fc7970c0ada89ce8d94ebbc08a330af41dcb5185baa7245a05f1f1a8d7
data/isodoc.gemspec CHANGED
@@ -31,9 +31,10 @@ Gem::Specification.new do |spec|
31
31
  spec.add_dependency "asciimath"
32
32
  spec.add_dependency "html2doc", "~> 1.3.0"
33
33
  spec.add_dependency "htmlentities", "~> 4.3.4"
34
+ spec.add_dependency "isodoc-i18n", "~> 1.0.0"
34
35
  spec.add_dependency "liquid", "~> 4"
35
36
  # spec.add_dependency "metanorma", ">= 1.2.0"
36
- spec.add_dependency "emf2svg", "~> 1"
37
+ spec.add_dependency "emf2svg", "<= 1.3"
37
38
  spec.add_dependency "mathml2asciimath"
38
39
  spec.add_dependency "metanorma-utils"
39
40
  spec.add_dependency "nokogiri", "~> 1.12.0"
@@ -43,6 +43,8 @@ module IsoDoc
43
43
  # tocfigures: add ToC for figures
44
44
  # toctables: add ToC for tables
45
45
  # tocrecommendations: add ToC for rcommendations
46
+ # fonts: fontist fonts to install
47
+ # fontlicenseagreement: fontist font license agreement
46
48
  def initialize(options)
47
49
  @libdir ||= File.dirname(__FILE__) # rubocop:disable Lint/DisjunctiveAssignmentInConstructor
48
50
  options.merge!(default_fonts(options)) do |_, old, new|
@@ -57,10 +59,7 @@ module IsoDoc
57
59
  init_stylesheets(options)
58
60
  init_covers(options)
59
61
  init_toc(options)
60
- @normalfontsize = options[:normalfontsize]
61
- @smallerfontsize = options[:smallerfontsize]
62
- @monospacefontsize = options[:monospacefontsize]
63
- @footnotefontsize = options[:footnotefontsize]
62
+ init_fonts(options)
64
63
  @i18nyaml = options[:i18nyaml]
65
64
  @ulstyle = options[:ulstyle]
66
65
  @olstyle = options[:olstyle]
@@ -96,6 +95,15 @@ module IsoDoc
96
95
  @tmpfilesdir_suffix = tmpfilesdir_suffix
97
96
  end
98
97
 
98
+ def init_fonts(options)
99
+ @normalfontsize = options[:normalfontsize]
100
+ @smallerfontsize = options[:smallerfontsize]
101
+ @monospacefontsize = options[:monospacefontsize]
102
+ @footnotefontsize = options[:footnotefontsize]
103
+ @fontist_fonts = options[:fonts]
104
+ @fontlicenseagreement = options[:fontlicenseagreement]
105
+ end
106
+
99
107
  def init_covers(options)
100
108
  @header = options[:header]
101
109
  @htmlcoverpage = options[:htmlcoverpage]
@@ -171,7 +171,7 @@ module IsoDoc
171
171
  if b.name == "bibitem"
172
172
  next if implicit_reference(b)
173
173
 
174
- i += 1
174
+ i += 1 unless b["hidden"]
175
175
  if standard?(b) then std_bibitem_entry(div, b, i, biblio)
176
176
  else nonstd_bibitem(div, b, i, biblio)
177
177
  end
@@ -190,7 +190,7 @@ module IsoDoc
190
190
  (f = isoxml.at(ns(norm_ref_xpath)) and f["hidden"] != "true") or
191
191
  return num
192
192
  out.div do |div|
193
- num = num + 1
193
+ num += 1
194
194
  clause_name(num, f.at(ns("./title")), div, nil)
195
195
  if f.name == "clause"
196
196
  f.elements.each { |e| parse(e, div) unless e.name == "title" }
data/lib/isodoc/i18n.rb CHANGED
@@ -1,28 +1,9 @@
1
1
  require "yaml"
2
+ require "isodoc-i18n"
2
3
  require_relative "function/utils"
3
4
 
4
5
  module IsoDoc
5
6
  class I18n
6
- def load_yaml(lang, script, i18nyaml = nil)
7
- ret = load_yaml1(lang, script)
8
- return normalise_hash(ret.merge(YAML.load_file(i18nyaml))) if i18nyaml
9
-
10
- normalise_hash(ret)
11
- end
12
-
13
- def normalise_hash(ret)
14
- case ret
15
- when Hash
16
- ret.each do |k, v|
17
- ret[k] = normalise_hash(v)
18
- end
19
- ret
20
- when Array then ret.map { |n| normalise_hash(n) }
21
- when String then cleanup_entities(ret.unicode_normalize(:nfc))
22
- else ret
23
- end
24
- end
25
-
26
7
  def load_yaml1(lang, script)
27
8
  case lang
28
9
  when "en", "fr", "ru", "de", "es", "ar"
@@ -40,93 +21,5 @@ module IsoDoc
40
21
  YAML.load_file(File.join(File.dirname(__FILE__),
41
22
  "../isodoc-yaml/i18n-#{str}.yaml"))
42
23
  end
43
-
44
- def get
45
- @labels
46
- end
47
-
48
- def set(key, val)
49
- @labels[key] = val
50
- end
51
-
52
- def initialize(lang, script, i18nyaml = nil)
53
- @lang = lang
54
- @script = script
55
- y = load_yaml(lang, script, i18nyaml)
56
- @labels = y
57
- @labels["language"] = @lang
58
- @labels["script"] = @script
59
- @labels.each do |k, _v|
60
- self.class.send(:define_method, k.downcase) { get[k] }
61
- end
62
- end
63
-
64
- def self.l10n(text, lang = @lang, script = @script)
65
- l10n(text, lang, script)
66
- end
67
-
68
- # TODO: move to localization file
69
- # function localising spaces and punctuation.
70
- # Not clear if period needs to be localised for zh
71
- def l10n(text, lang = @lang, script = @script)
72
- if lang == "zh" && script == "Hans" then l10n_zh(text)
73
- else bidiwrap(text, lang, script)
74
- end
75
- end
76
-
77
- def bidiwrap(text, lang, script)
78
- my_script, my_rtl, outer_rtl = bidiwrap_vars(lang, script)
79
- if my_rtl && !outer_rtl
80
- mark = %w(Arab Aran).include?(my_script) ? "&#x61c;" : "&#x200f;"
81
- "#{mark}#{text}#{mark}"
82
- elsif !my_rtl && outer_rtl then "&#x200e;#{text}&#x200e;"
83
- else text
84
- end
85
- end
86
-
87
- def bidiwrap_vars(lang, script)
88
- my_script = script || Metanorma::Utils.default_script(lang)
89
- [my_script,
90
- Metanorma::Utils.rtl_script?(my_script),
91
- Metanorma::Utils.rtl_script?(@script || Metanorma::Utils
92
- .default_script(@lang))]
93
- end
94
-
95
- def l10n_zh(text)
96
- xml = Nokogiri::HTML::DocumentFragment.parse(text)
97
- xml.traverse do |n|
98
- next unless n.text?
99
-
100
- n.replace(cleanup_entities(n.text.gsub(/ /, "").gsub(/:/, ":")
101
- .gsub(/,/, "、").gsub(/\(/, "(").gsub(/\)/, ")")
102
- .gsub(/\[/, "【").gsub(/\]/, "】"), is_xml: false))
103
- end
104
- xml.to_xml.gsub(/<b>/, "").gsub("</b>", "").gsub(/<\?[^>]+>/, "")
105
- end
106
-
107
- def boolean_conj(list, conn)
108
- case list.size
109
- when 0 then ""
110
- when 1 then list.first
111
- when 2 then @labels["binary_#{conn}"].sub(/%1/, list[0])
112
- .sub(/%2/, list[1])
113
- else
114
- @labels["multiple_#{conn}"]
115
- .sub(/%1/, l10n(list[0..-2].join(", "), @lang, @script))
116
- .sub(/%2/, list[-1])
117
- end
118
- end
119
-
120
- # def multiple_and(names, andword)
121
- # return "" if names.empty?
122
- # return names[0] if names.length == 1
123
- #
124
- # (names.length == 2) &&
125
- # (return l10n("#{names[0]} #{andword} #{names[1]}", @lang, @script))
126
- # l10n(names[0..-2].join(", ") + " #{andword} #{names[-1]}", @lang, @script)
127
- # end
128
-
129
- include Function::Utils
130
- # module_function :l10n
131
24
  end
132
25
  end
@@ -1,7 +1,10 @@
1
+ require "csv"
2
+
1
3
  module IsoDoc
2
4
  class PresentationXMLConvert < ::IsoDoc::Convert
3
5
  def bibdata(docxml)
4
6
  toc_metadata(docxml)
7
+ fonts_metadata(docxml)
5
8
  docid_prefixes(docxml)
6
9
  a = bibdata_current(docxml) or return
7
10
  address_precompose(a)
@@ -34,6 +37,23 @@ module IsoDoc
34
37
  end
35
38
  end
36
39
 
40
+ def fonts_metadata(xmldoc)
41
+ return unless @fontist_fonts
42
+
43
+ ins = xmldoc.at(ns("//presentation-metadata")) ||
44
+ xmldoc.at(ns("//misc-container")) || xmldoc.at(ns("//bibdata"))
45
+ CSV.parse_line(@fontist_fonts, col_sep: ";").map(&:strip).each do |f|
46
+ ins.next = presmeta("fonts", f)
47
+ end
48
+ @fontlicenseagreement and
49
+ ins.next = presmeta("font-license-agreement", @fontlicenseagreement)
50
+ end
51
+
52
+ def presmeta(name, value)
53
+ "<presentation-metadata><name>#{name}</name><value>#{value}</value>"\
54
+ "</presentation-metadata>"
55
+ end
56
+
37
57
  def address_precompose1(addr)
38
58
  ret = []
39
59
  addr.xpath(ns("./street")).each { |s| ret << s.children.to_xml }
@@ -29,8 +29,7 @@ module IsoDoc
29
29
  def figure1(elem)
30
30
  return sourcecode1(elem) if elem["class"] == "pseudocode" ||
31
31
  elem["type"] == "pseudocode"
32
- return if (labelled_ancestor(elem) && elem.ancestors("figure").empty?) ||
33
- (elem.at(ns("./figure")) && !elem.at(ns("./name")))
32
+ return if elem.at(ns("./figure")) && !elem.at(ns("./name"))
34
33
 
35
34
  lbl = @xrefs.anchor(elem["id"], :label, false) or return
36
35
  prefix_name(elem, "&nbsp;&mdash; ",
@@ -69,23 +69,32 @@ module IsoDoc
69
69
  def bibliography_bibitem_number_skip(bibitem)
70
70
  @xrefs.klass.implicit_reference(bibitem) ||
71
71
  bibitem.at(ns(".//docidentifier[@type = 'metanorma']")) ||
72
- bibitem.at(ns(".//docidentifier[@type = 'metanorma-ordinal']"))
73
- # || @xrefs.klass.standard?(bibitem)
72
+ bibitem.at(ns(".//docidentifier[@type = 'metanorma-ordinal']")) ||
73
+ bibitem["hidden"] == "true" || bibitem.parent["hidden"] == "true"
74
74
  end
75
75
 
76
76
  def bibliography_bibitem_number(docxml)
77
77
  i = 0
78
78
  docxml.xpath(ns("//references[@normative = 'false']/bibitem")).each do |b|
79
- next if bibliography_bibitem_number_skip(b)
80
-
81
- i += 1
82
- id = b.at(ns(".//docidentifier"))
83
- id.previous =
84
- "<docidentifier type='metanorma-ordinal'>[#{i}]</docidentifier>"
79
+ i = bibliography_bibitem_number1(b, i)
85
80
  end
86
81
  @xrefs.references docxml
87
82
  end
88
83
 
84
+ def bibliography_bibitem_number1(bibitem, idx)
85
+ if mn = bibitem.at(ns(".//docidentifier[@type = 'metanorma']"))
86
+ /^\[?\d\]?$/.match?(mn&.text) and
87
+ idx = mn.text.sub(/^\[/, "").sub(/\]$/, "").to_i
88
+ end
89
+ unless bibliography_bibitem_number_skip(bibitem)
90
+
91
+ idx += 1
92
+ bibitem.at(ns(".//docidentifier")).previous =
93
+ "<docidentifier type='metanorma-ordinal'>[#{idx}]</docidentifier>"
94
+ end
95
+ idx
96
+ end
97
+
89
98
  def docid_prefixes(docxml)
90
99
  docxml.xpath(ns("//references/bibitem/docidentifier")).each do |i|
91
100
  i.children = @xrefs.klass.docid_prefix(i["type"], i.text)
@@ -1,3 +1,3 @@
1
1
  module IsoDoc
2
- VERSION = "2.0.6.1".freeze
2
+ VERSION = "2.0.8.1".freeze
3
3
  end
@@ -112,7 +112,7 @@ module IsoDoc
112
112
  end
113
113
 
114
114
  def increment(node)
115
- return self if node["unnumbered"]
115
+ return self if node["unnumbered"] || node["hidden"]
116
116
 
117
117
  @letter_override = nil
118
118
  @number_override = nil
@@ -25,7 +25,7 @@ module IsoDoc
25
25
  j = 0
26
26
  clause.xpath(ns(".//figure | .//sourcecode[not(ancestor::example)]"))
27
27
  .each do |t|
28
- next if labelled_ancestor(t) && t.ancestors("figure").empty?
28
+ # next if labelled_ancestor(t) && t.ancestors("figure").empty?
29
29
 
30
30
  j = subfigure_increment(j, c, t)
31
31
  label = c.print + (j.zero? ? "" : "-#{j}")
@@ -111,7 +111,7 @@ module IsoDoc
111
111
  j = 0
112
112
  clause.xpath(ns(".//figure | .//sourcecode[not(ancestor::example)]"))
113
113
  .each do |t|
114
- next if labelled_ancestor(t) && t.ancestors("figure").empty?
114
+ # next if labelled_ancestor(t) && t.ancestors("figure").empty?
115
115
 
116
116
  j = subfigure_increment(j, c, t)
117
117
  label = "#{num}#{hiersep}#{c.print}" +
@@ -34,9 +34,9 @@ internal_external_terms_boilerplate: |
34
34
  <p>% 界定的以及下列术语和定义适用于本文件。</p>
35
35
  term_defined_in: "〖术语于%中定义〗"
36
36
  binary_and: "%1和%2"
37
- multiple_and: "%1和%2"
37
+ multiple_and: "%1、和%2"
38
38
  binary_or: "%1或%2"
39
- multiple_or: "%1或%2"
39
+ multiple_or: "%1、或%2"
40
40
  chain_and: "%1和%2"
41
41
  chain_or: "%1或%2"
42
42
  chain_from: "%1从%2"
@@ -2497,7 +2497,6 @@ RSpec.describe IsoDoc do
2497
2497
  <bibliography>
2498
2498
  <references hidden='true' normative='false' displayorder="1">
2499
2499
  <bibitem id='express_action_schema' type='internal'>
2500
- <docidentifier type='metanorma-ordinal'>[1]</docidentifier>
2501
2500
  <docidentifier type='repository'>express/action_schema</docidentifier>
2502
2501
  </bibitem>
2503
2502
  </references>
@@ -644,7 +644,7 @@ RSpec.describe IsoDoc do
644
644
  </introduction></preface><sections>
645
645
  <clause id="D" obligation="normative" type="scope" displayorder="3">
646
646
  <title depth="1">1.<tab/>Scope</title>
647
- <p id="E"><eref type="inline" bibitemid="ISO712"><locality type="table"><referenceFrom>1</referenceFrom><referenceTo>1</referenceTo></locality>ISO 712&#x3001;&#x7B2C;1&#x2013;1&#x8868;</eref></p>
647
+ <p id="E"><eref type="inline" bibitemid="ISO712"><locality type="table"><referenceFrom>1</referenceFrom><referenceTo>1</referenceTo></locality>ISO 712, &#x7B2C;1&#x2013;1 &#x8868;</eref></p>
648
648
  </clause>
649
649
  <clause id="H" obligation="normative" displayorder="5"><title depth="1">3.<tab/>Terms, definitions, symbols and abbreviated terms</title><terms id="I" obligation="normative">
650
650
  <title depth="2">3.1.<tab/>Normal Terms</title>
@@ -722,7 +722,7 @@ RSpec.describe IsoDoc do
722
722
  <div id="D">
723
723
  <h1>1.&#12288;Scope</h1>
724
724
  <p id="E">
725
- <a href='#ISO712'>ISO 712&#12289;&#31532;1&#8211;1&#34920;</a>
725
+ <a href='#ISO712'>ISO 712, &#31532;1&#8211;1 &#34920;</a>
726
726
  </p>
727
727
  </div>
728
728
  <div>
@@ -1603,7 +1603,7 @@ RSpec.describe IsoDoc do
1603
1603
  <bibliography>
1604
1604
  <references id='_normative_references' obligation='informative' normative='true' displayorder='2' hidden="true">
1605
1605
  <title depth='1'>
1606
- 1.
1606
+ 0.
1607
1607
  <tab/>
1608
1608
  Normative References
1609
1609
  </title>
@@ -1709,7 +1709,7 @@ RSpec.describe IsoDoc do
1709
1709
  OUTPUT
1710
1710
 
1711
1711
  expect(xmlpp(IsoDoc::PresentationXMLConvert.new({})
1712
- .convert("test", input, true))).to be_equivalent_to xmlpp(presxml)
1712
+ .convert("test", input, true))).to be_equivalent_to xmlpp(presxml)
1713
1713
  expect(xmlpp(IsoDoc::HtmlConvert.new({})
1714
1714
  .convert("test", presxml, true))).to be_equivalent_to xmlpp(html)
1715
1715
  expect(xmlpp(IsoDoc::WordConvert.new({})
@@ -1158,7 +1158,6 @@ RSpec.describe IsoDoc do
1158
1158
  .to be_equivalent_to xmlpp(presxml)
1159
1159
  end
1160
1160
 
1161
-
1162
1161
  it "inserts toc metadata" do
1163
1162
  input = <<~INPUT
1164
1163
  <iso-standard xmlns="http://riboseinc.com/isoxml">
@@ -1194,7 +1193,7 @@ RSpec.describe IsoDoc do
1194
1193
  end
1195
1194
 
1196
1195
  it "processes multiple-target xrefs" do
1197
- input = <<~INPUT
1196
+ input = <<~INPUT
1198
1197
  <iso-standard xmlns="http://riboseinc.com/isoxml">
1199
1198
  <bibdata/>
1200
1199
  <sections>
@@ -1295,6 +1294,179 @@ RSpec.describe IsoDoc do
1295
1294
  .to be_equivalent_to xmlpp(presxml)
1296
1295
  end
1297
1296
 
1297
+ it "captions embedded figures" do
1298
+ input = <<~INPUT
1299
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
1300
+ <bibdata/>
1301
+ <sections>
1302
+ <clause id="A" inline-header="false" obligation="normative">
1303
+ <title>Section</title>
1304
+ <figure id="B1">
1305
+ <name>First</name>
1306
+ </figure>
1307
+ <example id="C1">
1308
+ <figure id="B2">
1309
+ <name>Second</name>
1310
+ </figure>
1311
+ </example>
1312
+ <example id="C2">
1313
+ <figure id="B4" unnumbered="true">
1314
+ <name>Unnamed</name>
1315
+ </figure>
1316
+ </example>
1317
+ <figure id="B3">
1318
+ <name>Third</name>
1319
+ </figure>
1320
+ </clause>
1321
+ </sections>
1322
+ </iso-standard>
1323
+ INPUT
1324
+ presxml = <<~OUTPUT
1325
+ <iso-standard xmlns='http://riboseinc.com/isoxml' type='presentation'>
1326
+ <bibdata/>
1327
+
1328
+ <sections>
1329
+ <clause id='A' inline-header='false' obligation='normative' displayorder='1'>
1330
+ <title depth='1'>
1331
+ 1.
1332
+ <tab/>
1333
+ Section
1334
+ </title>
1335
+ <figure id='B1'>
1336
+ <name>Figure 1&#xA0;&#x2014; First</name>
1337
+ </figure>
1338
+ <example id='C1'>
1339
+ <name>EXAMPLE 1</name>
1340
+ <figure id='B2'>
1341
+ <name>Figure 2&#xA0;&#x2014; Second</name>
1342
+ </figure>
1343
+ </example>
1344
+ <example id='C2'>
1345
+ <name>EXAMPLE 2</name>
1346
+ <figure id='B4' unnumbered='true'>
1347
+ <name>Unnamed</name>
1348
+ </figure>
1349
+ </example>
1350
+ <figure id='B3'>
1351
+ <name>Figure 3&#xA0;&#x2014; Third</name>
1352
+ </figure>
1353
+ </clause>
1354
+ </sections>
1355
+ </iso-standard>
1356
+ OUTPUT
1357
+ expect(xmlpp(IsoDoc::PresentationXMLConvert.new({})
1358
+ .convert("test", input, true))
1359
+ .sub(%r{<localized-strings>.*</localized-strings>}m, ""))
1360
+ .to be_equivalent_to xmlpp(presxml)
1361
+ end
1362
+
1363
+ it "passes font names to Presentation XML" do
1364
+ input = <<~INPUT
1365
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
1366
+ <bibdata/>
1367
+ <sections>
1368
+ <clause id="A" inline-header="false" obligation="normative">
1369
+ <title>Section</title>
1370
+ <figure id="B1">
1371
+ <name>First</name>
1372
+ </figure>
1373
+ </clause>
1374
+ </sections>
1375
+ </iso-standard>
1376
+ INPUT
1377
+ presxml = <<~OUTPUT
1378
+ <iso-standard xmlns='http://riboseinc.com/isoxml' type='presentation'>
1379
+ <bibdata/>
1380
+ <presentation-metadata>
1381
+ <name>font-license-agreement</name>
1382
+ <value>no-install-fonts</value>
1383
+ </presentation-metadata>
1384
+ <presentation-metadata>
1385
+ <name>fonts</name>
1386
+ <value>font2</value>
1387
+ </presentation-metadata>
1388
+ <presentation-metadata>
1389
+ <name>fonts</name>
1390
+ <value>font1</value>
1391
+ </presentation-metadata>
1392
+ <sections>
1393
+ <clause id='A' inline-header='false' obligation='normative' displayorder='1'>
1394
+ <title depth='1'>
1395
+ 1.
1396
+ <tab/>
1397
+ Section
1398
+ </title>
1399
+ <figure id='B1'>
1400
+ <name>Figure 1&#xA0;&#x2014; First</name>
1401
+ </figure>
1402
+ </clause>
1403
+ </sections>
1404
+ </iso-standard>
1405
+ OUTPUT
1406
+ expect(xmlpp(IsoDoc::PresentationXMLConvert
1407
+ .new({ fonts: "font1; font2", fontlicenseagreement: "no-install-fonts" })
1408
+ .convert("test", input, true))
1409
+ .sub(%r{<localized-strings>.*</localized-strings>}m, ""))
1410
+ .to be_equivalent_to xmlpp(presxml)
1411
+ end
1412
+
1413
+ it "skips numbering of hidden sections" do
1414
+ input = <<~INPUT
1415
+ <standard-document xmlns="https://www.metanorma.org/ns/standoc" type="semantic">
1416
+ <bibdata/>
1417
+ <sections><clause id="_scope" type="scope" inline-header="false" obligation="normative">
1418
+ <title>Scope</title>
1419
+ <p id="_8d98c053-85d7-e8cc-75bb-183a14209d61">A</p>
1420
+
1421
+ <p id="_2141c040-93a4-785a-73f0-ffad4fa1779f"><eref type="inline" bibitemid="_607373b1-0cc4-fcdb-c482-fd86ae572bd1" citeas="ISO 639-2"/></p>
1422
+ </clause>
1423
+
1424
+ <terms id="_terms_and_definitions" obligation="normative">
1425
+ <title>Terms and definitions</title><p id="_36938d4b-05e5-bd0f-a082-0415db50e8f7">No terms and definitions are listed in this document.</p>
1426
+
1427
+ </terms>
1428
+ </sections><bibliography><references hidden="true" normative="true">
1429
+ <title>Normative references</title>
1430
+ </references>
1431
+ </bibliography></standard-document>
1432
+ INPUT
1433
+ presxml = <<~OUTPUT
1434
+ <standard-document xmlns="https://www.metanorma.org/ns/standoc" type="presentation">
1435
+ <bibdata/>
1436
+ <sections>
1437
+ <clause id='_scope' type='scope' inline-header='false' obligation='normative' displayorder='1'>
1438
+ <title depth='1'>
1439
+ 1.
1440
+ <tab/>
1441
+ Scope
1442
+ </title>
1443
+ <p id='_8d98c053-85d7-e8cc-75bb-183a14209d61'>A</p>
1444
+ <p id='_2141c040-93a4-785a-73f0-ffad4fa1779f'>
1445
+ <eref type='inline' bibitemid='_607373b1-0cc4-fcdb-c482-fd86ae572bd1' citeas='ISO 639-2'>ISO 639-2</eref>
1446
+ </p>
1447
+ </clause>
1448
+ <terms id='_terms_and_definitions' obligation='normative' displayorder='3'>
1449
+ <title depth='1'>
1450
+ 2.
1451
+ <tab/>
1452
+ Terms and definitions
1453
+ </title>
1454
+ <p id='_36938d4b-05e5-bd0f-a082-0415db50e8f7'>No terms and definitions are listed in this document.</p>
1455
+ </terms>
1456
+ </sections>
1457
+ <bibliography>
1458
+ <references hidden='true' normative='true' displayorder='2'>
1459
+ <title depth='1'>Normative references</title>
1460
+ </references>
1461
+ </bibliography>
1462
+ </standard-document>
1463
+ OUTPUT
1464
+ expect(xmlpp(IsoDoc::PresentationXMLConvert.new({})
1465
+ .convert("test", input, true))
1466
+ .sub(%r{<localized-strings>.*</localized-strings>}m, ""))
1467
+ .to be_equivalent_to xmlpp(presxml)
1468
+ end
1469
+
1298
1470
  private
1299
1471
 
1300
1472
  def mock_symbols
@@ -854,4 +854,148 @@ RSpec.describe IsoDoc do
854
854
  .to be_equivalent_to xmlpp(presxml)
855
855
  end
856
856
 
857
+ it "enforces consistent metanorma-ordinal numbering" do
858
+ input = <<~INPUT
859
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
860
+ <bibdata>
861
+ <language>en</language>
862
+ </bibdata>
863
+ <bibliography><references id="_normative_references" obligation="informative" normative="false"><title>Bibliography</title>
864
+ <bibitem id="ref1" type="standard">
865
+ <title format="text/plain">Cereals or cereal products</title>
866
+ <docidentifier type="IEC">IEC 217</docidentifier>
867
+ </bibitem>
868
+ <bibitem id="ref2" type="standard">
869
+ <title format="text/plain">Cereals or cereal products</title>
870
+ <docidentifier type="metanorma">[3]</docidentifier>
871
+ </bibitem>
872
+ <bibitem id="ref3" type="standard">
873
+ <title format="text/plain">Cereals or cereal products</title>
874
+ <docidentifier>ABC</docidentifier>
875
+ </bibitem>
876
+ </references></bibliography></iso-standard>
877
+ INPUT
878
+ presxml = <<~PRESXML
879
+ <bibliography>
880
+ <references id='_normative_references' obligation='informative' normative='false' displayorder='1'>
881
+ <title depth='1'>Bibliography</title>
882
+ <bibitem id='ref1' type='standard'>
883
+ <title format='text/plain'>Cereals or cereal products</title>
884
+ <docidentifier type='metanorma-ordinal'>[1]</docidentifier>
885
+ <docidentifier type='IEC'>IEC 217</docidentifier>
886
+ </bibitem>
887
+ <bibitem id='ref2' type='standard'>
888
+ <title format='text/plain'>Cereals or cereal products</title>
889
+ <docidentifier type='metanorma'>[3]</docidentifier>
890
+ </bibitem>
891
+ <bibitem id='ref3' type='standard'>
892
+ <title format='text/plain'>Cereals or cereal products</title>
893
+ <docidentifier type='metanorma-ordinal'>[4]</docidentifier>
894
+ <docidentifier>ABC</docidentifier>
895
+ </bibitem>
896
+ </references>
897
+ </bibliography>
898
+ PRESXML
899
+ expect(xmlpp(Nokogiri::XML(
900
+ IsoDoc::PresentationXMLConvert.new({})
901
+ .convert("test", input, true),
902
+ ).at("//xmlns:bibliography").to_xml))
903
+ .to be_equivalent_to xmlpp(presxml)
904
+ end
905
+
906
+ it "enforces consistent references numbering with hidden items: metanorma identifiers" do
907
+ input = <<~INPUT
908
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
909
+ <bibdata>
910
+ <language>en</language>
911
+ </bibdata>
912
+ <bibliography><references id="_normative_references" obligation="informative" normative="false"><title>Bibliography</title>
913
+ <bibitem id="ref1" type="standard">
914
+ <title format="text/plain">Cereals or cereal products</title>
915
+ <docidentifier type="metanorma">[1]</docidentifier>
916
+ </bibitem>
917
+ <bibitem id="ref2" type="standard" hidden="true">
918
+ <title format="text/plain">Cereals or cereal products</title>
919
+ <docidentifier type="metanorma">[2]</docidentifier>
920
+ </bibitem>
921
+ <bibitem id="ref3" type="standard">
922
+ <title format="text/plain">Cereals or cereal products</title>
923
+ <docidentifier type="metanorma">[3]</docidentifier>
924
+ </bibitem>
925
+ </references></bibliography></iso-standard>
926
+ INPUT
927
+ presxml = <<~PRESXML
928
+ <bibliography>
929
+ <references id='_normative_references' obligation='informative' normative='false' displayorder='1'>
930
+ <title depth='1'>Bibliography</title>
931
+ <bibitem id='ref1' type='standard'>
932
+ <title format='text/plain'>Cereals or cereal products</title>
933
+ <docidentifier type='metanorma'>[1]</docidentifier>
934
+ </bibitem>
935
+ <bibitem id='ref2' type='standard' hidden='true'>
936
+ <title format='text/plain'>Cereals or cereal products</title>
937
+ <docidentifier type='metanorma'>[2]</docidentifier>
938
+ </bibitem>
939
+ <bibitem id='ref3' type='standard'>
940
+ <title format='text/plain'>Cereals or cereal products</title>
941
+ <docidentifier type='metanorma'>[3]</docidentifier>
942
+ </bibitem>
943
+ </references>
944
+ </bibliography>
945
+ PRESXML
946
+ expect(xmlpp(Nokogiri::XML(
947
+ IsoDoc::PresentationXMLConvert.new({})
948
+ .convert("test", input, true),
949
+ ).at("//xmlns:bibliography").to_xml))
950
+ .to be_equivalent_to xmlpp(presxml)
951
+ end
952
+
953
+ it "enforces consistent references numbering with hidden items: metanorma-ordinal identifiers" do
954
+ input = <<~INPUT
955
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
956
+ <bibdata>
957
+ <language>en</language>
958
+ </bibdata>
959
+ <bibliography><references id="_normative_references" obligation="informative" normative="false"><title>Bibliography</title>
960
+ <bibitem id="ref1" type="standard">
961
+ <title format="text/plain">Cereals or cereal products</title>
962
+ <docidentifier>ABC</docidentifier>
963
+ </bibitem>
964
+ <bibitem id="ref2" type="standard" hidden="true">
965
+ <title format="text/plain">Cereals or cereal products</title>
966
+ <docidentifier>ABD</docidentifier>
967
+ </bibitem>
968
+ <bibitem id="ref3" type="standard">
969
+ <title format="text/plain">Cereals or cereal products</title>
970
+ <docidentifier>ABE</docidentifier>
971
+ </bibitem>
972
+ </references></bibliography></iso-standard>
973
+ INPUT
974
+ presxml = <<~PRESXML
975
+ <bibliography>
976
+ <references id='_normative_references' obligation='informative' normative='false' displayorder='1'>
977
+ <title depth='1'>Bibliography</title>
978
+ <bibitem id='ref1' type='standard'>
979
+ <title format='text/plain'>Cereals or cereal products</title>
980
+ <docidentifier type='metanorma-ordinal'>[1]</docidentifier>
981
+ <docidentifier>ABC</docidentifier>
982
+ </bibitem>
983
+ <bibitem id='ref2' type='standard' hidden='true'>
984
+ <title format='text/plain'>Cereals or cereal products</title>
985
+ <docidentifier>ABD</docidentifier>
986
+ </bibitem>
987
+ <bibitem id='ref3' type='standard'>
988
+ <title format='text/plain'>Cereals or cereal products</title>
989
+ <docidentifier type='metanorma-ordinal'>[2]</docidentifier>
990
+ <docidentifier>ABE</docidentifier>
991
+ </bibitem>
992
+ </references>
993
+ </bibliography>
994
+ PRESXML
995
+ expect(xmlpp(Nokogiri::XML(
996
+ IsoDoc::PresentationXMLConvert.new({})
997
+ .convert("test", input, true),
998
+ ).at("//xmlns:bibliography").to_xml))
999
+ .to be_equivalent_to xmlpp(presxml)
1000
+ end
857
1001
  end
@@ -262,22 +262,22 @@ RSpec.describe IsoDoc do
262
262
  </iso-standard>
263
263
  INPUT
264
264
  output = <<~OUTPUT
265
- <foreword id='fwd' displayorder="1">
266
- <p>
267
- <xref target='N1'>Figure 1</xref>
268
- <xref target='N2'>Figure (??)</xref>
269
- <xref target='N'>Figure 2</xref>
270
- <xref target='note1'>Figure 3</xref>
271
- <xref target='note3'>Figure 4</xref>
272
- <xref target='note4'>Figure 5</xref>
273
- <xref target='note2'>Figure 6</xref>
274
- <xref target='note51'>[note51]</xref>
275
- <xref target='AN'>Figure A.1</xref>
276
- <xref target='Anote1'>Figure (??)</xref>
277
- <xref target='Anote2'>Figure A.2</xref>
278
- <xref target='Anote3'>Figure A.3</xref>
279
- </p>
280
- </foreword>
265
+ <foreword id='fwd' displayorder="1">
266
+ <p>
267
+ <xref target='N1'>Figure 1</xref>
268
+ <xref target='N2'>Figure (??)</xref>
269
+ <xref target='N'>Figure 2</xref>
270
+ <xref target='note1'>Figure 3</xref>
271
+ <xref target='note3'>Figure 4</xref>
272
+ <xref target='note4'>Figure 5</xref>
273
+ <xref target='note2'>Figure 6</xref>
274
+ <xref target='note51'>[note51]</xref>
275
+ <xref target='AN'>Figure A.1</xref>
276
+ <xref target='Anote1'>Figure (??)</xref>
277
+ <xref target='Anote2'>Figure A.2</xref>
278
+ <xref target='Anote3'>Figure A.3</xref>
279
+ </p>
280
+ </foreword>
281
281
  OUTPUT
282
282
  expect(xmlpp(Nokogiri.XML(IsoDoc::PresentationXMLConvert.new({})
283
283
  .convert("test", input, true))
@@ -824,20 +824,20 @@ RSpec.describe IsoDoc do
824
824
  </iso-standard>
825
825
  INPUT
826
826
  output = <<~OUTPUT
827
- <foreword displayorder='1'>
828
- <p>
829
- <xref target='N1'>Clause 1, Permission 1</xref>
830
- <xref target='N2'>Clause 1, Permission 1-1</xref>
831
- <xref target='N'>Clause 1, Permission 1-1-1</xref>
832
- <xref target='Q1'>Clause 1, Requirement 1-1</xref>
833
- <xref target='R1'>Clause 1, Recommendation 1-1</xref>
834
- <xref target='AN1'>Permission A.1</xref>
835
- <xref target='AN2'>Permission A.1-1</xref>
836
- <xref target='AN'>Permission A.1-1-1</xref>
837
- <xref target='AQ1'>Requirement A.1-1</xref>
838
- <xref target='AR1'>Recommendation A.1-1</xref>
839
- </p>
840
- </foreword>
827
+ <foreword displayorder='1'>
828
+ <p>
829
+ <xref target='N1'>Clause 1, Permission 1</xref>
830
+ <xref target='N2'>Clause 1, Permission 1-1</xref>
831
+ <xref target='N'>Clause 1, Permission 1-1-1</xref>
832
+ <xref target='Q1'>Clause 1, Requirement 1-1</xref>
833
+ <xref target='R1'>Clause 1, Recommendation 1-1</xref>
834
+ <xref target='AN1'>Permission A.1</xref>
835
+ <xref target='AN2'>Permission A.1-1</xref>
836
+ <xref target='AN'>Permission A.1-1-1</xref>
837
+ <xref target='AQ1'>Requirement A.1-1</xref>
838
+ <xref target='AR1'>Recommendation A.1-1</xref>
839
+ </p>
840
+ </foreword>
841
841
  OUTPUT
842
842
  expect(xmlpp(Nokogiri.XML(IsoDoc::PresentationXMLConvert.new({})
843
843
  .convert("test", input, true))
@@ -966,18 +966,18 @@ RSpec.describe IsoDoc do
966
966
  </iso-standard>
967
967
  INPUT
968
968
  output = <<~OUTPUT
969
- <foreword displayorder='1'>
970
- <p>
971
- <xref target='N1'>Table 1</xref>
972
- <xref target='N2'>Table (??)</xref>
973
- <xref target='N'>Table 2</xref>
974
- <xref target='note1'>Table 3</xref>
975
- <xref target='note2'>Table 4</xref>
976
- <xref target='AN'>Table A.1</xref>
977
- <xref target='Anote1'>Table (??)</xref>
978
- <xref target='Anote2'>Table A.2</xref>
979
- </p>
980
- </foreword>
969
+ <foreword displayorder='1'>
970
+ <p>
971
+ <xref target='N1'>Table 1</xref>
972
+ <xref target='N2'>Table (??)</xref>
973
+ <xref target='N'>Table 2</xref>
974
+ <xref target='note1'>Table 3</xref>
975
+ <xref target='note2'>Table 4</xref>
976
+ <xref target='AN'>Table A.1</xref>
977
+ <xref target='Anote1'>Table (??)</xref>
978
+ <xref target='Anote2'>Table A.2</xref>
979
+ </p>
980
+ </foreword>
981
981
  OUTPUT
982
982
  expect(xmlpp(Nokogiri.XML(IsoDoc::PresentationXMLConvert.new({})
983
983
  .convert("test", input, true))
@@ -1061,13 +1061,13 @@ RSpec.describe IsoDoc do
1061
1061
  </iso-standard>
1062
1062
  INPUT
1063
1063
  output = <<~OUTPUT
1064
- <foreword displayorder='1'>
1065
- <p>
1066
- <xref target='note1'>Clause 2.1, Note 1</xref>
1067
- <xref target='note2'>Clause 2.1.1, Note 1</xref>
1068
- <xref target='note3'>Clause 2.1.1, Note 2</xref>
1069
- </p>
1070
- </foreword>
1064
+ <foreword displayorder='1'>
1065
+ <p>
1066
+ <xref target='note1'>Clause 2.1, Note 1</xref>
1067
+ <xref target='note2'>Clause 2.1.1, Note 1</xref>
1068
+ <xref target='note3'>Clause 2.1.1, Note 2</xref>
1069
+ </p>
1070
+ </foreword>
1071
1071
  OUTPUT
1072
1072
  expect(xmlpp(Nokogiri.XML(IsoDoc::PresentationXMLConvert.new({})
1073
1073
  .convert("test", input, true))
@@ -1151,13 +1151,13 @@ RSpec.describe IsoDoc do
1151
1151
  </iso-standard>
1152
1152
  INPUT
1153
1153
  output = <<~OUTPUT
1154
- <foreword displayorder='1'>
1155
- <p>
1156
- <xref target='note1'>Clause 2.1, Example</xref>
1157
- <xref target='note2'>Clause 2.1.1, Example 1</xref>
1158
- <xref target='note3'>Clause 2.1.1, Example 2</xref>
1159
- </p>
1160
- </foreword>
1154
+ <foreword displayorder='1'>
1155
+ <p>
1156
+ <xref target='note1'>Clause 2.1, Example</xref>
1157
+ <xref target='note2'>Clause 2.1.1, Example 1</xref>
1158
+ <xref target='note3'>Clause 2.1.1, Example 2</xref>
1159
+ </p>
1160
+ </foreword>
1161
1161
  OUTPUT
1162
1162
  expect(xmlpp(Nokogiri.XML(IsoDoc::PresentationXMLConvert.new({})
1163
1163
  .convert("test", input, true))
@@ -1255,31 +1255,31 @@ RSpec.describe IsoDoc do
1255
1255
  </iso-standard>
1256
1256
  INPUT
1257
1257
  output = <<~OUTPUT
1258
- <foreword obligation='informative' displayorder='1'>
1259
- <title>Foreword</title>
1260
- <p id='A'>
1261
- This is a preamble
1262
- <xref target='C'>Introduction Subsection</xref>
1263
- <xref target='C1'>Introduction, 2</xref>
1264
- <xref target='D'>Clause 1</xref>
1265
- <xref target='H'>Clause 3</xref>
1266
- <xref target='I'>Clause 3.1</xref>
1267
- <xref target='J'>Clause 3.1.1</xref>
1268
- <xref target='K'>Clause 3.2</xref>
1269
- <xref target='L'>Clause 4</xref>
1270
- <xref target='M'>Clause 5</xref>
1271
- <xref target='N'>Clause 5.1</xref>
1272
- <xref target='O'>Clause 5.2</xref>
1273
- <xref target='P'>Annex A</xref>
1274
- <xref target='Q'>Annex A.1</xref>
1275
- <xref target='Q1'>Annex A.1.1</xref>
1276
- <xref target='QQ'>Annex B</xref>
1277
- <xref target='QQ1'>Annex B</xref>
1278
- <xref target='QQ2'>Annex B.1</xref>
1279
- <xref target='R'>Clause 2</xref>
1280
- <xref target='S'>Bibliography</xref>
1281
- </p>
1282
- </foreword>
1258
+ <foreword obligation='informative' displayorder='1'>
1259
+ <title>Foreword</title>
1260
+ <p id='A'>
1261
+ This is a preamble
1262
+ <xref target='C'>Introduction Subsection</xref>
1263
+ <xref target='C1'>Introduction, 2</xref>
1264
+ <xref target='D'>Clause 1</xref>
1265
+ <xref target='H'>Clause 3</xref>
1266
+ <xref target='I'>Clause 3.1</xref>
1267
+ <xref target='J'>Clause 3.1.1</xref>
1268
+ <xref target='K'>Clause 3.2</xref>
1269
+ <xref target='L'>Clause 4</xref>
1270
+ <xref target='M'>Clause 5</xref>
1271
+ <xref target='N'>Clause 5.1</xref>
1272
+ <xref target='O'>Clause 5.2</xref>
1273
+ <xref target='P'>Annex A</xref>
1274
+ <xref target='Q'>Annex A.1</xref>
1275
+ <xref target='Q1'>Annex A.1.1</xref>
1276
+ <xref target='QQ'>Annex B</xref>
1277
+ <xref target='QQ1'>Annex B</xref>
1278
+ <xref target='QQ2'>Annex B.1</xref>
1279
+ <xref target='R'>Clause 2</xref>
1280
+ <xref target='S'>Bibliography</xref>
1281
+ </p>
1282
+ </foreword>
1283
1283
  OUTPUT
1284
1284
  expect(xmlpp(Nokogiri.XML(IsoDoc::PresentationXMLConvert.new({})
1285
1285
  .convert("test", input, true))
@@ -1720,31 +1720,31 @@ RSpec.describe IsoDoc do
1720
1720
  </iso-standard>
1721
1721
  INPUT
1722
1722
  output = <<~OUTPUT
1723
- <foreword displayorder='1'>
1724
- <p>
1725
- <xref target='N1'>
1726
- Introduction, Definition List:
1727
- <stem type='MathML'>
1728
- <math xmlns='http://www.w3.org/1998/Math/MathML'>
1729
- <msub>
1730
- <mrow>
1731
- <mover accent='true'>
1732
- <mrow>
1733
- <mi>e</mi>
1734
- </mrow>
1735
- <mo>^</mo>
1736
- </mover>
1737
- </mrow>
1738
- <mrow>
1739
- <mi>r</mi>
1740
- </mrow>
1741
- </msub>
1742
- </math>
1743
- <!-- (hat e)_((r)) -->
1744
- </stem>
1745
- </xref>
1746
- </p>
1747
- </foreword>
1723
+ <foreword displayorder='1'>
1724
+ <p>
1725
+ <xref target='N1'>
1726
+ Introduction, Definition List:
1727
+ <stem type='MathML'>
1728
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
1729
+ <msub>
1730
+ <mrow>
1731
+ <mover accent='true'>
1732
+ <mrow>
1733
+ <mi>e</mi>
1734
+ </mrow>
1735
+ <mo>^</mo>
1736
+ </mover>
1737
+ </mrow>
1738
+ <mrow>
1739
+ <mi>r</mi>
1740
+ </mrow>
1741
+ </msub>
1742
+ </math>
1743
+ <!-- (hat e)_((r)) -->
1744
+ </stem>
1745
+ </xref>
1746
+ </p>
1747
+ </foreword>
1748
1748
  OUTPUT
1749
1749
  expect(xmlpp(Nokogiri::XML(IsoDoc::PresentationXMLConvert.new({})
1750
1750
  .convert("test", input, true))
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isodoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.6.1
4
+ version: 2.0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-22 00:00:00.000000000 Z
11
+ date: 2022-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciimath
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 4.3.4
55
+ - !ruby/object:Gem::Dependency
56
+ name: isodoc-i18n
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.0.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.0.0
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: liquid
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -70,16 +84,16 @@ dependencies:
70
84
  name: emf2svg
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - "~>"
87
+ - - "<="
74
88
  - !ruby/object:Gem::Version
75
- version: '1'
89
+ version: '1.3'
76
90
  type: :runtime
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - "~>"
94
+ - - "<="
81
95
  - !ruby/object:Gem::Version
82
- version: '1'
96
+ version: '1.3'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: mathml2asciimath
85
99
  requirement: !ruby/object:Gem::Requirement