# -*- coding: utf-8 -*- # vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 ############################################################################### # OpenLP - Open Source Lyrics Projection # # --------------------------------------------------------------------------- # # Copyright (c) 2008-2010 Raoul Snyman # # Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # # Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # # Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # # Carsten Tinggaard, Frode Woldsund # # --------------------------------------------------------------------------- # # This program is free software; you can redistribute it and/or modify it # # under the terms of the GNU General Public License as published by the Free # # Software Foundation; version 2 of the License. # # # # This program is distributed in the hope that it will be useful, but WITHOUT # # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # # more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### from PyQt4 import QtWebKit from openlp.core.lib import image_to_byte HTMLSRC = u""" OpenLP Display %s
""" def build_html(item, screen, alert, islive): """ Build the full web paged structure for display `item` Service Item to be displayed `screen` Current display information `alert` Alert display display information `islive` Item is going live, rather than preview/theme building """ try: webkitvers = float(QtWebKit.qWebKitVersion()) except AttributeError: webkitvers = 0 width = screen[u'size'].width() height = screen[u'size'].height() theme = item.themedata if item.bg_frame: image = u'data:image/png;base64,%s' % image_to_byte(item.bg_frame) else: image = u'' html = HTMLSRC % (width, height, build_alert_css(alert, width), build_footer_css(item), build_lyrics_css(item, webkitvers), u'true' if theme and theme.display_slideTransition and islive \ else u'false', image, build_lyrics_html(item, webkitvers)) return html def build_lyrics_css(item, webkitvers): """ Build the video display css `item` Service Item containing theme and location information `webkitvers` The version of qtwebkit we're using """ style = """ .lyricstable { z-index:4; position: absolute; display: table; %s } .lyricscell { display:table-cell; word-wrap: break-word; %s } .lyricsmain { %s } .lyricsoutline { %s } .lyricsshadow { %s } """ theme = item.themedata lyricstable = u'' lyrics = u'' lyricsmain = u'' outline = u'' shadow = u'' if theme: lyricstable = u'left: %spx; top: %spx;' % \ (item.main.x(), item.main.y()) if theme.display_horizontalAlign == 2: align = u'center' elif theme.display_horizontalAlign == 1: align = u'right' else: align = u'left' if theme.display_verticalAlign == 2: valign = u'bottom' elif theme.display_verticalAlign == 1: valign = u'middle' else: valign = u'top' lyrics = u'width: %spx; height: %spx; text-align: %s; ' \ 'vertical-align: %s; font-family: %s; font-size: %spt; ' \ 'color: %s; line-height: %d%%;' % \ (item.main.width(), item.main.height(), align, valign, theme.font_main_name, theme.font_main_proportion, theme.font_main_color, 100 + int(theme.font_main_line_adjustment)) # 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. # # Before 534.4 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 # # Before 534.4 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 theme.display_outline: if webkitvers < 534.3: lyrics += u' letter-spacing: 1px;' outline = u' -webkit-text-stroke: %sem %s; ' \ '-webkit-text-fill-color: %s; ' % \ (float(theme.display_outline_size) / 16, theme.display_outline_color, theme.font_main_color) if webkitvers >= 533.3: lyricsmain += outline if theme.display_shadow and webkitvers < 534.3: shadow = u'-webkit-text-stroke: %sem %s; ' \ u'-webkit-text-fill-color: %s; ' \ u' padding-left: %spx; padding-top: %spx' % \ (float(theme.display_outline_size) / 16, theme.display_shadow_color, theme.display_shadow_color, theme.display_shadow_size, theme.display_shadow_size) if theme.display_shadow and \ (not theme.display_outline or webkitvers >= 534.3): lyricsmain += u' text-shadow: %s %spx %spx;' % \ (theme.display_shadow_color, theme.display_shadow_size, theme.display_shadow_size) lyrics_css = style % (lyricstable, lyrics, lyricsmain, outline, shadow) return lyrics_css 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 = u'' theme = item.themedata if webkitvers < 534.4 and theme and theme.display_outline: lyrics += u'
' \ u'
' \ u'
' if webkitvers < 533.3: lyrics += u'
' \ u'
' \ u'
' lyrics += u'
' \ u'
' return lyrics def build_footer_css(item): """ Build the display of the item footer `item` Service Item to be processed. """ style = """ left: %spx; top: %spx; width: %spx; height: %spx; font-family: %s; font-size: %spt; color: %s; text-align: %s; """ theme = item.themedata if not theme: return u'' if theme.display_horizontalAlign == 2: align = u'center' elif theme.display_horizontalAlign == 1: align = u'right' else: align = u'left' lyrics_html = style % (item.footer.x(), item.footer.y(), item.footer.width(), item.footer.height(), theme.font_footer_name, theme.font_footer_proportion, theme.font_footer_color, align) return lyrics_html def build_alert_css(alertTab, width): """ Build the display of the footer `alertTab` Details from the Alert tab for fonts etc """ style = """ width: %spx; vertical-align: %s; font-family: %s; font-size: %spt; color: %s; background-color: %s; """ if not alertTab: return u'' align = u'' if alertTab.location == 2: align = u'bottom' elif alertTab.location == 1: align = u'middle' else: align = u'top' alert = style % (width, align, alertTab.font_face, alertTab.font_size, alertTab.font_color, alertTab.bg_color) return alert