asciimath2unitsml 0.1.1 → 0.2.2

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,163 @@
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
+ rescue
139
+ raise StandardError.new "Parse fail on Unit #{id}: #{hash}"
140
+ end
141
+ end
142
+
143
+ def system_name
144
+ @unit_system[:name]
145
+ end
146
+
147
+ def system_type
148
+ @unit_system[:type]
149
+ end
150
+
151
+ def name
152
+ @names.first
153
+ end
154
+
155
+ def symbolid
156
+ @symbols ? @symbols.first[:id] : @short
157
+ end
158
+
159
+ def symbolids
160
+ @symbols ? @symbols.map { |s| s[:id] } : [ @short ]
161
+ end
162
+ end
163
+ 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)"
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,108 @@ 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
599
+ end
600
+
601
+ it "converts MathML to MatML + UnitsML" do
602
+ input = <<~INPUT
603
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
604
+ <mn>32</mn>
605
+ <mo>+</mo>
606
+ <mn>5</mn>
607
+ <mo>&#xD7;</mo>
608
+ <mn>7</mn>
609
+ <mtext>unitsml(kg^-2)</mtext>
610
+ </math>
611
+ INPUT
612
+ output = <<~OUTPUT
613
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
614
+ <mn>32</mn>
615
+ <mo>+</mo>
616
+ <mn>5</mn>
617
+ <mo>&#xD7;</mo>
618
+ <mn>7</mn>
619
+ <mo rspace='thickmathspace'>&#x2062;</mo>
620
+ <mrow xref='U_kg-2'>
621
+ <msup>
622
+ <mrow>
623
+ <mi mathvariant='normal'>kg</mi>
624
+ </mrow>
625
+ <mrow>
626
+ <mo>&#x2212;</mo>
627
+ <mn>2</mn>
628
+ </mrow>
629
+ </msup>
630
+ </mrow>
631
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg-2' dimensionURL='#D_M-2'>
632
+ <UnitSystem name='SI' type='SI_base' xml:lang='en-US'/>
633
+ <UnitName xml:lang='en'>kg^-2</UnitName>
634
+ <UnitSymbol type='HTML'>
635
+ kg
636
+ <sup>&#x2212;2</sup>
637
+ </UnitSymbol>
638
+ <UnitSymbol type='MathML'>
639
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
640
+ <mrow>
641
+ <msup>
642
+ <mrow>
643
+ <mi mathvariant='normal'>kg</mi>
644
+ </mrow>
645
+ <mrow>
646
+ <mo>&#x2212;</mo>
647
+ <mn>2</mn>
648
+ </mrow>
649
+ </msup>
650
+ </mrow>
651
+ </math>
652
+ </UnitSymbol>
653
+ <RootUnits>
654
+ <EnumeratedRootUnit unit='gram' prefix='k' powerNumerator='-2'/>
655
+ </RootUnits>
656
+ </Unit>
657
+ <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='3' xml:id='NISTp10_3'>
658
+ <PrefixName xml:lang='en'>kilo</PrefixName>
659
+ <PrefixSymbol type='ASCII'>k</PrefixSymbol>
660
+ <PrefixSymbol type='unicode'>k</PrefixSymbol>
661
+ <PrefixSymbol type='LaTeX'>k</PrefixSymbol>
662
+ <PrefixSymbol type='HTML'>k</PrefixSymbol>
663
+ </Prefix>
664
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_M-2'>
665
+ <Mass symbol='M' powerNumerator='-2'/>
666
+ </Dimension>
667
+ </math>
668
+ OUTPUT
669
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().MathML2UnitsML(input).to_xml)).to be_equivalent_to xmlpp(output)
670
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().MathML2UnitsML(Nokogiri::XML(input)).to_xml)).to be_equivalent_to xmlpp(output)
247
671
  end
248
672
 
249
673
  it "raises error for illegal unit" do
@@ -272,7 +696,7 @@ RSpec.describe Asciimath2UnitsML do
272
696
  </mrow>
273
697
  </msup>
274
698
  </mrow>
275
- <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'>
276
700
  <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
277
701
  <UnitName xml:lang='en'>kg*s^-2</UnitName>
278
702
  <UnitSymbol type='HTML'>
@@ -304,8 +728,11 @@ RSpec.describe Asciimath2UnitsML do
304
728
  <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='3' xml:id='NISTp10_3'>
305
729
  <PrefixName xml:lang='en'>kilo</PrefixName>
306
730
  <PrefixSymbol type='ASCII'>k</PrefixSymbol>
731
+ <PrefixSymbol type='unicode'>k</PrefixSymbol>
732
+ <PrefixSymbol type='LaTeX'>k</PrefixSymbol>
733
+ <PrefixSymbol type='HTML'>k</PrefixSymbol>
307
734
  </Prefix>
308
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_MT-2'>
735
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd37'>
309
736
  <Mass symbol='M' powerNumerator='1'/>
310
737
  <Time symbol='T' powerNumerator='-2'/>
311
738
  </Dimension>
@@ -330,7 +757,7 @@ RSpec.describe Asciimath2UnitsML do
330
757
  </mrow>
331
758
  </msup>
332
759
  </mrow>
333
- <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'>
334
761
  <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
335
762
  <UnitName xml:lang='en'>kg*s^-2</UnitName>
336
763
  <UnitSymbol type='HTML'>
@@ -362,8 +789,11 @@ RSpec.describe Asciimath2UnitsML do
362
789
  <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='3' xml:id='NISTp10_3'>
363
790
  <PrefixName xml:lang='en'>kilo</PrefixName>
364
791
  <PrefixSymbol type='ASCII'>k</PrefixSymbol>
792
+ <PrefixSymbol type='unicode'>k</PrefixSymbol>
793
+ <PrefixSymbol type='LaTeX'>k</PrefixSymbol>
794
+ <PrefixSymbol type='HTML'>k</PrefixSymbol>
365
795
  </Prefix>
366
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_MT-2'>
796
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd37'>
367
797
  <Mass symbol='M' powerNumerator='1'/>
368
798
  <Time symbol='T' powerNumerator='-2'/>
369
799
  </Dimension>
@@ -388,7 +818,7 @@ RSpec.describe Asciimath2UnitsML do
388
818
  </mrow>
389
819
  </msup>
390
820
  </mrow>
391
- <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'>
392
822
  <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
393
823
  <UnitName xml:lang='en'>kg*s^-2</UnitName>
394
824
  <UnitSymbol type='HTML'>
@@ -420,12 +850,283 @@ RSpec.describe Asciimath2UnitsML do
420
850
  <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='3' xml:id='NISTp10_3'>
421
851
  <PrefixName xml:lang='en'>kilo</PrefixName>
422
852
  <PrefixSymbol type='ASCII'>k</PrefixSymbol>
853
+ <PrefixSymbol type='unicode'>k</PrefixSymbol>
854
+ <PrefixSymbol type='LaTeX'>k</PrefixSymbol>
855
+ <PrefixSymbol type='HTML'>k</PrefixSymbol>
423
856
  </Prefix>
424
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_MT-2'>
857
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd37'>
425
858
  <Mass symbol='M' powerNumerator='1'/>
426
859
  <Time symbol='T' powerNumerator='-2'/>
427
860
  </Dimension>
428
861
  </math>
429
862
  OUTPUT
430
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
+
431
1132
  end