diff --git a/documentation/source/conf.py b/documentation/source/conf.py index 86ad3b7de..248c83e56 100644 --- a/documentation/source/conf.py +++ b/documentation/source/conf.py @@ -17,7 +17,7 @@ import sys # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -sys.path.append(os.path.abspath(os.path.join('..', '..'))) +sys.path.insert(0, os.path.abspath(os.path.join('..', '..'))) # -- General configuration ----------------------------------------------------- diff --git a/documentation/source/core/lib.rst b/documentation/source/core/lib.rst index 43ca90b3b..5fc66200d 100644 --- a/documentation/source/core/lib.rst +++ b/documentation/source/core/lib.rst @@ -60,12 +60,6 @@ .. autoclass:: openlp.core.lib.settingstab.SettingsTab :members: -:mod:`ThemeXML` ---------------- - -.. autoclass:: openlp.core.lib.themexmlhandler.ThemeXML - :members: - :mod:`OpenLPToolbar` -------------------- diff --git a/documentation/source/plugins/songs.rst b/documentation/source/plugins/songs.rst index fab10f02d..2ce744ddd 100644 --- a/documentation/source/plugins/songs.rst +++ b/documentation/source/plugins/songs.rst @@ -6,8 +6,8 @@ .. automodule:: openlp.plugins.songs :members: -:mod:`SongsPlugin` Class ------------------------- +:class:`SongsPlugin` Class +-------------------------- .. autoclass:: openlp.plugins.songs.songsplugin.SongsPlugin :members: @@ -18,8 +18,8 @@ .. automodule:: openlp.plugins.songs.forms :members: -:mod:`AuthorsForm` -^^^^^^^^^^^^^^^^^^ +:class:`AuthorsForm` +^^^^^^^^^^^^^^^^^^^^ .. autoclass:: openlp.plugins.songs.forms.authorsdialog.Ui_AuthorsDialog :members: @@ -27,8 +27,8 @@ .. autoclass:: openlp.plugins.songs.forms.authorsform.AuthorsForm :members: -:mod:`EditSongForm` -^^^^^^^^^^^^^^^^^^^ +:class:`EditSongForm` +^^^^^^^^^^^^^^^^^^^^^ .. autoclass:: openlp.plugins.songs.forms.editsongdialog.Ui_EditSongDialog :members: @@ -36,11 +36,158 @@ .. autoclass:: openlp.plugins.songs.forms.editsongform.EditSongForm :members: -:mod:`EditVerseForm` -^^^^^^^^^^^^^^^^^^^^ +:class:`EditVerseForm` +^^^^^^^^^^^^^^^^^^^^^^ .. autoclass:: openlp.plugins.songs.forms.editversedialog.Ui_EditVerseDialog :members: .. autoclass:: openlp.plugins.songs.forms.editverseform.EditVerseForm :members: + +:class:`SongBookForm` +^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: openlp.plugins.songs.forms.songbookdialog.Ui_SongBookDialog + :members: + +.. autoclass:: openlp.plugins.songs.forms.songbookform.SongBookForm + :members: + +:class:`SongImportForm` +^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: openlp.plugins.songs.forms.songimportwizard.Ui_SongImportWizard + :members: + +.. autoclass:: openlp.plugins.songs.forms.songimportform.ImportWizardForm + :members: + +:class:`SongMaintenanceForm` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: openlp.plugins.songs.forms.songmaintenancedialog.Ui_SongMaintenanceDialog + :members: + +.. autoclass:: openlp.plugins.songs.forms.songmaintenanceform.SongMaintenanceForm + :members: + +:class:`TopicsForm` +^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: openlp.plugins.songs.forms.topicsdialog.Ui_TopicsDialog + :members: + +.. autoclass:: openlp.plugins.songs.forms.topicsform.TopicsForm + :members: + +:mod:`lib` Submodule +-------------------- + +.. automodule:: openlp.plugins.songs.lib + :members: + +:mod:`cclifileimport` Submodule +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.songs.lib.cclifileimport + :members: + +.. autoclass:: openlp.plugins.songs.lib.cclifileimport.CCLIFileImportError + :members: + +:mod:`db` Submodule +^^^^^^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.songs.lib.db + :members: + +:mod:`ewimport` Submodule +^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.songs.lib.ewimport + :members: + +.. autoclass:: openlp.plugins.songs.lib.ewimport.FieldDescEntry + :members: + +:mod:`importer` Submodule +^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.songs.lib.importer + :members: + +:mod:`mediaitem` Submodule +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.songs.lib.mediaitem + :members: + +.. autoclass:: openlp.plugins.songs.lib.mediaitem.SongListView + :members: + +:mod:`olp1import` Submodule +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.songs.lib.olp1import + :members: + +:mod:`olpimport` Submodule +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.songs.lib.olpimport + :members: + +:mod:`oooimport` Submodule +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.songs.lib.oooimport + :members: + +:mod:`opensongimport` Submodule +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.songs.lib.opensongimport + :members: + +:mod:`sofimport` Submodule +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.songs.lib.sofimport + :members: + +:mod:`songbeamerimport` Submodule +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.songs.lib.songbeamerimport + :members: + +:mod:`songimport` Submodule +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.songs.lib.songimport + :members: + +:mod:`songstab` Submodule +^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.songs.lib.songstab + :members: + +:mod:`wowimport` Submodule +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.songs.lib.wowimport + :members: + +:mod:`songxml` Submodule +^^^^^^^^^^^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.songs.lib.songxml + :members: + +:mod:`xml` Submodule +^^^^^^^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.songs.lib.xml + :members: diff --git a/openlp/plugins/songs/lib/cclifileimport.py b/openlp/plugins/songs/lib/cclifileimport.py index 9d0da5cfa..669201325 100755 --- a/openlp/plugins/songs/lib/cclifileimport.py +++ b/openlp/plugins/songs/lib/cclifileimport.py @@ -38,9 +38,9 @@ class CCLIFileImportError(Exception): class CCLIFileImport(SongImport): """ - The :class:`CCLIFileImport` class provides OpenLP with the - ability to import CCLI SongSelect song files in both .txt and - .usr formats. See http://www.ccli.com + The :class:`CCLIFileImport` class provides OpenLP with the ability to + import CCLI SongSelect song files in both .txt and .usr formats. + See http://www.ccli.com/ for more details. """ def __init__(self, manager, **kwargs): @@ -49,6 +49,7 @@ class CCLIFileImport(SongImport): ``manager`` The song manager for the running OpenLP installation. + ``filenames`` The files to be imported. """ @@ -97,7 +98,7 @@ class CCLIFileImport(SongImport): def do_import_usr_file(self, textList): """ - The :method:`do_import_usr_file` method provides OpenLP + The :func:`do_import_usr_file` method provides OpenLP with the ability to import CCLI SongSelect songs in *USR* file format @@ -105,6 +106,7 @@ class CCLIFileImport(SongImport): An array of strings containing the usr file content. **SongSelect .usr file format** + ``[File]`` USR file format first line ``Type=`` @@ -140,6 +142,7 @@ class CCLIFileImport(SongImport): Contains the songs various lyrics in order as shown by the *Fields* description e.g. *Words=Above all powers....* [/n = CR, /n/t = CRLF] + """ log.debug(u'USR file text: %s', textList) lyrics = [] @@ -191,48 +194,32 @@ class CCLIFileImport(SongImport): def do_import_txt_file(self, textList): """ - The :method:`do_import_txt_file` method provides OpenLP + The :func:`do_import_txt_file` method provides OpenLP with the ability to import CCLI SongSelect songs in *TXT* file format ``textList`` An array of strings containing the txt file content. - **SongSelect .txt file format** + SongSelect .txt file format:: - ``Song Title`` - Contains the song title - - - - ``Title of following verse/chorus and number`` - e.g. Verse 1, Chorus 1 - - ``Verse/Chorus lyrics`` - - - - - - ``Title of next verse/chorus (repeats)`` - - ``Verse/Chorus lyrics`` - - - - - - ``Song CCLI Number`` - e.g. CCLI Number (e.g.CCLI-Liednummer: 2672885) - ``Song Copyright`` - e.g. © 1999 Integrity's Hosanna! Music | LenSongs Publishing - ``Song Authors`` - e.g. Lenny LeBlanc | Paul Baloche - ``Licencing info`` - e.g. For use solely with the SongSelect Terms of Use. + Song Title # Contains the song title + + Verse type and number # e.g. Verse 1, Chorus 1 + Verse lyrics + + + Verse type and number (repeats) + Verse lyrics + + + Song CCLI number # e.g. CCLI Number (e.g.CCLI-Liednummer: 2672885) + Song copyright # e.g. © 1999 Integrity's Hosanna! Music | LenSongs Publishing + Song authors # e.g. Lenny LeBlanc | Paul Baloche + Licencing info # e.g. For use solely with the SongSelect Terms of Use. All rights Reserved. www.ccli.com - ``CCLI Licence number of user`` - e.g. CCL-Liedlizenznummer: 14 / CCLI License No. 14 + CCLI Licence number of user # e.g. CCL-Liedlizenznummer: 14 / CCLI License No. 14 + """ log.debug(u'TXT file text: %s', textList) self.set_defaults() diff --git a/openlp/plugins/songs/lib/songxml.py b/openlp/plugins/songs/lib/songxml.py index 4068c396f..6818218c5 100644 --- a/openlp/plugins/songs/lib/songxml.py +++ b/openlp/plugins/songs/lib/songxml.py @@ -282,11 +282,9 @@ class Song(object): def get_author_list(self, asOneString = True): """Return the list of authors as a string - asOneString - True -- string: - 'John Newton, A Parker' - False -- list of strings - ['John Newton', u'A Parker'] + ``asOneString`` + If ``True``, returns 'John Newton, A Parker'. If ``False``, returns + [u'John Newton', u'A Parker'] """ if asOneString: res = self._assure_string(self.author_list) @@ -297,7 +295,8 @@ class Song(object): def set_author_list(self, author_list): """Set the author_list - author_list -- a string or list of strings + ``author_list`` + a string or list of strings """ if author_list is None: self.author_list = None @@ -307,11 +306,9 @@ class Song(object): def get_category_array(self, asOneString = True): """Return the list of categories as a string - asOneString - True -- string: - 'Hymn, Gospel' - False -- list of strings - ['Hymn', u'Gospel'] + ``asOneString`` + If ``True``, returns 'Hymn, Gospel'. If ``False``, returns + [u'Hymn', u'Gospel'] """ if asOneString: res = self._assure_string(self.category_array) @@ -381,6 +378,7 @@ class Song(object): properties slideNumber -- 1 .. numberOfSlides + Returns a list as: [theme_name (string), title (string), diff --git a/openlp/plugins/songs/lib/wowimport.py b/openlp/plugins/songs/lib/wowimport.py index 879d56704..2f20cf20d 100644 --- a/openlp/plugins/songs/lib/wowimport.py +++ b/openlp/plugins/songs/lib/wowimport.py @@ -24,7 +24,7 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### """ -The :mod:`wowimport` module provides the functionality for importing Words of +The :mod:`wowimport` module provides the functionality for importing Words of Worship songs into the OpenLP database. """ import os @@ -38,19 +38,18 @@ log = logging.getLogger(__name__) class WowImport(SongImport): """ - The :class:`WowImport` class provides the ability to import song files from + The :class:`WowImport` class provides the ability to import song files from Words of Worship. - Words Of Worship Song File Format - ````````````````````````````````` - + **Words Of Worship Song File Format:** + The Words Of Worship song file format is as follows: * The song title is the file name minus the extension. - * The song has a header, a number of blocks, followed by footer containing - the author and the copyright. + * The song has a header, a number of blocks, followed by footer containing + the author and the copyright. * A block can be a verse, chorus or bridge. - + File Header: Bytes are counted from one, i.e. the first byte is byte 1. These bytes, up to the 56 byte, can change but no real meaning has been found. The @@ -65,29 +64,29 @@ class WowImport(SongImport): Each block ends with 4 bytes, the first of which defines what type of block it is, and the rest which are null bytes: - * ``NUL`` (\x00) - Verse - * ``SOH`` (\x01) - Chorus - * ``STX`` (\x02) - Bridge + * ``NUL`` (0x00) - Verse + * ``SOH`` (0x01) - Chorus + * ``STX`` (0x02) - Bridge - Blocks are seperated by two bytes. The first byte is ``SOH`` (\x01), - and the second byte is ``€`` (\x80). + Blocks are seperated by two bytes. The first byte is 0x01, and the + second byte is 0x80. Lines: Each line starts with a byte which specifies how long that line is, the line text, and ends with a null byte. - + Footer: - The footer follows on after the last block, the first byte specifies - the length of the author text, followed by the author text, if - this byte is null, then there is no author text. The byte after the - author text specifies the length of the copyright text, followed - by the copyright text. - + The footer follows on after the last block, the first byte specifies + the length of the author text, followed by the author text, if + this byte is null, then there is no author text. The byte after the + author text specifies the length of the copyright text, followed + by the copyright text. + The file is ended with four null bytes. - + Valid extensions for a Words of Worship song file are: - + * .wsg * .wow-song """ @@ -111,7 +110,7 @@ class WowImport(SongImport): """ Recieve a single file, or a list of files to import. """ - + if isinstance(self.import_source, list): self.import_wizard.importProgressBar.setMaximum( len(self.import_source)) @@ -127,14 +126,14 @@ class WowImport(SongImport): if self.songData.read(19) != u'WoW File\nSong Words': continue # Seek to byte which stores number of blocks in the song - self.songData.seek(56) + self.songData.seek(56) self.no_of_blocks = ord(self.songData.read(1)) # Seek to the beging of the first block - self.songData.seek(82) + self.songData.seek(82) for block in range(self.no_of_blocks): self.lines_to_read = ord(self.songData.read(1)) # Skip 3 nulls to the beginnig of the 1st line - self.songData.seek(3, os.SEEK_CUR) + self.songData.seek(3, os.SEEK_CUR) self.block_text = u'' while self.lines_to_read: self.length_of_line = ord(self.songData.read(1)) @@ -148,7 +147,7 @@ class WowImport(SongImport): self.block_type = BLOCK_TYPES[ord(self.songData.read(1))] # Skip 3 nulls at the end of the block self.songData.seek(3, os.SEEK_CUR) - # Blocks are seperated by 2 bytes, skip them, but not if + # Blocks are seperated by 2 bytes, skip them, but not if # this is the last block! if (block + 1) < self.no_of_blocks: self.songData.seek(2, os.SEEK_CUR) @@ -170,4 +169,4 @@ class WowImport(SongImport): self.import_wizard.incrementProgressBar( "Importing %s" % (self.file_name)) return True - +