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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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

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