asciimath2unitsml 0.2.0 → 0.2.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ca1751cf852b77599154aa142ea719f0510210ddebb667ace7225cb94f7d598f
4
- data.tar.gz: 332e23b81a688d1386a4f084dc3db1f401e1e7634beb70c17466e18a23d1f51a
3
+ metadata.gz: 9c5ec436a8b058ce5c93dc246a8493d88a724c7d5f1048b8e42f7a1429791d3c
4
+ data.tar.gz: a7106b478a1efa4f48c0133c9b644d77197db0d71031d48152274c9c43dde1f6
5
5
  SHA512:
6
- metadata.gz: f300b5a9c8af814f4c61ff9be4407f45350fedfc76a7c9b3e4da90a793fcf5cf7004b24e5719a562cc2cb355bb8be355ee4d1e23909f6bbbd4060a97affcd7de
7
- data.tar.gz: abeedd889b14c45eeeb90a2f56fc5a09de04ca54f7b15f39677ad516fda17426dbd47977fdc71199ed77424639dd4c86a40164672dd81aad92fd512f872b1723
6
+ metadata.gz: e9fd0281fea82d844d833ae155875ab1b52d22cf384185a32330ed18709759aee6df93fb281e0b7844fe14bd79200211646d37b0152a0190a32b81d8d0176153
7
+ data.tar.gz: 8cee75e492900a7ac7e622134feb3c1f0e10503af231af87c7f55d01c88aaf9d817ed66f753249ac5fe5c355a1de9963f3e6b3ed21379996335c89efccc9d022
data/README.adoc CHANGED
@@ -1,3 +1,9 @@
1
+ image:https://img.shields.io/gem/v/asciimath2unitsml.svg["Gem Version", link="https://rubygems.org/gems/asciimath2unitsml"]
2
+ image:https://github.com/plurimath/asciimath2unitsml/workflows/rake/badge.svg["Build Status", link="https://github.com/plurimath/asciimath2unitsml/actions?workflow=rake"]
3
+ // image:https://codeclimate.com/github/plurimath/asciimath2unitsml/badges/gpa.svg["Code Climate", link="https://codeclimate.com/github/plurimath/asciimath2unitsml"]
4
+ image:https://img.shields.io/github/issues-pr-raw/plurimath/asciimath2unitsml.svg["Pull Requests", link="https://github.com/plurimath/asciimath2unitsml/pulls"]
5
+ image:https://img.shields.io/github/commits-since/plurimath/asciimath2unitsml/latest.svg["Commits since latest",link="https://github.com/plurimath/asciimath2unitsml/releases"]
6
+
1
7
  = asciimath2unitsml
2
8
  Convert Units expressions via MathML to UnitsML
3
9
 
@@ -43,6 +49,15 @@ https://github.com/unitsml/unitsdb/blob/master/units.yaml[]), that quantity is a
43
49
  otherwise, no quantity is added unless explicitly nominated in this way.
44
50
  * `unitsml(unit-string, name: NAME)` provides a name for the unit, if one is not already available
45
51
  from UnitsDB. For example, `unitsml(cal_th/cm^2, name: langley)`.
52
+ * `unitsml(unit-string, symbol: SYMBOL)` provides an alternate symbol for the unit, in AsciiMath.
53
+ The unit-string gives the canonical representation of the unit, but SYMBOL is what will be rendered.
54
+ For example, `unitsml(cal_th/cm^2, name: langley, symbol: La)`, or `unitsml(mm*s^-2, symbol: mm cdot s^-2)`.
55
+ (All variables in SYMBOL are rendered upright, as is the default for units.)
56
+ * `unitsml(unit-string, multiplier: SYMBOL)` provides an alternate symbol for the multiliper of
57
+ units. The options are an XML entity, or the values `space` or `nospace` (for which see discussion under _Usage_).
58
+
59
+ Standalone prefixes can be recognised by replacing the unit with hyphen; so `unitsml(p-)` corresponds
60
+ to the standalone prefix "pico" (and is rendered as "p").
46
61
 
47
62
  == Rendering
48
63
 
@@ -54,6 +69,9 @@ The gem follows the MathML Units convention of inserting a spacing invisible tim
54
69
  (`<mo rspace='thickmathspace'>&#x2062;</mo>`) between any numbers (`<mn>`) and unit expressions
