Sha256: 986ae40895ed4c496d7b1ae0de50a9a6faa3041128a67a32059044ce16d64748

Contents?: true

Size: 1.99 KB

Versions: 30

Compression:

Stored size: 1.99 KB

Contents

module Zafu
  module Eval

    def r_set
      return parser_error("'var' missing") unless var_name = @params[:var]
      return parser_error("bad value for 'var' (#{var_name.inspect})") unless var_name =~ /^[a-zA-Z_]+$/
      return '' unless @context[:set]
      if @params[:value]
        out "<% set_#{var_name} = #{@params[:value].inspect} -%>"
        # TODO: isn't @context[:vars] = @params[:value].inspect missing here ?
      elsif @params[:eval]
        return unless eval_string = parse_eval_parameter(@params[:eval])
        out "<% set_#{var_name} = #{eval_string} -%>"
      else
        out "<% set_#{var_name} = capture do %>"
        out expand_with(:set => false) # do not propagate
        out "<% end -%>"
      end
    end

    def parse_eval_parameter(str)
      # evaluate an expression. Can only contain vars, '(', ')', '*', '+', '/', '-', '[attr]'
      # FIXME: SECURITY (audit this)
      vars = @context[:vars] || []
      parts = str.split(/\s+/)
      res  = []
      test = []
      parts.each do |p|
        if p =~ /\[([\w_]+)\]/
          test << 1
          res << (node_attribute($1) + '.to_f')
        elsif p =~ /^[a-zA-Z_]+$/
          unless vars.include?(p)
            out parser_error("var #{p.inspect} not set in eval")
            return nil
          end
          test << 1
          res  << "set_#{p}.to_f"
        elsif ['(', ')', '*', '+', '/', '-'].include?(p)
          res  << p
          test << p
        elsif p =~ /^[0-9\.]+$/
          res  << p
          test << p
        else
          out parser_error("bad argument #{p.inspect} in eval")
          return nil
        end
      end
      begin
        begin
          eval test.join(' ')
        rescue
          # rescue evaluation error
          out parser_error("error in eval")
          return nil
        end
        "(#{res.join(' ')})"
      rescue SyntaxError => err
        # rescue compilation error
        out parser_error("compilation error in eval")
        return nil
      end
    end
  end # Eval
end # Zafu

Version data entries

30 entries across 30 versions & 1 rubygems

Version Path
zena-1.2.8 old_zafu/eval.rb
zena-1.2.7 old_zafu/eval.rb
zena-1.2.6 old_zafu/eval.rb
zena-1.2.5 old_zafu/eval.rb
zena-1.2.4 old_zafu/eval.rb
zena-1.2.3 old_zafu/eval.rb
zena-1.2.2 old_zafu/eval.rb
zena-1.2.1 old_zafu/eval.rb
zena-1.2.0 old_zafu/eval.rb
zena-1.1.3 old_zafu/eval.rb
zena-1.1.2 old_zafu/eval.rb
zena-1.1.1 old_zafu/eval.rb
zena-1.1.0 old_zafu/eval.rb
zena-1.0.0 old_zafu/eval.rb
zena-1.0.0.rc3 old_zafu/eval.rb
zena-1.0.0.rc2 old_zafu/eval.rb
zena-1.0.0.rc1 old_zafu/eval.rb
zena-0.16.9 lib/zafu/eval.rb
zena-1.0.0.beta3 old_zafu/eval.rb
zena-0.16.8 lib/zafu/eval.rb