opental-checkins
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[OpenTAL-checkins] opental OpenPT/OpenPTBase.py OpenPT/Zpax.py Ope...


From: Fernando Lalo Martins
Subject: [OpenTAL-checkins] opental OpenPT/OpenPTBase.py OpenPT/Zpax.py Ope...
Date: Sun, 13 Apr 2003 09:03:15 -0400

CVSROOT:        /cvsroot/opental
Module name:    opental
Changes by:     Fernando Lalo Martins <address@hidden>  03/04/13 09:03:15

Modified files:
        OpenPT         : OpenPTBase.py Zpax.py 
        OpenTAL        : Context.py 
        pax            : paxtransform.py utils.py 

Log message:
        at last... the much-awaited refactor of paxtransform ;-)

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/opental/opental/OpenPT/OpenPTBase.py.diff?tr1=1.9&tr2=1.10&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/opental/opental/OpenPT/Zpax.py.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/opental/opental/OpenTAL/Context.py.diff?tr1=1.4&tr2=1.5&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/opental/opental/pax/paxtransform.py.diff?tr1=1.30&tr2=1.31&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/opental/opental/pax/utils.py.diff?tr1=1.10&tr2=1.11&r1=text&r2=text

Patches:
Index: opental/OpenPT/OpenPTBase.py
diff -u opental/OpenPT/OpenPTBase.py:1.9 opental/OpenPT/OpenPTBase.py:1.10
--- opental/OpenPT/OpenPTBase.py:1.9    Fri Feb 21 00:06:38 2003
+++ opental/OpenPT/OpenPTBase.py        Sun Apr 13 09:03:15 2003
@@ -15,7 +15,7 @@
 #    You should have received a copy of the GNU General Public License
 #    along with this program; if not, write to the Free Software
 #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
-__version__='$Revision: 1.9 $'[11:-2]
+__version__='$Revision: 1.10 $'[11:-2]
 
 # ugh, this import list needs to be cleaned up
 import OpenTAL, pax, PTmetal_handler, pax.paxtransform, Zpax
@@ -139,8 +139,10 @@
 
     def evaluateMacro(self, expr):
         # XXX Should return None or a macro definition
+        __traceback_info__ = expr
         macro = self.evaluate(expr)
         if type(macro) is types.StringType:
+            __traceback_info__ = (expr, macro)
             macro = pickle.loads(macro)
         return macro
 
@@ -536,7 +538,7 @@
             # now run the template
             #result = pax.XML(tr_engine.transform(self.paxtree(), context),
             #                     root_ns_map, self.encoding)
-            result = tr_engine.transform(self.paxtree(), context).text
+            result = tr_engine.transform(self.paxtree(), context)
             result, encoding = encoding_neg.encode(result)
             # now this is hairy: how to get the official (IANA) http name
             # of the encoding based on the python name?
Index: opental/OpenPT/Zpax.py
diff -u opental/OpenPT/Zpax.py:1.2 opental/OpenPT/Zpax.py:1.3
--- opental/OpenPT/Zpax.py:1.2  Fri Feb 21 13:37:05 2003
+++ opental/OpenPT/Zpax.py      Sun Apr 13 09:03:15 2003
@@ -15,7 +15,7 @@
 #    You should have received a copy of the GNU General Public License
 #    along with this program; if not, write to the Free Software
 #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
-__version__='$Revision: 1.2 $'[11:-2]
+__version__='$Revision: 1.3 $'[11:-2]
 
 from pax import core, backwards_compatibility, __path__
 from pax.textpaxparser import Document as textDocument
@@ -39,5 +39,8 @@
 
 class Raw_HTML_Element(Element):
     def __children_xml__(self, prefix, ns_map):
-        return u'>' + u''.join(self) + u'</' + prefix + self.name + u'>'
+        try:
+            return u'>' + u''.join([str(child) for child in self]) + u'</' + 
prefix + self.name + u'>'
+        except:
+            raise 'Render error on ' + self.raw.encode('latin1', 'replace')
 
Index: opental/OpenTAL/Context.py
diff -u opental/OpenTAL/Context.py:1.4 opental/OpenTAL/Context.py:1.5
--- opental/OpenTAL/Context.py:1.4      Thu Feb 20 05:37:41 2003
+++ opental/OpenTAL/Context.py  Sun Apr 13 09:03:15 2003
@@ -18,7 +18,7 @@
 """TALES Context
 """
 
-__version__='$Revision: 1.4 $'[11:-2]
+__version__='$Revision: 1.5 $'[11:-2]
 
 import re, sys
 import cPickle as pickle
@@ -179,8 +179,6 @@
 
     def evaluate(self, expression):
         __traceback_info__ = expression
-        if type(expression) in (StringType, UnicodeType):
-            expression = self.compile(expression)
         return expression(self)
 
     evaluateValue = evaluate
Index: opental/pax/paxtransform.py
diff -u opental/pax/paxtransform.py:1.30 opental/pax/paxtransform.py:1.31
--- opental/pax/paxtransform.py:1.30    Fri Apr 11 11:08:39 2003
+++ opental/pax/paxtransform.py Sun Apr 13 09:03:15 2003
@@ -41,82 +41,94 @@
             result = element.copy()
         except AttributeError:
             return element