55
70
  in MathML, and representing units in MathML as non-italic variables (`<mi mathvariant='normal'>`).
56
71
 
72
+ Space is not inserted between a number and a unit expression, when that unit expression wholly consists
73
+ of punctuation: _1 m_, _1 °C_, but _9° 7′ 22″_.
74
+
57
75
  == Example
58
76
 
59
77
  [source]
@@ -214,7 +232,7 @@ This table can be generated (in Asciidoc format) through `Asciimath2UnitsML::Con
214
232
  | ton | ton of TNT (energy equivalent): `ton_TNT` | ton of refrigeration (12 000 Btu_IT/h): `ton_refrigeration` | | | |
215
233
  | tsp | teaspoon: `tsp` | teaspoon (FDA): `tsp_label` | | | |
216
234
  | yd | yard: `yd` | yard (based on US survey foot): `yd_US_survey` | | | |
217
- | &#186; | degree (degree of arc): `deg` | | | | |
235
+ | &#176; | degree (degree of arc): `deg` | | | | |
218
236
  | &#947; | gamma: `gamma` | | | | |
219
237
  | &#956; | micron: `micron` | | | | |
220
238
  | &#8486; | ohm: `Ohm` | | | | |
@@ -242,3 +260,4 @@ This table can be generated (in Asciidoc format) through `Asciimath2UnitsML::Con
242
260
  | &#176;R | degree Rankine: `degR` | | | | |
243
261
  | &#x19b;~C~ | natural unit of length: `lambda-bar_C` | | | | |
244
262
  |===
263
+
@@ -35,6 +35,10 @@ module Asciimath2UnitsML
35
35
  @multiplier = multiplier(options[:multiplier] || "\u00b7")
36
36
  end
37
37
 
38
+ def float_to_display(f)
39
+ ret = f.to_f.round(1).to_s.sub(/\.0$/, "")
40
+ end
41
+
38
42
  def prefix(units)
39
43
  units.map { |u| u[:prefix] }.reject { |u| u.nil? }.uniq.map do |p|
40
44
  <<~END
@@ -44,7 +48,7 @@ module Asciimath2UnitsML
44
48
  <PrefixSymbol type="ASCII">#{@prefixes[p].ascii}</PrefixSymbol>
45
49
  <PrefixSymbol type="unicode">#{@prefixes[p].unicode}</PrefixSymbol>
46
50
  <PrefixSymbol type="LaTeX">#{@prefixes[p].latex}</PrefixSymbol>
47
- <PrefixSymbol type="HTML">#{HTMLEntities.new.encode(@prefixes[p].html, :basic)}</PrefixSymbol>
51
+ <PrefixSymbol type="HTML">#{htmlent @prefixes[p].html}</PrefixSymbol>
48
52
  </Prefix>
49
53
  END
50
54
  end.join("\n")
@@ -59,9 +63,22 @@ module Asciimath2UnitsML
59
63
  END
60
64
  end
61
65
 
66
+ U2D = {
67
+ "m" => { dimension: "Length", order: 1, symbol: "L" },
68
+ "g" => { dimension: "Mass", order: 2, symbol: "M" },
69
+ "kg" => { dimension: "Mass", order: 2, symbol: "M" },
70
+ "s" => { dimension: "Time", order: 3, symbol: "T" },
71
+ "A" => { dimension: "ElectricCurrent", order: 4, symbol: "I" },
72
+ "K" => { dimension: "ThermodynamicTemperature", order: 5, symbol: "Theta" },
73
+ "degK" => { dimension: "ThermodynamicTemperature", order: 5, symbol: "Theta" },
74
+ "mol" => { dimension: "AmountOfSubstance", order: 6, symbol: "N" },
75
+ "cd" => { dimension: "LuminousIntensity", order: 7, symbol: "J" },
76
+ "deg" => { dimension: "PlaneAngle", order: 8, symbol: "Phi" },
77
+ }.freeze
78
+
62
79
  def units2dimensions(units)
63
80
  norm = decompose_units(units)
