Method: Middleman::FileRenderer#render

Defined in:
middleman-core/lib/middleman-core/file_renderer.rb

#render(locs, opts, context, &block) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'middleman-core/lib/middleman-core/file_renderer.rb', line 32

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 = {}.merge!(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 = ::Middleman::Util.tilt_class(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
  content = template.render(context, locs, &block)

  # 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