+        __traceback_info__ = getattr(element, 'raw', repr(element))
+        processed = []
+        error_handler = getattr(element, 'transform_error_handler', None)
+        if error_handler:
+            try:
+                result = self._do_transform(result, context, processed)
+            except:
+                result = error_handler.catch(element, context)
+        else:
+            result = self._do_transform(result, context, processed)
         try:
-            __traceback_info__ = element.raw
-        except AttributeError:
+            result = pack_list(result)
+        except:
+            # usually we're not interested in errors from pack
             pass
-        processed = []
-        context.postprocess_queue.append(processed)
+        context.postprocess_remaining = processed
         try:
-            error_handler = element.transform_error_handler
-        except AttributeError:
-            error_handler = None
+            result = self._postprocess(result, context, processed)
+        finally:
+            del context.postprocess_remaining
+        return result
+
+    def _do_transform(self,result,context,processed):
         try:
-            for ns, h, handler in self.handlers:
-                if not hasattr(result, 'attributes'):
-                    break
-                # We compare the hash of the ns against the hash of the 
element's ns
-                # this avoids an expensive unicode character-by-character 
comparison,
-                # in exchange for hash computation which is cached.
-                if result.attributes.has_key(ns) or hash(result.ns) == h:
-                    processed.append(handler)
-                    result = handler(result, context)
+            result = self._call_handlers(result,processed,context)
         except StopTransform, data:
             result = data.result
             if type(result) is types.ListType:
                 # further mark it as "immutable"
                 result = tuple(result)
-        except:
-            if error_handler:
-                result = error_handler.catch(element, context)
-            else:
-                context.postprocess_queue.pop()
-                raise
-        else:
-            if not hasattr(result, 'join'):
-                try:
-                    for index, child in enumerate(result):
-                        result[index] = self.transform(child, context)
-                except:
-                    if error_handler:
-                        result = error_handler.catch(element, context)
-                    else:
-                        context.postprocess_queue.pop()
-                        raise
-        try:
-            result.pack()
-        except AttributeError:
-            try:
-                result = pack_list(result)
-            except:
-                pass
-        try:
-            result = self.postprocess(result, context)
-        except StopTransform, data:
-            result = data.result
-        context.postprocess_queue.pop()
-        return result
+            return result
+        return self.transform_children(result,context)
 
-    def postprocess(self, element, context):
-        processed = context.postprocess_queue[-1]
-        while processed:
-            handler = processed.pop(0)
+    def transform_children(self,element,context):
+        if hasattr(element, 'join'):
+            return element
+        for index, child in enumerate(element):
+            element[index] = self.transform(child, context)
+        return element
+
+    def _call_handlers(self,element,processed,context):
+        for ns, h, handler in self.handlers:
+            if not hasattr(element, 'attributes'):
+                return element
+            # We compare the hash of the ns against the hash of the element's 
ns
+            # this avoids an expensive unicode character-by-character 
comparison,
+            # in exchange for hash computation which is cached.
+            if element.attributes.has_key(ns) or hash(element.ns) == h:
+                processed.append(handler)
+                element = handler(element, context)
+        return element
+
+    def _postprocess(self, element, context, handlers):
+        while handlers:
+            handler = handlers.pop(0)
             try:
                 pp = handler.postprocess
             except AttributeError:
                 continue
             if not callable(pp): continue
-            element = pp(element, context)
+            try:
+                element = pp(element, context)
+            except StopTransform, data:
+                return data.result
         return element
 
+    def postprocess(self, element, context):
+        '"public" (for handlers) wrapper for _postprocess'
+        try:
+            handlers = context.postprocess_remaining
+        except AttributeError:
+            raise RuntimeError, 'postprocess called without a list of handlers'
+        return self._postprocess(element, context, handlers)
+
 class RenderingEngine(Engine):
     "Transforms something, and renders it to XML"
     def transform(self, element, context):
         result = Engine.transform(self, element, context)
-        if result is element:
-            # not transformed, for some reason
-            return element
-        return Literal(XML(result, context.root_xmlns_map, context.encoding))
+        return XML(result, context.root_xmlns_map, context.encoding)
+
+    def transform_children(self,element,context):
+        element = Engine.transform_children(self, element, context)
+        # except that the children will be strings
+        if hasattr(element, 'children'):
+            element.children = (Literal(''.join(element)),)
+        elif type(element) in types.ListType, types.TupleType:
+            element = Literal(''.join(element))
+        return element
 
 
 class TransformErrorHandler(object):
Index: opental/pax/utils.py
diff -u opental/pax/utils.py:1.10 opental/pax/utils.py:1.11
--- opental/pax/utils.py:1.10   Thu Feb 27 13:37:50 2003
+++ opental/pax/utils.py        Sun Apr 13 09:03:15 2003
@@ -40,6 +40,8 @@
     "remove Nones, expand tuples"
     if hasattr(self, 'join'):
         return self
+    if hasattr(self, pack):
+        return self.pack()
     is_tuple = type(self) is types.TupleType
     result = []
     for child in self:




reply via email to

[Prev in Thread] Current Thread [Next in Thread]