From ff253a04c65feb61af284a87933087f3a1276913 Mon Sep 17 00:00:00 2001 From: Justin Li Date: Mon, 11 May 2015 18:01:24 -0400 Subject: [PATCH] Lazily evaluate template name for context variable injection --- lib/liquid/profiler/hooks.rb | 2 +- lib/liquid/tags/include.rb | 20 +++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/lib/liquid/profiler/hooks.rb b/lib/liquid/profiler/hooks.rb index 8a6e808..37c3cc2 100644 --- a/lib/liquid/profiler/hooks.rb +++ b/lib/liquid/profiler/hooks.rb @@ -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 diff --git a/lib/liquid/tags/include.rb b/lib/liquid/tags/include.rb index 822cb37..e8cad2e 100644 --- a/lib/liquid/tags/include.rb +++ b/lib/liquid/tags/include.rb @@ -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