annotate roundup/cgi/PageTemplates/TALES.py @ 2467:76ead526113d

client instances may be used as translation engines. any backend translator may be passed as constructor argument or via setTranslator() method. by default, templating.translationService is used. use this engine to translate client messages.
author Alexander Smishlajev <a1s@users.sourceforge.net>
date Tue, 15 Jun 2004 09:19:49 +0000
parents b43efe461b3e
children 29779f041ee7
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
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
16 # 2. implemented ustr as atr
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
17 """TALES
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19 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
20 """
1071
c08b3820edd1 Adhering to ZPL
Richard Jones <richard@users.sourceforge.net>
parents: 1049
diff changeset
21
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
22 __version__='$Revision: 1.7 $'[11:-2]
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24 import re, sys
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25 from roundup.cgi import ZTUtils
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
26 from weakref import ref
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27 from MultiMapping import MultiMapping
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
28 from GlobalTranslationService import getGlobalTranslationService
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
29
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
30 ustr = str
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 StringType = type('')
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 NAME_RE = r"[a-zA-Z][a-zA-Z0-9_]*"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 _parse_expr = re.compile(r"(%s):" % NAME_RE).match
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 _valid_name = re.compile('%s$' % NAME_RE).match
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 class TALESError(Exception):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 """Error during TALES expression evaluation"""
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 class Undefined(TALESError):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 '''Exception raised on traversal of an undefined path'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 class RegistrationError(Exception):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 '''TALES Type Registration Error'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 class CompilerError(Exception):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 '''TALES Compiler Error'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 class Default:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 '''Retain Default'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 Default = Default()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 class SafeMapping(MultiMapping):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55 '''Mapping with security declarations and limited method exposure.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 Since it subclasses MultiMapping, this class can be used to wrap
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 one or more mapping objects. Restricted Python code will not be
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 able to mutate the SafeMapping or the wrapped mappings, but will be
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60 able to read any value.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 '''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62 __allow_access_to_unprotected_subobjects__ = 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 push = pop = None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65 _push = MultiMapping.push
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66 _pop = MultiMapping.pop
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 class Iterator(ZTUtils.Iterator):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 def __init__(self, name, seq, context):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71 ZTUtils.Iterator.__init__(self, seq)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 self.name = name
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
73 self._context_ref = ref(context)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75 def next(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76 if ZTUtils.Iterator.next(self):
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
77 context = self._context_ref()
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
78 if context is not None:
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
79 context.setLocal(self.name, self.item)
1049
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)
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
141
1049
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)
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
226 return expression(self)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
227
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
228 evaluateValue = evaluate
1219
9620f6782cb7 merge Zope Collector #580 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1071
diff changeset
229 evaluateBoolean = evaluate
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
230
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
231 def evaluateText(self, expr):
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
232 text = self.evaluate(expr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
233 if text is Default or text is None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
234 return text
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
235 if isinstance(text, unicode):
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
236 return text
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
237 else:
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
238 return ustr(text)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
239
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
240 def evaluateStructure(self, expr):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
241 return self.evaluate(expr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
242 evaluateStructure = evaluate
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
243
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
244 def evaluateMacro(self, expr):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
245 # XXX Should return None or a macro definition
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
246 return self.evaluate(expr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
247 evaluateMacro = evaluate
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
248
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
249 def createErrorInfo(self, err, position):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
250 return ErrorInfo(err, position)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
251
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
252 def getDefault(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
253 return Default
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
254
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
255 def setSourceFile(self, source_file):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
256 self.source_file = source_file
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
257
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
258 def setPosition(self, position):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
259 self.position = position
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
260
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
261 def translate(self, domain, msgid, mapping=None,
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
262 context=None, target_language=None, default=None):
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
263 if context is None:
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
264 context = self.contexts.get('here')
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
265 return getGlobalTranslationService().translate(
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
266 domain, msgid, mapping=mapping,
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
267 context=context,
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
268 default=default,
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
269 target_language=target_language)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
270
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
271 class TALESTracebackSupplement:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
272 """Implementation of ITracebackSupplement"""
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
273 def __init__(self, context, expression):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
274 self.context = context
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
275 self.source_url = context.source_file
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
276 self.line = context.position[0]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
277 self.column = context.position[1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
278 self.expression = repr(expression)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
279
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
280 def getInfo(self, as_html=0):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
281 import pprint
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
282 data = self.context.contexts.copy()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
283 s = pprint.pformat(data)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
284 if not as_html:
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
285 return ' - Names:\n %s' % s.replace('\n', '\n ')
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
286 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
287 from cgi import escape
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
288 return '<b>Names:</b><pre>%s</pre>' % (escape(s))
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
289
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
290
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
291 class SimpleExpr:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
292 '''Simple example of an expression type handler'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
293 def __init__(self, name, expr, engine):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
294 self._name = name
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
295 self._expr = expr
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
296 def __call__(self, econtext):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
297 return self._name, self._expr
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
298 def __repr__(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
299 return '<SimpleExpr %s %s>' % (self._name, `self._expr`)

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