templater: add function that expands internal literal templates
authorYuya Nishihara <yuya@tcha.org>
Sat, 17 Mar 2018 22:56:49 +0900
changeset 37398 3235afdfcf1c
parent 37397 46d9f998c3ed
child 37399 0b64416224d9
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
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.