[Zope-Checkins] CVS: Zope3/lib/python/Zope/TAL - DummyEngine.py:1.33

Fred L. Drake, Jr. fdrake@acm.org
Wed, 12 Jun 2002 09:55:05 -0400


Update of /cvs-repository/Zope3/lib/python/Zope/TAL
In directory cvs.zope.org:/tmp/cvs-serv16313

Modified Files:
	DummyEngine.py 
Log Message:
Marge from fdrake-tal-i18n-branch:
Delay imports of driver, since that module is riddled with dependencies.
Add a simple Translation Service implementation, and expose it via a new
method, getTranslationService().


=== Zope3/lib/python/Zope/TAL/DummyEngine.py 1.32 => 1.33 ===
 import sys
 
-import driver
-
 from TALDefs import NAME_RE, TALESError, ErrorInfo
+from Zope.I18n.ITranslationService import ITranslationService
+from Zope.I18n.IDomain import IDomain
 
 Default = object()
 
@@ -41,6 +41,7 @@
         dict = {'nothing': None, 'default': Default}
         self.locals = self.globals = dict
         self.stack = [dict]
+        self.translationService = DummyTranslationService()
 
     def getCompilerError(self):
         return CompilerError
@@ -88,13 +89,7 @@
         if type in ("string", "str"):
             return expr
         if type in ("path", "var", "global", "local"):
-            expr = expr.strip()
-            if self.locals.has_key(expr):
-                return self.locals[expr]
-            elif self.globals.has_key(expr):
-                return self.globals[expr]
-            else:
-                raise TALESError("unknown variable: %s" % `expr`)
+            return self.evaluatePathOrVar(expr)
         if type == "not":
             return not self.evaluate(expr)
         if type == "exists":
@@ -114,6 +109,15 @@
             return '%s (%s,%s)' % (self.source_file, lineno, offset)
         raise TALESError("unrecognized expression: " + `expression`)
 
+    def evaluatePathOrVar(self, expr):
+        expr = expr.strip()
+        if self.locals.has_key(expr):
+            return self.locals[expr]
+        elif self.globals.has_key(expr):
+            return self.globals[expr]
+        else:
+            raise TALESError("unknown variable: %s" % `expr`)
+
     def evaluateValue(self, expr):
         return self.evaluate(expr)
 
@@ -144,6 +148,7 @@
             macro = self.macros[localName]
         else:
             # External macro
+            import driver
             program, macros = driver.compilefile(file)
             macro = macros.get(localName)
             if not macro:
@@ -155,6 +160,7 @@
         file, localName = self.findMacroFile(macroName)
         if not file:
             return file, localName
+        import driver
         doc = driver.parsefile(file)
         return doc, localName
 
@@ -181,6 +187,9 @@
     def getDefault(self):
         return Default
 
+    def getTranslationService(self):
+        return self.translationService
+
 class Iterator:
 
     def __init__(self, name, seq, engine):
@@ -198,3 +207,50 @@
         self.nextIndex = i+1
         self.engine.setLocal(self.name, item)
         return 1
+
+class DummyDomain:
+    __implements__ = IDomain
+
+    def translate(self, msgid, mapping=None, context=None,
+                  target_language=None):
+        # This is a fake translation service which simply uppercases non
+        # ${name} placeholder text in the message id.
+        #
+        # First, transform a string with ${name} placeholders into a list of
+        # substrings.  Then upcase everything but the placeholders, then glue
+        # things back together.
+        s = msgid.replace('%', '%%')
+        parts = re.split(r'(\${2})|\$([_a-z]\w*)|\${([_a-z]\w*)}',
+                         s, re.IGNORECASE)
+        if len(parts) == 1:
+            # There are no ${name} placeholders in the source string.  We use
+            # msgid here so we don't end up with doubled %'s.
+            return msgid.upper()
+        # Transform ${name} into %(name)s so we can use Python's built-in
+        # string interpolation feature.
+        xlateParts = []
+        for i in range(1, len(parts), 4):
+            if parts[i] is not None:
+                p = parts[i] = '$'
+            elif parts[i+1] is not None:
+                p = parts[i+1] = '%(' + parts[i+1] + ')s'
+            else:
+                p = parts[i+2] = '%(' + parts[i+2] + ')s'
+            xlateParts.append(p)
+            xlateParts.append(parts[i+3].upper())
+        if mapping is None:
+            mapping = {}
+        return ''.join(xlateParts) % mapping
+        
+
+class DummyTranslationService:
+    __implements__ = ITranslationService
+
+    def translate(self, domain, msgid, mapping=None, context=None,
+                  target_language=None):
+        # Ignore domain
+        return self.getDomain(domain).translate(msgid, mapping, context,
+                                                target_language)
+
+    def getDomain(self, domain):
+        return DummyDomain()