64
- return if norm.any? { |u| u[:unit] == "unknown" || u[:prefix] == "unknown" }
81
+ return if norm.any? { |u| u[:unit] == "unknown" || u[:prefix] == "unknown" || u[:unit].nil? }
65
82
  norm.map do |u|
66
83
  { dimension: U2D[u[:unit]][:dimension],
67
84
  unit: u[:unit],
@@ -71,7 +88,7 @@ module Asciimath2UnitsML
71
88
  end
72
89
 
73
90
  def dimension1(u)
74
- %(<#{u[:dimension]} symbol="#{u[:symbol]}" powerNumerator="#{u[:exponent]}"/>)
91
+ %(<#{u[:dimension]} symbol="#{u[:symbol]}" powerNumerator="#{float_to_display(u[:exponent])}"/>)
75
92
  end
76
93
 
77
94
  def dim_id(dims)
@@ -81,7 +98,9 @@ module Asciimath2UnitsML
81
98
  AmountOfSubstance LuminousIntensity PlaneAngle)
82
99
  .map { |h| dimhash.dig(h, :exponent) }.join(":")
83
100
  id = @dimensions_id&.values&.select { |d| d.vector == dimsvector }&.first&.id and return id.to_s
84
- "D_" + dims.map { |d| U2D[d[:unit]][:symbol] + (d[:exponent] == 1 ? "" : d[:exponent].to_s) }.join("")
101
+ "D_" + dims.map do |d|
102
+ U2D[d[:unit]][:symbol] + (d[:exponent] == 1 ? "" : float_to_display(d[:exponent]))
103
+ end.join("")
85
104
  end
86
105
 
87
106
  def decompose_units(units)
@@ -94,7 +113,7 @@ module Asciimath2UnitsML
94
113
  else
95
114
  m[-1] = { prefix: combine_prefixes(@prefixes[m[-1][:prefix]], @prefixes[k[:prefix]]),
96
115
  unit: m[-1][:unit],
97
- exponent: (k[:exponent]&.to_i || 1) + (m[-1][:exponent]&.to_i || 1) }
116
+ exponent: (k[:exponent]&.to_f || 1) + (m[-1][:exponent]&.to_f || 1) }
98
117
  end
99
118
  end
100
119
  end
@@ -102,7 +121,8 @@ module Asciimath2UnitsML
102
121
  # treat g not kg as base unit: we have stripped the prefix k in parsing
103
122
  # reduce units down to basic units
104
123
  def decompose_unit(u)
105
- if u[:unit] == "g" then u
124
+ if u[:unit].nil? then u
125
+ elsif u[:unit] == "g" then u
106
126
  elsif @units[u[:unit]].system_type == "SI_base" then u
107
127
  elsif !@units[u[:unit]].si_derived_bases
108
128
  { prefix: u[:prefix], unit: "unknown", exponent: u[:exponent] }
@@ -111,7 +131,7 @@ module Asciimath2UnitsML
111
131
  m << { prefix: !k[:prefix].nil? && !k[:prefix].empty? ?
112
132
  combine_prefixes(@prefixes_id[k[:prefix]], @prefixes[u[:prefix]]) : u[:prefix],
113
133
  unit: @units_id[k[:id]].symbolid,
114
- exponent: (k[:power]&.to_i || 1) * (u[:exponent]&.to_i || 1) }
134
+ exponent: (k[:power]&.to_i || 1) * (u[:exponent]&.to_f || 1) }
115
135
  end
116
136
  end
117
137
  end
@@ -121,7 +141,7 @@ module Asciimath2UnitsML
121
141
  return p1.symbolid if p2.nil?
122
142
  return p2.symbolid if p1.nil?
123
143
  return "unknown" if p1.base != p2.base
124
- @prefixes.each do |p|
144
+ @prefixes.each do |_, p|
125
145
  return p.symbolid if p.base == p1.base && p.power == p1.power + p2.power
126
146
  end
127
147
  "unknown"
@@ -87,19 +87,24 @@ module Asciimath2UnitsML
87
87
  prefix2 = /#{@prefixes.keys.select { |x| x.size == 2 }.join("|")}/.r
88
88
  prefix1 = /#{@prefixes.keys.select { |x| x.size == 1 }.join("|")}/.r
89
89
  unit_keys = @units.keys.reject do |k|
