class MovieMasher::FilterEvaluated

module filter

Attributes

parameters[R]

Public Class Methods

new(filter_config, mash_input = nil, applied_input = nil) click to toggle source
Calls superclass method MovieMasher::Filter::new
# File lib/graphs/filters.rb, line 51
def initialize(filter_config, mash_input = nil, applied_input = nil)
  # applied_input same as filter_config for themes
  @config = filter_config
  raise(Error::Parameter, 'no config') unless @config

  @parameters = @config[:parameters]
  @evaluated = {}
  @mash_input = mash_input
  @applied_input = applied_input
  unless @parameters
    sym = filter_config[:id].upcase.to_sym
    if Parameters.const_defined?(sym)
      @parameters = Parameters.const_get(sym)
    end
    @parameters ||= []
  end
  super @config[:id]
end

Public Instance Methods

command_parameters(scope) click to toggle source
# File lib/graphs/filters.rb, line 8
def command_parameters(scope)
  cmds = []
  if @parameters
    __raise_unless(@parameters.is_a?(Array), 'parameters is not an array')
    @parameters.each do |parameter|
      __raise_unless(parameter.is_a?(Hash), 'parameter is not a hash')
      name = parameter[:name]
      evaluated = parameter[:value]
      cmds << __command_name_value(name, evaluated, scope)
    end
  end
  cmds.join(':')
end
filter_command(scope = nil) click to toggle source
Calls superclass method MovieMasher::Filter#filter_command
# File lib/graphs/filters.rb, line 22
def filter_command(scope = nil)
  cmd = super
  return cmd if cmd.empty?

  @evaluated = {}
  cmds = []
  cmds << cmd
  if scope
    if Filter.__outsize['w'] && Filter.__outsize['h']
      scope[:mm_in_w] = Filter.__outsize['w']
      scope[:mm_in_h] = Filter.__outsize['h']
      # puts "<< #{scope[:mm_in_w]}x#{scope[:mm_in_h]} #{@id}"
    else
      scope[:mm_in_w] = 'in_w'
      scope[:mm_in_h] = 'in_h'
    end
  end
  cmd = command_parameters(scope)
  unless cmd.to_s.empty?
    cmds << '='
    cmds << cmd
  end
  cmd = cmds.join
  __set_output_dimension

  @evaluated = {}
  cmd
end
scope_value(scope, value_str) click to toggle source

only called directly from here and tests

# File lib/graphs/filters.rb, line 71
def scope_value(scope, value_str)
  if scope
    # puts "1 value_str = #{value_str}"
    level = 0
    deepest = 0
    esc = '~'
    # expand variables
    value_str = value_str.to_s.dup
    value_str.gsub!(/(\w+)/) do |match|
      match_str = match.to_s
      match_sym = match_str.to_sym
      if scope[match_sym]
        scope[match_sym].to_s
      else
        match_str
      end
    end
    # puts "2 value_str = #{value_str}"
    value_str.gsub!(/[()]/) do |paren|
      result = paren.to_s
      case result
      when '('
        level += 1
        deepest = [deepest, level].max
        result = "(#{level}#{esc}"
      when ')'
        result = ")#{level}#{esc}"
        level -= 1
      end
      result
    end
    # puts "3 value_str = #{value_str}"
    while deepest.positive?
      # puts "PRE #{deepest}: #{value_str}"
      reg_str = "([a-z_]+)[(]#{deepest}[#{esc}](.*?)[)]#{deepest}[#{esc}]"
      regexp = Regexp.new(reg_str)
      value_str = value_str.gsub(regexp) do
        Regexp.last_match.captures[0]
        method = Regexp.last_match.captures.first
        param_str = Regexp.last_match.captures.last
        params = param_str.split(',').map(&:strip)
        if __is_filter_helper(method)
          result = FilterHelpers.send(
            method.to_sym, params, @mash_input[:mash], scope
          )
          __raise_unless(result, "got false #{method}(#{params.join ','})")
          result = result.to_s
          __raise_if_empty(result, "empty #{method}(#{params.join(',')})")
        else
          result = "#{method}(#{params.join ','})"
        end
        result
      end
      # puts "POST METHODS #{deepest}: #{value_str}"
      # replace all simple equations in parentheses
      reg_str = "[(]#{deepest}[#{esc}](.*?)[)]#{deepest}[#{esc}]"
      value_str = value_str.gsub(Regexp.new(reg_str)) do
        evaluated = Evaluate.equation(Regexp.last_match[1])
        evaluated = "(#{evaluated})" unless evaluated.respond_to?(:round)
        evaluated.to_s
      end
      # puts "POST EQUATIONS #{deepest}: #{value_str}"
      deepest -= 1
    end
    # remove any lingering markers
    regexp = Regexp.new("([()])[0-9]+[#{esc}]")
    value_str = value_str.gsub(regexp) { Regexp.last_match[1] }
    # remove whitespace
    # value_str.gsub!(/\s/, '')
    # puts "4 value_str = #{value_str}"
  end
  Evaluate.equation(value_str)
end