Commit 748a6b27 authored by Yoshinori Okuji's avatar Yoshinori Okuji

Add asSubjectText into Document and TextDocument. Allow callers to pass...

Add asSubjectText into Document and TextDocument. Allow callers to pass parameters to a substitution method.

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@21557 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent 1048bcf4
......@@ -1178,16 +1178,30 @@ class Document(PermanentURLMixIn, XMLObject, UrlMixIn, ConversionCacheMixin, Sna
format, data = self.convert(format)
return len(data)
security.declareProtected(Permissions.View, 'asSubjectText')
def asSubjectText(self, **kw):
"""
Converts the subject of the document to a textual representation.
"""
subject = self.getSubject()
if not subject:
# XXX not sure if this fallback is a good idea.
subject = self.getTitle()
if subject is None:
subject = ''
return str(subject)
security.declareProtected(Permissions.View, 'asText')
def asText(self):
def asText(self, **kw):
"""
Converts the content of the document to a textual representation.
"""
mime, data = self.convert(format='txt')
kw['format'] = 'txt'
mime, data = self.convert(**kw)
return str(data)
security.declareProtected(Permissions.View, 'asEntireHTML')
def asEntireHTML(self):
def asEntireHTML(self, **kw):
"""
Returns a complete HTML representation of the document
(with body tags, etc.). Adds if necessary a base
......@@ -1196,7 +1210,7 @@ class Document(PermanentURLMixIn, XMLObject, UrlMixIn, ConversionCacheMixin, Sna
Actual conversion is delegated to _asHTML
"""
html = self._asHTML()
html = self._asHTML(**kw)
if self.getUrlString():
# If a URL is defined, add the base tag
# if base is defined yet.
......@@ -1210,7 +1224,7 @@ class Document(PermanentURLMixIn, XMLObject, UrlMixIn, ConversionCacheMixin, Sna
return html
security.declarePrivate('_asHTML')
def _asHTML(self):
def _asHTML(self, **kw):
"""
A private method which converts to HTML. This method
is the one to override in subclasses.
......@@ -1218,13 +1232,15 @@ class Document(PermanentURLMixIn, XMLObject, UrlMixIn, ConversionCacheMixin, Sna
if not self.hasBaseData():
raise ConversionError('This document has not been processed yet.')
if self.hasConversion(format='base-html'):
# FIXME: no substitution may occur in this case.
mime, data = self.getConversion(format='base-html')
return data
mime, html = self.convert(format='html')
kw['format'] = 'html'
mime, html = self.convert(**kw)
return html
security.declareProtected(Permissions.View, 'asStrippedHTML')
def asStrippedHTML(self):
def asStrippedHTML(self, **kw):
"""
Returns a stripped HTML representation of the document
(without html and body tags, etc.) which can be used to inline
......@@ -1233,9 +1249,11 @@ class Document(PermanentURLMixIn, XMLObject, UrlMixIn, ConversionCacheMixin, Sna
if not self.hasBaseData():
return ''
if self.hasConversion(format='stripped-html'): # XXX this is redundant since we never set it
# FIXME: no substitution may occur in this case.
mime, data = self.getConversion(format='stripped-html')
return data
mime, html = self.convert(format='html')
kw['format'] = 'html'
mime, html = self.convert(**kw)
body_list = re.findall(self.body_parser, str(html))
if len(body_list):
stripped_html = body_list[0]
......
......@@ -294,7 +294,7 @@ class Image(File, OFSImage):
# Conversion API
security.declareProtected(Permissions.ModifyPortalContent, 'convert')
def convert(self, format, display=None, quality=75, resolution=None, frame=None):
def convert(self, format, display=None, quality=75, resolution=None, frame=None, **kw):
"""
Implementation of conversion for PDF files
"""
......
......@@ -151,8 +151,46 @@ class TextDocument(Document, TextContent):
RESPONSE.setHeader('Accept-Ranges', 'bytes')
return data
def _substituteTextContent(self, text, **kw):
# If a method for string substitutions of the text content, perform it.
# Decode everything into unicode before the substitutions, in order to
# avoid encoding errors.
method_id = self.getTextContentSubstitutionMappingMethodId()
if method_id:
mapping = guarded_getattr(self, method_id)(**kw)
is_str = isinstance(text, str)
if is_str:
text = text.decode('utf-8')
unicode_mapping = {}
for k, v in mapping.iteritems():
if isinstance(v, str):
v = v.decode('utf-8')
elif not isinstance(v, unicode):
v = str(v).decode('utf-8')
unicode_mapping[k] = v
text = Template(text).substitute(unicode_mapping)
# If the original was a str, convert it back to str.
if is_str:
text = text.encode('utf-8')
return text
security.declareProtected(Permissions.View, 'asSubjectText')
def asSubjectText(self, substitution_method_parameter_dict=None, **kw):
"""
Converts the subject of the document to a textual representation.
"""
subject = TextDocument.inheritedAttribute('asSubjectText')(self, **kw)
if substitution_method_parameter_dict is None:
substitution_method_parameter_dict = {}
return self._substituteTextContent(subject, **substitution_method_parameter_dict)
security.declareProtected(Permissions.View, 'convert')
def convert(self, format, **kw):
def convert(self, format, substitution_method_parameter_dict=None, **kw):
"""
Convert text using portal_transforms or oood
"""
......@@ -179,26 +217,9 @@ class TextDocument(Document, TextContent):
'portal_transforms failed to convert to %s: %r' % (mime_type, self))
result = ''
# If a method for string substitutions of the text content, perform it.
# Decode everything into unicode before the substitutions, in order to
# avoid encoding errors.
method_id = self.getTextContentSubstitutionMappingMethodId()
if method_id:
mapping = guarded_getattr(self, method_id)()
if isinstance(result, str):
result = result.decode('utf-8')
unicode_mapping = {}
for k, v in mapping.iteritems():
if isinstance(v, str):
v = v.decode('utf-8')
elif not isinstance(v, unicode):
v = str(v).decode('utf-8')
unicode_mapping[k] = v
result = Template(result).substitute(unicode_mapping)
# XXX is it better to convert back to str?
if substitution_method_parameter_dict is None:
substitution_method_parameter_dict = {}
result = self._substituteText(result, **substitution_method_parameter_dict)
return mime_type, result
else:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment