diff --git a/lib/liquid.rb b/lib/liquid.rb
index 4d0a71a6..09cafe94 100644
--- a/lib/liquid.rb
+++ b/lib/liquid.rb
@@ -67,6 +67,7 @@ require 'liquid/i18n'
require 'liquid/drop'
require 'liquid/tablerowloop_drop'
require 'liquid/forloop_drop'
+require 'liquid/snippet_drop'
require 'liquid/extensions'
require 'liquid/errors'
require 'liquid/interrupts'
diff --git a/lib/liquid/snippet_drop.rb b/lib/liquid/snippet_drop.rb
new file mode 100644
index 00000000..fb48d068
--- /dev/null
+++ b/lib/liquid/snippet_drop.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+module Liquid
+ class SnippetDrop < Drop
+ attr_reader :body
+
+ def initialize(body)
+ super()
+ @body = body
+ end
+
+ def to_s
+ 'SnippetDrop'
+ end
+ end
+end
diff --git a/lib/liquid/tags/render.rb b/lib/liquid/tags/render.rb
index c142caca..03f231ea 100644
--- a/lib/liquid/tags/render.rb
+++ b/lib/liquid/tags/render.rb
@@ -42,6 +42,10 @@ module Liquid
@is_for_loop
end
+ def inherit_context?
+ @inherit_context
+ end
+
def render_to_output_buffer(context, output)
render_tag(context, output)
end
@@ -51,14 +55,15 @@ module Liquid
template_name = @template_name_expr
raise ::ArgumentError unless template_name.is_a?(String)
- # Inline snippets take precedence over external snippets
- if (inline_snippet = context.registers[:inline_snippet][template_name])
+ if context[template_name].is_a?(Liquid::SnippetDrop)
+ snippet_drop = context[template_name]
inner_context = context.new_isolated_subcontext
- snippet_body = inline_snippet[:body]
- context.scopes.each do |scope|
- scope.each do |key, value|
- inner_context[key] = value
+ if inherit_context?
+ context.scopes.each do |scope|
+ scope.each do |key, value|
+ inner_context[key] = value
+ end
end
end
@@ -66,7 +71,7 @@ module Liquid
inner_context[key] = context.evaluate(value)
end
- return output << snippet_body.render(inner_context)
+ return output << snippet_drop.body.render(inner_context)
end
partial = PartialCache.load(
diff --git a/lib/liquid/tags/snippet.rb b/lib/liquid/tags/snippet.rb
index 7f907274..e1d978b6 100644
--- a/lib/liquid/tags/snippet.rb
+++ b/lib/liquid/tags/snippet.rb
@@ -25,12 +25,14 @@ module Liquid
end
end
- def render(context)
- context.registers[:inline_snippet] ||= {}
- context.registers[:inline_snippet][@to] = {
- body: @body,
- }
- ''
+ def render_to_output_buffer(context, output)
+ snippet_drop = SnippetDrop.new(@body)
+ context.scopes.last[@to] = snippet_drop
+ output
+ end
+
+ def blank?
+ true
end
end
end
diff --git a/test/integration/tags/snippet_test.rb b/test/integration/tags/snippet_test.rb
index 24586227..27e50ec6 100644
--- a/test/integration/tags/snippet_test.rb
+++ b/test/integration/tags/snippet_test.rb
@@ -229,21 +229,18 @@ class SnippetTest < Minitest::Test
assert_template_result(expected, template)
end
- def test_render_parent_context_variable
+ def test_render_inline_snippet_without_outside_context
template = <<~LIQUID.strip
{% assign color_scheme = 'dark' %}
{% snippet header %}
- {% doc %}
- @param {string} message - Message.
- {% enddoc %}
-
{% endsnippet %}
- {%- render "header", message: "Welcome to my site" -%}
+
+ {% render "header", message: 'Welcome!' %}
LIQUID
expected = <<~OUTPUT
@@ -251,49 +248,44 @@ class SnippetTest < Minitest::Test
+
+
+ OUTPUT
+
+ assert_template_result(expected, template)
+ end
+
+ def test_render_inline_snippet_with_outside_context
+ template = <<~LIQUID.strip
+ {% assign color_scheme = 'dark' %}
+
+ {% snippet header %}
+
+ {% endsnippet %}
+
+
+ {% render "header", ..., message: 'Welcome!' %}
+ LIQUID
+ expected = <<~OUTPUT
+
+
+
+
+
+
OUTPUT
assert_template_result(expected, template)
end
- def test_deeply_nested_snippets
- template = <<~LIQUID.strip
- {% assign color_scheme = 'first-color' %}
- {% snippet first %}
- {% assign color_scheme = 'second-color' %}
- {% snippet second %}
- {% assign color_scheme = 'third-color' %}
- {% snippet third %}
-
- {% endsnippet %}
- {%- render "third" -%}
- {% endsnippet %}
- {%- render "second" -%}
- {% endsnippet %}
-
- {%- render "first" -%}
- LIQUID
- expected = <<~OUTPUT
-
-
-
-
-
-
-
- OUTPUT
-
- assert_template_result(expected, template)
- end
-
- def test_render_snippet_with_variables_in_both_scopes
+ def test_inline_snippet_local_scope_takes_precedence
template = <<~LIQUID.strip
{% assign color_scheme = 'dark' %}
@@ -306,7 +298,9 @@ class SnippetTest < Minitest::Test
{{ color_scheme }}
- {%- render "header", message: 'Welcome to my site' -%}
+ {% render "header", ..., message: 'Welcome!' %}
+
+ {{ color_scheme }}
LIQUID
expected = <<~OUTPUT
@@ -315,39 +309,126 @@ class SnippetTest < Minitest::Test
dark
+
+
+
+
+ dark
+ OUTPUT
+
+ assert_template_result(expected, template)
+ end
+
+ def test_render_captured_snippet
+ template = <<~LIQUID.strip
+ {% assign color_scheme = 'dark' %}
+
+ {% snippet header %}
+
+ {% endsnippet %}
+
+ {% capture up_header %}
+ {% render "header", ..., message: 'Welcome!' %}
+ {% endcapture %}
+
+ {{ up_header | upcase }}
+
+ {{ header | upcase }}
+
+ {{ header }}
+ LIQUID
+ expected = <<~OUTPUT
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SNIPPETDROP
+
+ SnippetDrop
+ OUTPUT
+
+ assert_template_result(expected, template)
+ end
+
+ def test_render_snippets_as_arguments
+ template = <<~LIQUID.strip
+ {% assign color_scheme = 'dark' %}
+
+ {% snippet header %}
+
+ {% endsnippet %}
+
+ {% snippet main %}
+ {% assign color_scheme = 'auto' %}
+
+
+ {% render "header", ..., message: 'Welcome!' %}
+
+ {% endsnippet %}
+
+ {% render "main", header: header %}
+ LIQUID
+
+ expected = <<~OUTPUT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
OUTPUT
assert_template_result(expected, template)
end
- # def test_render_snippets_as_arguments
+ # def test_render_inline_snippet_inside_loop
# template = <<~LIQUID.strip
# {% assign color_scheme = 'dark' %}
+ # {% assign array = '1,2,3' | split: ',' %}
- # {% snippet main_header %}
- # {% assign color_scheme = 'auto' %}
-
- #
- # {%- render "header", message: 'Welcome to my site' -%}
- #
- # {% endsnippet %}
-
+ # {% for i in array %}
# {% snippet header %}
- #
+ #
# {% endsnippet %}
+ # {% endfor %}
- # {%- render "main_header", header: header -%}
+ # {% render "header", ..., message: '👉' %}
# LIQUID
# expected = <<~OUTPUT
- #
- #
+
+ #
# OUTPUT