lib/asciimath2unitsml/conv.rb in asciimath2unitsml-0.1.1 vs lib/asciimath2unitsml/conv.rb in asciimath2unitsml-0.1.2
- old
+ new
@@ -30,29 +30,34 @@
else
{ html: HTMLEntities.new.encode(x), mathml: "<mo>#{HTMLEntities.new.encode(x)}</mo>" }
end
end
+ def units_only(units)
+ units.reject { |u| u[:multiplier] }
+ end
+
def unit_id(text)
"U_" +
(@units[text.to_sym] ? @units[text.to_sym][:id] : text.gsub(/\*/, ".").gsub(/\^/, ""))
end
- def unit(units, text, dims)
+ def unit(units, origtext, normtext, dims)
dimid = dim_id(dims)
<<~END
- <Unit xmlns='#{UNITSML_NS}' xml:id='#{unit_id(text)}'#{dimid ? " dimensionURL='##{dimid}'" : ""}>
+ <Unit xmlns='#{UNITSML_NS}' xml:id='#{unit_id(origtext)}'#{dimid ? " dimensionURL='##{dimid}'" : ""}>
#{unitsystem(units)}
- #{unitname(units, text)}
+ #{unitname(units, normtext)}
#{unitsymbol(units)}
#{rootunits(units)}
</Unit>
END
end
def unitsystem(units)
ret = []
+ units = units_only(units)
units.any? { |x| @units[x[:unit].to_sym][:si] != true } and
ret << "<UnitSystem name='not_SI' type='not_SI' xml:lang='en-US'/>"
if units.any? { |x| @units[x[:unit].to_sym][:si] == true }
base = units.size == 1 && @units[units[0][:unit].to_sym][:type].include?("si-base")
ret << "<UnitSystem name='SI' type='#{base ? "SI_base" : "SI_derived"}' xml:lang='en-US'/>"
@@ -77,25 +82,31 @@
END
end
def htmlsymbol(units)
units.map do |u|
- u[:exponent] and exp = "<sup>#{u[:exponent].sub(/-/, "−")}</sup>"
- "#{u[:prefix]}#{u[:unit]}#{exp}"
- end.join(@multiplier[:html])
+ if u[:multiplier] then u[:multiplier] == "*" ? @multiplier[:html] : u[:multiplier]
+ else
+ u[:display_exponent] and exp = "<sup>#{u[:display_exponent].sub(/-/, "−")}</sup>"
+ "#{u[:prefix]}#{u[:unit]}#{exp}"
+ end
+ end.join("")
end
def mathmlsymbol(units)
exp = units.map do |u|
- base = "<mi mathvariant='normal'>#{u[:prefix]}#{u[:unit]}</mi>"
- if u[:exponent]
- exp = "<mn>#{u[:exponent]}</mn>".sub(/<mn>-/, "<mo>−</mo><mn>")
- "<msup><mrow>#{base}</mrow><mrow>#{exp}</mrow></msup>"
+ if u[:multiplier] then u[:multiplier] == "*" ? @multiplier[:mathml] : "<mo>#{u[:multiplier]}</mo>"
else
- base
+ base = "<mi mathvariant='normal'>#{u[:prefix]}#{u[:unit]}</mi>"
+ if u[:display_exponent]
+ exp = "<mn>#{u[:display_exponent]}</mn>".sub(/<mn>-/, "<mo>−</mo><mn>")
+ "<msup><mrow>#{base}</mrow><mrow>#{exp}</mrow></msup>"
+ else
+ base
+ end
end
- end.join(@multiplier[:mathml])
+ end.join("")
end
def mathmlsymbolwrap(units)
<<~END
<math xmlns='#{MATHML_NS}'>
@@ -104,13 +115,13 @@
END
end
def rootunits(units)
return if units.size == 1
- exp = units.map do |u|
+ exp = units_only(units).map do |u|
prefix = " prefix='#{u[:prefix]}'" if u[:prefix]
- exponent = " powerNumerator='#{u[:exponent]}'" if u[:exponent]
+ exponent = " powerNumerator='#{u[:exponent]}'" if u[:exponent] && u[:exponent] != "1"
"<EnumeratedRootUnit unit='#{@units[u[:unit].to_sym][:name]}'#{prefix}#{exponent}/>"
end.join("\n")
<<~END
<RootUnits>#{exp}</RootUnits>
END
@@ -157,11 +168,11 @@
return nil if dims.nil? || dims.empty?
"D_" + dims.map { |d| U2D[d[:unit]][:symbol] + (d[:exponent] == 1 ? "" : d[:exponent].to_s) }.join("")
end
def normalise_units(units)
- gather_units(units.map { |u| normalise_unit(u) }.flatten)
+ gather_units(units_only(units).map { |u| normalise_unit(u) }.flatten)
end
def gather_units(units)
units.sort { |a, b| a[:unit] <=> b[:unit] }.each_with_object([]) do |k, m|
if m.empty? || m[-1][:unit] != k[:unit] then m << k
@@ -195,13 +206,13 @@
return p[:symbol] if p[:base] == p1[:base] && p[:power] == p1[:power] + p2[:power]
end
"unknown"
end
- def unitsml(units, text)
+ def unitsml(units, origtext, normtext)
dims = units2dimensions(units)
<<~END
- #{unit(units, text, dims)}
+ #{unit(units, origtext, normtext, dims)}
#{prefix(units)}
#{dimension(dims)}
END
end
end