diff --git a/django/utils/html.py b/django/utils/html.py
index 607362817b..e1860627ce 100644
--- a/django/utils/html.py
+++ b/django/utils/html.py
@@ -53,16 +53,18 @@ def fix_ampersands(value):
def urlize(text, trim_url_limit=None, nofollow=False):
"""
- Converts any URLs in text into clickable links. Works on http://, https:// and
- www. links. Links can have trailing punctuation (periods, commas, close-parens)
- and leading punctuation (opening parens) and it'll still do the right thing.
+ Converts any URLs in text into clickable links. Works on http://, https://
+ and www. links. Links can have trailing punctuation (periods, commas,
+ close-parens) and leading punctuation (opening parens) and it'll still do
+ the right thing.
- If trim_url_limit is not None, the URLs in link text will be limited to
- trim_url_limit characters.
+ If trim_url_limit is not None, the URLs in link text longer than this limit
+ will truncated to trim_url_limit-3 characters and appended with an elipsis.
- If nofollow is True, the URLs in link text will get a rel="nofollow" attribute.
+ If nofollow is True, the URLs in link text will get a rel="nofollow"
+ attribute.
"""
- trim_url = lambda x, limit=trim_url_limit: limit is not None and (x[:limit] + (len(x) >=limit and '...' or '')) or x
+ trim_url = lambda x, limit=trim_url_limit: limit is not None and (len(x) > limit and ('%s...' % x[:max(0, limit - 3)])) or x
words = word_split_re.split(text)
nofollow_attr = nofollow and ' rel="nofollow"' or ''
for i, word in enumerate(words):
diff --git a/docs/templates.txt b/docs/templates.txt
index cb8e238f43..c32b1af1dd 100644
--- a/docs/templates.txt
+++ b/docs/templates.txt
@@ -1266,7 +1266,8 @@ Converts URLs in plain text into clickable links.
urlizetrunc
~~~~~~~~~~~
-Converts URLs into clickable links, truncating URLs to the given character limit.
+Converts URLs into clickable links, truncating URLs longer than the given
+character limit.
**Argument:** Length to truncate URLs to
diff --git a/tests/regressiontests/defaultfilters/tests.py b/tests/regressiontests/defaultfilters/tests.py
index 4a2e9432b0..b35636aba6 100644
--- a/tests/regressiontests/defaultfilters/tests.py
+++ b/tests/regressiontests/defaultfilters/tests.py
@@ -121,7 +121,18 @@ u'\xcb'
'http://short.com/'
>>> urlizetrunc('http://www.google.co.uk/search?hl=en&q=some+long+url&btnG=Search&meta=', 20)
-'http://www.google.co...'
+'http://www.google...'
+
+# Check truncating of URIs which are the exact length
+>>> uri = 'http://31characteruri.com/test/'
+>>> len(uri)
+31
+>>> urlizetrunc(uri, 31)
+'http://31characteruri.com/test/'
+>>> urlizetrunc(uri, 30)
+'http://31characteruri.com/t...'
+>>> urlizetrunc(uri, 2)
+'...'
>>> wordcount('')
0