erp5_corporate_identity: improve slideshow rendering including displaying...
erp5_corporate_identity: improve slideshow rendering including displaying legacy presentation as slideshow
""" | |||
================================================================================ | |||
Try to convert old OpenOffice presentations into slideshows | |||
================================================================================ | |||
""" | |||
# uses cloudooo to convert odp/sxi to html (quite buggy) and then salvages the | |||
# result into a slideshow html, which is passed on as remote_content to the | |||
# slideshow renderer | |||
# kw-parameters (* default) | |||
# ------------------------------------------------------------------------------ | |||
import re | |||
blank = '' | |||
flags = re.MULTILINE|re.DOTALL|re.IGNORECASE | |||
def getHeaderSlideTitle(my_doc): | |||
return '<h1>' + my_doc.getTitle() + '</h1>' | |||
|
|||
def getSlideList(content): | |||
return re.findall(r'<html>(.*?)</html>', content, flags=flags) | |||
def getKey(item): | |||
return int(item[0]) | |||
# -------------------------------- Setup --------------------------------------- | |||
if context.getPortalType() in ["Presentation"]: | |||
portal = context.getPortalObject() | |||
mimetype = 'text/html' | |||
content_type = context.getContentType() | |||
raw_data = portal.portal_transforms.convertToData(mimetype, str(context.getData() or ""), context=context, mimetype=content_type) | |||
if raw_data is None: | |||
raise ValueError("Failed to convert to %r" % mimetype) | |||
if context.REQUEST is not None: | |||
context.REQUEST.RESPONSE.setHeader("Content-Type", mimetype) | |||
# get a list of slides | |||
content = getSlideList(raw_data) | |||
# every slide is in the raw_data twice, once with the title and image as text, | |||
# once with the slidecontent without title. All slides are mixed randomly, so | |||
# we need to find out which slide contains what and then put them in their | |||
# correct order. We do this by extracting the links in the slides navigation | |||
# bar. This bar as a switch to change from image to text slides with the | |||
# current slide number so <a href="text3">Text</a> to switch from Graphic | |||
# slide 3 to Text slide 3. We use this to identify current slide | |||
if len(content) > 0: | |||
slideshow = [] | |||
output = blank | |||
for slide in content: | |||
slide_nav = re.search(r'<center>(.*?)</center>', slide, flags=flags).group() | |||
slide_nav_link_list = re.findall(r'<a(.*?)</a>', slide_nav, flags=flags) | |||
for link in slide_nav_link_list: | |||
# the header slide. Contains header and extracted text from image | |||
if re.search(r'>Graphic', link, flags=flags): | |||
pointer = re.search(r'(text|img)([0-9]*)\.', link, flags=flags) | |||
if pointer is not None: | |||
slide_header = re.search(r'<h1>(.*)?</h1>', slide, flags=flags).group() | |||
slideshow.append([str(pointer.group(2)), slide_header]) | |||
# the content slide. Contains image and notes | |||
if re.search(r'>Text', link, flags=flags): | |||
pointer = re.search(r'(text|img)([0-9]*)\.', link, flags=flags) | |||
if pointer is not None: | |||
slideshow.append([str(pointer.group(2)), slide]) | |||
# time to sort and add first slide header in case missing | |||
slideshow = sorted(slideshow, key=getKey) | |||
if '<h1' not in slideshow[0][1]: | |||
slideshow.insert(0, ["0", getHeaderSlideTitle(context)]) | |||
output = "" | |||
section_start = '<section>' | |||
section_end = '</section>' | |||
# slideshow will contain <header>, <content>, <header>, <content>... | |||
# so we need to go through it two-slides at a time to assemble | |||
# slides | |||
slide_iter = iter(slideshow) | |||
for slide in slide_iter: | |||
slide_1st = slide | |||
slide_2nd = next(slide_iter) | |||
# we don't know whether header is on first or second position | |||
if '<h1' not in slide_1st[1]: | |||
go_1st = slide_2nd[1] | |||
go_2nd = slide_1st[1] | |||
else: | |||
go_1st = slide_1st[1] | |||
go_2nd = slide_2nd[1] | |||
go_2nd = go_2nd.replace(re.search(r'<head>.*?</center><br>', go_2nd, flags=flags).group(), blank) | |||
go_2nd = go_2nd.replace("<h3>Notes:</h3><br>", '<details open="open">') | |||
go_2nd = go_2nd.replace("</body>", "</details>") | |||
output = output + section_start + go_1st + go_2nd + section_end | |||
kw["remote_content"] = output | |||
|
|||
return context.WebPage_viewAsSlideshowWIP(*args, **kw) |