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(/-/, "&#x2212;")}</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(/-/, "&#x2212;")}</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>&#x2212;</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>&#x2212;</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