unitsml 0.4.7 → 0.6.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.
- checksums.yaml +4 -4
- data/.github/workflows/rake.yml +8 -0
- data/.github/workflows/release.yml +7 -1
- data/.rubocop.yml +18 -0
- data/.rubocop_todo.yml +498 -0
- data/Gemfile +16 -11
- data/Rakefile +5 -3
- data/bin/console +4 -3
- data/docs/README.adoc +106 -4
- data/lib/unitsml/dimension.rb +49 -35
- data/lib/unitsml/errors/base_error.rb +8 -0
- data/lib/unitsml/errors/plurimath_load_error.rb +1 -1
- data/lib/unitsml/errors.rb +8 -0
- data/lib/unitsml/extender.rb +21 -16
- data/lib/unitsml/fenced.rb +97 -0
- data/lib/unitsml/fenced_numeric.rb +13 -0
- data/lib/unitsml/formula.rb +46 -33
- data/lib/unitsml/intermediate_exp_rules.rb +76 -0
- data/lib/unitsml/model/dimension.rb +4 -14
- data/lib/unitsml/model/dimension_quantities/quantity.rb +2 -0
- data/lib/unitsml/model/dimension_quantities.rb +17 -0
- data/lib/unitsml/model/prefix.rb +4 -8
- data/lib/unitsml/model/prefixes/name.rb +5 -4
- data/lib/unitsml/model/prefixes/symbol.rb +3 -2
- data/lib/unitsml/model/prefixes.rb +10 -0
- data/lib/unitsml/model/quantities/name.rb +4 -3
- data/lib/unitsml/model/quantities.rb +9 -0
- data/lib/unitsml/model/quantity.rb +5 -7
- data/lib/unitsml/model/unit.rb +4 -9
- data/lib/unitsml/model/units/enumerated_root_unit.rb +1 -0
- data/lib/unitsml/model/units/name.rb +4 -3
- data/lib/unitsml/model/units/root_units.rb +3 -2
- data/lib/unitsml/model/units/symbol.rb +2 -1
- data/lib/unitsml/model/units/system.rb +4 -3
- data/lib/unitsml/model/units.rb +13 -0
- data/lib/unitsml/model.rb +15 -0
- data/lib/unitsml/namespace.rb +8 -0
- data/lib/unitsml/number.rb +79 -0
- data/lib/unitsml/parse.rb +30 -38
- data/lib/unitsml/parser.rb +27 -13
- data/lib/unitsml/prefix.rb +17 -17
- data/lib/unitsml/sqrt.rb +3 -3
- data/lib/unitsml/transform.rb +143 -50
- data/lib/unitsml/unit.rb +67 -37
- data/lib/unitsml/unitsdb/dimension.rb +14 -20
- data/lib/unitsml/unitsdb/dimension_quantity.rb +2 -6
- data/lib/unitsml/unitsdb/dimensions.rb +3 -9
- data/lib/unitsml/unitsdb/prefix_reference.rb +23 -0
- data/lib/unitsml/unitsdb/prefixes.rb +17 -5
- data/lib/unitsml/unitsdb/quantities.rb +4 -4
- data/lib/unitsml/unitsdb/unit.rb +21 -0
- data/lib/unitsml/unitsdb/units.rb +19 -18
- data/lib/unitsml/unitsdb.rb +14 -5
- data/lib/unitsml/utility.rb +133 -103
- data/lib/unitsml/version.rb +3 -1
- data/lib/unitsml.rb +71 -35
- data/unitsdb/Gemfile +6 -0
- data/unitsdb/LICENSE.md +53 -0
- data/unitsdb/README.adoc +1253 -0
- data/unitsdb/RELEASE-NOTES.adoc +269 -0
- data/unitsdb/dimensions.yaml +1607 -602
- data/unitsdb/prefixes.yaml +842 -301
- data/unitsdb/quantities.yaml +3706 -2458
- data/unitsdb/scales.yaml +97 -0
- data/unitsdb/schemas/README.md +159 -0
- data/unitsdb/schemas/dimensions-schema.yaml +153 -0
- data/unitsdb/schemas/prefixes-schema.yaml +155 -0
- data/unitsdb/schemas/quantities-schema.yaml +117 -0
- data/unitsdb/schemas/scales-schema.yaml +106 -0
- data/unitsdb/schemas/unit_systems-schema.yaml +116 -0
- data/unitsdb/schemas/units-schema.yaml +215 -0
- data/unitsdb/spec/units_spec.rb +13 -10
- data/unitsdb/unit_systems.yaml +77 -15
- data/unitsdb/units.yaml +13517 -9974
- data/unitsdb/validate_schemas.rb +203 -0
- data/unitsml.gemspec +4 -1
- metadata +47 -7
- data/lib/unitsml/error.rb +0 -8
- data/unitsdb/docs/README.adoc +0 -12
- data/unitsdb/docs/navigation.adoc +0 -7
data/lib/unitsml/parser.rb
CHANGED
|
@@ -5,44 +5,50 @@ module Unitsml
|
|
|
5
5
|
attr_accessor :text
|
|
6
6
|
|
|
7
7
|
def initialize(text)
|
|
8
|
-
@regexp =
|
|
9
|
-
@text = text
|
|
8
|
+
@regexp = /(quantity|name|symbol|multiplier):\s*/
|
|
9
|
+
@text = extract_equation(text)
|
|
10
10
|
@orig_text = @text
|
|
11
|
-
@text = @text.gsub(
|
|
11
|
+
@text = @text.gsub('−', '-')
|
|
12
12
|
post_extras
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def parse
|
|
16
16
|
nodes = Parse.new.parse(text)
|
|
17
17
|
transformed = Transform.new.apply(nodes)
|
|
18
|
-
formula_value = transformed.is_a?(Formula) ? transformed.value :
|
|
18
|
+
formula_value = transformed.is_a?(Formula) ? transformed.value : [transformed].flatten
|
|
19
19
|
formula = Formula.new(
|
|
20
20
|
formula_value,
|
|
21
21
|
explicit_value: @extras_hash,
|
|
22
22
|
root: true,
|
|
23
23
|
orig_text: @orig_text,
|
|
24
|
-
norm_text: text
|
|
24
|
+
norm_text: text
|
|
25
25
|
)
|
|
26
26
|
update_units_exponents(formula.value, false)
|
|
27
|
-
formula.value.first.only_instance = true if text.end_with?(
|
|
27
|
+
formula.value.first.only_instance = true if text.end_with?('-')
|
|
28
28
|
formula
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
def update_units_exponents(array, inverse)
|
|
31
|
+
def update_units_exponents(array, inverse, sqrt = false)
|
|
32
32
|
array.each do |object|
|
|
33
33
|
if object.is_a?(Sqrt)
|
|
34
34
|
object = object.value
|
|
35
|
-
object.power_numerator
|
|
35
|
+
if object.respond_to?(:power_numerator)
|
|
36
|
+
object.power_numerator = Number.new('0.5')
|
|
37
|
+
else
|
|
38
|
+
update_units_exponents([object], inverse, true)
|
|
39
|
+
end
|
|
36
40
|
end
|
|
37
41
|
|
|
38
42
|
case object
|
|
39
43
|
when Unit
|
|
44
|
+
next object.power_numerator = Number.new('0.5') if sqrt
|
|
40
45
|
next unless inverse
|
|
41
46
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
when Extender then inverse = !inverse if [
|
|
47
|
+
inverse ? object.inverse_power_numerator : object.power_numerator
|
|
48
|
+
when Dimension then object.power_numerator = Number.new('0.5') if sqrt
|
|
49
|
+
when Extender then inverse = !inverse if ['/', '//'].any?(object.symbol)
|
|
45
50
|
when Formula then update_units_exponents(object.value, inverse)
|
|
51
|
+
when Fenced then update_units_exponents([object.value], inverse, sqrt)
|
|
46
52
|
end
|
|
47
53
|
end
|
|
48
54
|
end
|
|
@@ -51,7 +57,7 @@ module Unitsml
|
|
|
51
57
|
return nil unless @regexp.match?(text)
|
|
52
58
|
|
|
53
59
|
@extras_hash = {}
|
|
54
|
-
texts_array = text&.split(
|
|
60
|
+
texts_array = text&.split(',')&.map(&:strip)
|
|
55
61
|
@text = texts_array&.shift
|
|
56
62
|
texts_array&.map { |text| parse_extras(text) }
|
|
57
63
|
end
|
|
@@ -59,8 +65,16 @@ module Unitsml
|
|
|
59
65
|
def parse_extras(text)
|
|
60
66
|
return nil unless @regexp.match?(text)
|
|
61
67
|
|
|
62
|
-
key, _, value = text&.partition(
|
|
68
|
+
key, _, value = text&.partition(':')
|
|
63
69
|
@extras_hash[key&.to_sym] ||= value&.strip
|
|
64
70
|
end
|
|
71
|
+
|
|
72
|
+
private
|
|
73
|
+
|
|
74
|
+
def extract_equation(text)
|
|
75
|
+
return text unless text&.start_with?('unitsml(')
|
|
76
|
+
|
|
77
|
+
text.delete_prefix('unitsml(').delete_suffix(')')
|
|
78
|
+
end
|
|
65
79
|
end
|
|
66
80
|
end
|
data/lib/unitsml/prefix.rb
CHANGED
|
@@ -9,57 +9,57 @@ module Unitsml
|
|
|
9
9
|
@only_instance = only_instance
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
def ==(
|
|
13
|
-
self.class ==
|
|
14
|
-
prefix_name ==
|
|
15
|
-
only_instance ==
|
|
12
|
+
def ==(other)
|
|
13
|
+
self.class == other.class &&
|
|
14
|
+
prefix_name == other&.prefix_name &&
|
|
15
|
+
only_instance == other&.only_instance
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def prefix_instance
|
|
19
|
-
@
|
|
19
|
+
@prefix_instance ||= Unitsdb.prefixes.find_by_symbol_name(prefix_name)
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
def id
|
|
23
|
-
@prefix.id
|
|
23
|
+
@id ||= prefix_instance.identifiers.find { |prefix| prefix.type == 'nist' }&.id
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def name
|
|
27
|
-
prefix_instance.name
|
|
27
|
+
@name ||= prefix_instance.names.find { |name| name.lang == 'en' }.value
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
-
def
|
|
31
|
-
prefix_instance.
|
|
30
|
+
def prefix_symbols
|
|
31
|
+
prefix_instance.symbols.last
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
def to_mathml(_)
|
|
35
35
|
symbol = Utility.string_to_html_entity(
|
|
36
36
|
Utility.html_entity_to_unicode(
|
|
37
|
-
|
|
38
|
-
)
|
|
37
|
+
prefix_symbols.html
|
|
38
|
+
)
|
|
39
39
|
)
|
|
40
40
|
return symbol unless only_instance
|
|
41
41
|
|
|
42
|
-
{ method_name: :mi, value: ::Mml::Mi.new(value: symbol)}
|
|
42
|
+
{ method_name: :mi, value: ::Mml::V4::Mi.new(value: symbol) }
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
def to_latex(_)
|
|
46
|
-
|
|
46
|
+
prefix_symbols.latex
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
def to_asciimath(_)
|
|
50
|
-
|
|
50
|
+
prefix_symbols.ascii
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
def to_html(_)
|
|
54
|
-
|
|
54
|
+
prefix_symbols.html
|
|
55
55
|
end
|
|
56
56
|
|
|
57
57
|
def to_unicode(_)
|
|
58
|
-
|
|
58
|
+
prefix_symbols.unicode
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
def symbolid
|
|
62
|
-
|
|
62
|
+
prefix_symbols&.ascii
|
|
63
63
|
end
|
|
64
64
|
|
|
65
65
|
def base
|
data/lib/unitsml/sqrt.rb
CHANGED
data/lib/unitsml/transform.rb
CHANGED
|
@@ -1,111 +1,204 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
3
|
+
require 'parslet'
|
|
4
4
|
module Unitsml
|
|
5
5
|
class Transform < Parslet::Transform
|
|
6
|
-
rule(sqrt: simple(:sqrt))
|
|
7
|
-
rule(
|
|
8
|
-
rule(
|
|
9
|
-
rule(
|
|
6
|
+
rule(sqrt: simple(:sqrt)) { Sqrt.new(sqrt) }
|
|
7
|
+
rule(unit: simple(:unit)) { Unit.new(unit.to_s) }
|
|
8
|
+
rule(dimension: simple(:dimension)) { Dimension.new(dimension.to_s) }
|
|
9
|
+
rule(prefix: simple(:prefix)) { Prefix.new(prefix.to_s) }
|
|
10
|
+
rule(integer: simple(:integer)) { Number.new(integer.to_s) }
|
|
11
|
+
rule(int_exp: simple(:int_exp)) { int_exp }
|
|
12
|
+
rule(implicit_extended: simple(:implicit_extended)) { implicit_extended }
|
|
10
13
|
|
|
11
|
-
rule(
|
|
12
|
-
|
|
13
|
-
|
|
14
|
+
rule(int_exp: simple(:int_exp),
|
|
15
|
+
sequence: simple(:sequence)) do
|
|
16
|
+
Formula.new([int_exp, sequence])
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
rule(first_int_exp_set: simple(:first_set),
|
|
20
|
+
second_set: simple(:second_set)) do
|
|
21
|
+
Formula.new([Utility.set_to_fence(first_set), second_set])
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
rule(first_int_exp_set: simple(:first_set),
|
|
25
|
+
second_int_exp_set: simple(:second_set)) do
|
|
26
|
+
Formula.new(
|
|
27
|
+
[Utility.set_to_fence(first_set), Utility.set_to_fence(second_set)]
|
|
28
|
+
)
|
|
14
29
|
end
|
|
15
30
|
|
|
16
|
-
rule(
|
|
17
|
-
|
|
18
|
-
|
|
31
|
+
rule(first_set: simple(:first_set),
|
|
32
|
+
second_set: simple(:second_set)) do
|
|
33
|
+
Formula.new(
|
|
34
|
+
[
|
|
35
|
+
first_set,
|
|
36
|
+
second_set
|
|
37
|
+
]
|
|
38
|
+
)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
rule(first_set: simple(:first_set),
|
|
42
|
+
second_int_exp_set: simple(:second_set)) do
|
|
43
|
+
Formula.new(
|
|
44
|
+
[
|
|
45
|
+
first_set,
|
|
46
|
+
Utility.set_to_fence(second_set)
|
|
47
|
+
]
|
|
48
|
+
)
|
|
19
49
|
end
|
|
20
50
|
|
|
21
|
-
rule(
|
|
22
|
-
|
|
51
|
+
rule(prefix: simple(:prefix),
|
|
52
|
+
unit: simple(:unit)) do
|
|
23
53
|
Unit.new(unit.to_s, prefix: Prefix.new(prefix.to_s))
|
|
24
54
|
end
|
|
25
55
|
|
|
26
|
-
rule(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
prefix_obj = Prefix.new(prefix.to_s)
|
|
30
|
-
Unit.new(unit.to_s, integer.to_s, prefix: prefix_obj)
|
|
56
|
+
rule(unit: simple(:unit),
|
|
57
|
+
power_numerator: simple(:power_numerator)) do
|
|
58
|
+
Unit.new(unit.to_s, power_numerator)
|
|
31
59
|
end
|
|
32
60
|
|
|
33
|
-
rule(
|
|
34
|
-
|
|
35
|
-
|
|
61
|
+
rule(dimension: simple(:dimension),
|
|
62
|
+
power_numerator: simple(:power_numerator)) do
|
|
63
|
+
Dimension.new(dimension.to_s, power_numerator)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
rule(prefix: simple(:prefix),
|
|
67
|
+
unit: simple(:unit),
|
|
68
|
+
power_numerator: simple(:power_numerator)) do
|
|
69
|
+
Unit.new(unit.to_s, power_numerator, prefix: Prefix.new(prefix.to_s))
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
rule(first_set: simple(:first_set),
|
|
36
73
|
extender: simple(:extender),
|
|
37
|
-
|
|
38
|
-
prefix_obj = Prefix.new(prefix.to_s)
|
|
39
|
-
unit_object = Unit.new(unit.to_s, integer.to_s, prefix: prefix_obj)
|
|
74
|
+
second_set: simple(:second_set)) do
|
|
40
75
|
Formula.new(
|
|
41
76
|
[
|
|
42
|
-
|
|
77
|
+
first_set,
|
|
43
78
|
Extender.new(extender.to_s),
|
|
44
|
-
|
|
45
|
-
]
|
|
79
|
+
second_set
|
|
80
|
+
]
|
|
46
81
|
)
|
|
47
82
|
end
|
|
48
83
|
|
|
49
|
-
rule(
|
|
50
|
-
units: simple(:unit),
|
|
84
|
+
rule(implicit_extended: simple(:implicit_extended),
|
|
51
85
|
extender: simple(:extender),
|
|
52
86
|
sequence: simple(:sequence)) do
|
|
53
87
|
Formula.new(
|
|
54
88
|
[
|
|
55
|
-
|
|
89
|
+
implicit_extended,
|
|
56
90
|
Extender.new(extender.to_s),
|
|
57
|
-
sequence
|
|
58
|
-
]
|
|
91
|
+
sequence
|
|
92
|
+
]
|
|
59
93
|
)
|
|
60
94
|
end
|
|
61
95
|
|
|
62
|
-
rule(
|
|
96
|
+
rule(int_exp: simple(:int_exp),
|
|
63
97
|
extender: simple(:extender),
|
|
64
98
|
sequence: simple(:sequence)) do
|
|
65
99
|
Formula.new(
|
|
66
100
|
[
|
|
67
|
-
|
|
101
|
+
int_exp,
|
|
68
102
|
Extender.new(extender.to_s),
|
|
69
|
-
sequence
|
|
70
|
-
]
|
|
103
|
+
sequence
|
|
104
|
+
]
|
|
71
105
|
)
|
|
72
106
|
end
|
|
73
107
|
|
|
74
|
-
rule(
|
|
75
|
-
integer: simple(:integer),
|
|
108
|
+
rule(unit: simple(:unit),
|
|
76
109
|
extender: simple(:extender),
|
|
77
110
|
sequence: simple(:sequence)) do
|
|
78
111
|
Formula.new(
|
|
79
112
|
[
|
|
80
|
-
Unit.new(unit.to_s
|
|
113
|
+
Unit.new(unit.to_s),
|
|
81
114
|
Extender.new(extender.to_s),
|
|
82
|
-
sequence
|
|
83
|
-
]
|
|
115
|
+
sequence
|
|
116
|
+
]
|
|
84
117
|
)
|
|
85
118
|
end
|
|
86
119
|
|
|
87
|
-
rule(
|
|
120
|
+
rule(dimension: simple(:dimension),
|
|
88
121
|
extender: simple(:extender),
|
|
89
122
|
sequence: simple(:sequence)) do
|
|
90
123
|
Formula.new(
|
|
91
124
|
[
|
|
92
125
|
Dimension.new(dimension.to_s),
|
|
93
126
|
Extender.new(extender.to_s),
|
|
94
|
-
sequence
|
|
95
|
-
]
|
|
127
|
+
sequence
|
|
128
|
+
]
|
|
96
129
|
)
|
|
97
130
|
end
|
|
98
131
|
|
|
99
|
-
rule(
|
|
132
|
+
rule(open_paren: simple(:open_paren),
|
|
133
|
+
int_exp: simple(:int_exp),
|
|
134
|
+
close_paren: simple(:close_paren)) do
|
|
135
|
+
Fenced.new(
|
|
136
|
+
open_paren.to_s,
|
|
137
|
+
int_exp,
|
|
138
|
+
close_paren.to_s
|
|
139
|
+
)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
rule(open_paren: simple(:open_paren),
|
|
100
143
|
integer: simple(:integer),
|
|
101
|
-
|
|
144
|
+
close_paren: simple(:close_paren)) do
|
|
145
|
+
Fenced.new(
|
|
146
|
+
open_paren.to_s,
|
|
147
|
+
Number.new(integer.to_s),
|
|
148
|
+
close_paren.to_s
|
|
149
|
+
)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
rule(unit: simple(:unit),
|
|
153
|
+
power_numerator: simple(:power_numerator),
|
|
154
|
+
extender: simple(:ext),
|
|
102
155
|
sequence: simple(:sequence)) do
|
|
103
156
|
Formula.new(
|
|
104
157
|
[
|
|
105
|
-
|
|
106
|
-
Extender.new(
|
|
107
|
-
sequence
|
|
108
|
-
]
|
|
158
|
+
Unit.new(unit.to_s, power_numerator),
|
|
159
|
+
Extender.new(ext.to_s),
|
|
160
|
+
sequence
|
|
161
|
+
]
|
|
162
|
+
)
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
rule(dimension: simple(:dimension),
|
|
166
|
+
power_numerator: simple(:power_numerator),
|
|
167
|
+
extender: simple(:ext),
|
|
168
|
+
sequence: simple(:sequence)) do
|
|
169
|
+
Formula.new(
|
|
170
|
+
[
|
|
171
|
+
Dimension.new(dimension.to_s, power_numerator),
|
|
172
|
+
Extender.new(ext.to_s),
|
|
173
|
+
sequence
|
|
174
|
+
]
|
|
175
|
+
)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
rule(prefix: simple(:prefix),
|
|
179
|
+
unit: simple(:unit),
|
|
180
|
+
extender: simple(:ext),
|
|
181
|
+
sequence: simple(:sequence)) do
|
|
182
|
+
Formula.new(
|
|
183
|
+
[
|
|
184
|
+
Unit.new(unit.to_s, prefix: Prefix.new(prefix.to_s)),
|
|
185
|
+
Extender.new(ext.to_s),
|
|
186
|
+
sequence
|
|
187
|
+
]
|
|
188
|
+
)
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
rule(prefix: simple(:prefix),
|
|
192
|
+
unit: simple(:unit),
|
|
193
|
+
power_numerator: simple(:power_numerator),
|
|
194
|
+
extender: simple(:ext),
|
|
195
|
+
sequence: simple(:sequence)) do
|
|
196
|
+
Formula.new(
|
|
197
|
+
[
|
|
198
|
+
Unit.new(unit.to_s, power_numerator, prefix: Prefix.new(prefix.to_s)),
|
|
199
|
+
Extender.new(ext.to_s),
|
|
200
|
+
sequence
|
|
201
|
+
]
|
|
109
202
|
)
|
|
110
203
|
end
|
|
111
204
|
end
|
data/lib/unitsml/unit.rb
CHANGED
|
@@ -4,6 +4,8 @@ module Unitsml
|
|
|
4
4
|
class Unit
|
|
5
5
|
attr_accessor :unit_name, :power_numerator, :prefix
|
|
6
6
|
|
|
7
|
+
SI_UNIT_SYSTEM = %w[si_base si_derived_special si_derived_non_special].freeze
|
|
8
|
+
|
|
7
9
|
def initialize(unit_name,
|
|
8
10
|
power_numerator = nil,
|
|
9
11
|
prefix: nil)
|
|
@@ -12,46 +14,34 @@ module Unitsml
|
|
|
12
14
|
@power_numerator = power_numerator
|
|
13
15
|
end
|
|
14
16
|
|
|
15
|
-
def ==(
|
|
16
|
-
self.class ==
|
|
17
|
-
prefix ==
|
|
18
|
-
unit_name ==
|
|
19
|
-
power_numerator ==
|
|
17
|
+
def ==(other)
|
|
18
|
+
self.class == other.class &&
|
|
19
|
+
prefix == other&.prefix &&
|
|
20
|
+
unit_name == other&.unit_name &&
|
|
21
|
+
power_numerator == other&.power_numerator
|
|
20
22
|
end
|
|
21
23
|
|
|
22
24
|
def unit_instance
|
|
23
25
|
Unitsdb.units.find_by_name(unit_name)
|
|
24
26
|
end
|
|
25
27
|
|
|
26
|
-
def
|
|
27
|
-
|
|
28
|
+
def unknown_name?
|
|
29
|
+
unit_name == Utility::UNKNOWN
|
|
28
30
|
end
|
|
29
31
|
|
|
30
|
-
def
|
|
31
|
-
|
|
32
|
-
unless integer.match?(/-/)
|
|
33
|
-
return mathml ? { mn_value: [::Mml::Mn.from_xml("<mn>#{integer}</mn>")] } : integer
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
return integer.sub(/(-)(.+)/, '−\2') unless mathml
|
|
37
|
-
|
|
38
|
-
integer = integer.sub(/(-)(.+)/, '<mn>\2</mn>')
|
|
39
|
-
integer = ::Mml::Mn.from_xml(integer)
|
|
40
|
-
mo_tag = ::Mml::Mo.new(value: "−")
|
|
41
|
-
{ mo_value: [mo_tag], mn_value: [integer] }
|
|
32
|
+
def unit_symbols
|
|
33
|
+
unit_instance.symbols.find { |symbol| symbol.id == unit_name }
|
|
42
34
|
end
|
|
43
35
|
|
|
44
36
|
def to_mathml(options)
|
|
45
37
|
value = unit_symbols&.mathml
|
|
46
38
|
tag_name = value.match(/^<(?<tag>\w+)/)[:tag]
|
|
47
|
-
value = ::Mml.const_get(tag_name.capitalize).from_xml(value)
|
|
39
|
+
value = ::Mml::V4.const_get(tag_name.capitalize).from_xml(value)
|
|
48
40
|
value.value = "#{prefix.to_mathml(options)}#{value.value}" if prefix
|
|
49
41
|
if power_numerator
|
|
50
|
-
value =
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
::Mml::Mrow.new(numerator_value),
|
|
54
|
-
]
|
|
42
|
+
value = msup_tag(
|
|
43
|
+
{ method_name: tag_name, value: value },
|
|
44
|
+
options
|
|
55
45
|
)
|
|
56
46
|
tag_name = :msup
|
|
57
47
|
end
|
|
@@ -60,36 +50,34 @@ module Unitsml
|
|
|
60
50
|
|
|
61
51
|
def to_latex(options)
|
|
62
52
|
value = unit_symbols&.latex
|
|
63
|
-
value = "#{value}^#{power_numerator}" if power_numerator
|
|
53
|
+
value = "#{value}^#{power_numerator.to_latex(options)}" if power_numerator
|
|
64
54
|
value = "#{prefix.to_latex(options)}#{value}" if prefix
|
|
65
55
|
value
|
|
66
56
|
end
|
|
67
57
|
|
|
68
58
|
def to_asciimath(options)
|
|
69
59
|
value = unit_symbols&.ascii
|
|
70
|
-
value = "#{value}^#{power_numerator}" if power_numerator
|
|
60
|
+
value = "#{value}^#{power_numerator.to_asciimath(options)}" if power_numerator
|
|
71
61
|
value = "#{prefix.to_asciimath(options)}#{value}" if prefix
|
|
72
62
|
value
|
|
73
63
|
end
|
|
74
64
|
|
|
75
65
|
def to_html(options)
|
|
76
66
|
value = unit_symbols&.html
|
|
77
|
-
if power_numerator
|
|
78
|
-
value = "#{value}<sup>#{numerator_value(false)}</sup>"
|
|
79
|
-
end
|
|
67
|
+
value = "#{value}<sup>#{power_numerator.to_html(options)}</sup>" if power_numerator
|
|
80
68
|
value = "#{prefix.to_html(options)}#{value}" if prefix
|
|
81
69
|
value
|
|
82
70
|
end
|
|
83
71
|
|
|
84
72
|
def to_unicode(options)
|
|
85
73
|
value = unit_symbols&.unicode
|
|
86
|
-
value = "#{value}^#{power_numerator}" if power_numerator
|
|
74
|
+
value = "#{value}^#{power_numerator.to_unicode(options)}" if power_numerator
|
|
87
75
|
value = "#{prefix.to_unicode(options)}#{value}" if prefix
|
|
88
76
|
value
|
|
89
77
|
end
|
|
90
78
|
|
|
91
79
|
def enumerated_name
|
|
92
|
-
unit_instance&.
|
|
80
|
+
unit_instance.names.find { |name| name.lang == 'en' }&.value
|
|
93
81
|
end
|
|
94
82
|
|
|
95
83
|
def prefix_name
|
|
@@ -97,15 +85,57 @@ module Unitsml
|
|
|
97
85
|
end
|
|
98
86
|
|
|
99
87
|
def system_type
|
|
100
|
-
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def system_name
|
|
104
|
-
unit_instance.unit_system.name
|
|
88
|
+
system_reference&.first&.id
|
|
105
89
|
end
|
|
106
90
|
|
|
107
91
|
def si_derived_bases
|
|
108
92
|
unit_instance.si_derived_bases
|
|
109
93
|
end
|
|
94
|
+
|
|
95
|
+
def xml_postprocess_name
|
|
96
|
+
"#{prefix_name}#{unit_name}#{display_exp}"
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def si_system_type?
|
|
100
|
+
SI_UNIT_SYSTEM.include?(downcase_system_type)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def downcase_system_type
|
|
104
|
+
Lutaml::Model::Utils.snake_case(system_type)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def inverse_power_numerator
|
|
108
|
+
if power_numerator
|
|
109
|
+
power_numerator.update_negative_sign
|
|
110
|
+
else
|
|
111
|
+
@power_numerator = Number.new('-1')
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
private
|
|
116
|
+
|
|
117
|
+
def display_exp
|
|
118
|
+
return unless power_numerator
|
|
119
|
+
|
|
120
|
+
exp = power_numerator.raw_value
|
|
121
|
+
"^#{exp}" if exp != '1'
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def system_reference
|
|
125
|
+
unit_instance.unit_system_reference
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def msup_tag(value, options)
|
|
129
|
+
msup = ::Mml::V4::Msup.new
|
|
130
|
+
msup.ordered = true
|
|
131
|
+
msup.element_order = []
|
|
132
|
+
[value, power_numerator.to_mathml(options)].flatten.each do |record|
|
|
133
|
+
values = msup.public_send("#{record[:method_name]}_value") || []
|
|
134
|
+
values += [record[:value]]
|
|
135
|
+
msup.element_order << Lutaml::Xml::Element.new('Element', record[:method_name].to_s)
|
|
136
|
+
msup.public_send("#{record[:method_name]}_value=", values)
|
|
137
|
+
end
|
|
138
|
+
msup
|
|
139
|
+
end
|
|
110
140
|
end
|
|
111
141
|
end
|
|
@@ -2,24 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
module Unitsml
|
|
4
4
|
module Unitsdb
|
|
5
|
-
class Dimension
|
|
6
|
-
|
|
7
|
-
:id,
|
|
8
|
-
:dimensionless
|
|
9
|
-
|
|
10
|
-
attr_reader :length,
|
|
11
|
-
:mass,
|
|
12
|
-
:time,
|
|
13
|
-
:electric_current,
|
|
14
|
-
:thermodynamic_temperature,
|
|
15
|
-
:amount_of_substance,
|
|
16
|
-
:luminous_intensity,
|
|
17
|
-
:plane_angle,
|
|
18
|
-
:parsables,
|
|
5
|
+
class Dimension < ::Unitsdb::Dimension
|
|
6
|
+
attr_reader :parsables,
|
|
19
7
|
:parsable,
|
|
20
|
-
:processed_keys
|
|
8
|
+
:processed_keys,
|
|
9
|
+
:vector
|
|
21
10
|
|
|
22
|
-
def initialize
|
|
11
|
+
def initialize(attrs)
|
|
12
|
+
super
|
|
23
13
|
@parsables = {}
|
|
24
14
|
@processed_keys = []
|
|
25
15
|
@parsable = false
|
|
@@ -66,9 +56,13 @@ module Unitsml
|
|
|
66
56
|
end
|
|
67
57
|
|
|
68
58
|
def set_vector
|
|
69
|
-
@
|
|
70
|
-
public_send(Utility.underscore(h))&.
|
|
71
|
-
end.join(
|
|
59
|
+
@set_vector ||= Utility::DIMS_VECTOR.map do |h|
|
|
60
|
+
public_send(Utility.underscore(h))&.power
|
|
61
|
+
end.join(':')
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def id
|
|
65
|
+
identifiers.find { |id| id.type == 'nist' }&.id
|
|
72
66
|
end
|
|
73
67
|
|
|
74
68
|
private
|
|
@@ -78,7 +72,7 @@ module Unitsml
|
|
|
78
72
|
|
|
79
73
|
instance_variable_set(:"@#{instance_var}", value)
|
|
80
74
|
@processed_keys << instance_var.to_s
|
|
81
|
-
return if
|
|
75
|
+
return if Lutaml::Model::Utils.empty?(value.symbols)
|
|
82
76
|
|
|
83
77
|
@parsable = true
|
|
84
78
|
value.dim_symbols_ids(@parsables, id)
|
|
@@ -2,13 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
module Unitsml
|
|
4
4
|
module Unitsdb
|
|
5
|
-
class DimensionQuantity
|
|
6
|
-
attr_accessor :power_numerator,
|
|
7
|
-
:symbol,
|
|
8
|
-
:dim_symbols
|
|
9
|
-
|
|
5
|
+
class DimensionQuantity < ::Unitsdb::DimensionDetails
|
|
10
6
|
def dim_symbols_ids(hash, dim_id)
|
|
11
|
-
|
|
7
|
+
symbols&.each { |dim_sym| hash[dim_sym.id] = dim_id }
|
|
12
8
|
end
|
|
13
9
|
end
|
|
14
10
|
end
|