Commit 2c6c60ce authored by Malcolm Tredinnick's avatar Malcolm Tredinnick
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
parent 7f63d000
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -445,16 +445,17 @@ class TokenParser(object):
            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(")"),
    }
@@ -462,17 +463,18 @@ 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),
+11 −0
Original line number Diff line number Diff line
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"
"""
+0 −0

Empty file added.

+11 −0
Original line number Diff line number Diff line
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)
+3 −1
Original line number Diff line number Diff line
@@ -18,9 +18,10 @@ from django.utils.translation import activate, deactivate, ugettext as _
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 @@ __test__ = {
    'unicode': unicode_tests,
    'context': context_tests,
    'filter_parsing': filter_parsing,
    'custom_filters': custom_filters,
}

#################################