isodoc 2.0.2 → 2.0.3

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: 24d03a8703e3e07a41ac1344228f49be574f4902673eff50ec8423b9f313e02f
4
- data.tar.gz: a1b243c61998b9321e08e95d16f6239a5f14642203e9c2df8c4cec467e8ab10e
3
+ metadata.gz: 645650786b21ed611b894e1e0f2be09efbb300f62997e021d331168b32488699
4
+ data.tar.gz: 9dc2ae2007b764bf33f2d406c55a666533f411e057a22eb58bb9b90cb279fe09
5
5
  SHA512:
6
- metadata.gz: 51994dfea115e9442ce50fc4ad92f4c478708df0640946c9fdc08965f943cdcf374bc3173ad80abc522af5c45d6224e638411c6c250277b9b11f3037c9b4f548
7
- data.tar.gz: 1cb56a7760c7bec32a1f1fc144bb74c5d85eed4eddd4b856f0946e560423bece052efe4b7b2fe111d7a50838dbe4110f51fe9fff3577dbc866a0a85dfc6c477b
6
+ metadata.gz: f70dccf7ad11c7563a0ed9dad4d7c90b9ca104ca3c46ffbd290544cc31206a9dce2597acafd01a4a5f8ff84c433d430d06c27b96b5b961a76cbe22d204fbc629
7
+ data.tar.gz: e000fe9d824d2e8825d1656d52395120373a6e6d40386ca67802337174e3dfaa762d8a3573b21f3418efeaecc81cc9350e0f6ac84024e6b235a8aebb4324f3d5
@@ -49,10 +49,14 @@ module IsoDoc
49
49
  end
50
50
 
51
51
  def pref_ref_code(bib)
52
- bib.at(ns("./docidentifier[not(@type = 'DOI' or @type = 'metanorma' "\
53
- "or @type = 'metanorma-ordinal' or "\
54
- "@type = 'ISSN' or @type = 'ISBN' or "\
55
- "@type = 'rfc-anchor')]"))
52
+ ret = bib.xpath(ns("./docidentifier[@primary = 'true']"))
53
+ ret.empty? and
54
+ ret = bib.at(ns("./docidentifier[not(@type = 'DOI' or "\
55
+ "@type = 'metanorma' "\
56
+ "or @type = 'metanorma-ordinal' or "\
57
+ "@type = 'ISSN' or @type = 'ISBN' or "\
58
+ "@type = 'rfc-anchor')]"))
59
+ ret
56
60
  end
57
61
 
58
62
  # returns [metanorma, non-metanorma, DOI/ISSN/ISBN] identifiers
@@ -78,10 +82,18 @@ module IsoDoc
78
82
  num
79
83
  end
80
84
 
81
- def unbracket(ident)
85
+ def unbracket1(ident)
82
86
  ident&.text&.sub(/^\[/, "")&.sub(/\]$/, "")
83
87
  end
84
88
 
89
+ def unbracket(ident)
90
+ if ident.respond_to?(:size)
91
+ ident.map { |x| unbracket1(x) }.join(" / ")
92
+ else
93
+ unbracket1(ident)
94
+ end
95
+ end
96
+
85
97
  def render_identifier(ident)
