asciimath2unitsml 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,13 +3,14 @@ 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
- 1 "unitsml(kg*s^-2)" xx 9 "unitsml(g)"
6
+ 1 "unitsml(mm*s^-2)"
7
7
  INPUT
8
- <math xmlns='http://www.w3.org/1998/Math/MathML'>
8
+ <?xml version='1.0'?>
9
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
9
10
  <mn>1</mn>
10
11
  <mo rspace='thickmathspace'>&#x2062;</mo>
11
- <mrow xref='U_kg.s-2'>
12
- <mi mathvariant='normal'>kg</mi>
12
+ <mrow xref='U_mm.s-2'>
13
+ <mi mathvariant='normal'>mm</mi>
13
14
  <mo>&#xB7;</mo>
14
15
  <msup>
15
16
  <mrow>
@@ -21,17 +22,17 @@ RSpec.describe Asciimath2UnitsML do
21
22
  </mrow>
22
23
  </msup>
23
24
  </mrow>
24
- <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg.s-2' dimensionURL='#D_MT-2'>
25
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_mm.s-2' dimensionURL='#NISTd28'>
25
26
  <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
26
- <UnitName xml:lang='en'>kg*s^-2</UnitName>
27
+ <UnitName xml:lang='en'>mm*s^-2</UnitName>
27
28
  <UnitSymbol type='HTML'>
28
- kg&#xB7;s
29
+ mm&#xB7;s
29
30
  <sup>&#x2212;2</sup>
30
31
  </UnitSymbol>
31
32
  <UnitSymbol type='MathML'>
32
33
  <math xmlns='http://www.w3.org/1998/Math/MathML'>
33
34
  <mrow>
34
- <mi mathvariant='normal'>kg</mi>
35
+ <mi mathvariant='normal'>mm</mi>
35
36
  <mo>&#xB7;</mo>
36
37
  <msup>
37
38
  <mrow>
@@ -46,26 +47,111 @@ RSpec.describe Asciimath2UnitsML do
46
47
  </math>
47
48
  </UnitSymbol>
48
49
  <RootUnits>
49
- <EnumeratedRootUnit unit='gram' prefix='k'/>
50
+ <EnumeratedRootUnit unit='meter' prefix='m'/>
50
51
  <EnumeratedRootUnit unit='second' powerNumerator='-2'/>
51
52
  </RootUnits>
52
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'>um</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'>um</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'>&amp;micro;</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 "deals with kg and g" do
110
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
111
+ 1 "unitsml(kg)" + 1 "unitsml(g)"
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_NISTu2'>
117
+ <mi mathvariant='normal'>kg</mi>
118
+ </mrow>
119
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_NISTu2' dimensionURL='#NISTd2'>
120
+ <UnitSystem name='SI' type='SI_base' xml:lang='en-US'/>
121
+ <UnitName xml:lang='en'>kilogram</UnitName>
122
+ <UnitSymbol type='HTML'>kg</UnitSymbol>
123
+ <UnitSymbol type='MathML'>
124
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
125
+ <mrow>
126
+ <mi mathvariant='normal'>kg</mi>
127
+ </mrow>
128
+ </math>
129
+ </UnitSymbol>
130
+ <RootUnits>
131
+ <EnumeratedRootUnit unit='gram' prefix='k'/>
132
+ </RootUnits>
133
+ </Unit>
53
134
  <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='3' xml:id='NISTp10_3'>
54
135
  <PrefixName xml:lang='en'>kilo</PrefixName>
55
136
  <PrefixSymbol type='ASCII'>k</PrefixSymbol>
137
+ <PrefixSymbol type='unicode'>k</PrefixSymbol>
138
+ <PrefixSymbol type='LaTeX'>k</PrefixSymbol>
139
+ <PrefixSymbol type='HTML'>k</PrefixSymbol>
56
140
  </Prefix>
57
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_MT-2'>
141
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd2'>
58
142
  <Mass symbol='M' powerNumerator='1'/>
59
- <Time symbol='T' powerNumerator='-2'/>
60
143
  </Dimension>
61
- <mo>&#xD7;</mo>
62
- <mn>9</mn>
144
+ <Quantity xmlns='http://unitsml.nist.gov/2005' xml:id='NISTq2' dimensionURL='#NISTd2' quantityType='base'>
145
+ <QuantityName xml:lang='en-US'>mass</QuantityName>
146
+ </Quantity>
147
+ <mo>+</mo>
148
+ <mn>1</mn>
63
149
  <mo rspace='thickmathspace'>&#x2062;</mo>
