Change the behavior of before_render and after_render hooks from #761.
This changes the before_render and after_render hooks so that the callbacks given to them each get to modify the template source / the rendered output in turn, instead of having to modify them in-place. It also changes the arguments provided to the callbacks - now, they are given the source/output, the template path, the locals hash, and the Tilt template *class*, wheras previously they were given the source/output and the Tilt template *instance*. The locals hash is there in case pron case hooks want to pay attention to the locals in some way. The before_render hook is also run before compiling the template and caching it, which should prevent weird data mismatches and save some template compilation effort.
This commit is contained in:
parent
5e12c68f1b
commit
3bdbc11db2
|
@ -246,15 +246,26 @@ module Middleman
|
||||||
options = opts.merge(options_for_ext(extension))
|
options = opts.merge(options_for_ext(extension))
|
||||||
options[:outvar] ||= '@_out_buf'
|
options[:outvar] ||= '@_out_buf'
|
||||||
|
|
||||||
|
template_class = Tilt[path]
|
||||||
|
# Allow hooks to manipulate the template before render
|
||||||
|
self.class.callbacks_for_hook(:before_render).each do |callback|
|
||||||
|
newbody = callback.call(body, path, locs, template_class)
|
||||||
|
body = newbody if newbody # Allow the callback to return nil to skip it
|
||||||
|
end
|
||||||
|
|
||||||
# Read compiled template from disk or cache
|
# Read compiled template from disk or cache
|
||||||
template = cache.fetch(:compiled_template, options, body) do
|
template = cache.fetch(:compiled_template, options, body) do
|
||||||
::Tilt.new(path, 1, options) { body }
|
::Tilt.new(path, 1, options) { body }
|
||||||
end
|
end
|
||||||
|
|
||||||
# Render using Tilt
|
# Render using Tilt
|
||||||
run_hook :before_render, template.data, template
|
content = template.render(context, path, locs, &block)
|
||||||
content = template.render(context, locs, &block)
|
|
||||||
run_hook :after_render, content, template
|
# Allow hooks to manipulate the result after render
|
||||||
|
self.class.callbacks_for_hook(:after_render).each do |callback|
|
||||||
|
content = callback.call(content, locs, template_class)
|
||||||
|
end
|
||||||
|
|
||||||
return content
|
return content
|
||||||
ensure
|
ensure
|
||||||
# Reset stored buffer
|
# Reset stored buffer
|
||||||
|
|
Loading…
Reference in a new issue