Source code for jasy.template.Parser

#
# 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__ = ("tokenize", "parse")

import re
import collections

tagSplitter = r"(\{\{[^\{\}}]*\}\})"
tagMatcher = r"^\{\{\s*([#\^\/\?\!\<\>\$\=_]?)\s*([^\{\}}]*?)\s*\}\}$"


def buildTree(tokens, stack):
    """
    Processes a list of @tokens {String[]} to create a tree.
    Optional @stack {Array?} is used internally during recursion.
    """

    instructions = []

    while len(tokens) > 0:
        token = tokens.popleft()

        if isinstance(token, str):
            instructions.append(token)
        elif token["tag"] == "#" or token["tag"] == "^" or token["tag"] == "?":
            stack.append(token)
            token["nodes"] = buildTree(tokens, stack)
            instructions.append(token)
        elif token["tag"] == "/":
            opener = stack.pop()
            return instructions
        else:
            instructions.append(token)

    return instructions


[docs]def tokenize(text, nostrip=False): """ Tokenizer for template @text {String}. Returns an array of tokens where tags are returned as an object with the keys `tag` and `name` while normal strings are kept as strings. Optionally you can keep white spaces (line breaks, leading, trailing, etc.) by enabling @nostrip {Boolean?false}. """ if not nostrip: text = "".join([line.strip() for line in text.split("\n")]) tokens = [] splitted = re.split(tagSplitter, text) for segment in splitted: if len(segment) > 0: if segment[0] == "{": matched = re.match(tagMatcher, segment) if matched: tag = matched.group(1) # || "$" if not tag: tag = "$" if tag != "!": tokens.append({ "tag": tag, "name": matched.group(2) }) elif segment != "": tokens.append(segment) elif segment != "": tokens.append(segment) return tokens
[docs]def parse(text, nostrip=False): """ Returns the token tree of the given template @text {String}. A token holds the following information: - `tag`: tag of the token - `name`: name of the token - `nodes`: children of the node Optionally you can keep white spaces (line breaks, leading, trailing, etc.) by enabling @nostrip {Boolean?false}. """ return buildTree(collections.deque(tokenize(text, nostrip)), collections.deque())