diff --git a/openlp/core/lib/htmlbuilder.py b/openlp/core/lib/htmlbuilder.py
index f0d8ddef2..28976b68c 100644
--- a/openlp/core/lib/htmlbuilder.py
+++ b/openlp/core/lib/htmlbuilder.py
@@ -390,14 +390,14 @@ is the function which has to be called from outside. The generated and returned
import logging
from PyQt5 import QtWebKit
+from string import Template
from openlp.core.common import Settings
from openlp.core.lib.theme import BackgroundType, BackgroundGradientType, VerticalType, HorizontalType
log = logging.getLogger(__name__)
-# TODO: Verify where this is used before converting to python3
-HTMLSRC = """
+HTML_SRC = Template("""
@@ -411,14 +411,14 @@ HTMLSRC = """
-webkit-user-select: none;
}
body {
- %s;
+ ${bg_css};
}
.size {
position: absolute;
left: 0px;
top: 0px;
- width: 100%%;
- height: 100%%;
+ width: 100%;
+ height: 100%;
}
#black {
z-index: 8;
@@ -431,14 +431,14 @@ body {
#image {
z-index: 2;
}
-%s
+${css_additions}
#footer {
position: absolute;
z-index: 6;
- %s
+ ${footer_css}
}
/* lyric css */
-%s
+${lyrics_css}
sup {
font-size: 0.6em;
vertical-align: top;
@@ -448,8 +448,8 @@ sup {
-
-
-%s
+
+
+${html_additions}
-"""
+""")
+
+LYRICS_SRC = Template("""
+.lyricstable {
+ z-index: 5;
+ position: absolute;
+ display: table;
+ ${stable}
+}
+.lyricscell {
+ display: table-cell;
+ word-wrap: break-word;
+ -webkit-transition: opacity 0.4s ease;
+ ${lyrics}
+}
+.lyricsmain {
+ ${main}
+}
+""")
+
+FOOTER_SRC = Template("""
+left: ${left}px;
+bottom: ${bottom}px;
+width: ${width}px;
+font-family: ${family};
+font-size: ${size}pt;
+color: ${color};
+text-align: left;
+white-space: ${space};
+""")
+
+LYRICS_FORMAT_SRC = Template("""
+${justify}word-wrap: break-word;
+text-align: ${align};
+vertical-align: ${valign};
+font-family: ${font};
+font-size: ${size}pt;
+color: ${color};
+line-height: ${line}%;
+margin: 0;
+padding: 0;
+padding-bottom: ${bottom};
+padding-left: ${left}px;
+width: ${width}px;
+height: ${height}px;${font_style}${font_weight}
+""")
def build_html(item, screen, is_live, background, image=None, plugins=None):
@@ -582,18 +627,17 @@ def build_html(item, screen, is_live, background, image=None, plugins=None):
css_additions += plugin.get_display_css()
js_additions += plugin.get_display_javascript()
html_additions += plugin.get_display_html()
- html = HTMLSRC % (
- build_background_css(item, width),
- css_additions,
- build_footer_css(item, height),
- build_lyrics_css(item),
- 'true' if theme_data and theme_data.display_slide_transition and is_live else 'false',
- js_additions,
- bgimage_src,
- image_src,
- html_additions
- )
- return html
+ return HTML_SRC.substitute(bg_css=build_background_css(item, width),
+ css_additions=css_additions,
+ footer_css=build_footer_css(item, height),
+ lyrics_css=build_lyrics_css(item),
+ transitions='true' if (theme_data and
+ theme_data.display_slide_transition and
+ is_live) else 'false',
+ js_additions=js_additions,
+ bg_image=bgimage_src,
+ image=image_src,
+ html_additions=html_additions)
def webkit_version():
@@ -650,24 +694,6 @@ def build_lyrics_css(item):
:param item: Service Item containing theme and location information
"""
- # TODO: Verify this before converting to python3
- style = """
-.lyricstable {
- z-index: 5;
- position: absolute;
- display: table;
- %s
-}
-.lyricscell {
- display: table-cell;
- word-wrap: break-word;
- -webkit-transition: opacity 0.4s ease;
- %s
-}
-.lyricsmain {
- %s
-}
-"""
theme_data = item.theme_data
lyricstable = ''
lyrics = ''
@@ -680,8 +706,7 @@ def build_lyrics_css(item):
lyricsmain += ' text-shadow: {theme} {shadow}px ' \
'{shadow}px;'.format(theme=theme_data.font_main_shadow_color,
shadow=theme_data.font_main_shadow_size)
- lyrics_css = style % (lyricstable, lyrics, lyricsmain)
- return lyrics_css
+ return LYRICS_SRC.substitute(stable=lyricstable, lyrics=lyrics, main=lyricsmain)
def build_lyrics_outline_css(theme_data):
@@ -710,38 +735,23 @@ def build_lyrics_format_css(theme_data, width, height):
"""
align = HorizontalType.Names[theme_data.display_horizontal_align]
valign = VerticalType.Names[theme_data.display_vertical_align]
- if theme_data.font_main_outline:
- left_margin = int(theme_data.font_main_outline_size) * 2
- else:
- left_margin = 0
- justify = 'white-space:pre-wrap;'
+ left_margin = (int(theme_data.font_main_outline_size) * 2) if theme_data.font_main_outline else 0
# fix tag incompatibilities
- if theme_data.display_horizontal_align == HorizontalType.Justify:
- justify = ''
- if theme_data.display_vertical_align == VerticalType.Bottom:
- padding_bottom = '0.5em'
- else:
- padding_bottom = '0'
- lyrics = '{justify} word-wrap: break-word; ' \
- 'text-align: {align}; vertical-align: {valign}; font-family: {font}; ' \
- 'font-size: {size}pt; color: {color}; line-height: {line:d}%; margin: 0;' \
- 'padding: 0; padding-bottom: {bottom}; padding-left: {left}px; width: {width}px; ' \
- 'height: {height}px; '.format(justify=justify,
- align=align,
- valign=valign,
- font=theme_data.font_main_name,
- size=theme_data.font_main_size,
- color=theme_data.font_main_color,
- line=100 + int(theme_data.font_main_line_adjustment),
- bottom=padding_bottom,
- left=left_margin,
- width=width,
- height=height)
- if theme_data.font_main_italics:
- lyrics += 'font-style:italic; '
- if theme_data.font_main_bold:
- lyrics += 'font-weight:bold; '
- return lyrics
+ justify = '' if (theme_data.display_horizontal_align == HorizontalType.Justify) else 'white-space:pre-wrap;\n'
+ padding_bottom = '0.5em' if (theme_data.display_vertical_align == VerticalType.Bottom) else '0'
+ return LYRICS_FORMAT_SRC.substitute(justify=justify,
+ align=align,
+ valign=valign,
+ font=theme_data.font_main_name,
+ size=theme_data.font_main_size,
+ color=theme_data.font_main_color,
+ line='{line:d}'.format(line=100 + int(theme_data.font_main_line_adjustment)),
+ bottom=padding_bottom,
+ left=left_margin,
+ width=width,
+ height=height,
+ font_style='\nfont-style:italic;' if theme_data.font_main_italics else '',
+ font_weight='\nfont-weight:bold;' if theme_data.font_main_bold else '')
def build_footer_css(item, height):
@@ -751,22 +761,11 @@ def build_footer_css(item, height):
:param item: Service Item to be processed.
:param height:
"""
- style = """
- left: {left}px;
- bottom: {bottom}px;
- width: {width}px;
- font-family: {family};
- font-size: {size}pt;
- color: {color};
- text-align: left;
- white-space: {space};
- """
theme = item.theme_data
if not theme or not item.footer:
return ''
bottom = height - int(item.footer.y()) - int(item.footer.height())
whitespace = 'normal' if Settings().value('themes/wrap footer') else 'nowrap'
- lyrics_html = style.format(left=item.footer.x(), bottom=bottom, width=item.footer.width(),
- family=theme.font_footer_name, size=theme.font_footer_size,
- color=theme.font_footer_color, space=whitespace)
- return lyrics_html
+ return FOOTER_SRC.substitute(left=item.footer.x(), bottom=bottom, width=item.footer.width(),
+ family=theme.font_footer_name, size=theme.font_footer_size,
+ color=theme.font_footer_color, space=whitespace)
diff --git a/tests/functional/openlp_core_lib/test_htmlbuilder.py b/tests/functional/openlp_core_lib/test_htmlbuilder.py
index 48c60b55f..5f385e3eb 100644
--- a/tests/functional/openlp_core_lib/test_htmlbuilder.py
+++ b/tests/functional/openlp_core_lib/test_htmlbuilder.py
@@ -182,19 +182,33 @@ LYRICS_CSS = """
}
"""
LYRICS_OUTLINE_CSS = ' -webkit-text-stroke: 0.125em #000000; -webkit-text-fill-color: #FFFFFF; '
-LYRICS_FORMAT_CSS = ' word-wrap: break-word; text-align: justify; vertical-align: bottom; ' + \
- 'font-family: Arial; font-size: 40pt; color: #FFFFFF; line-height: 108%; margin: 0;padding: 0; ' + \
- 'padding-bottom: 0.5em; padding-left: 2px; width: 1580px; height: 810px; font-style:italic; font-weight:bold; '
+LYRICS_FORMAT_CSS = """
+word-wrap: break-word;
+text-align: justify;
+vertical-align: bottom;
+font-family: Arial;
+font-size: 40pt;
+color: #FFFFFF;
+line-height: 108%;
+margin: 0;
+padding: 0;
+padding-bottom: 0.5em;
+padding-left: 2px;
+width: 1580px;
+height: 810px;
+font-style:italic;
+font-weight:bold;
+"""
FOOTER_CSS_BASE = """
- left: 10px;
- bottom: 0px;
- width: 1260px;
- font-family: Arial;
- font-size: 12pt;
- color: #FFFFFF;
- text-align: left;
- white-space: %s;
- """
+left: 10px;
+bottom: 0px;
+width: 1260px;
+font-family: Arial;
+font-size: 12pt;
+color: #FFFFFF;
+text-align: left;
+white-space: %s;
+"""
FOOTER_CSS = FOOTER_CSS_BASE % ('nowrap')
FOOTER_CSS_WRAP = FOOTER_CSS_BASE % ('normal')
FOOTER_CSS_INVALID = ''