diff --git a/openlp/core/__init__.py b/openlp/core/__init__.py index f86f9036f..7d198db5e 100644 --- a/openlp/core/__init__.py +++ b/openlp/core/__init__.py @@ -43,14 +43,15 @@ from traceback import format_exception from PyQt4 import QtCore, QtGui -from openlp.core.lib import Settings, ScreenList, UiStrings, Registry, check_directory_exists +from openlp.core.common import AppLocation, Settings, UiStrings, check_directory_exists +from openlp.core.lib import ScreenList, Registry from openlp.core.resources import qInitResources from openlp.core.ui.mainwindow import MainWindow from openlp.core.ui.firsttimelanguageform import FirstTimeLanguageForm from openlp.core.ui.firsttimeform import FirstTimeForm from openlp.core.ui.exceptionform import ExceptionForm from openlp.core.ui import SplashScreen -from openlp.core.utils import AppLocation, LanguageManager, VersionThread, get_application_version +from openlp.core.utils import LanguageManager, VersionThread, get_application_version __all__ = ['OpenLP', 'main'] diff --git a/openlp/core/common/__init__.py b/openlp/core/common/__init__.py new file mode 100644 index 000000000..42fde7065 --- /dev/null +++ b/openlp/core/common/__init__.py @@ -0,0 +1,109 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2013 Raoul Snyman # +# Portions copyright (c) 2008-2013 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. # +# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, # +# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # +# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, # +# Frode Woldsund, Martin Zibricky, Patrick Zimmermann # +# --------------------------------------------------------------------------- # +# 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:`common` module contains most of the components and libraries that make +OpenLP work. +""" +import os +import logging +import sys + +from PyQt4 import QtCore + +log = logging.getLogger(__name__) + + +def check_directory_exists(directory, do_not_log=False): + """ + Check a theme directory exists and if not create it + + ``directory`` + The directory to make sure exists + + ``do_not_log`` + To not log anything. This is need for the start up, when the log isn't ready. + """ + if not do_not_log: + log.debug('check_directory_exists %s' % directory) + try: + if not os.path.exists(directory): + os.makedirs(directory) + except IOError: + pass + + +def get_frozen_path(frozen_option, non_frozen_option): + """ + Return a path based on the system status. + """ + if hasattr(sys, 'frozen') and sys.frozen == 1: + return frozen_option + return non_frozen_option + + +class ThemeLevel(object): + """ + Provides an enumeration for the level a theme applies to + """ + Global = 1 + Service = 2 + Song = 3 + + +def translate(context, text, comment=None, encoding=QtCore.QCoreApplication.CodecForTr, n=-1, + qt_translate=QtCore.QCoreApplication.translate): + """ + A special shortcut method to wrap around the Qt4 translation functions. This abstracts the translation procedure so + that we can change it if at a later date if necessary, without having to redo the whole of OpenLP. + + ``context`` + The translation context, used to give each string a context or a namespace. + + ``text`` + The text to put into the translation tables for translation. + + ``comment`` + An identifying string for when the same text is used in different roles within the same context. + """ + return qt_translate(context, text, comment, encoding, n) + + +class SlideLimits(object): + """ + Provides an enumeration for behaviour of OpenLP at the end limits of each service item when pressing the up/down + arrow keys + """ + End = 1 + Wrap = 2 + Next = 3 + +from .uistrings import UiStrings +from .settings import Settings +from .applocation import AppLocation + diff --git a/openlp/core/utils/applocation.py b/openlp/core/common/applocation.py similarity index 91% rename from openlp/core/utils/applocation.py rename to openlp/core/common/applocation.py index 726cbbeda..41b47ecbe 100644 --- a/openlp/core/utils/applocation.py +++ b/openlp/core/common/applocation.py @@ -27,14 +27,13 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### """ -The :mod:`openlp.core.utils.applocation` module provides an utility for OpenLP receiving the data path etc. +The :mod:`openlp.core.common.applocation` module provides an utility for OpenLP receiving the data path etc. """ import logging import os import sys -from openlp.core.lib import Settings -from openlp.core.utils import _get_frozen_path +from openlp.core.common import Settings if sys.platform != 'win32' and sys.platform != 'darwin': @@ -45,7 +44,7 @@ if sys.platform != 'win32' and sys.platform != 'darwin': XDG_BASE_AVAILABLE = False import openlp -from openlp.core.lib import check_directory_exists +from openlp.core.common import check_directory_exists, get_frozen_path log = logging.getLogger(__name__) @@ -74,15 +73,15 @@ class AppLocation(object): The directory type you want, for instance the data directory. Default *AppLocation.AppDir* """ if dir_type == AppLocation.AppDir: - return _get_frozen_path(os.path.abspath(os.path.split(sys.argv[0])[0]), os.path.split(openlp.__file__)[0]) + return get_frozen_path(os.path.abspath(os.path.split(sys.argv[0])[0]), os.path.split(openlp.__file__)[0]) elif dir_type == AppLocation.PluginsDir: app_path = os.path.abspath(os.path.split(sys.argv[0])[0]) - return _get_frozen_path(os.path.join(app_path, 'plugins'), + return get_frozen_path(os.path.join(app_path, 'plugins'), os.path.join(os.path.split(openlp.__file__)[0], 'plugins')) elif dir_type == AppLocation.VersionDir: - return _get_frozen_path(os.path.abspath(os.path.split(sys.argv[0])[0]), os.path.split(openlp.__file__)[0]) + return get_frozen_path(os.path.abspath(os.path.split(sys.argv[0])[0]), os.path.split(openlp.__file__)[0]) elif dir_type == AppLocation.LanguageDir: - app_path = _get_frozen_path(os.path.abspath(os.path.split(sys.argv[0])[0]), _get_os_dir_path(dir_type)) + app_path = get_frozen_path(os.path.abspath(os.path.split(sys.argv[0])[0]), _get_os_dir_path(dir_type)) return os.path.join(app_path, 'i18n') elif dir_type == AppLocation.DataDir and AppLocation.BaseDir: return os.path.join(AppLocation.BaseDir, 'data') @@ -171,4 +170,3 @@ def _get_os_dir_path(dir_type): if dir_type == AppLocation.DataDir: return os.path.join(str(os.getenv('HOME')), '.openlp', 'data') return os.path.join(str(os.getenv('HOME')), '.openlp') - diff --git a/openlp/core/lib/settings.py b/openlp/core/common/settings.py similarity index 99% rename from openlp/core/lib/settings.py rename to openlp/core/common/settings.py index a124132ab..0b5aebc69 100644 --- a/openlp/core/lib/settings.py +++ b/openlp/core/common/settings.py @@ -36,8 +36,7 @@ import sys from PyQt4 import QtCore, QtGui -from openlp.core.lib import SlideLimits, UiStrings -from openlp.core.lib.theme import ThemeLevel +from openlp.core.common import ThemeLevel, SlideLimits, UiStrings log = logging.getLogger(__name__) diff --git a/openlp/core/lib/uistrings.py b/openlp/core/common/uistrings.py similarity index 99% rename from openlp/core/lib/uistrings.py rename to openlp/core/common/uistrings.py index 6d4b4d250..d7a4c1c42 100644 --- a/openlp/core/lib/uistrings.py +++ b/openlp/core/common/uistrings.py @@ -31,7 +31,7 @@ The :mod:`uistrings` module provides standard strings for OpenLP. """ import logging -from openlp.core.lib import translate +from openlp.core.common import translate log = logging.getLogger(__name__) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index bc427830e..67ac409df 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -37,6 +37,8 @@ import os from PyQt4 import QtCore, QtGui, Qt +from openlp.core.common import translate + log = logging.getLogger(__name__) @@ -72,16 +74,6 @@ class MediaType(object): Video = 2 -class SlideLimits(object): - """ - Provides an enumeration for behaviour of OpenLP at the end limits of each service item when pressing the up/down - arrow keys - """ - End = 1 - Wrap = 2 - Next = 3 - - class ServiceItemAction(object): """ Provides an enumeration for the required action moving between service items by left/right arrow keys @@ -91,24 +83,6 @@ class ServiceItemAction(object): Next = 3 -def translate(context, text, comment=None, encoding=QtCore.QCoreApplication.CodecForTr, n=-1, - qt_translate=QtCore.QCoreApplication.translate): - """ - A special shortcut method to wrap around the Qt4 translation functions. This abstracts the translation procedure so - that we can change it if at a later date if necessary, without having to redo the whole of OpenLP. - - ``context`` - The translation context, used to give each string a context or a namespace. - - ``text`` - The text to put into the translation tables for translation. - - ``comment`` - An identifying string for when the same text is used in different roles within the same context. - """ - return qt_translate(context, text, comment, encoding, n) - - def get_text_file_string(text_file): """ Open a file and return its content as unicode string. If the supplied file name is not a file then the function @@ -327,57 +301,36 @@ def expand_tags(text): return text -def check_directory_exists(directory, do_not_log=False): - """ - Check a theme directory exists and if not create it - - ``directory`` - The directory to make sure exists - - ``do_not_log`` - To not log anything. This is need for the start up, when the log isn't ready. - """ - if not do_not_log: - log.debug('check_directory_exists %s' % directory) - try: - if not os.path.exists(directory): - os.makedirs(directory) - except IOError: - pass - - -def create_separated_list(stringlist): +def create_separated_list(string_list): """ Returns a string that represents a join of a list of strings with a localized separator. This function corresponds to QLocale::createSeparatedList which was introduced in Qt 4.8 and implements the algorithm from http://www.unicode.org/reports/tr35/#ListPatterns - ``stringlist`` + ``string_list`` List of unicode strings """ if LooseVersion(Qt.PYQT_VERSION_STR) >= LooseVersion('4.9') and \ LooseVersion(Qt.qVersion()) >= LooseVersion('4.8'): - return QtCore.QLocale().createSeparatedList(stringlist) - if not stringlist: + return QtCore.QLocale().createSeparatedList(string_list) + if not string_list: return '' - elif len(stringlist) == 1: - return stringlist[0] - elif len(stringlist) == 2: + elif len(string_list) == 1: + return string_list[0] + elif len(string_list) == 2: return translate('OpenLP.core.lib', '%s and %s', - 'Locale list separator: 2 items') % (stringlist[0], stringlist[1]) + 'Locale list separator: 2 items') % (string_list[0], string_list[1]) else: merged = translate('OpenLP.core.lib', '%s, and %s', - 'Locale list separator: end') % (stringlist[-2], stringlist[-1]) - for index in reversed(list(range(1, len(stringlist) - 2))): + 'Locale list separator: end') % (string_list[-2], string_list[-1]) + for index in reversed(list(range(1, len(string_list) - 2))): merged = translate('OpenLP.core.lib', '%s, %s', - 'Locale list separator: middle') % (stringlist[index], merged) - return translate('OpenLP.core.lib', '%s, %s', 'Locale list separator: start') % (stringlist[0], merged) + 'Locale list separator: middle') % (string_list[index], merged) + return translate('OpenLP.core.lib', '%s, %s', 'Locale list separator: start') % (string_list[0], merged) from .registry import Registry -from .uistrings import UiStrings from .screen import ScreenList -from .settings import Settings from .listwidgetwithdnd import ListWidgetWithDnD from .treewidgetwithdnd import TreeWidgetWithDnD from .formattingtags import FormattingTags diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index 19cde98eb..429c30262 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -41,9 +41,9 @@ from sqlalchemy.pool import NullPool from alembic.migration import MigrationContext from alembic.operations import Operations -from openlp.core.lib import translate, Settings +from openlp.core.common import AppLocation, Settings, translate from openlp.core.lib.ui import critical_error_message_box -from openlp.core.utils import AppLocation, delete_file +from openlp.core.utils import delete_file log = logging.getLogger(__name__) diff --git a/openlp/core/lib/formattingtags.py b/openlp/core/lib/formattingtags.py index 01d679a17..58e3226d1 100644 --- a/openlp/core/lib/formattingtags.py +++ b/openlp/core/lib/formattingtags.py @@ -31,12 +31,13 @@ Provide HTML Tag management and Formatting Tag access class """ import json -from openlp.core.lib import Settings, translate +from openlp.core.common import Settings +from openlp.core.lib import translate class FormattingTags(object): """ - Static Class to HTML Tags to be access around the code the list is managed by the Options Tab. + Static Class for HTML Tags to be access around the code the list is managed by the Options Tab. """ html_expands = [] @@ -48,22 +49,15 @@ class FormattingTags(object): return FormattingTags.html_expands @staticmethod - def save_html_tags(): + def save_html_tags(new_tags): """ - Saves all formatting tags except protected ones. + Saves all formatting tags except protected ones + + `new_tags` + The tags to be saved.. """ - tags = [] - for tag in FormattingTags.html_expands: - if not tag['protected'] and not tag.get('temporary'): - # Using dict ensures that copy is made and encoding of values a little later does not affect tags in - # the original list - tags.append(dict(tag)) - tag = tags[-1] - # Remove key 'temporary' from tags. It is not needed to be saved. - if 'temporary' in tag: - del tag['temporary'] # Formatting Tags were also known as display tags. - Settings().setValue('formattingTags/html_tags', json.dumps(tags) if tags else '') + Settings().setValue('formattingTags/html_tags', json.dumps(new_tags) if new_tags else '') @staticmethod def load_tags(): diff --git a/openlp/core/lib/htmlbuilder.py b/openlp/core/lib/htmlbuilder.py index 5aa701d95..07a83f336 100644 --- a/openlp/core/lib/htmlbuilder.py +++ b/openlp/core/lib/htmlbuilder.py @@ -26,7 +26,372 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +""" +This module is responsible for generating the HTML for :class:`~openlp.core.ui.maindisplay`. The ``build_html`` function +is the function which has to be called from outside. The generated and returned HTML will look similar to this:: + + +
+