From b226364559277b5717d903c781ca589923322424 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 2 Oct 2012 19:35:10 +0200 Subject: [PATCH] when a verse appears more than once do not render the verse again, instead use the already rendered one to improve performance --- openlp/core/lib/serviceitem.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index a5b9c524b..c6c46907c 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -180,8 +180,19 @@ class ServiceItem(object): self.themedata, self.main, self.footer = self.renderer.pre_render() if self.service_item_type == ServiceItemType.Text: log.debug(u'Formatting slides: %s' % self.title) + # Save rendered pages to this dict. In the case that a slide is used + # twice we can use the pages saved to the dict instead of rendering + # them again. + previous_pages = {} for slide in self._raw_frames: - pages = self.renderer.format_slide(slide[u'raw_slide'], self) + verse_tag = slide[u'verseTag'] + if verse_tag in previous_pages and \ + previous_pages[verse_tag][0] == slide[u'raw_slide']: + pages = previous_pages[verse_tag][1] + else: + pages = \ + self.renderer.format_slide(slide[u'raw_slide'], self) + previous_pages[verse_tag] = (slide[u'raw_slide'], pages) for page in pages: page = page.replace(u'
', u'{br}') html = expand_tags(cgi.escape(page.rstrip())) @@ -189,7 +200,7 @@ class ServiceItem(object): u'title': clean_tags(page), u'text': clean_tags(page.rstrip()), u'html': html.replace(u' ', u' '), - u'verseTag': slide[u'verseTag'] + u'verseTag': verse_tag }) elif self.service_item_type == ServiceItemType.Image or \ self.service_item_type == ServiceItemType.Command: