64 lines
1.3 KiB
Ruby
64 lines
1.3 KiB
Ruby
|
module UnitConversion
|
||
|
class ParsedUnit
|
||
|
|
||
|
attr_reader :original_unit, :unit
|
||
|
|
||
|
def initialize(str)
|
||
|
@original_unit = str
|
||
|
@unit = normalize_unit_names(str)
|
||
|
end
|
||
|
|
||
|
def to_s
|
||
|
unit.gsub(/[a-z_\[\]]+/) do |match|
|
||
|
if aliases = UNIT_ALIASES[match.to_sym]
|
||
|
aliases.first
|
||
|
else
|
||
|
match
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def density?
|
||
|
compatible? 'g/ml'
|
||
|
end
|
||
|
|
||
|
def volume?
|
||
|
compatible? 'ml'
|
||
|
end
|
||
|
|
||
|
def mass?
|
||
|
compatible? 'g'
|
||
|
end
|
||
|
|
||
|
def metric?
|
||
|
METRIC_UNIT_ALIASES.keys.include? unit.to_sym
|
||
|
end
|
||
|
|
||
|
def unitwise(value = 1)
|
||
|
begin
|
||
|
Unitwise(value, unit)
|
||
|
rescue Unitwise::ExpressionError => err
|
||
|
raise UnknownUnitError, err.message
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def compatible?(unit_str)
|
||
|
begin
|
||
|
unitwise.compatible_with? Unitwise(1, unit_str)
|
||
|
rescue UnknownUnitError
|
||
|
false
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def normalize_unit_names(unit_description)
|
||
|
return unit_description.to_s if UNIT_ALIASES.include?(unit_description.to_sym)
|
||
|
|
||
|
# fluid ounce is the only known unit with a space; fix it up before the following replacement
|
||
|
unit_description = unit_description.gsub(/fl oz/i, 'floz')
|
||
|
|
||
|
unit_description.downcase.gsub(/[a-z_\[\]]+/) do |match|
|
||
|
UNIT_ALIAS_MAP[match] || match
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|