64
150
  <mrow xref='U_NISTu27'>
65
151
  <mi mathvariant='normal'>g</mi>
66
152
  </mrow>
67
- <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_NISTu27' dimensionURL='#D_M'>
68
- <UnitSystem name='SI' type='SI_base' xml:lang='en-US'/>
153
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_NISTu27' dimensionURL='#NISTd2'>
154
+ <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
69
155
  <UnitName xml:lang='en'>gram</UnitName>
70
156
  <UnitSymbol type='HTML'>g</UnitSymbol>
71
157
  <UnitSymbol type='MathML'>
@@ -76,9 +162,6 @@ RSpec.describe Asciimath2UnitsML do
76
162
  </math>
77
163
  </UnitSymbol>
78
164
  </Unit>
79
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_M'>
80
- <Mass symbol='M' powerNumerator='1'/>
81
- </Dimension>
82
165
  </math>
83
166
  OUTPUT
84
167
  end
@@ -105,6 +188,14 @@ RSpec.describe Asciimath2UnitsML do
105
188
  </math>
106
189
  </UnitSymbol>
107
190
  </Unit>
191
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd16'>
192
+ <Length symbol='L' powerNumerator='2'/>
193
+ <Mass symbol='M' powerNumerator='1'/>
194
+ <Time symbol='T' powerNumerator='-3'/>
195
+ </Dimension>
196
+ <Quantity xmlns='http://unitsml.nist.gov/2005' xml:id='NISTq20' dimensionURL='#NISTd16' quantityType='base'>
197
+ <QuantityName xml:lang='en-US'>power</QuantityName>
198
+ </Quantity>
108
199
  </math>
109
200
  OUTPUT
110
201
  end
@@ -129,7 +220,7 @@ RSpec.describe Asciimath2UnitsML do
129
220
  </mrow>
130
221
  </msup>
131
222
  </mrow>
132
- <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg.s-2' dimensionURL='#D_MT-2'>
223
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg.s-2' dimensionURL='#NISTd37'>
133
224
  <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
134
225
  <UnitName xml:lang='en'>kg*s^-2</UnitName>
135
226
  <UnitSymbol type='HTML'>
@@ -161,8 +252,11 @@ RSpec.describe Asciimath2UnitsML do
161
252
  <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='3' xml:id='NISTp10_3'>
162
253
  <PrefixName xml:lang='en'>kilo</PrefixName>
163
254
  <PrefixSymbol type='ASCII'>k</PrefixSymbol>
255
+ <PrefixSymbol type='unicode'>k</PrefixSymbol>
256
+ <PrefixSymbol type='LaTeX'>k</PrefixSymbol>
257
+ <PrefixSymbol type='HTML'>k</PrefixSymbol>
164
258
  </Prefix>
165
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_MT-2'>
259
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd37'>
166
260
  <Mass symbol='M' powerNumerator='1'/>
167
261
  <Time symbol='T' powerNumerator='-2'/>
168
262
  </Dimension>
@@ -182,64 +276,100 @@ RSpec.describe Asciimath2UnitsML do
182
276
  </mrow>
183
277
  </msup>
184
278
  </mrow>
185
- <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg.s-2' dimensionURL='#D_MT-2'>
186
- <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
187
- <UnitName xml:lang='en'>kg*s^-2</UnitName>
188
- <UnitSymbol type='HTML'>
189
- kg&#xB7;s
190
- <sup>&#x2212;2</sup>
191
- </UnitSymbol>
192
- <UnitSymbol type='MathML'>
193
- <math xmlns='http://www.w3.org/1998/Math/MathML'>
194
- <mrow>
195
- <mi mathvariant='normal'>kg</mi>
196
- <mo>&#xB7;</mo>
197
- <msup>
198
- <mrow>
199
- <mi mathvariant='normal'>s</mi>
200
- </mrow>
201
- <mrow>
202
- <mo>&#x2212;</mo>
203
- <mn>2</mn>
204
- </mrow>
205
- </msup>
206
- </mrow>
207
- </math>
208
- </UnitSymbol>
209
- <RootUnits>
210
- <EnumeratedRootUnit unit='gram' prefix='k'/>
211
- <EnumeratedRootUnit unit='second' powerNumerator='-2'/>
212
- </RootUnits>
213
- </Unit>
214
- <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='3' xml:id='NISTp10_3'>
215
- <PrefixName xml:lang='en'>kilo</PrefixName>
216
- <PrefixSymbol type='ASCII'>k</PrefixSymbol>
217
- </Prefix>
218
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_MT-2'>
219
- <Mass symbol='M' powerNumerator='1'/>
220
- <Time symbol='T' powerNumerator='-2'/>
221
- </Dimension>
222
279
  </math>
