[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()