[Zope-Checkins] CVS: Zope3/lib/python/Zope/TAL - TALGenerator.py:1.58 TALInterpreter.py:1.77
Fred L. Drake, Jr.
fdrake@acm.org
Mon, 17 Jun 2002 17:00:36 -0400
Update of /cvs-repository/Zope3/lib/python/Zope/TAL
In directory cvs.zope.org:/tmp/cvs-serv32223
Modified Files:
TALGenerator.py TALInterpreter.py
Log Message:
Implement lexical scoping of the translation context.
=== Zope3/lib/python/Zope/TAL/TALGenerator.py 1.57 => 1.58 ===
from TALDefs import *
+from TranslationContext import TranslationContext, DEFAULT_DOMAIN
class TALGenerator:
@@ -51,6 +52,7 @@
if source_file is not None:
self.source_file = source_file
self.emit("setSourceFile", source_file)
+ self.i18nContext = TranslationContext()
def getCode(self):
assert not self.stack
@@ -549,13 +551,23 @@
self.pushProgram()
todo["defineSlot"] = defineSlot
+ if defineSlot or i18ndict:
+
+ domain = i18ndict.get("domain") or self.i18nContext.domain
+ source = i18ndict.get("source") or self.i18nContext.source
+ target = i18ndict.get("target") or self.i18nContext.target
+ if ( domain != DEFAULT_DOMAIN
+ or source is not None
+ or target is not None):
+ self.i18nContext = TranslationContext(self.i18nContext,
+ domain=domain,
+ source=source,
+ target=target)
+ self.emit("beginI18nContext",
+ {"domain": domain, "source": source,
+ "target": target})
+ todo["i18ncontext"] = 1
if taldict or i18ndict:
- if i18ndict:
- if ( "domain" in i18ndict
- or "source" in i18ndict
- or "target" in i18ndict):
- self.emit("beginI18nContext", i18ndict)
- todo["i18ncontext"] = 1
dict = {}
for item in attrlist:
key, value = item[:2]
@@ -704,6 +716,8 @@
self.emit("endScope")
if i18ncontext:
self.emit("endI18nContext")
+ assert self.i18nContext.parent is not None
+ self.i18nContext = self.i18nContext.parent
if defineSlot:
self.emitDefineSlot(defineSlot)
if fillSlot:
=== Zope3/lib/python/Zope/TAL/TALInterpreter.py 1.76 => 1.77 ===
self.endlen = len(self.endsep)
self.macroStack = []
- self.popMacro = self.macroStack.pop
self.position = None, None # (lineno, offset)
self.col = 0
self.level = 0
@@ -142,7 +141,12 @@
if len(self.macroStack) >= self.stackLimit:
raise METALError("macro nesting limit (%d) exceeded "
"by %s" % (self.stackLimit, `macroName`))
- self.macroStack.append([macroName, slots, entering])
+ self.macroStack.append([macroName, slots, entering, self.i18nContext])
+
+ def popMacro(self):
+ stuff = self.macroStack.pop()
+ self.i18nContext = stuff[3]
+ return stuff
def macroContext(self, what):
macroStack = self.macroStack
@@ -375,7 +379,7 @@
def dumpMacroStack(self, prefix, suffix, value):
sys.stderr.write("+---- %s%s = %s\n" % (prefix, suffix, value))
for i in range(len(self.macroStack)):
- what, macroName, slots = self.macroStack[i]
+ what, macroName, slots = self.macroStack[i][:3]
sys.stderr.write("| %2d. %-12s %-12s %s\n" %
(i, what, macroName, slots and slots.keys()))
sys.stderr.write("+--------------------------------------\n")
@@ -616,6 +620,7 @@
if not entering:
macs.append(None)
self.interpret(macro)
+ assert macs[-1] is None
macs.pop()
return
self.interpret(macro)
@@ -669,9 +674,7 @@
self.pushMacro(macroName, slots, entering=0)
return
self.pushMacro(macroName, slots)
- if len(macs) == 1:
- self.interpret(block)
- return
+ # Falling out of the 'if' allows the macro to be interpreted.
self.interpret(block)
bytecode_handlers["defineSlot"] = do_defineSlot