223
280
  OUTPUT
224
281
  end
225
282
 
226
- =begin
227
283
  it "deals with notational variants" do
228
284
  expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
229
285
  9 "unitsml(degK)" + 10 "unitsml(K)"
230
286
  INPUT
287
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
288
+ <mn>9</mn>
289
+ <mo rspace='thickmathspace'>&#x2062;</mo>
290
+ <mrow xref='U_NISTu5'>
291
+ <mi mathvariant='normal'>&#xB0;K</mi>
292
+ </mrow>
293
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_NISTu5' dimensionURL='#NISTd5'>
294
+ <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
295
+ <UnitName xml:lang='en'>kelvin</UnitName>
296
+ <UnitSymbol type='HTML'>K</UnitSymbol>
297
+ <UnitSymbol type='MathML'>
298
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
299
+ <mrow>
300
+ <mi mathvariant='normal'>K</mi>
301
+ </mrow>
302
+ </math>
303
+ </UnitSymbol>
304
+ </Unit>
305
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd5'>
306
+ <ThermodynamicTemperature symbol='Theta' powerNumerator='1'/>
307
+ </Dimension>
308
+ <Quantity xmlns='http://unitsml.nist.gov/2005' xml:id='NISTq5' dimensionURL='#NISTd5' quantityType='base'>
309
+ <QuantityName xml:lang='en-US'>thermodynamic temperature</QuantityName>
310
+ </Quantity>
311
+ <mo>+</mo>
312
+ <mn>10</mn>
313
+ <mo rspace='thickmathspace'>&#x2062;</mo>
314
+ <mrow xref='U_NISTu5'>
315
+ <mi mathvariant='normal'>K</mi>
316
+ </mrow>
317
+ </math>
231
318
  OUTPUT
232
319
  end
233
- =end
320
+
321
+ it "deals with prefixed units" do
322
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
323
+ 9 "unitsml(mbar)"
324
+ INPUT
325
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
326
+ <mn>9</mn>
327
+ <mo rspace='thickmathspace'>&#x2062;</mo>
328
+ <mrow xref='U_NISTu362'>
329
+ <mi mathvariant='normal'>mbar</mi>
330
+ </mrow>
331
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_NISTu362'>
332
+ <UnitSystem name='not_SI' type='not_SI' xml:lang='en-US'/>
333
+ <UnitName xml:lang='en'>millibar</UnitName>
334
+ <UnitSymbol type='HTML'>mbar</UnitSymbol>
335
+ <UnitSymbol type='MathML'>
336
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
337
+ <mrow>
338
+ <mi mathvariant='normal'>mbar</mi>
339
+ </mrow>
340
+ </math>
341
+ </UnitSymbol>
342
+ <RootUnits>
343
+ <EnumeratedRootUnit unit='bar' prefix='m'/>
344
+ </RootUnits>
345
+ </Unit>
346
+ <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='-3' xml:id='NISTp10_-3'>
347
+ <PrefixName xml:lang='en'>milli</PrefixName>
348
+ <PrefixSymbol type='ASCII'>m</PrefixSymbol>
349
+ <PrefixSymbol type='unicode'>m</PrefixSymbol>
350
+ <PrefixSymbol type='LaTeX'>m</PrefixSymbol>
351
+ <PrefixSymbol type='HTML'>m</PrefixSymbol>
352
+ </Prefix>
353
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd14'>
354
+ <Length symbol='L' powerNumerator='-1'/>
355
+ <Mass symbol='M' powerNumerator='1'/>
356
+ <Time symbol='T' powerNumerator='-2'/>
357
+ </Dimension>
358
+ </math>
359
+ OUTPUT
360
+ end
361
+
234
362
 
235
363
  it "deals with units division" do
236
364
  expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
237
- 9 "unitsml(C^3*A)" + 13 "unitsml(A/C^-3)"
365
+ 9 "unitsml(A*C^3)" + 13 "unitsml(A/C^-3)"
238
366
  INPUT
239
367
  <math xmlns='http://www.w3.org/1998/Math/MathML'>
240
368
  <mn>9</mn>
