Mercurial > p > roundup > code
annotate PageTemplates/PageTemplate.py @ 1029:c3e391d9c4e9
more FieldStorage fun
| author | Richard Jones <richard@users.sourceforge.net> |
|---|---|
| date | Tue, 03 Sep 2002 07:42:38 +0000 |
| parents | a3a8ac7b8c40 |
| 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 """Page Template module |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
14 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
15 HTML- and XML-based template objects using TAL, TALES, and METAL. |
|
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 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
18 __version__='$Revision: 1.1 $'[11:-2] |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
19 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
20 import sys |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
21 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
22 from TAL.TALParser import TALParser |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
23 from TAL.HTMLTALParser import HTMLTALParser |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
24 from TAL.TALGenerator import TALGenerator |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
25 from TAL.TALInterpreter import TALInterpreter |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
26 from Expressions import getEngine |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
27 from string import join, strip, rstrip, split, replace, lower, find |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
28 from cStringIO import StringIO |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
29 from ExtensionClass import Base |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
30 from ComputedAttribute import ComputedAttribute |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
31 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
32 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
33 class PageTemplate(Base): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
34 "Page Templates using TAL, TALES, and METAL" |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
35 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
36 content_type = 'text/html' |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
37 expand = 0 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
38 _v_errors = () |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
39 _v_warnings = () |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
40 _v_program = None |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
41 _v_macros = None |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
42 _v_cooked = 0 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
43 id = '(unknown)' |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
44 _text = '' |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
45 _error_start = '<!-- Page Template Diagnostics' |
|
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 macros(self): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
48 return self.pt_macros() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
49 macros = ComputedAttribute(macros, 1) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
50 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
51 def pt_edit(self, text, content_type): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
52 if content_type: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
53 self.content_type = str(content_type) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
54 if hasattr(text, 'read'): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
55 text = text.read() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
56 self.write(text) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
57 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
58 def pt_getContext(self): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
59 c = {'template': self, |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
60 'options': {}, |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
61 'nothing': None, |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
62 'request': None, |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
63 'modules': ModuleImporter, |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
64 } |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
65 parent = getattr(self, 'aq_parent', None) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
66 if parent is not None: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
67 c['here'] = parent |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
68 c['container'] = self.aq_inner.aq_parent |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
69 while parent is not None: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
70 self = parent |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
71 parent = getattr(self, 'aq_parent', None) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
72 c['root'] = self |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
73 return c |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
74 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
75 def pt_render(self, source=0, extra_context={}): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
76 """Render this Page Template""" |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
77 if not self._v_cooked: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
78 self._cook() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
79 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
80 __traceback_supplement__ = (PageTemplateTracebackSupplement, self) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
81 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
82 if self._v_errors: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
83 raise PTRuntimeError, 'Page Template %s has errors.' % self.id |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
84 output = StringIO() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
85 c = self.pt_getContext() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
86 c.update(extra_context) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
87 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
88 TALInterpreter(self._v_program, self._v_macros, |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
89 getEngine().getContext(c), |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
90 output, |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
91 tal=not source, strictinsert=0)() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
92 return output.getvalue() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
93 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
94 def __call__(self, *args, **kwargs): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
95 if not kwargs.has_key('args'): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
96 kwargs['args'] = args |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
97 return self.pt_render(extra_context={'options': kwargs}) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
98 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
99 def pt_errors(self): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
100 if not self._v_cooked: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
101 self._cook() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
102 err = self._v_errors |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
103 if err: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
104 return err |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
105 if not self.expand: return |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
106 try: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
107 self.pt_render(source=1) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
108 except: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
109 return ('Macro expansion failed', '%s: %s' % sys.exc_info()[:2]) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
110 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
111 def pt_warnings(self): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
112 if not self._v_cooked: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
113 self._cook() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
114 return self._v_warnings |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
115 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
116 def pt_macros(self): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
117 if not self._v_cooked: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
118 self._cook() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
119 if self._v_errors: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
120 __traceback_supplement__ = (PageTemplateTracebackSupplement, self) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
121 raise PTRuntimeError, 'Page Template %s has errors.' % self.id |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
122 return self._v_macros |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
123 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
124 def pt_source_file(self): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
125 return None # Unknown. |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
126 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
127 def write(self, text): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
128 assert type(text) is type('') |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
129 if text[:len(self._error_start)] == self._error_start: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
130 errend = find(text, '-->') |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
131 if errend >= 0: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
132 text = text[errend + 4:] |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
133 if self._text != text: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
134 self._text = text |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
135 self._cook() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
136 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
137 def read(self): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
138 if not self._v_cooked: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
139 self._cook() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
140 if not self._v_errors: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
141 if not self.expand: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
142 return self._text |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
143 try: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
144 return self.pt_render(source=1) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
145 except: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
146 return ('%s\n Macro expansion failed\n %s\n-->\n%s' % |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
147 (self._error_start, "%s: %s" % sys.exc_info()[:2], |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
148 self._text) ) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
149 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
150 return ('%s\n %s\n-->\n%s' % (self._error_start, |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
151 join(self._v_errors, '\n '), |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
152 self._text)) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
153 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
154 def _cook(self): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
155 """Compile the TAL and METAL statments. |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
156 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
157 Cooking must not fail due to compilation errors in templates. |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
158 """ |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
159 source_file = self.pt_source_file() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
160 if self.html(): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
161 gen = TALGenerator(getEngine(), xml=0, source_file=source_file) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
162 parser = HTMLTALParser(gen) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
163 else: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
164 gen = TALGenerator(getEngine(), source_file=source_file) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
165 parser = TALParser(gen) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
166 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
167 self._v_errors = () |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
168 try: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
169 parser.parseString(self._text) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
170 self._v_program, self._v_macros = parser.getCode() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
171 except: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
172 self._v_errors = ["Compilation failed", |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
173 "%s: %s" % sys.exc_info()[:2]] |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
174 self._v_warnings = parser.getWarnings() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
175 self._v_cooked = 1 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
176 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
177 def html(self): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
178 if not hasattr(getattr(self, 'aq_base', self), 'is_html'): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
179 return self.content_type == 'text/html' |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
180 return self.is_html |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
181 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
182 class _ModuleImporter: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
183 def __getitem__(self, module): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
184 mod = __import__(module) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
185 path = split(module, '.') |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
186 for name in path[1:]: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
187 mod = getattr(mod, name) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
188 return mod |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
189 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
190 ModuleImporter = _ModuleImporter() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
191 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
192 class PTRuntimeError(RuntimeError): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
193 '''The Page Template has template errors that prevent it from rendering.''' |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
194 pass |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
195 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
196 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
197 class PageTemplateTracebackSupplement: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
198 #__implements__ = ITracebackSupplement |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
199 |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
200 def __init__(self, pt): |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
201 self.object = pt |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
202 w = pt.pt_warnings() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
203 e = pt.pt_errors() |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
204 if e: |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
205 w = list(w) + list(e) |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
206 self.warnings = w |
|
a3a8ac7b8c40
Adding PageTemplates to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
207 |
