diff --git a/openlp/plugins/songs/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py index 85206f5be..ef7b8b7d3 100644 --- a/openlp/plugins/songs/lib/__init__.py +++ b/openlp/plugins/songs/lib/__init__.py @@ -137,7 +137,7 @@ class VerseType(object): unicode(VerseType.to_string(VerseType.Other)).lower(): return VerseType.Other -from songxmlhandler import SongXMLBuilder, SongXMLParser +from xml import LyricsXML, SongXMLBuilder, SongXMLParser from songstab import SongsTab from mediaitem import SongMediaItem from songimport import SongImport @@ -146,4 +146,3 @@ try: from oooimport import OooImport except ImportError: pass - diff --git a/openlp/plugins/songs/lib/songxmlhandler.py b/openlp/plugins/songs/lib/songxmlhandler.py deleted file mode 100644 index 9f76d3221..000000000 --- a/openlp/plugins/songs/lib/songxmlhandler.py +++ /dev/null @@ -1,136 +0,0 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin # -# Thompson, Jon Tibble, Carsten Tinggaard # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### -""" -The :mod:`songxmlhandler` module provides the XML functionality for songs - -The basic XML is of the format:: - - - - - - - - - -""" - -import logging - -from lxml import etree, objectify - -log = logging.getLogger(__name__) - -class SongXMLBuilder(object): - """ - This class builds the XML used to describe songs. - """ - log.info(u'SongXMLBuilder Loaded') - - def __init__(self, song_language=None): - """ - Set up the song builder. - - ``song_language`` - The language used in this song - """ - lang = u'en' - if song_language: - lang = song_language - self.song_xml = objectify.fromstring(u'') - self.lyrics = etree.SubElement(self.song_xml, u'lyrics', language=lang) - - def add_verse_to_lyrics(self, type, number, content): - """ - Add a verse to the ```` tag. - - ``type`` - A string denoting the type of verse. Possible values are "Chorus", - "Verse", "Bridge", and "Custom". - - ``number`` - An integer denoting the number of the item, for example: verse 1. - - ``content`` - The actual text of the verse to be stored. - """ - #log.debug(u'add_verse_to_lyrics %s, %s\n%s' % (type, number, content)) - verse = etree.SubElement(self.lyrics, u'verse', type=type, label=number) - verse.text = etree.CDATA(content) - - def dump_xml(self): - """ - Debugging aid to dump XML so that we can see what we have. - """ - return etree.tostring(self.song_xml, encoding=u'UTF-8', - xml_declaration=True, pretty_print=True) - - def extract_xml(self): - """ - Extract our newly created XML song. - """ - return etree.tostring(self.song_xml, encoding=u'UTF-8', - xml_declaration=True) - - -class SongXMLParser(object): - """ - A class to read in and parse a song's XML. - """ - log.info(u'SongXMLParser Loaded') - - def __init__(self, xml): - """ - Set up our song XML parser. - - ``xml`` - The XML of the song to be parsed. - """ - self.song_xml = None - try: - self.song_xml = objectify.fromstring(str(xml)) - except etree.XMLSyntaxError: - log.exception(u'Invalid xml %s', xml) - - def get_verses(self): - """ - Iterates through the verses in the XML and returns a list of verses - and their attributes. - """ - xml_iter = self.song_xml.getiterator() - verse_list = [] - for element in xml_iter: - if element.tag == u'verse': - if element.text is None: - element.text = u'' - verse_list.append([element.attrib, - unicode(element.text).decode('unicode-escape')]) - return verse_list - - def dump_xml(self): - """ - Debugging aid to dump XML so that we can see what we have. - """ - return etree.dump(self.song_xml) diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index 4fa7424f9..41490b8fd 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -22,24 +22,123 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +""" +The :mod:`xml` module provides the XML functionality for songs + +The basic XML is of the format:: + + + + + + + + + +""" + +import logging + +from lxml import etree, objectify + +log = logging.getLogger(__name__) + +class SongXMLBuilder(object): + """ + This class builds the XML used to describe songs. + """ + log.info(u'SongXMLBuilder Loaded') + + def __init__(self, song_language=None): + """ + Set up the song builder. + + ``song_language`` + The language used in this song + """ + lang = u'en' + if song_language: + lang = song_language + self.song_xml = objectify.fromstring(u'') + self.lyrics = etree.SubElement(self.song_xml, u'lyrics', language=lang) + + def add_verse_to_lyrics(self, type, number, content): + """ + Add a verse to the ```` tag. + + ``type`` + A string denoting the type of verse. Possible values are "Chorus", + "Verse", "Bridge", and "Custom". + + ``number`` + An integer denoting the number of the item, for example: verse 1. + + ``content`` + The actual text of the verse to be stored. + """ + #log.debug(u'add_verse_to_lyrics %s, %s\n%s' % (type, number, content)) + verse = etree.SubElement(self.lyrics, u'verse', type=type, label=number) + verse.text = etree.CDATA(content) + + def dump_xml(self): + """ + Debugging aid to dump XML so that we can see what we have. + """ + return etree.tostring(self.song_xml, encoding=u'UTF-8', + xml_declaration=True, pretty_print=True) + + def extract_xml(self): + """ + Extract our newly created XML song. + """ + return etree.tostring(self.song_xml, encoding=u'UTF-8', + xml_declaration=True) + + +class SongXMLParser(object): + """ + A class to read in and parse a song's XML. + """ + log.info(u'SongXMLParser Loaded') + + def __init__(self, xml): + """ + Set up our song XML parser. + + ``xml`` + The XML of the song to be parsed. + """ + self.song_xml = None + try: + self.song_xml = objectify.fromstring(str(xml)) + except etree.XMLSyntaxError: + log.exception(u'Invalid xml %s', xml) + + def get_verses(self): + """ + Iterates through the verses in the XML and returns a list of verses + and their attributes. + """ + xml_iter = self.song_xml.getiterator() + verse_list = [] + for element in xml_iter: + if element.tag == u'verse': + if element.text is None: + element.text = u'' + verse_list.append([element.attrib, + unicode(element.text).decode('unicode-escape')]) + return verse_list + + def dump_xml(self): + """ + Debugging aid to dump XML so that we can see what we have. + """ + return etree.dump(self.song_xml) -from lxml import objectify -from lxml.etree import XMLSyntaxError class LyricsXML(object): """ This class represents the XML in the ``lyrics`` field of a song. - - The basic XML looks like this:: - - - - - - - - - """ def __init__(self, song=None): if song: @@ -74,7 +173,7 @@ class LyricsXML(object): }) self.lyrics.append(language) return True - except XMLSyntaxError: + except etree.XMLSyntaxError: return False def extract(self, text):