From bac0d6d2b5236de2330e4b59903bbc3a83c037c9 Mon Sep 17 00:00:00 2001 From: Chris AtLee Date: Wed, 29 May 2024 23:02:52 -0400 Subject: [PATCH] WIP --- lib/liquid/tags/assign.rb | 18 ++++++++++++++++-- test/integration/assign_test.rb | 15 +++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/lib/liquid/tags/assign.rb b/lib/liquid/tags/assign.rb index 9eff9796..2ef7b60c 100644 --- a/lib/liquid/tags/assign.rb +++ b/lib/liquid/tags/assign.rb @@ -27,14 +27,28 @@ module Liquid super if markup =~ Syntax @to = Regexp.last_match(1) - @from = Variable.new(Regexp.last_match(2), parse_context) + from_ = Regexp.last_match(2).strip + if /^\[.*\]$/.match?(from_) + from_ = from_[1..-2].split(",") + @from = from_.map { |s| Variable.new(s.strip, parse_context) } + else + @from = Variable.new(from_, parse_context) + end else self.class.raise_syntax_error(parse_context) end end def render_to_output_buffer(context, output) - val = @from.render(context) + val = nil + if @from.is_a?(Array) + val = [] + @from.each do |var| + val << var.render(context) + end + else + val = @from.render(context) + end context.scopes.last[@to] = val context.resource_limits.increment_assign_score(assign_score_of(val)) output diff --git a/test/integration/assign_test.rb b/test/integration/assign_test.rb index fdb6c99c..d5d2e4d1 100644 --- a/test/integration/assign_test.rb +++ b/test/integration/assign_test.rb @@ -53,6 +53,21 @@ class AssignTest < Minitest::Test assert_template_result('result', source, { 'a' => { 'b' => 'result' } }) end + def test_assign_array + source = "{% assign r = [1, 2, 3] %}{{ r | join: ';' }}" + assert_template_result('1;2;3', source) + + source = <<~LIQUID + {%- assign a = "one" -%} + {%- assign b = "two" -%} + {%- assign c = "three" -%} + {%- assign l = [a, b, c] -%} + {{- l | join: ", and " -}} + LIQUID + + assert_template_result("one, and two, and three", source) + end + def test_assign_score_exceeding_resource_limit t = Template.parse("{% assign foo = 42 %}{% assign bar = 23 %}") t.resource_limits.assign_score_limit = 1