]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
py-cvs merge, python 1.5.2 compatability
authorSteven M. Gava <elguavas@python.net>
Thu, 12 Jul 2001 06:54:16 +0000 (06:54 +0000)
committerSteven M. Gava <elguavas@python.net>
Thu, 12 Jul 2001 06:54:16 +0000 (06:54 +0000)
Lib/idlelib/ReplaceDialog.py

index e29d4d6f0b4c279acc19311893eaff65ffc938c9..83462f9a1f79c8a9e1df4aeef743098e756d4323 100644 (file)
@@ -90,7 +90,7 @@ class ReplaceDialog(SearchDialogBase):
             line, m = res
             chars = text.get("%d.0" % line, "%d.0" % (line+1))
             orig = m.group()
-            new = re.pcre_expand(m, repl)
+            new = self._expand(m, repl)
             i, j = m.span()
             first = "%d.%d" % (line, i)
             last = "%d.%d" % (line, j)
@@ -142,7 +142,7 @@ class ReplaceDialog(SearchDialogBase):
         m = prog.match(chars, col)
         if not prog:
             return 0
-        new = re.pcre_expand(m, self.replvar.get())
+        new = self._expand(m, self.replvar.get())
         text.mark_set("insert", first)
         text.undo_block_start()
         if m.group():
@@ -154,6 +154,22 @@ class ReplaceDialog(SearchDialogBase):
         self.ok = 0
         return 1
 
+    def _expand(self, m, template):
+        # XXX This code depends on internals of the regular expression
+        # engine!  There's no standard API to do a substitution when you
+        # have already found the match.  One should be added.
+        # The solution here is designed to be backwards compatible
+        # with previous Python versions, e.g. 1.5.2.
+        # XXX This dynamic test should be done only once.
+        if getattr(re, "engine", "pre") == "pre":
+            return re.pcre_expand(m, template)
+        else: # sre
+            # XXX This import should be avoidable...
+            import sre_parse
+            # XXX This parses the template over and over...
+            ptemplate = sre_parse.parse_template(template, m.re)
+            return sre_parse.expand_template(ptemplate, m)
+
     def show_hit(self, first, last):
         text = self.text
         text.mark_set("insert", first)