diff --git a/openlp/core/utils/__init__.py b/openlp/core/utils/__init__.py
index 3612bb002..fbf185474 100644
--- a/openlp/core/utils/__init__.py
+++ b/openlp/core/utils/__init__.py
@@ -127,6 +127,9 @@ class AppLocation(object):
CacheDir = 6
LanguageDir = 7
+ # Base path where data/config/cache dir is located
+ BaseDir = None
+
@staticmethod
def get_directory(dir_type=1):
"""
@@ -152,6 +155,8 @@ class AppLocation(object):
os.path.abspath(os.path.split(sys.argv[0])[0]),
_get_os_dir_path(dir_type))
return os.path.join(app_path, u'i18n')
+ elif dir_type == AppLocation.DataDir and AppLocation.BaseDir:
+ return os.path.join(AppLocation.BaseDir, 'data')
else:
return _get_os_dir_path(dir_type)
diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py
index 96c85e092..deac1d4b4 100644
--- a/openlp/plugins/songs/lib/xml.py
+++ b/openlp/plugins/songs/lib/xml.py
@@ -73,6 +73,9 @@ from openlp.core.utils import get_application_version
log = logging.getLogger(__name__)
+NAMESPACE = u'http://openlyrics.info/namespace/2009/song'
+NSMAP = '{' + NAMESPACE + '}' + '%s'
+
class SongXML(object):
"""
@@ -267,7 +270,7 @@ class OpenLyrics(object):
sxml = SongXML()
song_xml = objectify.fromstring(u'')
# Append the necessary meta data to the song.
- song_xml.set(u'xmlns', u'http://openlyrics.info/namespace/2009/song')
+ song_xml.set(u'xmlns', NAMESPACE)
song_xml.set(u'version', OpenLyrics.IMPLEMENTED_VERSION)
application_name = u'OpenLP ' + get_application_version()[u'version']
song_xml.set(u'createdIn', application_name)
@@ -371,7 +374,8 @@ class OpenLyrics(object):
properties = song_xml.properties
else:
return None
- if float(song_xml.get(u'version')) > 0.6:
+ # Formatting tags are new in OpenLyrics 0.8
+ if float(song_xml.get(u'version')) > 0.7:
self._process_formatting_tags(song_xml, parse_and_not_save)
if parse_and_not_save:
return
@@ -558,6 +562,52 @@ class OpenLyrics(object):
FormattingTags.add_html_tags([tag for tag in found_tags
if tag[u'start tag'] not in existing_tag_ids], True)
+ def _process_lyrics_mixed_content(self, element):
+ text = u''
+
+ #print '1:', repr(text)
+ # Skip element.
+ #if element.tag == u'chord' and element.tail:
+ ## Append tail text at chord element.
+ #text += element.tail
+
+ # Start formatting tag.
+ #print NSMAP % 'tag'
+ #print repr(element.tag)
+ if element.tag == NSMAP % 'tag':
+ text += u'{%s}' % element.get(u'name')
+ print '1:', repr(text)
+
+ # Append text from element
+ if element.text:
+ text += element.text
+ print '2:', repr(text)
+
+ #print '3:', repr(text)
+ # Process nested formatting tags
+ for child in element:
+ # Use recursion since nested formatting tags are allowed.
+ text += self._process_lyrics_mixed_content(child)
+
+ # Append text from tail and add formatting end tag.
+ if element.tag == NSMAP % 'tag':
+ text += u'{/%s}' % element.get(u'name')
+ print '3:', repr(text)
+
+ # Append text from tail
+ if element.tail:
+ text += element.tail
+ print '4:', repr(text)
+
+ return text
+
+ def _process_lyrics_line(self, line):
+ # Convert lxml.objectify to lxml.etree representation
+ line = etree.tostring(line)
+ element = etree.XML(line)
+ print element.nsmap
+ return self._process_lyrics_mixed_content(element)
+
def _process_lyrics(self, properties, song_xml, song_obj):
"""
Processes the verses and search_lyrics for the song.
@@ -586,7 +636,11 @@ class OpenLyrics(object):
for line in lines.line:
if text:
text += u'\n'
- text += u''.join(map(unicode, line.itertext()))
+ text += self._process_lyrics_line(line)
+ #AAA = u''.join(map(unicode, line.itertext()))
+ #print 'AAA:', repr(AAA)
+ #text += AAA
+ #print repr(text)
# Add a virtual split to the verse text.
if lines.get(u'break') is not None:
text += u'\n[---]'