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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +8 -0
  3. data/.github/workflows/release.yml +7 -1
  4. data/.rubocop.yml +18 -0
  5. data/.rubocop_todo.yml +498 -0
  6. data/Gemfile +16 -11
  7. data/Rakefile +5 -3
  8. data/bin/console +4 -3
  9. data/docs/README.adoc +106 -4
  10. data/lib/unitsml/dimension.rb +49 -35
  11. data/lib/unitsml/errors/base_error.rb +8 -0
  12. data/lib/unitsml/errors/plurimath_load_error.rb +1 -1
  13. data/lib/unitsml/errors.rb +8 -0
  14. data/lib/unitsml/extender.rb +21 -16
  15. data/lib/unitsml/fenced.rb +97 -0
  16. data/lib/unitsml/fenced_numeric.rb +13 -0
  17. data/lib/unitsml/formula.rb +46 -33
  18. data/lib/unitsml/intermediate_exp_rules.rb +76 -0
  19. data/lib/unitsml/model/dimension.rb +4 -14
  20. data/lib/unitsml/model/dimension_quantities/quantity.rb +2 -0
  21. data/lib/unitsml/model/dimension_quantities.rb +17 -0
  22. data/lib/unitsml/model/prefix.rb +4 -8
  23. data/lib/unitsml/model/prefixes/name.rb +5 -4
  24. data/lib/unitsml/model/prefixes/symbol.rb +3 -2
  25. data/lib/unitsml/model/prefixes.rb +10 -0
  26. data/lib/unitsml/model/quantities/name.rb +4 -3
  27. data/lib/unitsml/model/quantities.rb +9 -0
  28. data/lib/unitsml/model/quantity.rb +5 -7
  29. data/lib/unitsml/model/unit.rb +4 -9
  30. data/lib/unitsml/model/units/enumerated_root_unit.rb +1 -0
  31. data/lib/unitsml/model/units/name.rb +4 -3
  32. data/lib/unitsml/model/units/root_units.rb +3 -2
  33. data/lib/unitsml/model/units/symbol.rb +2 -1
  34. data/lib/unitsml/model/units/system.rb +4 -3
  35. data/lib/unitsml/model/units.rb +13 -0
  36. data/lib/unitsml/model.rb +15 -0
  37. data/lib/unitsml/namespace.rb +8 -0
  38. data/lib/unitsml/number.rb +79 -0
  39. data/lib/unitsml/parse.rb +30 -38
  40. data/lib/unitsml/parser.rb +27 -13
  41. data/lib/unitsml/prefix.rb +17 -17
  42. data/lib/unitsml/sqrt.rb +3 -3
  43. data/lib/unitsml/transform.rb +143 -50
  44. data/lib/unitsml/unit.rb +67 -37
  45. data/lib/unitsml/unitsdb/dimension.rb +14 -20
  46. data/lib/unitsml/unitsdb/dimension_quantity.rb +2 -6
  47. data/lib/unitsml/unitsdb/dimensions.rb +3 -9
  48. data/lib/unitsml/unitsdb/prefix_reference.rb +23 -0
  49. data/lib/unitsml/unitsdb/prefixes.rb +17 -5
  50. data/lib/unitsml/unitsdb/quantities.rb +4 -4
  51. data/lib/unitsml/unitsdb/unit.rb +21 -0
  52. data/lib/unitsml/unitsdb/units.rb +19 -18
  53. data/lib/unitsml/unitsdb.rb +14 -5
  54. data/lib/unitsml/utility.rb +133 -103
  55. data/lib/unitsml/version.rb +3 -1
  56. data/lib/unitsml.rb +71 -35
  57. data/unitsdb/Gemfile +6 -0
  58. data/unitsdb/LICENSE.md +53 -0
  59. data/unitsdb/README.adoc +1253 -0
  60. data/unitsdb/RELEASE-NOTES.adoc +269 -0
  61. data/unitsdb/dimensions.yaml +1607 -602
  62. data/unitsdb/prefixes.yaml +842 -301
  63. data/unitsdb/quantities.yaml +3706 -2458
  64. data/unitsdb/scales.yaml +97 -0
  65. data/unitsdb/schemas/README.md +159 -0
  66. data/unitsdb/schemas/dimensions-schema.yaml +153 -0
  67. data/unitsdb/schemas/prefixes-schema.yaml +155 -0
  68. data/unitsdb/schemas/quantities-schema.yaml +117 -0
  69. data/unitsdb/schemas/scales-schema.yaml +106 -0
  70. data/unitsdb/schemas/unit_systems-schema.yaml +116 -0
  71. data/unitsdb/schemas/units-schema.yaml +215 -0
  72. data/unitsdb/spec/units_spec.rb +13 -10
  73. data/unitsdb/unit_systems.yaml +77 -15
  74. data/unitsdb/units.yaml +13517 -9974
  75. data/unitsdb/validate_schemas.rb +203 -0
  76. data/unitsml.gemspec +4 -1
  77. metadata +47 -7
  78. data/lib/unitsml/error.rb +0 -8
  79. data/unitsdb/docs/README.adoc +0 -12
  80. data/unitsdb/docs/navigation.adoc +0 -7
@@ -5,44 +5,50 @@ module Unitsml
5
5
  attr_accessor :text
6
6
 
7
7
  def initialize(text)
