class GTX

def erb

def erb
  ERB.new(erb_source, trim_mode: '-').tap { |a| a.filename = filename }
end

def erb_source

def erb_source
  template.strip.lines.map do |line|
    case line
    when /^\s*> ?(.*)/ then eval_vars $1
    when /^\s*= ?(.*)/ then "<%= #{eval_vars $1.strip} %>"
    else "<%- #{line.strip} -%>"
    end
  end.join "\n"
end

def eval_vars(string)

def eval_vars(string)
  string.gsub(/{{([^{].*?)}}/, '<%=\1%>')
    .gsub('\\}\\}', '}}')
    .gsub('\\{\\{', '{{')
end

def initialize(template, filename: nil)

def initialize(template, filename: nil)
  @template = template
  @filename = filename
end

def load_file(path, filename: nil)

def load_file(path, filename: nil)
  new File.read(path), filename: filename || path
end

def parse(context = nil)

def parse(context = nil)
  context ||= self
  context = context.instance_eval { binding } unless context.is_a? Binding
  erb.result context
end

def render(template, context: nil, filename: nil)

def render(template, context: nil, filename: nil)
  new(template, filename: filename).parse context
end

def render_file(path, context: nil, filename: nil)

def render_file(path, context: nil, filename: nil)
  load_file(path, filename: filename).parse context
end