# HG changeset patch # User Yuya Nishihara # Date 1521295009 -32400 # Node ID 3235afdfcf1c456725c1e5e15bf64873d7249003 # Parent 46d9f998c3ed701bc15551a0ac935d86b24b5dc7 templater: add function that expands internal literal templates This will be used when rendering nested formatter items with the default template, e.g. fm.nested('parents', tmpl='{rev}:{node|formatnode}', sep=' ') ^^^^^^^^^^^^^^^^^^^^^^^ the default item template diff -r 46d9f998c3ed -r 3235afdfcf1c mercurial/templater.py --- a/mercurial/templater.py Fri Apr 06 11:28:26 2018 -0700 +++ b/mercurial/templater.py Sat Mar 17 22:56:49 2018 +0900 @@ -603,6 +603,7 @@ self._resources = resources self._aliasmap = _aliasrules.buildmap(aliases) self._cache = {} # key: (func, data) + self._tmplcache = {} # literal template: (func, data) def overlaymap(self, origmapping, newmapping): """Create combined mapping from the original mapping and partial @@ -659,6 +660,13 @@ raise return self._cache[t] + def _parse(self, tmpl): + """Parse and cache a literal template""" + if tmpl not in self._tmplcache: + x = parse(tmpl) + self._tmplcache[tmpl] = compileexp(x, self, methods) + return self._tmplcache[tmpl] + def preload(self, t): """Load, parse, and cache the specified template if available""" try: @@ -672,6 +680,18 @@ mapping contains added elements for use during expansion. Is a generator.''' func, data = self._load(t) + return self._expand(func, data, mapping) + + def expand(self, tmpl, mapping): + """Perform expansion over a literal template + + No user aliases will be expanded since this is supposed to be called + with an internal template string. + """ + func, data = self._parse(tmpl) + return self._expand(func, data, mapping) + + def _expand(self, func, data, mapping): # populate additional items only if they don't exist in the given # mapping. this is slightly different from overlaymap() because the # initial 'revcache' may contain pre-computed items.