1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85 __doc__='''Python implementations of document template some features
86
87
88 $Id: pDocumentTemplate.py 694 2003-04-16 02:53:50Z sc $'''
89 __version__='$Revision: 694 $'[11:-2]
90
91 import string, sys, types
92 from string import join
93
94 StringType=type('')
95 TupleType=type(())
96 isFunctionType={}
97 for name in ['BuiltinFunctionType', 'BuiltinMethodType', 'ClassType',
98 'FunctionType', 'LambdaType', 'MethodType', 'UnboundMethodType']:
99 try: isFunctionType[getattr(types,name)]=1
100 except: pass
101
102 try:
103 import ExtensionClass
104 isFunctionType[ExtensionClass.PythonMethodType]=1
105 isFunctionType[ExtensionClass.ExtensionMethodType]=1
106 except: pass
107
108 isFunctionType=isFunctionType.has_key
109
110 isSimpleType={}
111 for n in dir(types):
112 if (n[-4:]=='Type' and n != 'InstanceType' and
113 not isFunctionType(getattr(types, n))):
114 isSimpleType[getattr(types, n)]=1
115
116 isSimpleType=isSimpleType.has_key
117
119
120 validate=None
121
128
130 return hasattr(self.self,key)
131
133 return self.self.__dict__.keys()
134
135 - def __repr__(self): return 'InstanceDict(%s)' % str(self.self)
136
138
139 cache=self.cache
140 if cache.has_key(key): return cache[key]
141
142 inst=self.self
143
144 if key[:1]=='_':
145 if key != '__str__':
146 raise KeyError, key
147 r=str(inst)
148 else:
149 try: r=getattr(inst,key)
150 except AttributeError: raise KeyError, key
151
152 v=self.validate
153 if v is not None: v(inst,inst,key,r,self.namespace)
154
155 self.cache[key]=r
156 return r
157
159
161
163 for d in self.dicts:
164 try: return d[key]
165 except KeyError, AttributeError: pass
166 raise KeyError, key
167
168 - def push(self,d): self.dicts.insert(0,d)
169
170 - def pop(self, n=1):
171 r = self.dicts[-1]
172 del self.dicts[:n]
173 return r
174
176 kz = []
177 for d in self.dicts:
178 kz = kz + d.keys()
179 return kz
180
182
185
187 try: return self.__d[name]
188 except KeyError: raise AttributeError, name
189
191
192 level=0
193
194 - def _pop(self, n=1): return self.dicts.pop(n)
196
203
208
209 v = self.dicts[key]
210 if call:
211 if hasattr(v, '__render_with_namespace__'):
212 return v.__render_with_namespace__(self)
213 vbase = getattr(v, 'aq_base', v)
214 if callable(vbase):
215 if getattr(vbase, 'isDocTemp', None):
216 return v(None, self)
217 return v()
218 return v
219
221 try:
222 v=self.dicts[key]
223 except KeyError:
224 return 0
225 return 1
226
227 getitem=__getitem__
228
239
241 rendered = []
242 append=rendered.append
243 for section in blocks:
244 if type(section) is TupleType:
245 l=len(section)
246 if l==1:
247
248 section=section[0]
249 if type(section) is StringType: section=md[section]
250 else: section=section(md)
251 section=str(section)
252 else:
253
254 cache={}
255 md._push(cache)
256 try:
257 i=0
258 m=l-1
259 while i < m:
260 cond=section[i]
261 if type(cond) is StringType:
262 n=cond
263 try:
264 cond=md[cond]
265 cache[n]=cond
266 except KeyError, v:
267 v=str(v)
268 if n != v: raise KeyError, v, sys.exc_traceback
269 cond=None
270 else: cond=cond(md)
271 if cond:
272 section=section[i+1]
273 if section: section=render_blocks(section,md)
274 else: section=''
275 m=0
276 break
277 i=i+2
278 if m:
279 if i==m: section=render_blocks(section[i],md)
280 else: section=''
281
282 finally: md._pop()
283
284 elif type(section) is not StringType:
285 section=section(md)
286
287 if section: rendered.append(section)
288
289 l=len(rendered)
290 if l==0: return ''
291 elif l==1: return rendered[0]
292 return join(rendered, '')
293 return rendered
294