From: Berker Peksag Date: Sun, 8 Sep 2013 15:09:29 +0000 (+0300) Subject: Issue #121: The truncate filter now counts the length X-Git-Tag: 2.8~103^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3c75c961b4fbdf8a6bede3aa5ef80efdbcb9c80a;p=thirdparty%2Fjinja.git Issue #121: The truncate filter now counts the length of the *end* parameter when truncating a string. This is the same behavior as Django's truncate filter: https://docs.djangoproject.com/en/1.4/ref/templates/builtins/#truncatechars --- diff --git a/jinja2/filters.py b/jinja2/filters.py index 70bb9482..2b6ef08a 100644 --- a/jinja2/filters.py +++ b/jinja2/filters.py @@ -456,21 +456,22 @@ def do_truncate(s, length=255, killwords=False, end='...'): .. sourcecode:: jinja - {{ "foo bar"|truncate(5) }} + {{ "foo bar baz"|truncate(9) }} + -> "foo ba..." + {{ "foo bar baz"|truncate(9, True) }} -> "foo ..." - {{ "foo bar"|truncate(5, True) }} - -> "foo b..." + """ - if len(s) <= length: + if len(s) <= (length + len(end)): return s elif killwords: - return s[:length] + end + return s[:length - len(end)] + end words = s.split(' ') result = [] m = 0 for word in words: m += len(word) + 1 - if m > length: + if m > (length - len(end)): break result.append(word) result.append(end) diff --git a/jinja2/testsuite/filters.py b/jinja2/testsuite/filters.py index 9d5c9522..49582021 100644 --- a/jinja2/testsuite/filters.py +++ b/jinja2/testsuite/filters.py @@ -227,7 +227,13 @@ class FilterTestCase(JinjaTestCase): ) out = tmpl.render(data='foobar baz bar' * 1000, smalldata='foobar baz bar') - assert out == 'foobar baz barf>>>|foobar baz >>>|foobar baz bar' + msg = 'Current output: %s' % out + assert out == 'foobar baz b>>>|foobar baz >>>|foobar baz bar', msg + + def test_truncate_end_length(self): + tmpl = env.from_string('{{ "Joel is a slug"|truncate(9, true) }}') + out = tmpl.render() + assert out == 'Joel i...', 'Current output: %s' % out def test_upper(self): tmpl = env.from_string('{{ "foo"|upper }}')