asciimath2unitsml 0.1.3 → 0.2.0

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,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