Fixed #9315 -- Handle spaces in URL tag arguments.
Thanks Natalia Bidart and Matías Bordese for most of this patch. git-svn-id: http://code.djangoproject.com/svn/django/trunk@10462 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
f6309cbf80
commit
be4a83c448
2
AUTHORS
2
AUTHORS
|
@ -63,11 +63,13 @@ answer newbie questions, and generally made Django that much better:
|
||||||
James Bennett
|
James Bennett
|
||||||
Julian Bez
|
Julian Bez
|
||||||
Arvis Bickovskis <viestards.lists@gmail.com>
|
Arvis Bickovskis <viestards.lists@gmail.com>
|
||||||
|
Natalia Bidart
|
||||||
Paul Bissex <http://e-scribe.com/>
|
Paul Bissex <http://e-scribe.com/>
|
||||||
Simon Blanchard
|
Simon Blanchard
|
||||||
David Blewett <david@dawninglight.net>
|
David Blewett <david@dawninglight.net>
|
||||||
Matt Boersma <matt@sprout.org>
|
Matt Boersma <matt@sprout.org>
|
||||||
boobsd@gmail.com
|
boobsd@gmail.com
|
||||||
|
Matías Bordese
|
||||||
Andrew Brehaut <http://brehaut.net/blog>
|
Andrew Brehaut <http://brehaut.net/blog>
|
||||||
brut.alll@gmail.com
|
brut.alll@gmail.com
|
||||||
btoll@bestweb.net
|
btoll@bestweb.net
|
||||||
|
|
|
@ -480,8 +480,7 @@ filter_raw_string = r"""
|
||||||
'arg_sep': re.escape(FILTER_ARGUMENT_SEPARATOR),
|
'arg_sep': re.escape(FILTER_ARGUMENT_SEPARATOR),
|
||||||
}
|
}
|
||||||
|
|
||||||
filter_raw_string = filter_raw_string.replace("\n", "").replace(" ", "")
|
filter_re = re.compile(filter_raw_string, re.UNICODE|re.VERBOSE)
|
||||||
filter_re = re.compile(filter_raw_string, re.UNICODE)
|
|
||||||
|
|
||||||
class FilterExpression(object):
|
class FilterExpression(object):
|
||||||
r"""
|
r"""
|
||||||
|
|
|
@ -1100,7 +1100,7 @@ def url(parser, token):
|
||||||
|
|
||||||
The URL will look like ``/clients/client/123/``.
|
The URL will look like ``/clients/client/123/``.
|
||||||
"""
|
"""
|
||||||
bits = token.contents.split(' ')
|
bits = token.split_contents()
|
||||||
if len(bits) < 2:
|
if len(bits) < 2:
|
||||||
raise TemplateSyntaxError("'%s' takes at least one argument"
|
raise TemplateSyntaxError("'%s' takes at least one argument"
|
||||||
" (path to a view)" % bits[0])
|
" (path to a view)" % bits[0])
|
||||||
|
|
|
@ -197,7 +197,13 @@ def javascript_quote(s, quote_double_quotes=False):
|
||||||
return str(ustring_re.sub(fix, s))
|
return str(ustring_re.sub(fix, s))
|
||||||
javascript_quote = allow_lazy(javascript_quote, unicode)
|
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):
|
def smart_split(text):
|
||||||
r"""
|
r"""
|
||||||
Generator that splits a string by spaces, leaving quoted phrases together.
|
Generator that splits a string by spaces, leaving quoted phrases together.
|
||||||
|
|
|
@ -974,6 +974,7 @@ class Templates(unittest.TestCase):
|
||||||
'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/'),
|
'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/'),
|
'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/'),
|
'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
|
# Failures
|
||||||
'url-fail01': ('{% url %}', {}, template.TemplateSyntaxError),
|
'url-fail01': ('{% url %}', {}, template.TemplateSyntaxError),
|
||||||
|
|
|
@ -15,6 +15,18 @@ r"""
|
||||||
[u'"a', u"'one"]
|
[u'"a', u"'one"]
|
||||||
>>> print list(smart_split(r'''all friends' tests'''))[1]
|
>>> print list(smart_split(r'''all friends' tests'''))[1]
|
||||||
friends'
|
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 #############################################################
|
### urlquote #############################################################
|
||||||
>>> from django.utils.http import urlquote, urlquote_plus
|
>>> from django.utils.http import urlquote, urlquote_plus
|
||||||
|
|
Loading…
Reference in New Issue