blob: 568220f8abf5daefe45745e43cc7e96df34b0844 [file] [log] [blame]
Armin Ronacher07bc6842008-03-31 14:18:49 +02001# -*- coding: utf-8 -*-
2"""
3 jinja2.nodes
4 ~~~~~~~~~~~~
5
6 This module implements additional nodes derived from the ast base node.
7
8 It also provides some node tree helper functions like `in_lineno` and
9 `get_nodes` used by the parser and translator in order to normalize
10 python and jinja nodes.
11
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020012 :copyright: 2008 by Armin Ronacher.
Armin Ronacher07bc6842008-03-31 14:18:49 +020013 :license: BSD, see LICENSE for more details.
14"""
15import operator
Armin Ronacher7ceced52008-05-03 10:15:31 +020016from copy import copy
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020017from types import FunctionType
Armin Ronacher07bc6842008-03-31 14:18:49 +020018from itertools import chain, izip
Armin Ronacher82b3f3d2008-03-31 20:01:08 +020019from collections import deque
Armin Ronacherd84ec462008-04-29 13:43:16 +020020from jinja2.utils import Markup
Armin Ronacher07bc6842008-03-31 14:18:49 +020021
22
23_binop_to_func = {
24 '*': operator.mul,
25 '/': operator.truediv,
26 '//': operator.floordiv,
27 '**': operator.pow,
28 '%': operator.mod,
29 '+': operator.add,
30 '-': operator.sub
31}
32
33_uaop_to_func = {
34 'not': operator.not_,
35 '+': operator.pos,
36 '-': operator.neg
37}
38
Armin Ronacher625215e2008-04-13 16:31:08 +020039_cmpop_to_func = {
40 'eq': operator.eq,
41 'ne': operator.ne,
42 'gt': operator.gt,
43 'gteq': operator.ge,
44 'lt': operator.lt,
45 'lteq': operator.le,
Armin Ronacherb5124e62008-04-25 00:36:14 +020046 'in': lambda a, b: a in b,
47 'notin': lambda a, b: a not in b
Armin Ronacher625215e2008-04-13 16:31:08 +020048}
49
Armin Ronacher07bc6842008-03-31 14:18:49 +020050
51class Impossible(Exception):
Armin Ronacher8efc5222008-04-08 14:47:40 +020052 """Raised if the node could not perform a requested action."""
Armin Ronacher07bc6842008-03-31 14:18:49 +020053
54
55class NodeType(type):
Armin Ronacher8efc5222008-04-08 14:47:40 +020056 """A metaclass for nodes that handles the field and attribute
57 inheritance. fields and attributes from the parent class are
58 automatically forwarded to the child."""
Armin Ronacher07bc6842008-03-31 14:18:49 +020059
60 def __new__(cls, name, bases, d):
Armin Ronachere791c2a2008-04-07 18:39:54 +020061 for attr in 'fields', 'attributes':
Armin Ronacher07bc6842008-03-31 14:18:49 +020062 storage = []
Armin Ronacher7324eb82008-04-21 07:55:52 +020063 storage.extend(getattr(bases[0], attr, ()))
Armin Ronacher07bc6842008-03-31 14:18:49 +020064 storage.extend(d.get(attr, ()))
Armin Ronacher7324eb82008-04-21 07:55:52 +020065 assert len(bases) == 1, 'multiple inheritance not allowed'
66 assert len(storage) == len(set(storage)), 'layout conflict'
Armin Ronacher07bc6842008-03-31 14:18:49 +020067 d[attr] = tuple(storage)
Armin Ronacher023b5e92008-05-08 11:03:10 +020068 d.setdefault('abstract', False)
Armin Ronacher7324eb82008-04-21 07:55:52 +020069 return type.__new__(cls, name, bases, d)
Armin Ronacher07bc6842008-03-31 14:18:49 +020070
71
72class Node(object):
Armin Ronacher023b5e92008-05-08 11:03:10 +020073 """Baseclass for all Jinja2 nodes. There are a number of nodes available
74 of different types. There are three major types:
75
76 - :class:`Stmt`: statements
77 - :class:`Expr`: expressions
78 - :class:`Helper`: helper nodes
79 - :class:`Template`: the outermost wrapper node
80
81 All nodes have fields and attributes. Fields may be other nodes, lists,
82 or arbitrary values. Fields are passed to the constructor as regular
83 positional arguments, attributes as keyword arguments. Each node has
84 two attributes: `lineno` (the line number of the node) and `environment`.
85 The `environment` attribute is set at the end of the parsing process for
86 all nodes automatically.
87 """
Armin Ronacher07bc6842008-03-31 14:18:49 +020088 __metaclass__ = NodeType
Armin Ronachere791c2a2008-04-07 18:39:54 +020089 fields = ()
Armin Ronacherd55ab532008-04-09 16:13:39 +020090 attributes = ('lineno', 'environment')
Armin Ronacher023b5e92008-05-08 11:03:10 +020091 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +020092
Armin Ronacher023b5e92008-05-08 11:03:10 +020093 def __init__(self, *fields, **attributes):
Armin Ronacher69e12db2008-05-12 09:00:03 +020094 if self.abstract:
95 raise TypeError('abstract nodes are not instanciable')
Armin Ronacher023b5e92008-05-08 11:03:10 +020096 if fields:
97 if len(fields) != len(self.fields):
Armin Ronachere791c2a2008-04-07 18:39:54 +020098 if not self.fields:
Armin Ronacher07bc6842008-03-31 14:18:49 +020099 raise TypeError('%r takes 0 arguments' %
100 self.__class__.__name__)
101 raise TypeError('%r takes 0 or %d argument%s' % (
102 self.__class__.__name__,
Armin Ronachere791c2a2008-04-07 18:39:54 +0200103 len(self.fields),
104 len(self.fields) != 1 and 's' or ''
Armin Ronacher07bc6842008-03-31 14:18:49 +0200105 ))
Armin Ronacher023b5e92008-05-08 11:03:10 +0200106 for name, arg in izip(self.fields, fields):
Armin Ronacher07bc6842008-03-31 14:18:49 +0200107 setattr(self, name, arg)
Armin Ronachere791c2a2008-04-07 18:39:54 +0200108 for attr in self.attributes:
Armin Ronacher023b5e92008-05-08 11:03:10 +0200109 setattr(self, attr, attributes.pop(attr, None))
110 if attributes:
111 raise TypeError('unknown attribute %r' %
112 iter(attributes).next())
Armin Ronacher07bc6842008-03-31 14:18:49 +0200113
Armin Ronacher105f0dc2008-05-23 16:12:47 +0200114 def iter_fields(self, exclude=None, only=None):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200115 """This method iterates over all fields that are defined and yields
Armin Ronacher3da90312008-05-23 16:37:28 +0200116 ``(key, value)`` tuples. Per default all fields are returned, but
117 it's possible to limit that to some fields by providing the `only`
118 parameter or to exclude some using the `exclude` parameter. Both
119 should be sets or tuples of field names.
Armin Ronacher023b5e92008-05-08 11:03:10 +0200120 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200121 for name in self.fields:
Armin Ronacher105f0dc2008-05-23 16:12:47 +0200122 if (exclude is only is None) or \
123 (exclude is not None and name not in exclude) or \
124 (only is not None and name in only):
Armin Ronacher2feed1d2008-04-26 16:26:52 +0200125 try:
126 yield name, getattr(self, name)
127 except AttributeError:
128 pass
Armin Ronacher07bc6842008-03-31 14:18:49 +0200129
Armin Ronacher105f0dc2008-05-23 16:12:47 +0200130 def iter_child_nodes(self, exclude=None, only=None):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200131 """Iterates over all direct child nodes of the node. This iterates
132 over all fields and yields the values of they are nodes. If the value
133 of a field is a list all the nodes in that list are returned.
134 """
Armin Ronacher105f0dc2008-05-23 16:12:47 +0200135 for field, item in self.iter_fields(exclude, only):
Armin Ronacher07bc6842008-03-31 14:18:49 +0200136 if isinstance(item, list):
137 for n in item:
138 if isinstance(n, Node):
139 yield n
140 elif isinstance(item, Node):
141 yield item
142
Armin Ronachere791c2a2008-04-07 18:39:54 +0200143 def find(self, node_type):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200144 """Find the first node of a given type. If no such node exists the
145 return value is `None`.
146 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200147 for result in self.find_all(node_type):
148 return result
149
150 def find_all(self, node_type):
151 """Find all the nodes of a given type."""
152 for child in self.iter_child_nodes():
153 if isinstance(child, node_type):
154 yield child
155 for result in child.find_all(node_type):
156 yield result
157
Armin Ronacher0ecb8592008-04-09 16:29:47 +0200158 def copy(self):
159 """Return a deep copy of the node."""
160 result = object.__new__(self.__class__)
161 for field, value in self.iter_fields():
162 if isinstance(value, Node):
163 new_value = value.copy()
164 elif isinstance(value, list):
165 new_value = []
Armin Ronacherd436e982008-04-09 16:31:20 +0200166 for item in value:
Armin Ronacher0ecb8592008-04-09 16:29:47 +0200167 if isinstance(item, Node):
168 item = item.copy()
169 else:
170 item = copy(item)
171 new_value.append(item)
172 else:
Armin Ronacherd436e982008-04-09 16:31:20 +0200173 new_value = copy(value)
Armin Ronacher0ecb8592008-04-09 16:29:47 +0200174 setattr(result, field, new_value)
175 for attr in self.attributes:
176 try:
177 setattr(result, attr, getattr(self, attr))
178 except AttributeError:
179 pass
180 return result
181
Armin Ronachere791c2a2008-04-07 18:39:54 +0200182 def set_ctx(self, ctx):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200183 """Reset the context of a node and all child nodes. Per default the
184 parser will all generate nodes that have a 'load' context as it's the
185 most common one. This method is used in the parser to set assignment
186 targets and other nodes to a store context.
Armin Ronachere791c2a2008-04-07 18:39:54 +0200187 """
188 todo = deque([self])
189 while todo:
190 node = todo.popleft()
191 if 'ctx' in node.fields:
192 node.ctx = ctx
193 todo.extend(node.iter_child_nodes())
Armin Ronacher023b5e92008-05-08 11:03:10 +0200194 return self
Armin Ronachere791c2a2008-04-07 18:39:54 +0200195
Armin Ronacher2e9396b2008-04-16 14:21:57 +0200196 def set_lineno(self, lineno, override=False):
197 """Set the line numbers of the node and children."""
198 todo = deque([self])
199 while todo:
200 node = todo.popleft()
201 if 'lineno' in node.attributes:
202 if node.lineno is None or override:
203 node.lineno = lineno
204 todo.extend(node.iter_child_nodes())
Armin Ronacher023b5e92008-05-08 11:03:10 +0200205 return self
Armin Ronacher2e9396b2008-04-16 14:21:57 +0200206
Armin Ronacherd55ab532008-04-09 16:13:39 +0200207 def set_environment(self, environment):
208 """Set the environment for all nodes."""
209 todo = deque([self])
210 while todo:
211 node = todo.popleft()
212 node.environment = environment
213 todo.extend(node.iter_child_nodes())
Armin Ronacher023b5e92008-05-08 11:03:10 +0200214 return self
Armin Ronacherd55ab532008-04-09 16:13:39 +0200215
Armin Ronacher69e12db2008-05-12 09:00:03 +0200216 def __eq__(self, other):
Armin Ronacherb3a1fcf2008-05-15 11:04:14 +0200217 return type(self) is type(other) and \
218 tuple(self.iter_fields()) == tuple(other.iter_fields())
Armin Ronacher69e12db2008-05-12 09:00:03 +0200219
220 def __ne__(self, other):
221 return not self.__eq__(other)
222
Armin Ronacher07bc6842008-03-31 14:18:49 +0200223 def __repr__(self):
224 return '%s(%s)' % (
225 self.__class__.__name__,
226 ', '.join('%s=%r' % (arg, getattr(self, arg, None)) for
Armin Ronachere791c2a2008-04-07 18:39:54 +0200227 arg in self.fields)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200228 )
229
230
231class Stmt(Node):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200232 """Base node for all statements."""
Armin Ronacher023b5e92008-05-08 11:03:10 +0200233 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +0200234
235
236class Helper(Node):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200237 """Nodes that exist in a specific context only."""
Armin Ronacher023b5e92008-05-08 11:03:10 +0200238 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +0200239
240
241class Template(Node):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200242 """Node that represents a template. This must be the outermost node that
243 is passed to the compiler.
244 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200245 fields = ('body',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200246
247
248class Output(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200249 """A node that holds multiple expressions which are then printed out.
250 This is used both for the `print` statement and the regular template data.
Armin Ronacher07bc6842008-03-31 14:18:49 +0200251 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200252 fields = ('nodes',)
253
Armin Ronacher07bc6842008-03-31 14:18:49 +0200254
255class Extends(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200256 """Represents an extends statement."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200257 fields = ('template',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200258
259
260class For(Stmt):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200261 """The for loop. `target` is the target for the iteration (usually a
262 :class:`Name` or :class:`Tuple`), `iter` the iterable. `body` is a list
263 of nodes that are used as loop-body, and `else_` a list of nodes for the
264 `else` block. If no else node exists it has to be an empty list.
265
266 For filtered nodes an expression can be stored as `test`, otherwise `None`.
267 """
Armin Ronacherfdf95302008-05-11 22:20:51 +0200268 fields = ('target', 'iter', 'body', 'else_', 'test', 'recursive')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200269
270
271class If(Stmt):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200272 """If `test` is true, `body` is rendered, else `else_`."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200273 fields = ('test', 'body', 'else_')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200274
275
276class Macro(Stmt):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200277 """A macro definition. `name` is the name of the macro, `args` a list of
278 arguments and `defaults` a list of defaults if there are any. `body` is
279 a list of nodes for the macro body.
280 """
Armin Ronacher8efc5222008-04-08 14:47:40 +0200281 fields = ('name', 'args', 'defaults', 'body')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200282
283
284class CallBlock(Stmt):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200285 """Like a macro without a name but a call instead. `call` is called with
286 the unnamed macro as `caller` argument this node holds.
287 """
Armin Ronacherc9705c22008-04-27 21:28:03 +0200288 fields = ('call', 'args', 'defaults', 'body')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200289
290
291class Set(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200292 """Allows defining own variables."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200293 fields = ('name', 'expr')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200294
295
296class FilterBlock(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200297 """Node for filter sections."""
Armin Ronacherfa865fb2008-04-12 22:11:53 +0200298 fields = ('body', 'filter')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200299
300
301class Block(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200302 """A node that represents a block."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200303 fields = ('name', 'body')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200304
305
306class Include(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200307 """A node that represents the include tag."""
Armin Ronacherea847c52008-05-02 20:04:32 +0200308 fields = ('template', 'with_context')
Armin Ronacher0611e492008-04-25 23:44:14 +0200309
310
311class Import(Stmt):
312 """A node that represents the import tag."""
Armin Ronacherea847c52008-05-02 20:04:32 +0200313 fields = ('template', 'target', 'with_context')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200314
315
Armin Ronacher0611e492008-04-25 23:44:14 +0200316class FromImport(Stmt):
317 """A node that represents the from import tag. It's important to not
318 pass unsafe names to the name attribute. The compiler translates the
319 attribute lookups directly into getattr calls and does *not* use the
320 subscribe callback of the interface. As exported variables may not
321 start with double underscores (which the parser asserts) this is not a
322 problem for regular Jinja code, but if this node is used in an extension
323 extra care must be taken.
Armin Ronacher2feed1d2008-04-26 16:26:52 +0200324
325 The list of names may contain tuples if aliases are wanted.
Armin Ronacher0611e492008-04-25 23:44:14 +0200326 """
Armin Ronacherea847c52008-05-02 20:04:32 +0200327 fields = ('template', 'names', 'with_context')
Armin Ronacher0611e492008-04-25 23:44:14 +0200328
329
Armin Ronacher07bc6842008-03-31 14:18:49 +0200330class ExprStmt(Stmt):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200331 """A statement that evaluates an expression and discards the result."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200332 fields = ('node',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200333
334
Armin Ronacher82b3f3d2008-03-31 20:01:08 +0200335class Assign(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200336 """Assigns an expression to a target."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200337 fields = ('target', 'node')
Armin Ronacher82b3f3d2008-03-31 20:01:08 +0200338
339
Armin Ronacher07bc6842008-03-31 14:18:49 +0200340class Expr(Node):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200341 """Baseclass for all expressions."""
Armin Ronacher023b5e92008-05-08 11:03:10 +0200342 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +0200343
344 def as_const(self):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200345 """Return the value of the expression as constant or raise
Armin Ronacher023b5e92008-05-08 11:03:10 +0200346 :exc:`Impossible` if this was not possible:
347
348 >>> Add(Const(23), Const(42)).as_const()
349 65
350 >>> Add(Const(23), Name('var', 'load')).as_const()
351 Traceback (most recent call last):
352 ...
353 Impossible
354
355 This requires the `environment` attribute of all nodes to be
356 set to the environment that created the nodes.
Armin Ronacher07bc6842008-03-31 14:18:49 +0200357 """
358 raise Impossible()
359
360 def can_assign(self):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200361 """Check if it's possible to assign something to this node."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200362 return False
363
364
365class BinExpr(Expr):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200366 """Baseclass for all binary expressions."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200367 fields = ('left', 'right')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200368 operator = None
Armin Ronacher69e12db2008-05-12 09:00:03 +0200369 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +0200370
371 def as_const(self):
372 f = _binop_to_func[self.operator]
373 try:
374 return f(self.left.as_const(), self.right.as_const())
375 except:
Armin Ronacher07bc6842008-03-31 14:18:49 +0200376 raise Impossible()
377
378
379class UnaryExpr(Expr):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200380 """Baseclass for all unary expressions."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200381 fields = ('node',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200382 operator = None
Armin Ronacher69e12db2008-05-12 09:00:03 +0200383 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +0200384
385 def as_const(self):
386 f = _uaop_to_func[self.operator]
387 try:
388 return f(self.node.as_const())
389 except:
390 raise Impossible()
391
392
393class Name(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200394 """Looks up a name or stores a value in a name.
395 The `ctx` of the node can be one of the following values:
396
397 - `store`: store a value in the name
398 - `load`: load that name
399 - `param`: like `store` but if the name was defined as function parameter.
400 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200401 fields = ('name', 'ctx')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200402
403 def can_assign(self):
Armin Ronachere791c2a2008-04-07 18:39:54 +0200404 return self.name not in ('true', 'false', 'none')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200405
406
407class Literal(Expr):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200408 """Baseclass for literals."""
Armin Ronacher69e12db2008-05-12 09:00:03 +0200409 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +0200410
411
412class Const(Literal):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200413 """All constant values. The parser will return this node for simple
414 constants such as ``42`` or ``"foo"`` but it can be used to store more
415 complex values such as lists too. Only constants with a safe
416 representation (objects where ``eval(repr(x)) == x`` is true).
417 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200418 fields = ('value',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200419
420 def as_const(self):
421 return self.value
422
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200423 @classmethod
Armin Ronacherd55ab532008-04-09 16:13:39 +0200424 def from_untrusted(cls, value, lineno=None, environment=None):
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200425 """Return a const object if the value is representable as
426 constant value in the generated code, otherwise it will raise
Armin Ronacher2e9396b2008-04-16 14:21:57 +0200427 an `Impossible` exception.
428 """
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200429 from compiler import has_safe_repr
430 if not has_safe_repr(value):
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200431 raise Impossible()
Armin Ronacherd55ab532008-04-09 16:13:39 +0200432 return cls(value, lineno=lineno, environment=environment)
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200433
Armin Ronacher07bc6842008-03-31 14:18:49 +0200434
435class Tuple(Literal):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200436 """For loop unpacking and some other things like multiple arguments
Armin Ronacher023b5e92008-05-08 11:03:10 +0200437 for subscripts. Like for :class:`Name` `ctx` specifies if the tuple
438 is used for loading the names or storing.
Armin Ronacher07bc6842008-03-31 14:18:49 +0200439 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200440 fields = ('items', 'ctx')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200441
442 def as_const(self):
443 return tuple(x.as_const() for x in self.items)
444
445 def can_assign(self):
446 for item in self.items:
447 if not item.can_assign():
448 return False
449 return True
450
451
452class List(Literal):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200453 """Any list literal such as ``[1, 2, 3]``"""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200454 fields = ('items',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200455
456 def as_const(self):
457 return [x.as_const() for x in self.items]
458
459
460class Dict(Literal):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200461 """Any dict literal such as ``{1: 2, 3: 4}``. The items must be a list of
462 :class:`Pair` nodes.
463 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200464 fields = ('items',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200465
466 def as_const(self):
467 return dict(x.as_const() for x in self.items)
468
469
470class Pair(Helper):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200471 """A key, value pair for dicts."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200472 fields = ('key', 'value')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200473
474 def as_const(self):
475 return self.key.as_const(), self.value.as_const()
476
477
Armin Ronacher8efc5222008-04-08 14:47:40 +0200478class Keyword(Helper):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200479 """A key, value pair for keyword arguments where key is a string."""
Armin Ronacher8efc5222008-04-08 14:47:40 +0200480 fields = ('key', 'value')
481
482
Armin Ronacher07bc6842008-03-31 14:18:49 +0200483class CondExpr(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200484 """A conditional expression (inline if expression). (``{{
485 foo if bar else baz }}``)
486 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200487 fields = ('test', 'expr1', 'expr2')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200488
489 def as_const(self):
490 if self.test.as_const():
491 return self.expr1.as_const()
492 return self.expr2.as_const()
493
494
495class Filter(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200496 """This node applies a filter on an expression. `name` is the name of
497 the filter, the rest of the fields are the same as for :class:`Call`.
Armin Ronacher105f0dc2008-05-23 16:12:47 +0200498
499 If the `node` of a filter is `None` the contents of the last buffer are
500 filtered. Buffers are created by macros and filter blocks.
Armin Ronacher023b5e92008-05-08 11:03:10 +0200501 """
Armin Ronacherd55ab532008-04-09 16:13:39 +0200502 fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200503
Armin Ronacher00d5d212008-04-13 01:10:18 +0200504 def as_const(self, obj=None):
505 if self.node is obj is None:
Armin Ronacherfa865fb2008-04-12 22:11:53 +0200506 raise Impossible()
Armin Ronacherd55ab532008-04-09 16:13:39 +0200507 filter = self.environment.filters.get(self.name)
508 if filter is None or getattr(filter, 'contextfilter', False):
Christoph Hacke9e43bb2008-04-13 23:35:48 +0200509 raise Impossible()
Armin Ronacher00d5d212008-04-13 01:10:18 +0200510 if obj is None:
511 obj = self.node.as_const()
Armin Ronacherd55ab532008-04-09 16:13:39 +0200512 args = [x.as_const() for x in self.args]
Armin Ronacher9a027f42008-04-17 11:13:40 +0200513 if getattr(filter, 'environmentfilter', False):
514 args.insert(0, self.environment)
Armin Ronacherd55ab532008-04-09 16:13:39 +0200515 kwargs = dict(x.as_const() for x in self.kwargs)
516 if self.dyn_args is not None:
517 try:
518 args.extend(self.dyn_args.as_const())
519 except:
520 raise Impossible()
521 if self.dyn_kwargs is not None:
522 try:
523 kwargs.update(self.dyn_kwargs.as_const())
524 except:
525 raise Impossible()
526 try:
527 return filter(obj, *args, **kwargs)
528 except:
Christoph Hacke9e43bb2008-04-13 23:35:48 +0200529 raise Impossible()
Armin Ronacher82b3f3d2008-03-31 20:01:08 +0200530
531
Armin Ronacher07bc6842008-03-31 14:18:49 +0200532class Test(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200533 """Applies a test on an expression. `name` is the name of the test, the
534 rest of the fields are the same as for :class:`Call`.
535 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200536 fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200537
538
539class Call(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200540 """Calls an expression. `args` is a list of arguments, `kwargs` a list
541 of keyword arguments (list of :class:`Keyword` nodes), and `dyn_args`
542 and `dyn_kwargs` has to be either `None` or a node that is used as
543 node for dynamic positional (``*args``) or keyword (``**kwargs``)
544 arguments.
545 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200546 fields = ('node', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200547
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200548 def as_const(self):
549 obj = self.node.as_const()
Armin Ronacher4f7d2d52008-04-22 10:40:26 +0200550
551 # don't evaluate context functions
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200552 args = [x.as_const() for x in self.args]
Armin Ronacher203bfcb2008-04-24 21:54:44 +0200553 if type(obj) is FunctionType:
554 if getattr(obj, 'contextfunction', False):
555 raise Impossible()
556 elif obj.environmentfunction:
557 args.insert(0, self.environment)
558
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200559 kwargs = dict(x.as_const() for x in self.kwargs)
560 if self.dyn_args is not None:
561 try:
562 args.extend(self.dyn_args.as_const())
563 except:
564 raise Impossible()
565 if self.dyn_kwargs is not None:
566 try:
Armin Ronacherd55ab532008-04-09 16:13:39 +0200567 kwargs.update(self.dyn_kwargs.as_const())
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200568 except:
569 raise Impossible()
570 try:
571 return obj(*args, **kwargs)
572 except:
Christoph Hacke9e43bb2008-04-13 23:35:48 +0200573 raise Impossible()
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200574
Armin Ronacher07bc6842008-03-31 14:18:49 +0200575
576class Subscript(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200577 """Subscribe an expression by an argument. This node performs a dict
578 and an attribute lookup on the object whatever succeeds.
579 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200580 fields = ('node', 'arg', 'ctx')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200581
582 def as_const(self):
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200583 if self.ctx != 'load':
584 raise Impossible()
Armin Ronacher07bc6842008-03-31 14:18:49 +0200585 try:
Benjamin Wieganda3152742008-04-28 18:07:52 +0200586 return self.environment.subscribe(self.node.as_const(),
587 self.arg.as_const())
Armin Ronacher07bc6842008-03-31 14:18:49 +0200588 except:
589 raise Impossible()
590
591 def can_assign(self):
Armin Ronacher4f7d2d52008-04-22 10:40:26 +0200592 return False
Armin Ronacher07bc6842008-03-31 14:18:49 +0200593
594
595class Slice(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200596 """Represents a slice object. This must only be used as argument for
597 :class:`Subscript`.
598 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200599 fields = ('start', 'stop', 'step')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200600
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200601 def as_const(self):
602 def const(obj):
603 if obj is None:
604 return obj
605 return obj.as_const()
606 return slice(const(self.start), const(self.stop), const(self.step))
607
Armin Ronacher07bc6842008-03-31 14:18:49 +0200608
609class Concat(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200610 """Concatenates the list of expressions provided after converting them to
611 unicode.
612 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200613 fields = ('nodes',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200614
615 def as_const(self):
616 return ''.join(unicode(x.as_const()) for x in self.nodes)
617
618
619class Compare(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200620 """Compares an expression with some other expressions. `ops` must be a
621 list of :class:`Operand`\s.
622 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200623 fields = ('expr', 'ops')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200624
Armin Ronacher625215e2008-04-13 16:31:08 +0200625 def as_const(self):
626 result = value = self.expr.as_const()
Armin Ronacherb5124e62008-04-25 00:36:14 +0200627 try:
628 for op in self.ops:
629 new_value = op.expr.as_const()
630 result = _cmpop_to_func[op.op](value, new_value)
631 value = new_value
632 except:
633 raise Impossible()
Armin Ronacher625215e2008-04-13 16:31:08 +0200634 return result
635
Armin Ronacher07bc6842008-03-31 14:18:49 +0200636
Armin Ronacher82b3f3d2008-03-31 20:01:08 +0200637class Operand(Helper):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200638 """Holds an operator and an expression."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200639 fields = ('op', 'expr')
Armin Ronacher82b3f3d2008-03-31 20:01:08 +0200640
Armin Ronacher023b5e92008-05-08 11:03:10 +0200641if __debug__:
642 Operand.__doc__ += '\nThe following operators are available: ' + \
643 ', '.join(sorted('``%s``' % x for x in set(_binop_to_func) |
644 set(_uaop_to_func) | set(_cmpop_to_func)))
645
Armin Ronacher82b3f3d2008-03-31 20:01:08 +0200646
Armin Ronacher07bc6842008-03-31 14:18:49 +0200647class Mul(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200648 """Multiplies the left with the right node."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200649 operator = '*'
650
651
652class Div(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200653 """Divides the left by the right node."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200654 operator = '/'
655
656
657class FloorDiv(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200658 """Divides the left by the right node and truncates conver the
659 result into an integer by truncating.
660 """
Armin Ronacher07bc6842008-03-31 14:18:49 +0200661 operator = '//'
662
663
664class Add(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200665 """Add the left to the right node."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200666 operator = '+'
667
668
669class Sub(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200670 """Substract the right from the left node."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200671 operator = '-'
672
673
674class Mod(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200675 """Left modulo right."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200676 operator = '%'
677
678
679class Pow(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200680 """Left to the power of right."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200681 operator = '**'
682
683
684class And(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200685 """Short circuited AND."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200686 operator = 'and'
687
688 def as_const(self):
689 return self.left.as_const() and self.right.as_const()
690
691
692class Or(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200693 """Short circuited OR."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200694 operator = 'or'
695
696 def as_const(self):
697 return self.left.as_const() or self.right.as_const()
698
699
700class Not(UnaryExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200701 """Negate the expression."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200702 operator = 'not'
703
704
Armin Ronachere791c2a2008-04-07 18:39:54 +0200705class Neg(UnaryExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200706 """Make the expression negative."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200707 operator = '-'
708
709
Armin Ronachere791c2a2008-04-07 18:39:54 +0200710class Pos(UnaryExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200711 """Make the expression positive (noop for most expressions)"""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200712 operator = '+'
Armin Ronacher023b5e92008-05-08 11:03:10 +0200713
714
715# Helpers for extensions
716
717
718class EnvironmentAttribute(Expr):
719 """Loads an attribute from the environment object. This is useful for
720 extensions that want to call a callback stored on the environment.
721 """
722 fields = ('name',)
723
724
725class ExtensionAttribute(Expr):
726 """Returns the attribute of an extension bound to the environment.
727 The identifier is the identifier of the :class:`Extension`.
Armin Ronacherb9e78752008-05-10 23:36:28 +0200728
729 This node is usually constructed by calling the
730 :meth:`~jinja2.ext.Extension.attr` method on an extension.
Armin Ronacher023b5e92008-05-08 11:03:10 +0200731 """
Armin Ronacher6df604e2008-05-23 22:18:38 +0200732 fields = ('identifier', 'name')
Armin Ronacher023b5e92008-05-08 11:03:10 +0200733
734
735class ImportedName(Expr):
736 """If created with an import name the import name is returned on node
737 access. For example ``ImportedName('cgi.escape')`` returns the `escape`
738 function from the cgi module on evaluation. Imports are optimized by the
739 compiler so there is no need to assign them to local variables.
740 """
741 fields = ('importname',)
742
743
744class InternalName(Expr):
745 """An internal name in the compiler. You cannot create these nodes
Armin Ronacher762079c2008-05-08 23:57:56 +0200746 yourself but the parser provides a
747 :meth:`~jinja2.parser.Parser.free_identifier` method that creates
Armin Ronacher023b5e92008-05-08 11:03:10 +0200748 a new identifier for you. This identifier is not available from the
749 template and is not threated specially by the compiler.
750 """
751 fields = ('name',)
752
753 def __init__(self):
754 raise TypeError('Can\'t create internal names. Use the '
755 '`free_identifier` method on a parser.')
756
757
758class MarkSafe(Expr):
759 """Mark the wrapped expression as safe (wrap it as `Markup`)."""
760 fields = ('expr',)
761
762 def as_const(self):
763 return Markup(self.expr.as_const())
764
765
Armin Ronacher6df604e2008-05-23 22:18:38 +0200766class ContextReference(Expr):
767 """Returns the current template context."""
768
769
Armin Ronachered1e0d42008-05-18 20:25:28 +0200770class Continue(Stmt):
771 """Continue a loop."""
772
773
774class Break(Stmt):
775 """Break a loop."""
776
777
Armin Ronacher8a1d27f2008-05-19 08:37:19 +0200778# make sure nobody creates custom nodes
779def _failing_new(*args, **kwargs):
780 raise TypeError('can\'t create custom node types')
781NodeType.__new__ = staticmethod(_failing_new); del _failing_new