Fixed formatting issues

Added three test classes for the presentation controllers 
Fixed issue that failed load for ImpressDocument
This commit is contained in:
Felipe Polo-Wood 2013-10-19 19:15:46 -04:00
parent 00fd7f01f7
commit dd1f556a8e
7 changed files with 96 additions and 85 deletions

View File

@ -330,8 +330,8 @@ class ServiceItem(object):
The command of/for the slide.
"""
self.service_item_type = ServiceItemType.Command
self._raw_frames.append({'title': file_name, 'image': image, 'path': path,
'displaytitle': displaytitle, 'notes': notes})
self._raw_frames.append({'title': file_name, 'image': image,
'path': path, 'displaytitle': displaytitle, 'notes': notes})
self._new_item()
def get_service_repr(self, lite_save):
@ -376,8 +376,9 @@ class ServiceItem(object):
service_data = [slide['title'] for slide in self._raw_frames]
elif self.service_item_type == ServiceItemType.Command:
for slide in self._raw_frames:
service_data.append({'title': slide['title'], 'image': slide['image'], 'path': slide['path'],
'displaytitle': slide['displaytitle'], 'notes': slide['notes']})
service_data.append({'title': slide['title'],
'image': slide['image'], 'path': slide['path'],
'displaytitle': slide['displaytitle'], 'notes': slide['notes']})
return {'header': service_header, 'data': service_data}
def set_from_service(self, serviceitem, path=None):
@ -449,10 +450,12 @@ class ServiceItem(object):
self.title = text_image['title']
if path:
self.has_original_files = False
self.add_from_command(path, text_image['title'], text_image['image'],
text_image['displaytitle'], text_image['notes'])
self.add_from_command(path, text_image['title'],
text_image['image'], text_image['displaytitle'],
text_image['notes'])
else:
self.add_from_command(text_image['path'], text_image['title'], text_image['image'])
self.add_from_command(text_image['path'],
text_image['title'], text_image['image'])
self._new_item()
def get_display_title(self):

View File

@ -464,10 +464,11 @@ class ImpressDocument(PresentationDocument):
page = page.getNotesPage()
for index in range(page.getCount()):
shape = page.getByIndex(index)
shapeType = shape.getShapetype()
shapeType = shape.getShapeType()
if shape.supportsService("com.sun.star.drawing.Text"):
# if they requested title, make sure it is the title
if text_type!=TextType.Title or shapeType == "com.sun.star.presentation.TitleTextShape":
if text_type!=TextType.Title or \
shapeType == "com.sun.star.presentation.TitleTextShape":
text += shape.getString() + '\n'
return text
@ -479,17 +480,16 @@ class ImpressDocument(PresentationDocument):
in the thumbnails directory
"""
titles = []
notes = []
pages = self.document.getDrawPages()
for slideIndex in range(pages.getCount()):
titles.append( self.__get_text_from_page(slideIndex,TextType.Title).replace('\n',' ') + '\n')
notes = self.__get_text_from_page(slideIndex,TextType.Notes)
if len(notes) > 0:
notesfile = os.path.join(self.get_thumbnail_folder(), 'slideNotes%d.txt' % (num))
with open(notesfile, mode='w') as fn:
fn.write(notes)
titlesfile = os.path.join(self.get_thumbnail_folder(), 'titles.txt')
with open(titlesfile, mode='w') as fo:
fo.writelines(titles)
titles.append(
self.__get_text_from_page(slideIndex+1,TextType.Title).
replace('\n',' ') + '\n')
note = self.__get_text_from_page(slideIndex+1,TextType.Notes)
if len(note) == 0:
note = ' '
notes.append(note)
self.save_titles_and_notes(titles,notes)
return

View File

@ -325,23 +325,21 @@ class PowerpointDocument(PresentationDocument):
in the thumbnails directory
"""
titles = []
notes = []
num = 0
for slide in self.presentation.Slides:
try:
text = slide.Shapes.Title.TextFrame.TextRange.Text
titles.append(text.replace('\n',' ').replace('\x0b',' ') + '\n')
num += 1
notes = _get_text_from_shapes(slide.NotesPage.Shapes)
if len(notes) > 0:
notesfile = os.path.join(self.get_thumbnail_folder(), 'slideNotes%d.txt' % (num))
with open(notesfile, mode='w') as fn:
fn.write(notes)
except Exception as e:
log.exception(e)
titles.append('\n')
titlesfile = os.path.join(self.get_thumbnail_folder(), 'titles.txt')
with open(titlesfile, mode='w') as fo:
fo.writelines(titles)
text = ''
titles.append(text.replace('\n',' ').replace('\x0b',' ') + '\n')
num += 1
note = _get_text_from_shapes(slide.NotesPage.Shapes)
if len(note) == 0:
note = ' '
notes.append(note)
self.save_titles_and_notes(titles,notes)
return
def _get_text_from_shapes(shapes):
@ -353,7 +351,8 @@ def _get_text_from_shapes(shapes):
"""
text = ''
for shape in shapes:
if shape.PlaceholderFormat.Type == 2 and shape.HasTextFrame and shape.TextFrame.HasText:
if shape.PlaceholderFormat.Type == 2 and \
shape.HasTextFrame and shape.TextFrame.HasText:
text += shape.TextFrame.TextRange.Text + '\n'
return text

