Source code for jasy.template.Compiler

#
# Jasy - Web Tooling Framework
# Copyright 2010-2012 Zynga Inc.
# Copyright 2013-2014 Sebastian Fastner
#
# Based upon
# Core - JavaScript Foundation
# Copyright 2010-2012 Zynga Inc.
# Copyright 2012-2014 Sebastian Werner
#
# Based upon
# Hogan.JS by Twitter, Inc.
# https://github.com/twitter/hogan.js
# Licensed under the Apache License, Version 2.0
#

__all__ = ("compile")

import jasy.template.Parser as Parser

accessTags = [
    "#",     # go into section / loop start
    "?",     # if / has
    "^",     # if not / has not
    "$",     # insert variable
    "="      # insert raw / non escaped
]

# Tags which support children
innerTags = [
    "#",
    "?",
    "^"
]


[docs]def escapeContent(content): return content.replace("\"", "\\\"").replace("\n", "\\n")
[docs]def escapeMatcher(str): return str.replace("\\", "\\\\").replace("\"", "\\\"").replace("\n", "\\\n").replace("\r", "\\\r")
[docs]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
[docs]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)