50 |
from encodings.aliases import aliases as encoding_aliases |
from encodings.aliases import aliases as encoding_aliases |
51 |
from DocumentTemplate.DT_Util import TemplateDict, InstanceDict |
from DocumentTemplate.DT_Util import TemplateDict, InstanceDict |
52 |
from AccessControl.DTML import RestrictedDTML |
from AccessControl.DTML import RestrictedDTML |
53 |
|
my_home = package_home(globals()) |
54 |
|
|
55 |
class Rtd(RestrictedDTML, TemplateDict): |
class Rtd(RestrictedDTML, TemplateDict): |
56 |
this = None |
this = None |
57 |
|
|
160 |
self.preferred = ('utf_8', 'utf_16') |
self.preferred = ('utf_8', 'utf_16') |
161 |
else: |
else: |
162 |
self.preferred = self.purify(preferred) |
self.preferred = self.purify(preferred) |
|
self.log('Initializing with %s' % self.preferred) |
|
163 |
self.acceptable = sets.Set(self.preferred) |
self.acceptable = sets.Set(self.preferred) |
164 |
self.clients = [] |
self.clients = [] |
165 |
|
|
179 |
if client_id not in self.clients: |
if client_id not in self.clients: |
180 |
self.clients.append(client_id) |
self.clients.append(client_id) |
181 |
encodings = self.purify(encodings) |
encodings = self.purify(encodings) |
|
self.log('restricting with %s due to %s' % (encodings, client)) |
|
182 |
self.acceptable.intersection_update(sets.Set(encodings)) |
self.acceptable.intersection_update(sets.Set(encodings)) |
|
self.log('now: %s' % self.acceptable) |
|
|
else: |
|
|
self.log('client %s already cached' % client) |
|
183 |
|
|
184 |
security.declarePublic('force') |
security.declarePublic('force') |
185 |
def force(self, encoding): |
def force(self, encoding): |
186 |
"force one encoding. If it's called multiple times, bad luck, last one wins." |
"force one encoding. If it's called multiple times, bad luck, last one wins." |
|
self.log('forcing %s' % encoding) |
|
187 |
self.forced = encoding |
self.forced = encoding |
188 |
|
|
189 |
def encode(self, text): |
def encode(self, text): |
312 |
return OpenPageTemplate.inheritedAttribute('_getContext')(self) |
return OpenPageTemplate.inheritedAttribute('_getContext')(self) |
313 |
return self |
return self |
314 |
|
|
315 |
|
def _prop_config(self, dict): |
316 |
|
"update properties from dict" |
317 |
|
self.__dict__.update(dict) |
318 |
|
|
319 |
security = AccessControl.ClassSecurityInfo() |
security = AccessControl.ClassSecurityInfo() |
320 |
|
|
321 |
security.declareObjectProtected('View') |
security.declareObjectProtected('View') |
327 |
self._v_paxtree = pickle.loads(self._paxtree) |
self._v_paxtree = pickle.loads(self._paxtree) |
328 |
return self._v_paxtree |
return self._v_paxtree |
329 |
|
|
330 |
|
security.declareProtected('View management screens', 'uread') |
331 |
|
def uread(self, *args, **kw): |
332 |
|
return unicode(self.read(), self.encoding) |
333 |
|
|
334 |
|
security.declareProtected('View management screens', 'read') |
335 |
def read(self, *args, **kw): |
def read(self, *args, **kw): |
336 |
if not self._errors: |
if not self._errors: |
337 |
return self._text |
return self._text |
340 |
join(self._errors, '\n '), |
join(self._errors, '\n '), |
341 |
self._text)) |
self._text)) |
342 |
|
|
343 |
def write(self, text): |
def write(self, text, do_config=True): |
344 |
self.ZCacheable_invalidate() |
self.ZCacheable_invalidate() |
345 |
assert type(text) in (type(''), type(u'')) |
assert type(text) in (type(''), type(u'')) |
346 |
|
|
347 |
|
if do_config and text.startswith('<!--pt_encoding'): |
348 |
|
comment, text = text.split('-->\n', 1) |
349 |
|
self.encoding = comment[16:].strip() |
350 |
|
|
351 |
if text.startswith(self._error_start): |
if text.startswith(self._error_start): |
352 |
errend = text.find('-->') |
errend = text.find('-->') |
353 |
if errend >= 0: |
if errend >= 0: |
354 |
text = text[errend + 4:] |
text = text[errend + 4:] |
355 |
|
|
356 |
if self._text != text: |
if self._text != text: |
357 |
self._text = text |
self._text = text |
358 |
|
|
378 |
for handler in postcompiler_registry: |
for handler in postcompiler_registry: |
379 |
tree = handler(self, tree, context) |
tree = handler(self, tree, context) |
380 |
self._paxtree = pickle.dumps(tree) |
self._paxtree = pickle.dumps(tree) |
381 |
|
# check for tal:config in the context |
382 |
|
if do_config and hasattr(context, 'tal_configuration'): |
383 |
|
self._prop_config(context.tal_configuration) |
384 |
|
# sigh, encoding or source type may have changed |
385 |
|
if (context.tal_configuration.has_key('encoding') or |
386 |
|
context.tal_configuration.has_key('source_type')): |
387 |
|
self.write(text, do_config=False) |
388 |
if hasattr(self, '_v_paxtree'): |
if hasattr(self, '_v_paxtree'): |
389 |
# remove cached (unpickled) tree |
# remove cached (unpickled) tree |
390 |
del self._v_paxtree |
del self._v_paxtree |