def compile(text, labels=[], nostrip=False, name=None): tree = Parser.parse(text, nostrip) wrapped = 'var buf="";' + walk(tree, labels, nostrip) + 'return buf;' if name is None: name = "null" return "new core.template.Template(function(data, partials, labels){%s}, null, %s)" % (wrapped, name)
def compile(text, labels=[], nostrip=False, name=None): tree = Parser.parse(text, nostrip) wrapped = 'var buf="";' + walk(tree, labels, nostrip) + 'return buf;' if name is None: name = "null" return "new core.template.Template(function(data, partials, labels){%s}, null, %s)" % ( wrapped, name)
def walk(node, labels, nostrip, indent): global innerCounter code = "" prefix = indent * indentString for current in node: if isinstance(current, str): code += prefix + 'buf += "' + escapeMatcher(current) + '"\n' elif current["tag"] == "\n": code += prefix + 'buf += "\\n"\n' else: tag = current["tag"] name = current["name"] escaped = escapeMatcher(name) if tag in accessTags: if name == ".": accessor = 2 elif "." in name: accessor = 1 else: accessor = 0 accessorCode = '"' + escaped + '","' + str(accessor) + '",data' if tag in innerTags: innerCode = walk(current["nodes"], labels, nostrip, indent + 1) if tag == "?": code += prefix + 'if self._has(' + accessorCode + '):\n' + innerCode + '\n' elif tag == "^": code += prefix + 'if not self._has(' + accessorCode + '):\n' + innerCode + '\n' elif tag == "#": innerCounter += 1 # Let 'buf' be nonlocal for sharing parent scope's variable nonlocalCode = ((indent + 1) * indentString) + "nonlocal buf\n" code += prefix + ('def inner%s(self, data, partials, labels):\n' % innerCounter) + nonlocalCode + innerCode + '\n' code += prefix + 'self._section(' + accessorCode + ', partials, labels, inner%s)\n' % innerCounter elif tag == "=": code += prefix + 'buf += self._data(' + accessorCode + ')\n' elif tag == "$": code += prefix + 'buf += self._variable(' + accessorCode + ')\n' elif tag == ">": code += prefix + 'buf += self._partial("' + escaped + '",data, partials, labels)\n' elif tag == "_": if labels and escaped in labels: code += walk(Parser.parse(labels[escaped], True), labels, indent + 1) else: code += prefix + 'buf += self._label("' + escaped + '", data, partials, labels)\n' return code
def compile(text, labels=None, nostrip=False, name=None): # Parse text into a tree tree = Parser.parse(text, nostrip) # Generate code for render function wrapped = indentString + 'buf = ""\n' + walk(tree, labels, nostrip, 1) + "\n" + indentString + 'return buf' code = "def render(self, data, partials=None, labels=None):\n%s" % wrapped # Execute in an sandboxes environment export = {} exec(code, None, export) # Create new template instance based on "compiled" exported render method return Template.Template(export["render"], text, name)
def walk(node, labels, nostrip): code = "" for current in node: if isinstance(current, str): code += 'buf+="' + escapeMatcher(current) + '";\n' elif current["tag"] == "\n": code += 'buf+="\\n";\n' else: tag = current["tag"] name = current["name"] escaped = escapeMatcher(name) if tag in accessTags: if name == ".": accessor = 2 elif "." in name: accessor = 1 else: accessor = 0 accessorCode = '"' + escaped + '",' + str(accessor) + ',data' if tag in innerTags: innerCode = walk(current["nodes"], labels, nostrip) if tag == "?": code += 'if(this._has(' + accessorCode + ')){\n' + innerCode + '}\n' elif tag == "^": code += 'if(!this._has(' + accessorCode + ')){\n' + innerCode + '}\n' elif tag == "#": code += 'this._section(' + accessorCode + ',partials,labels,function(data,partials,labels){\n' + innerCode + '\n});\n' elif tag == "=": code += 'buf+=this._data(' + accessorCode + ');\n' elif tag == "$": code += 'buf+=this._variable(' + accessorCode + ');\n' elif tag == ">": code += 'buf+=this._partial("' + escaped + '",data,partials,labels);\n' elif tag == "_": if labels and escaped in labels: code += walk(Parser.parse(labels[escaped], True), labels) else: code += 'buf+=this._label("' + escaped + '",data,partials,labels);\n' return code