class Tins::Unit::UnitParser

Constants

NUMBER

Attributes

number[R]

Public Class Methods

new(source, unit, prefixes = nil) click to toggle source
Calls superclass method
# File lib/tins/unit.rb, line 62
def initialize(source, unit, prefixes = nil)
  super source
  if prefixes
    @unit_re    = unit_re(Tins::Unit.prefixes(prefixes), unit)
    @unit_lc_re = @unit_uc_re = nil
  else
    @unit_lc_re = unit_re(Tins::Unit.prefixes(:lc), unit)
    @unit_uc_re = unit_re(Tins::Unit.prefixes(:uc), unit)
    @unit_re    = nil
  end
  @number       = 1.0
end

Public Instance Methods

parse() click to toggle source
# File lib/tins/unit.rb, line 117
def parse
  raise NotImplementedError
end
scan(re) click to toggle source
Calls superclass method
# File lib/tins/unit.rb, line 89
def scan(re)
  re.nil? and return
  super
end
scan_char(char) click to toggle source
# File lib/tins/unit.rb, line 113
def scan_char(char)
  scan(/#{char}/) or return
end
scan_number() click to toggle source
# File lib/tins/unit.rb, line 94
def scan_number
  scan(NUMBER) or return
  @number *= BigDecimal(self[1])
end
scan_unit() click to toggle source
# File lib/tins/unit.rb, line 99
def scan_unit
  case
  when scan(@unit_re)
    prefix = @unit_re.prefixes.find { |pre| pre.name == self[1] } or return
    @number *= prefix.multiplier
  when scan(@unit_lc_re)
    prefix = @unit_lc_re.prefixes.find { |pre| pre.name == self[1] } or return
    @number *= prefix.multiplier
  when scan(@unit_uc_re)
    prefix = @unit_uc_re.prefixes.find { |pre| pre.name == self[1] } or return
    @number *= prefix.multiplier
  end
end

Private Instance Methods

unit_re(prefixes, unit) click to toggle source
# File lib/tins/unit.rb, line 75
def unit_re(prefixes, unit)
  re = Regexp.new(
    "(#{prefixes.reverse.map { |pre| Regexp.quote(pre.name) } * ?|})(#{unit})"
  )
  re.singleton_class.class_eval do
    define_method(:prefixes) { prefixes }
  end
  re
end