summaryrefslogtreecommitdiff
path: root/pystache
diff options
context:
space:
mode:
authorChris Jerdonek <chris.jerdonek@gmail.com>2012-05-05 18:18:08 -0700
committerChris Jerdonek <chris.jerdonek@gmail.com>2012-05-05 18:18:08 -0700
commit0de74f66c00ea66abb5ee96cd96e9bf42d41c65d (patch)
tree96363ae716a9224bdd16d7fcec2782d6907d2eb1 /pystache
parent37b4e3dc6488943736535a7753b2a7f3b16e8d40 (diff)
downloadpystache-0de74f66c00ea66abb5ee96cd96e9bf42d41c65d.tar.gz
Added pretty-printing to the nodes of the ParsedTemplate.
Diffstat (limited to 'pystache')
-rw-r--r--pystache/parser.py53
1 files changed, 45 insertions, 8 deletions
diff --git a/pystache/parser.py b/pystache/parser.py
index ad3ee30..1a7c37e 100644
--- a/pystache/parser.py
+++ b/pystache/parser.py
@@ -26,6 +26,11 @@ def parse(template, delimiters=None):
delimiters: a 2-tuple of delimiters. Defaults to the package default.
+ Examples:
+
+ >>> parse("Hey {{#you}}{{name}}!{{/you}}")
+ ['Hey ', _SectionNode(key='you', index_begin=12, index_end=21, parsed=[_EscapeNode(key='name'), '!'])]
+
"""
parser = _Parser(delimiters)
return parser.parse(template)
@@ -66,9 +71,23 @@ class ParsingError(Exception):
## Node types
+def _format(obj, exclude=None):
+ if exclude is None:
+ exclude = []
+ exclude.append('key')
+ attrs = obj.__dict__
+ names = list(set(attrs.keys()) - set(exclude))
+ names.sort()
+ names.insert(0, 'key')
+ args = ["%s=%s" % (name, repr(attrs[name])) for name in names]
+ return "%s(%s)" % (obj.__class__.__name__, ", ".join(args))
+
class _CommentNode(object):
+ def __repr__(self):
+ return _format(self)
+
def render(self, engine, context):
return u''
@@ -78,15 +97,21 @@ class _ChangeNode(object):
def __init__(self, delimiters):
self.delimiters = delimiters
+ def __repr__(self):
+ return _format(self)
+
def render(self, engine, context):
return u''
-class _TagNode(object):
+class _EscapeNode(object):
def __init__(self, key):
self.key = key
+ def __repr__(self):
+ return _format(self)
+
def render(self, engine, context):
s = engine.fetch_string(context, self.key)
return engine.escape(s)
@@ -97,6 +122,9 @@ class _LiteralNode(object):
def __init__(self, key):
self.key = key
+ def __repr__(self):
+ return _format(self)
+
def render(self, engine, context):
s = engine.fetch_string(context, self.key)
return engine.literal(s)
@@ -108,6 +136,9 @@ class _PartialNode(object):
self.key = key
self.indent = indent
+ def __repr__(self):
+ return _format(self)
+
def render(self, engine, context):
template = engine.resolve_partial(self.key)
# Indent before rendering.
@@ -122,6 +153,9 @@ class _InvertedNode(object):
self.key = key
self.parsed_section = parsed_section
+ def __repr__(self):
+ return _format(self)
+
def render(self, engine, context):
# TODO: is there a bug because we are not using the same
# logic as in fetch_string()?
@@ -138,13 +172,16 @@ class _SectionNode(object):
# TODO: the template_ and parsed_template_ arguments don't both seem
# to be necessary. Can we remove one of them? For example, if
# callable(data) is True, then the initial parsed_template isn't used.
- def __init__(self, key, parsed_contents, delimiters, template, section_begin_index, section_end_index):
+ def __init__(self, key, parsed, delimiters, template, index_begin, index_end):
self.delimiters = delimiters
self.key = key
- self.parsed_contents = parsed_contents
+ self.parsed = parsed
self.template = template
- self.section_begin_index = section_begin_index
- self.section_end_index = section_end_index
+ self.index_begin = index_begin
+ self.index_end = index_end
+
+ def __repr__(self):
+ return _format(self, exclude=['delimiters', 'template'])
def render(self, engine, context):
data = engine.fetch_section_data(context, self.key)
@@ -167,13 +204,13 @@ class _SectionNode(object):
# https://github.com/defunkt/pystache/issues/113
#
# TODO: should we check the arity?
- val = val(self.template[self.section_begin_index:self.section_end_index])
+ val = val(self.template[self.index_begin:self.index_end])
val = engine._render_value(val, context, delimiters=self.delimiters)
parts.append(val)
continue
context.push(val)
- parts.append(engine.render_parsed(self.parsed_contents, context))
+ parts.append(engine.render_parsed(self.parsed, context))
context.pop()
return unicode(''.join(parts))
@@ -310,7 +347,7 @@ class _Parser(object):
return _ChangeNode(delimiters)
if tag_type == '':
- return _TagNode(tag_key)
+ return _EscapeNode(tag_key)
if tag_type == '&':
return _LiteralNode(tag_key)