def visit_FilterBlock(self, node, frame): local = Frame(EvalContext(self.environment, self.name)) local.buffer = '_fbuf' local.toplevel = frame.toplevel self.writeline('var %s = [];' % local.buffer) for n in node.body: self.visit(n, local) bits = frame.buffer, node.filter.name, local.buffer self.writeline('%s.push(Jasinja.filters.%s(%s.join("")));' % bits)
def visit_Template(self, node, frame=None): eval_ctx = EvalContext(self.environment, self.name) # find all blocks for block in node.find_all(nodes.Block): if block.name in self.blocks: self.fail('block %r defined twice' % block.name, block.lineno) self.blocks[block.name] = block for import_ in node.find_all(nodes.ImportedName): assert False, "imports not supported" self.safename = self.name.replace(".","_") self.writeline('var tpl_%s = new function()' % self.safename) self.indent() frame = Frame(eval_ctx) frame.inspect(node.body) frame.toplevel = frame.rootlevel = True frame.require_output_check = not self.has_known_extends self.buffer(frame) # at this point we now have the blocks collected and can visit them too. for name, block in self.blocks.iteritems(): block_frame = Frame(eval_ctx) block_frame.inspect(block.body) block_frame.block = name block_frame.buffer = frame.buffer self.writeline('var block_%s = function(context, %s)' % (name, frame.buffer), block, 1) self.indent() undeclared = find_undeclared(block.body, ('self', 'super')) if 'self' in undeclared: block_frame.identifiers.add_special('self') self.writeline('l_self = TemplateReference(context)') if 'super' in undeclared: block_frame.identifiers.add_special('super') self.writeline('l_super = context.super_block(block_%s)' % name) self.pull_locals(block_frame) self.pull_dependencies(block.body) self.blockvisit(block.body, block_frame) self.outdent() self.writeline('var blocks = {%s};' % ', '.join('%r: block_%s' % (x, x) for x in self.blocks), extra=1) self.writeline("var name = %r"% self.name) self.writeline('return') self.indent() self.writeline('name: name,') self.writeline('root: function(context)', extra=1) self.indent() self.writeline('if(context.blocks==undefined)') self.indent() self.writeline("context.blocks=blocks") self.outdent() self.clear_buffer(frame) self.writeline('var parent_template = null;') if 'self' in find_undeclared(node.body, ('self',)): frame.identifiers.add_special('self') self.writeline('l_self = context.call_blocks()') self.pull_locals(frame) self.pull_dependencies(node.body) self.blockvisit(node.body, frame) self.writeline("if(parent_template)") self.indent() self.writeline('return parent_template.root(context)') self.outdent() self.return_buffer_contents(frame) self.outdent() """ if not self.has_known_extends: self.indent() self.writeline('if parent_template is not None:') self.indent() """ self.write(',') self.writeline('blocks: blocks') self.outdent() self.outdent() self.writeline('if(typeof(environment)!="undefined")') self.indent() self.writeline('environment.tpl[%r] = tpl_%s' % (self.name, self.safename)) self.outdent()
def visit_Template(self, node, frame=None): frame = Frame(EvalContext(self.environment, self.name)) frame.buffer = '_buf' frame.toplevel = True self.indent() self.writeline('') self.writeline('"%s": {' % self.name) self.indent() self.writeline('') self.writeline('') self.write('"macros": ') macros = list(node.find_all(nodes.Macro)) if not macros: self.write('{},') else: self.write('{') self.indent() self.writeline('') for i, n in enumerate(macros): self.jsmacro(n, frame) if i != len(macros) - 1: self.write(',') self.writeline('') self.outdent() self.writeline('},') self.writeline('') self.write('"blocks": ') blocks = list(node.find_all(nodes.Block)) if not blocks: self.write('{},') else: self.write('{') self.indent() self.writeline('') for i, n in enumerate(blocks): self.block(n, frame) if i != len(blocks) - 1: self.write(',') self.writeline('') self.outdent() self.writeline('},') self.writeline('') self.writeline('"render": function(ctx, tmpl) {') self.indent() extends = node.find(nodes.Extends) if extends: self.newline() self.write('return Jasinja.templates[') self.visit(extends.template, frame) self.write('].render(ctx, this);') else: self.writeline('') self.writeline('tmpl = Jasinja.utils.extend(this, tmpl);') self.writeline('') self.writeline('var %s = [];' % frame.buffer) for n in node.body: self.visit(n, frame) self.writeline('return %s.join("");' % frame.buffer) self.writeline('') self.outdent() self.writeline('}') self.outdent() self.writeline('') self.writeline('}') self.writeline('')