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