annotate roundup/cgi/PageTemplates/TALES.py @ 5416:56c9bcdea47f

Python 3 preparation: unicode. This patch introduces roundup/anypy/strings.py, which has a comment explaining the string representations generally used and common functions to handle the required conversions. Places in the code that explicitly reference the "unicode" type / built-in function are generally changed to use the new functions (or, in a few places where those new functions don't seem to fit well, other approaches such as references to type(u'') or use of the codecs module). This patch does not generally attempt to address text conversions in any places not currently referencing the "unicode" type (although scripts/import_sf.py is made to use binary I/O in places as fixing the "unicode" reference didn't seem coherent otherwise).
author Joseph Myers <jsm@polyomino.org.uk>
date Wed, 25 Jul 2018 09:05:58 +0000
parents d26921b851c3
children 883c9e90b403
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
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23 import re, sys
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24 from roundup.cgi import ZTUtils
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
25 from weakref import ref
5388
d26921b851c3 Python 3 preparation: make relative imports explicit.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
26 from .MultiMapping import MultiMapping
d26921b851c3 Python 3 preparation: make relative imports explicit.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
27 from .GlobalTranslationService import getGlobalTranslationService
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
28
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
29 ustr = str
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
30
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31 StringType = type('')
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 NAME_RE = r"[a-zA-Z][a-zA-Z0-9_]*"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 _parse_expr = re.compile(r"(%s):" % NAME_RE).match
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 _valid_name = re.compile('%s$' % NAME_RE).match
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36
5265
63868084b8bb Python 2 and 3 support. Convert Exception to BaseException. TAL and
John Rouillard <rouilj@ieee.org>
parents: 4570
diff changeset
37 class TALESError(BaseException):
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 """Error during TALES expression evaluation"""
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40 class Undefined(TALESError):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 '''Exception raised on traversal of an undefined path'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42
5265
63868084b8bb Python 2 and 3 support. Convert Exception to BaseException. TAL and
John Rouillard <rouilj@ieee.org>
parents: 4570
diff changeset
43 class RegistrationError(BaseException):
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 '''TALES Type Registration Error'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45
5265
63868084b8bb Python 2 and 3 support. Convert Exception to BaseException. TAL and
John Rouillard <rouilj@ieee.org>
parents: 4570
diff changeset
46 class CompilerError(BaseException):
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 '''TALES Compiler Error'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49 class Default:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 '''Retain Default'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 Default = Default()
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
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 class Iterator(ZTUtils.Iterator):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 def __init__(self, name, seq, context):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 ZTUtils.Iterator.__init__(self, seq)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71 self.name = name
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
72 self._context_ref = ref(context)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74 def next(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75 if ZTUtils.Iterator.next(self):
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
76 context = self._context_ref()
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
77 if context is not None:
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
78 context.setLocal(self.name, self.item)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 return 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 return 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83 class ErrorInfo:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 """Information about an exception passed to an on-error handler."""
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85 __allow_access_to_unprotected_subobjects__ = 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 def __init__(self, err, position=(None, None)):
5265
63868084b8bb Python 2 and 3 support. Convert Exception to BaseException. TAL and
John Rouillard <rouilj@ieee.org>
parents: 4570
diff changeset
88 if isinstance(err, BaseException):
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89 self.type = err.__class__
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90 self.value = err
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
91 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92 self.type = err
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
93 self.value = None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
94 self.lineno = position[0]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
95 self.offset = position[1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
96
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
97
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
98 class Engine:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
99 '''Expression Engine
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
100
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
101 An instance of this class keeps a mutable collection of expression
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
102 type handlers. It can compile expression strings by delegating to
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
103 these handlers. It can provide an expression Context, which is
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
104 capable of holding state and evaluating compiled expressions.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
105 '''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
106 Iterator = Iterator
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
107
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
108 def __init__(self, Iterator=None):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
109 self.types = {}
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110 if Iterator is not None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
111 self.Iterator = Iterator
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
112
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
113 def registerType(self, name, handler):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
114 if not _valid_name(name):
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5377
diff changeset
115 raise RegistrationError('Invalid Expression type "%s".' % name)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
116 types = self.types
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
117 if name in types:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5377
diff changeset
118 raise RegistrationError(
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
119 'Multiple registrations for Expression type "%s".' %
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
120 name)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
121 types[name] = handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
122
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
123 def getTypes(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
124 return self.types
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
125
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
126 def compile(self, expression):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
127 m = _parse_expr(expression)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
128 if m:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
129 type = m.group(1)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
130 expr = expression[m.end():]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
131 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
132 type = "standard"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
133 expr = expression
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
134 try:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
135 handler = self.types[type]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
136 except KeyError:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5377
diff changeset
137 raise CompilerError(
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
138 'Unrecognized expression type "%s".' % type)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
139 return handler(type, expr, self)
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
140
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
141 def getContext(self, contexts=None, **kwcontexts):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
142 if contexts is not None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
143 if kwcontexts:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
144 kwcontexts.update(contexts)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
145 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
146 kwcontexts = contexts
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
147 return Context(self, kwcontexts)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
148
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
149 def getCompilerError(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
150 return CompilerError
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
151
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
152 class Context:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
153 '''Expression Context
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
154
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
155 An instance of this class holds context information that it can
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
156 use to evaluate compiled expressions.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
157 '''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
158
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
159 _context_class = SafeMapping
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
160 position = (None, None)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
161 source_file = None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
162
1257
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1219
diff changeset
163 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
164 self._compiler = compiler
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
165 self.contexts = contexts
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
166 contexts['nothing'] = None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
167 contexts['default'] = Default
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
168
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
169 self.repeat_vars = rv = {}
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
170 # Wrap this, as it is visible to restricted code
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
171 contexts['repeat'] = rep = self._context_class(rv)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
172 contexts['loop'] = rep # alias
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
173
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
174 self.global_vars = gv = contexts.copy()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
175 self.local_vars = lv = {}
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
176 self.vars = self._context_class(gv, lv)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
177
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
178 # Keep track of what needs to be popped as each scope ends.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
179 self._scope_stack = []
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
180
1257
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1219
diff changeset
181 def getCompiler(self):
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1219
diff changeset
182 return self._compiler
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1219
diff changeset
183
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
184 def beginScope(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
185 self._scope_stack.append([self.local_vars.copy()])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
186
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
187 def endScope(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
188 scope = self._scope_stack.pop()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
189 self.local_vars = lv = scope[0]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
190 v = self.vars
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
191 v._pop()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
192 v._push(lv)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
193 # Pop repeat variables, if any
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
194 i = len(scope) - 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
195 while i:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
196 name, value = scope[i]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
197 if value is None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
198 del self.repeat_vars[name]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
199 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
200 self.repeat_vars[name] = value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
201 i = i - 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
202
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
203 def setLocal(self, name, value):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
204 self.local_vars[name] = value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
205
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
206 def setGlobal(self, name, value):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
207 self.global_vars[name] = value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
208
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
209 def setRepeat(self, name, expr):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
210 expr = self.evaluate(expr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
211 if not expr:
1257
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1219
diff changeset
212 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
213 it = self._compiler.Iterator(name, expr, self)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
214 old_value = self.repeat_vars.get(name)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
215 self._scope_stack[-1].append((name, old_value))
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
216 self.repeat_vars[name] = it
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
217 return it
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
218
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
219 def evaluate(self, expression,
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
220 isinstance=isinstance, StringType=StringType):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
221 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
222 expression = self._compiler.compile(expression)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
223 __traceback_supplement__ = (
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
224 TALESTracebackSupplement, self, expression)
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
225 return expression(self)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
226
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
227 evaluateValue = evaluate
1219
9620f6782cb7 merge Zope Collector #580 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1071
diff changeset
228 evaluateBoolean = evaluate
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
229
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
230 def evaluateText(self, expr):
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
231 text = self.evaluate(expr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
232 if text is Default or text is None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
233 return text
5416
56c9bcdea47f Python 3 preparation: unicode.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
234 if isinstance(text, type(u'')):
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
235 return text
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
236 else:
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
237 return ustr(text)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
238
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
239 def evaluateStructure(self, expr):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
240 return self.evaluate(expr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
241 evaluateStructure = evaluate
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
242
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
243 def evaluateMacro(self, expr):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
244 # XXX Should return None or a macro definition
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
245 return self.evaluate(expr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
246 evaluateMacro = evaluate
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
247
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
248 def createErrorInfo(self, err, position):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
249 return ErrorInfo(err, position)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
250
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
251 def getDefault(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
252 return Default
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
253
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
254 def setSourceFile(self, source_file):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
255 self.source_file = source_file
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
256
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
257 def setPosition(self, position):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
258 self.position = position
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
259
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
260 def translate(self, domain, msgid, mapping=None,
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
261 context=None, target_language=None, default=None):
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
262 if context is None:
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
263 context = self.contexts.get('here')
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
264 return getGlobalTranslationService().translate(
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
265 domain, msgid, mapping=mapping,
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
266 context=context,
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
267 default=default,
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
268 target_language=target_language)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
269
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
270 class TALESTracebackSupplement:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
271 """Implementation of ITracebackSupplement"""
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
272 def __init__(self, context, expression):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
273 self.context = context
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
274 self.source_url = context.source_file
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
275 self.line = context.position[0]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
276 self.column = context.position[1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
277 self.expression = repr(expression)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
278
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
279 def getInfo(self, as_html=0):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
280 import pprint
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
281 data = self.context.contexts.copy()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
282 s = pprint.pformat(data)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
283 if not as_html:
2349
b43efe461b3e update PageTemplates to latest Zope codebase
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
284 return ' - Names:\n %s' % s.replace('\n', '\n ')
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
285 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
286 from cgi import escape
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
287 return '<b>Names:</b><pre>%s</pre>' % (escape(s))
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
288
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
289
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
290 class SimpleExpr:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
291 '''Simple example of an expression type handler'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
292 def __init__(self, name, expr, engine):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
293 self._name = name
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
294 self._expr = expr
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
295 def __call__(self, econtext):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
296 return self._name, self._expr
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
297 def __repr__(self):
5377
12fe83f90f0d Python 3 preparation: use repr() instead of ``.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5265
diff changeset
298 return '<SimpleExpr %s %s>' % (self._name, repr(self._expr))

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