opental-checkins
[Top][All Lists]
Advanced

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

[OpenTAL-checkins] opental pax/paxtransform.py OpenTAL/tal_handler.py


From: Fernando Lalo Martins
Subject: [OpenTAL-checkins] opental pax/paxtransform.py OpenTAL/tal_handler.py
Date: Mon, 07 Apr 2003 09:46:48 -0400

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

Modified files:
        pax            : paxtransform.py 
        OpenTAL        : tal_handler.py 

Log message:
        refactoring error handlers

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/opental/opental/pax/paxtransform.py.diff?tr1=1.28&tr2=1.29&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/opental/opental/OpenTAL/tal_handler.py.diff?tr1=1.29&tr2=1.30&r1=text&r2=text

Patches:
Index: opental/OpenTAL/tal_handler.py
diff -u opental/OpenTAL/tal_handler.py:1.29 opental/OpenTAL/tal_handler.py:1.30
--- opental/OpenTAL/tal_handler.py:1.29 Wed Feb 26 15:01:22 2003
+++ opental/OpenTAL/tal_handler.py      Mon Apr  7 09:46:48 2003
@@ -20,7 +20,7 @@
 tal_ns = 'http://xml.zope.org/namespaces/tal'
 
 from pax.paxtransform import AttributeHandler, CompiledInformationHandler, \
-     AttributeCompiler, StopTransform
+     AttributeCompiler, StopTransform, TransformErrorHandler
 from pax import XML, Literal
 from pax.backwards_compatibility import *
 import re, sys
@@ -30,15 +30,13 @@
     def __init__(self):
         self.type, self.value, self.tb = sys.exc_info()
 
-class ErrorHandler(object):
-    def __init__(self, element, context, value):
-        self.element = element
-        self.context = context
+class ErrorHandler(TransformErrorHandler):
+    def __init__(self, value):
         self.value = value
 
-    def __call__(self):
-        self.context.setLocal('error', ErrorObject())
-        return handle_content(self.element, self.context, self.value)
+    def catch(self, element, context):
+        context.setLocal('error', ErrorObject())
+        return handle_content(element, context, self.value)
 
 def normalize(text):
     return ' '.join(text.split())
@@ -53,7 +51,8 @@
     return names[0], value
 
 def remove_attrs_till(name, element):
-    data = getattr(element, tal_handler.compiled_name)
+    data = getattr(element, tal_handler.compiled_name)[:]
+    setattr(element, tal_handler.compiled_name, data)
     pname = None
     while data and pname != name:
         pname, pdata = data.pop(0)
@@ -74,7 +73,7 @@
 
 def handle_define(element, context, value):
     for is_global, name, expr in value:
-        result = context.evaluateValue(expr)
+        result = context.evaluate(expr)
         #print 'defining (%s) %s as %s' % (is_global, name, result)
         if is_global:
             context.setGlobal(name, result)
@@ -92,6 +91,7 @@
     result = []
     iterator = context.setRepeat(*value)
     while iterator.next():
+        __traceback_info__ = u'%s = %r' % (value[0], 
context.vars.get(value[0]))
         result.append(context.tr_engine.transform(element, context))
     raise StopTransform, (result,)
 
@@ -123,7 +123,7 @@
         value = context.evaluateText(expr)
         if value is not context.getDefault():
             nsattrs = element.attributes.setdefault(ns, {})
-            if value:
+            if value or value=='':
                 nsattrs[name] = value
             else:
                 try:
@@ -137,10 +137,6 @@
         return element
     return element.children
 
-def handle_on_error(element, context, value):
-    context.error_handler = ErrorHandler(element, context, value)
-    return element
-
 def tal_start(element, context):
     context.beginScope()
     context.setLocal('attrs', element.attributes.get(element.ns, {}))
@@ -167,7 +163,6 @@
 
 
 tal_handler = CompiledInformationHandler('tal', tal_ns)
