mercurial/templater.py
changeset 1899 888d298ddb91
parent 1897 58b6784cf9f1
child 1900 f2815605186e
--- a/mercurial/templater.py
+++ b/mercurial/templater.py
@@ -10,9 +10,9 @@ class templater(object):
         self.defaults = defaults
 
         for l in file(mapfile):
-            m = re.match(r'(\S+)\s*=\s*"(.*)"$', l)
+            m = re.match(r'(\S+)\s*=\s*(".*"|\'.*\')$', l)
             if m:
-                self.cache[m.group(1)] = m.group(2)
+                self.cache[m.group(1)] = eval(m.group(2))
             else:
                 m = re.match(r'(\S+)\s*=\s*(\S+)', l)
                 if m:
@@ -20,6 +20,9 @@ class templater(object):
                 else:
                     raise LookupError(_("unknown map entry '%s'") % l)
 
+    def __contains__(self, key):
+        return key in self.cache
+
     def __call__(self, t, **map):
         m = self.defaults.copy()
         m.update(map)
@@ -31,7 +34,9 @@ class templater(object):
 
     def template(self, tmpl, filters={}, **map):
         while tmpl:
-            m = re.search(r"#([a-zA-Z0-9]+)((%[a-zA-Z0-9]+)*)((\|[a-zA-Z0-9]+)*)#", tmpl)
+            m = re.search(r"#([a-zA-Z_][a-zA-Z0-9_]*)"
+                          r"((%[a-zA-Z_][a-zA-Z0-9_]*)*)"
+                          r"((\|[a-zA-Z_][a-zA-Z0-9_]*)*)#", tmpl)
             if m:
                 yield tmpl[:m.start(0)]
                 v = map.get(m.group(1), "")
@@ -106,8 +111,10 @@ common_filters = {
     "rfc822date": lambda x: util.datestr(x, "%a, %d %b %Y %H:%M:%S"),
     }
 
-def templatepath():
-    for f in "templates", "../templates":
-        p = os.path.join(os.path.dirname(__file__), f)
-        if os.path.isdir(p):
+def templatepath(name=None):
+    for f in 'templates', '../templates':
+        fl = f.split('/')
+        if name: fl.append(name)
+        p = os.path.join(os.path.dirname(__file__), *fl)
+        if (name and os.path.exists(p)) or os.path.isdir(p):
             return os.path.normpath(p)