1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# -*- coding: utf-8 -*- 2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler""" 3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jinja2.nodes 4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ~~~~~~~~~~~~ 5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler This module implements additional nodes derived from the ast base node. 7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler It also provides some node tree helper functions like `in_lineno` and 9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler `get_nodes` used by the parser and translator in order to normalize 10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler python and jinja nodes. 11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler :copyright: (c) 2010 by the Jinja Team. 13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler :license: BSD, see LICENSE for more details. 14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler""" 15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerimport operator 16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerfrom collections import deque 18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerfrom jinja2.utils import Markup 19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerfrom jinja2._compat import next, izip, with_metaclass, text_type, \ 20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler method_type, function_type 21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#: the types we support for context functions 24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler_context_function_types = (function_type, method_type) 25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler_binop_to_func = { 28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler '*': operator.mul, 29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler '/': operator.truediv, 30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler '//': operator.floordiv, 31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler '**': operator.pow, 32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler '%': operator.mod, 33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler '+': operator.add, 34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler '-': operator.sub 35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler_uaop_to_func = { 38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 'not': operator.not_, 39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler '+': operator.pos, 40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler '-': operator.neg 41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler_cmpop_to_func = { 44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 'eq': operator.eq, 45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 'ne': operator.ne, 46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 'gt': operator.gt, 47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 'gteq': operator.ge, 48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 'lt': operator.lt, 49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 'lteq': operator.le, 50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 'in': lambda a, b: a in b, 51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 'notin': lambda a, b: a not in b 52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Impossible(Exception): 56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Raised if the node could not perform a requested action.""" 57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass NodeType(type): 60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """A metaclass for nodes that handles the field and attribute 61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler inheritance. fields and attributes from the parent class are 62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler automatically forwarded to the child.""" 63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def __new__(cls, name, bases, d): 65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for attr in 'fields', 'attributes': 66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler storage = [] 67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler storage.extend(getattr(bases[0], attr, ())) 68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler storage.extend(d.get(attr, ())) 69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler assert len(bases) == 1, 'multiple inheritance not allowed' 70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler assert len(storage) == len(set(storage)), 'layout conflict' 71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler d[attr] = tuple(storage) 72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler d.setdefault('abstract', False) 73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return type.__new__(cls, name, bases, d) 74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass EvalContext(object): 77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Holds evaluation time information. Custom attributes can be attached 78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler to it in extensions. 79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def __init__(self, environment, template_name=None): 82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler self.environment = environment 83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if callable(environment.autoescape): 84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler self.autoescape = environment.autoescape(template_name) 85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else: 86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler self.autoescape = environment.autoescape 87793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler self.volatile = False 88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def save(self): 90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return self.__dict__.copy() 91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def revert(self, old): 93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler self.__dict__.clear() 94793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler self.__dict__.update(old) 95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdef get_eval_context(node, ctx): 98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if ctx is None: 99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if node.environment is None: 100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise RuntimeError('if no eval context is passed, the ' 101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 'node must have an attached ' 102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 'environment.') 103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return EvalContext(node.environment) 104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return ctx 105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Node(with_metaclass(NodeType, object)): 108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Baseclass for all Jinja2 nodes. There are a number of nodes available 109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler of different types. There are four major types: 110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler - :class:`Stmt`: statements 112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler - :class:`Expr`: expressions 113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler - :class:`Helper`: helper nodes 114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler - :class:`Template`: the outermost wrapper node 115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler All nodes have fields and attributes. Fields may be other nodes, lists, 117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler or arbitrary values. Fields are passed to the constructor as regular 118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler positional arguments, attributes as keyword arguments. Each node has 119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler two attributes: `lineno` (the line number of the node) and `environment`. 120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler The `environment` attribute is set at the end of the parsing process for 121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler all nodes automatically. 122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = () 124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler attributes = ('lineno', 'environment') 125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler abstract = True 126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def __init__(self, *fields, **attributes): 128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if self.abstract: 129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise TypeError('abstract nodes are not instanciable') 130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if fields: 131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if len(fields) != len(self.fields): 132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if not self.fields: 133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise TypeError('%r takes 0 arguments' % 134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler self.__class__.__name__) 135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise TypeError('%r takes 0 or %d argument%s' % ( 136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler self.__class__.__name__, 137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler len(self.fields), 138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler len(self.fields) != 1 and 's' or '' 139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler )) 140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for name, arg in izip(self.fields, fields): 141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler setattr(self, name, arg) 142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for attr in self.attributes: 143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler setattr(self, attr, attributes.pop(attr, None)) 144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if attributes: 145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise TypeError('unknown attribute %r' % 146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler next(iter(attributes))) 147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def iter_fields(self, exclude=None, only=None): 149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """This method iterates over all fields that are defined and yields 150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ``(key, value)`` tuples. Per default all fields are returned, but 151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler it's possible to limit that to some fields by providing the `only` 152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler parameter or to exclude some using the `exclude` parameter. Both 153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler should be sets or tuples of field names. 154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for name in self.fields: 156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (exclude is only is None) or \ 157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (exclude is not None and name not in exclude) or \ 158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (only is not None and name in only): 159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try: 160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler yield name, getattr(self, name) 161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler except AttributeError: 162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pass 163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def iter_child_nodes(self, exclude=None, only=None): 165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Iterates over all direct child nodes of the node. This iterates 166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler over all fields and yields the values of they are nodes. If the value 167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler of a field is a list all the nodes in that list are returned. 168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for field, item in self.iter_fields(exclude, only): 170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if isinstance(item, list): 171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for n in item: 172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if isinstance(n, Node): 173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler yield n 174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler elif isinstance(item, Node): 175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler yield item 176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def find(self, node_type): 178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Find the first node of a given type. If no such node exists the 179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return value is `None`. 180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for result in self.find_all(node_type): 182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return result 183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def find_all(self, node_type): 185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Find all the nodes of a given type. If the type is a tuple, 186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler the check is performed for any of the tuple items. 187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for child in self.iter_child_nodes(): 189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if isinstance(child, node_type): 190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler yield child 191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for result in child.find_all(node_type): 192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler yield result 193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def set_ctx(self, ctx): 195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Reset the context of a node and all child nodes. Per default the 196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler parser will all generate nodes that have a 'load' context as it's the 197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler most common one. This method is used in the parser to set assignment 198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler targets and other nodes to a store context. 199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler todo = deque([self]) 201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler while todo: 202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler node = todo.popleft() 203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if 'ctx' in node.fields: 204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler node.ctx = ctx 205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler todo.extend(node.iter_child_nodes()) 206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return self 207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def set_lineno(self, lineno, override=False): 209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Set the line numbers of the node and children.""" 210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler todo = deque([self]) 211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler while todo: 212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler node = todo.popleft() 213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if 'lineno' in node.attributes: 214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if node.lineno is None or override: 215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler node.lineno = lineno 216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler todo.extend(node.iter_child_nodes()) 217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return self 218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def set_environment(self, environment): 220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Set the environment for all nodes.""" 221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler todo = deque([self]) 222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler while todo: 223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler node = todo.popleft() 224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler node.environment = environment 225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler todo.extend(node.iter_child_nodes()) 226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return self 227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def __eq__(self, other): 229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return type(self) is type(other) and \ 230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tuple(self.iter_fields()) == tuple(other.iter_fields()) 231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def __ne__(self, other): 233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return not self.__eq__(other) 234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler # Restore Python 2 hashing behavior on Python 3 236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __hash__ = object.__hash__ 237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def __repr__(self): 239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return '%s(%s)' % ( 240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler self.__class__.__name__, 241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ', '.join('%s=%r' % (arg, getattr(self, arg, None)) for 242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler arg in self.fields) 243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ) 244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Stmt(Node): 247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Base node for all statements.""" 248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler abstract = True 249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Helper(Node): 252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Nodes that exist in a specific context only.""" 253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler abstract = True 254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Template(Node): 257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Node that represents a template. This must be the outermost node that 258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler is passed to the compiler. 259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('body',) 261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Output(Stmt): 264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """A node that holds multiple expressions which are then printed out. 265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler This is used both for the `print` statement and the regular template data. 266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('nodes',) 268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Extends(Stmt): 271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Represents an extends statement.""" 272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('template',) 273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass For(Stmt): 276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """The for loop. `target` is the target for the iteration (usually a 277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler :class:`Name` or :class:`Tuple`), `iter` the iterable. `body` is a list 278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler of nodes that are used as loop-body, and `else_` a list of nodes for the 279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler `else` block. If no else node exists it has to be an empty list. 280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler For filtered nodes an expression can be stored as `test`, otherwise `None`. 282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('target', 'iter', 'body', 'else_', 'test', 'recursive') 284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass If(Stmt): 287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """If `test` is true, `body` is rendered, else `else_`.""" 288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('test', 'body', 'else_') 289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Macro(Stmt): 292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """A macro definition. `name` is the name of the macro, `args` a list of 293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler arguments and `defaults` a list of defaults if there are any. `body` is 294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler a list of nodes for the macro body. 295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('name', 'args', 'defaults', 'body') 297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass CallBlock(Stmt): 300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Like a macro without a name but a call instead. `call` is called with 301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler the unnamed macro as `caller` argument this node holds. 302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('call', 'args', 'defaults', 'body') 304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass FilterBlock(Stmt): 307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Node for filter sections.""" 308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('body', 'filter') 309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Block(Stmt): 312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """A node that represents a block.""" 313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('name', 'body', 'scoped') 314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Include(Stmt): 317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """A node that represents the include tag.""" 318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('template', 'with_context', 'ignore_missing') 319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Import(Stmt): 322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """A node that represents the import tag.""" 323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('template', 'target', 'with_context') 324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass FromImport(Stmt): 327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """A node that represents the from import tag. It's important to not 328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pass unsafe names to the name attribute. The compiler translates the 329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler attribute lookups directly into getattr calls and does *not* use the 330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler subscript callback of the interface. As exported variables may not 331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler start with double underscores (which the parser asserts) this is not a 332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler problem for regular Jinja code, but if this node is used in an extension 333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler extra care must be taken. 334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler The list of names may contain tuples if aliases are wanted. 336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('template', 'names', 'with_context') 338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass ExprStmt(Stmt): 341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """A statement that evaluates an expression and discards the result.""" 342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('node',) 343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Assign(Stmt): 346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Assigns an expression to a target.""" 347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('target', 'node') 348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Expr(Node): 351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Baseclass for all expressions.""" 352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler abstract = True 353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Return the value of the expression as constant or raise 356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler :exc:`Impossible` if this was not possible. 357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler An :class:`EvalContext` can be provided, if none is given 359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler a default context is created which requires the nodes to have 360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler an attached environment. 361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler .. versionchanged:: 2.4 363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler the `eval_ctx` parameter was added. 364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def can_assign(self): 368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Check if it's possible to assign something to this node.""" 369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return False 370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass BinExpr(Expr): 373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Baseclass for all binary expressions.""" 374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('left', 'right') 375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler operator = None 376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler abstract = True 377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler # intercepted operators cannot be folded at compile time 381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if self.environment.sandboxed and \ 382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler self.operator in self.environment.intercepted_binops: 383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler f = _binop_to_func[self.operator] 385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try: 386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return f(self.left.as_const(eval_ctx), self.right.as_const(eval_ctx)) 387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler except Exception: 388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass UnaryExpr(Expr): 392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Baseclass for all unary expressions.""" 393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('node',) 394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler operator = None 395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler abstract = True 396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler # intercepted operators cannot be folded at compile time 400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if self.environment.sandboxed and \ 401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler self.operator in self.environment.intercepted_unops: 402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler f = _uaop_to_func[self.operator] 404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try: 405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return f(self.node.as_const(eval_ctx)) 406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler except Exception: 407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Name(Expr): 411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Looks up a name or stores a value in a name. 412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler The `ctx` of the node can be one of the following values: 413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler - `store`: store a value in the name 415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler - `load`: load that name 416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler - `param`: like `store` but if the name was defined as function parameter. 417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('name', 'ctx') 419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def can_assign(self): 421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return self.name not in ('true', 'false', 'none', 422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 'True', 'False', 'None') 423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Literal(Expr): 426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Baseclass for literals.""" 427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler abstract = True 428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Const(Literal): 431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """All constant values. The parser will return this node for simple 432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler constants such as ``42`` or ``"foo"`` but it can be used to store more 433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler complex values such as lists too. Only constants with a safe 434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler representation (objects where ``eval(repr(x)) == x`` is true). 435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('value',) 437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return self.value 440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler @classmethod 442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def from_untrusted(cls, value, lineno=None, environment=None): 443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Return a const object if the value is representable as 444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler constant value in the generated code, otherwise it will raise 445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler an `Impossible` exception. 446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler from .compiler import has_safe_repr 448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if not has_safe_repr(value): 449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return cls(value, lineno=lineno, environment=environment) 451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass TemplateData(Literal): 454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """A constant template string.""" 455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('data',) 456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if eval_ctx.volatile: 460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if eval_ctx.autoescape: 462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return Markup(self.data) 463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return self.data 464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Tuple(Literal): 467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """For loop unpacking and some other things like multiple arguments 468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for subscripts. Like for :class:`Name` `ctx` specifies if the tuple 469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler is used for loading the names or storing. 470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('items', 'ctx') 472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return tuple(x.as_const(eval_ctx) for x in self.items) 476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def can_assign(self): 478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for item in self.items: 479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if not item.can_assign(): 480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return False 481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return True 482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass List(Literal): 485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Any list literal such as ``[1, 2, 3]``""" 486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('items',) 487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return [x.as_const(eval_ctx) for x in self.items] 491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Dict(Literal): 494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Any dict literal such as ``{1: 2, 3: 4}``. The items must be a list of 495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler :class:`Pair` nodes. 496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('items',) 498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return dict(x.as_const(eval_ctx) for x in self.items) 502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Pair(Helper): 505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """A key, value pair for dicts.""" 506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('key', 'value') 507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return self.key.as_const(eval_ctx), self.value.as_const(eval_ctx) 511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Keyword(Helper): 514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """A key, value pair for keyword arguments where key is a string.""" 515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('key', 'value') 516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return self.key, self.value.as_const(eval_ctx) 520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass CondExpr(Expr): 523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """A conditional expression (inline if expression). (``{{ 524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler foo if bar else baz }}``) 525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('test', 'expr1', 'expr2') 527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if self.test.as_const(eval_ctx): 531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return self.expr1.as_const(eval_ctx) 532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler # if we evaluate to an undefined object, we better do that at runtime 534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if self.expr2 is None: 535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return self.expr2.as_const(eval_ctx) 538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Filter(Expr): 541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """This node applies a filter on an expression. `name` is the name of 542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler the filter, the rest of the fields are the same as for :class:`Call`. 543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 544793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler If the `node` of a filter is `None` the contents of the last buffer are 545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler filtered. Buffers are created by macros and filter blocks. 546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs') 548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 551793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if eval_ctx.volatile or self.node is None: 552793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 553793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler # we have to be careful here because we call filter_ below. 554793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler # if this variable would be called filter, 2to3 would wrap the 555793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler # call in a list beause it is assuming we are talking about the 556793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler # builtin filter function here which no longer returns a list in 557793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler # python 3. because of that, do not rename filter_ to filter! 558793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler filter_ = self.environment.filters.get(self.name) 559793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if filter_ is None or getattr(filter_, 'contextfilter', False): 560793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 561793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler obj = self.node.as_const(eval_ctx) 562793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler args = [x.as_const(eval_ctx) for x in self.args] 563793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if getattr(filter_, 'evalcontextfilter', False): 564793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler args.insert(0, eval_ctx) 565793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler elif getattr(filter_, 'environmentfilter', False): 566793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler args.insert(0, self.environment) 567793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler kwargs = dict(x.as_const(eval_ctx) for x in self.kwargs) 568793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if self.dyn_args is not None: 569793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try: 570793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler args.extend(self.dyn_args.as_const(eval_ctx)) 571793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler except Exception: 572793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 573793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if self.dyn_kwargs is not None: 574793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try: 575793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler kwargs.update(self.dyn_kwargs.as_const(eval_ctx)) 576793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler except Exception: 577793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 578793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try: 579793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return filter_(obj, *args, **kwargs) 580793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler except Exception: 581793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 582793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 583793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 584793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Test(Expr): 585793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Applies a test on an expression. `name` is the name of the test, the 586793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rest of the fields are the same as for :class:`Call`. 587793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 588793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs') 589793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 590793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 591793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Call(Expr): 592793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Calls an expression. `args` is a list of arguments, `kwargs` a list 593793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler of keyword arguments (list of :class:`Keyword` nodes), and `dyn_args` 594793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler and `dyn_kwargs` has to be either `None` or a node that is used as 595793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler node for dynamic positional (``*args``) or keyword (``**kwargs``) 596793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler arguments. 597793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 598793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('node', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs') 599793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 600793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 601793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 602793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if eval_ctx.volatile: 603793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 604793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler obj = self.node.as_const(eval_ctx) 605793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 606793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler # don't evaluate context functions 607793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler args = [x.as_const(eval_ctx) for x in self.args] 608793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if isinstance(obj, _context_function_types): 609793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if getattr(obj, 'contextfunction', False): 610793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 611793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler elif getattr(obj, 'evalcontextfunction', False): 612793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler args.insert(0, eval_ctx) 613793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler elif getattr(obj, 'environmentfunction', False): 614793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler args.insert(0, self.environment) 615793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 616793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler kwargs = dict(x.as_const(eval_ctx) for x in self.kwargs) 617793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if self.dyn_args is not None: 618793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try: 619793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler args.extend(self.dyn_args.as_const(eval_ctx)) 620793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler except Exception: 621793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 622793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if self.dyn_kwargs is not None: 623793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try: 624793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler kwargs.update(self.dyn_kwargs.as_const(eval_ctx)) 625793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler except Exception: 626793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 627793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try: 628793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return obj(*args, **kwargs) 629793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler except Exception: 630793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 631793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 632793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 633793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Getitem(Expr): 634793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Get an attribute or item from an expression and prefer the item.""" 635793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('node', 'arg', 'ctx') 636793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 637793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 638793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 639793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if self.ctx != 'load': 640793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 641793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try: 642793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return self.environment.getitem(self.node.as_const(eval_ctx), 643793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler self.arg.as_const(eval_ctx)) 644793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler except Exception: 645793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 646793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 647793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def can_assign(self): 648793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return False 649793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 650793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 651793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Getattr(Expr): 652793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Get an attribute or item from an expression that is a ascii-only 653793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bytestring and prefer the attribute. 654793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 655793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('node', 'attr', 'ctx') 656793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 657793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 658793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if self.ctx != 'load': 659793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 660793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try: 661793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 662793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return self.environment.getattr(self.node.as_const(eval_ctx), 663793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler self.attr) 664793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler except Exception: 665793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 666793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 667793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def can_assign(self): 668793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return False 669793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 670793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 671793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Slice(Expr): 672793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Represents a slice object. This must only be used as argument for 673793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler :class:`Subscript`. 674793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 675793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('start', 'stop', 'step') 676793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 677793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 678793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 679793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def const(obj): 680793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if obj is None: 681793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return None 682793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return obj.as_const(eval_ctx) 683793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return slice(const(self.start), const(self.stop), const(self.step)) 684793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 685793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 686793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Concat(Expr): 687793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Concatenates the list of expressions provided after converting them to 688793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler unicode. 689793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 690793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('nodes',) 691793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 692793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 693793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 694793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return ''.join(text_type(x.as_const(eval_ctx)) for x in self.nodes) 695793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 696793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 697793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Compare(Expr): 698793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Compares an expression with some other expressions. `ops` must be a 699793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler list of :class:`Operand`\s. 700793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 701793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('expr', 'ops') 702793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 703793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 704793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 705793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler result = value = self.expr.as_const(eval_ctx) 706793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try: 707793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for op in self.ops: 708793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler new_value = op.expr.as_const(eval_ctx) 709793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler result = _cmpop_to_func[op.op](value, new_value) 710793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler value = new_value 711793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler except Exception: 712793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 713793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return result 714793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 715793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 716793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Operand(Helper): 717793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Holds an operator and an expression.""" 718793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('op', 'expr') 719793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 720793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerif __debug__: 721793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Operand.__doc__ += '\nThe following operators are available: ' + \ 722793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ', '.join(sorted('``%s``' % x for x in set(_binop_to_func) | 723793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler set(_uaop_to_func) | set(_cmpop_to_func))) 724793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 725793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 726793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Mul(BinExpr): 727793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Multiplies the left with the right node.""" 728793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler operator = '*' 729793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 730793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 731793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Div(BinExpr): 732793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Divides the left by the right node.""" 733793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler operator = '/' 734793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 735793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 736793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass FloorDiv(BinExpr): 737793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Divides the left by the right node and truncates conver the 738793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler result into an integer by truncating. 739793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 740793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler operator = '//' 741793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 742793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 743793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Add(BinExpr): 744793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Add the left to the right node.""" 745793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler operator = '+' 746793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 747793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 748793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Sub(BinExpr): 749793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Substract the right from the left node.""" 750793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler operator = '-' 751793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 752793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 753793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Mod(BinExpr): 754793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Left modulo right.""" 755793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler operator = '%' 756793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 757793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 758793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Pow(BinExpr): 759793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Left to the power of right.""" 760793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler operator = '**' 761793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 762793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 763793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass And(BinExpr): 764793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Short circuited AND.""" 765793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler operator = 'and' 766793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 767793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 768793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 769793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return self.left.as_const(eval_ctx) and self.right.as_const(eval_ctx) 770793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 771793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 772793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Or(BinExpr): 773793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Short circuited OR.""" 774793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler operator = 'or' 775793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 776793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 777793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 778793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return self.left.as_const(eval_ctx) or self.right.as_const(eval_ctx) 779793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 780793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 781793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Not(UnaryExpr): 782793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Negate the expression.""" 783793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler operator = 'not' 784793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 785793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 786793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Neg(UnaryExpr): 787793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Make the expression negative.""" 788793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler operator = '-' 789793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 790793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 791793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Pos(UnaryExpr): 792793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Make the expression positive (noop for most expressions)""" 793793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler operator = '+' 794793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 795793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 796793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# Helpers for extensions 797793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 798793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 799793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass EnvironmentAttribute(Expr): 800793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Loads an attribute from the environment object. This is useful for 801793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler extensions that want to call a callback stored on the environment. 802793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 803793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('name',) 804793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 805793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 806793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass ExtensionAttribute(Expr): 807793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Returns the attribute of an extension bound to the environment. 808793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler The identifier is the identifier of the :class:`Extension`. 809793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 810793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler This node is usually constructed by calling the 811793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler :meth:`~jinja2.ext.Extension.attr` method on an extension. 812793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 813793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('identifier', 'name') 814793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 815793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 816793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass ImportedName(Expr): 817793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """If created with an import name the import name is returned on node 818793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler access. For example ``ImportedName('cgi.escape')`` returns the `escape` 819793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler function from the cgi module on evaluation. Imports are optimized by the 820793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compiler so there is no need to assign them to local variables. 821793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 822793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('importname',) 823793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 824793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 825793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass InternalName(Expr): 826793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """An internal name in the compiler. You cannot create these nodes 827793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler yourself but the parser provides a 828793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler :meth:`~jinja2.parser.Parser.free_identifier` method that creates 829793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler a new identifier for you. This identifier is not available from the 830793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler template and is not threated specially by the compiler. 831793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 832793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('name',) 833793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 834793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def __init__(self): 835793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise TypeError('Can\'t create internal names. Use the ' 836793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler '`free_identifier` method on a parser.') 837793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 838793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 839793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass MarkSafe(Expr): 840793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Mark the wrapped expression as safe (wrap it as `Markup`).""" 841793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('expr',) 842793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 843793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 844793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 845793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return Markup(self.expr.as_const(eval_ctx)) 846793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 847793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 848793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass MarkSafeIfAutoescape(Expr): 849793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Mark the wrapped expression as safe (wrap it as `Markup`) but 850793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler only if autoescaping is active. 851793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 852793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler .. versionadded:: 2.5 853793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 854793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('expr',) 855793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 856793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler def as_const(self, eval_ctx=None): 857793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler eval_ctx = get_eval_context(self, eval_ctx) 858793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if eval_ctx.volatile: 859793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise Impossible() 860793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler expr = self.expr.as_const(eval_ctx) 861793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if eval_ctx.autoescape: 862793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return Markup(expr) 863793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return expr 864793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 865793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 866793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass ContextReference(Expr): 867793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Returns the current template context. It can be used like a 868793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler :class:`Name` node, with a ``'load'`` ctx and will return the 869793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler current :class:`~jinja2.runtime.Context` object. 870793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 871793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Here an example that assigns the current template name to a 872793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler variable named `foo`:: 873793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 874793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Assign(Name('foo', ctx='store'), 875793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Getattr(ContextReference(), 'name')) 876793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 877793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 878793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 879793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Continue(Stmt): 880793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Continue a loop.""" 881793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 882793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 883793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Break(Stmt): 884793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Break a loop.""" 885793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 886793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 887793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Scope(Stmt): 888793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """An artificial scope.""" 889793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('body',) 890793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 891793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 892793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass EvalContextModifier(Stmt): 893793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Modifies the eval context. For each option that should be modified, 894793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler a :class:`Keyword` has to be added to the :attr:`options` list. 895793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 896793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Example to change the `autoescape` setting:: 897793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 898793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EvalContextModifier(options=[Keyword('autoescape', Const(True))]) 899793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 900793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('options',) 901793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 902793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 903793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass ScopedEvalContextModifier(EvalContextModifier): 904793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """Modifies the eval context and reverts it later. Works exactly like 905793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler :class:`EvalContextModifier` but will only modify the 906793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler :class:`~jinja2.nodes.EvalContext` for nodes in the :attr:`body`. 907793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler """ 908793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fields = ('body',) 909793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 910793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 911793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# make sure nobody creates custom nodes 912793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdef _failing_new(*args, **kwargs): 913793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler raise TypeError('can\'t create custom node types') 914793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerNodeType.__new__ = staticmethod(_failing_new); del _failing_new 915