class Tefil::Calculator

Public Class Methods

new(options = {}) click to toggle source
Calls superclass method Tefil::TextFilterBase::new
# File lib/tefil/calculator.rb, line 8
def initialize(options = {})
  @options = options
  @preserve = options[:preserve]
  @ruby = options[:ruby]
  super(options)
end

Public Instance Methods

process_stream(in_io, out_io) click to toggle source
# File lib/tefil/calculator.rb, line 15
def process_stream(in_io, out_io)
  in_io.each do |line|
    eq = line.chomp

    eq.gsub!(/\{/, '(' )
    eq.gsub!(/\}/, ')' )
    eq.gsub!(/\\times/, '*' )

    if @ruby
      eq.gsub!(/\^/, '**' )
      eq.gsub!(/sqrt/, 'Math::sqrt' )
      eq.gsub!(/log\(/, 'Math::log(' )
      eq.gsub!(/l\(/, 'Math::log(' )
      eq.gsub!(/exp\(/, 'Math::exp(' )
      eq.gsub!(/e\(/, 'Math::exp(' )
      result = eval(eq)
    else
      eq.gsub!(/\(/, '\(' )
      eq.gsub!(/\)/, '\)' )
      eq.gsub!(/\*/, '\*' )

      result = `echo  #{eq} | bc -l`.chomp
      result.sub!(/^\./, '0.')
      result.sub!(/^-\./, '-0.')
      result.sub!(/^0$/, '0.0')
    end

    out_io.print line.chomp + " = " if @preserve
    out_io.puts result
  end
end