diff --git a/lib/liquid/standardfilters.rb b/lib/liquid/standardfilters.rb index f24a19a..cf92e68 100644 --- a/lib/liquid/standardfilters.rb +++ b/lib/liquid/standardfilters.rb @@ -89,13 +89,15 @@ module Liquid def truncatewords(input, words = 15, truncate_string = "...") return if input.nil? - wordlist = input.to_s.split - words = Utils.to_integer(words) + input = input.to_s + words = Utils.to_integer(words) + words = 1 if words <= 0 - l = words - 1 - l = 0 if l < 0 + wordlist = input.split(" ", words + 1) + return input if wordlist.length <= words - wordlist.length > l ? wordlist[0..l].join(" ").concat(truncate_string.to_s) : input + wordlist.pop + wordlist.join(" ").concat(truncate_string.to_s) end # Split input string into an array of substrings separated by given pattern. diff --git a/test/integration/standard_filter_test.rb b/test/integration/standard_filter_test.rb index b0d768b..c4f826b 100644 --- a/test/integration/standard_filter_test.rb +++ b/test/integration/standard_filter_test.rb @@ -175,6 +175,9 @@ class StandardFiltersTest < Minitest::Test ) assert_equal("测试测试测试测试", @filters.truncatewords('测试测试测试测试', 5)) assert_equal('one two1', @filters.truncatewords("one two three", 2, 1)) + assert_equal('one two three...', @filters.truncatewords("one two\tthree\nfour", 3)) + assert_equal('one two...', @filters.truncatewords("one two three four", 2)) + assert_equal('one...', @filters.truncatewords("one two three four", 0)) end def test_strip_html