class Railroader::ErbTemplateProcessor

Processes ERB templates (those ending in .html.erb or .rthml).

Public Instance Methods

process_block(exp) click to toggle source

Process block, removing irrelevant expressions

# File lib/railroader/processors/erb_template_processor.rb, line 49
def process_block exp
  exp = exp.dup
  exp.shift
  if @inside_concat
    @inside_concat = false
    exp[0..-2].each do |e|
      process e
    end
    @inside_concat = true
    process exp.last
  else
    exp.map! do |e|
      res = process e
      if res.empty? or res == ignore
        nil
      elsif node_type?(res, :lvar) and res.value == :_erbout
        nil

      else
        res
      end
    end
    block = Sexp.new(:rlist).concat(exp).compact
    block.line(exp.line)
    block
  end
end
process_call(exp) click to toggle source

s(:call, TARGET, :method, ARGS)

# File lib/railroader/processors/erb_template_processor.rb, line 8
def process_call exp
  target = exp.target
  if sexp? target
    target = process target
  end
  method = exp.method

  # _erbout is the default output variable for erb
  if node_type? target, :lvar and target.value == :_erbout
    if method == :concat or method == :<<
      @inside_concat = true
      exp.arglist = process(exp.arglist)
      @inside_concat = false

      if exp.second_arg
        raise "Did not expect more than a single argument to _erbout.concat"
      end

      arg = normalize_output(exp.first_arg)

      if arg.node_type == :str # ignore plain strings
        ignore
      else
        add_output arg
      end
    elsif method == :force_encoding
      ignore
    else
      abort "Unrecognized action on _erbout: #{method}"
    end
  elsif target == nil and method == :render
    exp.arglist = process(exp.arglist)
    make_render_in_view exp
  else
    exp.target = target
    exp.arglist = process(exp.arglist)
    exp
  end
end