From ca4b9b43af999a7f9577ff07a4b190ad50d9088b Mon Sep 17 00:00:00 2001 From: Dylan Thacker-Smith Date: Wed, 16 Sep 2020 16:07:36 -0400 Subject: [PATCH] Port liquid-c bug compatible whitespace trimming (#1291) --- lib/liquid/block_body.rb | 4 ++++ test/integration/trim_mode_test.rb | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/lib/liquid/block_body.rb b/lib/liquid/block_body.rb index 3c2f8e7..f27905c 100644 --- a/lib/liquid/block_body.rb +++ b/lib/liquid/block_body.rb @@ -145,7 +145,11 @@ module Liquid if token[2] == WhitespaceControl previous_token = @nodelist.last if previous_token.is_a?(String) + first_byte = previous_token.getbyte(0) previous_token.rstrip! + if previous_token.empty? && parse_context[:bug_compatible_whitespace_trimming] && first_byte + previous_token << first_byte + end end end parse_context.trim_whitespace = (token[-3] == WhitespaceControl) diff --git a/test/integration/trim_mode_test.rb b/test/integration/trim_mode_test.rb index 30b1ceb..7f797df 100644 --- a/test/integration/trim_mode_test.rb +++ b/test/integration/trim_mode_test.rb @@ -528,4 +528,32 @@ class TrimModeTest < Minitest::Test END_EXPECTED assert_template_result(expected, text) end + + def test_pre_trim_blank_preceding_text + template = Liquid::Template.parse("\n{%- raw %}{% endraw %}") + assert_equal("", template.render) + + template = Liquid::Template.parse("\n{%- if true %}{% endif %}") + assert_equal("", template.render) + + template = Liquid::Template.parse("{{ 'B' }} \n{%- if true %}C{% endif %}") + assert_equal("BC", template.render) + end + + def test_bug_compatible_pre_trim + template = Liquid::Template.parse("\n {%- raw %}{% endraw %}", bug_compatible_whitespace_trimming: true) + assert_equal("\n", template.render) + + template = Liquid::Template.parse("\n {%- if true %}{% endif %}", bug_compatible_whitespace_trimming: true) + assert_equal("\n", template.render) + + template = Liquid::Template.parse("{{ 'B' }} \n{%- if true %}C{% endif %}", bug_compatible_whitespace_trimming: true) + assert_equal("B C", template.render) + + template = Liquid::Template.parse("B\n {%- raw %}{% endraw %}", bug_compatible_whitespace_trimming: true) + assert_equal("B", template.render) + + template = Liquid::Template.parse("B\n {%- if true %}{% endif %}", bug_compatible_whitespace_trimming: true) + assert_equal("B", template.render) + end end # TrimModeTest