Lazily evaluate template name for context variable injection

This commit is contained in:
Justin Li
2015-05-11 18:01:24 -04:00
parent 25ef0df671
commit ff253a04c6
2 changed files with 12 additions and 10 deletions
+1 -1
View File
@@ -12,7 +12,7 @@ module Liquid
class Include < Tag class Include < Tag
def render_with_profiling(context) def render_with_profiling(context)
Profiler.profile_children(context.evaluate(@template_name).to_s) do Profiler.profile_children(context.evaluate(@template_name_expr).to_s) do
render_without_profiling(context) render_without_profiling(context)
end end
end end
+10 -8
View File
@@ -25,9 +25,8 @@ module Liquid
template_name = $1 template_name = $1
variable_name = $3 variable_name = $3
@variable_name = Expression.parse(variable_name || template_name[1..-2]) @variable_name_expr = variable_name ? Expression.parse(variable_name) : nil
@context_variable_name = template_name[1..-2].split('/'.freeze).last @template_name_expr = Expression.parse(template_name)
@template_name = Expression.parse(template_name)
@attributes = {} @attributes = {}
markup.scan(TagAttributes) do |key, value| markup.scan(TagAttributes) do |key, value|
@@ -44,7 +43,10 @@ module Liquid
def render(context) def render(context)
partial = load_cached_partial(context) partial = load_cached_partial(context)
variable = context.evaluate(@variable_name)
template_name = context.evaluate(@template_name_expr)
variable = context.evaluate(@variable_name_expr || Expression.parse(template_name))
context_variable_name = template_name.split('/'.freeze).last
context.stack do context.stack do
@attributes.each do |key, value| @attributes.each do |key, value|
@@ -53,11 +55,11 @@ module Liquid
if variable.is_a?(Array) if variable.is_a?(Array)
variable.collect do |var| variable.collect do |var|
context[@context_variable_name] = var context[context_variable_name] = var
partial.render(context) partial.render(context)
end end
else else
context[@context_variable_name] = variable context[context_variable_name] = variable
partial.render(context) partial.render(context)
end end
end end
@@ -66,7 +68,7 @@ module Liquid
private private
def load_cached_partial(context) def load_cached_partial(context)
cached_partials = context.registers[:cached_partials] || {} cached_partials = context.registers[:cached_partials] || {}
template_name = context.evaluate(@template_name) template_name = context.evaluate(@template_name_expr)
if cached = cached_partials[template_name] if cached = cached_partials[template_name]
return cached return cached
@@ -81,7 +83,7 @@ module Liquid
def read_template_from_file_system(context) def read_template_from_file_system(context)
file_system = context.registers[:file_system] || Liquid::Template.file_system file_system = context.registers[:file_system] || Liquid::Template.file_system
file_system.read_template_file(context.evaluate(@template_name)) file_system.read_template_file(context.evaluate(@template_name_expr))
end end
def pass_options def pass_options