asciimath2unitsml 0.1.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,164 @@
1
+ module UnitsDB
2
+ class Dimension
3
+ attr_reader :id, :length, :mass, :time, :electric_current, :thermodynamic_temperature,
4
+ :amount_of_substance, :luminous_intensity, :plane_angle, :dimensionless
5
+
6
+ def initialize(id, hash)
7
+ begin
8
+ @id = id
9
+ @dimensionless = hash[:dimensionless]
10
+ hash[:length] and @length = hash[:length][:powerNumerator].to_i
11
+ hash[:mass] and @mass = hash[:mass][:powerNumerator].to_i
12
+ hash[:time] and @time = hash[:time][:powerNumerator].to_i
13
+ hash[:electric_current] and @electric_current = hash[:electric_current][:powerNumerator].to_i
14
+ hash[:thermodynamic_temperature] and
15
+ @thermodynamic_temperature = hash[:thermodynamic_temperature][:powerNumerator].to_i
16
+ hash[:amount_of_substance] and @amount_of_substance = hash[:amount_of_substance][:powerNumerator].to_i
17
+ hash[:luminous_intensity] and @luminous_intensity = hash[:luminous_intensity][:powerNumerator].to_i
18
+ hash[:plane_angle] and @plane_angle = hash[:plane_angle][:powerNumerator].to_i
19
+ rescue
20
+ raise StandardError.new "Parse fail on Dimension #{id}: #{hash}"
21
+ end
22
+ end
23
+
24
+ def keys
25
+ ret = []
26
+ @length and ret << "Length"
27
+ @mass and ret << "Mass"
28
+ @time and ret << "Time"
29
+ @electric_current and ret << "ElectricCurrent"
30
+ @thermodynamic_temperature and ret << "ThermodynamicTemperature"
31
+ @amount_of_substance and ret << "AmountOfSubstance"
32
+ @luminous_intensity and ret << "LuminousIntensity"
33
+ @plane_angle and ret << "PlaneAngle"
34
+ ret
35
+ end
36
+
37
+ def exponent(key)
38
+ case key
39
+ when "Length" then @length
40
+ when "Mass" then @mass
41
+ when "Time" then @time
42
+ when "ElectricCurrent" then @electric_current
43
+ when "ThermodynamicTemperature" then @thermodynamic_temperature
44
+ when "AmountOfSubstance" then @amount_of_substance
45
+ when "LuminousIntensity" then @luminous_intensity
46
+ when "PlaneAngle" then @plane_angle
47
+ end
48
+ end
49
+
50
+ def vector
51
+ "#{@length}:#{@mass}:#{@time}:#{@electric_current}:#{@thermodynamic_temperature}:#{@amount_of_substance}:"\
52
+ "#{@luminous_intensity}:#{@plane_angle}"
53
+ end
54
+ end
55
+
56
+ class Prefix
57
+ attr_reader :id, :name, :base, :power, :symbol
58
+
59
+ def initialize(id, hash)
60
+ begin
61
+ @id = id
62
+ @name = hash[:name]
63
+ @base = hash[:base]
64
+ @power = hash[:power]
65
+ @symbol = hash[:symbol] # always is a hash
66
+ rescue
67
+ raise StandardError.new "Parse fail on Prefix #{id}: #{hash}"
68
+ end
69
+ end
70
+
71
+ def ascii
72
+ @symbol[:ascii]
73
+ end
74
+
75
+ def symbolid
76
+ @symbol[:ascii]
77
+ end
78
+
79
+ def html
80
+ @symbol[:html]
81
+ end
82
+
83
+ def mathml
84
+ @symbol[:html]
85
+ end
86
+
87
+ def latex
88
+ @symbol[:latex]
89
+ end
90
+
91
+ def unicode
92
+ @symbol[:unicode]
93
+ end
94
+ end
95
+
96
+ class Quantity
97
+ attr_reader :id, :dimension, :type, :names, :units
98
+
99
+ def initialize(id, hash)
100
+ begin
101
+ @id = id
102
+ @dimension = hash[:dimension_url].sub(/^#/, "")
103
+ @type = hash[:quantity_type]
104
+ hash[:quantity_name] and @names = hash[:quantity_name]
105
+ hash[:unit_reference] and @units = hash[:unit_reference].map { |x| x[:url].sub(/^#/, "") }
106
+ rescue
107
+ raise StandardError.new "Parse fail on Quantity #{id}: #{hash}"
108
+ end
109
+ end
110
+
111
+ def name
112
+ @names&.first
113
+ end
114
+
115
+ def unit
116
+ @units&.first
117
+ end
118
+ end
119
+
120
+ class Unit
121
+ attr_reader :id, :dimension, :short, :root, :unit_system, :names, :symbols, :symbols_hash, :root_units, :quantities,
122
+ :si_derived_bases, :prefixed
123
+
124
+ def initialize(id, hash)
125
+ begin
126
+ @id = id
127
+ @short = short
128
+ @dimension = hash[:dimension_url].sub(/^#/, "")
129
+ hash[:short] && !hash[:short].empty? and @short = hash[:short]
130
+ @unit_system = hash[:unit_system]
131
+ @names = hash[:unit_name]
132
+ @symbols_hash = hash[:unit_symbols]&.each_with_object({}) { |h, m| m[h[:id]] = h } || {}
133
+ @symbols = hash[:unit_symbols]
134
+ hash[:root_units] and hash[:root_units][:enumerated_root_units] and
135
+ @root = hash[:root_units][:enumerated_root_units]
136
+ hash[:quantity_reference] and @quantities = hash[:quantity_reference].map { |x| x[:url].sub(/^#/, "") }
137
+ hash[:si_derived_bases] and @si_derived_bases = hash[:si_derived_bases]
138
+ @prefixed = (hash[:prefixed] == true)
139
+ rescue
140
+ raise StandardError.new "Parse fail on Unit #{id}: #{hash}"
141
+ end
142
+ end
143
+
144
+ def system_name
145
+ @unit_system[:name]
146
+ end
147
+
148
+ def system_type
149
+ @unit_system[:type]
150
+ end
151
+
152
+ def name
153
+ @names.first
154
+ end
155
+
156
+ def symbolid
157
+ @symbols ? @symbols.first[:id] : @short
158
+ end
159
+
160
+ def symbolids
161
+ @symbols ? @symbols.map { |s| s[:id] } : [ @short ]
162
+ end
163
+ end
164
+ end
data/spec/conv_spec.rb CHANGED
@@ -3,19 +3,18 @@ require "spec_helper"
3
3
  RSpec.describe Asciimath2UnitsML do
4
4
  it "converts an AsciiMath string to MathML + UnitsML" do
5
5
  expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
6
- 32 + 5 xx 7 "unitsml(kg^-2)" xx 9 "unitsml(g)" xx 1 "unitsml(kg*s^-2)" xx 812 "unitsml(m*s^-2)" - 9 "unitsml(C^3*A)" + 7 "unitsml(hp)" + 13 "unitsml(A/C^-3)"
6
+ 1 "unitsml(mm*s^-2)"
7
7
  INPUT
8
- <math xmlns='http://www.w3.org/1998/Math/MathML'>
9
- <mn>32</mn>
10
- <mo>+</mo>
11
- <mn>5</mn>
12
- <mo>&#xD7;</mo>
13
- <mn>7</mn>
8
+ <?xml version='1.0'?>
9
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
10
+ <mn>1</mn>
14
11
  <mo rspace='thickmathspace'>&#x2062;</mo>
15
- <mrow xref='U_kg-2'>
12
+ <mrow xref='U_mm.s-2'>
13
+ <mi mathvariant='normal'>mm</mi>
14
+ <mo>&#xB7;</mo>
16
15
  <msup>
17
16
  <mrow>
18
- <mi mathvariant='normal'>kg</mi>
17
+ <mi mathvariant='normal'>s</mi>
19
18
  </mrow>
20
19
  <mrow>
21
20
  <mo>&#x2212;</mo>
@@ -23,19 +22,21 @@ RSpec.describe Asciimath2UnitsML do
23
22
  </mrow>
24
23
  </msup>
25
24
  </mrow>
26
- <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg-2' dimensionURL='#D_M-2'>
27
- <UnitSystem name='SI' type='SI_base' xml:lang='en-US'/>
28
- <UnitName xml:lang='en'>kg^-2</UnitName>
25
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_mm.s-2' dimensionURL='#NISTd28'>
26
+ <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
27
+ <UnitName xml:lang='en'>mm*s^-2</UnitName>
29
28
  <UnitSymbol type='HTML'>
30
- kg
29
+ mm&#xB7;s
31
30
  <sup>&#x2212;2</sup>
32
31
  </UnitSymbol>
33
32
  <UnitSymbol type='MathML'>
34
33
  <math xmlns='http://www.w3.org/1998/Math/MathML'>
35
34
  <mrow>
35
+ <mi mathvariant='normal'>mm</mi>
36
+ <mo>&#xB7;</mo>
36
37
  <msup>
37
38
  <mrow>
38
- <mi mathvariant='normal'>kg</mi>
39
+ <mi mathvariant='normal'>s</mi>
39
40
  </mrow>
40
41
  <mrow>
41
42
  <mo>&#x2212;</mo>
@@ -45,22 +46,202 @@ RSpec.describe Asciimath2UnitsML do
45
46
  </mrow>
46
47
  </math>
47
48
  </UnitSymbol>
49
+ <RootUnits>
50
+ <EnumeratedRootUnit unit='meter' prefix='m'/>
51
+ <EnumeratedRootUnit unit='second' powerNumerator='-2'/>
52
+ </RootUnits>
53
+ </Unit>
54
+ <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='-3' xml:id='NISTp10_-3'>
55
+ <PrefixName xml:lang='en'>milli</PrefixName>
56
+ <PrefixSymbol type='ASCII'>m</PrefixSymbol>
57
+ <PrefixSymbol type='unicode'>m</PrefixSymbol>
58
+ <PrefixSymbol type='LaTeX'>m</PrefixSymbol>
59
+ <PrefixSymbol type='HTML'>m</PrefixSymbol>
60
+ </Prefix>
61
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd28'>
62
+ <Length symbol='L' powerNumerator='1'/>
63
+ <Time symbol='T' powerNumerator='-2'/>
64
+ </Dimension>
65
+ </math>
66
+ OUTPUT
67
+ end
68
+
69
+ it "deals with non-Ascii units and prefixes" do
70
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
71
+ 1 "unitsml(um)"
72
+ INPUT
73
+ <?xml version='1.0'?>
74
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
75
+ <mn>1</mn>
76
+ <mo rspace='thickmathspace'>&#x2062;</mo>
77
+ <mrow xref='U_um'>
78
+ <mi mathvariant='normal'>&#xB5;m</mi>
79
+ </mrow>
80
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_um' dimensionURL='#NISTd1'>
81
+ <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
82
+ <UnitName xml:lang='en'>um</UnitName>
83
+ <UnitSymbol type='HTML'>um</UnitSymbol>
84
+ <UnitSymbol type='MathML'>
85
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
86
+ <mrow>
87
+ <mi mathvariant='normal'>&#xB5;m</mi>
88
+ </mrow>
89
+ </math>
90
+ </UnitSymbol>
91
+ <RootUnits>
92
+ <EnumeratedRootUnit unit='meter' prefix='u'/>
93
+ </RootUnits>
94
+ </Unit>
95
+ <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='-6' xml:id='NISTp10_-6'>
96
+ <PrefixName xml:lang='en'>micro</PrefixName>
97
+ <PrefixSymbol type='ASCII'>u</PrefixSymbol>
98
+ <PrefixSymbol type='unicode'>&#x3BC;</PrefixSymbol>
99
+ <PrefixSymbol type='LaTeX'>$mu$</PrefixSymbol>
100
+ <PrefixSymbol type='HTML'>&#xB5;</PrefixSymbol>
101
+ </Prefix>
102
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd1'>
103
+ <Length symbol='L' powerNumerator='1'/>
104
+ </Dimension>
105
+ </math>
106
+ OUTPUT
107
+ end
108
+
109
+ it "does not insert space before non-alphabetic units" do
110
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
111
+ 1 "unitsml(degK)" + 1 "unitsml(prime)"
112
+ INPUT
113
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
114
+ <mn>1</mn>
115
+ <mo rspace='thickmathspace'>&#x2062;</mo>
116
+ <mrow xref='U_NISTu5'>
117
+ <mi mathvariant='normal'>&#xB0;K</mi>
118
+ </mrow>
119
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_NISTu5' dimensionURL='#NISTd5'>
120
+ <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
121
+ <UnitName xml:lang='en'>kelvin</UnitName>
122
+ <UnitSymbol type='HTML'>K</UnitSymbol>
123
+ <UnitSymbol type='MathML'>
124
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
125
+ <mrow>
126
+ <mi mathvariant='normal'>K</mi>
127
+ </mrow>
128
+ </math>
129
+ </UnitSymbol>
130
+ </Unit>
131
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd5'>
132
+ <ThermodynamicTemperature symbol='Theta' powerNumerator='1'/>
133
+ </Dimension>
134
+ <Quantity xmlns='http://unitsml.nist.gov/2005' xml:id='NISTq5' dimensionURL='#NISTd5' quantityType='base'>
135
+ <QuantityName xml:lang='en-US'>thermodynamic temperature</QuantityName>
136
+ </Quantity>
137
+ <mo>+</mo>
138
+ <mn>1</mn>
139
+ <mo>&#x2062;</mo>
140
+ <mrow xref='U_NISTu147'>
141
+ <mi mathvariant='normal'>&#x2032;</mi>
142
+ </mrow>
143
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_NISTu147'>
144
+ <UnitSystem name='not_SI' type='not_SI' xml:lang='en-US'/>
145
+ <UnitName xml:lang='en'>minute (minute of arc)</UnitName>
146
+ <UnitSymbol type='HTML'>&#x2032;</UnitSymbol>
147
+ <UnitSymbol type='MathML'>
148
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
149
+ <mrow>
150
+ <mi mathvariant='normal'>&#x2032;</mi>
151
+ </mrow>
152
+ </math>
153
+ </UnitSymbol>
154
+ </Unit>
155
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd9'>
156
+ <PlaneAngle symbol='Phi' powerNumerator='1'/>
157
+ </Dimension>
158
+ <Quantity xmlns='http://unitsml.nist.gov/2005' xml:id='NISTq9' dimensionURL='#NISTd9' quantityType='base'>
159
+ <QuantityName xml:lang='en-US'>plane angle</QuantityName>
160
+ <QuantityName xml:lang='en-US'>angle</QuantityName>
161
+ </Quantity>
162
+ </math>
163
+ OUTPUT
164
+ end
165
+
166
+ it "deals with sqrt units" do
167
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
168
+ 1 "unitsml(sqrt(Hz))"
169
+ INPUT
170
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
171
+ <mn>1</mn>
172
+ <mo rspace='thickmathspace'>&#x2062;</mo>
173
+ <mrow xref='U_sqrtHz'>
174
+ <msqrt>
175
+ <mi mathvariant='normal'>Hz</mi>
176
+ </msqrt>
177
+ </mrow>
178
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_Hz0.5' dimensionURL='#D_T-0.5'>
179
+ <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
180
+ <UnitName xml:lang='en'>Hz^0.5</UnitName>
181
+ <UnitSymbol type='HTML'>&#x221A;Hz</UnitSymbol>
182
+ <UnitSymbol type='MathML'>
183
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
184
+ <mrow>
185
+ <msqrt>
186
+ <mi mathvariant='normal'>Hz</mi>
187
+ </msqrt>
188
+ </mrow>
189
+ </math>
190
+ </UnitSymbol>
191
+ </Unit>
192
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_T-0.5'>
193
+ <Time symbol='T' powerNumerator='-0.5'/>
194
+ </Dimension>
195
+ </math>
196
+ OUTPUT
197
+ end
198
+
199
+ it "deals with kg and g" do
200
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
201
+ 1 "unitsml(kg)" + 1 "unitsml(g)"
202
+ INPUT
203
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
204
+ <mn>1</mn>
205
+ <mo rspace='thickmathspace'>&#x2062;</mo>
206
+ <mrow xref='U_NISTu2'>
207
+ <mi mathvariant='normal'>kg</mi>
208
+ </mrow>
209
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_NISTu2' dimensionURL='#NISTd2'>
210
+ <UnitSystem name='SI' type='SI_base' xml:lang='en-US'/>
211
+ <UnitName xml:lang='en'>kilogram</UnitName>
212
+ <UnitSymbol type='HTML'>kg</UnitSymbol>
213
+ <UnitSymbol type='MathML'>
214
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
215
+ <mrow>
216
+ <mi mathvariant='normal'>kg</mi>
217
+ </mrow>
218
+ </math>
219
+ </UnitSymbol>
220
+ <RootUnits>
221
+ <EnumeratedRootUnit unit='gram' prefix='k'/>
222
+ </RootUnits>
48
223
  </Unit>
49
224
  <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='3' xml:id='NISTp10_3'>
50
225
  <PrefixName xml:lang='en'>kilo</PrefixName>
51
226
  <PrefixSymbol type='ASCII'>k</PrefixSymbol>
227
+ <PrefixSymbol type='unicode'>k</PrefixSymbol>
228
+ <PrefixSymbol type='LaTeX'>k</PrefixSymbol>
229
+ <PrefixSymbol type='HTML'>k</PrefixSymbol>
52
230
  </Prefix>
53
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_M-2'>
54
- <Mass symbol='M' powerNumerator='-2'/>
231
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd2'>
232
+ <Mass symbol='M' powerNumerator='1'/>
55
233
  </Dimension>
56
- <mo>&#xD7;</mo>
57
- <mn>9</mn>
234
+ <Quantity xmlns='http://unitsml.nist.gov/2005' xml:id='NISTq2' dimensionURL='#NISTd2' quantityType='base'>
235
+ <QuantityName xml:lang='en-US'>mass</QuantityName>
236
+ </Quantity>
237
+ <mo>+</mo>
238
+ <mn>1</mn>
58
239
  <mo rspace='thickmathspace'>&#x2062;</mo>
59
240
  <mrow xref='U_NISTu27'>
60
241
  <mi mathvariant='normal'>g</mi>
61
242
  </mrow>
62
- <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_NISTu27' dimensionURL='#D_M'>
63
- <UnitSystem name='SI' type='SI_base' xml:lang='en-US'/>
243
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_NISTu27' dimensionURL='#NISTd2'>
244
+ <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
64
245
  <UnitName xml:lang='en'>gram</UnitName>
65
246
  <UnitSymbol type='HTML'>g</UnitSymbol>
66
247
  <UnitSymbol type='MathML'>
@@ -71,10 +252,49 @@ RSpec.describe Asciimath2UnitsML do
71
252
  </math>
72
253
  </UnitSymbol>
73
254
  </Unit>
74
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_M'>
75
- <Mass symbol='M' powerNumerator='1'/>
76
- </Dimension>
77
- <mo>&#xD7;</mo>
255
+ </math>
256
+ OUTPUT
257
+ end
258
+
259
+ it "deals with non-metric" do
260
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
261
+ 1 "unitsml(hp)"
262
+ INPUT
263
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
264
+ <mn>1</mn>
265
+ <mo rspace='thickmathspace'>&#x2062;</mo>
266
+ <mrow xref='U_NISTu284'>
267
+ <mi mathvariant='normal'>hp</mi>
268
+ </mrow>
269
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_NISTu284'>
270
+ <UnitSystem name='not_SI' type='not_SI' xml:lang='en-US'/>
271
+ <UnitName xml:lang='en'>horsepower</UnitName>
272
+ <UnitSymbol type='HTML'>hp</UnitSymbol>
273
+ <UnitSymbol type='MathML'>
274
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
275
+ <mrow>
276
+ <mi mathvariant='normal'>hp</mi>
277
+ </mrow>
278
+ </math>
279
+ </UnitSymbol>
280
+ </Unit>
281
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd16'>
282
+ <Length symbol='L' powerNumerator='2'/>
283
+ <Mass symbol='M' powerNumerator='1'/>
284
+ <Time symbol='T' powerNumerator='-3'/>
285
+ </Dimension>
286
+ <Quantity xmlns='http://unitsml.nist.gov/2005' xml:id='NISTq20' dimensionURL='#NISTd16' quantityType='base'>
287
+ <QuantityName xml:lang='en-US'>power</QuantityName>
288
+ </Quantity>
289
+ </math>
290
+ OUTPUT
291
+ end
292
+
293
+ it "deals with duplicate units" do
294
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
295
+ 1 "unitsml(kg*s^-2)" xx 9 "unitsml(kg*s^-2)"
296
+ INPUT
297
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
78
298
  <mn>1</mn>
79
299
  <mo rspace='thickmathspace'>&#x2062;</mo>
80
300
  <mrow xref='U_kg.s-2'>
@@ -90,7 +310,7 @@ RSpec.describe Asciimath2UnitsML do
90
310
  </mrow>
91
311
  </msup>
92
312
  </mrow>
93
- <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg.s-2' dimensionURL='#D_MT-2'>
313
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg.s-2' dimensionURL='#NISTd37'>
94
314
  <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
95
315
  <UnitName xml:lang='en'>kg*s^-2</UnitName>
96
316
  <UnitSymbol type='HTML'>
@@ -122,16 +342,19 @@ RSpec.describe Asciimath2UnitsML do
122
342
  <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='3' xml:id='NISTp10_3'>
123
343
  <PrefixName xml:lang='en'>kilo</PrefixName>
124
344
  <PrefixSymbol type='ASCII'>k</PrefixSymbol>
345
+ <PrefixSymbol type='unicode'>k</PrefixSymbol>
346
+ <PrefixSymbol type='LaTeX'>k</PrefixSymbol>
347
+ <PrefixSymbol type='HTML'>k</PrefixSymbol>
125
348
  </Prefix>
126
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_MT-2'>
349
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd37'>
127
350
  <Mass symbol='M' powerNumerator='1'/>
128
351
  <Time symbol='T' powerNumerator='-2'/>
129
352
  </Dimension>
130
353
  <mo>&#xD7;</mo>
131
- <mn>812</mn>
354
+ <mn>9</mn>
132
355
  <mo rspace='thickmathspace'>&#x2062;</mo>
133
- <mrow xref='U_NISTu1.u3e-2_1'>
134
- <mi mathvariant='normal'>m</mi>
356
+ <mrow xref='U_kg.s-2'>
357
+ <mi mathvariant='normal'>kg</mi>
135
358
  <mo>&#xB7;</mo>
136
359
  <msup>
137
360
  <mrow>
@@ -143,43 +366,177 @@ RSpec.describe Asciimath2UnitsML do
143
366
  </mrow>
144
367
  </msup>
145
368
  </mrow>
146
- <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_NISTu1.u3e-2_1' dimensionURL='#D_LT-2'>
147
- <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
148
- <UnitName xml:lang='en'>meter per second squared</UnitName>
149
- <UnitSymbol type='HTML'>
150
- m&#xB7;s
151
- <sup>&#x2212;2</sup>
152
- </UnitSymbol>
153
- <UnitSymbol type='MathML'>
154
- <math xmlns='http://www.w3.org/1998/Math/MathML'>
155
- <mrow>
156
- <mi mathvariant='normal'>m</mi>
157
- <mo>&#xB7;</mo>
158
- <msup>
159
- <mrow>
160
- <mi mathvariant='normal'>s</mi>
161
- </mrow>
162
- <mrow>
163
- <mo>&#x2212;</mo>
164
- <mn>2</mn>
165
- </mrow>
166
- </msup>
167
- </mrow>
168
- </math>
169
- </UnitSymbol>
170
- <RootUnits>
171
- <EnumeratedRootUnit unit='meter'/>
172
- <EnumeratedRootUnit unit='second' powerNumerator='-2'/>
173
- </RootUnits>
174
- </Unit>
175
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_LT-2'>
176
- <Length symbol='L' powerNumerator='1'/>
177
- <Time symbol='T' powerNumerator='-2'/>
178
- </Dimension>
179
- <mo>&#x2212;</mo>
369
+ </math>
370
+ OUTPUT
371
+ end
372
+
373
+ it "deals with notational variants" do
374
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
375
+ 9 "unitsml(degK)" + 10 "unitsml(K)"
376
+ INPUT
377
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
378
+ <mn>9</mn>
379
+ <mo rspace='thickmathspace'>&#x2062;</mo>
380
+ <mrow xref='U_NISTu5'>
381
+ <mi mathvariant='normal'>&#xB0;K</mi>
382
+ </mrow>
383
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_NISTu5' dimensionURL='#NISTd5'>
384
+ <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
385
+ <UnitName xml:lang='en'>kelvin</UnitName>
386
+ <UnitSymbol type='HTML'>K</UnitSymbol>
387
+ <UnitSymbol type='MathML'>
388
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
389
+ <mrow>
390
+ <mi mathvariant='normal'>K</mi>
391
+ </mrow>
392
+ </math>
393
+ </UnitSymbol>
394
+ </Unit>
395
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd5'>
396
+ <ThermodynamicTemperature symbol='Theta' powerNumerator='1'/>
397
+ </Dimension>
398
+ <Quantity xmlns='http://unitsml.nist.gov/2005' xml:id='NISTq5' dimensionURL='#NISTd5' quantityType='base'>
399
+ <QuantityName xml:lang='en-US'>thermodynamic temperature</QuantityName>
400
+ </Quantity>
401
+ <mo>+</mo>
402
+ <mn>10</mn>
403
+ <mo rspace='thickmathspace'>&#x2062;</mo>
404
+ <mrow xref='U_NISTu5'>
405
+ <mi mathvariant='normal'>K</mi>
406
+ </mrow>
407
+ </math>
408
+ OUTPUT
409
+ end
410
+
411
+ it "deals with prefixed units" do
412
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
413
+ 9 "unitsml(mbar)"
414
+ INPUT
415
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
416
+ <mn>9</mn>
417
+ <mo rspace='thickmathspace'>&#x2062;</mo>
418
+ <mrow xref='U_NISTu362'>
419
+ <mi mathvariant='normal'>mbar</mi>
420
+ </mrow>
421
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_NISTu362'>
422
+ <UnitSystem name='not_SI' type='not_SI' xml:lang='en-US'/>
423
+ <UnitName xml:lang='en'>millibar</UnitName>
424
+ <UnitSymbol type='HTML'>mbar</UnitSymbol>
425
+ <UnitSymbol type='MathML'>
426
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
427
+ <mrow>
428
+ <mi mathvariant='normal'>mbar</mi>
429
+ </mrow>
430
+ </math>
431
+ </UnitSymbol>
432
+ <RootUnits>
433
+ <EnumeratedRootUnit unit='bar' prefix='m'/>
434
+ </RootUnits>
435
+ </Unit>
436
+ <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='-3' xml:id='NISTp10_-3'>
437
+ <PrefixName xml:lang='en'>milli</PrefixName>
438
+ <PrefixSymbol type='ASCII'>m</PrefixSymbol>
439
+ <PrefixSymbol type='unicode'>m</PrefixSymbol>
440
+ <PrefixSymbol type='LaTeX'>m</PrefixSymbol>
441
+ <PrefixSymbol type='HTML'>m</PrefixSymbol>
442
+ </Prefix>
443
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd14'>
444
+ <Length symbol='L' powerNumerator='-1'/>
445
+ <Mass symbol='M' powerNumerator='1'/>
446
+ <Time symbol='T' powerNumerator='-2'/>
447
+ </Dimension>
448
+ </math>
449
+ OUTPUT
450
+ end
451
+
452
+ it "deals with standalone prefixes" do
453
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
454
+ "unitsml(p-)" "unitsml(da-)"
455
+ INPUT
456
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
457
+ <mrow xref='NISTp10_-12'>
458
+ <mi mathvariant='normal'>p</mi>
459
+ </mrow>
460
+ <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='-12' xml:id='NISTp10_-12'>
461
+ <PrefixName xml:lang='en'>pico</PrefixName>
462
+ <PrefixSymbol type='ASCII'>p</PrefixSymbol>
463
+ <PrefixSymbol type='unicode'>p</PrefixSymbol>
464
+ <PrefixSymbol type='LaTeX'>p</PrefixSymbol>
465
+ <PrefixSymbol type='HTML'>p</PrefixSymbol>
466
+ </Prefix>
467
+ <mo rspace='thickmathspace'>&#x2062;</mo>
468
+ <mrow xref='NISTp10_1'>
469
+ <mi mathvariant='normal'>da</mi>
470
+ </mrow>
471
+ <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='1' xml:id='NISTp10_1'>
472
+ <PrefixName xml:lang='en'>deka</PrefixName>
473
+ <PrefixSymbol type='ASCII'>da</PrefixSymbol>
474
+ <PrefixSymbol type='unicode'>da</PrefixSymbol>
475
+ <PrefixSymbol type='LaTeX'>da</PrefixSymbol>
476
+ <PrefixSymbol type='HTML'>da</PrefixSymbol>
477
+ </Prefix>
478
+ </math>
479
+ OUTPUT
480
+ end
481
+
482
+ it "deals with HTML entities in UnitsDB" do
483
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
484
+ "unitsml(u-)" + "unitsml(um)"
485
+ INPUT
486
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
487
+ <mrow xref='NISTp10_-6'>
488
+ <mi mathvariant='normal'>&#xB5;</mi>
489
+ </mrow>
490
+ <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='-6' xml:id='NISTp10_-6'>
491
+ <PrefixName xml:lang='en'>micro</PrefixName>
492
+ <PrefixSymbol type='ASCII'>u</PrefixSymbol>
493
+ <PrefixSymbol type='unicode'>&#x3BC;</PrefixSymbol>
494
+ <PrefixSymbol type='LaTeX'>$mu$</PrefixSymbol>
495
+ <PrefixSymbol type='HTML'>&#xB5;</PrefixSymbol>
496
+ </Prefix>
497
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd2'>
498
+ <Mass symbol='M' powerNumerator='1'/>
499
+ </Dimension>
500
+ <Quantity xmlns='http://unitsml.nist.gov/2005' xml:id='NISTq2' dimensionURL='#NISTd2' quantityType='base'>
501
+ <QuantityName xml:lang='en-US'>mass</QuantityName>
502
+ </Quantity>
503
+ <mo>+</mo>
504
+ <mo rspace='thickmathspace'>&#x2062;</mo>
505
+ <mrow xref='U_um'>
506
+ <mi mathvariant='normal'>&#xB5;m</mi>
507
+ </mrow>
508
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_um' dimensionURL='#NISTd1'>
509
+ <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
510
+ <UnitName xml:lang='en'>um</UnitName>
511
+ <UnitSymbol type='HTML'>um</UnitSymbol>
512
+ <UnitSymbol type='MathML'>
513
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
514
+ <mrow>
515
+ <mi mathvariant='normal'>&#xB5;m</mi>
516
+ </mrow>
517
+ </math>
518
+ </UnitSymbol>
519
+ <RootUnits>
520
+ <EnumeratedRootUnit unit='meter' prefix='u'/>
521
+ </RootUnits>
522
+ </Unit>
523
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd1'>
524
+ <Length symbol='L' powerNumerator='1'/>
525
+ </Dimension>
526
+ </math>
527
+ OUTPUT
528
+ end
529
+
530
+ it "deals with units division" do
531
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
532
+ 9 "unitsml(A*C^3)" + 13 "unitsml(A/C^-3)"
533
+ INPUT
534
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
180
535
  <mn>9</mn>
181
536
  <mo rspace='thickmathspace'>&#x2062;</mo>
182
- <mrow xref='U_C3.A'>
537
+ <mrow xref='U_A.C3'>
538
+ <mi mathvariant='normal'>A</mi>
539
+ <mo>&#xB7;</mo>
183
540
  <msup>
184
541
  <mrow>
185
542
  <mi mathvariant='normal'>C</mi>
@@ -188,20 +545,19 @@ RSpec.describe Asciimath2UnitsML do
188
545
  <mn>3</mn>
189
546
  </mrow>
190
547
  </msup>
191
- <mo>&#xB7;</mo>
192
- <mi mathvariant='normal'>A</mi>
193
548
  </mrow>
194
- <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_C3.A' dimensionURL='#D_T3I4'>
549
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_A.C3' dimensionURL='#D_M3I4'>
195
550
  <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
196
- <UnitName xml:lang='en'>C^3*A</UnitName>
551
+ <UnitName xml:lang='en'>A*C^3</UnitName>
197
552
  <UnitSymbol type='HTML'>
198
- C
553
+ A&#xB7;C
199
554
  <sup>3</sup>
200
- &#xB7;A
201
555
  </UnitSymbol>
202
556
  <UnitSymbol type='MathML'>
203
557
  <math xmlns='http://www.w3.org/1998/Math/MathML'>
204
558
  <mrow>
559
+ <mi mathvariant='normal'>A</mi>
560
+ <mo>&#xB7;</mo>
205
561
  <msup>
206
562
  <mrow>
207
563
  <mi mathvariant='normal'>C</mi>
@@ -210,40 +566,36 @@ RSpec.describe Asciimath2UnitsML do
210
566
  <mn>3</mn>
211
567
  </mrow>
212
568
  </msup>
213
- <mo>&#xB7;</mo>
214
- <mi mathvariant='normal'>A</mi>
215
569
  </mrow>
216
570
  </math>
217
571
  </UnitSymbol>
218
572
  <RootUnits>
219
- <EnumeratedRootUnit unit='coulomb' powerNumerator='3'/>
220
573
  <EnumeratedRootUnit unit='ampere'/>
574
+ <EnumeratedRootUnit unit='coulomb' powerNumerator='3'/>
221
575
  </RootUnits>
222
576
  </Unit>
223
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_T3I4'>
224
- <Time symbol='T' powerNumerator='3'/>
577
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_M3I4'>
578
+ <Mass symbol='M' powerNumerator='3'/>
225
579
  <ElectricCurrent symbol='I' powerNumerator='4'/>
226
580
  </Dimension>
227
581
  <mo>+</mo>
228
- <mn>7</mn>
582
+ <mn>13</mn>
229
583
  <mo rspace='thickmathspace'>&#x2062;</mo>
230
- <mrow xref='U_NISTu284'>
231
- <mi mathvariant='normal'>hp</mi>
584
+ <mrow xref='U_A/C-3'>
585
+ <mi mathvariant='normal'>A</mi>
586
+ <mo>/</mo>
587
+ <msup>
588
+ <mrow>
589
+ <mi mathvariant='normal'>C</mi>
590
+ </mrow>
591
+ <mrow>
592
+ <mo>&#x2212;</mo>
593
+ <mn>3</mn>
594
+ </mrow>
595
+ </msup>
232
596
  </mrow>
233
- <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_NISTu284'>
234
- <UnitSystem name='not_SI' type='not_SI' xml:lang='en-US'/>
235
- <UnitName xml:lang='en'>horsepower</UnitName>
236
- <UnitSymbol type='HTML'>hp</UnitSymbol>
237
- <UnitSymbol type='MathML'>
238
- <math xmlns='http://www.w3.org/1998/Math/MathML'>
239
- <mrow>
240
- <mi mathvariant='normal'>hp</mi>
241
- </mrow>
242
- </math>
243
- </UnitSymbol>
244
- </Unit>
245
597
  </math>
246
- OUTPUT
598
+ OUTPUT
247
599
  end
248
600
 
249
601
  it "converts MathML to MatML + UnitsML" do
@@ -298,10 +650,16 @@ RSpec.describe Asciimath2UnitsML do
298
650
  </mrow>
299
651
  </math>
300
652
  </UnitSymbol>
653
+ <RootUnits>
654
+ <EnumeratedRootUnit unit='gram' prefix='k' powerNumerator='-2'/>
655
+ </RootUnits>
301
656
  </Unit>
302
657
  <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='3' xml:id='NISTp10_3'>
303
658
  <PrefixName xml:lang='en'>kilo</PrefixName>
304
659
  <PrefixSymbol type='ASCII'>k</PrefixSymbol>
660
+ <PrefixSymbol type='unicode'>k</PrefixSymbol>
661
+ <PrefixSymbol type='LaTeX'>k</PrefixSymbol>
662
+ <PrefixSymbol type='HTML'>k</PrefixSymbol>
305
663
  </Prefix>
306
664
  <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_M-2'>
307
665
  <Mass symbol='M' powerNumerator='-2'/>
@@ -338,7 +696,7 @@ OUTPUT
338
696
  </mrow>
339
697
  </msup>
340
698
  </mrow>
341
- <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg.s-2' dimensionURL='#D_MT-2'>
699
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg.s-2' dimensionURL='#NISTd37'>
342
700
  <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
343
701
  <UnitName xml:lang='en'>kg*s^-2</UnitName>
344
702
  <UnitSymbol type='HTML'>
@@ -370,8 +728,11 @@ OUTPUT
370
728
  <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='3' xml:id='NISTp10_3'>
371
729
  <PrefixName xml:lang='en'>kilo</PrefixName>
372
730
  <PrefixSymbol type='ASCII'>k</PrefixSymbol>
731
+ <PrefixSymbol type='unicode'>k</PrefixSymbol>
732
+ <PrefixSymbol type='LaTeX'>k</PrefixSymbol>
733
+ <PrefixSymbol type='HTML'>k</PrefixSymbol>
373
734
  </Prefix>
374
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_MT-2'>
735
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd37'>
375
736
  <Mass symbol='M' powerNumerator='1'/>
376
737
  <Time symbol='T' powerNumerator='-2'/>
377
738
  </Dimension>
@@ -396,7 +757,7 @@ OUTPUT
396
757
  </mrow>
397
758
  </msup>
398
759
  </mrow>
399
- <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg.s-2' dimensionURL='#D_MT-2'>
760
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg.s-2' dimensionURL='#NISTd37'>
400
761
  <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
401
762
  <UnitName xml:lang='en'>kg*s^-2</UnitName>
402
763
  <UnitSymbol type='HTML'>
@@ -428,8 +789,11 @@ OUTPUT
428
789
  <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='3' xml:id='NISTp10_3'>
429
790
  <PrefixName xml:lang='en'>kilo</PrefixName>
430
791
  <PrefixSymbol type='ASCII'>k</PrefixSymbol>
792
+ <PrefixSymbol type='unicode'>k</PrefixSymbol>
793
+ <PrefixSymbol type='LaTeX'>k</PrefixSymbol>
794
+ <PrefixSymbol type='HTML'>k</PrefixSymbol>
431
795
  </Prefix>
432
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_MT-2'>
796
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd37'>
433
797
  <Mass symbol='M' powerNumerator='1'/>
434
798
  <Time symbol='T' powerNumerator='-2'/>
435
799
  </Dimension>
@@ -454,7 +818,7 @@ OUTPUT
454
818
  </mrow>
455
819
  </msup>
456
820
  </mrow>
457
- <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg.s-2' dimensionURL='#D_MT-2'>
821
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg.s-2' dimensionURL='#NISTd37'>
458
822
  <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
459
823
  <UnitName xml:lang='en'>kg*s^-2</UnitName>
460
824
  <UnitSymbol type='HTML'>
@@ -486,12 +850,283 @@ OUTPUT
486
850
  <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='3' xml:id='NISTp10_3'>
487
851
  <PrefixName xml:lang='en'>kilo</PrefixName>
488
852
  <PrefixSymbol type='ASCII'>k</PrefixSymbol>
853
+ <PrefixSymbol type='unicode'>k</PrefixSymbol>
854
+ <PrefixSymbol type='LaTeX'>k</PrefixSymbol>
855
+ <PrefixSymbol type='HTML'>k</PrefixSymbol>
489
856
  </Prefix>
490
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_MT-2'>
857
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd37'>
491
858
  <Mass symbol='M' powerNumerator='1'/>
492
859
  <Time symbol='T' powerNumerator='-2'/>
493
860
  </Dimension>
494
861
  </math>
495
862
  OUTPUT
496
863
  end
864
+
865
+ it "deals with dimension decomposition with like units" do
866
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
867
+ 9 "unitsml(mW*cm^(-2))"
868
+ INPUT
869
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
870
+ <mn>9</mn>
871
+ <mo rspace='thickmathspace'>&#x2062;</mo>
872
+ <mrow xref='U_mW.cm-2'>
873
+ <mi mathvariant='normal'>mW</mi>
874
+ <mo>&#xB7;</mo>
875
+ <msup>
876
+ <mrow>
877
+ <mi mathvariant='normal'>cm</mi>
878
+ </mrow>
879
+ <mrow>
880
+ <mo>&#x2212;</mo>
881
+ <mn>2</mn>
882
+ </mrow>
883
+ </msup>
884
+ </mrow>
885
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_mW.cm-2'>
886
+ <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
887
+ <UnitName xml:lang='en'>mW*cm^-2</UnitName>
888
+ <UnitSymbol type='HTML'>
889
+ mW&#xB7;cm
890
+ <sup>&#x2212;2</sup>
891
+ </UnitSymbol>
892
+ <UnitSymbol type='MathML'>
893
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
894
+ <mrow>
895
+ <mi mathvariant='normal'>mW</mi>
896
+ <mo>&#xB7;</mo>
897
+ <msup>
898
+ <mrow>
899
+ <mi mathvariant='normal'>cm</mi>
900
+ </mrow>
901
+ <mrow>
902
+ <mo>&#x2212;</mo>
903
+ <mn>2</mn>
904
+ </mrow>
905
+ </msup>
906
+ </mrow>
907
+ </math>
908
+ </UnitSymbol>
909
+ <RootUnits>
910
+ <EnumeratedRootUnit unit='watt' prefix='m'/>
911
+ <EnumeratedRootUnit unit='meter' prefix='c' powerNumerator='-2'/>
912
+ </RootUnits>
913
+ </Unit>
914
+ <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='-3' xml:id='NISTp10_-3'>
915
+ <PrefixName xml:lang='en'>milli</PrefixName>
916
+ <PrefixSymbol type='ASCII'>m</PrefixSymbol>
917
+ <PrefixSymbol type='unicode'>m</PrefixSymbol>
918
+ <PrefixSymbol type='LaTeX'>m</PrefixSymbol>
919
+ <PrefixSymbol type='HTML'>m</PrefixSymbol>
920
+ </Prefix>
921
+ <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='-2' xml:id='NISTp10_-2'>
922
+ <PrefixName xml:lang='en'>centi</PrefixName>
923
+ <PrefixSymbol type='ASCII'>c</PrefixSymbol>
924
+ <PrefixSymbol type='unicode'>c</PrefixSymbol>
925
+ <PrefixSymbol type='LaTeX'>c</PrefixSymbol>
926
+ <PrefixSymbol type='HTML'>c</PrefixSymbol>
927
+ </Prefix>
928
+ </math>
929
+ OUTPUT
930
+ end
931
+
932
+ it "deals with quantity input" do
933
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
934
+ 9 "unitsml(m, quantity: NISTq103)"
935
+ INPUT
936
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
937
+ <mn>9</mn>
938
+ <mo rspace='thickmathspace'>&#x2062;</mo>
939
+ <mrow xref='U_NISTu1'>
940
+ <mi mathvariant='normal'>m</mi>
941
+ </mrow>
942
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_NISTu1' dimensionURL='#NISTd1'>
943
+ <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
944
+ <UnitName xml:lang='en'>meter</UnitName>
945
+ <UnitSymbol type='HTML'>m</UnitSymbol>
946
+ <UnitSymbol type='MathML'>
947
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
948
+ <mrow>
949
+ <mi mathvariant='normal'>m</mi>
950
+ </mrow>
951
+ </math>
952
+ </UnitSymbol>
953
+ </Unit>
954
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd1'>
955
+ <Length symbol='L' powerNumerator='1'/>
956
+ </Dimension>
957
+ <Quantity xmlns='http://unitsml.nist.gov/2005' xml:id='NISTq103' dimensionURL='#NISTd1' quantityType='base'>
958
+ <QuantityName xml:lang='en-US'>position vector</QuantityName>
959
+ </Quantity>
960
+ </math>
961
+ OUTPUT
962
+ end
963
+
964
+ it "deals with name input" do
965
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
966
+ 9 "unitsml(cal_th/cm^2, name: langley)"
967
+ INPUT
968
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
969
+ <mn>9</mn>
970
+ <mo rspace='thickmathspace'>&#x2062;</mo>
971
+ <mrow xref='U_cal_th/cm2'>
972
+ <msub>
973
+ <mrow>
974
+ <mi mathvariant='normal'>cal</mi>
975
+ </mrow>
976
+ <mrow>
977
+ <mi mathvariant='normal'>th</mi>
978
+ </mrow>
979
+ </msub>
980
+ <mo>/</mo>
981
+ <msup>
982
+ <mrow>
983
+ <mi mathvariant='normal'>cm</mi>
984
+ </mrow>
985
+ <mrow>
986
+ <mn>2</mn>
987
+ </mrow>
988
+ </msup>
989
+ </mrow>
990
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_cal_th.cm-2'>
991
+ <UnitSystem name='not_SI' type='not_SI' xml:lang='en-US'/>
992
+ <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
993
+ <UnitName xml:lang='en'>langley</UnitName>
994
+ <UnitSymbol type='HTML'>
995
+ cal
996
+ <sub>th</sub>
997
+ &#xB7;cm
998
+ <sup>&#x2212;2</sup>
999
+ </UnitSymbol>
1000
+ <UnitSymbol type='MathML'>
1001
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
1002
+ <mrow>
1003
+ <msub>
1004
+ <mrow>
1005
+ <mi mathvariant='normal'>cal</mi>
1006
+ </mrow>
1007
+ <mrow>
1008
+ <mi mathvariant='normal'>th</mi>
1009
+ </mrow>
1010
+ </msub>
1011
+ <mo>&#xB7;</mo>
1012
+ <msup>
1013
+ <mrow>
1014
+ <mi mathvariant='normal'>cm</mi>
1015
+ </mrow>
1016
+ <mrow>
1017
+ <mo>&#x2212;</mo>
1018
+ <mn>2</mn>
1019
+ </mrow>
1020
+ </msup>
1021
+ </mrow>
1022
+ </math>
1023
+ </UnitSymbol>
1024
+ <RootUnits>
1025
+ <EnumeratedRootUnit unit='thermochemical calorie'/>
1026
+ <EnumeratedRootUnit unit='meter' prefix='c' powerNumerator='-2'/>
1027
+ </RootUnits>
1028
+ </Unit>
1029
+ <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='-2' xml:id='NISTp10_-2'>
1030
+ <PrefixName xml:lang='en'>centi</PrefixName>
1031
+ <PrefixSymbol type='ASCII'>c</PrefixSymbol>
1032
+ <PrefixSymbol type='unicode'>c</PrefixSymbol>
1033
+ <PrefixSymbol type='LaTeX'>c</PrefixSymbol>
1034
+ <PrefixSymbol type='HTML'>c</PrefixSymbol>
1035
+ </Prefix>
1036
+ </math>
1037
+ OUTPUT
1038
+ end
1039
+
1040
+ it "deals with symbol input" do
1041
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
1042
+ 9 "unitsml(m, symbol: La)" + 10 "unitsml(cm*s^-2, symbol: cm cdot s^-2)"
1043
+ INPUT
1044
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
1045
+ <mn>9</mn>
1046
+ <mo rspace='thickmathspace'>&#x2062;</mo>
1047
+ <mrow xref='U_NISTu1'>
1048
+ <math>
1049
+ <mi mathvariant='normal'>L</mi>
1050
+ <mi mathvariant='normal'>a</mi>
1051
+ </math>
1052
+ </mrow>
1053
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_NISTu1' dimensionURL='#NISTd1'>
1054
+ <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
1055
+ <UnitName xml:lang='en'>meter</UnitName>
1056
+ <UnitSymbol type='HTML'>m</UnitSymbol>
1057
+ <UnitSymbol type='MathML'>
1058
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
1059
+ <mrow>
1060
+ <mi mathvariant='normal'>m</mi>
1061
+ </mrow>
1062
+ </math>
1063
+ </UnitSymbol>
1064
+ </Unit>
1065
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd1'>
1066
+ <Length symbol='L' powerNumerator='1'/>
1067
+ </Dimension>
1068
+ <mo>+</mo>
1069
+ <mn>10</mn>
1070
+ <mo rspace='thickmathspace'>&#x2062;</mo>
1071
+ <mrow xref='U_cm.s-2'>
1072
+ <math>
1073
+ <mi mathvariant='normal'>c</mi>
1074
+ <mi mathvariant='normal'>m</mi>
1075
+ <mo>&#x22C5;</mo>
1076
+ <msup>
1077
+ <mrow>
1078
+ <mi mathvariant='normal'>s</mi>
1079
+ </mrow>
1080
+ <mrow>
1081
+ <mo>&#x2212;</mo>
1082
+ </mrow>
1083
+ </msup>
1084
+ <mn>2</mn>
1085
+ </math>
1086
+ </mrow>
1087
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_cm.s-2' dimensionURL='#NISTd28'>
1088
+ <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
1089
+ <UnitName xml:lang='en'>cm*s^-2</UnitName>
1090
+ <UnitSymbol type='HTML'>
1091
+ cm&#xB7;s
1092
+ <sup>&#x2212;2</sup>
1093
+ </UnitSymbol>
1094
+ <UnitSymbol type='MathML'>
1095
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
1096
+ <mrow>
1097
+ <mi mathvariant='normal'>cm</mi>
1098
+ <mo>&#xB7;</mo>
1099
+ <msup>
1100
+ <mrow>
1101
+ <mi mathvariant='normal'>s</mi>
1102
+ </mrow>
1103
+ <mrow>
1104
+ <mo>&#x2212;</mo>
1105
+ <mn>2</mn>
1106
+ </mrow>
1107
+ </msup>
1108
+ </mrow>
1109
+ </math>
1110
+ </UnitSymbol>
1111
+ <RootUnits>
1112
+ <EnumeratedRootUnit unit='meter' prefix='c'/>
1113
+ <EnumeratedRootUnit unit='second' powerNumerator='-2'/>
1114
+ </RootUnits>
1115
+ </Unit>
1116
+ <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='-2' xml:id='NISTp10_-2'>
1117
+ <PrefixName xml:lang='en'>centi</PrefixName>
1118
+ <PrefixSymbol type='ASCII'>c</PrefixSymbol>
1119
+ <PrefixSymbol type='unicode'>c</PrefixSymbol>
1120
+ <PrefixSymbol type='LaTeX'>c</PrefixSymbol>
1121
+ <PrefixSymbol type='HTML'>c</PrefixSymbol>
1122
+ </Prefix>
1123
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd28'>
1124
+ <Length symbol='L' powerNumerator='1'/>
1125
+ <Time symbol='T' powerNumerator='-2'/>
1126
+ </Dimension>
1127
+ </math>
1128
+ OUTPUT
1129
+ end
1130
+
1131
+
497
1132
  end