From db474d5b57e631e0f2fbfbc120dd582eed26af1e Mon Sep 17 00:00:00 2001 From: Julia Boutin Date: Thu, 2 Oct 2025 19:26:17 -0600 Subject: [PATCH] Change inline snippet identifier from string to variable Currently, snippet files identified by strings. This PR makes changes to render to allow for new inline snippets to use variables as identifiers instead --- example/server/templates/index.liquid | 83 +++++++-------------------- lib/liquid/tags/render.rb | 16 ++++-- test/integration/tags/snippet_test.rb | 56 +++++++++++------- 3 files changed, 68 insertions(+), 87 deletions(-) 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

+
    +
  • wow a link
  • +
  • 1 + 1 = {{ 1 | plus: 1 }}
  • +
  • {% if true %}Yes!{% endif %}
  • +
  • {% if foo %}NO{% endif %}
  • +
  • {{ missing_var | default: 'fallback' }}
  • +
{% 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