diff --git a/lib/liquid/standardfilters.rb b/lib/liquid/standardfilters.rb index 5c74736..db4f93f 100644 --- a/lib/liquid/standardfilters.rb +++ b/lib/liquid/standardfilters.rb @@ -46,8 +46,8 @@ module Liquid end def slice(input, offset, length = nil) - offset = Integer(offset) - length = length ? Integer(length) : 1 + offset = to_integer(offset) + length = length ? to_integer(length) : 1 if input.is_a?(Array) input.slice(offset, length) || [] @@ -317,6 +317,16 @@ module Liquid private + def to_integer(num) + return num if num.is_a?(Integer) + num = num.to_s + begin + Integer(num) + rescue ::ArgumentError + raise Liquid::ArgumentError, "invalid integer" + end + end + def to_number(obj) case obj when Float diff --git a/test/integration/standard_filter_test.rb b/test/integration/standard_filter_test.rb index 89caffb..546a348 100644 --- a/test/integration/standard_filter_test.rb +++ b/test/integration/standard_filter_test.rb @@ -76,6 +76,13 @@ class StandardFiltersTest < Minitest::Test assert_equal '', @filters.slice(nil, 0) assert_equal '', @filters.slice('foobar', 100, 10) assert_equal '', @filters.slice('foobar', -100, 10) + assert_equal 'oob', @filters.slice('foobar', '1', '3') + assert_raises(Liquid::ArgumentError) do + @filters.slice('foobar', nil) + end + assert_raises(Liquid::ArgumentError) do + @filters.slice('foobar', 0, "") + end end def test_slice_on_arrays