diff --git a/openlp/plugins/songs/lib/opensongimport.py b/openlp/plugins/songs/lib/opensongimport.py index 753aacfc7..170a650bd 100644 --- a/openlp/plugins/songs/lib/opensongimport.py +++ b/openlp/plugins/songs/lib/opensongimport.py @@ -30,6 +30,9 @@ from songimport import SongImport from lxml.etree import Element from lxml import objectify +class OpenSongImportError(Exception): + pass + class OpenSongImport: """ Import songs exported from OpenSong - the format is described loosly here: @@ -46,6 +49,7 @@ class OpenSongImport: etc... + The 'v' can be left out - it is implied or: [V] @@ -114,41 +118,43 @@ class OpenSongImport: verses_seen={} # in the absence of any other indication, verses are the default, erm, versetype! versetype=u'V' - for l in lyrics.split('\n'): + for l in lyrics.split(u'\n'): # remove comments - semicolon = l.find(';') + semicolon = l.find(u';') if semicolon >= 0: l=l[:semicolon] l=l.strip() - if l=='': + if l==u'': continue # skip inline guitar chords if l[0] == u'.': continue - + # verse/chorus/etc. marker if l[0] == u'[': versetype=l[1].upper() - if l[2] != u']': + if versetype.isdigit(): + versenum=versetype + versetype=u'V' + elif l[2] != u']': # there's a number to go with it - extract that as well right_bracket=l.find(u']') - versenum=int(l[2:right_bracket]) - versetag=u'%s%d'%(versetype,versenum) + versenum=l[2:right_bracket] else: - versenum = 1 + versenum = u'' continue words=None # number at start of line.. it's verse number - if l[0] >= u'0' and l[0] <= u'9': - versenum=int(l[0]) + if l[0].isdigit(): + versenum=l[0] words=l[1:].strip() - versetag=u'%s%d'%(versetype,versenum) if words is None and \ versenum is not None and \ versetype is not None: words=l if versenum is not None: + versetag=u'%s%s'%(versetype,versenum) if not verses.has_key(versetype): verses[versetype]={} if not verses[versetype].has_key(versenum): @@ -174,15 +180,15 @@ class OpenSongImport: self.song.verses.append([versetag, lines]) versetags[versetag]=1 # keep track of what we have for error checking later # now figure out the presentation order - if 'presentation' in fields and root.presentation != u'': + if u'presentation' in fields and root.presentation != u'': order=unicode(root.presentation) order=order.split() else: assert len(our_verse_order)>0 order=our_verse_order for tag in order: - print tag if not versetags.has_key(tag): + print u'Got order', tag, u'but not in versetags, skipping' raise OpenSongImportError else: self.song.verse_order_list.append(tag) diff --git a/openlp/plugins/songs/lib/test.opensong b/openlp/plugins/songs/lib/test.opensong index 8ef2a1103..8533e8943 100644 --- a/openlp/plugins/songs/lib/test.opensong +++ b/openlp/plugins/songs/lib/test.opensong @@ -4,7 +4,7 @@ Martin Thompson 2010 Martin Thompson 1 - V1 C1 V2 C2 B1 V1 + V1 C V2 C2 V3 B1 V1 Blah @@ -24,6 +24,10 @@ 1 V1 Line 2 2 V2 Line 2 +[3] +V3 Line 1 +V3 Line 2 + [b1] Bridge 1 Bridge 1 line 2 diff --git a/openlp/plugins/songs/lib/test_opensongimport.py b/openlp/plugins/songs/lib/test_opensongimport.py index e6d5eec2d..40b09a23b 100644 --- a/openlp/plugins/songs/lib/test_opensongimport.py +++ b/openlp/plugins/songs/lib/test_opensongimport.py @@ -13,12 +13,12 @@ def test(): assert o.song.alternate_title == u'' assert o.song.song_number == u'1' assert [u'B1', u'Bridge 1\nBridge 1 line 2'] in o.song.verses - assert [u'C1', u'Chorus 1'] in o.song.verses + assert [u'C', u'Chorus 1'] in o.song.verses assert [u'C2', u'Chorus 2'] in o.song.verses assert not [u'C3', u'Chorus 3'] in o.song.verses assert [u'V1', u'v1 Line 1\nV1 Line 2'] in o.song.verses assert [u'V2', u'v2 Line 1\nV2 Line 2'] in o.song.verses - assert o.song.verse_order_list == [u'V1', u'C1', u'V2', u'C2', u'B1', u'V1'] + assert o.song.verse_order_list == [u'V1', u'C', u'V2', u'C2', u'V3', u'B1', u'V1'] o=OpenSongImport(manager) o.do_import(u'test2.opensong')