diff --git a/documentation/source/core/lib.rst b/documentation/source/core/lib.rst
index dd90b24a9..43ca90b3b 100644
--- a/documentation/source/core/lib.rst
+++ b/documentation/source/core/lib.rst
@@ -60,18 +60,6 @@
.. autoclass:: openlp.core.lib.settingstab.SettingsTab
:members:
-:mod:`SongXMLBuilder`
----------------------
-
-.. autoclass:: openlp.core.lib.songxmlhandler.SongXMLBuilder
- :members:
-
-:mod:`SongXMLParser`
---------------------
-
-.. autoclass:: openlp.core.lib.songxmlhandler.SongXMLParser
- :members:
-
:mod:`ThemeXML`
---------------
@@ -83,4 +71,3 @@
.. autoclass:: openlp.core.lib.toolbar.OpenLPToolbar
:members:
-
diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py
index 5a4725c80..11ba7e2dc 100644
--- a/openlp/core/lib/__init__.py
+++ b/openlp/core/lib/__init__.py
@@ -221,7 +221,6 @@ from serviceitem import ServiceItemType
from serviceitem import ItemCapabilities
from toolbar import OpenLPToolbar
from dockwidget import OpenLPDockWidget
-from songxmlhandler import SongXMLBuilder, SongXMLParser
from themexmlhandler import ThemeXML
from renderer import Renderer
from rendermanager import RenderManager
diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py
index a266c44c5..24810eb0b 100644
--- a/openlp/plugins/custom/forms/editcustomform.py
+++ b/openlp/plugins/custom/forms/editcustomform.py
@@ -28,7 +28,8 @@ import logging
from PyQt4 import QtCore, QtGui
from editcustomdialog import Ui_customEditDialog
-from openlp.core.lib import SongXMLBuilder, SongXMLParser, Receiver, translate
+from openlp.core.lib import Receiver, translate
+from openlp.plugins.custom.lib import CustomXMLBuilder, CustomXMLParser
from openlp.plugins.custom.lib.db import CustomSlide
log = logging.getLogger(__name__)
@@ -119,8 +120,8 @@ class EditCustomForm(QtGui.QDialog, Ui_customEditDialog):
self.customSlide = self.custommanager.get_object(CustomSlide, id)
self.TitleEdit.setText(self.customSlide.title)
self.CreditEdit.setText(self.customSlide.credits)
- songXML = SongXMLParser(self.customSlide.text)
- verseList = songXML.get_verses()
+ customXML = CustomXMLParser(self.customSlide.text)
+ verseList = customXML.get_verses()
for verse in verseList:
self.VerseListView.addItem(verse[1])
theme = self.customSlide.theme_name
@@ -152,7 +153,7 @@ class EditCustomForm(QtGui.QDialog, Ui_customEditDialog):
translate('CustomPlugin.EditCustomForm', 'Error'), message,
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
return False
- sxml = SongXMLBuilder()
+ sxml = CustomXMLBuilder()
sxml.new_document()
sxml.add_lyrics_to_song()
count = 1
diff --git a/openlp/plugins/custom/lib/__init__.py b/openlp/plugins/custom/lib/__init__.py
index 0d9de3173..1eea5e32d 100644
--- a/openlp/plugins/custom/lib/__init__.py
+++ b/openlp/plugins/custom/lib/__init__.py
@@ -23,5 +23,6 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
+from customxmlhandler import CustomXMLBuilder, CustomXMLParser
from mediaitem import CustomMediaItem
from customtab import CustomTab
diff --git a/openlp/plugins/custom/lib/customxmlhandler.py b/openlp/plugins/custom/lib/customxmlhandler.py
new file mode 100644
index 000000000..ebb8b1685
--- /dev/null
+++ b/openlp/plugins/custom/lib/customxmlhandler.py
@@ -0,0 +1,156 @@
+# -*- 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:`customxmlhandler` module provides the XML functionality for custom
+slides
+
+The basic XML is of the format::
+
+
+
+
+
+
+
+
+
+"""
+
+import logging
+
+from xml.dom.minidom import Document
+from xml.etree.ElementTree import ElementTree, XML, dump
+from xml.parsers.expat import ExpatError
+
+log = logging.getLogger(__name__)
+
+class CustomXMLBuilder(object):
+ """
+ This class builds the XML used to describe songs.
+ """
+ log.info(u'CustomXMLBuilder Loaded')
+
+ def __init__(self):
+ """
+ Set up the song builder.
+ """
+ # Create the minidom document
+ self.song_xml = Document()
+
+ def new_document(self):
+ """
+ Create a new song XML document.
+ """
+ # Create the base element
+ self.song = self.song_xml.createElement(u'song')
+ self.song_xml.appendChild(self.song)
+ self.song.setAttribute(u'version', u'1.0')
+
+ def add_lyrics_to_song(self):
+ """
+ Set up and add a ```` tag which contains the lyrics of the
+ song.
+ """
+ # Create the main element
+ self.lyrics = self.song_xml.createElement(u'lyrics')
+ self.lyrics.setAttribute(u'language', u'en')
+ self.song.appendChild(self.lyrics)
+
+ 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 = self.song_xml.createElement(u'verse')
+ verse.setAttribute(u'type', type)
+ verse.setAttribute(u'label', number)
+ self.lyrics.appendChild(verse)
+ # add data as a CDATA section to protect the XML from special chars
+ cds = self.song_xml.createCDATASection(content)
+ verse.appendChild(cds)
+
+ def dump_xml(self):
+ """
+ Debugging aid to dump XML so that we can see what we have.
+ """
+ return self.song_xml.toprettyxml(indent=u' ')
+
+ def extract_xml(self):
+ """
+ Extract our newly created XML song.
+ """
+ return self.song_xml.toxml(u'utf-8')
+
+
+class CustomXMLParser(object):
+ """
+ A class to read in and parse a song's XML.
+ """
+ log.info(u'CustomXMLParser 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 = ElementTree(
+ element=XML(unicode(xml).encode('unicode-escape')))
+ except ExpatError:
+ 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 dump(self.song_xml)
diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py
index 8f4cf6a7f..9cc5627ed 100644
--- a/openlp/plugins/custom/lib/mediaitem.py
+++ b/openlp/plugins/custom/lib/mediaitem.py
@@ -27,8 +27,9 @@ import logging
from PyQt4 import QtCore, QtGui
-from openlp.core.lib import MediaManagerItem, SongXMLParser, BaseListWithDnD, \
+from openlp.core.lib import MediaManagerItem, BaseListWithDnD, \
Receiver, ItemCapabilities, translate, check_item_selected
+from openlp.plugins.custom.lib import CustomXMLParser
from openlp.plugins.custom.lib.db import CustomSlide
log = logging.getLogger(__name__)
@@ -170,8 +171,8 @@ class CustomMediaItem(MediaManagerItem):
theme = customSlide.theme_name
if theme:
service_item.theme = theme
- songXML = SongXMLParser(customSlide.text)
- verseList = songXML.get_verses()
+ customXML = CustomXMLParser(customSlide.text)
+ verseList = customXML.get_verses()
for verse in verseList:
raw_slides.append(verse[1])
service_item.title = title
diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py
index 8c39a2fe8..18c613abf 100644
--- a/openlp/plugins/songs/forms/editsongform.py
+++ b/openlp/plugins/songs/forms/editsongform.py
@@ -28,9 +28,9 @@ import re
from PyQt4 import QtCore, QtGui
-from openlp.core.lib import SongXMLBuilder, SongXMLParser, Receiver, translate
+from openlp.core.lib import Receiver, translate
from openlp.plugins.songs.forms import EditVerseForm
-from openlp.plugins.songs.lib import VerseType
+from openlp.plugins.songs.lib import SongXMLBuilder, SongXMLParser, VerseType
from openlp.plugins.songs.lib.db import Book, Song, Author, Topic
from editsongdialog import Ui_EditSongDialog
diff --git a/openlp/plugins/songs/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py
index 8c07c31c7..85206f5be 100644
--- a/openlp/plugins/songs/lib/__init__.py
+++ b/openlp/plugins/songs/lib/__init__.py
@@ -137,6 +137,7 @@ class VerseType(object):
unicode(VerseType.to_string(VerseType.Other)).lower():
return VerseType.Other
+from songxmlhandler import SongXMLBuilder, SongXMLParser
from songstab import SongsTab
from mediaitem import SongMediaItem
from songimport import SongImport
diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py
index 4557f53fa..496840412 100644
--- a/openlp/plugins/songs/lib/mediaitem.py
+++ b/openlp/plugins/songs/lib/mediaitem.py
@@ -27,10 +27,11 @@ import logging
from PyQt4 import QtCore, QtGui
-from openlp.core.lib import MediaManagerItem, SongXMLParser, \
- BaseListWithDnD, Receiver, ItemCapabilities, translate, check_item_selected
+from openlp.core.lib import MediaManagerItem, BaseListWithDnD, Receiver, \
+ ItemCapabilities, translate, check_item_selected
from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm, \
ImportWizardForm
+from openlp.plugins.songs.lib import SongXMLParser
from openlp.plugins.songs.lib.db import Song
log = logging.getLogger(__name__)
diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py
index 115f52e58..5b083c7c5 100644
--- a/openlp/plugins/songs/lib/songimport.py
+++ b/openlp/plugins/songs/lib/songimport.py
@@ -25,8 +25,8 @@
import re
-from openlp.core.lib import SongXMLBuilder, translate
-from openlp.plugins.songs.lib import VerseType
+from openlp.core.lib import translate
+from openlp.plugins.songs.lib import SongXMLBuilder, VerseType
from openlp.plugins.songs.lib.db import Song, Author, Topic, Book
class SongImport(object):
diff --git a/openlp/core/lib/songxmlhandler.py b/openlp/plugins/songs/lib/songxmlhandler.py
similarity index 100%
rename from openlp/core/lib/songxmlhandler.py
rename to openlp/plugins/songs/lib/songxmlhandler.py