90
- @units[k].root&.any? { |x| x[:prefix] } || /\*|\^|\/|^1$/.match(k) || @units[k].prefixed
90
+ /\*|\^|\/|^1$/.match(k) || @units[k].prefixed
91
91
  end.map { |k| Regexp.escape(k) }
92
92
  unit1 = /#{unit_keys.sort_by(&:length).reverse.join("|")}/.r
93
93
  exponent = /\^\(-?\d+\)/.r.map { |m| m.sub(/\^/, "").gsub(/[()]/, "") } |
94
94
  /\^-?\d+/.r.map { |m| m.sub(/\^/, "") }
95
95
  multiplier = %r{\*|//|/}.r.map { |x| { multiplier: x[0] } }
96
96
  unit =
97
+ seq("sqrt(", unit1, ")") { |x| { prefix: nil, unit: x[1], display_exponent: "0.5" } } |
98
+ seq("sqrt(", prefix1, unit1, ")") { |x| { prefix: x[1], unit: x[2], display_exponent: "0.5" } } |
99
+ seq("sqrt(", prefix2, unit1, ")") { |x| { prefix: x[1], unit: x[2], display_exponent: "0.5" } } |
97
100
  seq(unit1, exponent._? & multiplier) { |x| { prefix: nil, unit: x[0], display_exponent: (x[1][0] )} } |
98
101
  seq(unit1, exponent._?).eof { |x| { prefix: nil, unit: x[0], display_exponent: (x[1][0] )} } |
99
102
  seq(prefix1, unit1, exponent._? ) { |x| { prefix: x[0], unit: x[1], display_exponent: (x[2][0] ) } } |
100
103
  seq(prefix2, unit1, exponent._? ) { |x| { prefix: x[0], unit: x[1], display_exponent: (x[2][0] ) } } |
101
- "1".r.map { |_| { prefix: nil, unit: "1", display_exponent: nil } }
102
- units = unit.join(multiplier)
104
+ "1".r.map { |_| { prefix: nil, unit: "1", display_exponent: nil } }
105
+ units = seq(prefix2, "-") { |x| [{ prefix: x[0], unit: nil, display_exponent: nil }] } |
106
+ seq(prefix1, "-") { |x| [{ prefix: x[0], unit: nil, display_exponent: nil }] } |
107
+ unit.join(multiplier)
103
108
  parser = units.eof
104
109
  end
105
110
 
@@ -117,11 +122,13 @@ module Asciimath2UnitsML
117
122
  units = postprocess1(units)
118
123
  quantity = text[1..-1]&.select { |x| /^quantity:/.match(x) }&.first&.sub(/^quantity:\s*/, "")
119
124
  name = text[1..-1]&.select { |x| /^name:/.match(x) }&.first&.sub(/^name:\s*/, "")
125
+ symbol = text[1..-1]&.select { |x| /^symbol:/.match(x) }&.first&.sub(/^symbol:\s*/, "")
126
+ multiplier = text[1..-1]&.select { |x| /^multiplier:/.match(x) }&.first&.sub(/^multiplier:\s*/, "")
120
127
  normtext = units_only(units).each.map do |u|
121
128
  exp = u[:exponent] && u[:exponent] != "1" ? "^#{u[:exponent]}" : ""
122
129
  "#{u[:prefix]}#{u[:unit]}#{exp}"
123
130
  end.join("*")
124
- [units, text[0], normtext, quantity, name]
131
+ [units, text[0], normtext, quantity, name, symbol, multiplier]
125
132
  end
126
133
 
127
134
  def postprocess1(units)
@@ -137,19 +144,6 @@ module Asciimath2UnitsML
137
144
  end
138
145
  end
139
146
 
140
- U2D = {
141
- "m" => { dimension: "Length", order: 1, symbol: "L" },
142
- "g" => { dimension: "Mass", order: 2, symbol: "M" },
143
- "kg" => { dimension: "Mass", order: 2, symbol: "M" },
144
- "s" => { dimension: "Time", order: 3, symbol: "T" },
145
- "A" => { dimension: "ElectricCurrent", order: 4, symbol: "I" },
146
- "K" => { dimension: "ThermodynamicTemperature", order: 5, symbol: "Theta" },
147
- "degK" => { dimension: "ThermodynamicTemperature", order: 5, symbol: "Theta" },
148
- "mol" => { dimension: "AmountOfSubstance", order: 6, symbol: "N" },
149
- "cd" => { dimension: "LuminousIntensity", order: 7, symbol: "J" },
150
- "deg" => { dimension: "PlaneAngle", order: 8, symbol: "Phi" },
151
- }
152
-
153
147
  def Asciimath2UnitsML(expression)
154
148
  xml = Nokogiri::XML(asciimath2mathml(expression))
155
149
  MathML2UnitsML(xml).to_xml
@@ -161,14 +155,25 @@ module Asciimath2UnitsML
161
155
  xml.xpath(".//m:mtext", "m" => MATHML_NS).each do |x|
162
156
  next unless %r{^unitsml\(.+\)$}.match(x.text)
163
157
  text = x.text.sub(%r{^unitsml\((.+)\)$}m, "\\1")
164
- units, origtext, normtext, quantity, name = parse(text)
165
- delim = x&.previous_element&.name == "mn" ? "<mo rspace='thickmathspace'>&#x2062;</mo>" : ""
166
- x.replace("#{delim}<mrow xref='#{unit_id(origtext)}'>#{mathmlsymbol(units, false)}</mrow>\n"\
158
+ units, origtext, normtext, quantity, name, symbol, multiplier = parse(text)
159
+ rendering = symbol ? embeddedmathml(asciimath2mathml(symbol)) :
160
+ mathmlsymbol(units, false, multiplier)
161
+ x.replace("#{delimspace(rendering, x)}<mrow xref='#{unit_id(origtext)}'>#{rendering}</mrow>\n"\
167
162
  "#{unitsml(units, origtext, normtext, quantity, name)}")
168
163
  end
169
164
  dedup_ids(xml)
170
165
  end
171
166
 
167
+ # if previous sibling's last descendent non-whitespace is MathML and mn or mi, no space
168
+ def delimspace(rendering, elem)
169
+ prec_text_elem = elem.xpath("./preceding-sibling::*[namespace-uri() = '#{MATHML_NS}']/"\
170
+ "descendant::text()[normalize-space()!=''][last()]/parent::*").last
171
+ return "" if prec_text_elem.nil? || !%w(mn mi).include?(prec_text_elem&.name)
172
+ text = HTMLEntities.new.encode(Nokogiri::XML("<mrow>#{rendering}</mrow>").text.strip)
173
+ /\p{L}|\p{N}/.match(text) ?
174
+ "<mo rspace='thickmathspace'>&#x2062;</mo>" : "<mo>&#x2062;</mo>"
175
+ end
176
+
172
177
  def dedup_ids(xml)
173
178
  %w(Unit Dimension Prefix Quantity).each do |t|
174
179
  xml.xpath(".//m:#{t}/@xml:id", "m" => UNITSML_NS).map { |a| a.text }.uniq.each do |v|
@@ -187,6 +192,12 @@ module Asciimath2UnitsML
187
192
  gsub(/<math>/, "<math xmlns='#{MATHML_NS}'>")
188
193
  end
189
194
 
195
+ def embeddedmathml(mathml)
196
+ x = Nokogiri::XML(mathml)
197
+ x.xpath(".//m:mi", "m" => MATHML_NS).each { |mi| mi["mathvariant"] = "normal" }
198
+ x.children.to_xml
199
+ end
200
+
190
201
  def ambig_units
191
202
  u = @units_id.each_with_object({}) do |(k, v), m|
192
203
  v.symbolids.each do |x|
@@ -10,40 +10,71 @@ module Asciimath2UnitsML
10
10
  { html: HTMLEntities.new.encode(x), mathml: "<mo>#{HTMLEntities.new.encode(x)}</mo>" }
11
11
  end
12
12
  end
13
+
13
14
  def render(unit, style)
14
15
  @symbols[unit][style] || unit
15
16
  end
16
17
 
18
+ def htmlent(x)
19
+ HTMLEntities.new.decode(x).split(/([<>&])/)
20
+ .map { |c| /[<>'"]/.match(c) ? c : HTMLEntities.new.encode(c, :hexadecimal) }.join
21
+ end
22
+
17
23
  def htmlsymbol(units, normalise)
18
24
  units.map do |u|
19
25
  if u[:multiplier] then u[:multiplier] == "*" ? @multiplier[:html] : u[:multiplier]
26
+ elsif u[:unit].nil? && u[:prefix]
27
+ @prefixes[u[:prefix]].html
20
28
  else
21
- u[:display_exponent] and exp = "<sup>#{u[:display_exponent].sub(/-/, "&#x2212;")}</sup>"
22
- base = render(normalise ? @units[u[:unit]].symbolid : u[:unit], :html)
23
- "#{u[:prefix]}#{base}#{exp}"
29
+ base = (u[:prefix] || "") + render(normalise ? @units[u[:unit]].symbolid : u[:unit], :html)
30
+ htmlsymbol_exponent(u, base)
24
31
  end
25
32
  end.join("")
26
33
  end
27
34
 
28
- def mathmlsymbol(units, normalise)
35
+ def htmlsymbol_exponent(u, base)
36
+ if u[:display_exponent] == "0.5"
37
+ base = "&#x221a;#{base}"
38
+ elsif u[:display_exponent]
39
+ exp = "<sup>#{u[:display_exponent].sub(/-/, "&#x2212;")}</sup>"
40
+ base += exp
41
+ end
42
+ base
43
+ end
44
+
45
+ def mathmlsymbol(units, normalise, multiplier = nil)
46
+ multiplier = multiplier ? "<mo>#{multiplier}</mo>" : @multiplier[:mathml]
29
47
  exp = units.map do |u|
30
- if u[:multiplier] then u[:multiplier] == "*" ? @multiplier[:mathml] : "<mo>#{u[:multiplier]}</mo>"
48
+ if u[:multiplier] then u[:multiplier] == "*" ? multiplier : "<mo>#{u[:multiplier]}</mo>"
49
+ elsif u[:unit].nil? && u[:prefix]
50
+ %(<mi mathvariant='normal'>#{htmlent(@prefixes[u[:prefix]].html)}</mi>)
31
51
  else
32
- base = render(normalise ? @units[u[:unit]].symbolid : u[:unit], :mathml)
33
- if u[:prefix]
34
- base = base.match(/<mi mathvariant='normal'>/) ?
35
- base.sub(/<mi mathvariant='normal'>/, "<mi mathvariant='normal'>#{u[:prefix]}") :
36
- "<mrow><mi mathvariant='normal'>#{u[:prefix]}#{base}</mrow>"
37
- end
38
- if u[:display_exponent]
39
- exp = "<mn>#{u[:display_exponent]}</mn>".sub(/<mn>-/, "<mo>&#x2212;</mo><mn>")
40
- base = "<msup><mrow>#{base}</mrow><mrow>#{exp}</mrow></msup>"
41
- end
42
- base
52
+ mathmlsymbol1(u, normalise)
43
53
  end
44
54
  end.join("")
45
55
  end
46
56
 
57
+ def mathmlsymbol1(u, normalise)
58
+ base = render(normalise ? @units[u[:unit]].symbolid : u[:unit], :mathml)
59
+ if u[:prefix]
60
+ prefix = htmlent(@prefixes[u[:prefix]].html)
61
+ base = base.match(/<mi mathvariant='normal'>/) ?
62
+ base.sub(/<mi mathvariant='normal'>/, "<mi mathvariant='normal'>#{prefix}") :
63
+ "<mrow><mi mathvariant='normal'>#{prefix}#{base}</mrow>"
64
+ end
65
+ mathmlsymbol_exponent(u, base)
66
+ end
67
+
68
+ def mathmlsymbol_exponent(u, base)
69
+ if u[:display_exponent] == "0.5"
70
+ base = "<msqrt>#{base}</msqrt>"
71
+ elsif u[:display_exponent]
72
+ exp = "<mn>#{u[:display_exponent]}</mn>".sub(/<mn>-/, "<mo>&#x2212;</mo><mn>")
73
+ base = "<msup><mrow>#{base}</mrow><mrow>#{exp}</mrow></msup>"
74
+ end
75
+ base
76
+ end
77
+
47
78
  def mathmlsymbolwrap(units, normalise)
48
79
  <<~END
49
80
  <math xmlns='#{MATHML_NS}'><mrow>#{mathmlsymbol(units, normalise)}</mrow></math>
@@ -6,11 +6,12 @@ module Asciimath2UnitsML
6
6
 
7
7
  def unit_id(text)
8
8
  text = text.gsub(/[()]/, "")
9
- "U_" +
10
- (@units[text] ? @units[text].id : text.gsub(/\*/, ".").gsub(/\^/, ""))
9
+ /-$/.match(text) and return @prefixes[text.sub(/-$/, "")].id
10
+ "U_" + (@units[text] ? @units[text].id.gsub(/'/, "_") : text.gsub(/\*/, ".").gsub(/\^/, ""))
11
11
  end
12
12
 
13
13
  def unit(units, origtext, normtext, dims, name)
14
+ return if units_only(units).any? { |x| x[:unit].nil? }
14
15
  dimid = dim_id(dims)
15
16
  norm_units = normalise_units(units)
16
17
  <<~END
@@ -34,6 +35,7 @@ module Asciimath2UnitsML
34
35
 
35
36
  # kg exception
36
37
  def unitsystem(units)
38
+ return if units_only(units).any? { |x| x[:unit].nil? }
37
39
  ret = []
38
40
  units = units_only(units)
39
41
  units.any? { |x| @units[x[:unit]].system_name != "SI" } and
@@ -64,6 +66,7 @@ module Asciimath2UnitsML
64
66
  end
65
67
 
66
68
  def rootunits(units)
69
+ return if units_only(units).any? { |x| x[:unit].nil? }
67
70
  return if units.size == 1 && !units[0][:prefix]
68
71
  exp = units_only(units).map do |u|
69
72
  prefix = " prefix='#{u[:prefix]}'" if u[:prefix]
@@ -1,3 +1,3 @@
1
1
  module Asciimath2UnitsML
2
- VERSION = '0.2.0'.freeze
2
+ VERSION = '0.2.5'.freeze
3
3
  end
@@ -753,50 +753,50 @@ NISTd75:
753
753
  powerNumerator: 1
754
754
  symbol: I
755
755
 
756
- NISTd85:
757
- dimensionless: true
756
+ #NISTd85:
757
+ #dimensionless: true
758
758
 
759
- NISTd84:
760
- dimensionless: true
759
+ #NISTd84:
760
+ #dimensionless: true
761
761
 
762
- NISTd87:
763
- dimensionless: true
762
+ #NISTd87:
763
+ #dimensionless: true
764
764
 
765
- NISTd86:
766
- dimensionless: true
765
+ #NISTd86:
766
+ #dimensionless: true
767
767
 
768
- NISTd81:
769
- dimensionless: true
768
+ #NISTd81:
769
+ #dimensionless: true
770
770
 
771
771
  NISTd80:
772
- dimensionless: true
772
+ dimensionless: true
773
773
 
774
- NISTd83:
775
- dimensionless: true
774
+ #NISTd83:
775
+ #dimensionless: true
776
776
 
777
- NISTd82:
778
- dimensionless: true
777
+ #NISTd82:
778
+ #dimensionless: true
779
779
 
780
- NISTd95:
781
- dimensionless: true
780
+ #NISTd95:
781
+ #dimensionless: true
782
782
 
783
- NISTd94:
784
- dimensionless: true
783
+ #NISTd94:
784
+ #dimensionless: true
785
785
 
786
- NISTd89:
787
- dimensionless: true
786
+ #NISTd89:
787
+ #dimensionless: true
788
788
 
789
- NISTd88:
790
- dimensionless: true
789
+ #NISTd88:
790
+ #dimensionless: true
791
791
 
792
- NISTd91:
793
- dimensionless: true
792
+ #NISTd91:
793
+ #dimensionless: true
794
794
 
795
- NISTd90:
796
- dimensionless: true
795
+ #NISTd90:
796
+ #dimensionless: true
797
797
 
798
- NISTd92:
799
- dimensionless: true
798
+ #NISTd92:
799
+ #dimensionless: true
800
800
 
801
- NISTd93:
802
- dimensionless: true
801
+ #NISTd93:
802
+ #dimensionless: true