summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2007-05-19 00:17:23 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2007-05-19 00:17:23 +0000
commit3d74a68a5108b49ccca20482d1fde88e4f3cbdfd (patch)
tree29a11bf542b57362bd07b946baa0eb2e12414a2a
parent68a0f4f51b209c9daa2dc6ff31690c273979282c (diff)
unicode: Fixed iri_to_uri() to be not quite as broken (I think it's spec
compliant now). Removed use of iri_to_uri() in the urlencode filter and made a new iriencode filter, because IRI->URI conversionis are not a superset of URL quoting converstions. git-svn-id: http://code.djangoproject.com/svn/django/branches/unicode@5283 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/template/defaultfilters.py10
-rw-r--r--django/utils/encoding.py5
-rw-r--r--tests/regressiontests/defaultfilters/tests.py2
3 files changed, 13 insertions, 4 deletions
diff --git a/django/template/defaultfilters.py b/django/template/defaultfilters.py
index e85780ab79..6414724c64 100644
--- a/django/template/defaultfilters.py
+++ b/django/template/defaultfilters.py
@@ -3,7 +3,7 @@
from django.template import resolve_variable, Library
from django.conf import settings
from django.utils.translation import ugettext, ungettext
-from django.utils.encoding import smart_unicode, smart_str
+from django.utils.encoding import smart_unicode, smart_str, iri_to_uri
import re
import random as random_module
@@ -84,6 +84,11 @@ def floatformat(text, arg=-1):
formatstr = u'%%.%df' % abs(d)
return formatstr % f
+def iriencode(value):
+ "Escapes an IRI value for use in a URL"
+ return smart_unicode(iri_to_uri(value))
+iriencode = stringfilter(iriencode)
+
def linenumbers(value):
"Displays text with line numbers"
from django.utils.html import escape
@@ -170,7 +175,7 @@ upper = stringfilter(upper)
def urlencode(value):
"Escapes a value for use in a URL"
import urllib
- return smart_unicode(urllib.quote(smart_str(value)))
+ return smart_unicode(urllib.quote(value))
urlencode = stringfilter(urlencode)
def urlize(value):
@@ -566,6 +571,7 @@ register.filter(first)
register.filter(fix_ampersands)
register.filter(floatformat)
register.filter(get_digit)
+register.filter(iriencode)
register.filter(join)
register.filter(length)
register.filter(length_is)
diff --git a/django/utils/encoding.py b/django/utils/encoding.py
index 7466e02300..5bb23a28bf 100644
--- a/django/utils/encoding.py
+++ b/django/utils/encoding.py
@@ -66,5 +66,8 @@ def iri_to_uri(iri):
Returns an ASCII string containing the encoded result.
"""
- return urllib.quote(smart_str(iri), safe='/#%[]')
+ # The list of safe characters here is constructed from the printable ASCII
+ # characters that are not explicitly excluded by the list at the end of
+ # section 3.1 of RFC 3987.
+ return urllib.quote(smart_str(iri), safe='/#%[]=:;$&()+,!?')
diff --git a/tests/regressiontests/defaultfilters/tests.py b/tests/regressiontests/defaultfilters/tests.py
index 2e6c565eb7..fb35448edb 100644
--- a/tests/regressiontests/defaultfilters/tests.py
+++ b/tests/regressiontests/defaultfilters/tests.py
@@ -115,7 +115,7 @@ u'\xcb'
u'jack%20%26%20jill'
>>> urlencode(1)
u'1'
->>> urlencode(u'S\xf8r-Tr\xf8ndelag')
+>>> iriencode(u'S\xf8r-Tr\xf8ndelag')
u'S%C3%B8r-Tr%C3%B8ndelag'
>>> urlizetrunc(u'http://short.com/', 20)