View File

@ -30,6 +30,8 @@
import os
import logging
import zipfile
import re
from xml.etree import ElementTree
if os.name == 'nt':
from ctypes import cdll
@ -155,80 +157,65 @@ class PptviewDocument(PresentationDocument):
and the notes to 'slideNotes[x].txt'
in the thumbnails directory
"""
filename = os.path.normpath(self.filepath)
# let's make sure we have a valid zipped presentation
if zipfile.is_zipfile(filename):
namespaces = {"p": "http://schemas.openxmlformats.org/presentationml/2006/main",
"a": "http://schemas.openxmlformats.org/drawingml/2006/main"}
namespaces = {"p":
"http://schemas.openxmlformats.org/presentationml/2006/main",
"a": "http://schemas.openxmlformats.org/drawingml/2006/main"}
# open the file
with zipfile.ZipFile(filename) as zip_file:
# find the presentation.xml to get the slide count
with zip_file.open('ppt/presentation.xml') as pres:
tree = ElementTree.parse(pres)
nodes = tree.getroot().findall(".//p:sldIdLst/p:sldId", namespaces=namespaces)
nodes = tree.getroot().findall(".//p:sldIdLst/p:sldId",
namespaces=namespaces)
print ("slide count: " + str(len(nodes)))
# initialize the lists
titles = ['' for i in range(len(nodes))]
notes = ['' for i in range(len(nodes))]
# loop thru the file list to find slides and notes
for zip_info in zip_file.infolist():
nodeType = ''
index = -1
listToAdd = None
# check if it is a slide
match = re.search("slides/slide(.+)\.xml", zip_info.filename)
if match:
index = int(match.group(1))-1
nodeType = 'ctrTitle'
listToAdd = titles
# or a note
match = re.search("notesSlides/notesSlide(.+)\.xml", zip_info.filename)
match = re.search("notesSlides/notesSlide(.+)\.xml",
zip_info.filename)
if match:
index = int(match.group(1))-1
nodeType = 'body'
listToAdd = notes
# if it is one of our files, index shouldn't be -1
if index >= 0:
with zip_file.open(zip_info) as zipped_file:
tree = ElementTree.parse(zipped_file)
text = ''
nodes = tree.getroot().findall(".//p:ph[@type='" + nodeType + "']../../..//p:txBody//a:t",
namespaces=namespaces)
nodes = tree.getroot().findall(".//p:ph[@type='" +
nodeType + "']../../..//p:txBody//a:t",
namespaces=namespaces)
# if we found any content
if nodes and len(nodes)>0:
for node in nodes:
if len(text) > 0:
text += '\n'
text += node.text
print( 'slide file: ' + zip_info.filename + ' ' + text )
# let's remove the \n from the titles and just add one at the end
# Let's remove the \n from the titles and
# just add one at the end
if nodeType == 'ctrTitle':
text = text.replace('\n',' ').replace('\x0b', ' ') + '\n'
text = text.replace('\n',' '). \
replace('\x0b', ' ') + '\n'
listToAdd[index] = text
print( titles )
print( notes )
# now let's write the files
titlesfile = os.path.join(self.get_thumbnail_folder(), 'titles.txt')
with open(titlesfile, mode='w') as fo:
fo.writelines(titles)
for num in range(len(notes)):
notesfile = os.path.join(self.get_thumbnail_folder(), 'slideNotes%d.txt' % (num+1))
with open(notesfile, mode='w') as fn:
fn.write(notes)
self.save_titles_and_notes(titles,notes)
return
def close_presentation(self):
"""
Close presentation and clean up objects. Triggered by new object being added to SlideController or OpenLP being

View File

