[Top][All Lists]
[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:
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [OpenTAL-checkins] opental pax/paxtransform.py OpenTAL/tal_handler.py,
Fernando Lalo Martins <=