blob: 483366b1185a36e5c9123d2ec3179bdbd6c680b6 [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 Ronacher62ccd1b2009-01-04 14:26:19 +010012 :copyright: (c) 2009 by the Jinja Team.
Armin Ronacher07bc6842008-03-31 14:18:49 +020013 :license: BSD, see LICENSE for more details.
14"""
15import operator
16from itertools import chain, izip
Armin Ronacher82b3f3d2008-03-31 20:01:08 +020017from collections import deque
Armin Ronacherd84ec462008-04-29 13:43:16 +020018from jinja2.utils import Markup
Armin Ronacher07bc6842008-03-31 14:18:49 +020019
20
21_binop_to_func = {
22 '*': operator.mul,
23 '/': operator.truediv,
24 '//': operator.floordiv,
25 '**': operator.pow,
26 '%': operator.mod,
27 '+': operator.add,
28 '-': operator.sub
29}
30
31_uaop_to_func = {
32 'not': operator.not_,
33 '+': operator.pos,
34 '-': operator.neg
35}
36
Armin Ronacher625215e2008-04-13 16:31:08 +020037_cmpop_to_func = {
38 'eq': operator.eq,
39 'ne': operator.ne,
40 'gt': operator.gt,
41 'gteq': operator.ge,
42 'lt': operator.lt,
43 'lteq': operator.le,
Armin Ronacherb5124e62008-04-25 00:36:14 +020044 'in': lambda a, b: a in b,
45 'notin': lambda a, b: a not in b
Armin Ronacher625215e2008-04-13 16:31:08 +020046}
47
Armin Ronacher07bc6842008-03-31 14:18:49 +020048
49class Impossible(Exception):
Armin Ronacher8efc5222008-04-08 14:47:40 +020050 """Raised if the node could not perform a requested action."""
Armin Ronacher07bc6842008-03-31 14:18:49 +020051
52
53class NodeType(type):
Armin Ronacher8efc5222008-04-08 14:47:40 +020054 """A metaclass for nodes that handles the field and attribute
55 inheritance. fields and attributes from the parent class are
56 automatically forwarded to the child."""
Armin Ronacher07bc6842008-03-31 14:18:49 +020057
58 def __new__(cls, name, bases, d):
Armin Ronachere791c2a2008-04-07 18:39:54 +020059 for attr in 'fields', 'attributes':
Armin Ronacher07bc6842008-03-31 14:18:49 +020060 storage = []
Armin Ronacher7324eb82008-04-21 07:55:52 +020061 storage.extend(getattr(bases[0], attr, ()))
Armin Ronacher07bc6842008-03-31 14:18:49 +020062 storage.extend(d.get(attr, ()))
Armin Ronacher7324eb82008-04-21 07:55:52 +020063 assert len(bases) == 1, 'multiple inheritance not allowed'
64 assert len(storage) == len(set(storage)), 'layout conflict'
Armin Ronacher07bc6842008-03-31 14:18:49 +020065 d[attr] = tuple(storage)
Armin Ronacher023b5e92008-05-08 11:03:10 +020066 d.setdefault('abstract', False)
Armin Ronacher7324eb82008-04-21 07:55:52 +020067 return type.__new__(cls, name, bases, d)
Armin Ronacher07bc6842008-03-31 14:18:49 +020068
69
70class Node(object):
Armin Ronacher023b5e92008-05-08 11:03:10 +020071 """Baseclass for all Jinja2 nodes. There are a number of nodes available
72 of different types. There are three major types:
73
74 - :class:`Stmt`: statements
75 - :class:`Expr`: expressions
76 - :class:`Helper`: helper nodes
77 - :class:`Template`: the outermost wrapper node
78
79 All nodes have fields and attributes. Fields may be other nodes, lists,
80 or arbitrary values. Fields are passed to the constructor as regular
81 positional arguments, attributes as keyword arguments. Each node has
82 two attributes: `lineno` (the line number of the node) and `environment`.
83 The `environment` attribute is set at the end of the parsing process for
84 all nodes automatically.
85 """
Armin Ronacher07bc6842008-03-31 14:18:49 +020086 __metaclass__ = NodeType
Armin Ronachere791c2a2008-04-07 18:39:54 +020087 fields = ()
Armin Ronacherd55ab532008-04-09 16:13:39 +020088 attributes = ('lineno', 'environment')
Armin Ronacher023b5e92008-05-08 11:03:10 +020089 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +020090
Armin Ronacher023b5e92008-05-08 11:03:10 +020091 def __init__(self, *fields, **attributes):
Armin Ronacher69e12db2008-05-12 09:00:03 +020092 if self.abstract:
93 raise TypeError('abstract nodes are not instanciable')
Armin Ronacher023b5e92008-05-08 11:03:10 +020094 if fields:
95 if len(fields) != len(self.fields):
Armin Ronachere791c2a2008-04-07 18:39:54 +020096 if not self.fields:
Armin Ronacher07bc6842008-03-31 14:18:49 +020097 raise TypeError('%r takes 0 arguments' %
98 self.__class__.__name__)
99 raise TypeError('%r takes 0 or %d argument%s' % (
100 self.__class__.__name__,
Armin Ronachere791c2a2008-04-07 18:39:54 +0200101 len(self.fields),
102 len(self.fields) != 1 and 's' or ''
Armin Ronacher07bc6842008-03-31 14:18:49 +0200103 ))
Armin Ronacher023b5e92008-05-08 11:03:10 +0200104 for name, arg in izip(self.fields, fields):
Armin Ronacher07bc6842008-03-31 14:18:49 +0200105 setattr(self, name, arg)
Armin Ronachere791c2a2008-04-07 18:39:54 +0200106 for attr in self.attributes:
Armin Ronacher023b5e92008-05-08 11:03:10 +0200107 setattr(self, attr, attributes.pop(attr, None))
108 if attributes:
109 raise TypeError('unknown attribute %r' %
110 iter(attributes).next())
Armin Ronacher07bc6842008-03-31 14:18:49 +0200111
Armin Ronacher105f0dc2008-05-23 16:12:47 +0200112 def iter_fields(self, exclude=None, only=None):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200113 """This method iterates over all fields that are defined and yields
Armin Ronacher3da90312008-05-23 16:37:28 +0200114 ``(key, value)`` tuples. Per default all fields are returned, but
115 it's possible to limit that to some fields by providing the `only`
116 parameter or to exclude some using the `exclude` parameter. Both
117 should be sets or tuples of field names.
Armin Ronacher023b5e92008-05-08 11:03:10 +0200118 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200119 for name in self.fields:
Armin Ronacher105f0dc2008-05-23 16:12:47 +0200120 if (exclude is only is None) or \
121 (exclude is not None and name not in exclude) or \
122 (only is not None and name in only):
Armin Ronacher2feed1d2008-04-26 16:26:52 +0200123 try:
124 yield name, getattr(self, name)
125 except AttributeError:
126 pass
Armin Ronacher07bc6842008-03-31 14:18:49 +0200127
Armin Ronacher105f0dc2008-05-23 16:12:47 +0200128 def iter_child_nodes(self, exclude=None, only=None):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200129 """Iterates over all direct child nodes of the node. This iterates
130 over all fields and yields the values of they are nodes. If the value
131 of a field is a list all the nodes in that list are returned.
132 """
Armin Ronacher105f0dc2008-05-23 16:12:47 +0200133 for field, item in self.iter_fields(exclude, only):
Armin Ronacher07bc6842008-03-31 14:18:49 +0200134 if isinstance(item, list):
135 for n in item:
136 if isinstance(n, Node):
137 yield n
138 elif isinstance(item, Node):
139 yield item
140
Armin Ronachere791c2a2008-04-07 18:39:54 +0200141 def find(self, node_type):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200142 """Find the first node of a given type. If no such node exists the
143 return value is `None`.
144 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200145 for result in self.find_all(node_type):
146 return result
147
148 def find_all(self, node_type):
149 """Find all the nodes of a given type."""
150 for child in self.iter_child_nodes():
151 if isinstance(child, node_type):
152 yield child
153 for result in child.find_all(node_type):
154 yield result
155
156 def set_ctx(self, ctx):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200157 """Reset the context of a node and all child nodes. Per default the
158 parser will all generate nodes that have a 'load' context as it's the
159 most common one. This method is used in the parser to set assignment
160 targets and other nodes to a store context.
Armin Ronachere791c2a2008-04-07 18:39:54 +0200161 """
162 todo = deque([self])
163 while todo:
164 node = todo.popleft()
165 if 'ctx' in node.fields:
166 node.ctx = ctx
167 todo.extend(node.iter_child_nodes())
Armin Ronacher023b5e92008-05-08 11:03:10 +0200168 return self
Armin Ronachere791c2a2008-04-07 18:39:54 +0200169
Armin Ronacher2e9396b2008-04-16 14:21:57 +0200170 def set_lineno(self, lineno, override=False):
171 """Set the line numbers of the node and children."""
172 todo = deque([self])
173 while todo:
174 node = todo.popleft()
175 if 'lineno' in node.attributes:
176 if node.lineno is None or override:
177 node.lineno = lineno
178 todo.extend(node.iter_child_nodes())
Armin Ronacher023b5e92008-05-08 11:03:10 +0200179 return self
Armin Ronacher2e9396b2008-04-16 14:21:57 +0200180
Armin Ronacherd55ab532008-04-09 16:13:39 +0200181 def set_environment(self, environment):
182 """Set the environment for all nodes."""
183 todo = deque([self])
184 while todo:
185 node = todo.popleft()
186 node.environment = environment
187 todo.extend(node.iter_child_nodes())
Armin Ronacher023b5e92008-05-08 11:03:10 +0200188 return self
Armin Ronacherd55ab532008-04-09 16:13:39 +0200189
Armin Ronacher69e12db2008-05-12 09:00:03 +0200190 def __eq__(self, other):
Armin Ronacherb3a1fcf2008-05-15 11:04:14 +0200191 return type(self) is type(other) and \
192 tuple(self.iter_fields()) == tuple(other.iter_fields())
Armin Ronacher69e12db2008-05-12 09:00:03 +0200193
194 def __ne__(self, other):
195 return not self.__eq__(other)
196
Armin Ronacher07bc6842008-03-31 14:18:49 +0200197 def __repr__(self):
198 return '%s(%s)' % (
199 self.__class__.__name__,
200 ', '.join('%s=%r' % (arg, getattr(self, arg, None)) for
Armin Ronachere791c2a2008-04-07 18:39:54 +0200201 arg in self.fields)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200202 )
203
204
205class Stmt(Node):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200206 """Base node for all statements."""
Armin Ronacher023b5e92008-05-08 11:03:10 +0200207 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +0200208
209
210class Helper(Node):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200211 """Nodes that exist in a specific context only."""
Armin Ronacher023b5e92008-05-08 11:03:10 +0200212 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +0200213
214
215class Template(Node):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200216 """Node that represents a template. This must be the outermost node that
217 is passed to the compiler.
218 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200219 fields = ('body',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200220
221
222class Output(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200223 """A node that holds multiple expressions which are then printed out.
224 This is used both for the `print` statement and the regular template data.
Armin Ronacher07bc6842008-03-31 14:18:49 +0200225 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200226 fields = ('nodes',)
227
Armin Ronacher07bc6842008-03-31 14:18:49 +0200228
229class Extends(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200230 """Represents an extends statement."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200231 fields = ('template',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200232
233
234class For(Stmt):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200235 """The for loop. `target` is the target for the iteration (usually a
236 :class:`Name` or :class:`Tuple`), `iter` the iterable. `body` is a list
237 of nodes that are used as loop-body, and `else_` a list of nodes for the
238 `else` block. If no else node exists it has to be an empty list.
239
240 For filtered nodes an expression can be stored as `test`, otherwise `None`.
241 """
Armin Ronacherfdf95302008-05-11 22:20:51 +0200242 fields = ('target', 'iter', 'body', 'else_', 'test', 'recursive')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200243
244
245class If(Stmt):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200246 """If `test` is true, `body` is rendered, else `else_`."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200247 fields = ('test', 'body', 'else_')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200248
249
250class Macro(Stmt):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200251 """A macro definition. `name` is the name of the macro, `args` a list of
252 arguments and `defaults` a list of defaults if there are any. `body` is
253 a list of nodes for the macro body.
254 """
Armin Ronacher8efc5222008-04-08 14:47:40 +0200255 fields = ('name', 'args', 'defaults', 'body')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200256
257
258class CallBlock(Stmt):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200259 """Like a macro without a name but a call instead. `call` is called with
260 the unnamed macro as `caller` argument this node holds.
261 """
Armin Ronacherc9705c22008-04-27 21:28:03 +0200262 fields = ('call', 'args', 'defaults', 'body')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200263
264
Armin Ronacher07bc6842008-03-31 14:18:49 +0200265class FilterBlock(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200266 """Node for filter sections."""
Armin Ronacherfa865fb2008-04-12 22:11:53 +0200267 fields = ('body', 'filter')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200268
269
270class Block(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200271 """A node that represents a block."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200272 fields = ('name', 'body')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200273
274
275class Include(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200276 """A node that represents the include tag."""
Armin Ronacher37f58ce2008-12-27 13:10:38 +0100277 fields = ('template', 'with_context', 'ignore_missing')
Armin Ronacher0611e492008-04-25 23:44:14 +0200278
279
280class Import(Stmt):
281 """A node that represents the import tag."""
Armin Ronacherea847c52008-05-02 20:04:32 +0200282 fields = ('template', 'target', 'with_context')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200283
284
Armin Ronacher0611e492008-04-25 23:44:14 +0200285class FromImport(Stmt):
286 """A node that represents the from import tag. It's important to not
287 pass unsafe names to the name attribute. The compiler translates the
288 attribute lookups directly into getattr calls and does *not* use the
Armin Ronacherb9388772008-06-25 20:43:18 +0200289 subscript callback of the interface. As exported variables may not
Armin Ronacher0611e492008-04-25 23:44:14 +0200290 start with double underscores (which the parser asserts) this is not a
291 problem for regular Jinja code, but if this node is used in an extension
292 extra care must be taken.
Armin Ronacher2feed1d2008-04-26 16:26:52 +0200293
294 The list of names may contain tuples if aliases are wanted.
Armin Ronacher0611e492008-04-25 23:44:14 +0200295 """
Armin Ronacherea847c52008-05-02 20:04:32 +0200296 fields = ('template', 'names', 'with_context')
Armin Ronacher0611e492008-04-25 23:44:14 +0200297
298
Armin Ronacher07bc6842008-03-31 14:18:49 +0200299class ExprStmt(Stmt):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200300 """A statement that evaluates an expression and discards the result."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200301 fields = ('node',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200302
303
Armin Ronacher82b3f3d2008-03-31 20:01:08 +0200304class Assign(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200305 """Assigns an expression to a target."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200306 fields = ('target', 'node')
Armin Ronacher82b3f3d2008-03-31 20:01:08 +0200307
308
Armin Ronacher07bc6842008-03-31 14:18:49 +0200309class Expr(Node):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200310 """Baseclass for all expressions."""
Armin Ronacher023b5e92008-05-08 11:03:10 +0200311 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +0200312
313 def as_const(self):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200314 """Return the value of the expression as constant or raise
Armin Ronacher023b5e92008-05-08 11:03:10 +0200315 :exc:`Impossible` if this was not possible:
316
317 >>> Add(Const(23), Const(42)).as_const()
318 65
319 >>> Add(Const(23), Name('var', 'load')).as_const()
320 Traceback (most recent call last):
321 ...
322 Impossible
323
324 This requires the `environment` attribute of all nodes to be
325 set to the environment that created the nodes.
Armin Ronacher07bc6842008-03-31 14:18:49 +0200326 """
327 raise Impossible()
328
329 def can_assign(self):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200330 """Check if it's possible to assign something to this node."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200331 return False
332
333
334class BinExpr(Expr):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200335 """Baseclass for all binary expressions."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200336 fields = ('left', 'right')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200337 operator = None
Armin Ronacher69e12db2008-05-12 09:00:03 +0200338 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +0200339
340 def as_const(self):
341 f = _binop_to_func[self.operator]
342 try:
343 return f(self.left.as_const(), self.right.as_const())
344 except:
Armin Ronacher07bc6842008-03-31 14:18:49 +0200345 raise Impossible()
346
347
348class UnaryExpr(Expr):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200349 """Baseclass for all unary expressions."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200350 fields = ('node',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200351 operator = None
Armin Ronacher69e12db2008-05-12 09:00:03 +0200352 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +0200353
354 def as_const(self):
355 f = _uaop_to_func[self.operator]
356 try:
357 return f(self.node.as_const())
358 except:
359 raise Impossible()
360
361
362class Name(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200363 """Looks up a name or stores a value in a name.
364 The `ctx` of the node can be one of the following values:
365
366 - `store`: store a value in the name
367 - `load`: load that name
368 - `param`: like `store` but if the name was defined as function parameter.
369 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200370 fields = ('name', 'ctx')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200371
372 def can_assign(self):
Armin Ronacher9bb7e472008-05-28 11:26:59 +0200373 return self.name not in ('true', 'false', 'none',
374 'True', 'False', 'None')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200375
376
377class Literal(Expr):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200378 """Baseclass for literals."""
Armin Ronacher69e12db2008-05-12 09:00:03 +0200379 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +0200380
381
382class Const(Literal):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200383 """All constant values. The parser will return this node for simple
384 constants such as ``42`` or ``"foo"`` but it can be used to store more
385 complex values such as lists too. Only constants with a safe
386 representation (objects where ``eval(repr(x)) == x`` is true).
387 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200388 fields = ('value',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200389
390 def as_const(self):
391 return self.value
392
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200393 @classmethod
Armin Ronacherd55ab532008-04-09 16:13:39 +0200394 def from_untrusted(cls, value, lineno=None, environment=None):
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200395 """Return a const object if the value is representable as
396 constant value in the generated code, otherwise it will raise
Armin Ronacher2e9396b2008-04-16 14:21:57 +0200397 an `Impossible` exception.
398 """
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200399 from compiler import has_safe_repr
400 if not has_safe_repr(value):
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200401 raise Impossible()
Armin Ronacherd55ab532008-04-09 16:13:39 +0200402 return cls(value, lineno=lineno, environment=environment)
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200403
Armin Ronacher07bc6842008-03-31 14:18:49 +0200404
Armin Ronacher5411ce72008-05-25 11:36:22 +0200405class TemplateData(Literal):
406 """A constant template string."""
407 fields = ('data',)
408
409 def as_const(self):
410 if self.environment.autoescape:
411 return Markup(self.data)
412 return self.data
413
414
Armin Ronacher07bc6842008-03-31 14:18:49 +0200415class Tuple(Literal):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200416 """For loop unpacking and some other things like multiple arguments
Armin Ronacher023b5e92008-05-08 11:03:10 +0200417 for subscripts. Like for :class:`Name` `ctx` specifies if the tuple
418 is used for loading the names or storing.
Armin Ronacher07bc6842008-03-31 14:18:49 +0200419 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200420 fields = ('items', 'ctx')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200421
422 def as_const(self):
423 return tuple(x.as_const() for x in self.items)
424
425 def can_assign(self):
426 for item in self.items:
427 if not item.can_assign():
428 return False
429 return True
430
431
432class List(Literal):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200433 """Any list literal such as ``[1, 2, 3]``"""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200434 fields = ('items',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200435
436 def as_const(self):
437 return [x.as_const() for x in self.items]
438
439
440class Dict(Literal):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200441 """Any dict literal such as ``{1: 2, 3: 4}``. The items must be a list of
442 :class:`Pair` nodes.
443 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200444 fields = ('items',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200445
446 def as_const(self):
447 return dict(x.as_const() for x in self.items)
448
449
450class Pair(Helper):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200451 """A key, value pair for dicts."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200452 fields = ('key', 'value')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200453
454 def as_const(self):
455 return self.key.as_const(), self.value.as_const()
456
457
Armin Ronacher8efc5222008-04-08 14:47:40 +0200458class Keyword(Helper):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200459 """A key, value pair for keyword arguments where key is a string."""
Armin Ronacher8efc5222008-04-08 14:47:40 +0200460 fields = ('key', 'value')
461
Armin Ronacher335b87a2008-09-21 17:08:48 +0200462 def as_const(self):
463 return self.key, self.value.as_const()
464
Armin Ronacher8efc5222008-04-08 14:47:40 +0200465
Armin Ronacher07bc6842008-03-31 14:18:49 +0200466class CondExpr(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200467 """A conditional expression (inline if expression). (``{{
468 foo if bar else baz }}``)
469 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200470 fields = ('test', 'expr1', 'expr2')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200471
472 def as_const(self):
473 if self.test.as_const():
474 return self.expr1.as_const()
Armin Ronacher547d0b62008-07-04 16:35:10 +0200475
476 # if we evaluate to an undefined object, we better do that at runtime
477 if self.expr2 is None:
478 raise Impossible()
479
Armin Ronacher07bc6842008-03-31 14:18:49 +0200480 return self.expr2.as_const()
481
482
483class Filter(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200484 """This node applies a filter on an expression. `name` is the name of
485 the filter, the rest of the fields are the same as for :class:`Call`.
Armin Ronacher105f0dc2008-05-23 16:12:47 +0200486
487 If the `node` of a filter is `None` the contents of the last buffer are
488 filtered. Buffers are created by macros and filter blocks.
Armin Ronacher023b5e92008-05-08 11:03:10 +0200489 """
Armin Ronacherd55ab532008-04-09 16:13:39 +0200490 fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200491
Armin Ronacher00d5d212008-04-13 01:10:18 +0200492 def as_const(self, obj=None):
493 if self.node is obj is None:
Armin Ronacherfa865fb2008-04-12 22:11:53 +0200494 raise Impossible()
Armin Ronacherd55ab532008-04-09 16:13:39 +0200495 filter = self.environment.filters.get(self.name)
496 if filter is None or getattr(filter, 'contextfilter', False):
Christoph Hacke9e43bb2008-04-13 23:35:48 +0200497 raise Impossible()
Armin Ronacher00d5d212008-04-13 01:10:18 +0200498 if obj is None:
499 obj = self.node.as_const()
Armin Ronacherd55ab532008-04-09 16:13:39 +0200500 args = [x.as_const() for x in self.args]
Armin Ronacher9a027f42008-04-17 11:13:40 +0200501 if getattr(filter, 'environmentfilter', False):
502 args.insert(0, self.environment)
Armin Ronacherd55ab532008-04-09 16:13:39 +0200503 kwargs = dict(x.as_const() for x in self.kwargs)
504 if self.dyn_args is not None:
505 try:
506 args.extend(self.dyn_args.as_const())
507 except:
508 raise Impossible()
509 if self.dyn_kwargs is not None:
510 try:
511 kwargs.update(self.dyn_kwargs.as_const())
512 except:
513 raise Impossible()
514 try:
515 return filter(obj, *args, **kwargs)
516 except:
Christoph Hacke9e43bb2008-04-13 23:35:48 +0200517 raise Impossible()
Armin Ronacher82b3f3d2008-03-31 20:01:08 +0200518
519
Armin Ronacher07bc6842008-03-31 14:18:49 +0200520class Test(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200521 """Applies a test on an expression. `name` is the name of the test, the
522 rest of the fields are the same as for :class:`Call`.
523 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200524 fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200525
526
527class Call(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200528 """Calls an expression. `args` is a list of arguments, `kwargs` a list
529 of keyword arguments (list of :class:`Keyword` nodes), and `dyn_args`
530 and `dyn_kwargs` has to be either `None` or a node that is used as
531 node for dynamic positional (``*args``) or keyword (``**kwargs``)
532 arguments.
533 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200534 fields = ('node', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200535
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200536 def as_const(self):
537 obj = self.node.as_const()
Armin Ronacher4f7d2d52008-04-22 10:40:26 +0200538
539 # don't evaluate context functions
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200540 args = [x.as_const() for x in self.args]
Armin Ronacherfd310492008-05-25 00:16:51 +0200541 if getattr(obj, 'contextfunction', False):
542 raise Impossible()
543 elif getattr(obj, 'environmentfunction', False):
544 args.insert(0, self.environment)
Armin Ronacher203bfcb2008-04-24 21:54:44 +0200545
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200546 kwargs = dict(x.as_const() for x in self.kwargs)
547 if self.dyn_args is not None:
548 try:
549 args.extend(self.dyn_args.as_const())
550 except:
551 raise Impossible()
552 if self.dyn_kwargs is not None:
553 try:
Armin Ronacherd55ab532008-04-09 16:13:39 +0200554 kwargs.update(self.dyn_kwargs.as_const())
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200555 except:
556 raise Impossible()
557 try:
558 return obj(*args, **kwargs)
559 except:
Christoph Hacke9e43bb2008-04-13 23:35:48 +0200560 raise Impossible()
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200561
Armin Ronacher07bc6842008-03-31 14:18:49 +0200562
Armin Ronacher6dc6f292008-06-12 08:50:07 +0200563class Getitem(Expr):
Armin Ronacherb9388772008-06-25 20:43:18 +0200564 """Get an attribute or item from an expression and prefer the item."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200565 fields = ('node', 'arg', 'ctx')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200566
567 def as_const(self):
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200568 if self.ctx != 'load':
569 raise Impossible()
Armin Ronacher07bc6842008-03-31 14:18:49 +0200570 try:
Armin Ronacher6dc6f292008-06-12 08:50:07 +0200571 return self.environment.getitem(self.node.as_const(),
572 self.arg.as_const())
573 except:
574 raise Impossible()
575
576 def can_assign(self):
577 return False
578
579
580class Getattr(Expr):
Armin Ronacherb9388772008-06-25 20:43:18 +0200581 """Get an attribute or item from an expression that is a ascii-only
582 bytestring and prefer the attribute.
583 """
Armin Ronacher6dc6f292008-06-12 08:50:07 +0200584 fields = ('node', 'attr', 'ctx')
585
586 def as_const(self):
587 if self.ctx != 'load':
588 raise Impossible()
589 try:
590 return self.environment.getattr(self.node.as_const(), arg)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200591 except:
592 raise Impossible()
593
594 def can_assign(self):
Armin Ronacher4f7d2d52008-04-22 10:40:26 +0200595 return False
Armin Ronacher07bc6842008-03-31 14:18:49 +0200596
597
598class Slice(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200599 """Represents a slice object. This must only be used as argument for
600 :class:`Subscript`.
601 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200602 fields = ('start', 'stop', 'step')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200603
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200604 def as_const(self):
605 def const(obj):
606 if obj is None:
607 return obj
608 return obj.as_const()
609 return slice(const(self.start), const(self.stop), const(self.step))
610
Armin Ronacher07bc6842008-03-31 14:18:49 +0200611
612class Concat(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200613 """Concatenates the list of expressions provided after converting them to
614 unicode.
615 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200616 fields = ('nodes',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200617
618 def as_const(self):
619 return ''.join(unicode(x.as_const()) for x in self.nodes)
620
621
622class Compare(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200623 """Compares an expression with some other expressions. `ops` must be a
624 list of :class:`Operand`\s.
625 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200626 fields = ('expr', 'ops')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200627
Armin Ronacher625215e2008-04-13 16:31:08 +0200628 def as_const(self):
629 result = value = self.expr.as_const()
Armin Ronacherb5124e62008-04-25 00:36:14 +0200630 try:
631 for op in self.ops:
632 new_value = op.expr.as_const()
633 result = _cmpop_to_func[op.op](value, new_value)
634 value = new_value
635 except:
636 raise Impossible()
Armin Ronacher625215e2008-04-13 16:31:08 +0200637 return result
638
Armin Ronacher07bc6842008-03-31 14:18:49 +0200639
Armin Ronacher82b3f3d2008-03-31 20:01:08 +0200640class Operand(Helper):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200641 """Holds an operator and an expression."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200642 fields = ('op', 'expr')
Armin Ronacher82b3f3d2008-03-31 20:01:08 +0200643
Armin Ronacher023b5e92008-05-08 11:03:10 +0200644if __debug__:
645 Operand.__doc__ += '\nThe following operators are available: ' + \
646 ', '.join(sorted('``%s``' % x for x in set(_binop_to_func) |
647 set(_uaop_to_func) | set(_cmpop_to_func)))
648
Armin Ronacher82b3f3d2008-03-31 20:01:08 +0200649
Armin Ronacher07bc6842008-03-31 14:18:49 +0200650class Mul(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200651 """Multiplies the left with the right node."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200652 operator = '*'
653
654
655class Div(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200656 """Divides the left by the right node."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200657 operator = '/'
658
659
660class FloorDiv(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200661 """Divides the left by the right node and truncates conver the
662 result into an integer by truncating.
663 """
Armin Ronacher07bc6842008-03-31 14:18:49 +0200664 operator = '//'
665
666
667class Add(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200668 """Add the left to the right node."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200669 operator = '+'
670
671
672class Sub(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200673 """Substract the right from the left node."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200674 operator = '-'
675
676
677class Mod(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200678 """Left modulo right."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200679 operator = '%'
680
681
682class Pow(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200683 """Left to the power of right."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200684 operator = '**'
685
686
687class And(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200688 """Short circuited AND."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200689 operator = 'and'
690
691 def as_const(self):
692 return self.left.as_const() and self.right.as_const()
693
694
695class Or(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200696 """Short circuited OR."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200697 operator = 'or'
698
699 def as_const(self):
700 return self.left.as_const() or self.right.as_const()
701
702
703class Not(UnaryExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200704 """Negate the expression."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200705 operator = 'not'
706
707
Armin Ronachere791c2a2008-04-07 18:39:54 +0200708class Neg(UnaryExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200709 """Make the expression negative."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200710 operator = '-'
711
712
Armin Ronachere791c2a2008-04-07 18:39:54 +0200713class Pos(UnaryExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200714 """Make the expression positive (noop for most expressions)"""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200715 operator = '+'
Armin Ronacher023b5e92008-05-08 11:03:10 +0200716
717
718# Helpers for extensions
719
720
721class EnvironmentAttribute(Expr):
722 """Loads an attribute from the environment object. This is useful for
723 extensions that want to call a callback stored on the environment.
724 """
725 fields = ('name',)
726
727
728class ExtensionAttribute(Expr):
729 """Returns the attribute of an extension bound to the environment.
730 The identifier is the identifier of the :class:`Extension`.
Armin Ronacherb9e78752008-05-10 23:36:28 +0200731
732 This node is usually constructed by calling the
733 :meth:`~jinja2.ext.Extension.attr` method on an extension.
Armin Ronacher023b5e92008-05-08 11:03:10 +0200734 """
Armin Ronacher6df604e2008-05-23 22:18:38 +0200735 fields = ('identifier', 'name')
Armin Ronacher023b5e92008-05-08 11:03:10 +0200736
737
738class ImportedName(Expr):
739 """If created with an import name the import name is returned on node
740 access. For example ``ImportedName('cgi.escape')`` returns the `escape`
741 function from the cgi module on evaluation. Imports are optimized by the
742 compiler so there is no need to assign them to local variables.
743 """
744 fields = ('importname',)
745
746
747class InternalName(Expr):
748 """An internal name in the compiler. You cannot create these nodes
Armin Ronacher762079c2008-05-08 23:57:56 +0200749 yourself but the parser provides a
750 :meth:`~jinja2.parser.Parser.free_identifier` method that creates
Armin Ronacher023b5e92008-05-08 11:03:10 +0200751 a new identifier for you. This identifier is not available from the
752 template and is not threated specially by the compiler.
753 """
754 fields = ('name',)
755
756 def __init__(self):
757 raise TypeError('Can\'t create internal names. Use the '
758 '`free_identifier` method on a parser.')
759
760
761class MarkSafe(Expr):
762 """Mark the wrapped expression as safe (wrap it as `Markup`)."""
763 fields = ('expr',)
764
765 def as_const(self):
766 return Markup(self.expr.as_const())
767
768
Armin Ronacher6df604e2008-05-23 22:18:38 +0200769class ContextReference(Expr):
770 """Returns the current template context."""
771
772
Armin Ronachered1e0d42008-05-18 20:25:28 +0200773class Continue(Stmt):
774 """Continue a loop."""
775
776
777class Break(Stmt):
778 """Break a loop."""
779
780
Armin Ronacher8a1d27f2008-05-19 08:37:19 +0200781# make sure nobody creates custom nodes
782def _failing_new(*args, **kwargs):
783 raise TypeError('can\'t create custom node types')
784NodeType.__new__ = staticmethod(_failing_new); del _failing_new