summaryrefslogtreecommitdiff
path: root/pystache
diff options
context:
space:
mode:
authorChris Jerdonek <chris.jerdonek@gmail.com>2012-05-05 11:39:46 -0700
committerChris Jerdonek <chris.jerdonek@gmail.com>2012-05-05 13:02:24 -0700
commitf94aa621f125d59ebaf19e9bf110e23a04a10637 (patch)
tree678e7ef8d3701a419b95bbfe12d146908de8edef /pystache
parent7eef0a68507d1f01464d9ee980483ba2fca10c28 (diff)
downloadpystache-f94aa621f125d59ebaf19e9bf110e23a04a10637.tar.gz
Started decoupling Parser from RenderEngine.
Diffstat (limited to 'pystache')
-rw-r--r--pystache/parsed.py7
-rw-r--r--pystache/parser.py24
-rw-r--r--pystache/renderengine.py33
3 files changed, 32 insertions, 32 deletions
diff --git a/pystache/parsed.py b/pystache/parsed.py
index d791be4..0055837 100644
--- a/pystache/parsed.py
+++ b/pystache/parsed.py
@@ -38,7 +38,7 @@ class ParsedTemplate(object):
def add(self, node):
self._parse_tree.append(node)
- def render(self, context):
+ def render(self, engine, context):
"""
Returns: a string of type unicode.
@@ -47,9 +47,10 @@ class ParsedTemplate(object):
def get_unicode(val):
if callable(val):
return val(context)
- return val
+ if isinstance(val, basestring):
+ return val
+ return val.render(engine, context)
parts = map(get_unicode, self._parse_tree)
s = ''.join(parts)
return unicode(s)
-
diff --git a/pystache/parser.py b/pystache/parser.py
index 99f8d13..cb12306 100644
--- a/pystache/parser.py
+++ b/pystache/parser.py
@@ -52,6 +52,26 @@ class ParsingError(Exception):
pass
+class VariableNode(object):
+
+ def __init__(self, key):
+ self.key = key
+
+ def render(self, engine, context):
+ s = engine._get_string_value(context, self.key)
+ return engine.escape(s)
+
+
+class LiteralNode(object):
+
+ def __init__(self, key):
+ self.key = key
+
+ def render(self, engine, context):
+ s = engine._get_string_value(context, self.key)
+ return engine.literal(s)
+
+
class Parser(object):
_delimiters = None
@@ -192,10 +212,10 @@ class Parser(object):
return u''
if tag_type == '':
- return self.engine._make_get_escaped(tag_key)
+ return VariableNode(tag_key)
if tag_type == '&':
- return self.engine._make_get_literal(tag_key)
+ return LiteralNode(tag_key)
if tag_type == '>':
return self.engine._make_get_partial(tag_key, leading_whitespace)
diff --git a/pystache/renderengine.py b/pystache/renderengine.py
index 16cd940..80f795d 100644
--- a/pystache/renderengine.py
+++ b/pystache/renderengine.py
@@ -106,30 +106,6 @@ class RenderEngine(object):
return val
- def _make_get_literal(self, name):
- def get_literal(context):
- """
- Returns: a string of type unicode.
-
- """
- s = self._get_string_value(context, name)
- return self.literal(s)
-
- return get_literal
-
- def _make_get_escaped(self, name):
- get_literal = self._make_get_literal(name)
-
- def get_escaped(context):
- """
- Returns: a string of type unicode.
-
- """
- s = self._get_string_value(context, name)
- return self.escape(s)
-
- return get_escaped
-
def _make_get_partial(self, tag_key, leading_whitespace):
template = self.resolve_partial(tag_key)
@@ -158,7 +134,7 @@ class RenderEngine(object):
# Per the spec, lambdas in inverted sections are considered truthy.
if data:
return u''
- return parsed_template.render(context)
+ return self._render_parsed(parsed_template, context)
return get_inverse
@@ -228,13 +204,16 @@ class RenderEngine(object):
continue
context.push(val)
- parts.append(parsed_template.render(context))
+ parts.append(self._render_parsed(parsed_template, context))
context.pop()
return unicode(''.join(parts))
return get_section_value
+ def _render_parsed(self, parsed_template, context_stack):
+ return parsed_template.render(self, context_stack)
+
def _render_value(self, val, context, delimiters=None):
"""
Render an arbitrary value.
@@ -262,4 +241,4 @@ class RenderEngine(object):
parser = Parser(self, delimiters=delimiters)
parsed_template = parser.parse(template)
- return parsed_template.render(context_stack)
+ return self._render_parsed(parsed_template, context_stack)