Lines Matching refs:self
64 def new_func(self, node, frame, **kwargs):
66 if self.optimized and not frame.eval_ctx.volatile:
67 new_node = self.optimizer.visit(node, frame.eval_ctx)
69 return self.visit(new_node, frame)
70 return f(self, node, frame, **kwargs)
123 def __init__(self, node):
124 self.node = node
125 self.accesses_caller = False
126 self.accesses_kwargs = False
127 self.accesses_varargs = False
133 def __init__(self, eval_ctx, parent=None, level=None):
134 self.eval_ctx = eval_ctx
135 self.symbols = Symbols(parent and parent.symbols or None,
139 self.toplevel = False
144 self.rootlevel = False
148 self.require_output_check = parent and parent.require_output_check
154 self.buffer = None
157 self.block = parent and parent.block or None
160 self.parent = parent
163 self.buffer = parent.buffer
165 def copy(self):
167 rv = object.__new__(self.__class__)
168 rv.__dict__.update(self.__dict__)
169 rv.symbols = self.symbols.copy()
172 def inner(self, isolated=False):
175 return Frame(self.eval_ctx, level=self.symbols.level + 1)
176 return Frame(self.eval_ctx, self)
178 def soft(self):
185 rv = self.copy()
199 def __init__(self):
200 self.filters = set()
201 self.tests = set()
203 def visit_Filter(self, node):
204 self.generic_visit(node)
205 self.filters.add(node.name)
207 def visit_Test(self, node):
208 self.generic_visit(node)
209 self.tests.add(node.name)
211 def visit_Block(self, node):
221 def __init__(self, names):
222 self.names = set(names)
223 self.undeclared = set()
225 def visit_Name(self, node):
226 if node.ctx == 'load' and node.name in self.names:
227 self.undeclared.add(node.name)
228 if self.undeclared == self.names:
231 self.names.discard(node.name)
233 def visit_Block(self, node):
246 def __init__(self, environment, name, filename, stream=None,
250 self.environment = environment
251 self.name = name
252 self.filename = filename
253 self.stream = stream
254 self.created_block_context = False
255 self.defer_init = defer_init
256 self.optimized = optimized
258 self.optimizer = Optimizer(environment)
261 self.import_aliases = {}
265 self.blocks = {}
268 self.extends_so_far = 0
273 self.has_known_extends = False
276 self.code_lineno = 1
279 self.tests = {}
280 self.filters = {}
283 self.debug_info = []
284 self._write_debug_info = None
287 self._new_lines = 0
290 self._last_line = 0
293 self._first_write = True
297 self._last_identifier = 0
300 self._indentation = 0
303 self._assign_stack = []
306 self._param_def_block = []
309 self._context_reference_stack = ['context']
313 def fail(self, msg, lineno):
315 raise TemplateAssertionError(msg, lineno, self.name, self.filename)
317 def temporary_identifier(self):
319 self._last_identifier += 1
320 return 't_%d' % self._last_identifier
322 def buffer(self, frame):
324 frame.buffer = self.temporary_identifier()
325 self.writeline('%s = []' % frame.buffer)
327 def return_buffer_contents(self, frame, force_unescaped=False):
331 self.writeline('if context.eval_ctx.autoescape:')
332 self.indent()
333 self.writeline('return Markup(concat(%s))' % frame.buffer)
334 self.outdent()
335 self.writeline('else:')
336 self.indent()
337 self.writeline('return concat(%s)' % frame.buffer)
338 self.outdent()
341 self.writeline('return Markup(concat(%s))' % frame.buffer)
343 self.writeline('return concat(%s)' % frame.buffer)
345 def indent(self):
347 self._indentation += 1
349 def outdent(self, step=1):
351 self._indentation -= step
353 def start_write(self, frame, node=None):
356 self.writeline('yield ', node)
358 self.writeline('%s.append(' % frame.buffer, node)
360 def end_write(self, frame):
363 self.write(')')
365 def simple_write(self, s, frame, node=None):
367 self.start_write(frame, node)
368 self.write(s)
369 self.end_write(frame)
371 def blockvisit(self, nodes, frame):
376 self.writeline('pass')
378 self.visit(node, frame)
382 def write(self, x):
384 if self._new_lines:
385 if not self._first_write:
386 self.stream.write('\n' * self._new_lines)
387 self.code_lineno += self._new_lines
388 if self._write_debug_info is not None:
389 self.debug_info.append((self._write_debug_info,
390 self.code_lineno))
391 self._write_debug_info = None
392 self._first_write = False
393 self.stream.write(' ' * self._indentation)
394 self._new_lines = 0
395 self.stream.write(x)
397 def writeline(self, x, node=None, extra=0):
399 self.newline(node, extra)
400 self.write(x)
402 def newline(self, node=None, extra=0):
404 self._new_lines = max(self._new_lines, 1 + extra)
405 if node is not None and node.lineno != self._last_line:
406 self._write_debug_info = node.lineno
407 self._last_line = node.lineno
409 def signature(self, node, frame, extra_kwargs=None):
425 self.write(', ')
426 self.visit(arg, frame)
430 self.write(', ')
431 self.visit(kwarg, frame)
434 self.write(', %s=%s' % (key, value))
436 self.write(', *')
437 self.visit(node.dyn_args, frame)
441 self.write(', **dict({')
443 self.write(', **{')
445 self.write('%r: ' % kwarg.key)
446 self.visit(kwarg.value, frame)
447 self.write(', ')
450 self.write('%r: %s, ' % (key, value))
452 self.write('}, **')
453 self.visit(node.dyn_kwargs, frame)
454 self.write(')')
456 self.write('}')
459 self.write(', **')
460 self.visit(node.dyn_kwargs, frame)
462 def pull_dependencies(self, nodes):
468 mapping = getattr(self, dependency)
471 mapping[name] = self.temporary_identifier()
472 self.writeline('%s = environment.%s[%r]' %
475 def enter_frame(self, frame):
481 self.writeline('%s = %s(%r)' %
482 (target, self.get_resolve_func(), param))
484 self.writeline('%s = %s' % (target, param))
490 self.writeline('%s = missing' % ' = '.join(undefs))
492 def leave_frame(self, frame, with_python_scope=False):
498 self.writeline('%s = missing' % ' = '.join(undefs))
500 def func(self, name):
501 if self.environment.is_async:
505 def macro_body(self, node, frame):
534 self.fail('When defining macros or call blocks the '
550 self.writeline('%s(%s):' % (self.func('macro'), ', '.join(args)), node)
551 self.indent()
553 self.buffer(frame)
554 self.enter_frame(frame)
556 self.push_parameter_definitions(frame)
559 self.writeline('if %s is missing:' % ref)
560 self.indent()
564 self.writeline('%s = undefined(%r, name=%r)' % (
569 self.writeline('%s = ' % ref)
570 self.visit(default, frame)
571 self.mark_parameter_stored(ref)
572 self.outdent()
573 self.pop_parameter_definitions()
575 self.blockvisit(node.body, frame)
576 self.return_buffer_contents(frame, force_unescaped=True)
577 self.leave_frame(frame, with_python_scope=True)
578 self.outdent()
582 def macro_def(self, macro_ref, frame):
588 self.write('Macro(environment, macro, %r, (%s), %r, %r, %r, '
593 def position(self, node):
596 if self.name is not None:
597 rv += ' in ' + repr(self.name)
600 def dump_local_context(self, frame):
605 def write_commons(self):
610 self.writeline('resolve = context.resolve_or_missing')
611 self.writeline('undefined = environment.undefined')
612 self.writeline('if 0: yield None')
614 def push_parameter_definitions(self, frame):
621 self._param_def_block.append(frame.symbols.dump_param_targets())
623 def pop_parameter_definitions(self):
625 self._param_def_block.pop()
627 def mark_parameter_stored(self, target):
631 if self._param_def_block:
632 self._param_def_block[-1].discard(target)
634 def push_context_reference(self, target):
635 self._context_reference_stack.append(target)
637 def pop_context_reference(self):
638 self._context_reference_stack.pop()
640 def get_context_ref(self):
641 return self._context_reference_stack[-1]
643 def get_resolve_func(self):
644 target = self._context_reference_stack[-1]
649 def derive_context(self, frame):
651 self.get_context_ref(),
652 self.dump_local_context(frame),
655 def parameter_is_undeclared(self, target):
657 if not self._param_def_block:
659 return target in self._param_def_block[-1]
661 def push_assign_tracking(self):
663 self._assign_stack.append(set())
665 def pop_assign_tracking(self, frame):
669 vars = self._assign_stack.pop()
676 self.writeline('context.vars[%r] = %s' % (name, ref))
678 self.writeline('context.vars.update({')
681 self.write(', ')
683 self.write('%r: %s' % (name, ref))
684 self.write('})')
687 self.writeline('context.exported_vars.add(%r)' %
690 self.writeline('context.exported_vars.update((%s))' %
695 def visit_Template(self, node, frame=None):
697 eval_ctx = EvalContext(self.environment, self.name)
700 self.writeline('from __future__ import %s' % ', '.join(code_features))
701 self.writeline('from jinja2.runtime import ' + ', '.join(exported))
703 if self.environment.is_async:
704 self.writeline('from jinja2.asyncsupport import auto_await, '
709 envenv = not self.defer_init and ', environment=environment' or ''
717 if block.name in self.blocks:
718 self.fail('block %r defined twice' % block.name, block.lineno)
719 self.blocks[block.name] = block
723 if import_.importname not in self.import_aliases:
725 self.import_aliases[imp] = alias = self.temporary_identifier()
728 self.writeline('from %s import %s as %s' %
731 self.writeline('import %s as %s' % (imp, alias))
734 self.writeline('name = %r' % self.name)
737 self.writeline('%s(context, missing=missing%s):' %
738 (self.func('root'), envenv), extra=1)
739 self.indent()
740 self.write_commons()
744 if 'self' in find_undeclared(node.body, ('self',)):
745 ref = frame.symbols.declare_parameter('self')
746 self.writeline('%s = TemplateReference(context)' % ref)
749 frame.require_output_check = have_extends and not self.has_known_extends
751 self.writeline('parent_template = None')
752 self.enter_frame(frame)
753 self.pull_dependencies(node.body)
754 self.blockvisit(node.body, frame)
755 self.leave_frame(frame, with_python_scope=True)
756 self.outdent()
760 if not self.has_known_extends:
761 self.indent()
762 self.writeline('if parent_template is not None:')
763 self.indent()
764 if supports_yield_from and not self.environment.is_async:
765 self.writeline('yield from parent_template.'
768 self.writeline('%sfor event in parent_template.'
770 (self.environment.is_async and 'async ' or ''))
771 self.indent()
772 self.writeline('yield event')
773 self.outdent()
774 self.outdent(1 + (not self.has_known_extends))
777 for name, block in iteritems(self.blocks):
778 self.writeline('%s(context, missing=missing%s):' %
779 (self.func('block_' + name), envenv),
781 self.indent()
782 self.write_commons()
787 undeclared = find_undeclared(block.body, ('self', 'super'))
788 if 'self' in undeclared:
789 ref = block_frame.symbols.declare_parameter('self')
790 self.writeline('%s = TemplateReference(context)' % ref)
793 self.writeline('%s = context.super(%r, '
797 self.enter_frame(block_frame)
798 self.pull_dependencies(block.body)
799 self.blockvisit(block.body, block_frame)
800 self.leave_frame(block_frame, with_python_scope=True)
801 self.outdent()
803 self.writeline('blocks = {%s}' % ', '.join('%r: block_%s' % (x, x)
804 for x in self.blocks),
808 self.writeline('debug_info = %r' % '&'.join('%s=%s' % x for x
809 in self.debug_info))
811 def visit_Block(self, node, frame):
817 if self.has_known_extends:
819 if self.extends_so_far > 0:
820 self.writeline('if parent_template is None:')
821 self.indent()
825 context = self.derive_context(frame)
827 context = self.get_context_ref()
829 if supports_yield_from and not self.environment.is_async and \
831 self.writeline('yield from context.blocks[%r][0](%s)' % (
834 loop = self.environment.is_async and 'async for' or 'for'
835 self.writeline('%s event in context.blocks[%r][0](%s):' % (
837 self.indent()
838 self.simple_write('event', frame)
839 self.outdent()
841 self.outdent(level)
843 def visit_Extends(self, node, frame):
846 self.fail('cannot use extend from a non top-level scope',
852 if self.extends_so_far > 0:
858 if not self.has_known_extends:
859 self.writeline('if parent_template is not None:')
860 self.indent()
861 self.writeline('raise TemplateRuntimeError(%r)' %
866 if self.has_known_extends:
869 self.outdent()
871 self.writeline('parent_template = environment.get_template(', node)
872 self.visit(node.template, frame)
873 self.write(', %r)' % self.name)
874 self.writeline('for name, parent_block in parent_template.'
876 self.indent()
877 self.writeline('context.blocks.setdefault(name, []).'
879 self.outdent()
885 self.has_known_extends = True
888 self.extends_so_far += 1
890 def visit_Include(self, node, frame):
893 self.writeline('try:')
894 self.indent()
905 self.writeline('template = environment.%s(' % func_name, node)
906 self.visit(node.template, frame)
907 self.write(', %r)' % self.name)
909 self.outdent()
910 self.writeline('except TemplateNotFound:')
911 self.indent()
912 self.writeline('pass')
913 self.outdent()
914 self.writeline('else:')
915 self.indent()
919 loop = self.environment.is_async and 'async for' or 'for'
920 self.writeline('%s event in template.root_render_func('
922 '%s)):' % (loop, self.dump_local_context(frame)))
923 elif self.environment.is_async:
924 self.writeline('for event in (await '
929 self.writeline('yield from template._get_default_module()'
933 self.writeline('for event in template._get_default_module()'
937 self.indent()
938 self.simple_write('event', frame)
939 self.outdent()
942 self.outdent()
944 def visit_Import(self, node, frame):
946 self.writeline('%s = ' % frame.symbols.ref(node.target), node)
948 self.write('context.vars[%r] = ' % node.target)
949 if self.environment.is_async:
950 self.write('await ')
951 self.write('environment.get_template(')
952 self.visit(node.template, frame)
953 self.write(', %r).' % self.name)
955 self.write('make_module%s(context.get_all(), True, %s)'
956 % (self.environment.is_async and '_async' or '',
957 self.dump_local_context(frame)))
958 elif self.environment.is_async:
959 self.write('_get_default_module_async()')
961 self.write('_get_default_module()')
963 self.writeline('context.exported_vars.discard(%r)' % node.target)
965 def visit_FromImport(self, node, frame):
967 self.newline(node)
968 self.write('included_template = %senvironment.get_template('
969 % (self.environment.is_async and 'await ' or ''))
970 self.visit(node.template, frame)
971 self.write(', %r).' % self.name)
973 self.write('make_module%s(context.get_all(), True, %s)'
974 % (self.environment.is_async and '_async' or '',
975 self.dump_local_context(frame)))
976 elif self.environment.is_async:
977 self.write('_get_default_module_async()')
979 self.write('_get_default_module()')
988 self.writeline('%s = getattr(included_template, '
990 self.writeline('if %s is missing:' % frame.symbols.ref(alias))
991 self.indent()
992 self.writeline('%s = undefined(%r %% '
998 self.position(node),
1001 self.outdent()
1010 self.writeline('context.vars[%r] = %s' %
1013 self.writeline('context.vars.update({%s})' % ', '.join(
1018 self.writeline('context.exported_vars.discard(%r)' %
1021 self.writeline('context.exported_vars.difference_'
1024 def visit_For(self, node, frame):
1045 loop_filter_func = self.temporary_identifier()
1047 self.writeline('%s(fiter):' % self.func(loop_filter_func), node.test)
1048 self.indent()
1049 self.enter_frame(test_frame)
1050 self.writeline(self.environment.is_async and 'async for ' or 'for ')
1051 self.visit(node.target, loop_frame)
1052 self.write(' in ')
1053 self.write(self.environment.is_async and 'auto_aiter(fiter)' or 'fiter')
1054 self.write(':')
1055 self.indent()
1056 self.writeline('if ', node.test)
1057 self.visit(node.test, test_frame)
1058 self.write(':')
1059 self.indent()
1060 self.writeline('yield ')
1061 self.visit(node.target, loop_frame)
1062 self.outdent(3)
1063 self.leave_frame(test_frame, with_python_scope=True)
1069 self.writeline('%s(reciter, loop_render_func, depth=0):' %
1070 self.func('loop'), node)
1071 self.indent()
1072 self.buffer(loop_frame)
1080 self.writeline('%s = missing' % loop_ref)
1084 self.fail('Can\'t assign to special loop variable '
1088 iteration_indicator = self.temporary_identifier()
1089 self.writeline('%s = 1' % iteration_indicator)
1091 self.writeline(self.environment.is_async and 'async for ' or 'for ', node)
1092 self.visit(node.target, loop_frame)
1094 if self.environment.is_async:
1095 self.write(', %s in await make_async_loop_context(' % loop_ref)
1097 self.write(', %s in LoopContext(' % loop_ref)
1099 self.write(' in ')
1102 self.write('%s(' % loop_filter_func)
1104 self.write('reciter')
1106 if self.environment.is_async and not extended_loop:
1107 self.write('auto_aiter(')
1108 self.visit(node.iter, frame)
1109 if self.environment.is_async and not extended_loop:
1110 self.write(')')
1112 self.write(')')
1115 self.write(', undefined, loop_render_func, depth):')
1117 self.write(extended_loop and ', undefined):' or ':')
1119 self.indent()
1120 self.enter_frame(loop_frame)
1122 self.blockvisit(node.body, loop_frame)
1124 self.writeline('%s = 0' % iteration_indicator)
1125 self.outdent()
1126 self.leave_frame(loop_frame, with_python_scope=node.recursive
1130 self.writeline('if %s:' % iteration_indicator)
1131 self.indent()
1132 self.enter_frame(else_frame)
1133 self.blockvisit(node.else_, else_frame)
1134 self.leave_frame(else_frame)
1135 self.outdent()
1140 self.return_buffer_contents(loop_frame)
1141 self.outdent()
1142 self.start_write(frame, node)
1143 if self.environment.is_async:
1144 self.write('await ')
1145 self.write('loop(')
1146 if self.environment.is_async:
1147 self.write('auto_aiter(')
1148 self.visit(node.iter, frame)
1149 if self.environment.is_async:
1150 self.write(')')
1151 self.write(', loop)')
1152 self.end_write(frame)
1154 def visit_If(self, node, frame):
1156 self.writeline('if ', node)
1157 self.visit(node.test, if_frame)
1158 self.write(':')
1159 self.indent()
1160 self.blockvisit(node.body, if_frame)
1161 self.outdent()
1163 self.writeline('elif ', elif_)
1164 self.visit(elif_.test, if_frame)
1165 self.write(':')
1166 self.indent()
1167 self.blockvisit(elif_.body, if_frame)
1168 self.outdent()
1170 self.writeline('else:')
1171 self.indent()
1172 self.blockvisit(node.else_, if_frame)
1173 self.outdent()
1175 def visit_Macro(self, node, frame):
1176 macro_frame, macro_ref = self.macro_body(node, frame)
1177 self.newline()
1180 self.write('context.exported_vars.add(%r)' % node.name)
1182 self.writeline('context.vars[%r] = ' % node.name)
1183 self.write('%s = ' % frame.symbols.ref(node.name))
1184 self.macro_def(macro_ref, macro_frame)
1186 def visit_CallBlock(self, node, frame):
1187 call_frame, macro_ref = self.macro_body(node, frame)
1188 self.writeline('caller = ')
1189 self.macro_def(macro_ref, call_frame)
1190 self.start_write(frame, node)
1191 self.visit_Call(node.call, frame, forward_caller=True)
1192 self.end_write(frame)
1194 def visit_FilterBlock(self, node, frame):
1197 self.enter_frame(filter_frame)
1198 self.buffer(filter_frame)
1199 self.blockvisit(node.body, filter_frame)
1200 self.start_write(frame, node)
1201 self.visit_Filter(node.filter, filter_frame)
1202 self.end_write(frame)
1203 self.leave_frame(filter_frame)
1205 def visit_With(self, node, frame):
1208 self.enter_frame(with_frame)
1210 self.newline()
1211 self.visit(target, with_frame)
1212 self.write(' = ')
1213 self.visit(expr, frame)
1214 self.blockvisit(node.body, with_frame)
1215 self.leave_frame(with_frame)
1217 def visit_ExprStmt(self, node, frame):
1218 self.newline(node)
1219 self.visit(node.node, frame)
1221 def visit_Output(self, node, frame):
1224 if self.has_known_extends and frame.require_output_check:
1228 if self.environment.finalize:
1229 func = self.environment.finalize
1235 self.environment.finalize(self.environment, x))
1237 finalize = lambda x: text_type(self.environment.finalize(x))
1244 self.writeline('if parent_template is None:')
1245 self.indent()
1284 self.writeline('%s.append(' % frame.buffer)
1286 self.writeline('%s.extend((' % frame.buffer)
1287 self.indent()
1292 self.writeline('yield ' + val)
1294 self.writeline(val + ',')
1297 self.writeline('yield ', item)
1299 self.newline(item)
1302 self.write('(escape if context.eval_ctx.autoescape'
1305 self.write('escape(')
1307 self.write('to_string(')
1308 if self.environment.finalize is not None:
1309 self.write('environment.finalize(')
1310 if getattr(self.environment.finalize,
1312 self.write('context, ')
1314 self.visit(item, frame)
1315 self.write(')' * close)
1317 self.write(',')
1320 self.outdent()
1321 self.writeline(len(body) == 1 and ')' or '))')
1333 self.writeline('yield ')
1334 self.write(repr(concat(format)) + ' % (')
1335 self.indent()
1337 self.newline(argument)
1340 self.write('(escape if context.eval_ctx.autoescape else'
1344 self.write('escape(')
1346 if self.environment.finalize is not None:
1347 self.write('environment.finalize(')
1348 if getattr(self.environment.finalize,
1350 self.write('context, ')
1351 elif getattr(self.environment.finalize,
1353 self.write('context.eval_ctx, ')
1354 elif getattr(self.environment.finalize,
1356 self.write('environment, ')
1358 self.visit(argument, frame)
1359 self.write(')' * close + ', ')
1360 self.outdent()
1361 self.writeline(')')
1364 self.outdent()
1366 def visit_Assign(self, node, frame):
1367 self.push_assign_tracking()
1368 self.newline(node)
1369 self.visit(node.target, frame)
1370 self.write(' = ')
1371 self.visit(node.node, frame)
1372 self.pop_assign_tracking(frame)
1374 def visit_AssignBlock(self, node, frame):
1375 self.push_assign_tracking()
1382 self.enter_frame(block_frame)
1383 self.buffer(block_frame)
1384 self.blockvisit(node.body, block_frame)
1385 self.newline(node)
1386 self.visit(node.target, frame)
1387 self.write(' = (Markup if context.eval_ctx.autoescape '
1390 self.visit_Filter(node.filter, block_frame)
1392 self.write('concat(%s)' % block_frame.buffer)
1393 self.write(')')
1394 self.pop_assign_tracking(frame)
1395 self.leave_frame(block_frame)
1399 def visit_Name(self, node, frame):
1401 if self._assign_stack:
1402 self._assign_stack[-1].add(node.name)
1411 not self.parameter_is_undeclared(ref)):
1412 self.write('(undefined(name=%r) if %s is missing else %s)' %
1416 self.write(ref)
1418 def visit_NSRef(self, node, frame):
1423 self.writeline('if not isinstance(%s, Namespace):' % ref)
1424 self.indent()
1425 self.writeline('raise TemplateRuntimeError(%r)' %
1427 self.outdent()
1428 self.writeline('%s[%r]' % (ref, node.attr))
1430 def visit_Const(self, node, frame):
1433 self.write(str(val))
1435 self.write(repr(val))
1437 def visit_TemplateData(self, node, frame):
1439 self.write(repr(node.as_const(frame.eval_ctx)))
1441 self.write('(Markup if context.eval_ctx.autoescape else identity)(%r)'
1444 def visit_Tuple(self, node, frame):
1445 self.write('(')
1449 self.write(', ')
1450 self.visit(item, frame)
1451 self.write(idx == 0 and ',)' or ')')
1453 def visit_List(self, node, frame):
1454 self.write('[')
1457 self.write(', ')
1458 self.visit(item, frame)
1459 self.write(']')
1461 def visit_Dict(self, node, frame):
1462 self.write('{')
1465 self.write(', ')
1466 self.visit(item.key, frame)
1467 self.write(': ')
1468 self.visit(item.value, frame)
1469 self.write('}')
1473 def visitor(self, node, frame):
1474 if self.environment.sandboxed and \
1475 operator in self.environment.intercepted_binops:
1476 self.write('environment.call_binop(context, %r, ' % operator)
1477 self.visit(node.left, frame)
1478 self.write(', ')
1479 self.visit(node.right, frame)
1481 self.write('(')
1482 self.visit(node.left, frame)
1483 self.write(' %s ' % operator)
1484 self.visit(node.right, frame)
1485 self.write(')')
1490 def visitor(self, node, frame):
1491 if self.environment.sandboxed and \
1492 operator in self.environment.intercepted_unops:
1493 self.write('environment.call_unop(context, %r, ' % operator)
1494 self.visit(node.node, frame)
1496 self.write('(' + operator)
1497 self.visit(node.node, frame)
1498 self.write(')')
1516 def visit_Concat(self, node, frame):
1524 self.write('%s((' % func_name)
1526 self.visit(arg, frame)
1527 self.write(', ')
1528 self.write('))')
1531 def visit_Compare(self, node, frame):
1532 self.visit(node.expr, frame)
1534 self.visit(op, frame)
1536 def visit_Operand(self, node, frame):
1537 self.write(' %s ' % operators[node.op])
1538 self.visit(node.expr, frame)
1541 def visit_Getattr(self, node, frame):
1542 self.write('environment.getattr(')
1543 self.visit(node.node, frame)
1544 self.write(', %r)' % node.attr)
1547 def visit_Getitem(self, node, frame):
1550 self.visit(node.node, frame)
1551 self.write('[')
1552 self.visit(node.arg, frame)
1553 self.write(']')
1555 self.write('environment.getitem(')
1556 self.visit(node.node, frame)
1557 self.write(', ')
1558 self.visit(node.arg, frame)
1559 self.write(')')
1561 def visit_Slice(self, node, frame):
1563 self.visit(node.start, frame)
1564 self.write(':')
1566 self.visit(node.stop, frame)
1568 self.write(':')
1569 self.visit(node.step, frame)
1572 def visit_Filter(self, node, frame):
1573 if self.environment.is_async:
1574 self.write('await auto_await(')
1575 self.write(self.filters[node.name] + '(')
1576 func = self.environment.filters.get(node.name)
1578 self.fail('no filter named %r' % node.name, node.lineno)
1580 self.write('context, ')
1582 self.write('context.eval_ctx, ')
1584 self.write('environment, ')
1589 self.visit(node.node, frame)
1591 self.write('(context.eval_ctx.autoescape and'
1595 self.write('Markup(concat(%s))' % frame.buffer)
1597 self.write('concat(%s)' % frame.buffer)
1598 self.signature(node, frame)
1599 self.write(')')
1600 if self.environment.is_async:
1601 self.write(')')
1604 def visit_Test(self, node, frame):
1605 self.write(self.tests[node.name] + '(')
1606 if node.name not in self.environment.tests:
1607 self.fail('no test named %r' % node.name, node.lineno)
1608 self.visit(node.node, frame)
1609 self.signature(node, frame)
1610 self.write(')')
1613 def visit_CondExpr(self, node, frame):
1616 return self.visit(node.expr2, frame)
1617 self.write('undefined(%r)' % ('the inline if-'
1619 'no else section was defined.' % self.position(node)))
1621 self.write('(')
1622 self.visit(node.expr1, frame)
1623 self.write(' if ')
1624 self.visit(node.test, frame)
1625 self.write(' else ')
1627 self.write(')')
1630 def visit_Call(self, node, frame, forward_caller=False):
1631 if self.environment.is_async:
1632 self.write('await auto_await(')
1633 if self.environment.sandboxed:
1634 self.write('environment.call(context, ')
1636 self.write('context.call(')
1637 self.visit(node.node, frame)
1639 self.signature(node, frame, extra_kwargs)
1640 self.write(')')
1641 if self.environment.is_async:
1642 self.write(')')
1644 def visit_Keyword(self, node, frame):
1645 self.write(node.key + '=')
1646 self.visit(node.value, frame)
1650 def visit_MarkSafe(self, node, frame):
1651 self.write('Markup(')
1652 self.visit(node.expr, frame)
1653 self.write(')')
1655 def visit_MarkSafeIfAutoescape(self, node, frame):
1656 self.write('(context.eval_ctx.autoescape and Markup or identity)(')
1657 self.visit(node.expr, frame)
1658 self.write(')')
1660 def visit_EnvironmentAttribute(self, node, frame):
1661 self.write('environment.' + node.name)
1663 def visit_ExtensionAttribute(self, node, frame):
1664 self.write('environment.extensions[%r].%s' % (node.identifier, node.name))
1666 def visit_ImportedName(self, node, frame):
1667 self.write(self.import_aliases[node.importname])
1669 def visit_InternalName(self, node, frame):
1670 self.write(node.name)
1672 def visit_ContextReference(self, node, frame):
1673 self.write('context')
1675 def visit_Continue(self, node, frame):
1676 self.writeline('continue', node)
1678 def visit_Break(self, node, frame):
1679 self.writeline('break', node)
1681 def visit_Scope(self, node, frame):
1684 self.enter_frame(scope_frame)
1685 self.blockvisit(node.body, scope_frame)
1686 self.leave_frame(scope_frame)
1688 def visit_OverlayScope(self, node, frame):
1689 ctx = self.temporary_identifier()
1690 self.writeline('%s = %s' % (ctx, self.derive_context(frame)))
1691 self.writeline('%s.vars = ' % ctx)
1692 self.visit(node.context, frame)
1693 self.push_context_reference(ctx)
1697 self.enter_frame(scope_frame)
1698 self.blockvisit(node.body, scope_frame)
1699 self.leave_frame(scope_frame)
1700 self.pop_context_reference()
1702 def visit_EvalContextModifier(self, node, frame):
1704 self.writeline('context.eval_ctx.%s = ' % keyword.key)
1705 self.visit(keyword.value, frame)
1713 def visit_ScopedEvalContextModifier(self, node, frame):
1714 old_ctx_name = self.temporary_identifier()
1716 self.writeline('%s = context.eval_ctx.save()' % old_ctx_name)
1717 self.visit_EvalContextModifier(node, frame)
1719 self.visit(child, frame)
1721 self.writeline('context.eval_ctx.revert(%s)' % old_ctx_name)