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

View File

@@ -12,7 +12,7 @@ module Liquid
class Include < Tag
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)
end
end

View File

@@ -25,10 +25,9 @@ module Liquid
template_name = $1
variable_name = $3
@variable_name = Expression.parse(variable_name || template_name[1..-2])
@context_variable_name = template_name[1..-2].split('/'.freeze).last
@template_name = Expression.parse(template_name)
@attributes = {}
@variable_name_expr = variable_name ? Expression.parse(variable_name) : nil
@template_name_expr = Expression.parse(template_name)
@attributes = {}
markup.scan(TagAttributes) do |key, value|
@attributes[key] = Expression.parse(value)
@@ -44,7 +43,10 @@ module Liquid
def render(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
@attributes.each do |key, value|
@@ -53,11 +55,11 @@ module Liquid
if variable.is_a?(Array)
variable.collect do |var|
context[@context_variable_name] = var
context[context_variable_name] = var
partial.render(context)
end
else
context[@context_variable_name] = variable
context[context_variable_name] = variable
partial.render(context)
end
end
@@ -66,7 +68,7 @@ module Liquid
private
def load_cached_partial(context)
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]
return cached
@@ -81,7 +83,7 @@ module Liquid
def read_template_from_file_system(context)
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
def pass_options