diff mercurial/templater.py @ 8474:bccc90b56d02

templater: clean up the process method, separating code paths
author Dirkjan Ochtman <dirkjan@ochtman.nl>
date Sun, 17 May 2009 16:05:50 +0200
parents 0bf0045000b5
children caaf1e779b37
line wrap: on
line diff
--- a/mercurial/templater.py	Sun May 17 09:54:08 2009 +0200
+++ b/mercurial/templater.py	Sun May 17 16:05:50 2009 +0200
@@ -70,8 +70,32 @@
             else:
                 yield str(item)
 
+    def _format(self, key, format, get, map):
+        v = get(key)
+        if not hasattr(v, '__iter__'):
+            raise SyntaxError(_("Error expanding '%s%%%s'") % (key, format))
+        lm = map.copy()
+        for i in v:
+            lm.update(i)
+            yield self.process(format, lm)
+
+    def _filter(self, key, filters, get, map):
+        v = get(key)
+        for f in filters.split('|')[1:]:
+            v = self.filters[f](v)
+        return v
+
     def _process(self, tmpl, map):
         '''Render a template. Returns a generator.'''
+
+        def get(key):
+            v = map.get(key)
+            if v is None:
+                v = self.defaults.get(key, '')
+            if hasattr(v, '__call__'):
+                v = v(**map)
+            return v
+
         while tmpl:
             m = self.template_re.search(tmpl)
             if not m:
@@ -79,31 +103,18 @@
                 break
 
             start, end = m.span(0)
-            key, format, fl = m.groups()
+            key, fmt, fl = m.groups()
 
             if start:
                 yield tmpl[:start]
             tmpl = tmpl[end:]
 
-            if key in map:
-                v = map[key]
+            if fmt:
+                yield self._format(key, fmt, get, map)
+            elif fl:
+                yield self._filter(key, fl, get, map)
             else:
-                v = self.defaults.get(key, "")
-            if hasattr(v, '__call__'):
-                v = v(**map)
-            if format:
-                if not hasattr(v, '__iter__'):
-                    raise SyntaxError(_("Error expanding '%s%%%s'")
-                                      % (key, format))
-                lm = map.copy()
-                for i in v:
-                    lm.update(i)
-                    yield self.process(format, lm)
-            else:
-                if fl:
-                    for f in fl.split("|")[1:]:
-                        v = self.filters[f](v)
-                yield v
+                yield get(key)
 
 engines = {'default': engine}