From fb6f9c1c13be05ab4f24f807bc4a986cfe3cd552 Mon Sep 17 00:00:00 2001 From: Florian Weingarten Date: Tue, 5 Aug 2014 16:44:59 +0000 Subject: [PATCH] Slice filter for arrays. --- lib/liquid/standardfilters.rb | 7 ++++++- test/integration/standard_filter_test.rb | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/liquid/standardfilters.rb b/lib/liquid/standardfilters.rb index b246576..2f3df78 100644 --- a/lib/liquid/standardfilters.rb +++ b/lib/liquid/standardfilters.rb @@ -45,7 +45,12 @@ module Liquid def slice(input, offset, length=nil) offset = Integer(offset) length = length ? Integer(length) : 1 - input.to_s.slice(offset, length) || '' + + if input.is_a?(Array) + input.slice(offset, length) || [] + else + input.to_s.slice(offset, length) || '' + end end # Truncate a string down to x characters diff --git a/test/integration/standard_filter_test.rb b/test/integration/standard_filter_test.rb index 5d658e9..fc8114e 100644 --- a/test/integration/standard_filter_test.rb +++ b/test/integration/standard_filter_test.rb @@ -78,6 +78,20 @@ class StandardFiltersTest < Minitest::Test assert_equal '', @filters.slice('foobar', -100, 10) end + def test_slice_on_arrays + input = 'foobar'.split(//) + assert_equal %w{o o b}, @filters.slice(input, 1, 3) + assert_equal %w{o o b a r}, @filters.slice(input, 1, 1000) + assert_equal %w{}, @filters.slice(input, 1, 0) + assert_equal %w{o}, @filters.slice(input, 1, 1) + assert_equal %w{b a r}, @filters.slice(input, 3, 3) + assert_equal %w{a r}, @filters.slice(input, -2, 2) + assert_equal %w{a r}, @filters.slice(input, -2, 1000) + assert_equal %w{r}, @filters.slice(input, -1) + assert_equal %w{}, @filters.slice(input, 100, 10) + assert_equal %w{}, @filters.slice(input, -100, 10) + end + def test_truncate assert_equal '1234...', @filters.truncate('1234567890', 7) assert_equal '1234567890', @filters.truncate('1234567890', 20)