Example #1
0
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)
Example #2
0
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)
Example #5
0
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
Example #6
0
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