2008-12-07 08:09:59 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
|
|
|
|
|
2009-09-08 19:58:05 +00:00
|
|
|
###############################################################################
|
|
|
|
# OpenLP - Open Source Lyrics Projection #
|
|
|
|
# --------------------------------------------------------------------------- #
|
2010-12-26 11:04:47 +00:00
|
|
|
# Copyright (c) 2008-2011 Raoul Snyman #
|
|
|
|
# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael #
|
2010-07-24 22:10:47 +00:00
|
|
|
# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian #
|
|
|
|
# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, #
|
|
|
|
# Carsten Tinggaard, Frode Woldsund #
|
2009-09-08 19:58:05 +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 #
|
|
|
|
###############################################################################
|
2008-12-07 08:09:59 +00:00
|
|
|
|
2011-01-04 10:13:41 +00:00
|
|
|
from PyQt4 import QtGui
|
2010-06-12 12:33:04 +00:00
|
|
|
from openlp.core.lib import translate
|
|
|
|
|
|
|
|
class VerseType(object):
|
|
|
|
"""
|
|
|
|
VerseType provides an enumeration for the tags that may be associated
|
|
|
|
with verses in songs.
|
|
|
|
"""
|
|
|
|
Verse = 0
|
|
|
|
Chorus = 1
|
|
|
|
Bridge = 2
|
|
|
|
PreChorus = 3
|
|
|
|
Intro = 4
|
|
|
|
Ending = 5
|
|
|
|
Other = 6
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def to_string(verse_type):
|
|
|
|
"""
|
|
|
|
Return a string for a given VerseType
|
|
|
|
|
|
|
|
``verse_type``
|
|
|
|
The type to return a string for
|
|
|
|
"""
|
|
|
|
if verse_type == VerseType.Verse:
|
2010-07-23 19:17:36 +00:00
|
|
|
return translate('SongsPlugin.VerseType', 'Verse')
|
2010-06-12 12:33:04 +00:00
|
|
|
elif verse_type == VerseType.Chorus:
|
2010-07-23 19:17:36 +00:00
|
|
|
return translate('SongsPlugin.VerseType', 'Chorus')
|
2010-06-12 12:33:04 +00:00
|
|
|
elif verse_type == VerseType.Bridge:
|
2010-07-23 19:17:36 +00:00
|
|
|
return translate('SongsPlugin.VerseType', 'Bridge')
|
2010-06-12 12:33:04 +00:00
|
|
|
elif verse_type == VerseType.PreChorus:
|
2010-07-23 19:17:36 +00:00
|
|
|
return translate('SongsPlugin.VerseType', 'Pre-Chorus')
|
2010-06-12 12:33:04 +00:00
|
|
|
elif verse_type == VerseType.Intro:
|
2010-07-23 19:17:36 +00:00
|
|
|
return translate('SongsPlugin.VerseType', 'Intro')
|
2010-06-12 12:33:04 +00:00
|
|
|
elif verse_type == VerseType.Ending:
|
2010-07-23 19:17:36 +00:00
|
|
|
return translate('SongsPlugin.VerseType', 'Ending')
|
2010-06-12 12:33:04 +00:00
|
|
|
elif verse_type == VerseType.Other:
|
2010-07-23 19:17:36 +00:00
|
|
|
return translate('SongsPlugin.VerseType', 'Other')
|
2010-06-12 12:33:04 +00:00
|
|
|
|
2010-11-28 19:38:27 +00:00
|
|
|
@staticmethod
|
|
|
|
def expand_string(verse_type):
|
|
|
|
"""
|
|
|
|
Return the VerseType for a given string
|
|
|
|
|
|
|
|
``verse_type``
|
|
|
|
The string to return a VerseType for
|
|
|
|
"""
|
|
|
|
verse_type = verse_type.lower()
|
2010-12-21 19:39:35 +00:00
|
|
|
if verse_type == \
|
|
|
|
unicode(VerseType.to_string(VerseType.Verse)).lower()[0]:
|
2010-11-28 19:38:27 +00:00
|
|
|
return translate('SongsPlugin.VerseType', 'Verse')
|
|
|
|
elif verse_type == \
|
|
|
|
unicode(VerseType.to_string(VerseType.Chorus)).lower()[0]:
|
|
|
|
return translate('SongsPlugin.VerseType', 'Chorus')
|
|
|
|
elif verse_type == \
|
|
|
|
unicode(VerseType.to_string(VerseType.Bridge)).lower()[0]:
|
|
|
|
return translate('SongsPlugin.VerseType', 'Bridge')
|
|
|
|
elif verse_type == \
|
|
|
|
unicode(VerseType.to_string(VerseType.PreChorus)).lower()[0]:
|
|
|
|
return translate('SongsPlugin.VerseType', 'PreChorus')
|
|
|
|
elif verse_type == \
|
|
|
|
unicode(VerseType.to_string(VerseType.Intro)).lower()[0]:
|
|
|
|
return translate('SongsPlugin.VerseType', 'Intro')
|
|
|
|
elif verse_type == \
|
|
|
|
unicode(VerseType.to_string(VerseType.Ending)).lower()[0]:
|
|
|
|
return translate('SongsPlugin.VerseType', 'Ending')
|
|
|
|
elif verse_type == \
|
|
|
|
unicode(VerseType.to_string(VerseType.Other)).lower()[0]:
|
|
|
|
return translate('SongsPlugin.VerseType', 'Other')
|
|
|
|
|
2010-06-12 12:33:04 +00:00
|
|
|
@staticmethod
|
|
|
|
def from_string(verse_type):
|
|
|
|
"""
|
|
|
|
Return the VerseType for a given string
|
|
|
|
|
|
|
|
``verse_type``
|
|
|
|
The string to return a VerseType for
|
|
|
|
"""
|
|
|
|
verse_type = verse_type.lower()
|
|
|
|
if verse_type == unicode(VerseType.to_string(VerseType.Verse)).lower():
|
|
|
|
return VerseType.Verse
|
|
|
|
elif verse_type == \
|
|
|
|
unicode(VerseType.to_string(VerseType.Chorus)).lower():
|
|
|
|
return VerseType.Chorus
|
|
|
|
elif verse_type == \
|
|
|
|
unicode(VerseType.to_string(VerseType.Bridge)).lower():
|
|
|
|
return VerseType.Bridge
|
|
|
|
elif verse_type == \
|
|
|
|
unicode(VerseType.to_string(VerseType.PreChorus)).lower():
|
|
|
|
return VerseType.PreChorus
|
|
|
|
elif verse_type == \
|
|
|
|
unicode(VerseType.to_string(VerseType.Intro)).lower():
|
|
|
|
return VerseType.Intro
|
|
|
|
elif verse_type == \
|
|
|
|
unicode(VerseType.to_string(VerseType.Ending)).lower():
|
|
|
|
return VerseType.Ending
|
|
|
|
elif verse_type == \
|
|
|
|
unicode(VerseType.to_string(VerseType.Other)).lower():
|
|
|
|
return VerseType.Other
|
|
|
|
|
2011-01-04 10:13:41 +00:00
|
|
|
|
|
|
|
def retrieve_windows_encoding(recommendation=None):
|
|
|
|
# map chardet result to compatible windows standard code page
|
|
|
|
codepage_mapping = {'IBM866': u'cp866', 'TIS-620': u'cp874',
|
|
|
|
'SHIFT_JIS': u'cp932', 'GB2312': u'cp936', 'HZ-GB-2312': u'cp936',
|
|
|
|
'EUC-KR': u'cp949', 'Big5': u'cp950', 'ISO-8859-2': u'cp1250',
|
|
|
|
'windows-1250': u'cp1250', 'windows-1251': u'cp1251',
|
|
|
|
'windows-1252': u'cp1252', 'ISO-8859-7': u'cp1253',
|
|
|
|
'windows-1253': u'cp1253', 'ISO-8859-8': u'cp1255',
|
|
|
|
'windows-1255': u'cp1255'}
|
|
|
|
if recommendation in codepage_mapping:
|
|
|
|
recommendation = codepage_mapping[recommendation]
|
|
|
|
|
|
|
|
# Show dialog for encoding selection
|
|
|
|
encodings = [(u'cp1256', translate('SongsPlugin', 'Arabic (CP-1256)')),
|
|
|
|
(u'cp1257', translate('SongsPlugin', 'Baltic (CP-1257)')),
|
|
|
|
(u'cp1250', translate('SongsPlugin', 'Central European (CP-1250)')),
|
|
|
|
(u'cp1251', translate('SongsPlugin', 'Cyrillic (CP-1251)')),
|
|
|
|
(u'cp1253', translate('SongsPlugin', 'Greek (CP-1253)')),
|
|
|
|
(u'cp1255', translate('SongsPlugin', 'Hebrew (CP-1255)')),
|
|
|
|
(u'cp932', translate('SongsPlugin', 'Japanese (CP-932)')),
|
|
|
|
(u'cp949', translate('SongsPlugin', 'Korean (CP-949)')),
|
|
|
|
(u'cp936', translate('SongsPlugin', 'Simplified Chinese (CP-936)')),
|
|
|
|
(u'cp874', translate('SongsPlugin', 'Thai (CP-874)')),
|
|
|
|
(u'cp950', translate('SongsPlugin', 'Traditional Chinese (CP-950)')),
|
|
|
|
(u'cp1254', translate('SongsPlugin', 'Turkish (CP-1254)')),
|
|
|
|
(u'cp1258', translate('SongsPlugin', 'Vietnam (CP-1258)')),
|
|
|
|
(u'cp1252', translate('SongsPlugin', 'Western European (CP-1252)'))]
|
|
|
|
recommended_index = -1
|
|
|
|
if recommendation:
|
|
|
|
for index in range(len(encodings)):
|
|
|
|
if recommendation == encodings[index][0]:
|
|
|
|
recommended_index = index
|
|
|
|
break
|
|
|
|
if recommended_index > 0:
|
|
|
|
choice = QtGui.QInputDialog.getItem(None,
|
|
|
|
translate('SongsPlugin', 'Character Encoding'),
|
|
|
|
translate('SongsPlugin', 'The codepage setting is responsible\n'
|
|
|
|
'for the correct character representation.\n'
|
|
|
|
'Usually you are fine with the preselected choise.'),
|
|
|
|
[pair[1] for pair in encodings], recommended_index, False)
|
|
|
|
else:
|
|
|
|
choice = QtGui.QInputDialog.getItem(None,
|
|
|
|
translate('SongsPlugin', 'Character Encoding'),
|
|
|
|
translate('SongsPlugin', 'Please choose the character encoding.\n'
|
|
|
|
'The encoding is responsible for the correct character '
|
|
|
|
'representation.'), [pair[1] for pair in encodings], 0, False)
|
|
|
|
if not choice[1]:
|
|
|
|
return None
|
|
|
|
return filter(lambda item: item[1] == choice[0], encodings)[0][0]
|
|
|
|
|
2011-01-09 16:52:31 +00:00
|
|
|
from xml import OpenLyrics, SongXML
|
2009-02-28 23:31:24 +00:00
|
|
|
from songstab import SongsTab
|
2011-01-04 10:13:41 +00:00
|
|
|
from mediaitem import SongMediaItem
|