diff --git a/example/server/templates/index.liquid b/example/server/templates/index.liquid index 52905508..d4ea6afc 100644 --- a/example/server/templates/index.liquid +++ b/example/server/templates/index.liquid @@ -1,71 +1,32 @@ - - - + + - - - Simple Code Editor - - - - - - - + + + Inline Snippets + -
- {% snippet "main" %} +
- {% # Snippet input %} - {% snippet "input" |type, name| %} -
- - -
- {% endsnippet %} + + {% snippet main %} + {% assign foo = false %} +

Hi {{ arg | upcase }}!!!

- {% snippet "league" %} -

Welcome to the league of super evil

- {% endsnippet %} - - {% render "league" %} - {% render "input", type: "text" %} - {% render "input", type: "password" %} +

This is an inline snippet

+ {% endsnippet %} - {% render 'main' %} + + {% render main, arg: 'lsf' %} +
- - - - diff --git a/lib/liquid/tags/render.rb b/lib/liquid/tags/render.rb index 03f231ea..288e226d 100644 --- a/lib/liquid/tags/render.rb +++ b/lib/liquid/tags/render.rb @@ -27,7 +27,7 @@ module Liquid # @liquid_syntax_keyword filename The name of the snippet to render, without the `.liquid` extension. class Render < Tag FOR = 'for' - SYNTAX = /(#{QuotedString}+)(\s+(with|#{FOR})\s+(#{QuotedFragment}+))?(\s+(?:as)\s+(#{VariableSegment}+))?/o + SYNTAX = /(#{QuotedString}+|#{VariableSegment}+)(\s+(with|#{FOR})\s+(#{QuotedFragment}+))?(\s+(?:as)\s+(#{VariableSegment}+))?/o disable_tags "include" @@ -51,12 +51,15 @@ module Liquid end def render_tag(context, output) - # The expression should be a String literal, which parses to a String object template_name = @template_name_expr - raise ::ArgumentError unless template_name.is_a?(String) - if context[template_name].is_a?(Liquid::SnippetDrop) - snippet_drop = context[template_name] + # For inline snippets, @template_name_expr is a VariableLookup + if template_name.is_a?(VariableLookup) + + snippet_drop = context[template_name.name] + + raise ::ArgumentError unless snippet_drop.is_a?(Liquid::SnippetDrop) + inner_context = context.new_isolated_subcontext if inherit_context? @@ -74,6 +77,9 @@ module Liquid return output << snippet_drop.body.render(inner_context) end + # Otherwise, the expression should be a String literal, which parses to a String object + raise ::ArgumentError unless template_name.is_a?(String) + partial = PartialCache.load( template_name, context: context, diff --git a/test/integration/tags/snippet_test.rb b/test/integration/tags/snippet_test.rb index 27e50ec6..5dcd5465 100644 --- a/test/integration/tags/snippet_test.rb +++ b/test/integration/tags/snippet_test.rb @@ -22,7 +22,7 @@ class SnippetTest < Minitest::Test Hey {% endsnippet %} - {%- render "hey" -%} + {%- render hey -%} LIQUID expected = <<~OUTPUT @@ -32,6 +32,22 @@ class SnippetTest < Minitest::Test assert_template_result(expected, template) end + def test_render_inline_snippet_with_variable + template = <<~LIQUID.strip + {% snippet hey %} +

Today is {{ "hello" | capitalize }}

+ {% endsnippet %} + + {%- render hey -%} + LIQUID + expected = <<~OUTPUT + +

Today is Hello

+ OUTPUT + + assert_template_result(expected, template) + end + def test_render_multiple_inline_snippets template = <<~LIQUID.strip {% snippet input %} @@ -44,8 +60,8 @@ class SnippetTest < Minitest::Test {% endsnippet %} - {%- render "input" -%} - {%- render "banner" -%} + {%- render input -%} + {%- render banner -%} LIQUID expected = <<~OUTPUT @@ -67,7 +83,7 @@ class SnippetTest < Minitest::Test {% endsnippet %} - {%- render "input", type: "text" -%} + {%- render input, type: "text" -%} LIQUID expected = <<~OUTPUT @@ -87,7 +103,7 @@ class SnippetTest < Minitest::Test {% endsnippet %} - {%- render "input", type: "text" -%} + {%- render input, type: "text" -%} LIQUID expected = <<~OUTPUT @@ -110,7 +126,7 @@ class SnippetTest < Minitest::Test {% endsnippet %} - {%- render "input", type: "text", value: "Hello" -%} + {%- render input, type: "text", value: "Hello" -%} LIQUID expected = <<~OUTPUT @@ -132,8 +148,8 @@ class SnippetTest < Minitest::Test {% endsnippet %} - {%- render "input", type: "text" -%} - {%- render "inputs", type: "password", value: "pass" -%} + {%- render input, type: "text" -%} + {%- render inputs, type: "password", value: "pass" -%} LIQUID expected = <<~OUTPUT @@ -159,7 +175,7 @@ class SnippetTest < Minitest::Test {% endsnippet %} - {%- render "input", type: "text" -%} + {%- render input, type: "text" -%} LIQUID expected = <<~OUTPUT @@ -182,7 +198,7 @@ class SnippetTest < Minitest::Test {% endsnippet %} - {%- render "input", type: "text", value: "Hello" -%} + {%- render input, type: "text", value: "Hello" -%} {{ type }} {{ value }} @@ -212,8 +228,8 @@ class SnippetTest < Minitest::Test {% endsnippet %} - {%- render "input", type: "text" -%} - {%- render "no_leak" -%} + {%- render input, type: "text" -%} + {%- render no_leak -%} LIQUID expected = <<~OUTPUT @@ -240,7 +256,7 @@ class SnippetTest < Minitest::Test {% endsnippet %} - {% render "header", message: 'Welcome!' %} + {% render header, message: 'Welcome!' %} LIQUID expected = <<~OUTPUT @@ -268,7 +284,7 @@ class SnippetTest < Minitest::Test {% endsnippet %} - {% render "header", ..., message: 'Welcome!' %} + {% render header, ..., message: 'Welcome!' %} LIQUID expected = <<~OUTPUT @@ -298,7 +314,7 @@ class SnippetTest < Minitest::Test {{ color_scheme }} - {% render "header", ..., message: 'Welcome!' %} + {% render header, ..., message: 'Welcome!' %} {{ color_scheme }} LIQUID @@ -333,7 +349,7 @@ class SnippetTest < Minitest::Test {% endsnippet %} {% capture up_header %} - {% render "header", ..., message: 'Welcome!' %} + {% render header, ..., message: 'Welcome!' %} {% endcapture %} {{ up_header | upcase }} @@ -351,7 +367,6 @@ class SnippetTest < Minitest::Test -
WELCOME!
@@ -380,11 +395,11 @@ class SnippetTest < Minitest::Test {% assign color_scheme = 'auto' %}
- {% render "header", ..., message: 'Welcome!' %} + {% render header, ..., message: 'Welcome!' %}
{% endsnippet %} - {% render "main", header: header %} + {% render main, header: header %} LIQUID expected = <<~OUTPUT @@ -397,7 +412,6 @@ class SnippetTest < Minitest::Test -
@@ -423,7 +437,7 @@ class SnippetTest < Minitest::Test # {% endsnippet %} # {% endfor %} - # {% render "header", ..., message: '👉' %} + # {% render header, ..., message: '👉' %} # LIQUID # expected = <<~OUTPUT