8
- @regexp = %r{(quantity|name|symbol|multiplier):\s*}
9
- @text = text&.match(/unitsml\((.*)\)/) ? Regexp.last_match[1] : 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 : Array(transformed)
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 = "0.5"
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
- exponent = inverse ? "-#{object&.power_numerator || '1'}" : object.power_numerator
43
- object.power_numerator = exponent&.sub(/^--+/, "")
44
- when Extender then inverse = !inverse if ["/", "//"].any?(object.symbol)
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(",")&.map(&:strip)
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
@@ -9,57 +9,57 @@ module Unitsml
9
9
  @only_instance = only_instance
10
10
  end
11
11
 
12
- def ==(object)
13
- self.class == object.class &&
14
- prefix_name == object&.prefix_name &&
15
- only_instance == object&.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
- @prefix ||= Unitsdb.prefixes.find_by_symbol_name(prefix_name)
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 prefixes_symbols
31
- prefix_instance.symbol
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
- prefixes_symbols.html
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
- prefixes_symbols.latex
46
+ prefix_symbols.latex
47
47
  end
48
48
 
49
49
  def to_asciimath(_)
50
- prefixes_symbols.ascii
50
+ prefix_symbols.ascii
51
51
  end
52
52
 
53
53
  def to_html(_)
54
- prefixes_symbols.html
54
+ prefix_symbols.html
55
55
  end
56
56
 
57
57
  def to_unicode(_)
58
- prefixes_symbols.unicode
58
+ prefix_symbols.unicode
59
59
  end
60
60
 
61
61
  def symbolid
62
- prefixes_symbols.ascii if prefixes_symbols
62
+ prefix_symbols&.ascii
63
63
  end
64
64
 
65
65
  def base
data/lib/unitsml/sqrt.rb CHANGED
@@ -8,9 +8,9 @@ module Unitsml
8
8
  @value = value
9
9
  end
10
10
 
11
- def ==(object)
12
- self.class == object.class &&
13
- value == object&.value
11
+ def ==(other)
12
+ self.class == other.class &&
13
+ value == other&.value
14
14
  end
15
15
 
16
16
  def to_asciimath(options)
@@ -1,111 +1,204 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "parslet"
3
+ require 'parslet'
4
4
  module Unitsml
5
5
  class Transform < Parslet::Transform
6
- rule(sqrt: simple(:sqrt)) { Sqrt.new(sqrt) }
7
- rule(units: simple(:unit)) { Unit.new(unit.to_s) }
8
- rule(prefixes: simple(:prefix)) { Prefix.new(prefix.to_s) }
9
- rule(dimensions: simple(:dimension)) { Dimension.new(dimension.to_s) }
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(units: simple(:unit),
12
- integer: simple(:integer)) do
13
- Unit.new(unit.to_s, integer.to_s)
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(dimensions: simple(:dimension),
17
- integer: simple(:integer)) do
18
- Dimension.new(dimension.to_s, integer.to_s)
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(prefixes: simple(:prefix),
22
- units: simple(:unit)) do
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(prefixes: simple(:prefix),
27
- units: simple(:unit),
28
- integer: simple(:integer)) do
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(prefixes: simple(:prefix),
34
- units: simple(:unit),
35
- integer: simple(:integer),
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
- sequence: simple(:sequence),) do
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
- unit_object,
77
+ first_set,
43
78
  Extender.new(extender.to_s),
44
- sequence,
45
- ],
79
+ second_set
80
+ ]
46
81
  )
47
82
  end
48
83
 
49
- rule(prefixes: simple(:prefix),
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
- Unit.new(unit.to_s, prefix: Prefix.new(prefix.to_s)),
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(units: simple(:unit),
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
- Unit.new(unit.to_s),
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(units: simple(:unit),
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, integer.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(dimensions: simple(:dimension),
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(dimensions: simple(:dimension),
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
- extender: simple(:extender),
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
- Dimension.new(dimension.to_s, integer.to_s),
106
- Extender.new(extender.to_s),
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 ==(object)
16
- self.class == object.class &&
17
- prefix == object&.prefix &&
18
- unit_name == object&.unit_name &&
19
- power_numerator == object&.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 unit_symbols
27
- unit_instance.unit_symbols.find { |symbol| symbol.id == unit_name }
28
+ def unknown_name?
29
+ unit_name == Utility::UNKNOWN
28
30
  end
29
31
 
30
- def numerator_value(mathml = true)
31
- integer = power_numerator.to_s
32
- unless integer.match?(/-/)
33
- return mathml ? { mn_value: [::Mml::Mn.from_xml("<mn>#{integer}</mn>")] } : integer
34
- end
35
-
36
- return integer.sub(/(-)(.+)/, '&#x2212;\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: "&#x2212;")
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 = ::Mml::Msup.new(
51
- mrow_value: [
52
- ::Mml::Mrow.new("#{tag_name}_value": Array(value)),
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&.unit_name&.first
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
- unit_instance.unit_system.type
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
- attr_accessor :vector,
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
- @vector ||= Utility::DIMS_VECTOR.map do |h|
70
- public_send(Utility.underscore(h))&.power_numerator
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 value.dim_symbols.nil? || value.dim_symbols.empty?
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
- dim_symbols.each { |dim_sym| hash[dim_sym.id] = dim_id }
7
+ symbols&.each { |dim_sym| hash[dim_sym.id] = dim_id }
12
8
  end
13
9
  end
14
10
  end