Skip to content

Commit

Permalink
Template filters now pass numerical arguments through as numbers.
Browse files Browse the repository at this point in the history
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
malcolmt committed Mar 25, 2009
1 parent 7f63d00 commit 2c6c60c
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 6 deletions.
12 changes: 7 additions & 5 deletions django/template/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
11 changes: 11 additions & 0 deletions tests/regressiontests/templates/custom.py
Original file line number Diff line number Diff line change
@@ -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"
"""

Empty file.
11 changes: 11 additions & 0 deletions tests/regressiontests/templates/templatetags/custom.py
Original file line number Diff line number Diff line change
@@ -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)

4 changes: 3 additions & 1 deletion tests/regressiontests/templates/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 *
Expand All @@ -34,6 +35,7 @@
'unicode': unicode_tests,
'context': context_tests,
'filter_parsing': filter_parsing,
'custom_filters': custom_filters,
}

#################################
Expand Down

0 comments on commit 2c6c60c

Please sign in to comment.