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.