diff options
Diffstat (limited to 'pystache/template.py')
-rw-r--r-- | pystache/template.py | 181 |
1 files changed, 0 insertions, 181 deletions
diff --git a/pystache/template.py b/pystache/template.py deleted file mode 100644 index f8219cb..0000000 --- a/pystache/template.py +++ /dev/null @@ -1,181 +0,0 @@ -import re -import cgi -import collections -import os -import copy - -try: - import markupsafe - escape = markupsafe.escape - literal = markupsafe.Markup - -except ImportError: - escape = lambda x: cgi.escape(unicode(x)) - literal = unicode - - -class Modifiers(dict): - """Dictionary with a decorator for assigning functions to keys.""" - - def set(self, key): - """ - Decorator function to set the given key to the decorated function. - - >>> modifiers = {} - >>> @modifiers.set('P') - ... def render_tongue(self, tag_name=None, context=None): - ... return ":P %s" % tag_name - >>> modifiers - {'P': <function render_tongue at 0x...>} - """ - - def setter(func): - self[key] = func - return func - return setter - - -class Template(object): - - tag_re = None - - otag = '{{' - - ctag = '}}' - - modifiers = Modifiers() - - def __init__(self, template=None, context=None, **kwargs): - from view import View - - self.template = template - - if kwargs: - context.update(kwargs) - - if isinstance(context, View): - self.view = context - else: - self.view = View(context=context) - - self._compile_regexps() - - def _compile_regexps(self): - tags = { - 'otag': re.escape(self.otag), - 'ctag': re.escape(self.ctag) - } - - section = r"%(otag)s[\#|^]([^\}]*)%(ctag)s\s*(.+?\s*)%(otag)s/\1%(ctag)s" - self.section_re = re.compile(section % tags, re.M|re.S) - - tag = r"%(otag)s(#|=|&|!|>|\{)?(.+?)\1?%(ctag)s+" - self.tag_re = re.compile(tag % tags) - - def _render_sections(self, template, view): - while True: - match = self.section_re.search(template) - if match is None: - break - - section, section_name, inner = match.group(0, 1, 2) - section_name = section_name.strip() - it = self.view.get(section_name, None) - replacer = '' - - # Callable - if it and callable(it): - replacer = it(inner) - # Dictionary - elif it and hasattr(it, 'keys') and hasattr(it, '__getitem__'): - if section[2] != '^': - replacer = self._render_dictionary(inner, it) - # Lists - elif it and hasattr(it, '__iter__'): - if section[2] != '^': - replacer = self._render_list(inner, it) - # Other objects - elif it and isinstance(it, object): - if section[2] != '^': - replacer = self._render_dictionary(inner, it) - # Falsey and Negated or Truthy and Not Negated - elif (not it and section[2] == '^') or (it and section[2] != '^'): - replacer = self._render_dictionary(inner, it) - - template = literal(template.replace(section, replacer)) - - return template - - def _render_tags(self, template): - while True: - match = self.tag_re.search(template) - if match is None: - break - - tag, tag_type, tag_name = match.group(0, 1, 2) - tag_name = tag_name.strip() - func = self.modifiers[tag_type] - replacement = func(self, tag_name) - template = template.replace(tag, replacement) - - return template - - def _render_dictionary(self, template, context): - self.view.context_list.insert(0, context) - template = Template(template, self.view) - out = template.render() - self.view.context_list.pop(0) - return out - - def _render_list(self, template, listing): - insides = [] - for item in listing: - insides.append(self._render_dictionary(template, item)) - - return ''.join(insides) - - @modifiers.set(None) - def _render_tag(self, tag_name): - raw = self.view.get(tag_name, '') - - # For methods with no return value - if not raw and raw is not 0: - if tag_name == '.': - raw = self.view.context_list[0] - else: - return '' - - return escape(raw) - - @modifiers.set('!') - def _render_comment(self, tag_name): - return '' - - @modifiers.set('>') - def _render_partial(self, template_name): - from pystache import Loader - markup = Loader().load_template(template_name, self.view.template_path, encoding=self.view.template_encoding) - template = Template(markup, self.view) - return template.render() - - @modifiers.set('=') - def _change_delimiter(self, tag_name): - """Changes the Mustache delimiter.""" - self.otag, self.ctag = tag_name.split(' ') - self._compile_regexps() - return '' - - @modifiers.set('{') - @modifiers.set('&') - def render_unescaped(self, tag_name): - """Render a tag without escaping it.""" - return literal(self.view.get(tag_name, '')) - - def render(self, encoding=None): - template = self._render_sections(self.template, self.view) - result = self._render_tags(template) - - if encoding is not None: - result = result.encode(encoding) - - return result |