[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