[PATCH 3 of 3] templater: make the templating engine pluggable to some extent
John Mulligan
phlogistonjohn at asynchrono.us
Mon Apr 6 16:53:30 UTC 2009
On Mon, Apr 06, 2009 at 05:44:32PM +0200, Dirkjan Ochtman wrote:
> # 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
Where does loader come from, could this be a typo?
I put a print statement in here as an experiment, but didn't
get any results. So, I'm not even sure if this class is being
used by the templater.
> +
> + 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
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
>
More information about the Mercurial-devel
mailing list