OLD | NEW |
1 # -*- coding: utf-8 -*- | 1 # -*- coding: utf-8 -*- |
2 """ | 2 """ |
3 jinja2.nodes | 3 jinja2.nodes |
4 ~~~~~~~~~~~~ | 4 ~~~~~~~~~~~~ |
5 | 5 |
6 This module implements additional nodes derived from the ast base node. | 6 This module implements additional nodes derived from the ast base node. |
7 | 7 |
8 It also provides some node tree helper functions like `in_lineno` and | 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 | 9 `get_nodes` used by the parser and translator in order to normalize |
10 python and jinja nodes. | 10 python and jinja nodes. |
11 | 11 |
12 :copyright: (c) 2010 by the Jinja Team. | 12 :copyright: (c) 2010 by the Jinja Team. |
13 :license: BSD, see LICENSE for more details. | 13 :license: BSD, see LICENSE for more details. |
14 """ | 14 """ |
| 15 import types |
15 import operator | 16 import operator |
16 | 17 |
17 from collections import deque | 18 from collections import deque |
18 from jinja2.utils import Markup | 19 from jinja2.utils import Markup |
19 from jinja2._compat import next, izip, with_metaclass, text_type, \ | 20 from jinja2._compat import izip, with_metaclass, text_type |
20 method_type, function_type | |
21 | 21 |
22 | 22 |
23 #: the types we support for context functions | 23 #: the types we support for context functions |
24 _context_function_types = (function_type, method_type) | 24 _context_function_types = (types.FunctionType, types.MethodType) |
25 | 25 |
26 | 26 |
27 _binop_to_func = { | 27 _binop_to_func = { |
28 '*': operator.mul, | 28 '*': operator.mul, |
29 '/': operator.truediv, | 29 '/': operator.truediv, |
30 '//': operator.floordiv, | 30 '//': operator.floordiv, |
31 '**': operator.pow, | 31 '**': operator.pow, |
32 '%': operator.mod, | 32 '%': operator.mod, |
33 '+': operator.add, | 33 '+': operator.add, |
34 '-': operator.sub | 34 '-': operator.sub |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 class ExprStmt(Stmt): | 340 class ExprStmt(Stmt): |
341 """A statement that evaluates an expression and discards the result.""" | 341 """A statement that evaluates an expression and discards the result.""" |
342 fields = ('node',) | 342 fields = ('node',) |
343 | 343 |
344 | 344 |
345 class Assign(Stmt): | 345 class Assign(Stmt): |
346 """Assigns an expression to a target.""" | 346 """Assigns an expression to a target.""" |
347 fields = ('target', 'node') | 347 fields = ('target', 'node') |
348 | 348 |
349 | 349 |
| 350 class AssignBlock(Stmt): |
| 351 """Assigns a block to a target.""" |
| 352 fields = ('target', 'body') |
| 353 |
| 354 |
350 class Expr(Node): | 355 class Expr(Node): |
351 """Baseclass for all expressions.""" | 356 """Baseclass for all expressions.""" |
352 abstract = True | 357 abstract = True |
353 | 358 |
354 def as_const(self, eval_ctx=None): | 359 def as_const(self, eval_ctx=None): |
355 """Return the value of the expression as constant or raise | 360 """Return the value of the expression as constant or raise |
356 :exc:`Impossible` if this was not possible. | 361 :exc:`Impossible` if this was not possible. |
357 | 362 |
358 An :class:`EvalContext` can be provided, if none is given | 363 An :class:`EvalContext` can be provided, if none is given |
359 a default context is created which requires the nodes to have | 364 a default context is created which requires the nodes to have |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
739 """ | 744 """ |
740 operator = '//' | 745 operator = '//' |
741 | 746 |
742 | 747 |
743 class Add(BinExpr): | 748 class Add(BinExpr): |
744 """Add the left to the right node.""" | 749 """Add the left to the right node.""" |
745 operator = '+' | 750 operator = '+' |
746 | 751 |
747 | 752 |
748 class Sub(BinExpr): | 753 class Sub(BinExpr): |
749 """Substract the right from the left node.""" | 754 """Subtract the right from the left node.""" |
750 operator = '-' | 755 operator = '-' |
751 | 756 |
752 | 757 |
753 class Mod(BinExpr): | 758 class Mod(BinExpr): |
754 """Left modulo right.""" | 759 """Left modulo right.""" |
755 operator = '%' | 760 operator = '%' |
756 | 761 |
757 | 762 |
758 class Pow(BinExpr): | 763 class Pow(BinExpr): |
759 """Left to the power of right.""" | 764 """Left to the power of right.""" |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
905 :class:`EvalContextModifier` but will only modify the | 910 :class:`EvalContextModifier` but will only modify the |
906 :class:`~jinja2.nodes.EvalContext` for nodes in the :attr:`body`. | 911 :class:`~jinja2.nodes.EvalContext` for nodes in the :attr:`body`. |
907 """ | 912 """ |
908 fields = ('body',) | 913 fields = ('body',) |
909 | 914 |
910 | 915 |
911 # make sure nobody creates custom nodes | 916 # make sure nobody creates custom nodes |
912 def _failing_new(*args, **kwargs): | 917 def _failing_new(*args, **kwargs): |
913 raise TypeError('can\'t create custom node types') | 918 raise TypeError('can\'t create custom node types') |
914 NodeType.__new__ = staticmethod(_failing_new); del _failing_new | 919 NodeType.__new__ = staticmethod(_failing_new); del _failing_new |
OLD | NEW |