From 17cb60083c53b464a329f1a660a922db677389dd Mon Sep 17 00:00:00 2001
From: Barry Warsaw <barry@python.org>
Date: Sat, 18 Sep 2004 00:06:34 +0000
Subject: At the cost of a modest (but useful in its own right) change in the
 semantics of the Template.delimiter attribute, we make use of the delimiter
 in the escaped group, and in the safe_substitute() method more robust.

Now, .delimiter should be the unescaped delimiter literal, e.g. '$' or '&', or
whatever.  The _TemplateMetaclass will re.escape() this value when it builds
the pattern.
---
 Lib/string.py | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/Lib/string.py b/Lib/string.py
index 3c37b0b..623eb0e 100644
--- a/Lib/string.py
+++ b/Lib/string.py
@@ -113,7 +113,7 @@ class _TemplateMetaclass(type):
             pattern = cls.pattern
         else:
             pattern = _TemplateMetaclass.pattern % {
-                'delim' : cls.delimiter,
+                'delim' : _re.escape(cls.delimiter),
                 'id'    : cls.idpattern,
                 }
         cls.pattern = _re.compile(pattern, _re.IGNORECASE | _re.VERBOSE)
@@ -123,7 +123,7 @@ class Template:
     """A string class for supporting $-substitutions."""
     __metaclass__ = _TemplateMetaclass
 
-    delimiter = r'\$'
+    delimiter = '$'
     idpattern = r'[_a-z][_a-z0-9]*'
 
     def __init__(self, template):
@@ -152,7 +152,6 @@ class Template:
             mapping = _multimap(kws, args[0])
         else:
             mapping = args[0]
-        delimiter = self.delimiter[-1]
         # Helper function for .sub()
         def convert(mo):
             # Check the most common path first.
@@ -163,7 +162,7 @@ class Template:
                 # fail if val is a Unicode containing non-ASCII characters.
                 return '%s' % val
             if mo.group('escaped') is not None:
-                return delimiter
+                return self.delimiter
             if mo.group('invalid') is not None:
                 self._invalid(mo)
             raise ValueError('Unrecognized named group in pattern', pattern)
@@ -178,7 +177,6 @@ class Template:
             mapping = _multimap(kws, args[0])
         else:
             mapping = args[0]
-        delimiter = self.delimiter[-1]
         # Helper function for .sub()
         def convert(mo):
             named = mo.group('named')
@@ -188,15 +186,15 @@ class Template:
                     # will fail if val is a Unicode containing non-ASCII
                     return '%s' % mapping[named]
                 except KeyError:
-                    return delimiter + named
+                    return self.delimiter + named
             braced = mo.group('braced')
             if braced is not None:
                 try:
                     return '%s' % mapping[braced]
                 except KeyError:
-                    return delimiter + '{' + braced + '}'
+                    return self.delimiter + '{' + braced + '}'
             if mo.group('escaped') is not None:
-                return delimiter
+                return self.delimiter
             if mo.group('invalid') is not None:
                 self._invalid(mo)
             raise ValueError('Unrecognized named group in pattern', pattern)
-- 
cgit v0.12

