Mercurial > p > roundup > code
annotate PageTemplates/PythonExpr.py @ 984:a3a8ac7b8c40
Adding PageTemplates to the dist
| author | Richard Jones <richard@users.sourceforge.net> |
|---|---|
| date | Fri, 30 Aug 2002 08:27:34 +0000 |
| parents | |
| children |
| rev | line source |
|---|---|
|
984
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1 ############################################################################## |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
2 # |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
3 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved. |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
4 # |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
5 # This software is subject to the provisions of the Zope Public License, |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
6 # Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution. |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
10 # FOR A PARTICULAR PURPOSE |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
11 # |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
12 ############################################################################## |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
13 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
14 """Generic Python Expression Handler |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
15 """ |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
16 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
17 __version__='$Revision: 1.1 $'[11:-2] |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
18 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
19 from TALES import CompilerError |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
20 from string import strip, split, join, replace, lstrip |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
21 from sys import exc_info |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
22 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
23 class getSecurityManager: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
24 '''Null security manager''' |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
25 def validate(self, *args, **kwargs): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
26 return 1 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
27 addContext = removeContext = validateValue = validate |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
28 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
29 class PythonExpr: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
30 def __init__(self, name, expr, engine): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
31 self.expr = expr = replace(strip(expr), '\n', ' ') |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
32 try: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
33 d = {} |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
34 exec 'def f():\n return %s\n' % strip(expr) in d |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
35 self._f = d['f'] |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
36 except: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
37 raise CompilerError, ('Python expression error:\n' |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
38 '%s: %s') % exc_info()[:2] |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
39 self._get_used_names() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
40 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
41 def _get_used_names(self): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
42 self._f_varnames = vnames = [] |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
43 for vname in self._f.func_code.co_names: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
44 if vname[0] not in '$_': |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
45 vnames.append(vname) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
46 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
47 def _bind_used_names(self, econtext): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
48 # Bind template variables |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
49 names = {} |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
50 vars = econtext.vars |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
51 getType = econtext._engine.getTypes().get |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
52 for vname in self._f_varnames: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
53 has, val = vars.has_get(vname) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
54 if not has: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
55 has = val = getType(vname) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
56 if has: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
57 val = ExprTypeProxy(vname, val, econtext) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
58 if has: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
59 names[vname] = val |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
60 return names |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
61 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
62 def __call__(self, econtext): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
63 __traceback_info__ = self.expr |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
64 f = self._f |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
65 f.func_globals.update(self._bind_used_names(econtext)) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
66 return f() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
67 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
68 def __str__(self): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
69 return 'Python expression "%s"' % self.expr |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
70 def __repr__(self): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
71 return '<PythonExpr %s>' % self.expr |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
72 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
73 class ExprTypeProxy: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
74 '''Class that proxies access to an expression type handler''' |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
75 def __init__(self, name, handler, econtext): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
76 self._name = name |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
77 self._handler = handler |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
78 self._econtext = econtext |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
79 def __call__(self, text): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
80 return self._handler(self._name, text, |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
81 self._econtext._engine)(self._econtext) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
82 |