86
98
  { metanorma: bracket_if_num(ident[0]),
87
99
  sdo: unbracket(ident[1]),
@@ -128,6 +128,12 @@ module IsoDoc
128
128
 
129
129
  def table_long_strings_cleanup(docxml); end
130
130
 
131
+ def table_attrs(node)
132
+ ret = super
133
+ node.at(ns("./colgroup")) and ret[:style] += "table-layout:fixed;"
134
+ ret
135
+ end
136
+
131
137
  def image_parse(node, out, caption)
132
138
  if svg = node.at("./m:svg", "m" => "http://www.w3.org/2000/svg")
133
139
  svg_parse(svg, out)
@@ -69,7 +69,7 @@ module IsoDoc
69
69
  end
70
70
 
71
71
  def stage_abbr(docstatus)
72
- status_print(docstatus).split(/ /).map { |s| s[0].upcase }.join("")
72
+ status_print(docstatus).split(/ /).map { |s| s[0].upcase }.join
73
73
  end
74
74
 
75
75
  def unpublished(status)
@@ -135,5 +135,29 @@ module IsoDoc
135
135
  elem.xpath(ns("./description")).each { |a| a.replace(a.children) }
136
136
  elem.replace(elem.children)
137
137
  end
138
+
139
+ def ol(docxml)
140
+ docxml.xpath(ns("//ol")).each do |f|
141
+ ol1(f)
142
+ end
143
+ @xrefs.list_anchor_names(docxml.xpath(ns(@xrefs.sections_xpath)))
144
+ end
145
+
146
+ # We don't really want users to specify type of ordered list;
147
+ # we will use by default a fixed hierarchy as practiced by ISO (though not
148
+ # fully spelled out): a) 1) i) A) I)
149
+ def ol_depth(node)
150
+ depth = node.ancestors("ul, ol").size + 1
151
+ type = :alphabet
152
+ type = :arabic if [2, 7].include? depth
153
+ type = :roman if [3, 8].include? depth
154
+ type = :alphabet_upper if [4, 9].include? depth
155
+ type = :roman_upper if [5, 10].include? depth
156
+ type
157
+ end
158
+
159
+ def ol1(elem)
160
+ elem["type"] ||= ol_depth(elem).to_s
161
+ end
138
162
  end
139
163
  end
@@ -50,6 +50,7 @@ module IsoDoc
50
50
  formula docxml
51
51
  example docxml
52
52
  note docxml
53
+ ol docxml
53
54
  permission docxml
54
55
  requirement docxml
55
56
  recommendation docxml
@@ -1,3 +1,3 @@
1
1
  module IsoDoc
2
- VERSION = "2.0.2".freeze
2
+ VERSION = "2.0.3".freeze
3
3
  end
@@ -844,84 +844,84 @@ RSpec.describe IsoDoc do
844
844
  </html>
845
845
  OUTPUT
846
846
  doc = <<~OUTPUT
847
- <html xmlns:epub='http://www.idpf.org/2007/ops' lang='en'>
848
- <head>
849
- <style>
850
- </style>
851
- </head>
852
- <body lang='EN-US' link='blue' vlink='#954F72'>
853
- <div class='WordSection1'>
854
- <p>&#160;</p>
855
- </div>
856
- <p>
857
- <br clear='all' class='section'/>
858
- </p>
859
- <div class='WordSection2'>
860
- <p>&#160;</p>
861
- </div>
862
- <p>
863
- <br clear='all' class='section'/>
864
- </p>
865
- <div class='WordSection3'>
866
- <p class='zzSTDTitle1'/>
867
- <div id='_'>
868
- <h1>
869
- <b>Annex A</b>
870
- <br/>
871
- (normative).
872
- <span style='mso-tab-count:1'>&#160; </span>
873
- Clause
874
- </h1>
875
- <p id='_'>Text</p>
876
- <div id='_'>
877
- <h1>
878
- <b>Annex A</b>
879
- <br/>
880
- (normative).
881
- <span style='mso-tab-count:1'>&#160; </span>
882
- Subclause
883
- <br/>
884
- <br/>
885
- &#8220;A&#8221; &#8216;B&#8217;
886
- </h1>
887
- <p style='display:none;' class='variant-title-toc'>
888
- Clause
889
- <i>A</i>
890
- <span class='stem'>
891
- <math xmlns='http://www.w3.org/1998/Math/MathML'>
892
- <mi>x</mi>
893
- </math>
894
- </span>
895
- </p>
896
- <p id='_'>Text</p>
897
- </div>
898
- </div>
899
- <p>
900
- <br clear='all' style='mso-special-character:line-break;page-break-before:always'/>
901
- </p>
902
- <div id='_' class='Section3'>
903
- <h1 class='Annex'>
904
- <b>Annex A</b>
905
- <br/>
906
- (normative)
907
- <br/>
908
- <br/>
909
- <b>Clause</b>
910
- </h1>
911
- <p style='display:none;' class='variant-title-toc'>
912
- Clause
913
- <i>A</i>
914
- <span class='stem'>
915
- <math xmlns='http://www.w3.org/1998/Math/MathML'>
916
- <mi>x</mi>
917
- </math>
918
- </span>
919
- </p>
920
- <p id='_'>Text</p>
921
- </div>
922
- </div>
923
- </body>
924
- </html>
847
+ <html xmlns:epub='http://www.idpf.org/2007/ops' lang='en'>
848
+ <head>
849
+ <style>
850
+ </style>
851
+ </head>
852
+ <body lang='EN-US' link='blue' vlink='#954F72'>
853
+ <div class='WordSection1'>
854
+ <p>&#160;</p>
855
+ </div>
856
+ <p>
857
+ <br clear='all' class='section'/>
858
+ </p>
859
+ <div class='WordSection2'>
860
+ <p>&#160;</p>
861
+ </div>
862
+ <p>
863
+ <br clear='all' class='section'/>
864
+ </p>
865
+ <div class='WordSection3'>
866
+ <p class='zzSTDTitle1'/>
867
+ <div id='_'>
868
+ <h1>
869
+ <b>Annex A</b>
870
+ <br/>
871
+ (normative).
872
+ <span style='mso-tab-count:1'>&#160; </span>
873
+ Clause
874
+ </h1>
875
+ <p id='_'>Text</p>
876
+ <div id='_'>
877
+ <h1>
878
+ <b>Annex A</b>
879
+ <br/>
880
+ (normative).
881
+ <span style='mso-tab-count:1'>&#160; </span>
882
+ Subclause
883
+ <br/>
884
+ <br/>
885
+ &#8220;A&#8221; &#8216;B&#8217;
886
+ </h1>
887
+ <p style='display:none;' class='variant-title-toc'>
888
+ Clause
889
+ <i>A</i>
890
+ <span class='stem'>
891
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
892
+ <mi>x</mi>
893
+ </math>
894
+ </span>
895
+ </p>
896
+ <p id='_'>Text</p>
897
+ </div>
898
+ </div>
899
+ <p>
900
+ <br clear='all' style='mso-special-character:line-break;page-break-before:always'/>
901
+ </p>
902
+ <div id='_' class='Section3'>
903
+ <h1 class='Annex'>
904
+ <b>Annex A</b>
905
+ <br/>
906
+ (normative)
907
+ <br/>
908
+ <br/>
909
+ <b>Clause</b>
910
+ </h1>
911
+ <p style='display:none;' class='variant-title-toc'>
912
+ Clause
913
+ <i>A</i>
914
+ <span class='stem'>
915
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
916
+ <mi>x</mi>
917
+ </math>
918
+ </span>
919
+ </p>
920
+ <p id='_'>Text</p>
921
+ </div>
922
+ </div>
923
+ </body>
924
+ </html>
925
925
  OUTPUT
926
926
  expect(xmlpp(IsoDoc::PresentationXMLConvert.new({})
927
927
  .convert("test", input, true))
@@ -993,6 +993,169 @@ RSpec.describe IsoDoc do
993
993
  .to be_equivalent_to (output)
994
994
  end
995
995
 
996
+ it "adds types to ordered lists" do
997
+ input = <<~INPUT
998
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
999
+ <bibdata/>
1000
+ <sections>
1001
+ <clause id='A' inline-header='false' obligation='normative'>
1002
+ <title>Clause</title>
1003
+ <ol id="B1">
1004
+ <li>A1
1005
+ <ol id="B2">
1006
+ <li>A2
1007
+ <ol id="B3">
1008
+ <li>A3
1009
+ <ol id="B4">
1010
+ <li>A4
1011
+ <ol id="B5">
1012
+ <li>A5
1013
+ <ol id="B6">
1014
+ <li>A6
1015
+ <ol id="B7">
1016
+ <li>A7
1017
+ <ol id="B8">
1018
+ <li>A8
1019
+ <ol id="B9">
1020
+ <li>A9
1021
+ <ol id="B0">
1022
+ <li>A0</li>
1023
+ </ol></li>
1024
+ </ol></li>
1025
+ </ol></li>
1026
+ </ol></li>
1027
+ </ol></li>
1028
+ </ol></li>
1029
+ </ol></li>
1030
+ </ol></li>
1031
+ </ol></li>
1032
+ </ol>
1033
+ </clause>
1034
+ </sections>
1035
+ </iso-standard>#{' '}
1036
+ INPUT
1037
+ presxml = <<~OUTPUT
1038
+ <iso-standard xmlns='http://riboseinc.com/isoxml' type='presentation'>
1039
+ <bibdata/>
1040
+ <sections>
1041
+ <clause id='A' inline-header='false' obligation='normative' displayorder='1'>
1042
+ <title depth='1'>
1043
+ 1.
1044
+ <tab/>
1045
+ Clause
1046
+ </title>
1047
+ <ol id='B1' type='alphabet'>
1048
+ <li>
1049
+ A1
1050
+ <ol id='B2' type='arabic'>
1051
+ <li>
1052
+ A2
1053
+ <ol id='B3' type='roman'>
1054
+ <li>
1055
+ A3
1056
+ <ol id='B4' type='alphabet_upper'>
1057
+ <li>
1058
+ A4
1059
+ <ol id='B5' type='roman_upper'>
1060
+ <li>
1061
+ A5
1062
+ <ol id='B6' type='alphabet'>
1063
+ <li>
1064
+ A6
1065
+ <ol id='B7' type='arabic'>
1066
+ <li>
1067
+ A7
1068
+ <ol id='B8' type='roman'>
1069
+ <li>
1070
+ A8
1071
+ <ol id='B9' type='alphabet_upper'>
1072
+ <li>
1073
+ A9
1074
+ <ol id='B0' type='roman_upper'>
1075
+ <li>A0</li>
1076
+ </ol>
1077
+ </li>
1078
+ </ol>
1079
+ </li>
1080
+ </ol>
1081
+ </li>
1082
+ </ol>
1083
+ </li>
1084
+ </ol>
1085
+ </li>
1086
+ </ol>
1087
+ </li>
1088
+ </ol>
1089
+ </li>
1090
+ </ol>
1091
+ </li>
1092
+ </ol>
1093
+ </li>
1094
+ </ol>
1095
+ </clause>
1096
+ </sections>
1097
+ </iso-standard>
1098
+ OUTPUT
1099
+ expect(xmlpp(IsoDoc::PresentationXMLConvert.new({})
1100
+ .convert("test", input, true))
1101
+ .sub(%r{<localized-strings>.*</localized-strings>}m, ""))
1102
+ .to be_equivalent_to xmlpp(presxml)
1103
+ end
1104
+
1105
+ it "considers ul when adding types to ordered lists" do
1106
+ input = <<~INPUT
1107
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
1108
+ <bibdata/>
1109
+ <sections>
1110
+ <clause id='A' inline-header='false' obligation='normative'>
1111
+ <title>Clause</title>
1112
+ <ol id="B1">
1113
+ <li>A1
1114
+ <ul id="B2">
1115
+ <li>A2
1116
+ <ol id="B3">
1117
+ <li>A3
1118
+ </ol></li>
1119
+ </ul></li>
1120
+ </ol>
1121
+ </clause>
1122
+ </sections>
1123
+ </iso-standard>
1124
+ INPUT
1125
+ presxml = <<~OUTPUT
1126
+ <iso-standard xmlns='http://riboseinc.com/isoxml' type='presentation'>
1127
+ <bibdata/>
1128
+
1129
+ <sections>
1130
+ <clause id='A' inline-header='false' obligation='normative' displayorder='1'>
1131
+ <title depth='1'>
1132
+ 1.
1133
+ <tab/>
1134
+ Clause
1135
+ </title>
1136
+ <ol id='B1' type='alphabet'>
1137
+ <li>
1138
+ A1
1139
+ <ul id='B2'>
1140
+ <li>
1141
+ A2
1142
+ <ol id='B3' type='roman'>
1143
+ <li>A3 </li>
1144
+ </ol>
1145
+ </li>
1146
+ </ul>
1147
+ </li>
1148
+ </ol>
1149
+ </clause>
1150
+ </sections>
1151
+ </iso-standard>
1152
+ OUTPUT
1153
+ expect(xmlpp(IsoDoc::PresentationXMLConvert.new({})
1154
+ .convert("test", input, true))
1155
+ .sub(%r{<localized-strings>.*</localized-strings>}m, ""))
1156
+ .to be_equivalent_to xmlpp(presxml)
1157
+ end
1158
+
996
1159
  private
997
1160
 
998
1161
  def mock_symbols
@@ -654,8 +654,9 @@ RSpec.describe IsoDoc do
654
654
  </body>
655
655
  </html>
656
656
  OUTPUT
657
- expect(xmlpp(IsoDoc::HtmlConvert.new({}).convert("test", presxml,
658
- true))).to be_equivalent_to xmlpp(html)
657
+ expect(xmlpp(IsoDoc::HtmlConvert.new({})
658
+ .convert("test", presxml, true)))
659
+ .to be_equivalent_to xmlpp(html)
659
660
  end
660
661
 
661
662
  it "processes hidden references sections in Relaton bibliographies" do
@@ -766,7 +767,91 @@ RSpec.describe IsoDoc do
766
767
  </body>
767
768
  </html>
768
769
  OUTPUT
769
- expect(xmlpp(IsoDoc::HtmlConvert.new({}).convert("test", presxml,
770
- true))).to be_equivalent_to xmlpp(html)
770
+ expect(xmlpp(IsoDoc::HtmlConvert.new({})
771
+ .convert("test", presxml, true)))
772
+ .to be_equivalent_to xmlpp(html)
773
+ end
774
+
775
+ it "selects the primary identifier" do
776
+ input = <<~INPUT
777
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
778
+ <bibdata>
779
+ <language>en</language>
780
+ </bibdata>
781
+ <preface><foreword>
782
+ <p id="_f06fd0d1-a203-4f3d-a515-0bdba0f8d83f">
783
+ <eref bibitemid="ISO712"/>
784
+ </p>
785
+ </foreword></preface>
786
+ <bibliography><references id="_normative_references" obligation="informative" normative="true"><title>Normative References</title>
787
+ <p>The following documents are referred to in the text in such a way that some or all of their content constitutes requirements of this document. For dated references, only the edition cited applies. For undated references, the latest edition of the referenced document (including any amendments) applies.</p>
788
+ <bibitem id="ISO712" type="standard">
789
+ <title format="text/plain">Cereals or cereal products</title>
790
+ <title type="main" format="text/plain">Cereals and cereal products</title>
791
+ <docidentifier type="ISO">ISO 712</docidentifier>
792
+ <docidentifier type="IEC" primary="true">IEC 217</docidentifier>
793
+ <contributor>
794
+ <role type="publisher"/>
795
+ <organization>
796
+ <name>International Organization for Standardization</name>
797
+ </organization>
798
+ </contributor>
799
+ </bibitem>
800
+ </references></bibliography></iso-standard>
801
+ INPUT
802
+ presxml = <<~PRESXML
803
+ <foreword displayorder='1'>
804
+ <p id='_f06fd0d1-a203-4f3d-a515-0bdba0f8d83f'>
805
+ <eref bibitemid='ISO712'>IEC 217</eref>
806
+ </p>
807
+ </foreword>
808
+ PRESXML
809
+ expect(xmlpp(Nokogiri::XML(
810
+ IsoDoc::PresentationXMLConvert.new({})
811
+ .convert("test", input, true),
812
+ ).at("//xmlns:foreword").to_xml))
813
+ .to be_equivalent_to xmlpp(presxml)
814
+ end
815
+
816
+ it "selects multiple primary identifiers" do
817
+ input = <<~INPUT
818
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
819
+ <bibdata>
820
+ <language>en</language>
821
+ </bibdata>
822
+ <preface><foreword>
823
+ <p id="_f06fd0d1-a203-4f3d-a515-0bdba0f8d83f">
824
+ <eref bibitemid="ISO712"/>
825
+ </p>
826
+ </foreword></preface>
827
+ <bibliography><references id="_normative_references" obligation="informative" normative="true"><title>Normative References</title>
828
+ <p>The following documents are referred to in the text in such a way that some or all of their content constitutes requirements of this document. For dated references, only the edition cited applies. For undated references, the latest edition of the referenced document (including any amendments) applies.</p>
829
+ <bibitem id="ISO712" type="standard">
830
+ <title format="text/plain">Cereals or cereal products</title>
831
+ <title type="main" format="text/plain">Cereals and cereal products</title>
832
+ <docidentifier type="ISO" primary="true">ISO 712</docidentifier>
833
+ <docidentifier type="IEC" primary="true">IEC 217</docidentifier>
834
+ <contributor>
835
+ <role type="publisher"/>
836
+ <organization>
837
+ <name>International Organization for Standardization</name>
838
+ </organization>
839
+ </contributor>
840
+ </bibitem>
841
+ </references></bibliography></iso-standard>
842
+ INPUT
843
+ presxml = <<~PRESXML
844
+ <foreword displayorder='1'>
845
+ <p id='_f06fd0d1-a203-4f3d-a515-0bdba0f8d83f'>
846
+ <eref bibitemid='ISO712'>ISO 712&#xA0;/ IEC 217</eref>
847
+ </p>
848
+ </foreword>
849
+ PRESXML
850
+ expect(xmlpp(Nokogiri::XML(
851
+ IsoDoc::PresentationXMLConvert.new({})
852
+ .convert("test", input, true),
853
+ ).at("//xmlns:foreword").to_xml))
854
+ .to be_equivalent_to xmlpp(presxml)
771
855
  end
856
+
772
857
  end
@@ -174,7 +174,7 @@ RSpec.describe IsoDoc do
174
174
  <sup>1</sup>
175
175
  </a>
176
176
  </p>
177
- <table id="tableD-1" class="MsoISOTable" style="border-width:1px;border-spacing:0;width:70%;page-break-after: avoid;page-break-inside: avoid;" title="tool tip" >
177
+ <table id="tableD-1" class="MsoISOTable" style="border-width:1px;border-spacing:0;width:70%;page-break-after: avoid;page-break-inside: avoid;table-layout:fixed;" title="tool tip" >
178
178
  <caption>
179
179
  <span style="display:none">long desc</span>
180
180
  </caption>
@@ -2504,6 +2504,8 @@ RSpec.describe IsoDoc do
2504
2504
  <foreword>
2505
2505
  <p>
2506
2506
  <xref target="N1"/>
2507
+ <xref target="N11"/>
2508
+ <xref target="N12"/>
2507
2509
  <xref target="N2"/>
2508
2510
  <xref target="N"/>
2509
2511
  <xref target="note1"/>
@@ -2515,8 +2517,13 @@ RSpec.describe IsoDoc do
2515
2517
  </foreword>
2516
2518
  <introduction id="intro">
2517
2519
  <ol id="N01">
2518
- <li id="N1"><p>A</p></li>
2519
- </ol>
2520
+ <li id="N1"><p>A</p>
2521
+ <ol id="N011">
2522
+ <li id="N11"><p>A</p>
2523
+ <ol id="N012">
2524
+ <li id="N12"><p>A</p>
2525
+ </li>
2526
+ </ol></li></ol></li></ol>
2520
2527
  <clause id="xyz"><title>Preparatory</title>
2521
2528
  <ol id="N02" type="arabic">
2522
2529
  <li id="N2"><p>A</p></li>
@@ -2563,6 +2570,8 @@ RSpec.describe IsoDoc do
2563
2570
  <foreword displayorder='1'>
2564
2571
  <p>
2565
2572
  <xref target='N1'>Introduction, a)</xref>
2573
+ <xref target='N11'>Introduction, a.1)</xref>
2574
+ <xref target='N12'>Introduction, a.1.i)</xref>
2566
2575
  <xref target='N2'>Preparatory, 1)</xref>
2567
2576
  <xref target='N'>Clause 1, i)</xref>
2568
2577
  <xref target='note1'>Clause 3.1, List 1 a)</xref>
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.2
4
+ version: 2.0.3
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-01-22 00:00:00.000000000 Z
11
+ date: 2022-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciimath