asciimath2unitsml 0.1.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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