diff --git a/lib/liquid/block_body.rb b/lib/liquid/block_body.rb index 4674c5f3..33a6a99f 100644 --- a/lib/liquid/block_body.rb +++ b/lib/liquid/block_body.rb @@ -45,6 +45,12 @@ module Liquid end tag_name = Regexp.last_match(1) markup = Regexp.last_match(2) + + if tag_name == 'liquid' + parse_context.line_number -= 1 + next parse_liquid_tag(markup, parse_context) + end + unless (tag = registered_tags[tag_name]) # end parsing if we reach an unknown tag and let the caller decide # determine how to proceed diff --git a/test/integration/tags/liquid_tag_test.rb b/test/integration/tags/liquid_tag_test.rb index 17ce0019..c6694fa7 100644 --- a/test/integration/tags/liquid_tag_test.rb +++ b/test/integration/tags/liquid_tag_test.rb @@ -113,4 +113,37 @@ class LiquidTagTest < Minitest::Test {% raw %}{% liquid echo 'test' %}{% endraw %} LIQUID end + + def test_nested_liquid_tags + assert_template_result('good', <<~LIQUID) + {%- liquid + liquid + if true + echo "good" + endif + -%} + LIQUID + end + + def test_nested_liquid_tags_on_same_line + assert_template_result('good', <<~LIQUID) + {%- liquid liquid liquid echo "good" -%} + LIQUID + end + + def test_nested_liquid_liquid_is_not_skipped_if_used_in_non_tag_position + assert_template_result('liquid', <<~LIQUID, { 'liquid' => 'liquid' }) + {%- liquid liquid liquid echo liquid -%} + LIQUID + end + + def test_next_liquid_with_unclosed_if_tag + assert_match_syntax_error("Liquid syntax error (line 2): 'if' tag was never closed", <<~LIQUID) + {%- liquid + liquid if true + echo "good" + endif + -%} + LIQUID + end end