diff --git a/openlp/core/lib/formattingtags.py b/openlp/core/lib/formattingtags.py index bb4c0bcc8..529a8c029 100644 --- a/openlp/core/lib/formattingtags.py +++ b/openlp/core/lib/formattingtags.py @@ -27,6 +27,9 @@ """ Provide HTML Tag management and Formatting Tag access class """ +import cPickle + +from PyQt4 import QtCore from openlp.core.lib import translate @@ -136,13 +139,30 @@ class FormattingTags(object): FormattingTags.add_html_tags(temporary_tags) @staticmethod - def add_html_tags(tags): + def save_html_tags(): + """ + Saves all formatting tags except protected ones. + """ + tags = [] + for tag in FormattingTags.get_html_tags(): + if not tag[u'protected'] and not tag[u'temporary']: + tags.append(tag) + # Formatting Tags were also known as display tags. + QtCore.QSettings().setValue(u'displayTags/html_tags', + QtCore.QVariant(cPickle.dumps(tags) if tags else u'')) + + @staticmethod + def add_html_tags(tags, save=False): """ Add a list of tags to the list. ``tags`` The list with tags to add. + ``save`` + Defaults to ``False``. If set to ``True`` the given ``tags`` are + saved to the config. + Each **tag** has to be a ``dict`` and should have the following keys: * desc @@ -170,6 +190,8 @@ class FormattingTags(object): displaying text containing the tag. It has to be a ``boolean``. """ FormattingTags.html_expands.extend(tags) + if save: + FormattingTags.save_html_tags() @staticmethod def remove_html_tag(tag_id): diff --git a/openlp/core/ui/formattingtagform.py b/openlp/core/ui/formattingtagform.py index 4d4739204..fee27a9c6 100644 --- a/openlp/core/ui/formattingtagform.py +++ b/openlp/core/ui/formattingtagform.py @@ -150,7 +150,7 @@ class FormattingTagForm(QtGui.QDialog, Ui_FormattingTagDialog): FormattingTags.remove_html_tag(self.selected) self.selected = -1 self._resetTable() - self._saveTable() + FormattingTags.save_html_tags() def onSavedPushed(self): """ @@ -177,19 +177,7 @@ class FormattingTagForm(QtGui.QDialog, Ui_FormattingTagDialog): html[u'temporary'] = False self.selected = -1 self._resetTable() - self._saveTable() - - def _saveTable(self): - """ - Saves all formatting tags except protected ones. - """ - tags = [] - for tag in FormattingTags.get_html_tags(): - if not tag[u'protected'] and not tag[u'temporary']: - tags.append(tag) - # Formatting Tags were also known as display tags. - QtCore.QSettings().setValue(u'displayTags/html_tags', - QtCore.QVariant(cPickle.dumps(tags) if tags else u'')) + FormattingTags.save_html_tags() def _resetTable(self): """ diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index 4021d3355..ac77596de 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -67,6 +67,7 @@ import re from lxml import etree, objectify +from openlp.core.lib import FormattingTags from openlp.plugins.songs.lib import clean_song, VerseType from openlp.plugins.songs.lib.db import Author, Book, Song, Topic from openlp.core.utils import get_application_version @@ -265,7 +266,9 @@ class OpenLyrics(object): application_name = u'OpenLP ' + get_application_version()[u'version'] song_xml.set(u'createdIn', application_name) song_xml.set(u'modifiedIn', application_name) - song_xml.set(u'modifiedDate', datetime.datetime.now().isoformat()) + # "Convert" 2011-08-27 11:49:15 to 2011-08-27T11:49:15. + song_xml.set(u'modifiedDate', + unicode(song.last_modified).replace(u' ', u'T')) properties = etree.SubElement(song_xml, u'properties') titles = etree.SubElement(properties, u'titles') self._add_text_to_element(u'title', titles, song.title) @@ -299,6 +302,10 @@ class OpenLyrics(object): themes = etree.SubElement(properties, u'themes') for topic in song.topics: self._add_text_to_element(u'theme', themes, topic.name) + # Process the formatting tags. + format = etree.SubElement(song_xml, u'format') + tags = etree.SubElement(format, u'tags') + tags.set(u'application', u'OpenLP') # Process the song's lyrics. lyrics = etree.SubElement(song_xml, u'lyrics') verse_list = sxml.get_verses(song.lyrics) @@ -345,25 +352,27 @@ class OpenLyrics(object): properties = song_xml.properties else: return None + if float(song_xml.get(u'version')) > 0.6: + self._process_formatting_tags(song_xml, only_process_format_tags) + if only_process_format_tags: + return song = Song() - if not only_process_format_tags: - # Values will be set when cleaning the song. - song.search_lyrics = u'' - song.verse_order = u'' - song.search_title = u'' - self._process_copyright(properties, song) - self._process_cclinumber(properties, song) - self._process_titles(properties, song) + # Values will be set when cleaning the song. + song.search_lyrics = u'' + song.verse_order = u'' + song.search_title = u'' + self._process_copyright(properties, song) + self._process_cclinumber(properties, song) + self._process_titles(properties, song) # The verse order is processed with the lyrics! self._process_lyrics(properties, song_xml, song) - if not only_process_format_tags: - self._process_comments(properties, song) - self._process_authors(properties, song) - self._process_songbooks(properties, song) - self._process_topics(properties, song) - clean_song(self.manager, song) - self.manager.save_object(song) - return song.id + self._process_comments(properties, song) + self._process_authors(properties, song) + self._process_songbooks(properties, song) + self._process_topics(properties, song) + clean_song(self.manager, song) + self.manager.save_object(song) + return song.id def _add_text_to_element(self, tag, parent, text=None, label=None): if label: @@ -463,6 +472,33 @@ class OpenLyrics(object): if hasattr(properties, u'copyright'): song.copyright = self._text(properties.copyright) + def _process_formatting_tags(self, song_xml, temporary): + """ + Process the formatting tags from the song and either add missing tags + temporary or permanently to the formatting tag list. + """ + if not hasattr(song_xml, u'format'): + return + found_tags = [] + for tag in song_xml.format.tags.getchildren(): + name = tag.get(u'name') + if name is None: + continue + openlp_tag = { + u'desc': name, + u'start tag': u'{%s}' % name[:5], + u'end tag': u'{/%s}' % name[:5], + u'start html': tag.open.text, + u'end html': tag.close.text, + u'protected': False, + u'temporary': temporary + } + found_tags.append(openlp_tag) + existing_tag_ids = [tag[u'start tag'] + for tag in FormattingTags.get_html_tags()] + FormattingTags.add_html_tags([tag for tag in found_tags + if tag[u'start tag'] not in existing_tag_ids], True) + def _process_lyrics(self, properties, song_xml, song_obj): """ Processes the verses and search_lyrics for the song.