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)