live up to @mitsuhiko's ridiculous expectations
[jinja2.git] / jinja2 / filters.py
index c170f510f2a9fcda735af577b7a34b89706e4154..69e67e2913974f6fe7a3f5d088d2c266bcc8de21 100644 (file)
@@ -71,8 +71,22 @@ def do_forceescape(value):
     return escape(unicode(value))
 
 def do_urlescape(value):
-    """Escape for use in URLs."""
-    return urllib.quote(value.encode('utf8'))
+    """Escape strings for use in URLs (uses UTF-8 encoding)."""
+    def utf8(o):
+        return unicode(o).encode('utf8')
+    
+    if isinstance(value, basestring):
+        return urllib.quote(utf8(value))
+    
+    if hasattr(value, 'items'):
+        # convert dictionaries to list of 2-tuples
+        value = value.items()
+    
+    if hasattr(value, 'next'):
+        # convert generators to list
+        value = list(value)
+    
+    return urllib.urlencode([(utf8(k), utf8(v)) for (k, v) in value])
 
 @evalcontextfilter
 def do_replace(eval_ctx, s, old, new, count=None):
@@ -802,8 +816,5 @@ FILTERS = {
     'groupby':              do_groupby,
     'safe':                 do_mark_safe,
     'xmlattr':              do_xmlattr,
-    'urlescape':            do_urlescape,
-    'urle':                 do_urlescape,
-    'urlencode':            do_urlescape,
-    'urlquote':             do_urlescape
+    'urlescape':            do_urlescape
 }