annotate roundup/cgi/PageTemplates/TALES.py @ 2119:cc4667ef3f12

Added the ability to toggle where error messages go. They either go to the user (default, for backwards compatibility), the dispatcher, or both. These are able to be toggled via settings in config.py. Please refer to upgrading.txt for more details. (And Richard, let me know if I've done anything wrong with this checkin. :))
author Eddie Parker <eparker@users.sourceforge.net>
date Thu, 25 Mar 2004 19:27:15 +0000
parents fc52d57c6c3e
children b43efe461b3e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 ##############################################################################
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 #
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 #
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
5 # This software is subject to the provisions of the Zope Public License,
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6 # Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
10 # FOR A PARTICULAR PURPOSE
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
11 #
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
12 ##############################################################################
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
13 """TALES
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
15 An implementation of a generic TALES engine
1071
c08b3820edd1 Adhering to ZPL
Richard Jones <richard@users.sourceforge.net>
parents: 1049
diff changeset
16
c08b3820edd1 Adhering to ZPL
Richard Jones <richard@users.sourceforge.net>
parents: 1049
diff changeset
17 Modified for Roundup 0.5 release:
c08b3820edd1 Adhering to ZPL
Richard Jones <richard@users.sourceforge.net>
parents: 1049
diff changeset
18
c08b3820edd1 Adhering to ZPL
Richard Jones <richard@users.sourceforge.net>
parents: 1049
diff changeset
19 - changed imports to import from roundup.cgi
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
20 """
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1409
diff changeset
21 __docformat__ = 'restructuredtext'
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1409
diff changeset
23 __version__='$Revision: 1.6 $'[11:-2]
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25 import re, sys
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26 from roundup.cgi import ZTUtils
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27 from MultiMapping import MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
29 StringType = type('')
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
30
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31 NAME_RE = r"[a-zA-Z][a-zA-Z0-9_]*"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 _parse_expr = re.compile(r"(%s):" % NAME_RE).match
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 _valid_name = re.compile('%s$' % NAME_RE).match
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 class TALESError(Exception):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 """Error during TALES expression evaluation"""
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 class Undefined(TALESError):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 '''Exception raised on traversal of an undefined path'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 class RegistrationError(Exception):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 '''TALES Type Registration Error'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 class CompilerError(Exception):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 '''TALES Compiler Error'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 class Default:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 '''Retain Default'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49 Default = Default()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 _marker = []
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53 class SafeMapping(MultiMapping):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 '''Mapping with security declarations and limited method exposure.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56 Since it subclasses MultiMapping, this class can be used to wrap
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 one or more mapping objects. Restricted Python code will not be
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 able to mutate the SafeMapping or the wrapped mappings, but will be
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 able to read any value.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60 '''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 __allow_access_to_unprotected_subobjects__ = 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62 push = pop = None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64 _push = MultiMapping.push
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65 _pop = MultiMapping.pop
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67 def has_get(self, key, _marker=[]):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 v = self.get(key, _marker)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 return v is not _marker, v
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71 class Iterator(ZTUtils.Iterator):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 def __init__(self, name, seq, context):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73 ZTUtils.Iterator.__init__(self, seq)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74 self.name = name
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75 self._context = context
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 def next(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78 if ZTUtils.Iterator.next(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 self._context.setLocal(self.name, self.item)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 return 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 return 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 class ErrorInfo:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85 """Information about an exception passed to an on-error handler."""
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86 __allow_access_to_unprotected_subobjects__ = 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88 def __init__(self, err, position=(None, None)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89 if isinstance(err, Exception):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90 self.type = err.__class__
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
91 self.value = err
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
93 self.type = err
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
94 self.value = None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
95 self.lineno = position[0]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
96 self.offset = position[1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
97
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
98
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
99 class Engine:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
100 '''Expression Engine
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
101
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
102 An instance of this class keeps a mutable collection of expression
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
103 type handlers. It can compile expression strings by delegating to
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
104 these handlers. It can provide an expression Context, which is
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
105 capable of holding state and evaluating compiled expressions.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
106 '''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
107 Iterator = Iterator
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
108
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
109 def __init__(self, Iterator=None):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110 self.types = {}
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
111 if Iterator is not None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
112 self.Iterator = Iterator
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
113
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
114 def registerType(self, name, handler):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
115 if not _valid_name(name):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
116 raise RegistrationError, 'Invalid Expression type "%s".' % name
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
117 types = self.types
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
118 if types.has_key(name):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
119 raise RegistrationError, (
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
120 'Multiple registrations for Expression type "%s".' %
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
121 name)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
122 types[name] = handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
123
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
124 def getTypes(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
125 return self.types
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
126
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
127 def compile(self, expression):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
128 m = _parse_expr(expression)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
129 if m:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
130 type = m.group(1)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
131 expr = expression[m.end():]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
132 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
133 type = "standard"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
134 expr = expression
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
135 try:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
136 handler = self.types[type]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
137 except KeyError:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
138 raise CompilerError, (
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
139 'Unrecognized expression type "%s".' % type)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
140 return handler(type, expr, self)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
141
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
142 def getContext(self, contexts=None, **kwcontexts):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
143 if contexts is not None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
144 if kwcontexts:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
145 kwcontexts.update(contexts)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
146 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
147 kwcontexts = contexts
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
148 return Context(self, kwcontexts)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
149
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
150 def getCompilerError(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
151 return CompilerError
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
152
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
153 class Context:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
154 '''Expression Context
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
155
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
156 An instance of this class holds context information that it can
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
157 use to evaluate compiled expressions.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
158 '''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
159
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
160 _context_class = SafeMapping
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
161 position = (None, None)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
162 source_file = None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
163
1257
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1219
diff changeset
164 def __init__(self, compiler, contexts):
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1219
diff changeset
165 self._compiler = compiler
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
166 self.contexts = contexts
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
167 contexts['nothing'] = None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
168 contexts['default'] = Default
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
169
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
170 self.repeat_vars = rv = {}
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
171 # Wrap this, as it is visible to restricted code
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
172 contexts['repeat'] = rep = self._context_class(rv)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
173 contexts['loop'] = rep # alias
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
174
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
175 self.global_vars = gv = contexts.copy()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
176 self.local_vars = lv = {}
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
177 self.vars = self._context_class(gv, lv)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
178
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
179 # Keep track of what needs to be popped as each scope ends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
180 self._scope_stack = []
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
181
1257
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1219
diff changeset
182 def getCompiler(self):
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1219
diff changeset
183 return self._compiler
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1219
diff changeset
184
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
185 def beginScope(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
186 self._scope_stack.append([self.local_vars.copy()])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
187
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
188 def endScope(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
189 scope = self._scope_stack.pop()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
190 self.local_vars = lv = scope[0]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
191 v = self.vars
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
192 v._pop()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
193 v._push(lv)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
194 # Pop repeat variables, if any
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
195 i = len(scope) - 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
196 while i:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
197 name, value = scope[i]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
198 if value is None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
199 del self.repeat_vars[name]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
200 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
201 self.repeat_vars[name] = value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
202 i = i - 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
203
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
204 def setLocal(self, name, value):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
205 self.local_vars[name] = value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
206
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
207 def setGlobal(self, name, value):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
208 self.global_vars[name] = value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
209
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
210 def setRepeat(self, name, expr):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
211 expr = self.evaluate(expr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
212 if not expr:
1257
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1219
diff changeset
213 return self._compiler.Iterator(name, (), self)
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1219
diff changeset
214 it = self._compiler.Iterator(name, expr, self)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
215 old_value = self.repeat_vars.get(name)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
216 self._scope_stack[-1].append((name, old_value))
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
217 self.repeat_vars[name] = it
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
218 return it
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
219
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
220 def evaluate(self, expression,
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
221 isinstance=isinstance, StringType=StringType):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
222 if isinstance(expression, StringType):
1257
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1219
diff changeset
223 expression = self._compiler.compile(expression)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
224 __traceback_supplement__ = (
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
225 TALESTracebackSupplement, self, expression)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
226 v = expression(self)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
227 return v
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
228
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
229 evaluateValue = evaluate
1219
9620f6782cb7 merge Zope Collector #580 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1071
diff changeset
230 evaluateBoolean = evaluate
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
231
1409
8dc60d87ab42 Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents: 1257
diff changeset
232 def evaluateText(self, expr):
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
233 text = self.evaluate(expr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
234 if text is Default or text is None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
235 return text
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
236 return str(text)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
237
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
238 def evaluateStructure(self, expr):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
239 return self.evaluate(expr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
240 evaluateStructure = evaluate
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
241
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
242 def evaluateMacro(self, expr):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
243 # XXX Should return None or a macro definition
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
244 return self.evaluate(expr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
245 evaluateMacro = evaluate
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
246
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
247 def createErrorInfo(self, err, position):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
248 return ErrorInfo(err, position)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
249
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
250 def getDefault(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
251 return Default
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
252
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
253 def setSourceFile(self, source_file):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
254 self.source_file = source_file
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
255
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
256 def setPosition(self, position):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
257 self.position = position
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
258
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
259
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
260
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
261 class TALESTracebackSupplement:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
262 """Implementation of ITracebackSupplement"""
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
263 def __init__(self, context, expression):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
264 self.context = context
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
265 self.source_url = context.source_file
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
266 self.line = context.position[0]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
267 self.column = context.position[1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
268 self.expression = repr(expression)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
269
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
270 def getInfo(self, as_html=0):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
271 import pprint
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
272 data = self.context.contexts.copy()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
273 s = pprint.pformat(data)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
274 if not as_html:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
275 return ' - Names:\n %s' % string.replace(s, '\n', '\n ')
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
276 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
277 from cgi import escape
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
278 return '<b>Names:</b><pre>%s</pre>' % (escape(s))
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
279 return None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
280
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
281
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
282
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
283 class SimpleExpr:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
284 '''Simple example of an expression type handler'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
285 def __init__(self, name, expr, engine):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
286 self._name = name
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
287 self._expr = expr
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
288 def __call__(self, econtext):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
289 return self._name, self._expr
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
290 def __repr__(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
291 return '<SimpleExpr %s %s>' % (self._name, `self._expr`)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
292

Roundup Issue Tracker: http://roundup-tracker.org/