-tal_handler.add_handler('on-error', handle_on_error)
 tal_handler.add_handler('define', handle_define)
 tal_handler.add_handler('condition', handle_condition)
 tal_handler.add_handler('repeat', handle_repeat)
@@ -181,8 +176,8 @@
 
 # TAL compiler
 
-#def compile_simple(element, context, value):
-#    return value
+def compile_on_error(element, context, value):
+    return ErrorHandler(compile_simple_expr(element, context, value))
 
 def compile_define(element, context, value):
     data = []
@@ -243,7 +238,7 @@
 
 
 tal_compiler = AttributeCompiler('tal', tal_ns)
-tal_compiler.add_handler('on-error', compile_simple_expr)
+tal_compiler.add_handler('on-error', compile_on_error)
 tal_compiler.add_handler('define', compile_define)
 tal_compiler.add_handler('condition', compile_condition)
 tal_compiler.add_handler('repeat', compile_repeat)
Index: opental/pax/paxtransform.py
diff -u opental/pax/paxtransform.py:1.28 opental/pax/paxtransform.py:1.29
--- opental/pax/paxtransform.py:1.28    Mon Mar 24 16:06:11 2003
+++ opental/pax/paxtransform.py Mon Apr  7 09:46:48 2003
@@ -27,12 +27,6 @@
             handler = optional
         self.handlers += ((ns, hash(ns), handler),)
 
-    def pop_error_handler(self, context):
-        if hasattr(context, 'error_handler'):
-            handler = context.error_handler
-            del context.error_handler
-            return handler
-
     def initialize(self, context):
         context.tr_engine = self
         context.postprocess_queue = []
@@ -54,6 +48,11 @@
         processed = []
         context.postprocess_queue.append(processed)
         try:
+            error_handler = element.transform_error_handler
+            print
+        except AttributeError:
+            error_handler = None
+        try:
             for ns, h, handler in self.handlers:
                 if not hasattr(result, 'attributes'):
                     break
@@ -69,21 +68,19 @@
                 # further mark it as "immutable"
                 result = tuple(result)
         except:
-            error_handler = self.pop_error_handler(context)
             if error_handler:
-                result = error_handler()
+                result = error_handler.catch(element, context)
             else:
                 context.postprocess_queue.pop()
                 raise
         else:
             if not hasattr(result, 'join'):
-                error_handler = self.pop_error_handler(context)
                 try:
                     for index, child in enumerate(result):
                         result[index] = self.transform(child, context)
                 except:
                     if error_handler:
-                        result = error_handler()
+                        result = error_handler.catch(element, context)
                     else:
                         context.postprocess_queue.pop()
                         raise
@@ -94,7 +91,6 @@
                 result = pack_list(result)
             except:
                 pass
-        self.pop_error_handler(context)
         try:
             result = self.postprocess(result, context)
         except StopTransform, data:
@@ -124,6 +120,12 @@
         return Literal(XML(result, context.root_xmlns_map, context.encoding))
 
 
+class TransformErrorHandler(object):
+    "Set a subclass of this on an element to capture transform errors"
+    def catch(self, element, context):
+        raise NotImplemented
+
+
 class AttributeHandler(object):
     "Handler that handles each attribute in turn"
     def __init__(self, name=u'', ns=u''):
@@ -175,7 +177,12 @@
             result = self.preprocess(result, context)
         for name, value in compiled:
             __traceback_info__ = (name, value)
-            result = self.handlers[name](result, context, value)
+            try:
+                h = self.handlers[name]
+            except KeyError:
+                # attribute was meaningful only on compilation
+                continue
+            result = h(result, context, value)
         return result
 
 class AttributeCompiler(AttributeHandler):
@@ -194,7 +201,11 @@
                 value = element.attributes[self.ns][name]
             except KeyError:
                 continue
-            compiled.append((name, handler(element, context, value)))
+            cvalue = handler(element, context, value)
+            if isinstance(cvalue, TransformErrorHandler):
+                element.transform_error_handler = cvalue
+            else:
+                compiled.append((name, cvalue))
         return element
 
 try:




reply via email to

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