241
369
  <mo rspace='thickmathspace'>&#x2062;</mo>
242
- <mrow xref='U_C3.A'>
370
+ <mrow xref='U_A.C3'>
371
+ <mi mathvariant='normal'>A</mi>
372
+ <mo>&#xB7;</mo>
243
373
  <msup>
244
374
  <mrow>
245
375
  <mi mathvariant='normal'>C</mi>
@@ -248,20 +378,19 @@ INPUT
248
378
  <mn>3</mn>
249
379
  </mrow>
250
380
  </msup>
251
- <mo>&#xB7;</mo>
252
- <mi mathvariant='normal'>A</mi>
253
381
  </mrow>
254
- <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_C3.A' dimensionURL='#D_T3I4'>
382
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_A.C3' dimensionURL='#D_M3I4'>
255
383
  <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
256
- <UnitName xml:lang='en'>C^3*A</UnitName>
384
+ <UnitName xml:lang='en'>A*C^3</UnitName>
257
385
  <UnitSymbol type='HTML'>
258
- C
386
+ A&#xB7;C
259
387
  <sup>3</sup>
260
- &#xB7;A
261
388
  </UnitSymbol>
262
389
  <UnitSymbol type='MathML'>
263
390
  <math xmlns='http://www.w3.org/1998/Math/MathML'>
264
391
  <mrow>
392
+ <mi mathvariant='normal'>A</mi>
393
+ <mo>&#xB7;</mo>
265
394
  <msup>
266
395
  <mrow>
267
396
  <mi mathvariant='normal'>C</mi>
@@ -270,18 +399,16 @@ INPUT
270
399
  <mn>3</mn>
271
400
  </mrow>
272
401
  </msup>
273
- <mo>&#xB7;</mo>
274
- <mi mathvariant='normal'>A</mi>
275
402
  </mrow>
276
403
  </math>
277
404
  </UnitSymbol>
278
405
  <RootUnits>
279
- <EnumeratedRootUnit unit='coulomb' powerNumerator='3'/>
280
406
  <EnumeratedRootUnit unit='ampere'/>
407
+ <EnumeratedRootUnit unit='coulomb' powerNumerator='3'/>
281
408
  </RootUnits>
282
409
  </Unit>
283
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_T3I4'>
284
- <Time symbol='T' powerNumerator='3'/>
410
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_M3I4'>
411
+ <Mass symbol='M' powerNumerator='3'/>
285
412
  <ElectricCurrent symbol='I' powerNumerator='4'/>
286
413
  </Dimension>
287
414
  <mo>+</mo>
@@ -300,39 +427,6 @@ INPUT
300
427
  </mrow>
301
428
  </msup>
302
429
  </mrow>
303
- <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_A/C-3' dimensionURL='#D_T3I4'>
304
- <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
305
- <UnitName xml:lang='en'>A*C^3</UnitName>
306
- <UnitSymbol type='HTML'>
307
- A/C
308
- <sup>&#x2212;3</sup>
309
- </UnitSymbol>
310
- <UnitSymbol type='MathML'>
311
- <math xmlns='http://www.w3.org/1998/Math/MathML'>
312
- <mrow>
313
- <mi mathvariant='normal'>A</mi>
314
- <mo>/</mo>
315
- <msup>
316
- <mrow>
317
- <mi mathvariant='normal'>C</mi>
318
- </mrow>
319
- <mrow>
320
- <mo>&#x2212;</mo>
321
- <mn>3</mn>
322
- </mrow>
323
- </msup>
324
- </mrow>
325
- </math>
326
- </UnitSymbol>
327
- <RootUnits>
328
- <EnumeratedRootUnit unit='ampere'/>
329
- <EnumeratedRootUnit unit='coulomb' powerNumerator='3'/>
330
- </RootUnits>
331
- </Unit>
332
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_T3I4'>
333
- <Time symbol='T' powerNumerator='3'/>
334
- <ElectricCurrent symbol='I' powerNumerator='4'/>
335
- </Dimension>
336
430
  </math>
337
431
  OUTPUT
338
432
  end
@@ -389,10 +483,16 @@ OUTPUT
389
483
  </mrow>
390
484
  </math>
391
485
  </UnitSymbol>
486
+ <RootUnits>
487
+ <EnumeratedRootUnit unit='gram' prefix='k' powerNumerator='-2'/>
488
+ </RootUnits>
392
489
  </Unit>
393
490
  <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='3' xml:id='NISTp10_3'>
