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