Browse files

Template filters now pass numerical arguments through as numbers.

This was the (undocumented) behaviour prior to r10118 and now it's back
again. It's neither hard nor harmful to maintain compatibility with the
old ways.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10169 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
1 parent 7f63d00 commit 2c6c60cec613246bff5cb0be831969c20417b53c @malcolmt malcolmt committed Mar 25, 2009
View
12 django/template/__init__.py
@@ -445,34 +445,36 @@ def value(self):
self.pointer = i
return s
+# This only matches constant *strings* (things in quotes or marked for
+# translation). Numbers are treated as variables for implementation reasons
+# (so that they retain their type when passed to filters).
constant_string = r"""
(?:%(i18n_open)s%(strdq)s%(i18n_close)s|
%(i18n_open)s%(strsq)s%(i18n_close)s|
%(strdq)s|
-%(strsq)s)|
-%(num)s
+%(strsq)s)
""" % {
'strdq': r'"[^"\\]*(?:\\.[^"\\]*)*"', # double-quoted string
'strsq': r"'[^'\\]*(?:\\.[^'\\]*)*'", # single-quoted string
- 'num': r'[-+\.]?\d[\d\.e]*', # numeric constant
'i18n_open' : re.escape("_("),
'i18n_close' : re.escape(")"),
}
constant_string = constant_string.replace("\n", "")
filter_raw_string = r"""
^(?P<constant>%(constant)s)|
-^(?P<var>[%(var_chars)s]+)|
+^(?P<var>[%(var_chars)s]+|%(num)s)|
(?:%(filter_sep)s
(?P<filter_name>\w+)
(?:%(arg_sep)s
(?:
(?P<constant_arg>%(constant)s)|
- (?P<var_arg>[%(var_chars)s]+)
+ (?P<var_arg>[%(var_chars)s]+|%(num)s)
)
)?
)""" % {
'constant': constant_string,
+ 'num': r'[-+\.]?\d[\d\.e]*',
'var_chars': "\w\." ,
'filter_sep': re.escape(FILTER_SEPARATOR),
'arg_sep': re.escape(FILTER_ARGUMENT_SEPARATOR),
View
11 tests/regressiontests/templates/custom.py
@@ -0,0 +1,11 @@
+from django import test
+from django import template
+
+
+custom_filters = """
+>>> t = template.Template("{% load custom %}{{ string|trim:5 }}")
+>>> ctxt = template.Context({"string": "abcdefghijklmnopqrstuvwxyz"})
+>>> t.render(ctxt)
+u"abcde"
+"""
+
View
0 tests/regressiontests/templates/templatetags/__init__.py
No changes.
View
11 tests/regressiontests/templates/templatetags/custom.py
@@ -0,0 +1,11 @@
+from django import template
+from django.template.defaultfilters import stringfilter
+
+register = template.Library()
+
+def trim(value, num):
+ return value[:num]
+trim = stringfilter(trim)
+
+register.filter(trim)
+
View
4 tests/regressiontests/templates/tests.py
@@ -18,9 +18,10 @@
from django.utils.safestring import mark_safe
from django.utils.tzinfo import LocalTimezone
-from unicode import unicode_tests
from context import context_tests
+from custom import custom_filters
from parser import filter_parsing, variable_parsing
+from unicode import unicode_tests
try:
from loaders import *
@@ -34,6 +35,7 @@
'unicode': unicode_tests,
'context': context_tests,
'filter_parsing': filter_parsing,
+ 'custom_filters': custom_filters,
}
#################################

0 comments on commit 2c6c60c

Please sign in to comment.