diff --git a/lib/liquid/tags/decrement.rb b/lib/liquid/tags/decrement.rb index 8dc620740..70661716d 100644 --- a/lib/liquid/tags/decrement.rb +++ b/lib/liquid/tags/decrement.rb @@ -23,13 +23,29 @@ module Liquid # {% decrement variable_name %} # @liquid_syntax_keyword variable_name The name of the variable being decremented. class Decrement < Tag + include ParserSwitching + attr_reader :variable_name def initialize(tag_name, markup, options) super + parse_with_selected_parser(markup) + end + + def lax_parse(markup) @variable_name = markup.strip end + def strict_parse(markup) + lax_parse(markup) + end + + def strict2_parse(markup) + p = @parse_context.new_parser(markup.strip) + @variable_name = p.consume(:id) + p.consume(:end_of_string) + end + def render_to_output_buffer(context, output) counter_environment = context.environments.first value = counter_environment[@variable_name] || 0 diff --git a/lib/liquid/tags/increment.rb b/lib/liquid/tags/increment.rb index 0e00e9704..ba4a54d2c 100644 --- a/lib/liquid/tags/increment.rb +++ b/lib/liquid/tags/increment.rb @@ -23,13 +23,29 @@ module Liquid # {% increment variable_name %} # @liquid_syntax_keyword variable_name The name of the variable being incremented. class Increment < Tag + include ParserSwitching + attr_reader :variable_name def initialize(tag_name, markup, options) super + parse_with_selected_parser(markup) + end + + def lax_parse(markup) @variable_name = markup.strip end + def strict_parse(markup) + lax_parse(markup) + end + + def strict2_parse(markup) + p = @parse_context.new_parser(markup.strip) + @variable_name = p.consume(:id) + p.consume(:end_of_string) + end + def render_to_output_buffer(context, output) counter_environment = context.environments.first value = counter_environment[@variable_name] || 0 diff --git a/test/integration/tags/increment_tag_test.rb b/test/integration/tags/increment_tag_test.rb index 1ad94254e..bb7245ed5 100644 --- a/test/integration/tags/increment_tag_test.rb +++ b/test/integration/tags/increment_tag_test.rb @@ -27,4 +27,50 @@ def test_dec '{%decrement starboard %}', ) end + + def test_increment_strict2_rejects_invalid_variable_name + assert_raises(Liquid::SyntaxError) do + Template.parse('{% increment foo bar %}', error_mode: :strict2) + end + end + + def test_increment_strict2_rejects_variable_starting_with_number + assert_raises(Liquid::SyntaxError) do + Template.parse('{% increment 11aa %}', error_mode: :strict2) + end + end + + def test_increment_strict2_accepts_valid_variable_name + template = Template.parse('{% increment my-var %}', error_mode: :strict2) + assert_equal('0', template.render) + end + + def test_decrement_strict2_rejects_invalid_variable_name + assert_raises(Liquid::SyntaxError) do + Template.parse('{% decrement foo bar %}', error_mode: :strict2) + end + end + + def test_decrement_strict2_rejects_variable_starting_with_number + assert_raises(Liquid::SyntaxError) do + Template.parse('{% decrement 11aa %}', error_mode: :strict2) + end + end + + def test_decrement_strict2_accepts_valid_variable_name + template = Template.parse('{% decrement my-var %}', error_mode: :strict2) + assert_equal('-1', template.render) + end + + def test_increment_strict2_rejects_empty_variable_name + assert_raises(Liquid::SyntaxError) do + Template.parse('{% increment %}', error_mode: :strict2) + end + end + + def test_decrement_strict2_rejects_empty_variable_name + assert_raises(Liquid::SyntaxError) do + Template.parse('{% decrement %}', error_mode: :strict2) + end + end end diff --git a/test/integration/tags/render_tag_test.rb b/test/integration/tags/render_tag_test.rb index 0bd09d088..6773ad251 100644 --- a/test/integration/tags/render_tag_test.rb +++ b/test/integration/tags/render_tag_test.rb @@ -174,16 +174,16 @@ def test_break_through_render def test_increment_is_isolated_between_renders assert_template_result( '010', - '{% increment %}{% increment %}{% render "incr" %}', - partials: { 'incr' => '{% increment %}' }, + '{% increment port %}{% increment port %}{% render "incr" %}', + partials: { 'incr' => '{% increment port %}' }, ) end def test_decrement_is_isolated_between_renders assert_template_result( '-1-2-1', - '{% decrement %}{% decrement %}{% render "decr" %}', - partials: { 'decr' => '{% decrement %}' }, + '{% decrement port %}{% decrement port %}{% render "decr" %}', + partials: { 'decr' => '{% decrement port %}' }, ) end