# -*- 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, Meinert Jordan, Andreas Preikschat, Christian # # Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # # Carsten Tinggaard, Frode Woldsund # # --------------------------------------------------------------------------- # # 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:`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.Element(u'verse', type = unicode(type), label = unicode(number)) verse.text = etree.CDATA(content) self.lyrics.append(verse) 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 if xml[:5] == u'' % \ (verse[u'type'], verse[u'label'], verse[u'text']) lyrics_output = lyrics_output + \ u'%s' % \ (language[u'language'], verse_output) song_output = u'' + \ u'%s' % lyrics_output return song_output