Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

[1.0.X] Fixed #9315 -- Handle spaces in URL tag arguments.

Thanks Natalia Bidart and Matías Bordese for most of this patch.

Backport of r10462 from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@10463 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit dd7198701a38519f1844376873d783aee5b094d6 1 parent 6c45765
Malcolm Tredinnick malcolmt authored
2  AUTHORS
View
@@ -59,11 +59,13 @@ answer newbie questions, and generally made Django that much better:
James Bennett
Julian Bez
Arvis Bickovskis <viestards.lists@gmail.com>
+ Natalia Bidart
Paul Bissex <http://e-scribe.com/>
Simon Blanchard
David Blewett <david@dawninglight.net>
Matt Boersma <matt@sprout.org>
boobsd@gmail.com
+ Matías Bordese
Andrew Brehaut <http://brehaut.net/blog>
brut.alll@gmail.com
btoll@bestweb.net
3  django/template/__init__.py
View
@@ -465,8 +465,7 @@ def value(self):
'i18n_close' : re.escape(")"),
}
-filter_raw_string = filter_raw_string.replace("\n", "").replace(" ", "")
-filter_re = re.compile(filter_raw_string, re.UNICODE)
+filter_re = re.compile(filter_raw_string, re.UNICODE|re.VERBOSE)
class FilterExpression(object):
"""
2  django/template/defaulttags.py
View
@@ -1066,7 +1066,7 @@ def url(parser, token):
The URL will look like ``/clients/client/123/``.
"""
- bits = token.contents.split(' ')
+ bits = token.split_contents()
if len(bits) < 2:
raise TemplateSyntaxError("'%s' takes at least one argument"
" (path to a view)" % bits[0])
8 django/utils/text.py
View
@@ -197,7 +197,13 @@ def fix(match):
return str(ustring_re.sub(fix, s))
javascript_quote = allow_lazy(javascript_quote, unicode)
-smart_split_re = re.compile('("(?:[^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'(?:[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'|[^\\s]+)')
+# Expression to match some_token and some_token="with spaces" (and similarly
+# for single-quoted strings).
+smart_split_re = re.compile(r"""
+ ([^\s"]*"(?:[^"\\]*(?:\\.[^"\\]*)*)"\S*|
+ [^\s']*'(?:[^'\\]*(?:\\.[^'\\]*)*)'\S*|
+ \S+)""", re.VERBOSE)
+
def smart_split(text):
r"""
Generator that splits a string by spaces, leaving quoted phrases together.
1  tests/regressiontests/templates/tests.py
View
@@ -947,6 +947,7 @@ def get_template_tests(self):
'url07': (u'{% url regressiontests.templates.views.client2 tag=v %}', {'v': u'Ω'}, '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'),
'url08': (u'{% url метка_оператора v %}', {'v': 'Ω'}, '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'),
'url09': (u'{% url метка_оператора_2 tag=v %}', {'v': 'Ω'}, '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'),
+ 'url10': ('{% url regressiontests.templates.views.client_action id=client.id,action="two words" %}', {'client': {'id': 1}}, '/url_tag/client/1/two%20words/'),
# Failures
'url-fail01': ('{% url %}', {}, template.TemplateSyntaxError),
12 tests/regressiontests/text/tests.py
View
@@ -15,6 +15,18 @@
[u'"a', u"'one"]
>>> print list(smart_split(r'''all friends' tests'''))[1]
friends'
+>>> list(smart_split(u'url search_page words="something else"'))
+[u'url', u'search_page', u'words="something else"']
+>>> list(smart_split(u"url search_page words='something else'"))
+[u'url', u'search_page', u"words='something else'"]
+>>> list(smart_split(u'url search_page words "something else"'))
+[u'url', u'search_page', u'words', u'"something else"']
+>>> list(smart_split(u'url search_page words-"something else"'))
+[u'url', u'search_page', u'words-"something else"']
+>>> list(smart_split(u'url search_page words=hello'))
+[u'url', u'search_page', u'words=hello']
+>>> list(smart_split(u'url search_page words="something else'))
+[u'url', u'search_page', u'words="something', u'else']
### urlquote #############################################################
>>> from django.utils.http import urlquote, urlquote_plus
Please sign in to comment.
Something went wrong with that request. Please try again.