diff --git a/openlp/core/lib/htmlbuilder.py b/openlp/core/lib/htmlbuilder.py index 5aa701d95..07a83f336 100644 --- a/openlp/core/lib/htmlbuilder.py +++ b/openlp/core/lib/htmlbuilder.py @@ -26,7 +26,372 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +""" +This module is responsible for generating the HTML for :class:`~openlp.core.ui.maindisplay`. The ``build_html`` function +is the function which has to be called from outside. The generated and returned HTML will look similar to this:: + + +
+@@ -222,8 +576,7 @@ def build_html(item, screen, is_live, background, image=None, plugins=None): """ width = screen['size'].width() height = screen['size'].height() - theme = item.themedata - webkit_ver = webkit_version() + theme_data = item.themedata # Image generated and poked in if background: bgimage_src = 'src="data:image/png;base64,%s"' % background @@ -247,12 +600,12 @@ def build_html(item, screen, is_live, background, image=None, plugins=None): build_background_css(item, width), css_additions, build_footer_css(item, height), - build_lyrics_css(item, webkit_ver), - 'true' if theme and theme.display_slide_transition and is_live else 'false', + 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, - build_lyrics_html(item, webkit_ver) + bgimage_src, + image_src, + html_additions ) return html @@ -303,16 +656,13 @@ def build_background_css(item, width): return background -def build_lyrics_css(item, webkit_ver): +def build_lyrics_css(item): """ Build the lyrics display css ``item`` Service Item containing theme and location information - ``webkitvers`` - The version of qtwebkit we're using - """ style = """ .lyricstable { @@ -328,81 +678,44 @@ def build_lyrics_css(item, webkit_ver): %s } .lyricsmain { -%s + %s } -.lyricsoutline { -%s -} -.lyricsshadow { -%s -} - """ - theme = item.themedata +""" + theme_data = item.themedata lyricstable = '' lyrics = '' lyricsmain = '' - outline = '' - shadow = '' - if theme and item.main: + if theme_data and item.main: lyricstable = 'left: %spx; top: %spx;' % (item.main.x(), item.main.y()) - lyrics = build_lyrics_format_css(theme, item.main.width(), item.main.height()) - # For performance reasons we want to show as few DIV's as possible, especially when animating/transitions. - # However some bugs in older versions of qtwebkit mean we need to perform workarounds and add extra divs. Only - # do these when needed. - # - # Before 533.3 the webkit-text-fill colour wasn't displayed, only the stroke (outline) color. So put stroke - # layer underneath the main text. - # - # Up to 534.3 the webkit-text-stroke was sometimes out of alignment with the fill, or normal text. - # letter-spacing=1 is workaround https://bugs.webkit.org/show_bug.cgi?id=44403 - # - # Up to 534.3 the text-shadow didn't get displayed when webkit-text-stroke was used. So use an offset text - # layer underneath. https://bugs.webkit.org/show_bug.cgi?id=19728 - if webkit_ver >= 533.3: - lyricsmain += build_lyrics_outline_css(theme) - else: - outline = build_lyrics_outline_css(theme) - if theme.font_main_shadow: - if theme.font_main_outline and webkit_ver <= 534.3: - shadow = 'padding-left: %spx; padding-top: %spx;' % \ - (int(theme.font_main_shadow_size) + (int(theme.font_main_outline_size) * 2), - theme.font_main_shadow_size) - shadow += build_lyrics_outline_css(theme, True) - else: - lyricsmain += ' text-shadow: %s %spx %spx;' % \ - (theme.font_main_shadow_color, theme.font_main_shadow_size, theme.font_main_shadow_size) - lyrics_css = style % (lyricstable, lyrics, lyricsmain, outline, shadow) + lyrics = build_lyrics_format_css(theme_data, item.main.width(), item.main.height()) + lyricsmain += build_lyrics_outline_css(theme_data) + if theme_data.font_main_shadow: + lyricsmain += ' text-shadow: %s %spx %spx;' % \ + (theme_data.font_main_shadow_color, theme_data.font_main_shadow_size, theme_data.font_main_shadow_size) + lyrics_css = style % (lyricstable, lyrics, lyricsmain) return lyrics_css -def build_lyrics_outline_css(theme, is_shadow=False): +def build_lyrics_outline_css(theme_data): """ Build the css which controls the theme outline. Also used by renderer for splitting verses - ``theme`` + ``theme_data`` Object containing theme information - - ``is_shadow`` - If true, use the shadow colors instead """ - if theme.font_main_outline: - size = float(theme.font_main_outline_size) / 16 - if is_shadow: - fill_color = theme.font_main_shadow_color - outline_color = theme.font_main_shadow_color - else: - fill_color = theme.font_main_color - outline_color = theme.font_main_outline_color + if theme_data.font_main_outline: + size = float(theme_data.font_main_outline_size) / 16 + fill_color = theme_data.font_main_color + outline_color = theme_data.font_main_outline_color return ' -webkit-text-stroke: %sem %s; -webkit-text-fill-color: %s; ' % (size, outline_color, fill_color) - else: - return '' + return '' -def build_lyrics_format_css(theme, width, height): +def build_lyrics_format_css(theme_data, width, height): """ Build the css which controls the theme format. Also used by renderer for splitting verses - ``theme`` + ``theme_data`` Object containing theme information ``width`` @@ -411,17 +724,17 @@ def build_lyrics_format_css(theme, width, height): ``height`` Height of the lyrics block """ - align = HorizontalType.Names[theme.display_horizontal_align] - valign = VerticalType.Names[theme.display_vertical_align] - if theme.font_main_outline: - left_margin = int(theme.font_main_outline_size) * 2 + 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;' # fix tag incompatibilities - if theme.display_horizontal_align == HorizontalType.Justify: + if theme_data.display_horizontal_align == HorizontalType.Justify: justify = '' - if theme.display_vertical_align == VerticalType.Bottom: + if theme_data.display_vertical_align == VerticalType.Bottom: padding_bottom = '0.5em' else: padding_bottom = '0' @@ -429,41 +742,13 @@ def build_lyrics_format_css(theme, width, height): 'text-align: %s; vertical-align: %s; font-family: %s; ' \ 'font-size: %spt; color: %s; line-height: %d%%; margin: 0;' \ 'padding: 0; padding-bottom: %s; padding-left: %spx; width: %spx; height: %spx; ' % \ - (justify, align, valign, theme.font_main_name, theme.font_main_size, - theme.font_main_color, 100 + int(theme.font_main_line_adjustment), padding_bottom, left_margin, width, height) - if theme.font_main_outline: - if webkit_version() <= 534.3: - lyrics += ' letter-spacing: 1px;' - if theme.font_main_italics: - lyrics += ' font-style:italic; ' - if theme.font_main_bold: - lyrics += ' font-weight:bold; ' - return lyrics - - -def build_lyrics_html(item, webkitvers): - """ - Build the HTML required to show the lyrics - - ``item`` - Service Item containing theme and location information - - ``webkitvers`` - The version of qtwebkit we're using - """ - # Bugs in some versions of QtWebKit mean we sometimes need additional divs for outline and shadow, since the CSS - # doesn't work. To support vertical alignment middle and bottom, nested div's using display:table/display:table-cell - # are required for each lyric block. - lyrics = '' - theme = item.themedata - if webkitvers <= 534.3 and theme and theme.font_main_outline: - lyrics += '
' - if webkitvers < 533.3: - lyrics += '
' - lyrics += '
' + (justify, align, valign, theme_data.font_main_name, theme_data.font_main_size, + theme_data.font_main_color, 100 + int(theme_data.font_main_line_adjustment), padding_bottom, + left_margin, width, height) + if theme_data.font_main_italics: + lyrics += 'font-style:italic; ' + if theme_data.font_main_bold: + lyrics += 'font-weight:bold; ' return lyrics diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 919087569..af9e38f15 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -243,8 +243,6 @@ class MainDisplay(Display): # Windows if there are many items in the service to re-render. # Setting the div elements direct seems to solve the issue self.frame.findFirstElement("#lyricsmain").setInnerXml(slide) - self.frame.findFirstElement("#lyricsoutline").setInnerXml(slide) - self.frame.findFirstElement("#lyricsshadow").setInnerXml(slide) def alert(self, text, location): """ diff --git a/openlp/core/ui/media/phononplayer.py b/openlp/core/ui/media/phononplayer.py index fadd8a694..9991d682c 100644 --- a/openlp/core/ui/media/phononplayer.py +++ b/openlp/core/ui/media/phononplayer.py @@ -46,36 +46,22 @@ from openlp.core.ui.media.mediaplayer import MediaPlayer log = logging.getLogger(__name__) ADDITIONAL_EXT = { - 'audio/ac3': ['.ac3'], - 'audio/flac': ['.flac'], - 'audio/x-m4a': ['.m4a'], - 'audio/midi': ['.mid', '.midi'], - 'audio/x-mp3': ['.mp3'], - 'audio/mpeg': ['.mp3', '.mp2', '.mpga', '.mpega', '.m4a'], - 'audio/qcelp': ['.qcp'], - 'audio/x-wma': ['.wma'], - 'audio/x-ms-wma': ['.wma'], - 'video/x-flv': ['.flv'], - 'video/x-matroska': ['.mpv', '.mkv'], - 'video/x-wmv': ['.wmv'], - 'video/x-mpg': ['.mpg'], - 'video/mpeg': ['.mp4', '.mts', '.mov'], - 'video/x-ms-wmv': ['.wmv']} - -VIDEO_CSS = """ -#videobackboard { - z-index:3; - background-color: %(bgcolor)s; + 'audio/ac3': ['.ac3'], + 'audio/flac': ['.flac'], + 'audio/x-m4a': ['.m4a'], + 'audio/midi': ['.mid', '.midi'], + 'audio/x-mp3': ['.mp3'], + 'audio/mpeg': ['.mp3', '.mp2', '.mpga', '.mpega', '.m4a'], + 'audio/qcelp': ['.qcp'], + 'audio/x-wma': ['.wma'], + 'audio/x-ms-wma': ['.wma'], + 'video/x-flv': ['.flv'], + 'video/x-matroska': ['.mpv', '.mkv'], + 'video/x-wmv': ['.wmv'], + 'video/x-mpg': ['.mpg'], + 'video/mpeg': ['.mp4', '.mts', '.mov'], + 'video/x-ms-wmv': ['.wmv'] } -#video1 { - background-color: %(bgcolor)s; - z-index:4; -} -#video2 { - background-color: %(bgcolor)s; - z-index:4; -} -""" class PhononPlayer(MediaPlayer): @@ -269,8 +255,7 @@ class PhononPlayer(MediaPlayer): """ Add css style sheets to htmlbuilder """ - background = QtGui.QColor(Settings().value('players/background color')).name() - return VIDEO_CSS % {'bgcolor': background} + return '' def get_info(self): """ diff --git a/tests/functional/openlp_core_common/test_settings.py b/tests/functional/openlp_core_common/test_settings.py index f51cb7379..77ae85842 100644 --- a/tests/functional/openlp_core_common/test_settings.py +++ b/tests/functional/openlp_core_common/test_settings.py @@ -30,9 +30,9 @@ Package to test the openlp.core.lib.settings package. """ import os -from unittest import TestCase from tempfile import mkstemp +from unittest import TestCase from PyQt4 import QtGui from openlp.core.common import Settings diff --git a/tests/functional/openlp_core_lib/test_htmlbuilder.py b/tests/functional/openlp_core_lib/test_htmlbuilder.py new file mode 100644 index 000000000..ec8e3a4a3 --- /dev/null +++ b/tests/functional/openlp_core_lib/test_htmlbuilder.py @@ -0,0 +1,324 @@ +""" +Package to test the openlp.core.lib.htmlbuilder module. +""" + +from unittest import TestCase +from mock import MagicMock, patch + +from PyQt4 import QtCore + +from openlp.core.lib.htmlbuilder import build_html, build_background_css, build_lyrics_css, build_lyrics_outline_css, \ + build_lyrics_format_css, build_footer_css +from openlp.core.lib.theme import HorizontalType, VerticalType + + +HTML = """ + + +
+
+ + + +
+