Code

Ticket #1199: ticket-1199.patch

File ticket-1199.patch, 3.9 KB (added by Jan Rademaker <j.rademaker@…>, 6 years ago)

Updated insin's patch to revision 7397 + a bugfix

  • django/template/__init__.py

     
    438438 (?:%(filter_sep)s 
    439439     (?P<filter_name>\w+) 
    440440         (?:%(arg_sep)s 
     441           (?P<args> 
    441442             (?: 
    442               %(i18n_open)s"(?P<i18n_arg>%(str)s)"%(i18n_close)s| 
    443               "(?P<constant_arg>%(str)s)"| 
    444               (?P<var_arg>[%(var_chars)s]+) 
     443              %(i18n_open)s"%(str)s"%(i18n_close)s| 
     444              "%(str)s"| 
     445              [%(var_chars)s]+ 
    445446             ) 
     447             (?: 
     448              ,%(i18n_open)s"%(str)s"%(i18n_close)s| 
     449              ,"%(str)s"| 
     450              ,[%(var_chars)s]+ 
     451             )* 
     452           ) 
    446453         )? 
    447454 )""" % { 
    448455    'str': r"""[^"\\]*(?:\\.[^"\\]*)*""", 
     
    456463filter_raw_string = filter_raw_string.replace("\n", "").replace(" ", "") 
    457464filter_re = re.compile(filter_raw_string, re.UNICODE) 
    458465 
     466arg_raw_string = r""" 
     467%(i18n_open)s"(?P<i18n_arg>%(str)s)"%(i18n_close)s| 
     468"(?P<constant_arg>%(str)s)"| 
     469(?P<var_arg>[%(var_chars)s]+)""" % { 
     470    'str': r"""[^"\\]*(?:\\.[^"\\]*)*""", 
     471    'var_chars': "\w\." , 
     472    'i18n_open' : re.escape("_("), 
     473    'i18n_close' : re.escape(")"), 
     474  } 
     475 
     476arg_raw_string = arg_raw_string.replace("\n", "").replace(" ", "") 
     477arg_re = re.compile(arg_raw_string, re.UNICODE) 
     478 
    459479class FilterExpression(object): 
    460480    """ 
    461481    Parses a variable token and its optional filters (all as a single string), 
     
    497517            else: 
    498518                filter_name = match.group("filter_name") 
    499519                args = [] 
    500                 constant_arg, i18n_arg, var_arg = match.group("constant_arg", "i18n_arg", "var_arg") 
    501                 if i18n_arg: 
    502                     args.append((False, _(i18n_arg.replace(r'\"', '"')))) 
    503                 elif constant_arg is not None: 
    504                     args.append((False, constant_arg.replace(r'\"', '"'))) 
    505                 elif var_arg: 
    506                     args.append((True, Variable(var_arg))) 
     520                arg_group = match.group("args") 
     521                if arg_group: 
     522                    for arg_match in arg_re.finditer(arg_group): 
     523                        constant_arg, i18n_arg, var_arg = arg_match.group("constant_arg", "i18n_arg", "var_arg") 
     524                        if i18n_arg: 
     525                            args.append((False, _(i18n_arg.replace(r'\"', '"')))) 
     526                        elif constant_arg is not None: 
     527                            args.append((False, constant_arg.replace(r'\"', '"'))) 
     528                        elif var_arg: 
     529                            args.append((True, Variable(var_arg))) 
    507530                filter_func = parser.find_filter(filter_name) 
    508531                self.args_check(filter_name,filter_func, args) 
    509532                filters.append( (filter_func,args)) 
  • tests/regressiontests/templates/tests.py

     
    4545 
    4646register.tag("echo", do_echo) 
    4747 
     48def multi_args(inp, arg1, const1, const2, i18n):  
     49    return u"%s %s %s %s %s" % (inp, arg1, const1, const2, i18n) 
     50 
     51register.filter("multi_args", multi_args) 
     52 
    4853template.libraries['django.templatetags.testtags'] = register 
    4954 
    5055##################################### 
     
    359364 
    360365            # Numbers as filter arguments should work 
    361366            'filter-syntax19': ('{{ var|truncatewords:1 }}', {"var": "hello world"}, "hello ..."), 
     367             
     368            # Filters can accept multiple arguments  
     369            'filter-syntax20': ('{% load testtags %}{{ var1|multi_args:var2,",",12,_("bar")}}', {'var1': 99, 'var2': 'foo'}, "99 foo , 12 bar"), 
    362370 
    363371            ### COMMENT SYNTAX ######################################################## 
    364372            'comment-syntax01': ("{# this is hidden #}hello", {}, "hello"),