394
491
  <PrefixName xml:lang='en'>kilo</PrefixName>
395
492
  <PrefixSymbol type='ASCII'>k</PrefixSymbol>
493
+ <PrefixSymbol type='unicode'>k</PrefixSymbol>
494
+ <PrefixSymbol type='LaTeX'>k</PrefixSymbol>
495
+ <PrefixSymbol type='HTML'>k</PrefixSymbol>
396
496
  </Prefix>
397
497
  <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_M-2'>
398
498
  <Mass symbol='M' powerNumerator='-2'/>
@@ -429,7 +529,7 @@ OUTPUT
429
529
  </mrow>
430
530
  </msup>
431
531
  </mrow>
432
- <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg.s-2' dimensionURL='#D_MT-2'>
532
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg.s-2' dimensionURL='#NISTd37'>
433
533
  <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
434
534
  <UnitName xml:lang='en'>kg*s^-2</UnitName>
435
535
  <UnitSymbol type='HTML'>
@@ -461,8 +561,11 @@ OUTPUT
461
561
  <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='3' xml:id='NISTp10_3'>
462
562
  <PrefixName xml:lang='en'>kilo</PrefixName>
463
563
  <PrefixSymbol type='ASCII'>k</PrefixSymbol>
564
+ <PrefixSymbol type='unicode'>k</PrefixSymbol>
565
+ <PrefixSymbol type='LaTeX'>k</PrefixSymbol>
566
+ <PrefixSymbol type='HTML'>k</PrefixSymbol>
464
567
  </Prefix>
465
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_MT-2'>
568
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd37'>
466
569
  <Mass symbol='M' powerNumerator='1'/>
467
570
  <Time symbol='T' powerNumerator='-2'/>
468
571
  </Dimension>
@@ -487,7 +590,7 @@ OUTPUT
487
590
  </mrow>
488
591
  </msup>
489
592
  </mrow>
490
- <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg.s-2' dimensionURL='#D_MT-2'>
593
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg.s-2' dimensionURL='#NISTd37'>
491
594
  <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
492
595
  <UnitName xml:lang='en'>kg*s^-2</UnitName>
493
596
  <UnitSymbol type='HTML'>
@@ -519,8 +622,11 @@ OUTPUT
519
622
  <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='3' xml:id='NISTp10_3'>
520
623
  <PrefixName xml:lang='en'>kilo</PrefixName>
521
624
  <PrefixSymbol type='ASCII'>k</PrefixSymbol>
625
+ <PrefixSymbol type='unicode'>k</PrefixSymbol>
626
+ <PrefixSymbol type='LaTeX'>k</PrefixSymbol>
627
+ <PrefixSymbol type='HTML'>k</PrefixSymbol>
522
628
  </Prefix>
523
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_MT-2'>
629
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd37'>
524
630
  <Mass symbol='M' powerNumerator='1'/>
525
631
  <Time symbol='T' powerNumerator='-2'/>
526
632
  </Dimension>
@@ -545,7 +651,7 @@ OUTPUT
545
651
  </mrow>
546
652
  </msup>
547
653
  </mrow>
548
- <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg.s-2' dimensionURL='#D_MT-2'>
654
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_kg.s-2' dimensionURL='#NISTd37'>
549
655
  <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
550
656
  <UnitName xml:lang='en'>kg*s^-2</UnitName>
551
657
  <UnitSymbol type='HTML'>
@@ -577,12 +683,125 @@ OUTPUT
577
683
  <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='3' xml:id='NISTp10_3'>
578
684
  <PrefixName xml:lang='en'>kilo</PrefixName>
579
685
  <PrefixSymbol type='ASCII'>k</PrefixSymbol>
686
+ <PrefixSymbol type='unicode'>k</PrefixSymbol>
687
+ <PrefixSymbol type='LaTeX'>k</PrefixSymbol>
688
+ <PrefixSymbol type='HTML'>k</PrefixSymbol>
580
689
  </Prefix>
581
- <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='D_MT-2'>
690
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd37'>
582
691
  <Mass symbol='M' powerNumerator='1'/>
583
692
  <Time symbol='T' powerNumerator='-2'/>
584
693
  </Dimension>
585
694
  </math>
586
695
  OUTPUT
587
696
  end
