annotate roundup/cgi/PageTemplates/TALES.py @ 3896:fca0365521fc

ignore client shutdown exceptions when sending responses patch from Ulrik Miaelsson If the user clicks the stop button, or click another link before the previous has finished loading, or something similar an IOError exception will be raised which results in the admin being sent an email. This can understandably be pretty annoying if your users are doing that on a regular basis. So we'll trap that exception and ignore it.
author Justus Pendleton <jpend@users.sourceforge.net>
date Tue, 11 Sep 2007 21:30:14 +0000
parents 5f9e00836006
children 6e3e4f24c753
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.
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
4 #
1049
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
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
11 #
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
12 ##############################################################################
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
13 # Modified for Roundup:
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14 #
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
15 # 1. changed imports to import from roundup.cgi
2663
5f9e00836006 update comment
Richard Jones <richard@users.sourceforge.net>
parents: 2662
diff changeset
16 # 2. implemented ustr as str (removes import from DocumentTemplate)
5f9e00836006 update comment
Richard Jones <richard@users.sourceforge.net>
parents: 2662
diff changeset
17 # 3. removed import and use of Unauthorized from zExceptions
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18 """TALES
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
20 An implementation of a generic TALES engine
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
21 """
1071
c08b3820edd1 Adhering to ZPL
Richard Jones <richard@users.sourceforge.net>
parents: 1049
diff changeset
22
2663
5f9e00836006 update comment
Richard Jones <richard@users.sourceforge.net>
parents: 2662
diff changeset
23 __version__='$Revision: 1.9 $'[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
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
27 from weakref import ref
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28 from MultiMapping import MultiMapping
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
29 from GlobalTranslationService import getGlobalTranslationService
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
30
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
31 ustr = str
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 StringType = type('')
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 NAME_RE = r"[a-zA-Z][a-zA-Z0-9_]*"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 _parse_expr = re.compile(r"(%s):" % NAME_RE).match
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 _valid_name = re.compile('%s$' % NAME_RE).match
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 class TALESError(Exception):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40 """Error during TALES expression evaluation"""
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 class Undefined(TALESError):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 '''Exception raised on traversal of an undefined path'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 class RegistrationError(Exception):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 '''TALES Type Registration Error'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 class CompilerError(Exception):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49 '''TALES Compiler Error'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 class Default:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 '''Retain Default'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53 Default = Default()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55 class SafeMapping(MultiMapping):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56 '''Mapping with security declarations and limited method exposure.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 Since it subclasses MultiMapping, this class can be used to wrap
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 one or more mapping objects. Restricted Python code will not be
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60 able to mutate the SafeMapping or the wrapped mappings, but will be
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 able to read any value.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62 '''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 __allow_access_to_unprotected_subobjects__ = 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64 push = pop = None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66 _push = MultiMapping.push
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67 _pop = MultiMapping.pop
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 class Iterator(ZTUtils.Iterator):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71 def __init__(self, name, seq, context):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 ZTUtils.Iterator.__init__(self, seq)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73 self.name = name
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
74 self._context_ref = ref(context)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76 def next(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 if ZTUtils.Iterator.next(self):
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
78 context = self._context_ref()
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
79 if context is not None:
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
80 context.setLocal(self.name, self.item)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 return 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 return 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85 class ErrorInfo:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86 """Information about an exception passed to an on-error handler."""
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 __allow_access_to_unprotected_subobjects__ = 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89 def __init__(self, err, position=(None, None)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90 if isinstance(err, Exception):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
91 self.type = err.__class__
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92 self.value = err
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
93 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
94 self.type = err
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
95 self.value = None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
96 self.lineno = position[0]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
97 self.offset = position[1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
98
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
99
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
100 class Engine:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
101 '''Expression Engine
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
102
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
103 An instance of this class keeps a mutable collection of expression
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
104 type handlers. It can compile expression strings by delegating to
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
105 these handlers. It can provide an expression Context, which is
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
106 capable of holding state and evaluating compiled expressions.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
107 '''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
108 Iterator = Iterator
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
109
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110 def __init__(self, Iterator=None):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
111 self.types = {}
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
112 if Iterator is not None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
113 self.Iterator = Iterator
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
114
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
115 def registerType(self, name, handler):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
116 if not _valid_name(name):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
117 raise RegistrationError, 'Invalid Expression type "%s".' % name
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
118 types = self.types
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
119 if types.has_key(name):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
120 raise RegistrationError, (
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
121 'Multiple registrations for Expression type "%s".' %
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
122 name)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
123 types[name] = handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
124
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
125 def getTypes(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
126 return self.types
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
127
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
128 def compile(self, expression):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
129 m = _parse_expr(expression)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
130 if m:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
131 type = m.group(1)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
132 expr = expression[m.end():]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
133 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
134 type = "standard"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
135 expr = expression
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
136 try:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
137 handler = self.types[type]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
138 except KeyError:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
139 raise CompilerError, (
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
140 'Unrecognized expression type "%s".' % type)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
141 return handler(type, expr, self)
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
142
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
143 def getContext(self, contexts=None, **kwcontexts):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
144 if contexts is not None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
145 if kwcontexts:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
146 kwcontexts.update(contexts)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
147 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
148 kwcontexts = contexts
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
149 return Context(self, kwcontexts)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
150
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
151 def getCompilerError(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
152 return CompilerError
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
153
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
154 class Context:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
155 '''Expression Context
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
156
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
157 An instance of this class holds context information that it can
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
158 use to evaluate compiled expressions.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
159 '''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
160
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
161 _context_class = SafeMapping
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
162 position = (None, None)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
163 source_file = None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
164
1257
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1219
diff changeset
165 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
166 self._compiler = compiler
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
167 self.contexts = contexts
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
168 contexts['nothing'] = None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
169 contexts['default'] = Default
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
170
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
171 self.repeat_vars = rv = {}
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
172 # Wrap this, as it is visible to restricted code
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
173 contexts['repeat'] = rep = self._context_class(rv)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
174 contexts['loop'] = rep # alias
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
175
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
176 self.global_vars = gv = contexts.copy()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
177 self.local_vars = lv = {}
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
178 self.vars = self._context_class(gv, lv)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
179
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
180 # Keep track of what needs to be popped as each scope ends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
181 self._scope_stack = []
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
182
1257
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1219
diff changeset
183 def getCompiler(self):
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1219
diff changeset
184 return self._compiler
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1219
diff changeset
185
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
186 def beginScope(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
187 self._scope_stack.append([self.local_vars.copy()])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
188
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
189 def endScope(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
190 scope = self._scope_stack.pop()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
191 self.local_vars = lv = scope[0]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
192 v = self.vars
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
193 v._pop()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
194 v._push(lv)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
195 # Pop repeat variables, if any
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
196 i = len(scope) - 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
197 while i:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
198 name, value = scope[i]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
199 if value is None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
200 del self.repeat_vars[name]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
201 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
202 self.repeat_vars[name] = value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
203 i = i - 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
204
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
205 def setLocal(self, name, value):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
206 self.local_vars[name] = value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
207
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
208 def setGlobal(self, name, value):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
209 self.global_vars[name] = value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
210
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
211 def setRepeat(self, name, expr):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
212 expr = self.evaluate(expr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
213 if not expr:
1257
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1219
diff changeset
214 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
215 it = self._compiler.Iterator(name, expr, self)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
216 old_value = self.repeat_vars.get(name)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
217 self._scope_stack[-1].append((name, old_value))
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
218 self.repeat_vars[name] = it
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
219 return it
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
220
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
221 def evaluate(self, expression,
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
222 isinstance=isinstance, StringType=StringType):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
223 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
224 expression = self._compiler.compile(expression)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
225 __traceback_supplement__ = (
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
226 TALESTracebackSupplement, self, expression)
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
227 return expression(self)
1049
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
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
236 if isinstance(text, unicode):
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
237 return text
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
238 else:
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
239 return ustr(text)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
240
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
241 def evaluateStructure(self, expr):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
242 return self.evaluate(expr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
243 evaluateStructure = evaluate
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
244
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
245 def evaluateMacro(self, expr):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
246 # XXX Should return None or a macro definition
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
247 return self.evaluate(expr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
248 evaluateMacro = evaluate
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
249
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
250 def createErrorInfo(self, err, position):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
251 return ErrorInfo(err, position)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
252
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
253 def getDefault(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
254 return Default
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
255
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
256 def setSourceFile(self, source_file):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
257 self.source_file = source_file
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
258
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
259 def setPosition(self, position):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
260 self.position = position
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
261
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
262 def translate(self, domain, msgid, mapping=None,
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
263 context=None, target_language=None, default=None):
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
264 if context is None:
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
265 context = self.contexts.get('here')
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
266 return getGlobalTranslationService().translate(
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
267 domain, msgid, mapping=mapping,
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
268 context=context,
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
269 default=default,
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
270 target_language=target_language)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
271
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
272 class TALESTracebackSupplement:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
273 """Implementation of ITracebackSupplement"""
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
274 def __init__(self, context, expression):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
275 self.context = context
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
276 self.source_url = context.source_file
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
277 self.line = context.position[0]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
278 self.column = context.position[1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
279 self.expression = repr(expression)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
280
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
281 def getInfo(self, as_html=0):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
282 import pprint
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
283 data = self.context.contexts.copy()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
284 s = pprint.pformat(data)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
285 if not as_html:
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
286 return ' - Names:\n %s' % s.replace('\n', '\n ')
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
287 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
288 from cgi import escape
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
289 return '<b>Names:</b><pre>%s</pre>' % (escape(s))
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
290
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
291
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
292 class SimpleExpr:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
293 '''Simple example of an expression type handler'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
294 def __init__(self, name, expr, engine):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
295 self._name = name
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
296 self._expr = expr
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
297 def __call__(self, econtext):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
298 return self._name, self._expr
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
299 def __repr__(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
300 return '<SimpleExpr %s %s>' % (self._name, `self._expr`)

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