class Middleman::FileRenderer

def render(locs, opts, context, &block)

def render(locs, opts, context, &block)
  path = @path.dup
  # Detect the remdering engine from the extension
  extension = File.extname(path)
  engine = extension[1..-1].to_sym
  # Store last engine for later (could be inside nested renders)
  context.current_engine, engine_was = engine, context.current_engine
  # Save current buffer for later
  buf_was = context.save_buffer
  # Read from disk or cache the contents of the file
  body = if opts[:template_body]
    opts.delete(:template_body)
  else
    template_data_for_file
  end
  # Merge per-extension options from config
  extension = File.extname(path)
  options = opts.merge(options_for_ext(extension))
  options[:outvar] ||= '@_out_buf'
  options[:context] = context
  options.delete(:layout)
  # Overwrite with frontmatter options
  options = options.deep_merge(options[:renderer_options]) if options[:renderer_options]
  template_class = ::Tilt[path]
  # Allow hooks to manipulate the template before render
  body = @app.callbacks_for(:before_render).reduce(body) do |sum, callback|
    callback.call(sum, path, locs, template_class) || sum
  end
  # Read compiled template from disk or cache
  template = ::Tilt.new(path, 1, options) { body }
  # template = cache.fetch(:compiled_template, extension, options, body) do
  #   ::Tilt.new(path, 1, options) { body }
  # end
  # Render using Tilt
  content = ::Middleman::Util.instrument 'render.tilt', path: path do
    template.render(context, locs, &block)
  end
  # Allow hooks to manipulate the result after render
  content = @app.callbacks_for(:after_render).reduce(content) do |sum, callback|
    callback.call(sum, path, locs, template_class) || sum
  end
  output = ::ActiveSupport::SafeBuffer.new ''
  output.safe_concat content
  output
ensure
  # Reset stored buffer
  context.restore_buffer(buf_was)
  context.current_engine = engine_was
end