openlp/openlp/core/lib/htmlbuilder.py

351 lines
12 KiB
Python
Raw Normal View History

2010-07-11 10:58:36 +00:00
# -*- 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 #
2010-07-25 09:03:01 +00:00
# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian #
# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, #
# Carsten Tinggaard, Frode Woldsund #
2010-07-11 10:58:36 +00:00
# --------------------------------------------------------------------------- #
# 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 openlp.core.lib import image_to_byte
HTMLSRC = u"""
<html>
<head>
<title>OpenLP Display</title>
<style>
*{
margin: 0;
padding:0
}
%s
%s
%s
%s
%s
2010-07-19 18:03:00 +00:00
%s
2010-07-24 16:55:06 +00:00
%s
2010-07-11 10:58:36 +00:00
</style>
<script language="javascript">
var t = null;
2010-07-30 05:08:49 +00:00
var transition = %s;
2010-08-01 08:28:31 +00:00
function displayAlert(alert){
var text1 = document.getElementById('alertmain');
text1.innerHTML = newtext;
}
2010-07-11 10:58:36 +00:00
function startfade(newtext){
2010-07-30 05:08:49 +00:00
var text1 = document.getElementById('lyricsmain');
var texto1 = document.getElementById('lyricsoutline');
var texts1 = document.getElementById('lyricsshadow');
if(!transition){
text1.innerHTML = newtext;
texto1.innerHTML = newtext;
texts1.innerHTML = newtext;
return;
2010-08-01 08:28:31 +00:00
}
2010-07-30 05:08:49 +00:00
var text2 = document.getElementById('lyricsmain2');
var texto2 = document.getElementById('lyricsoutline2');
var texts2 = document.getElementById('lyricsshadow2');
2010-07-11 10:58:36 +00:00
if(text2.style.opacity==''||parseFloat(text2.style.opacity) < 0.5){
text2.innerHTML = text1.innerHTML;
text2.style.opacity = text1.style.opacity;
2010-07-30 05:08:49 +00:00
texto2.innerHTML = text1.innerHTML;
texto2.style.opacity = text1.style.opacity;
texts2.innerHTML = text1.innerHTML;
texts2.style.opacity = text1.style.opacity;
2010-07-11 10:58:36 +00:00
}
text1.style.opacity = 0;
text1.innerHTML = newtext;
2010-07-30 05:08:49 +00:00
texto1.style.opacity = 0;
texto1.innerHTML = newtext;
texts1.style.opacity = 0;
texts1.innerHTML = newtext;
// temp:
texts2.style.opacity = 0;
// end temp
2010-07-11 10:58:36 +00:00
if(t!=null)
clearTimeout(t);
t = setTimeout('fade()', 50);
}
function fade(){
2010-07-30 05:08:49 +00:00
var text1 = document.getElementById('lyricsmain');
var texto1 = document.getElementById('lyricsoutline');
var texts1 = document.getElementById('lyricsshadow');
var text2 = document.getElementById('lyricsmain2');
var texto2 = document.getElementById('lyricsoutline2');
var texts2 = document.getElementById('lyricsshadow2');
if(parseFloat(text1.style.opacity) < 1){
text1.style.opacity = parseFloat(text1.style.opacity) + 0.1;
texto1.style.opacity = parseFloat(texto1.style.opacity) + 0.1;
//texts1.style.opacity = parseFloat(texts1.style.opacity) + 0.1;
}
if(parseFloat(text2.style.opacity) > 0){
text2.style.opacity = parseFloat(text2.style.opacity) - 0.1;
texto2.style.opacity = parseFloat(texto2.style.opacity) - 0.1;
//texts2.style.opacity = parseFloat(texts2.style.opacity) - 0.1;
}
2010-07-11 10:58:36 +00:00
if((parseFloat(text1.style.opacity) < 1)||(parseFloat(text2.style.opacity) > 0))
t = setTimeout('fade()', 50);
2010-07-30 05:08:49 +00:00
else{
text1.style.opacity = 1
texto1.style.opacity = 1
texts1.style.opacity = 1
text2.style.opacity = 0
texto2.style.opacity = 0
texts2.style.opacity = 0
}
2010-07-11 10:58:36 +00:00
}
</script>
</head>
<body>
2010-07-30 05:08:49 +00:00
<table class="lyricstable lyricscommon">
2010-07-28 16:53:54 +00:00
<tr><td id="lyricsmain" class="lyrics"></td></tr>
</table>
2010-07-30 05:08:49 +00:00
<table class="lyricsoutlinetable lyricscommon">
<tr><td id="lyricsoutline" class="lyricsoutline lyrics"></td></tr>
</table>
<table class="lyricsshadowtable lyricscommon">
<tr><td id="lyricsshadow" class="lyricsshadow lyrics"></td></tr>
</table>
<table class="lyricstable lyricscommon">
<tr><td id="lyricsmain2" class="lyrics"></td></tr>
</table>
<table class="lyricsoutlinetable lyricscommon">
<tr><td id="lyricsoutline2" class="lyricsoutline lyrics"></td></tr>
</table>
<table class="lyricsshadowtable lyricscommon">
<tr><td id="lyricsshadow2" class="lyricsshadow lyrics"></td></tr>
2010-07-28 16:53:54 +00:00
</table>
2010-08-01 08:28:31 +00:00
<table class="alerttable alertcommon">
<tr><td id="alertmain" class="alert"></td></tr>
</table>
2010-07-19 18:03:00 +00:00
<div id="footer" class="footer"></div>
2010-07-11 10:58:36 +00:00
<video id="video"></video>
2010-07-24 16:55:06 +00:00
<blank id="blank"></blank>
2010-07-11 10:58:36 +00:00
%s
</body>
</html>
"""
2010-07-27 19:13:56 +00:00
2010-07-17 08:59:15 +00:00
def build_html(item, screen, alert):
2010-07-25 08:58:08 +00:00
"""
Build the full web paged structure for display
`item`
Service Item to be displayed
`screen`
Current display information
`alert`
Alert display display information
"""
2010-07-11 10:58:36 +00:00
width = screen[u'size'].width()
height = screen[u'size'].height()
2010-07-30 05:08:49 +00:00
theme = item.themedata
2010-07-17 08:59:15 +00:00
html = HTMLSRC % (build_video(width, height),
build_image(width, height),
2010-07-24 16:55:06 +00:00
build_lyrics(item),
build_footer(item),
build_alert(width, height, alert),
2010-07-17 08:59:15 +00:00
build_image(width, height),
2010-07-24 16:55:06 +00:00
build_blank(width, height),
2010-07-30 05:08:49 +00:00
"true" if theme and theme.display_slideTransition else "false",
2010-07-17 08:59:15 +00:00
build_image_src(item.bg_frame))
2010-07-11 10:58:36 +00:00
return html
2010-07-17 08:59:15 +00:00
def build_video(width, height):
2010-07-25 08:58:08 +00:00
"""
Build the video display div
`width`
Screen width
`height`
Screen height
"""
2010-07-11 10:58:36 +00:00
video = """
2010-07-26 16:42:19 +00:00
#video { position: absolute; left: 0px; top: 0px;
width: %spx; height: %spx; z-index:1; }
2010-07-11 10:58:36 +00:00
"""
2010-07-17 08:59:15 +00:00
return video % (width, height)
2010-07-24 16:55:06 +00:00
def build_blank(width, height):
2010-07-25 08:58:08 +00:00
"""
Build the blank display div
`width`
Screen width
`height`
Screen height
"""
2010-07-24 16:55:06 +00:00
blank = """
2010-07-28 17:21:32 +00:00
#blank { position: absolute; left: 0px; top: 0px;
width: %spx; height: %spx; z-index:10;
2010-07-24 16:55:06 +00:00
}
"""
return blank % (width, height)
2010-07-11 10:58:36 +00:00
2010-07-17 08:59:15 +00:00
def build_image(width, height):
2010-07-25 08:58:08 +00:00
"""
Build the image display div
`width`
Screen width
`height`
Screen height
"""
2010-07-11 10:58:36 +00:00
image = """
2010-07-28 17:21:32 +00:00
#image { position: absolute; left: 0px; top: 0px;
width: %spx; height: %spx; z-index:2;
2010-07-11 10:58:36 +00:00
}
"""
return image % (width, height)
2010-07-17 08:59:15 +00:00
def build_image_src(image):
2010-07-11 10:58:36 +00:00
image_src = """
2010-07-26 16:42:19 +00:00
<img src="data:image/png;base64,%s">
2010-07-11 10:58:36 +00:00
"""
2010-07-12 19:36:42 +00:00
return image_src % image_to_byte(image)
2010-07-11 10:58:36 +00:00
2010-07-24 16:55:06 +00:00
def build_lyrics(item):
2010-07-25 08:58:08 +00:00
"""
Build the video display div
`item`
Service Item containing theme and location information
"""
2010-07-28 16:53:54 +00:00
style = """
2010-07-30 05:08:49 +00:00
.lyricscommon { position: absolute; %s }
.lyricstable { z-index:4; %s }
.lyricsoutlinetable { z-index:3; %s }
.lyricsshadowtable { z-index:2; %s }
2010-07-28 16:53:54 +00:00
.lyrics { %s }
2010-07-30 05:08:49 +00:00
.lyricsoutline { %s }
2010-08-01 08:28:31 +00:00
.lyricsshadow { %s }
2010-07-28 16:53:54 +00:00
table {border=0; margin=0; padding=0; }
2010-07-30 05:08:49 +00:00
"""
2010-07-17 08:59:15 +00:00
theme = item.themedata
2010-07-30 05:08:49 +00:00
lyricscommon = u''
lyricstable = u''
outlinetable = u''
shadowtable = u''
2010-07-28 16:53:54 +00:00
lyrics = u''
2010-07-30 05:08:49 +00:00
outline = u'display: none;'
shadow = u'display: none;'
2010-07-12 16:49:38 +00:00
if theme:
2010-07-30 05:08:49 +00:00
lyricscommon = u'width: %spx; height: %spx; ' \
u'font-family %s; font-size: %spx; color: %s; line-height: %d%%' % \
(item.main.width(), item.main.height(),
2010-08-01 08:28:31 +00:00
theme.font_main_name, theme.font_main_proportion,
2010-07-30 05:08:49 +00:00
theme.font_main_color, 100 + int(theme.font_main_line_adjustment))
lyricstable = u'left: %spx; top: %spx;' % \
(item.main.x(), item.main.y())
outlinetable = u'left: %spx; top: %spx;' % \
(item.main.x(), item.main.y())
shadowtable = u'left: %spx; top: %spx;' % \
(item.main.x() + float(theme.display_shadow_size),
item.main.y() + float(theme.display_shadow_size))
2010-07-18 18:01:35 +00:00
align = u''
if theme.display_horizontalAlign == 2:
2010-07-28 16:53:54 +00:00
align = u'text-align:center;'
2010-07-18 18:01:35 +00:00
elif theme.display_horizontalAlign == 1:
2010-07-28 16:53:54 +00:00
align = u'text-align:right;'
else:
align = u'text-align:left;'
2010-07-18 18:01:35 +00:00
if theme.display_verticalAlign == 2:
2010-07-27 19:13:56 +00:00
valign = u'vertical-align:bottom;'
2010-07-18 18:01:35 +00:00
elif theme.display_verticalAlign == 1:
2010-07-27 19:13:56 +00:00
valign = u'vertical-align:middle;'
2010-07-18 18:01:35 +00:00
else:
2010-07-27 19:13:56 +00:00
valign = u'vertical-align:top;'
2010-07-30 05:08:49 +00:00
lyrics = u'%s %s' % (align, valign)
2010-07-28 16:53:54 +00:00
if theme.display_outline:
2010-07-30 05:08:49 +00:00
outline = u'-webkit-text-stroke: %sem %s; ' % \
2010-07-28 16:53:54 +00:00
(float(theme.display_outline_size) / 16,
theme.display_outline_color)
2010-07-30 05:08:49 +00:00
if theme.display_shadow:
shadow = u'-webkit-text-stroke: %sem %s; ' % \
(float(theme.display_outline_size) / 16,
theme.display_shadow_color)
else:
if theme.display_shadow:
shadow = u'color: %s;' % (theme.display_shadow_color)
lyrics_html = style % (lyricscommon, lyricstable, outlinetable,
shadowtable, lyrics, outline, shadow)
2010-07-19 18:03:00 +00:00
print lyrics_html
return lyrics_html
2010-07-24 16:55:06 +00:00
def build_footer(item):
2010-07-19 18:03:00 +00:00
lyrics = """
2010-07-28 17:21:32 +00:00
#footer {position: absolute; %s z-index:5; %s; %s }
2010-07-19 18:03:00 +00:00
"""
theme = item.themedata
lyrics_html = u''
position = u''
font = u''
text = u''
if theme:
2010-07-24 16:55:06 +00:00
position = u' left: %spx; top: %spx; width: %spx; height: %spx; ' % \
(item.footer.x(), item.footer.y(), item.footer.width(),
item.footer.height())
font = u' font-family %s; font-size: %spx;' % \
2010-07-19 18:03:00 +00:00
(theme.font_footer_name, theme.font_footer_proportion)
align = u''
if theme.display_horizontalAlign == 2:
2010-07-27 19:13:56 +00:00
align = u'align:center;'
2010-07-19 18:03:00 +00:00
elif theme.display_horizontalAlign == 1:
2010-07-27 19:13:56 +00:00
align = u'align:right;'
2010-07-19 18:03:00 +00:00
if theme.display_verticalAlign == 2:
2010-07-27 19:13:56 +00:00
valign = u'vertical-align:bottom;'
2010-07-19 18:03:00 +00:00
elif theme.display_verticalAlign == 1:
2010-07-27 19:13:56 +00:00
valign = u'vertical-align:middle;'
2010-07-19 18:03:00 +00:00
else:
2010-07-27 19:13:56 +00:00
valign = u'vertical-align:top;'
2010-07-19 18:03:00 +00:00
text = u'color:%s; %s %s' % (theme.font_footer_color, align, valign)
2010-07-20 05:01:40 +00:00
lyrics_html = lyrics % (position, font, text)
2010-07-12 16:49:38 +00:00
return lyrics_html
2010-07-11 10:58:36 +00:00
2010-07-19 18:03:00 +00:00
def build_alert(width, height, alertTab):#
2010-08-01 08:28:31 +00:00
style = """
.alertcommon { position: absolute; %s }
2010-08-01 08:28:31 +00:00
.alerttable { z-index:8; %s }
.alert { %s }
table {border=0; margin=0; padding=0; }
"""
alertcommon = u''
alerttable = u''
valign = u''
2010-07-27 18:42:53 +00:00
if alertTab:
2010-08-01 08:28:31 +00:00
alertcommon = u'width: %spx; height: %spx; ' \
u'font-family %s; font-size: %spx; color: %s; ' % \
(width, height, alertTab.font_face, alertTab.font_size,
2010-08-01 08:28:31 +00:00
alertTab.bg_color)
alerttable = u'left: %spx; top: %spx;' % (0, 0)
if alertTab.location == 2:
valign = u'vertical-align:bottom;'
elif alertTab.location == 1:
valign = u'vertical-align:middle;'
else:
valign = u'vertical-align:top;'
alert_html = style % (alertcommon, alerttable, valign)
print alert_html
return alert_html