[PATCH 3 of 4] templater: make a template a string-only iterator
Dirkjan Ochtman
dirkjan at ochtman.nl
Sun Jun 29 08:24:42 CDT 2008
# HG changeset patch
# User Dirkjan Ochtman <dirkjan at ochtman.nl>
# Date 1214738185 -7200
# Node ID 3fa9a03b874d0356911f78bbbf9b696cfb2cbca3
# Parent 4732a9526cb7a3ead91176a8dd92a9cf44c23d92
templater: make a template a string-only iterator
diff --git a/mercurial/templater.py b/mercurial/templater.py
--- a/mercurial/templater.py
+++ b/mercurial/templater.py
@@ -81,18 +81,18 @@
def __contains__(self, key):
return key in self.cache or key in self.map
- def __call__(self, t, **map):
- '''perform expansion.
- t is name of map element to expand.
- map is added elements to use during expansion.'''
+ def _template(self, t):
+ '''Get the template for the given template name. Use a local cache.'''
if not t in self.cache:
try:
self.cache[t] = file(self.map[t]).read()
except IOError, inst:
raise IOError(inst.args[0], _('template file %s: %s') %
(self.map[t], inst.args[1]))
- tmpl = self.cache[t]
+ return self.cache[t]
+ def _process(self, tmpl, map):
+ '''Render a template. Returns a generator.'''
while tmpl:
m = self.template_re.search(tmpl)
if not m:
@@ -119,12 +119,33 @@
lm = map.copy()
for i in v:
lm.update(i)
- yield self(format, **lm)
+ t = self._template(format)
+ yield self._process(t, lm)
else:
if fl:
for f in fl.split("|")[1:]:
v = self.filters[f](v)
yield v
+
+ def __call__(self, t, **map):
+ '''Perform expansion. t is name of map element to expand. map contains
+ added elements for use during expansion. Is a generator.'''
+ tmpl = self._template(t)
+ iters = [self._process(tmpl, map)]
+ while iters:
+ try:
+ item = iters[0].next()
+ except StopIteration:
+ iters.pop(0)
+ continue
+ if isinstance(item, str):
+ yield item
+ elif item is None:
+ yield ''
+ elif hasattr(item, '__iter__'):
+ iters.insert(0, iter(item))
+ else:
+ yield str(item)
def templatepath(name=None):
'''return location of template file or directory (if no name).
More information about the Mercurial-devel
mailing list