1# -*- 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 12 :copyright: (c) 2010 by the Jinja Team. 13 :license: BSD, see LICENSE for more details. 14""" 15import operator 16 17from collections import deque 18from jinja2.utils import Markup 19from jinja2._compat import next, izip, with_metaclass, text_type, \ 20 method_type, function_type 21 22 23#: the types we support for context functions 24_context_function_types = (function_type, method_type) 25 26 27_binop_to_func = { 28 '*': operator.mul, 29 '/': operator.truediv, 30 '//': operator.floordiv, 31 '**': operator.pow, 32 '%': operator.mod, 33 '+': operator.add, 34 '-': operator.sub 35} 36 37_uaop_to_func = { 38 'not': operator.not_, 39 '+': operator.pos, 40 '-': operator.neg 41} 42 43_cmpop_to_func = { 44 'eq': operator.eq, 45 'ne': operator.ne, 46 'gt': operator.gt, 47 'gteq': operator.ge, 48 'lt': operator.lt, 49 'lteq': operator.le, 50 'in': lambda a, b: a in b, 51 'notin': lambda a, b: a not in b 52} 53 54 55class Impossible(Exception): 56 """Raised if the node could not perform a requested action.""" 57 58 59class NodeType(type): 60 """A metaclass for nodes that handles the field and attribute 61 inheritance. fields and attributes from the parent class are 62 automatically forwarded to the child.""" 63 64 def __new__(cls, name, bases, d): 65 for attr in 'fields', 'attributes': 66 storage = [] 67 storage.extend(getattr(bases[0], attr, ())) 68 storage.extend(d.get(attr, ())) 69 assert len(bases) == 1, 'multiple inheritance not allowed' 70 assert len(storage) == len(set(storage)), 'layout conflict' 71 d[attr] = tuple(storage) 72 d.setdefault('abstract', False) 73 return type.__new__(cls, name, bases, d) 74 75 76class EvalContext(object): 77 """Holds evaluation time information. Custom attributes can be attached 78 to it in extensions. 79 """ 80 81 def __init__(self, environment, template_name=None): 82 self.environment = environment 83 if callable(environment.autoescape): 84 self.autoescape = environment.autoescape(template_name) 85 else: 86 self.autoescape = environment.autoescape 87 self.volatile = False 88 89 def save(self): 90 return self.__dict__.copy() 91 92 def revert(self, old): 93 self.__dict__.clear() 94 self.__dict__.update(old) 95 96 97def get_eval_context(node, ctx): 98 if ctx is None: 99 if node.environment is None: 100 raise RuntimeError('if no eval context is passed, the ' 101 'node must have an attached ' 102 'environment.') 103 return EvalContext(node.environment) 104 return ctx 105 106 107class Node(with_metaclass(NodeType, object)): 108 """Baseclass for all Jinja2 nodes. There are a number of nodes available 109 of different types. There are four major types: 110 111 - :class:`Stmt`: statements 112 - :class:`Expr`: expressions 113 - :class:`Helper`: helper nodes 114 - :class:`Template`: the outermost wrapper node 115 116 All nodes have fields and attributes. Fields may be other nodes, lists, 117 or arbitrary values. Fields are passed to the constructor as regular 118 positional arguments, attributes as keyword arguments. Each node has 119 two attributes: `lineno` (the line number of the node) and `environment`. 120 The `environment` attribute is set at the end of the parsing process for 121 all nodes automatically. 122 """ 123 fields = () 124 attributes = ('lineno', 'environment') 125 abstract = True 126 127 def __init__(self, *fields, **attributes): 128 if self.abstract: 129 raise TypeError('abstract nodes are not instanciable') 130 if fields: 131 if len(fields) != len(self.fields): 132 if not self.fields: 133 raise TypeError('%r takes 0 arguments' % 134 self.__class__.__name__) 135 raise TypeError('%r takes 0 or %d argument%s' % ( 136 self.__class__.__name__, 137 len(self.fields), 138 len(self.fields) != 1 and 's' or '' 139 )) 140 for name, arg in izip(self.fields, fields): 141 setattr(self, name, arg) 142 for attr in self.attributes: 143 setattr(self, attr, attributes.pop(attr, None)) 144 if attributes: 145 raise TypeError('unknown attribute %r' % 146 next(iter(attributes))) 147 148 def iter_fields(self, exclude=None, only=None): 149 """This method iterates over all fields that are defined and yields 150 ``(key, value)`` tuples. Per default all fields are returned, but 151 it's possible to limit that to some fields by providing the `only` 152 parameter or to exclude some using the `exclude` parameter. Both 153 should be sets or tuples of field names. 154 """ 155 for name in self.fields: 156 if (exclude is only is None) or \ 157 (exclude is not None and name not in exclude) or \ 158 (only is not None and name in only): 159 try: 160 yield name, getattr(self, name) 161 except AttributeError: 162 pass 163 164 def iter_child_nodes(self, exclude=None, only=None): 165 """Iterates over all direct child nodes of the node. This iterates 166 over all fields and yields the values of they are nodes. If the value 167 of a field is a list all the nodes in that list are returned. 168 """ 169 for field, item in self.iter_fields(exclude, only): 170 if isinstance(item, list): 171 for n in item: 172 if isinstance(n, Node): 173 yield n 174 elif isinstance(item, Node): 175 yield item 176 177 def find(self, node_type): 178 """Find the first node of a given type. If no such node exists the 179 return value is `None`. 180 """ 181 for result in self.find_all(node_type): 182 return result 183 184 def find_all(self, node_type): 185 """Find all the nodes of a given type. If the type is a tuple, 186 the check is performed for any of the tuple items. 187 """ 188 for child in self.iter_child_nodes(): 189 if isinstance(child, node_type): 190 yield child 191 for result in child.find_all(node_type): 192 yield result 193 194 def set_ctx(self, ctx): 195 """Reset the context of a node and all child nodes. Per default the 196 parser will all generate nodes that have a 'load' context as it's the 197 most common one. This method is used in the parser to set assignment 198 targets and other nodes to a store context. 199 """ 200 todo = deque([self]) 201 while todo: 202 node = todo.popleft() 203 if 'ctx' in node.fields: 204 node.ctx = ctx 205 todo.extend(node.iter_child_nodes()) 206 return self 207 208 def set_lineno(self, lineno, override=False): 209 """Set the line numbers of the node and children.""" 210 todo = deque([self]) 211 while todo: 212 node = todo.popleft() 213 if 'lineno' in node.attributes: 214 if node.lineno is None or override: 215 node.lineno = lineno 216 todo.extend(node.iter_child_nodes()) 217 return self 218 219 def set_environment(self, environment): 220 """Set the environment for all nodes.""" 221 todo = deque([self]) 222 while todo: 223 node = todo.popleft() 224 node.environment = environment 225 todo.extend(node.iter_child_nodes()) 226 return self 227 228 def __eq__(self, other): 229 return type(self) is type(other) and \ 230 tuple(self.iter_fields()) == tuple(other.iter_fields()) 231 232 def __ne__(self, other): 233 return not self.__eq__(other) 234 235 # Restore Python 2 hashing behavior on Python 3 236 __hash__ = object.__hash__ 237 238 def __repr__(self): 239 return '%s(%s)' % ( 240 self.__class__.__name__, 241 ', '.join('%s=%r' % (arg, getattr(self, arg, None)) for 242 arg in self.fields) 243 ) 244 245 246class Stmt(Node): 247 """Base node for all statements.""" 248 abstract = True 249 250 251class Helper(Node): 252 """Nodes that exist in a specific context only.""" 253 abstract = True 254 255 256class Template(Node): 257 """Node that represents a template. This must be the outermost node that 258 is passed to the compiler. 259 """ 260 fields = ('body',) 261 262 263class Output(Stmt): 264 """A node that holds multiple expressions which are then printed out. 265 This is used both for the `print` statement and the regular template data. 266 """ 267 fields = ('nodes',) 268 269 270class Extends(Stmt): 271 """Represents an extends statement.""" 272 fields = ('template',) 273 274 275class For(Stmt): 276 """The for loop. `target` is the target for the iteration (usually a 277 :class:`Name` or :class:`Tuple`), `iter` the iterable. `body` is a list 278 of nodes that are used as loop-body, and `else_` a list of nodes for the 279 `else` block. If no else node exists it has to be an empty list. 280 281 For filtered nodes an expression can be stored as `test`, otherwise `None`. 282 """ 283 fields = ('target', 'iter', 'body', 'else_', 'test', 'recursive') 284 285 286class If(Stmt): 287 """If `test` is true, `body` is rendered, else `else_`.""" 288 fields = ('test', 'body', 'else_') 289 290 291class Macro(Stmt): 292 """A macro definition. `name` is the name of the macro, `args` a list of 293 arguments and `defaults` a list of defaults if there are any. `body` is 294 a list of nodes for the macro body. 295 """ 296 fields = ('name', 'args', 'defaults', 'body') 297 298 299class CallBlock(Stmt): 300 """Like a macro without a name but a call instead. `call` is called with 301 the unnamed macro as `caller` argument this node holds. 302 """ 303 fields = ('call', 'args', 'defaults', 'body') 304 305 306class FilterBlock(Stmt): 307 """Node for filter sections.""" 308 fields = ('body', 'filter') 309 310 311class Block(Stmt): 312 """A node that represents a block.""" 313 fields = ('name', 'body', 'scoped') 314 315 316class Include(Stmt): 317 """A node that represents the include tag.""" 318 fields = ('template', 'with_context', 'ignore_missing') 319 320 321class Import(Stmt): 322 """A node that represents the import tag.""" 323 fields = ('template', 'target', 'with_context') 324 325 326class FromImport(Stmt): 327 """A node that represents the from import tag. It's important to not 328 pass unsafe names to the name attribute. The compiler translates the 329 attribute lookups directly into getattr calls and does *not* use the 330 subscript callback of the interface. As exported variables may not 331 start with double underscores (which the parser asserts) this is not a 332 problem for regular Jinja code, but if this node is used in an extension 333 extra care must be taken. 334 335 The list of names may contain tuples if aliases are wanted. 336 """ 337 fields = ('template', 'names', 'with_context') 338 339 340class ExprStmt(Stmt): 341 """A statement that evaluates an expression and discards the result.""" 342 fields = ('node',) 343 344 345class Assign(Stmt): 346 """Assigns an expression to a target.""" 347 fields = ('target', 'node') 348 349 350class Expr(Node): 351 """Baseclass for all expressions.""" 352 abstract = True 353 354 def as_const(self, eval_ctx=None): 355 """Return the value of the expression as constant or raise 356 :exc:`Impossible` if this was not possible. 357 358 An :class:`EvalContext` can be provided, if none is given 359 a default context is created which requires the nodes to have 360 an attached environment. 361 362 .. versionchanged:: 2.4 363 the `eval_ctx` parameter was added. 364 """ 365 raise Impossible() 366 367 def can_assign(self): 368 """Check if it's possible to assign something to this node.""" 369 return False 370 371 372class BinExpr(Expr): 373 """Baseclass for all binary expressions.""" 374 fields = ('left', 'right') 375 operator = None 376 abstract = True 377 378 def as_const(self, eval_ctx=None): 379 eval_ctx = get_eval_context(self, eval_ctx) 380 # intercepted operators cannot be folded at compile time 381 if self.environment.sandboxed and \ 382 self.operator in self.environment.intercepted_binops: 383 raise Impossible() 384 f = _binop_to_func[self.operator] 385 try: 386 return f(self.left.as_const(eval_ctx), self.right.as_const(eval_ctx)) 387 except Exception: 388 raise Impossible() 389 390 391class UnaryExpr(Expr): 392 """Baseclass for all unary expressions.""" 393 fields = ('node',) 394 operator = None 395 abstract = True 396 397 def as_const(self, eval_ctx=None): 398 eval_ctx = get_eval_context(self, eval_ctx) 399 # intercepted operators cannot be folded at compile time 400 if self.environment.sandboxed and \ 401 self.operator in self.environment.intercepted_unops: 402 raise Impossible() 403 f = _uaop_to_func[self.operator] 404 try: 405 return f(self.node.as_const(eval_ctx)) 406 except Exception: 407 raise Impossible() 408 409 410class Name(Expr): 411 """Looks up a name or stores a value in a name. 412 The `ctx` of the node can be one of the following values: 413 414 - `store`: store a value in the name 415 - `load`: load that name 416 - `param`: like `store` but if the name was defined as function parameter. 417 """ 418 fields = ('name', 'ctx') 419 420 def can_assign(self): 421 return self.name not in ('true', 'false', 'none', 422 'True', 'False', 'None') 423 424 425class Literal(Expr): 426 """Baseclass for literals.""" 427 abstract = True 428 429 430class Const(Literal): 431 """All constant values. The parser will return this node for simple 432 constants such as ``42`` or ``"foo"`` but it can be used to store more 433 complex values such as lists too. Only constants with a safe 434 representation (objects where ``eval(repr(x)) == x`` is true). 435 """ 436 fields = ('value',) 437 438 def as_const(self, eval_ctx=None): 439 return self.value 440 441 @classmethod 442 def from_untrusted(cls, value, lineno=None, environment=None): 443 """Return a const object if the value is representable as 444 constant value in the generated code, otherwise it will raise 445 an `Impossible` exception. 446 """ 447 from .compiler import has_safe_repr 448 if not has_safe_repr(value): 449 raise Impossible() 450 return cls(value, lineno=lineno, environment=environment) 451 452 453class TemplateData(Literal): 454 """A constant template string.""" 455 fields = ('data',) 456 457 def as_const(self, eval_ctx=None): 458 eval_ctx = get_eval_context(self, eval_ctx) 459 if eval_ctx.volatile: 460 raise Impossible() 461 if eval_ctx.autoescape: 462 return Markup(self.data) 463 return self.data 464 465 466class Tuple(Literal): 467 """For loop unpacking and some other things like multiple arguments 468 for subscripts. Like for :class:`Name` `ctx` specifies if the tuple 469 is used for loading the names or storing. 470 """ 471 fields = ('items', 'ctx') 472 473 def as_const(self, eval_ctx=None): 474 eval_ctx = get_eval_context(self, eval_ctx) 475 return tuple(x.as_const(eval_ctx) for x in self.items) 476 477 def can_assign(self): 478 for item in self.items: 479 if not item.can_assign(): 480 return False 481 return True 482 483 484class List(Literal): 485 """Any list literal such as ``[1, 2, 3]``""" 486 fields = ('items',) 487 488 def as_const(self, eval_ctx=None): 489 eval_ctx = get_eval_context(self, eval_ctx) 490 return [x.as_const(eval_ctx) for x in self.items] 491 492 493class Dict(Literal): 494 """Any dict literal such as ``{1: 2, 3: 4}``. The items must be a list of 495 :class:`Pair` nodes. 496 """ 497 fields = ('items',) 498 499 def as_const(self, eval_ctx=None): 500 eval_ctx = get_eval_context(self, eval_ctx) 501 return dict(x.as_const(eval_ctx) for x in self.items) 502 503 504class Pair(Helper): 505 """A key, value pair for dicts.""" 506 fields = ('key', 'value') 507 508 def as_const(self, eval_ctx=None): 509 eval_ctx = get_eval_context(self, eval_ctx) 510 return self.key.as_const(eval_ctx), self.value.as_const(eval_ctx) 511 512 513class Keyword(Helper): 514 """A key, value pair for keyword arguments where key is a string.""" 515 fields = ('key', 'value') 516 517 def as_const(self, eval_ctx=None): 518 eval_ctx = get_eval_context(self, eval_ctx) 519 return self.key, self.value.as_const(eval_ctx) 520 521 522class CondExpr(Expr): 523 """A conditional expression (inline if expression). (``{{ 524 foo if bar else baz }}``) 525 """ 526 fields = ('test', 'expr1', 'expr2') 527 528 def as_const(self, eval_ctx=None): 529 eval_ctx = get_eval_context(self, eval_ctx) 530 if self.test.as_const(eval_ctx): 531 return self.expr1.as_const(eval_ctx) 532 533 # if we evaluate to an undefined object, we better do that at runtime 534 if self.expr2 is None: 535 raise Impossible() 536 537 return self.expr2.as_const(eval_ctx) 538 539 540class Filter(Expr): 541 """This node applies a filter on an expression. `name` is the name of 542 the filter, the rest of the fields are the same as for :class:`Call`. 543 544 If the `node` of a filter is `None` the contents of the last buffer are 545 filtered. Buffers are created by macros and filter blocks. 546 """ 547 fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs') 548 549 def as_const(self, eval_ctx=None): 550 eval_ctx = get_eval_context(self, eval_ctx) 551 if eval_ctx.volatile or self.node is None: 552 raise Impossible() 553 # we have to be careful here because we call filter_ below. 554 # if this variable would be called filter, 2to3 would wrap the 555 # call in a list beause it is assuming we are talking about the 556 # builtin filter function here which no longer returns a list in 557 # python 3. because of that, do not rename filter_ to filter! 558 filter_ = self.environment.filters.get(self.name) 559 if filter_ is None or getattr(filter_, 'contextfilter', False): 560 raise Impossible() 561 obj = self.node.as_const(eval_ctx) 562 args = [x.as_const(eval_ctx) for x in self.args] 563 if getattr(filter_, 'evalcontextfilter', False): 564 args.insert(0, eval_ctx) 565 elif getattr(filter_, 'environmentfilter', False): 566 args.insert(0, self.environment) 567 kwargs = dict(x.as_const(eval_ctx) for x in self.kwargs) 568 if self.dyn_args is not None: 569 try: 570 args.extend(self.dyn_args.as_const(eval_ctx)) 571 except Exception: 572 raise Impossible() 573 if self.dyn_kwargs is not None: 574 try: 575 kwargs.update(self.dyn_kwargs.as_const(eval_ctx)) 576 except Exception: 577 raise Impossible() 578 try: 579 return filter_(obj, *args, **kwargs) 580 except Exception: 581 raise Impossible() 582 583 584class Test(Expr): 585 """Applies a test on an expression. `name` is the name of the test, the 586 rest of the fields are the same as for :class:`Call`. 587 """ 588 fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs') 589 590 591class Call(Expr): 592 """Calls an expression. `args` is a list of arguments, `kwargs` a list 593 of keyword arguments (list of :class:`Keyword` nodes), and `dyn_args` 594 and `dyn_kwargs` has to be either `None` or a node that is used as 595 node for dynamic positional (``*args``) or keyword (``**kwargs``) 596 arguments. 597 """ 598 fields = ('node', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs') 599 600 def as_const(self, eval_ctx=None): 601 eval_ctx = get_eval_context(self, eval_ctx) 602 if eval_ctx.volatile: 603 raise Impossible() 604 obj = self.node.as_const(eval_ctx) 605 606 # don't evaluate context functions 607 args = [x.as_const(eval_ctx) for x in self.args] 608 if isinstance(obj, _context_function_types): 609 if getattr(obj, 'contextfunction', False): 610 raise Impossible() 611 elif getattr(obj, 'evalcontextfunction', False): 612 args.insert(0, eval_ctx) 613 elif getattr(obj, 'environmentfunction', False): 614 args.insert(0, self.environment) 615 616 kwargs = dict(x.as_const(eval_ctx) for x in self.kwargs) 617 if self.dyn_args is not None: 618 try: 619 args.extend(self.dyn_args.as_const(eval_ctx)) 620 except Exception: 621 raise Impossible() 622 if self.dyn_kwargs is not None: 623 try: 624 kwargs.update(self.dyn_kwargs.as_const(eval_ctx)) 625 except Exception: 626 raise Impossible() 627 try: 628 return obj(*args, **kwargs) 629 except Exception: 630 raise Impossible() 631 632 633class Getitem(Expr): 634 """Get an attribute or item from an expression and prefer the item.""" 635 fields = ('node', 'arg', 'ctx') 636 637 def as_const(self, eval_ctx=None): 638 eval_ctx = get_eval_context(self, eval_ctx) 639 if self.ctx != 'load': 640 raise Impossible() 641 try: 642 return self.environment.getitem(self.node.as_const(eval_ctx), 643 self.arg.as_const(eval_ctx)) 644 except Exception: 645 raise Impossible() 646 647 def can_assign(self): 648 return False 649 650 651class Getattr(Expr): 652 """Get an attribute or item from an expression that is a ascii-only 653 bytestring and prefer the attribute. 654 """ 655 fields = ('node', 'attr', 'ctx') 656 657 def as_const(self, eval_ctx=None): 658 if self.ctx != 'load': 659 raise Impossible() 660 try: 661 eval_ctx = get_eval_context(self, eval_ctx) 662 return self.environment.getattr(self.node.as_const(eval_ctx), 663 self.attr) 664 except Exception: 665 raise Impossible() 666 667 def can_assign(self): 668 return False 669 670 671class Slice(Expr): 672 """Represents a slice object. This must only be used as argument for 673 :class:`Subscript`. 674 """ 675 fields = ('start', 'stop', 'step') 676 677 def as_const(self, eval_ctx=None): 678 eval_ctx = get_eval_context(self, eval_ctx) 679 def const(obj): 680 if obj is None: 681 return None 682 return obj.as_const(eval_ctx) 683 return slice(const(self.start), const(self.stop), const(self.step)) 684 685 686class Concat(Expr): 687 """Concatenates the list of expressions provided after converting them to 688 unicode. 689 """ 690 fields = ('nodes',) 691 692 def as_const(self, eval_ctx=None): 693 eval_ctx = get_eval_context(self, eval_ctx) 694 return ''.join(text_type(x.as_const(eval_ctx)) for x in self.nodes) 695 696 697class Compare(Expr): 698 """Compares an expression with some other expressions. `ops` must be a 699 list of :class:`Operand`\s. 700 """ 701 fields = ('expr', 'ops') 702 703 def as_const(self, eval_ctx=None): 704 eval_ctx = get_eval_context(self, eval_ctx) 705 result = value = self.expr.as_const(eval_ctx) 706 try: 707 for op in self.ops: 708 new_value = op.expr.as_const(eval_ctx) 709 result = _cmpop_to_func[op.op](value, new_value) 710 value = new_value 711 except Exception: 712 raise Impossible() 713 return result 714 715 716class Operand(Helper): 717 """Holds an operator and an expression.""" 718 fields = ('op', 'expr') 719 720if __debug__: 721 Operand.__doc__ += '\nThe following operators are available: ' + \ 722 ', '.join(sorted('``%s``' % x for x in set(_binop_to_func) | 723 set(_uaop_to_func) | set(_cmpop_to_func))) 724 725 726class Mul(BinExpr): 727 """Multiplies the left with the right node.""" 728 operator = '*' 729 730 731class Div(BinExpr): 732 """Divides the left by the right node.""" 733 operator = '/' 734 735 736class FloorDiv(BinExpr): 737 """Divides the left by the right node and truncates conver the 738 result into an integer by truncating. 739 """ 740 operator = '//' 741 742 743class Add(BinExpr): 744 """Add the left to the right node.""" 745 operator = '+' 746 747 748class Sub(BinExpr): 749 """Substract the right from the left node.""" 750 operator = '-' 751 752 753class Mod(BinExpr): 754 """Left modulo right.""" 755 operator = '%' 756 757 758class Pow(BinExpr): 759 """Left to the power of right.""" 760 operator = '**' 761 762 763class And(BinExpr): 764 """Short circuited AND.""" 765 operator = 'and' 766 767 def as_const(self, eval_ctx=None): 768 eval_ctx = get_eval_context(self, eval_ctx) 769 return self.left.as_const(eval_ctx) and self.right.as_const(eval_ctx) 770 771 772class Or(BinExpr): 773 """Short circuited OR.""" 774 operator = 'or' 775 776 def as_const(self, eval_ctx=None): 777 eval_ctx = get_eval_context(self, eval_ctx) 778 return self.left.as_const(eval_ctx) or self.right.as_const(eval_ctx) 779 780 781class Not(UnaryExpr): 782 """Negate the expression.""" 783 operator = 'not' 784 785 786class Neg(UnaryExpr): 787 """Make the expression negative.""" 788 operator = '-' 789 790 791class Pos(UnaryExpr): 792 """Make the expression positive (noop for most expressions)""" 793 operator = '+' 794 795 796# Helpers for extensions 797 798 799class EnvironmentAttribute(Expr): 800 """Loads an attribute from the environment object. This is useful for 801 extensions that want to call a callback stored on the environment. 802 """ 803 fields = ('name',) 804 805 806class ExtensionAttribute(Expr): 807 """Returns the attribute of an extension bound to the environment. 808 The identifier is the identifier of the :class:`Extension`. 809 810 This node is usually constructed by calling the 811 :meth:`~jinja2.ext.Extension.attr` method on an extension. 812 """ 813 fields = ('identifier', 'name') 814 815 816class ImportedName(Expr): 817 """If created with an import name the import name is returned on node 818 access. For example ``ImportedName('cgi.escape')`` returns the `escape` 819 function from the cgi module on evaluation. Imports are optimized by the 820 compiler so there is no need to assign them to local variables. 821 """ 822 fields = ('importname',) 823 824 825class InternalName(Expr): 826 """An internal name in the compiler. You cannot create these nodes 827 yourself but the parser provides a 828 :meth:`~jinja2.parser.Parser.free_identifier` method that creates 829 a new identifier for you. This identifier is not available from the 830 template and is not threated specially by the compiler. 831 """ 832 fields = ('name',) 833 834 def __init__(self): 835 raise TypeError('Can\'t create internal names. Use the ' 836 '`free_identifier` method on a parser.') 837 838 839class MarkSafe(Expr): 840 """Mark the wrapped expression as safe (wrap it as `Markup`).""" 841 fields = ('expr',) 842 843 def as_const(self, eval_ctx=None): 844 eval_ctx = get_eval_context(self, eval_ctx) 845 return Markup(self.expr.as_const(eval_ctx)) 846 847 848class MarkSafeIfAutoescape(Expr): 849 """Mark the wrapped expression as safe (wrap it as `Markup`) but 850 only if autoescaping is active. 851 852 .. versionadded:: 2.5 853 """ 854 fields = ('expr',) 855 856 def as_const(self, eval_ctx=None): 857 eval_ctx = get_eval_context(self, eval_ctx) 858 if eval_ctx.volatile: 859 raise Impossible() 860 expr = self.expr.as_const(eval_ctx) 861 if eval_ctx.autoescape: 862 return Markup(expr) 863 return expr 864 865 866class ContextReference(Expr): 867 """Returns the current template context. It can be used like a 868 :class:`Name` node, with a ``'load'`` ctx and will return the 869 current :class:`~jinja2.runtime.Context` object. 870 871 Here an example that assigns the current template name to a 872 variable named `foo`:: 873 874 Assign(Name('foo', ctx='store'), 875 Getattr(ContextReference(), 'name')) 876 """ 877 878 879class Continue(Stmt): 880 """Continue a loop.""" 881 882 883class Break(Stmt): 884 """Break a loop.""" 885 886 887class Scope(Stmt): 888 """An artificial scope.""" 889 fields = ('body',) 890 891 892class EvalContextModifier(Stmt): 893 """Modifies the eval context. For each option that should be modified, 894 a :class:`Keyword` has to be added to the :attr:`options` list. 895 896 Example to change the `autoescape` setting:: 897 898 EvalContextModifier(options=[Keyword('autoescape', Const(True))]) 899 """ 900 fields = ('options',) 901 902 903class ScopedEvalContextModifier(EvalContextModifier): 904 """Modifies the eval context and reverts it later. Works exactly like 905 :class:`EvalContextModifier` but will only modify the 906 :class:`~jinja2.nodes.EvalContext` for nodes in the :attr:`body`. 907 """ 908 fields = ('body',) 909 910 911# make sure nobody creates custom nodes 912def _failing_new(*args, **kwargs): 913 raise TypeError('can\'t create custom node types') 914NodeType.__new__ = staticmethod(_failing_new); del _failing_new 915