@ -177,51 +177,50 @@ class PPTViewer(QtGui.QWidget):
int(self.widthEdit.text()), int(self.heightEdit.text()))
filename = str(self.pptEdit.text().replace('/', '\\'))
folder = str(self.folderEdit.text().replace('/', '\\'))
if zipfile.is_zipfile(filename):
namespaces = {"p": "http://schemas.openxmlformats.org/presentationml/2006/main",
"a": "http://schemas.openxmlformats.org/drawingml/2006/main"}
namespaces = {"p":
"http://schemas.openxmlformats.org/presentationml/2006/main",
"a": "http://schemas.openxmlformats.org/drawingml/2006/main"}
with zipfile.ZipFile(filename) as zip_file:
with zip_file.open('ppt/presentation.xml') as pres:
tree = ElementTree.parse(pres)
nodes = tree.getroot().findall(".//p:sldIdLst/p:sldId", namespaces=namespaces)
nodes = tree.getroot().findall(".//p:sldIdLst/p:sldId",
namespaces=namespaces)
print ("slide count: " + str(len(nodes)))
titles = [None for i in range(len(nodes))]
notes = [None for i in range(len(nodes))]
for zip_info in zip_file.infolist():
nodeType = ''
index = -1
listToAdd = None
match = re.search("slides/slide(.+)\.xml", zip_info.filename)
match = re.search("slides/slide(.+)\.xml",
zip_info.filename)
if match:
index = int(match.group(1))-1
nodeType = 'ctrTitle'
listToAdd = titles
match = re.search("notesSlides/notesSlide(.+)\.xml", zip_info.filename)
match = re.search("notesSlides/notesSlide(.+)\.xml",
zip_info.filename)
if match:
index = int(match.group(1))-1
nodeType = 'body'
listToAdd = notes
if len(nodeType)>0:
with zip_file.open(zip_info) as zipped_file:
tree = ElementTree.parse(zipped_file)
text = ''
nodes = tree.getroot().findall(".//p:ph[@type='" + nodeType + "']../../..//p:txBody//a:t",
namespaces=namespaces)
nodes = tree.getroot().findall(".//p:ph[@type='" + \
nodeType + "']../../..//p:txBody//a:t",
namespaces=namespaces)
if nodes and len(nodes)>0:
for node in nodes:
if len(text) > 0:
text += '\n'
text += node.text
print( 'slide file: ' + zip_info.filename + ' ' + text )
print('slide file: ' + zip_info.filename + ' ' + text)
listToAdd[index] = text
print( titles )
print( notes )
print(titles)
print(notes)
print(filename, folder)
self.pptid = self.pptdll.OpenPPT(filename, None, rect, folder)
print('id: ' + str(self.pptid))

View File

@ -301,7 +301,8 @@ class PresentationDocument(object):
with open(titlesfile) as fi:
titles = fi.readlines()
for index in range(len(titles)):
notesfile = os.path.join(self.get_thumbnail_folder(), 'slideNotes%d.txt' % (index + 1))
notesfile = os.path.join(self.get_thumbnail_folder(),
'slideNotes%d.txt' % (index + 1))
note = ''
try:
if os.path.exists(notesfile):
@ -312,6 +313,19 @@ class PresentationDocument(object):
notes.append(note)
return titles, notes
def save_titles_and_notes(self, titles, notes):
"""
Performs the actual persisting of titles to the titles.txt
and notes to the slideNote%.txt
"""
titlesfile = os.path.join(self.get_thumbnail_folder(), 'titles.txt')
with open(titlesfile, mode='w') as fo:
fo.writelines(titles)
for num in range(len(notes)):
notesfile = os.path.join(self.get_thumbnail_folder(),
'slideNotes%d.txt' % (num+1))
with open(notesfile, mode='w') as fn:
fn.write(notes[num])
class PresentationController(object):

View File

@ -351,7 +351,8 @@ class HttpRouter(object):
html = None
if self.send_appropriate_header(file_name) == '.html':
variables = self.template_vars
html = Template(filename=path, input_encoding='utf-8', output_encoding='utf-8').render(**variables)
html = Template(filename=path, input_encoding='utf-8',
output_encoding='utf-8').render(**variables)
file_handle = None
try:
if html:
@ -369,6 +370,11 @@ class HttpRouter(object):
return content
def send_appropriate_header(self, file_name):
"""
Examines the extension of the file and determines
what header to send back
Returns the extension found
"""
ext = os.path.splitext(file_name)[1]
if ext == '.html':
self.send_header('Content-type', 'text/html')
@ -394,8 +400,9 @@ class HttpRouter(object):
"""
log.debug('serve thumbnail %s/thumbnails/%s' % (controller_name, file_name))
content = ''
full_path = os.path.join(AppLocation.get_section_data_path(controller_name),
'thumbnails/' + file_name.replace('/','\\') )
full_path = os.path.normpath(os.path.join(
AppLocation.get_section_data_path(controller_name),
'thumbnails/' + file_name))
full_path = urllib.parse.unquote(full_path)
if os.path.exists(full_path):
@ -498,9 +505,11 @@ class HttpRouter(object):
if current_item.is_capable(ItemCapabilities.HasNotes):
item['notes'] = str(frame['notes'])
if current_item.is_capable(ItemCapabilities.HasThumbnails):
# if the file is under our app directory tree send the portion after the match
if frame['image'][0:len(AppLocation.get_data_path())] == AppLocation.get_data_path():
item['img'] = frame['image'][len(AppLocation.get_data_path()):]
# If the file is under our app directory tree send the
# portion after the match
dataPath = AppLocation.get_data_path()
if frame['image'][0:len(dataPath)] == dataPath:
item['img'] = frame['image'][len(dataPath):]
#'data:image/png;base64,' + str(image_to_byte(resize_image(frame['image'],80,80)))
item['text'] = str(frame['title'])
item['html'] = str(frame['title'])