[PATCH 3 of 3] templater: make the templating engine pluggable to some extent

Dirkjan Ochtman dirkjan at ochtman.nl
Mon Apr 6 10:44:32 CDT 2009


# HG changeset patch
# User Dirkjan Ochtman <dirkjan at ochtman.nl>
# Date 1239025294 -7200
# Node ID 5d100d5981b555f036d1b544e7b19928cd8d5660
# Parent  e5273a9182109eb5489598ad25425659ec0b66e5
templater: make the templating engine pluggable to some extent

diff -r e5273a918210 -r 5d100d5981b5 mercurial/templater.py
--- a/mercurial/templater.py	Mon Apr 06 16:28:30 2009 +0200
+++ b/mercurial/templater.py	Mon Apr 06 15:41:34 2009 +0200
@@ -105,6 +105,8 @@
                         v = self.filters[f](v)
                 yield v
 
+engines = {'default': engine}
+
 class templater(object):
 
     def __init__(self, mapfile, filters={}, defaults={}, cache={},
@@ -121,6 +123,7 @@
         self.filters.update(filters)
         self.defaults = defaults
         self.minchunk, self.maxchunk = minchunk, maxchunk
+        self.engines = {}
 
         if not mapfile:
             return
@@ -142,6 +145,7 @@
                         raise SyntaxError('%s:%s: %s' %
                                           (mapfile, i, inst.args[0]))
                 else:
+                    val = val.split(':', 1)[-1] # strip engine from path
                     self.map[key] = os.path.join(self.base, val)
             else:
                 raise SyntaxError(_("%s:%s: parse error") % (mapfile, i))
@@ -160,7 +164,16 @@
         return self.cache[t]
 
     def __call__(self, t, **map):
-        proc = engine(self.load, self.filters, self.defaults)
+
+        ttype = 'default'
+        if ':' in t:
+            ttype, t = s.split(':', 1)
+
+        proc = self.engines.get(ttype)
+        if proc is None:
+            proc = engines[ttype](self.load, self.filters, self.defaults)
+            self.engines[ttype] = proc
+
         stream = proc.process(t, map)
         if self.minchunk:
             stream = util.increasingchunks(stream, min=self.minchunk,
diff -r e5273a918210 -r 5d100d5981b5 tests/test-template-engine
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-template-engine	Mon Apr 06 15:41:34 2009 +0200
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+cat > engine.py << EOF
+
+class mytemplater(object):
+    def __init__(self, load, filters, defaults):
+        self.loader = loader
+
+    def process(self, t, map):
+        tmpl = self.loader(t)
+        for k, v in map.iteritems():
+            tmpl = tmpl.replace('{%k}' % k, v)
+        yield tmpl
+
+from mercurial import templater
+templater.engines['my'] = mytemplater
+EOF
+
+hg init test
+echo '[extensions]' > test/.hg/hgrc
+echo "engine = $PWD/engine.py" >> test/.hg/hgrc
+
+cd test
+cat > mymap << EOF
+changeset = my:changeset.txt
+EOF
+
+cat > changeset.txt << EOF
+{rev} {node} {author}
+EOF
+
+hg ci -Ama
+hg log --style=./mymap
diff -r e5273a918210 -r 5d100d5981b5 tests/test-template-engine.out
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-template-engine.out	Mon Apr 06 15:41:34 2009 +0200
@@ -0,0 +1,3 @@
+adding changeset.txt
+adding mymap
+0 307664789dc62d1fed343662ea29b0e77b17546b test


More information about the Mercurial-devel mailing list