Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

[1.1.X] Fixed #5971 - Fixed inconsistent behaviour of the TokenParser…

… when parsing filters that follow constant strings or variables. Thanks Dmitri Fedortchenko, Adam Vandenberg and Ramiro Morales.

Backport of r12471.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@12610 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 7c23a5303cb5b5d01e6fb25d30676a5e95db2ecc 1 parent 079d9f3
@jezdez jezdez authored
View
1  AUTHORS
@@ -445,6 +445,7 @@ answer newbie questions, and generally made Django that much better:
tt@gurgle.no
David Tulig <david.tulig@gmail.com>
Amit Upadhyay <http://www.amitu.com/blog/>
+ Adam Vandenberg
Geert Vanderkelen
Vasil Vangelovski
I.S. van Oostveen <v.oostveen@idca.nl>
View
28 django/template/__init__.py
@@ -411,6 +411,20 @@ def value(self):
"A microparser that parses for a value: some string constant or variable name."
subject = self.subject
i = self.pointer
+
+ def next_space_index(subject, i):
+ "Increment pointer until a real space (i.e. a space not within quotes) is encountered"
+ while i < len(subject) and subject[i] not in (' ', '\t'):
+ if subject[i] in ('"', "'"):
+ c = subject[i]
+ i += 1
+ while i < len(subject) and subject[i] != c:
+ i += 1
+ if i >= len(subject):
+ raise TemplateSyntaxError("Searching for value. Unexpected end of string in column %d: %s" % (i, subject))
+ i += 1
+ return i
+
if i >= len(subject):
raise TemplateSyntaxError("Searching for value. Expected another value but found end of string: %s" % subject)
if subject[i] in ('"', "'"):
@@ -421,6 +435,10 @@ def value(self):
if i >= len(subject):
raise TemplateSyntaxError("Searching for value. Unexpected end of string in column %d: %s" % (i, subject))
i += 1
+
+ # Continue parsing until next "real" space, so that filters are also included
+ i = next_space_index(subject, i)
+
res = subject[p:i]
while i < len(subject) and subject[i] in (' ', '\t'):
i += 1
@@ -429,15 +447,7 @@ def value(self):
return res
else:
p = i
- while i < len(subject) and subject[i] not in (' ', '\t'):
- if subject[i] in ('"', "'"):
- c = subject[i]
- i += 1
- while i < len(subject) and subject[i] != c:
- i += 1
- if i >= len(subject):
- raise TemplateSyntaxError("Searching for value. Unexpected end of string in column %d: %s" % (i, subject))
- i += 1
+ i = next_space_index(subject, i)
s = subject[p:i]
while i < len(subject) and subject[i] in (' ', '\t'):
i += 1
View
49 tests/regressiontests/templates/parser.py
@@ -2,6 +2,55 @@
Testing some internals of the template processing. These are *not* examples to be copied in user code.
"""
+token_parsing=r"""
+Tests for TokenParser behavior in the face of quoted strings with spaces.
+
+>>> from django.template import TokenParser
+
+
+Test case 1: {% tag thevar|filter sometag %}
+
+>>> p = TokenParser("tag thevar|filter sometag")
+>>> p.tagname
+'tag'
+>>> p.value()
+'thevar|filter'
+>>> p.more()
+True
+>>> p.tag()
+'sometag'
+>>> p.more()
+False
+
+Test case 2: {% tag "a value"|filter sometag %}
+
+>>> p = TokenParser('tag "a value"|filter sometag')
+>>> p.tagname
+'tag'
+>>> p.value()
+'"a value"|filter'
+>>> p.more()
+True
+>>> p.tag()
+'sometag'
+>>> p.more()
+False
+
+Test case 3: {% tag 'a value'|filter sometag %}
+
+>>> p = TokenParser("tag 'a value'|filter sometag")
+>>> p.tagname
+'tag'
+>>> p.value()
+"'a value'|filter"
+>>> p.more()
+True
+>>> p.tag()
+'sometag'
+>>> p.more()
+False
+"""
+
filter_parsing = r"""
>>> from django.template import FilterExpression, Parser
View
4 tests/regressiontests/templates/tests.py
@@ -22,7 +22,7 @@
from context import context_tests
from custom import custom_filters
-from parser import filter_parsing, variable_parsing
+from parser import token_parsing, filter_parsing, variable_parsing
from unicode import unicode_tests
try:
@@ -36,7 +36,9 @@
__test__ = {
'unicode': unicode_tests,
'context': context_tests,
+ 'token_parsing': token_parsing,
'filter_parsing': filter_parsing,
+ 'variable_parsing': variable_parsing,
'custom_filters': custom_filters,
}
Please sign in to comment.
Something went wrong with that request. Please try again.