Loading django/template/defaulttags.py +13 −10 Original line number Diff line number Diff line Loading @@ -496,6 +496,7 @@ def autoescape(parser, token): """ Force autoescape behavior for this block. """ # token.split_contents() isn't useful here because this tag doesn't accept variable as arguments args = token.contents.split() if len(args) != 2: raise TemplateSyntaxError("'autoescape' tag requires exactly one argument.") Loading Loading @@ -645,6 +646,7 @@ def do_filter(parser, token): Instead, use the ``autoescape`` tag to manage autoescaping for blocks of template code. """ # token.split_contents() isn't useful here because this tag doesn't accept variable as arguments _, rest = token.contents.split(None, 1) filter_expr = parser.compile_filter("var|%s" % (rest)) for func, unused in filter_expr.filters: Loading Loading @@ -972,7 +974,7 @@ def ifchanged(parser, token): {% endifchanged %} {% endfor %} """ bits = token.contents.split() bits = token.split_contents() nodelist_true = parser.parse(('else', 'endifchanged')) token = parser.next_token() if token.contents == 'else': Loading Loading @@ -1029,6 +1031,7 @@ def load(parser, token): {% load byline from news %} """ # token.split_contents() isn't useful here because this tag doesn't accept variable as arguments bits = token.contents.split() if len(bits) >= 4 and bits[-2] == "from": try: Loading Loading @@ -1127,17 +1130,16 @@ def regroup(parser, token): {% regroup people|dictsort:"gender" by gender as grouped %} """ firstbits = token.contents.split(None, 3) if len(firstbits) != 4: bits = token.split_contents() if len(bits) != 6: raise TemplateSyntaxError("'regroup' tag takes five arguments") target = parser.compile_filter(firstbits[1]) if firstbits[2] != 'by': target = parser.compile_filter(bits[1]) if bits[2] != 'by': raise TemplateSyntaxError("second argument to 'regroup' tag must be 'by'") lastbits_reversed = firstbits[3][::-1].split(None, 2) if lastbits_reversed[1][::-1] != 'as': if bits[4] != 'as': raise TemplateSyntaxError("next-to-last argument to 'regroup' tag must" " be 'as'") var_name = lastbits_reversed[0][::-1] var_name = bits[5] # RegroupNode will take each item in 'target', put it in the context under # 'var_name', evaluate 'var_name'.'expression' in the current context, and # group by the resulting value. After all items are processed, it will Loading @@ -1146,7 +1148,7 @@ def regroup(parser, token): # doesn't provide a context-aware equivalent of Python's getattr. expression = parser.compile_filter(var_name + VARIABLE_ATTRIBUTE_SEPARATOR + lastbits_reversed[2][::-1]) bits[3]) return RegroupNode(target, expression, var_name) @register.tag Loading Loading @@ -1202,6 +1204,7 @@ def templatetag(parser, token): ``closecomment`` ``#}`` ================== ======= """ # token.split_contents() isn't useful here because this tag doesn't accept variable as arguments bits = token.contents.split() if len(bits) != 2: raise TemplateSyntaxError("'templatetag' statement takes one argument") Loading Loading @@ -1343,7 +1346,7 @@ def widthratio(parser, token): the image in the above example will be 88 pixels wide (because 175/200 = .875; .875 * 100 = 87.5 which is rounded up to 88). """ bits = token.contents.split() bits = token.split_contents() if len(bits) != 4: raise TemplateSyntaxError("widthratio takes three arguments") tag, this_value_expr, max_value_expr, max_width = bits Loading django/template/loader_tags.py +1 −0 Original line number Diff line number Diff line Loading @@ -174,6 +174,7 @@ def do_block(parser, token): """ Define a block that can be overridden by child templates. """ # token.split_contents() isn't useful here because this tag doesn't accept variable as arguments bits = token.contents.split() if len(bits) != 2: raise TemplateSyntaxError("'%s' tag takes only one argument" % bits[0]) Loading django/templatetags/cache.py +8 −6 Original line number Diff line number Diff line from __future__ import unicode_literals import hashlib from django.template import Library, Node, TemplateSyntaxError, Variable, VariableDoesNotExist from django.template import resolve_variable from django.template import Library, Node, TemplateSyntaxError, VariableDoesNotExist from django.core.cache import cache from django.utils.encoding import force_bytes from django.utils.http import urlquote Loading @@ -12,7 +11,7 @@ register = Library() class CacheNode(Node): def __init__(self, nodelist, expire_time_var, fragment_name, vary_on): self.nodelist = nodelist self.expire_time_var = Variable(expire_time_var) self.expire_time_var = expire_time_var self.fragment_name = fragment_name self.vary_on = vary_on Loading @@ -26,7 +25,7 @@ class CacheNode(Node): except (ValueError, TypeError): raise TemplateSyntaxError('"cache" tag got a non-integer timeout value: %r' % expire_time) # Build a key for this fragment and all vary-on's. key = ':'.join([urlquote(resolve_variable(var, context)) for var in self.vary_on]) key = ':'.join([urlquote(var.resolve(context)) for var in self.vary_on]) args = hashlib.md5(force_bytes(key)) cache_key = 'template.cache.%s.%s' % (self.fragment_name, args.hexdigest()) value = cache.get(cache_key) Loading Loading @@ -59,7 +58,10 @@ def do_cache(parser, token): """ nodelist = parser.parse(('endcache',)) parser.delete_first_token() tokens = token.contents.split() tokens = token.split_contents() if len(tokens) < 3: raise TemplateSyntaxError("'%r' tag requires at least 2 arguments." % tokens[0]) return CacheNode(nodelist, tokens[1], tokens[2], tokens[3:]) return CacheNode(nodelist, parser.compile_filter(tokens[1]), parser.compile_filter(tokens[2]), [parser.compile_filter(token) for token in tokens[3:]]) django/templatetags/i18n.py +9 −6 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ class GetAvailableLanguagesNode(Node): class GetLanguageInfoNode(Node): def __init__(self, lang_code, variable): self.lang_code = Variable(lang_code) self.lang_code = lang_code self.variable = variable def render(self, context): Loading @@ -35,7 +35,7 @@ class GetLanguageInfoNode(Node): class GetLanguageInfoListNode(Node): def __init__(self, languages, variable): self.languages = Variable(languages) self.languages = languages self.variable = variable def get_language_info(self, language): Loading Loading @@ -185,6 +185,7 @@ def do_get_available_languages(parser, token): your setting file (or the default settings) and put it into the named variable. """ # token.split_contents() isn't useful here because this tag doesn't accept variable as arguments args = token.contents.split() if len(args) != 3 or args[1] != 'as': raise TemplateSyntaxError("'get_available_languages' requires 'as variable' (got %r)" % args) Loading @@ -204,10 +205,10 @@ def do_get_language_info(parser, token): {{ l.name_local }} {{ l.bidi|yesno:"bi-directional,uni-directional" }} """ args = token.contents.split() args = token.split_contents() if len(args) != 5 or args[1] != 'for' or args[3] != 'as': raise TemplateSyntaxError("'%s' requires 'for string as variable' (got %r)" % (args[0], args[1:])) return GetLanguageInfoNode(args[2], args[4]) return GetLanguageInfoNode(parser.compile_filter(args[2]), args[4]) @register.tag("get_language_info_list") def do_get_language_info_list(parser, token): Loading @@ -227,10 +228,10 @@ def do_get_language_info_list(parser, token): {{ l.bidi|yesno:"bi-directional,uni-directional" }} {% endfor %} """ args = token.contents.split() args = token.split_contents() if len(args) != 5 or args[1] != 'for' or args[3] != 'as': raise TemplateSyntaxError("'%s' requires 'for sequence as variable' (got %r)" % (args[0], args[1:])) return GetLanguageInfoListNode(args[2], args[4]) return GetLanguageInfoListNode(parser.compile_filter(args[2]), args[4]) @register.filter def language_name(lang_code): Loading @@ -257,6 +258,7 @@ def do_get_current_language(parser, token): put it's value into the ``language`` context variable. """ # token.split_contents() isn't useful here because this tag doesn't accept variable as arguments args = token.contents.split() if len(args) != 3 or args[1] != 'as': raise TemplateSyntaxError("'get_current_language' requires 'as variable' (got %r)" % args) Loading @@ -275,6 +277,7 @@ def do_get_current_language_bidi(parser, token): put it's value into the ``bidi`` context variable. True indicates right-to-left layout, otherwise left-to-right """ # token.split_contents() isn't useful here because this tag doesn't accept variable as arguments args = token.contents.split() if len(args) != 3 or args[1] != 'as': raise TemplateSyntaxError("'get_current_language_bidi' requires 'as variable' (got %r)" % args) Loading django/templatetags/static.py +1 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ class PrefixNode(template.Node): """ Class method to parse prefix node and return a Node. """ # token.split_contents() isn't useful here because tags using this method don't accept variable as arguments tokens = token.contents.split() if len(tokens) > 1 and tokens[1] != 'as': raise template.TemplateSyntaxError( Loading Loading
django/template/defaulttags.py +13 −10 Original line number Diff line number Diff line Loading @@ -496,6 +496,7 @@ def autoescape(parser, token): """ Force autoescape behavior for this block. """ # token.split_contents() isn't useful here because this tag doesn't accept variable as arguments args = token.contents.split() if len(args) != 2: raise TemplateSyntaxError("'autoescape' tag requires exactly one argument.") Loading Loading @@ -645,6 +646,7 @@ def do_filter(parser, token): Instead, use the ``autoescape`` tag to manage autoescaping for blocks of template code. """ # token.split_contents() isn't useful here because this tag doesn't accept variable as arguments _, rest = token.contents.split(None, 1) filter_expr = parser.compile_filter("var|%s" % (rest)) for func, unused in filter_expr.filters: Loading Loading @@ -972,7 +974,7 @@ def ifchanged(parser, token): {% endifchanged %} {% endfor %} """ bits = token.contents.split() bits = token.split_contents() nodelist_true = parser.parse(('else', 'endifchanged')) token = parser.next_token() if token.contents == 'else': Loading Loading @@ -1029,6 +1031,7 @@ def load(parser, token): {% load byline from news %} """ # token.split_contents() isn't useful here because this tag doesn't accept variable as arguments bits = token.contents.split() if len(bits) >= 4 and bits[-2] == "from": try: Loading Loading @@ -1127,17 +1130,16 @@ def regroup(parser, token): {% regroup people|dictsort:"gender" by gender as grouped %} """ firstbits = token.contents.split(None, 3) if len(firstbits) != 4: bits = token.split_contents() if len(bits) != 6: raise TemplateSyntaxError("'regroup' tag takes five arguments") target = parser.compile_filter(firstbits[1]) if firstbits[2] != 'by': target = parser.compile_filter(bits[1]) if bits[2] != 'by': raise TemplateSyntaxError("second argument to 'regroup' tag must be 'by'") lastbits_reversed = firstbits[3][::-1].split(None, 2) if lastbits_reversed[1][::-1] != 'as': if bits[4] != 'as': raise TemplateSyntaxError("next-to-last argument to 'regroup' tag must" " be 'as'") var_name = lastbits_reversed[0][::-1] var_name = bits[5] # RegroupNode will take each item in 'target', put it in the context under # 'var_name', evaluate 'var_name'.'expression' in the current context, and # group by the resulting value. After all items are processed, it will Loading @@ -1146,7 +1148,7 @@ def regroup(parser, token): # doesn't provide a context-aware equivalent of Python's getattr. expression = parser.compile_filter(var_name + VARIABLE_ATTRIBUTE_SEPARATOR + lastbits_reversed[2][::-1]) bits[3]) return RegroupNode(target, expression, var_name) @register.tag Loading Loading @@ -1202,6 +1204,7 @@ def templatetag(parser, token): ``closecomment`` ``#}`` ================== ======= """ # token.split_contents() isn't useful here because this tag doesn't accept variable as arguments bits = token.contents.split() if len(bits) != 2: raise TemplateSyntaxError("'templatetag' statement takes one argument") Loading Loading @@ -1343,7 +1346,7 @@ def widthratio(parser, token): the image in the above example will be 88 pixels wide (because 175/200 = .875; .875 * 100 = 87.5 which is rounded up to 88). """ bits = token.contents.split() bits = token.split_contents() if len(bits) != 4: raise TemplateSyntaxError("widthratio takes three arguments") tag, this_value_expr, max_value_expr, max_width = bits Loading
django/template/loader_tags.py +1 −0 Original line number Diff line number Diff line Loading @@ -174,6 +174,7 @@ def do_block(parser, token): """ Define a block that can be overridden by child templates. """ # token.split_contents() isn't useful here because this tag doesn't accept variable as arguments bits = token.contents.split() if len(bits) != 2: raise TemplateSyntaxError("'%s' tag takes only one argument" % bits[0]) Loading
django/templatetags/cache.py +8 −6 Original line number Diff line number Diff line from __future__ import unicode_literals import hashlib from django.template import Library, Node, TemplateSyntaxError, Variable, VariableDoesNotExist from django.template import resolve_variable from django.template import Library, Node, TemplateSyntaxError, VariableDoesNotExist from django.core.cache import cache from django.utils.encoding import force_bytes from django.utils.http import urlquote Loading @@ -12,7 +11,7 @@ register = Library() class CacheNode(Node): def __init__(self, nodelist, expire_time_var, fragment_name, vary_on): self.nodelist = nodelist self.expire_time_var = Variable(expire_time_var) self.expire_time_var = expire_time_var self.fragment_name = fragment_name self.vary_on = vary_on Loading @@ -26,7 +25,7 @@ class CacheNode(Node): except (ValueError, TypeError): raise TemplateSyntaxError('"cache" tag got a non-integer timeout value: %r' % expire_time) # Build a key for this fragment and all vary-on's. key = ':'.join([urlquote(resolve_variable(var, context)) for var in self.vary_on]) key = ':'.join([urlquote(var.resolve(context)) for var in self.vary_on]) args = hashlib.md5(force_bytes(key)) cache_key = 'template.cache.%s.%s' % (self.fragment_name, args.hexdigest()) value = cache.get(cache_key) Loading Loading @@ -59,7 +58,10 @@ def do_cache(parser, token): """ nodelist = parser.parse(('endcache',)) parser.delete_first_token() tokens = token.contents.split() tokens = token.split_contents() if len(tokens) < 3: raise TemplateSyntaxError("'%r' tag requires at least 2 arguments." % tokens[0]) return CacheNode(nodelist, tokens[1], tokens[2], tokens[3:]) return CacheNode(nodelist, parser.compile_filter(tokens[1]), parser.compile_filter(tokens[2]), [parser.compile_filter(token) for token in tokens[3:]])
django/templatetags/i18n.py +9 −6 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ class GetAvailableLanguagesNode(Node): class GetLanguageInfoNode(Node): def __init__(self, lang_code, variable): self.lang_code = Variable(lang_code) self.lang_code = lang_code self.variable = variable def render(self, context): Loading @@ -35,7 +35,7 @@ class GetLanguageInfoNode(Node): class GetLanguageInfoListNode(Node): def __init__(self, languages, variable): self.languages = Variable(languages) self.languages = languages self.variable = variable def get_language_info(self, language): Loading Loading @@ -185,6 +185,7 @@ def do_get_available_languages(parser, token): your setting file (or the default settings) and put it into the named variable. """ # token.split_contents() isn't useful here because this tag doesn't accept variable as arguments args = token.contents.split() if len(args) != 3 or args[1] != 'as': raise TemplateSyntaxError("'get_available_languages' requires 'as variable' (got %r)" % args) Loading @@ -204,10 +205,10 @@ def do_get_language_info(parser, token): {{ l.name_local }} {{ l.bidi|yesno:"bi-directional,uni-directional" }} """ args = token.contents.split() args = token.split_contents() if len(args) != 5 or args[1] != 'for' or args[3] != 'as': raise TemplateSyntaxError("'%s' requires 'for string as variable' (got %r)" % (args[0], args[1:])) return GetLanguageInfoNode(args[2], args[4]) return GetLanguageInfoNode(parser.compile_filter(args[2]), args[4]) @register.tag("get_language_info_list") def do_get_language_info_list(parser, token): Loading @@ -227,10 +228,10 @@ def do_get_language_info_list(parser, token): {{ l.bidi|yesno:"bi-directional,uni-directional" }} {% endfor %} """ args = token.contents.split() args = token.split_contents() if len(args) != 5 or args[1] != 'for' or args[3] != 'as': raise TemplateSyntaxError("'%s' requires 'for sequence as variable' (got %r)" % (args[0], args[1:])) return GetLanguageInfoListNode(args[2], args[4]) return GetLanguageInfoListNode(parser.compile_filter(args[2]), args[4]) @register.filter def language_name(lang_code): Loading @@ -257,6 +258,7 @@ def do_get_current_language(parser, token): put it's value into the ``language`` context variable. """ # token.split_contents() isn't useful here because this tag doesn't accept variable as arguments args = token.contents.split() if len(args) != 3 or args[1] != 'as': raise TemplateSyntaxError("'get_current_language' requires 'as variable' (got %r)" % args) Loading @@ -275,6 +277,7 @@ def do_get_current_language_bidi(parser, token): put it's value into the ``bidi`` context variable. True indicates right-to-left layout, otherwise left-to-right """ # token.split_contents() isn't useful here because this tag doesn't accept variable as arguments args = token.contents.split() if len(args) != 3 or args[1] != 'as': raise TemplateSyntaxError("'get_current_language_bidi' requires 'as variable' (got %r)" % args) Loading
django/templatetags/static.py +1 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ class PrefixNode(template.Node): """ Class method to parse prefix node and return a Node. """ # token.split_contents() isn't useful here because tags using this method don't accept variable as arguments tokens = token.contents.split() if len(tokens) > 1 and tokens[1] != 'as': raise template.TemplateSyntaxError( Loading