From 64b9b4232167af374d810af37ebb90c065d45b9e Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 28 May 2011 19:01:41 +0200 Subject: [PATCH] better solution --- openlp/plugins/songs/lib/__init__.py | 74 +++++++++++++++++++--------- 1 file changed, 52 insertions(+), 22 deletions(-) diff --git a/openlp/plugins/songs/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py index 8aab8a34d..53b3d7cb1 100644 --- a/openlp/plugins/songs/lib/__init__.py +++ b/openlp/plugins/songs/lib/__init__.py @@ -171,8 +171,7 @@ class VerseType(object): @staticmethod def from_loose_input(verse_name): """ - Return the VerseType for a given string, Other if not found. Use this - with caution! + Return the VerseType for a given string, Other if not found ``verse_name`` The string to return a VerseType for @@ -266,26 +265,57 @@ def clean_song(manager, song): whitespace = re.compile(r'\W+', re.UNICODE) song.search_title = (whitespace.sub(u' ', song.title).strip() + u'@' + whitespace.sub(u' ', song.alternate_title).strip()).strip().lower() - verses = SongXML().get_verses(song.lyrics) - lyrics = u' '.join([whitespace.sub(u' ', verse[1]) for verse in verses]) - song.search_lyrics = lyrics.lower() - compare_order = [] - for verse in verses: - compare_order.append( - (u'%s%s' % (verse[0][u'type'], verse[0][u'label'])).upper()) - if verse[0][u'label'] == u'1': - compare_order.append(verse[0][u'type'].upper()) - # Check if the verse order contains tags for verses which do not exist. - # (This is relevant for people upgrading from 1.9.4 and older). - if song.verse_order: - order = song.verse_order.strip().split() - else: - order = [] - for order in order: - # The verse order contains invalid tags, so reset the order. - if order not in compare_order: - song.verse_order = u'' - break + # Only do this, if we the song is a 1.9.4 song (or older). + if song.lyrics.find(u'') != -1: + # Remove the old "language" attribute from lyrics tag (prior to 1.9.5). + # This is not very important, but this keeps the database clean. This + # can be removed when everybody has cleaned his songs. + song.lyrics = song.lyrics.replace( + u'', u'') + verses = SongXML().get_verses(song.lyrics) + lyrics = u' '.join([whitespace.sub(u' ', verse[1]) for verse in verses]) + song.search_lyrics = lyrics.lower() + # We need a new and clean SongXML instance. + sxml = SongXML() + # Rebuild the song's verses, to remove any wrong verse names (for + # example translated ones), which might have been added prior to 1.9.5. + # List for later comparison. + compare_order = [] + for verse in verses: + verse_type = VerseType.Tags[VerseType.from_loose_input( + verse[0][u'type'])] + sxml.add_verse_to_lyrics( + verse_type, + verse[0][u'label'], + verse[1], + verse[0][u'lang'] if verse[0].has_key(u'lang') else None + ) + compare_order.append((u'%s%s' % (verse_type, verse[0][u'label']) + ).upper()) + if verse[0][u'label'] == u'1': + compare_order.append(verse_type.upper()) + song.lyrics = unicode(sxml.extract_xml(), u'utf-8') + # Rebuild the verse order, to convert translated verse tags, which might + # have been added prior to 1.9.5. + if song.verse_order: + order = song.verse_order.strip().split() + else: + order = [] + new_order = [] + for verse_def in order: + verse_type = VerseType.Tags[ + VerseType.from_loose_input(verse_def[0])] + if len(verse_def) > 1: + new_order.append( + (u'%s%s' % (verse_type, verse_def[1:])).upper()) + else: + new_order.append(verse_type.upper()) + song.verse_order = u' '.join(new_order) + # Check if the verse order contains tags for verses which do not exist. + for order in new_order: + if order not in compare_order: + song.verse_order = u'' + break # The song does not have any author, add one. if not song.authors: name = SongStrings.AuthorUnknown