diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index 5b36a7cb9..aaf82b395 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -60,7 +60,7 @@ The XML of an `OpenLyrics `_ song looks like this:: """ - +import cgi import logging import re @@ -257,11 +257,12 @@ class OpenLyrics(object): """ IMPLEMENTED_VERSION = u'0.8' + START_TAGS_REGEX = re.compile(r'\{(\w+)\}') + END_TAGS_REGEX = re.compile(r'\{\/(\w+)\}') + VERSE_NUMBER_REGEX = re.compile(u'[a-zA-Z]*') def __init__(self, manager): self.manager = manager - self.start_tags_regex = re.compile(r'\{(\w+)\}') # {abc} -> abc - self.end_tags_regex = re.compile(r'\{\/(\w+)\}') # {/abc} -> abc def song_to_xml(self, song): """ @@ -334,7 +335,8 @@ class OpenLyrics(object): if u'lang' in verse[0]: verse_element.set(u'lang', verse[0][u'lang']) # Create a list with all "virtual" verses. - virtual_verses = verse[1].split(u'[---]') + virtual_verses = cgi.escape(verse[1]) + virtual_verses = virtual_verses.split(u'[---]') for index, virtual_verse in enumerate(virtual_verses): # Add formatting tags to text lines_element = self._add_text_with_tags_to_lines(verse_element, @@ -402,32 +404,32 @@ class OpenLyrics(object): def _add_tag_to_formatting(self, tag_name, tags_element): """ - Add new formatting tag to the element ```` - if the tag is not present yet. + Add new formatting tag to the element ```` if the tag is not + present yet. """ available_tags = FormattingTags.get_html_tags() start_tag = '{%s}' % tag_name - for t in available_tags: - if t[u'start tag'] == start_tag: + for tag in available_tags: + if tag[u'start tag'] == start_tag: # Create new formatting tag in openlyrics xml. - el = self._add_text_to_element(u'tag', tags_element) - el.set(u'name', tag_name) - el_open = self._add_text_to_element(u'open', el) - el_open.text = etree.CDATA(t[u'start html']) + element = self._add_text_to_element(u'tag', tags_element) + element.set(u'name', tag_name) + element_open = self._add_text_to_element(u'open', element) + element_open.text = etree.CDATA(tag[u'start html']) # Check if formatting tag contains end tag. Some formatting # tags e.g. {br} has only start tag. If no end tag is present # element has not to be in OpenLyrics xml. - if t['end tag']: - el_close = self._add_text_to_element(u'close', el) - el_close.text = etree.CDATA(t[u'end html']) + if tag['end tag']: + element_close = self._add_text_to_element(u'close', element) + element_close.text = etree.CDATA(tag[u'end html']) def _add_text_with_tags_to_lines(self, verse_element, text, tags_element): """ Convert text with formatting tags from OpenLP format to OpenLyrics format and append it to element ````. """ - start_tags = self.start_tags_regex.findall(text) - end_tags = self.end_tags_regex.findall(text) + start_tags = OpenLyrics.START_TAGS_REGEX.findall(text) + end_tags = OpenLyrics.END_TAGS_REGEX.findall(text) # Replace start tags with xml syntax. for tag in start_tags: # Tags already converted to xml structure. @@ -442,12 +444,11 @@ class OpenLyrics(object): if tag not in xml_tags: self._add_tag_to_formatting(tag, tags_element) # Replace end tags. - for t in end_tags: - text = text.replace(u'{/%s}' % t, u'') + for tag in end_tags: + text = text.replace(u'{/%s}' % tag, u'') # Replace \n with
. text = text.replace(u'\n', u'
') - text = u'' + text + u'' - element = etree.XML(text) + element = etree.XML(u'%s' % text) verse_element.append(element) return element @@ -692,7 +693,7 @@ class OpenLyrics(object): verse_tag = verse_def[0] else: verse_tag = VerseType.Tags[VerseType.Other] - verse_number = re.compile(u'[a-zA-Z]*').sub(u'', verse_def) + verse_number = OpenLyrics.VERSE_NUMBER_REGEX.sub(u'', verse_def) # OpenLyrics allows e. g. "c", but we need "c1". However, this does # not correct the verse order. if not verse_number: