Author: jezdez
Date: 2010-02-26 11:00:42 -0600 (Fri, 26 Feb 2010)
New Revision: 12610

Modified:
   django/branches/releases/1.1.X/AUTHORS
   django/branches/releases/1.1.X/django/template/__init__.py
   django/branches/releases/1.1.X/tests/regressiontests/templates/parser.py
   django/branches/releases/1.1.X/tests/regressiontests/templates/tests.py
Log:
[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.

Modified: django/branches/releases/1.1.X/AUTHORS
===================================================================
--- django/branches/releases/1.1.X/AUTHORS      2010-02-26 17:00:11 UTC (rev 
12609)
+++ django/branches/releases/1.1.X/AUTHORS      2010-02-26 17:00:42 UTC (rev 
12610)
@@ -445,6 +445,7 @@
     t...@gurgle.no
     David Tulig <david.tu...@gmail.com>
     Amit Upadhyay <http://www.amitu.com/blog/>
+    Adam Vandenberg
     Geert Vanderkelen
     Vasil Vangelovski
     I.S. van Oostveen <v.oostv...@idca.nl>

Modified: django/branches/releases/1.1.X/django/template/__init__.py
===================================================================
--- django/branches/releases/1.1.X/django/template/__init__.py  2010-02-26 
17:00:11 UTC (rev 12609)
+++ django/branches/releases/1.1.X/django/template/__init__.py  2010-02-26 
17:00:42 UTC (rev 12610)
@@ -411,6 +411,20 @@
         "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 @@
             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 @@
             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

Modified: 
django/branches/releases/1.1.X/tests/regressiontests/templates/parser.py
===================================================================
--- django/branches/releases/1.1.X/tests/regressiontests/templates/parser.py    
2010-02-26 17:00:11 UTC (rev 12609)
+++ django/branches/releases/1.1.X/tests/regressiontests/templates/parser.py    
2010-02-26 17:00:42 UTC (rev 12610)
@@ -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
 

Modified: 
django/branches/releases/1.1.X/tests/regressiontests/templates/tests.py
===================================================================
--- django/branches/releases/1.1.X/tests/regressiontests/templates/tests.py     
2010-02-26 17:00:11 UTC (rev 12609)
+++ django/branches/releases/1.1.X/tests/regressiontests/templates/tests.py     
2010-02-26 17:00:42 UTC (rev 12610)
@@ -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,
 }
 

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-upda...@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to