697
+
698
+ it "deals with quantity input" do
699
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
700
+ 9 "unitsml(m, quantity: NISTq103)"
701
+ INPUT
702
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
703
+ <mn>9</mn>
704
+ <mo rspace='thickmathspace'>&#x2062;</mo>
705
+ <mrow xref='U_NISTu1'>
706
+ <mi mathvariant='normal'>m</mi>
707
+ </mrow>
708
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_NISTu1' dimensionURL='#NISTd1'>
709
+ <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
710
+ <UnitName xml:lang='en'>meter</UnitName>
711
+ <UnitSymbol type='HTML'>m</UnitSymbol>
712
+ <UnitSymbol type='MathML'>
713
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
714
+ <mrow>
715
+ <mi mathvariant='normal'>m</mi>
716
+ </mrow>
717
+ </math>
718
+ </UnitSymbol>
719
+ </Unit>
720
+ <Dimension xmlns='http://unitsml.nist.gov/2005' xml:id='NISTd1'>
721
+ <Length symbol='L' powerNumerator='1'/>
722
+ </Dimension>
723
+ <Quantity xmlns='http://unitsml.nist.gov/2005' xml:id='NISTq103' dimensionURL='#NISTd1' quantityType='base'>
724
+ <QuantityName xml:lang='en-US'>position vector</QuantityName>
725
+ </Quantity>
726
+ </math>
727
+ OUTPUT
728
+ end
729
+
730
+ it "deals with name input" do
731
+ expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
732
+ 9 "unitsml(cal_th/cm^2, name: langley)"
733
+ INPUT
734
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
735
+ <mn>9</mn>
736
+ <mo rspace='thickmathspace'>&#x2062;</mo>
737
+ <mrow xref='U_cal_th/cm2'>
738
+ <msub>
739
+ <mrow>
740
+ <mi mathvariant='normal'>cal</mi>
741
+ </mrow>
742
+ <mrow>
743
+ <mi mathvariant='normal'>th</mi>
744
+ </mrow>
745
+ </msub>
746
+ <mo>/</mo>
747
+ <msup>
748
+ <mrow>
749
+ <mi mathvariant='normal'>cm</mi>
750
+ </mrow>
751
+ <mrow>
752
+ <mn>2</mn>
753
+ </mrow>
754
+ </msup>
755
+ </mrow>
756
+ <Unit xmlns='http://unitsml.nist.gov/2005' xml:id='U_cal_th.cm-2'>
757
+ <UnitSystem name='not_SI' type='not_SI' xml:lang='en-US'/>
758
+ <UnitSystem name='SI' type='SI_derived' xml:lang='en-US'/>
759
+ <UnitName xml:lang='en'>langley</UnitName>
760
+ <UnitSymbol type='HTML'>
761
+ cal
762
+ <sub>th</sub>
763
+ &#xB7;cm
764
+ <sup>&#x2212;2</sup>
765
+ </UnitSymbol>
766
+ <UnitSymbol type='MathML'>
767
+ <math xmlns='http://www.w3.org/1998/Math/MathML'>
768
+ <mrow>
769
+ <msub>
770
+ <mrow>
771
+ <mi mathvariant='normal'>cal</mi>
772
+ </mrow>
773
+ <mrow>
774
+ <mi mathvariant='normal'>th</mi>
775
+ </mrow>
776
+ </msub>
777
+ <mo>&#xB7;</mo>
778
+ <msup>
779
+ <mrow>
780
+ <mi mathvariant='normal'>cm</mi>
781
+ </mrow>
782
+ <mrow>
783
+ <mo>&#x2212;</mo>
784
+ <mn>2</mn>
785
+ </mrow>
786
+ </msup>
787
+ </mrow>
788
+ </math>
789
+ </UnitSymbol>
790
+ <RootUnits>
791
+ <EnumeratedRootUnit unit='thermochemical calorie'/>
792
+ <EnumeratedRootUnit unit='meter' prefix='c' powerNumerator='-2'/>
793
+ </RootUnits>
794
+ </Unit>
795
+ <Prefix xmlns='http://unitsml.nist.gov/2005' prefixBase='10' prefixPower='-2' xml:id='NISTp10_-2'>
796
+ <PrefixName xml:lang='en'>centi</PrefixName>
797
+ <PrefixSymbol type='ASCII'>c</PrefixSymbol>
798
+ <PrefixSymbol type='unicode'>c</PrefixSymbol>
799
+ <PrefixSymbol type='LaTeX'>c</PrefixSymbol>
800
+ <PrefixSymbol type='HTML'>c</PrefixSymbol>
801
+ </Prefix>
802
+ </math>
803
+ OUTPUT
804
+ end
805
+
806
+
588
807
  end