[Checkins] SVN: Sandbox/malthe/chameleon.genshi/src/chameleon/genshi/expressions.py Use interpolation expression parsing capabilities in core package.

Malthe Borch mborch at gmail.com
Mon Sep 22 12:02:44 EDT 2008


Log message for revision 91349:
  Use interpolation expression parsing capabilities in core package.

Changed:
  U   Sandbox/malthe/chameleon.genshi/src/chameleon/genshi/expressions.py

-=-
Modified: Sandbox/malthe/chameleon.genshi/src/chameleon/genshi/expressions.py
===================================================================
--- Sandbox/malthe/chameleon.genshi/src/chameleon/genshi/expressions.py	2008-09-22 16:01:58 UTC (rev 91348)
+++ Sandbox/malthe/chameleon.genshi/src/chameleon/genshi/expressions.py	2008-09-22 16:02:44 UTC (rev 91349)
@@ -5,6 +5,7 @@
 from zope import component
 
 from chameleon.core import types
+from chameleon.core import parsing
 
 class ExpressionTranslator(object):
     """Genshi expression translation."""
@@ -12,8 +13,6 @@
     re_method = re.compile(r'^(?P<name>[A-Za-z0-9_]+)'
                            '(\((?P<args>[A-Za-z0-9_]+\s*(,\s*[A-Za-z0-9_]+)*)\))?')
 
-    re_interpolation = re.compile(r'(?P<prefix>[^\\]\$|^\$)({((?P<expression>.*)})?|'
-                                  '(?P<variable>[A-Za-z][A-Za-z0-9_]*))')
 
     def declaration(self, string):
         """Variable declaration.
@@ -311,130 +310,6 @@
         return types.value(string.strip())
 
     def split(self, string):
-        """Split up an interpolation string expression into parts that
-        are either unicode strings or ``value``-tuples.
-
-        >>> class MockTranslator(ExpressionTranslator):
-        ...     def expression(self, string):
-        ...         return types.value(string)
+        return parsing.interpolate(string, self.expression)
         
-        >>> split = MockTranslator().split
-
-        >>> split("${abc}")
-        (value('abc'),)
-
-        >>> split(" ${abc}")
-        (' ', value('abc'))
-
-        >>> split("abc${def}")
-        ('abc', value('def'))
-
-        >>> split("${def}abc")
-        (value('def'), 'abc')
-
-        >>> split("abc${def}ghi")
-        ('abc', value('def'), 'ghi')
-
-        >>> split("abc${def}ghi${jkl}")
-        ('abc', value('def'), 'ghi', value('jkl'))
-
-        >>> split("abc${def}")
-        ('abc', value('def'))
-
-        >>> print split(u"abc${ghi}")
-        (u'abc', value('ghi'))
-        
-        """
-
-        m = self.interpolate(string)
-        if m is None:
-            return (string,)
-
-        prefix = m.group('prefix')
-        parts = []
-        
-        start = m.start() + len(prefix) - 1
-        if start > 0:
-            text = string[:start]
-            parts.append(text)
-
-        expression = m.group('expression')
-        variable = m.group('variable')
-
-        if expression:
-            parts.append(self.expression(expression))
-        elif variable:
-            parts.append(self.expression(variable))
-                
-        rest = string[m.end():]
-        if len(rest):
-            parts.extend(self.split(rest))
-
-        return tuple(parts)
-
-    def interpolate(self, string):
-        """Search for an interpolation and return a match.
-
-        >>> class MockTranslator(ExpressionTranslator):
-        ...     def expression(self, string):
-        ...         return types.parts((types.value(string),))
-
-        >>> interpolate = MockTranslator().interpolate
-        
-        >>> interpolate('${abc}').group('expression')
-        'abc'
-
-        >>> interpolate(' ${abc}').group('expression')
-        'abc'
-
-        >>> interpolate('abc${def}').group('expression')
-        'def'
-
-        >>> interpolate('abc${def}ghi${jkl}').group('expression')
-        'def'
-
-        >>> interpolate('$abc').group('variable')
-        'abc'
-
-        >>> interpolate('${abc')
-        Traceback (most recent call last):
-          ...
-        SyntaxError: Interpolation expressions must be of the form ${<expression>} (${abc)
-        
-        """
-
-        m = self.re_interpolation.search(string)
-        if m is None:
-            return None
-
-        expression = m.group('expression')
-        variable = m.group('variable')
-        
-        if expression:
-            left = m.start()+len(m.group('prefix'))+1
-            right = string.find('}')
-
-            while right != -1:
-                match = string[left:right]
-                try:
-                    exp = self.expression(match)
-                    break
-                except SyntaxError:
-                    right = string.find('}', right)
-            else:
-                raise
-
-            string = string[:right+1]
-            return self.re_interpolation.search(string)
-
-        if m is None or (expression is None and variable is None):
-            raise SyntaxError(
-                "Interpolation expressions must be of the "
-                "form ${<expression>} (%s)" % string)
-
-        if expression and not m.group('expression'):
-            raise SyntaxError(expression)
-
-        return m
-
 translator = ExpressionTranslator()



More information about the Checkins mailing list