This commit is contained in:
Tim Bentley 2014-03-09 10:26:28 +00:00
parent 83abc63079
commit 776724d9a2
6 changed files with 392 additions and 473 deletions

View File

@ -74,14 +74,9 @@ class BGExtract(object):
"""
Remove a particular element from the BeautifulSoup tree.
``parent``
The element from which items need to be removed.
``tag``
A string of the tab type, e.g. "div"
``class_``
An HTML class attribute for further qualification.
:param parent: The element from which items need to be removed.
:param tag: A string of the tab type, e.g. "div"
:param class_: An HTML class attribute for further qualification.
"""
if class_:
all_tags = parent.find_all(tag, class_)
@ -94,8 +89,7 @@ class BGExtract(object):
"""
Extract a verse (or part of a verse) from a tag.
``tag``
The BeautifulSoup Tag element with the stuff we want.
:param tag: The BeautifulSoup Tag element with the stuff we want.
"""
if isinstance(tag, NavigableString):
return None, str(tag)
@ -122,8 +116,7 @@ class BGExtract(object):
"""
Remove all the rubbish from the HTML page.
``tag``
The base tag within which we want to remove stuff.
:param tag: The base tag within which we want to remove stuff.
"""
self._remove_elements(tag, 'sup', 'crossreference')
self._remove_elements(tag, 'sup', 'footnote')
@ -137,8 +130,7 @@ class BGExtract(object):
"""
Extract all the verses from a pre-prepared list of HTML tags.
``tags``
A list of BeautifulSoup Tag elements.
:param tags: A list of BeautifulSoup Tag elements.
"""
verses = []
tags = tags[::-1]
@ -184,8 +176,7 @@ class BGExtract(object):
Use the old style of parsing for those Bibles on BG who mysteriously have not been migrated to the new (still
broken) HTML.
``div``
The parent div.
:param div: The parent div.
"""
verse_list = {}
# Cater for inconsistent mark up in the first verse of a chapter.
@ -225,14 +216,9 @@ class BGExtract(object):
"""
Access and decode Bibles via the BibleGateway website.
``version``
The version of the Bible like 31 for New International version.
``book_name``
Name of the Book.
``chapter``
Chapter number.
:param version: The version of the Bible like 31 for New International version.
:param book_name: Name of the Book.
:param chapter: Chapter number.
"""
log.debug('BGExtract.get_bible_chapter("%s", "%s", "%s")', version, book_name, chapter)
url_book_name = urllib.parse.quote(book_name.encode("utf-8"))
@ -259,10 +245,9 @@ class BGExtract(object):
def get_books_from_http(self, version):
"""
Load a list of all books a Bible contaions from BibleGateway website.
Load a list of all books a Bible contains from BibleGateway website.
``version``
The version of the Bible like NIV for New International Version
:param version: The version of the Bible like NIV for New International Version
"""
log.debug('BGExtract.get_books_from_http("%s")', version)
url_params = urllib.parse.urlencode({'action': 'getVersionInfo', 'vid': '%s' % version})
@ -328,14 +313,9 @@ class BSExtract(object):
"""
Access and decode bibles via Bibleserver mobile website
``version``
The version of the bible like NIV for New International Version
``book_name``
Text name of bible book e.g. Genesis, 1. John, 1John or Offenbarung
``chapter``
Chapter number
:param version: The version of the bible like NIV for New International Version
:param book_name: Text name of bible book e.g. Genesis, 1. John, 1John or Offenbarung
:param chapter: Chapter number
"""
log.debug('BSExtract.get_bible_chapter("%s", "%s", "%s")', version, book_name, chapter)
url_version = urllib.parse.quote(version.encode("utf-8"))
@ -363,12 +343,11 @@ class BSExtract(object):
"""
Load a list of all books a Bible contains from Bibleserver mobile website.
``version``
The version of the Bible like NIV for New International Version
:param version: The version of the Bible like NIV for New International Version
"""
log.debug('BSExtract.get_books_from_http("%s")', version)
url_version = urllib.parse.quote(version.encode("utf-8"))
chapter_url = 'http://m.bibleserver.com/overlay/selectBook?translation=%s' % (url_version)
chapter_url = 'http://m.bibleserver.com/overlay/selectBook?translation=%s' % url_version
soup = get_soup_for_bible_ref(chapter_url)
if not soup:
return None
@ -408,14 +387,9 @@ class CWExtract(object):
"""
Access and decode bibles via the Crosswalk website
``version``
The version of the Bible like niv for New International Version
``book_name``
Text name of in english e.g. 'gen' for Genesis
``chapter``
Chapter number
:param version: The version of the Bible like niv for New International Version
:param book_name: Text name of in english e.g. 'gen' for Genesis
:param chapter: Chapter number
"""
log.debug('CWExtract.get_bible_chapter("%s", "%s", "%s")', version, book_name, chapter)
url_book_name = book_name.replace(' ', '-')
@ -463,11 +437,10 @@ class CWExtract(object):
"""
Load a list of all books a Bible contain from the Crosswalk website.
``version``
The version of the bible like NIV for New International Version
:param version: The version of the bible like NIV for New International Version
"""
log.debug('CWExtract.get_books_from_http("%s")', version)
chapter_url = 'http://www.biblestudytools.com/%s/' % (version)
chapter_url = 'http://www.biblestudytools.com/%s/' % version
soup = get_soup_for_bible_ref(chapter_url)
if not soup:
return None
@ -533,7 +506,8 @@ class HTTPBible(BibleDB):
failure.
"""
self.wizard.progress_bar.setMaximum(68)
self.wizard.increment_progress_bar(translate('BiblesPlugin.HTTPBible', 'Registering Bible and loading books...'))
self.wizard.increment_progress_bar(translate('BiblesPlugin.HTTPBible',
'Registering Bible and loading books...'))
self.save_meta('download_source', self.download_source)
self.save_meta('download_name', self.download_name)
if self.proxy_server:
@ -552,8 +526,8 @@ class HTTPBible(BibleDB):
handler = BSExtract(self.proxy_server)
books = handler.get_books_from_http(self.download_name)
if not books:
log.error('Importing books from %s - download name: "%s" '\
'failed' % (self.download_source, self.download_name))
log.error('Importing books from %s - download name: "%s" failed' %
(self.download_source, self.download_name))
return False
self.wizard.progress_bar.setMaximum(len(books) + 2)
self.wizard.increment_progress_bar(translate( 'BiblesPlugin.HTTPBible', 'Registering Language...'))
@ -573,12 +547,12 @@ class HTTPBible(BibleDB):
'BiblesPlugin.HTTPBible', 'Importing %s...', 'Importing <book name>...') % book)
book_ref_id = self.get_book_ref_id_by_name(book, len(books), language_id)
if not book_ref_id:
log.error('Importing books from %s - download name: "%s" '\
'failed' % (self.download_source, self.download_name))
log.error('Importing books from %s - download name: "%s" failed' %
(self.download_source, self.download_name))
return False
book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
log.debug('Book details: Name:%s; id:%s; testament_id:%s',
book, book_ref_id, book_details['testament_id'])
book, book_ref_id, book_details['testament_id'])
self.create_book(book, book_ref_id, book_details['testament_id'])
if self.stop_import_flag:
return False
@ -612,7 +586,7 @@ class HTTPBible(BibleDB):
critical_error_message_box(
translate('BiblesPlugin', 'No Book Found'),
translate('BiblesPlugin', 'No matching book could be found in this Bible. Check that you have '
'spelled the name of the book correctly.'))
'spelled the name of the book correctly.'))
return []
book = db_book.name
if BibleDB.get_verse_count(self, book_id, reference[1]) == 0:
@ -658,8 +632,7 @@ class HTTPBible(BibleDB):
"""
Return the number of chapters in a particular book.
``book``
The book object to get the chapter count for.
:param book: The book object to get the chapter count for.
"""
log.debug('HTTPBible.get_chapter_count("%s")', book.name)
return BiblesResourcesDB.get_chapter_count(book.book_reference_id)
@ -668,11 +641,8 @@ class HTTPBible(BibleDB):
"""
Return the number of verses for the specified chapter and book.
``book``
The name of the book.
``chapter``
The chapter whose verses are being counted.
:param book_id: The name of the book.
:param chapter: The chapter whose verses are being counted.
"""
log.debug('HTTPBible.get_verse_count("%s", %s)', book_id, chapter)
return BiblesResourcesDB.get_verse_count(book_id, chapter)
@ -696,18 +666,11 @@ def get_soup_for_bible_ref(reference_url, header=None, pre_parse_regex=None, pre
"""
Gets a webpage and returns a parsed and optionally cleaned soup or None.
``reference_url``
The URL to obtain the soup from.
``header``
An optional HTTP header to pass to the bible web server.
``pre_parse_regex``
A regular expression to run on the webpage. Allows manipulation of the webpage before passing to BeautifulSoup
for parsing.
``pre_parse_substitute``
The text to replace any matches to the regular expression with.
:param reference_url: The URL to obtain the soup from.
:param header: An optional HTTP header to pass to the bible web server.
:param pre_parse_regex: A regular expression to run on the webpage. Allows manipulation of the webpage before
passing to BeautifulSoup for parsing.
:param pre_parse_substitute: The text to replace any matches to the regular expression with.
"""
if not reference_url:
return None
@ -742,9 +705,10 @@ def send_error_message(error_type):
critical_error_message_box(
translate('BiblesPlugin.HTTPBible', 'Download Error'),
translate('BiblesPlugin.HTTPBible', 'There was a problem downloading your verse selection. Please check '
'your Internet connection, and if this error continues to occur please consider reporting a bug.'))
'your Internet connection, and if this error continues to occur please consider reporting a bug'
'.'))
elif error_type == 'parse':
critical_error_message_box(
translate('BiblesPlugin.HTTPBible', 'Parse Error'),
translate('BiblesPlugin.HTTPBible', 'There was a problem extracting your verse selection. If this error '
'continues to occur please consider reporting a bug.'))
'continues to occur please consider reporting a bug.'))

View File

@ -40,7 +40,6 @@ from .opensong import OpenSongBible
from .osis import OSISBible
log = logging.getLogger(__name__)
@ -57,7 +56,7 @@ class BibleFormat(object):
@staticmethod
def get_class(format):
"""
Return the appropriate imeplementation class.
Return the appropriate implementation class.
``format``
The Bible format.
@ -146,7 +145,7 @@ class BibleManager(object):
download_name = self.db_cache[name].get_object(BibleMeta, 'download_name').value
meta_proxy = self.db_cache[name].get_object(BibleMeta, 'proxy_server')
web_bible = HTTPBible(self.parent, path=self.path, file=filename, download_source=source.value,
download_name=download_name)
download_name=download_name)
if meta_proxy:
web_bible.proxy_server = meta_proxy.value
self.db_cache[name] = web_bible
@ -156,8 +155,7 @@ class BibleManager(object):
"""
Sets the reference to the dialog with the progress bar on it.
``dialog``
The reference to the import wizard.
:param wizard: The reference to the import wizard.
"""
self.import_wizard = wizard
@ -165,11 +163,8 @@ class BibleManager(object):
"""
Register a bible in the bible cache, and then import the verses.
``type``
What type of Bible, one of the ``BibleFormat`` values.
``**kwargs``
Keyword arguments to send to the actual importer class.
:param type: What type of Bible, one of the ``BibleFormat`` values.
:param kwargs: Keyword arguments to send to the actual importer class.
"""
class_ = BibleFormat.get_class(type)
kwargs['path'] = self.path
@ -182,8 +177,7 @@ class BibleManager(object):
"""
Delete a bible completely.
``name``
The name of the bible.
:param name: The name of the bible.
"""
log.debug('BibleManager.delete_bible("%s")', name)
bible = self.db_cache[name]
@ -202,8 +196,7 @@ class BibleManager(object):
"""
Returns a list of Bible books, and the number of chapters in that book.
``bible``
Unicode. The Bible to get the list of books from.
:param bible: Unicode. The Bible to get the list of books from.
"""
log.debug('BibleManager.get_books("%s")', bible)
return [
@ -219,11 +212,8 @@ class BibleManager(object):
"""
Returns a book object by given id.
``bible``
Unicode. The Bible to get the list of books from.
``id``
Unicode. The book_reference_id to get the book for.
:param bible: Unicode. The Bible to get the list of books from.
:param id: Unicode. The book_reference_id to get the book for.
"""
log.debug('BibleManager.get_book_by_id("%s", "%s")', bible, id)
return self.db_cache[bible].get_book_by_book_ref_id(id)
@ -232,22 +222,17 @@ class BibleManager(object):
"""
Returns the number of Chapters for a given book.
``bible``
Unicode. The Bible to get the list of books from.
``book``
The book object to get the chapter count for.
:param bible: Unicode. The Bible to get the list of books from.
:param book: The book object to get the chapter count for.
"""
log.debug('BibleManager.get_book_chapter_count ("%s", "%s")', bible, book.name)
return self.db_cache[bible].get_chapter_count(book)
def get_verse_count(self, bible, book, chapter):
"""
Returns all the number of verses for a given
book and chapterMaxBibleBookVerses.
Returns all the number of verses for a given book and chapterMaxBibleBookVerses.
"""
log.debug('BibleManager.get_verse_count("%s", "%s", %s)',
bible, book, chapter)
log.debug('BibleManager.get_verse_count("%s", "%s", %s)', bible, book, chapter)
language_selection = self.get_language_selection(bible)
book_ref_id = self.db_cache[bible].get_book_ref_id_by_localised_name(book, language_selection)
return self.db_cache[bible].get_verse_count(book_ref_id, chapter)
@ -260,16 +245,14 @@ class BibleManager(object):
log.debug('BibleManager.get_verse_count_by_book_ref_id("%s", "%s", "%s")', bible, book_ref_id, chapter)
return self.db_cache[bible].get_verse_count(book_ref_id, chapter)
def get_verses(self, bible, versetext, book_ref_id=False, show_error=True):
def get_verses(self, bible, verse_text, book_ref_id=False, show_error=True):
"""
Parses a scripture reference, fetches the verses from the Bible
specified, and returns a list of ``Verse`` objects.
``bible``
Unicode. The Bible to use.
``versetext``
Unicode. The scripture reference. Valid scripture references are:
:param bible: Unicode. The Bible to use.
:param verse_text:
Unicode. The scripture reference. Valid scripture references are:
- Genesis 1
- Genesis 1-2
@ -279,55 +262,53 @@ class BibleManager(object):
- Genesis 1:1-2:10
- Genesis 1:1-10,2:1-10
``book_ref_id``
Unicode. The book referece id from the book in versetext.
:param book_ref_id: Unicode. The book reference id from the book in verse_text.
For second bible this is necessary.
:param show_error:
"""
log.debug('BibleManager.get_verses("%s", "%s")', bible, versetext)
log.debug('BibleManager.get_verses("%s", "%s")', bible, verse_text)
if not bible:
if show_error:
self.main_window.information_message(
translate('BiblesPlugin.BibleManager', 'No Bibles Available'),
translate('BiblesPlugin.BibleManager',
'There are no Bibles currently installed. Please use the '
'Import Wizard to install one or more Bibles.')
)
translate('BiblesPlugin.BibleManager', 'There are no Bibles currently installed. Please use the '
'Import Wizard to install one or more Bibles.')
)
return None
language_selection = self.get_language_selection(bible)
reflist = parse_reference(versetext, self.db_cache[bible],
language_selection, book_ref_id)
reflist = parse_reference(verse_text, self.db_cache[bible], language_selection, book_ref_id)
if reflist:
return self.db_cache[bible].get_verses(reflist, show_error)
else:
if show_error:
reference_seperators = {
reference_separators = {
'verse': get_reference_separator('sep_v_display'),
'range': get_reference_separator('sep_r_display'),
'list': get_reference_separator('sep_l_display')}
self.main_window.information_message(
translate('BiblesPlugin.BibleManager', 'Scripture Reference Error'),
translate('BiblesPlugin.BibleManager', 'Your scripture reference is either not supported by '
'OpenLP or is invalid. Please make sure your reference '
'conforms to one of the following patterns or consult the manual:\n\n'
'Book Chapter\n'
'Book Chapter%(range)sChapter\n'
'Book Chapter%(verse)sVerse%(range)sVerse\n'
'Book Chapter%(verse)sVerse%(range)sVerse%(list)sVerse'
'%(range)sVerse\n'
'Book Chapter%(verse)sVerse%(range)sVerse%(list)sChapter'
'%(verse)sVerse%(range)sVerse\n'
'Book Chapter%(verse)sVerse%(range)sChapter%(verse)sVerse',
'Please pay attention to the appended "s" of the wildcards '
'and refrain from translating the words inside the names in the brackets.') % reference_seperators
)
'OpenLP or is invalid. Please make sure your reference '
'conforms to one of the following patterns or consult the manual:\n\n'
'Book Chapter\n'
'Book Chapter%(range)sChapter\n'
'Book Chapter%(verse)sVerse%(range)sVerse\n'
'Book Chapter%(verse)sVerse%(range)sVerse%(list)sVerse'
'%(range)sVerse\n'
'Book Chapter%(verse)sVerse%(range)sVerse%(list)sChapter'
'%(verse)sVerse%(range)sVerse\n'
'Book Chapter%(verse)sVerse%(range)sChapter%(verse)sVerse',
'Please pay attention to the appended "s" of the wildcards '
'and refrain from translating the words inside the names in the brackets.')
% reference_separators
)
return None
def get_language_selection(self, bible):
"""
Returns the language selection of a bible.
``bible``
Unicode. The Bible to get the language selection from.
:param bible: Unicode. The Bible to get the language selection from.
"""
log.debug('BibleManager.get_language_selection("%s")', bible)
language_selection = self.get_meta_data(bible, 'book_name_language')
@ -347,34 +328,29 @@ class BibleManager(object):
"""
Does a verse search for the given bible and text.
``bible``
The bible to search in (unicode).
``second_bible``
The second bible (unicode). We do not search in this bible.
``text``
The text to search for (unicode).
:param bible: The bible to search in (unicode).
:param second_bible: The second bible (unicode). We do not search in this bible.
:param text: The text to search for (unicode).
"""
log.debug('BibleManager.verse_search("%s", "%s")', bible, text)
if not bible:
self.main_window.information_message(
translate('BiblesPlugin.BibleManager', 'No Bibles Available'),
translate('BiblesPlugin.BibleManager',
'There are no Bibles currently installed. Please use the Import Wizard to install one or more'
' Bibles.')
)
'There are no Bibles currently installed. Please use the Import Wizard to install one or '
'more Bibles.')
)
return None
# Check if the bible or second_bible is a web bible.
webbible = self.db_cache[bible].get_object(BibleMeta, 'download_source')
web_bible = self.db_cache[bible].get_object(BibleMeta, 'download_source')
second_webbible = ''
if second_bible:
second_webbible = self.db_cache[second_bible].get_object(BibleMeta, 'download_source')
if webbible or second_webbible:
if web_bible or second_webbible:
self.main_window.information_message(
translate('BiblesPlugin.BibleManager', 'Web Bible cannot be used'),
translate('BiblesPlugin.BibleManager', 'Text Search is not available with Web Bibles.')
)
)
return None
if text:
return self.db_cache[bible].verse_search(text)
@ -382,23 +358,20 @@ class BibleManager(object):
self.main_window.information_message(
translate('BiblesPlugin.BibleManager', 'Scripture Reference Error'),
translate('BiblesPlugin.BibleManager', 'You did not enter a search keyword.\nYou can separate '
'different keywords by a space to search for all of your keywords and you can separate '
'them by a comma to search for one of them.')
)
'different keywords by a space to search for all of your keywords and you can separate '
'them by a comma to search for one of them.')
)
return None
def save_meta_data(self, bible, version, copyright, permissions,
book_name_language=None):
def save_meta_data(self, bible, version, copyright, permissions, book_name_language=None):
"""
Saves the bibles meta data.
"""
log.debug('save_meta data %s, %s, %s, %s',
bible, version, copyright, permissions)
log.debug('save_meta data %s, %s, %s, %s', bible, version, copyright, permissions)
self.db_cache[bible].save_meta('name', version)
self.db_cache[bible].save_meta('copyright', copyright)
self.db_cache[bible].save_meta('permissions', permissions)
self.db_cache[bible].save_meta('book_name_language',
book_name_language)
self.db_cache[bible].save_meta('book_name_language', book_name_language)
def get_meta_data(self, bible, key):
"""

View File

@ -86,19 +86,19 @@ class BibleMediaItem(MediaManagerItem):
if not bitem.flags() & QtCore.Qt.ItemIsSelectable:
# The item is the "No Search Results" item.
self.list_view.clear()
self.displayResults(bible, second_bible)
self.display_results(bible, second_bible)
return
else:
item_second_bible = self._decode_qt_object(bitem, 'second_bible')
if item_second_bible and second_bible or not item_second_bible and not second_bible:
self.displayResults(bible, second_bible)
self.display_results(bible, second_bible)
elif critical_error_message_box(
message=translate('BiblesPlugin.MediaItem',
'You cannot combine single and dual Bible verse search results. '
'Do you want to delete your search results and start a new search?'),
parent=self, question=True) == QtGui.QMessageBox.Yes:
'You cannot combine single and dual Bible verse search results. '
'Do you want to delete your search results and start a new search?'),
parent=self, question=True) == QtGui.QMessageBox.Yes:
self.list_view.clear()
self.displayResults(bible, second_bible)
self.display_results(bible, second_bible)
def _decode_qt_object(self, bitem, key):
reference = bitem.data(QtCore.Qt.UserRole)
@ -116,8 +116,8 @@ class BibleMediaItem(MediaManagerItem):
self.has_delete_icon = True
self.add_to_service_item = False
def addSearchTab(self, prefix, name):
self.searchTabBar.addTab(name)
def add_search_tab(self, prefix, name):
self.search_tab_bar.addTab(name)
tab = QtGui.QWidget()
tab.setObjectName(prefix + 'Tab')
tab.setSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
@ -126,15 +126,12 @@ class BibleMediaItem(MediaManagerItem):
setattr(self, prefix + 'Tab', tab)
setattr(self, prefix + 'Layout', layout)
def addSearchFields(self, prefix, name):
def add_search_fields(self, prefix, name):
"""
Creates and adds generic search tab.
``prefix``
The prefix of the tab, this is either ``quick`` or ``advanced``.
``name``
The translated string to display.
:param prefix: The prefix of the tab, this is either ``quick`` or ``advanced``.
:param name: The translated string to display.
"""
if prefix == 'quick':
idx = 2
@ -142,124 +139,126 @@ class BibleMediaItem(MediaManagerItem):
idx = 5
tab = getattr(self, prefix + 'Tab')
layout = getattr(self, prefix + 'Layout')
versionLabel = QtGui.QLabel(tab)
versionLabel.setObjectName(prefix + 'VersionLabel')
layout.addWidget(versionLabel, idx, 0, QtCore.Qt.AlignRight)
versionComboBox = create_horizontal_adjusting_combo_box(tab, prefix + 'VersionComboBox')
versionLabel.setBuddy(versionComboBox)
layout.addWidget(versionComboBox, idx, 1, 1, 2)
secondLabel = QtGui.QLabel(tab)
secondLabel.setObjectName(prefix + 'SecondLabel')
layout.addWidget(secondLabel, idx + 1, 0, QtCore.Qt.AlignRight)
secondComboBox = create_horizontal_adjusting_combo_box(tab, prefix + 'SecondComboBox')
versionLabel.setBuddy(secondComboBox)
layout.addWidget(secondComboBox, idx + 1, 1, 1, 2)
styleLabel = QtGui.QLabel(tab)
styleLabel.setObjectName(prefix + 'StyleLabel')
layout.addWidget(styleLabel, idx + 2, 0, QtCore.Qt.AlignRight)
styleComboBox = create_horizontal_adjusting_combo_box(tab, prefix + 'StyleComboBox')
styleComboBox.addItems(['', '', ''])
layout.addWidget(styleComboBox, idx + 2, 1, 1, 2)
version_label = QtGui.QLabel(tab)
version_label.setObjectName(prefix + 'VersionLabel')
layout.addWidget(version_label, idx, 0, QtCore.Qt.AlignRight)
version_combo_box = create_horizontal_adjusting_combo_box(tab, prefix + 'VersionComboBox')
version_label.setBuddy(version_combo_box)
layout.addWidget(version_combo_box, idx, 1, 1, 2)
second_label = QtGui.QLabel(tab)
second_label.setObjectName(prefix + 'SecondLabel')
layout.addWidget(second_label, idx + 1, 0, QtCore.Qt.AlignRight)
second_combo_box = create_horizontal_adjusting_combo_box(tab, prefix + 'SecondComboBox')
version_label.setBuddy(second_combo_box)
layout.addWidget(second_combo_box, idx + 1, 1, 1, 2)
style_label = QtGui.QLabel(tab)
style_label.setObjectName(prefix + 'StyleLabel')
layout.addWidget(style_label, idx + 2, 0, QtCore.Qt.AlignRight)
style_combo_box = create_horizontal_adjusting_combo_box(tab, prefix + 'StyleComboBox')
style_combo_box.addItems(['', '', ''])
layout.addWidget(style_combo_box, idx + 2, 1, 1, 2)
search_button_layout = QtGui.QHBoxLayout()
search_button_layout.setObjectName(prefix + 'search_button_layout')
search_button_layout.addStretch()
lockButton = QtGui.QToolButton(tab)
lockButton.setIcon(self.unlock_icon)
lockButton.setCheckable(True)
lockButton.setObjectName(prefix + 'LockButton')
search_button_layout.addWidget(lockButton)
searchButton = QtGui.QPushButton(tab)
searchButton.setObjectName(prefix + 'SearchButton')
search_button_layout.addWidget(searchButton)
lock_button = QtGui.QToolButton(tab)
lock_button.setIcon(self.unlock_icon)
lock_button.setCheckable(True)
lock_button.setObjectName(prefix + 'LockButton')
search_button_layout.addWidget(lock_button)
search_button = QtGui.QPushButton(tab)
search_button.setObjectName(prefix + 'SearchButton')
search_button_layout.addWidget(search_button)
layout.addLayout(search_button_layout, idx + 3, 1, 1, 2)
self.page_layout.addWidget(tab)
tab.setVisible(False)
lockButton.toggled.connect(self.onLockButtonToggled)
setattr(self, prefix + 'VersionLabel', versionLabel)
setattr(self, prefix + 'VersionComboBox', versionComboBox)
setattr(self, prefix + 'SecondLabel', secondLabel)
setattr(self, prefix + 'SecondComboBox', secondComboBox)
setattr(self, prefix + 'StyleLabel', styleLabel)
setattr(self, prefix + 'StyleComboBox', styleComboBox)
setattr(self, prefix + 'LockButton', lockButton)
lock_button.toggled.connect(self.on_lock_button_toggled)
setattr(self, prefix + 'VersionLabel', version_label)
setattr(self, prefix + 'VersionComboBox', version_combo_box)
setattr(self, prefix + 'SecondLabel', second_label)
setattr(self, prefix + 'SecondComboBox', second_combo_box)
setattr(self, prefix + 'StyleLabel', style_label)
setattr(self, prefix + 'StyleComboBox', style_combo_box)
setattr(self, prefix + 'LockButton', lock_button)
setattr(self, prefix + 'SearchButtonLayout', search_button_layout)
setattr(self, prefix + 'SearchButton', searchButton)
setattr(self, prefix + 'SearchButton', search_button)
def add_end_header_bar(self):
self.searchTabBar = QtGui.QTabBar(self)
self.searchTabBar.setExpanding(False)
self.searchTabBar.setObjectName('searchTabBar')
self.page_layout.addWidget(self.searchTabBar)
self.search_tab_bar = QtGui.QTabBar(self)
self.search_tab_bar.setExpanding(False)
self.search_tab_bar.setObjectName('search_tab_bar')
self.page_layout.addWidget(self.search_tab_bar)
# Add the Quick Search tab.
self.addSearchTab('quick', translate('BiblesPlugin.MediaItem', 'Quick'))
self.quickSearchLabel = QtGui.QLabel(self.quickTab)
self.quickSearchLabel.setObjectName('quickSearchLabel')
self.quickLayout.addWidget(self.quickSearchLabel, 0, 0, QtCore.Qt.AlignRight)
self.quickSearchEdit = SearchEdit(self.quickTab)
self.quickSearchEdit.setSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Fixed)
self.quickSearchEdit.setObjectName('quickSearchEdit')
self.quickSearchLabel.setBuddy(self.quickSearchEdit)
self.quickLayout.addWidget(self.quickSearchEdit, 0, 1, 1, 2)
self.addSearchFields('quick', translate('BiblesPlugin.MediaItem', 'Quick'))
self.add_search_tab('quick', translate('BiblesPlugin.MediaItem', 'Quick'))
self.quick_search_label = QtGui.QLabel(self.quickTab)
self.quick_search_label.setObjectName('quick_search_label')
self.quickLayout.addWidget(self.quick_search_label, 0, 0, QtCore.Qt.AlignRight)
self.quick_search_edit = SearchEdit(self.quickTab)
self.quick_search_edit.setSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Fixed)
self.quick_search_edit.setObjectName('quick_search_edit')
self.quick_search_label.setBuddy(self.quick_search_edit)
self.quickLayout.addWidget(self.quick_search_edit, 0, 1, 1, 2)
self.add_search_fields('quick', translate('BiblesPlugin.MediaItem', 'Quick'))
self.quickTab.setVisible(True)
# Add the Advanced Search tab.
self.addSearchTab('advanced', UiStrings().Advanced)
self.advancedBookLabel = QtGui.QLabel(self.advancedTab)
self.advancedBookLabel.setObjectName('advancedBookLabel')
self.advancedLayout.addWidget(self.advancedBookLabel, 0, 0, QtCore.Qt.AlignRight)
self.advancedBookComboBox = create_horizontal_adjusting_combo_box(self.advancedTab, 'advancedBookComboBox')
self.advancedBookLabel.setBuddy(self.advancedBookComboBox)
self.advancedLayout.addWidget(self.advancedBookComboBox, 0, 1, 1, 2)
self.advancedChapterLabel = QtGui.QLabel(self.advancedTab)
self.advancedChapterLabel.setObjectName('advancedChapterLabel')
self.advancedLayout.addWidget(self.advancedChapterLabel, 1, 1, 1, 2)
self.advancedVerseLabel = QtGui.QLabel(self.advancedTab)
self.advancedVerseLabel.setObjectName('advancedVerseLabel')
self.advancedLayout.addWidget(self.advancedVerseLabel, 1, 2)
self.advancedFromLabel = QtGui.QLabel(self.advancedTab)
self.advancedFromLabel.setObjectName('advancedFromLabel')
self.advancedLayout.addWidget(self.advancedFromLabel, 3, 0, QtCore.Qt.AlignRight)
self.advancedFromChapter = QtGui.QComboBox(self.advancedTab)
self.advancedFromChapter.setObjectName('advancedFromChapter')
self.advancedLayout.addWidget(self.advancedFromChapter, 3, 1)
self.advancedFromVerse = QtGui.QComboBox(self.advancedTab)
self.advancedFromVerse.setObjectName('advancedFromVerse')
self.advancedLayout.addWidget(self.advancedFromVerse, 3, 2)
self.advancedToLabel = QtGui.QLabel(self.advancedTab)
self.advancedToLabel.setObjectName('advancedToLabel')
self.advancedLayout.addWidget(self.advancedToLabel, 4, 0, QtCore.Qt.AlignRight)
self.advancedToChapter = QtGui.QComboBox(self.advancedTab)
self.advancedToChapter.setObjectName('advancedToChapter')
self.advancedLayout.addWidget(self.advancedToChapter, 4, 1)
self.advancedToVerse = QtGui.QComboBox(self.advancedTab)
self.advancedToVerse.setObjectName('advancedToVerse')
self.advancedLayout.addWidget(self.advancedToVerse, 4, 2)
self.addSearchFields('advanced', UiStrings().Advanced)
self.add_search_tab('advanced', UiStrings().Advanced)
self.advanced_book_label = QtGui.QLabel(self.advancedTab)
self.advanced_book_label.setObjectName('advanced_book_label')
self.advancedLayout.addWidget(self.advanced_book_label, 0, 0, QtCore.Qt.AlignRight)
self.advanced_book_combo_box = create_horizontal_adjusting_combo_box(self.advancedTab,
'advanced_book_combo_box')
self.advanced_book_label.setBuddy(self.advanced_book_combo_box)
self.advancedLayout.addWidget(self.advanced_book_combo_box, 0, 1, 1, 2)
self.advanced_chapter_label = QtGui.QLabel(self.advancedTab)
self.advanced_chapter_label.setObjectName('advanced_chapter_label')
self.advancedLayout.addWidget(self.advanced_chapter_label, 1, 1, 1, 2)
self.advanced_verse_label = QtGui.QLabel(self.advancedTab)
self.advanced_verse_label.setObjectName('advanced_verse_label')
self.advancedLayout.addWidget(self.advanced_verse_label, 1, 2)
self.advanced_from_label = QtGui.QLabel(self.advancedTab)
self.advanced_from_label.setObjectName('advanced_from_label')
self.advancedLayout.addWidget(self.advanced_from_label, 3, 0, QtCore.Qt.AlignRight)
self.advanced_from_chapter = QtGui.QComboBox(self.advancedTab)
self.advanced_from_chapter.setObjectName('advanced_from_chapter')
self.advancedLayout.addWidget(self.advanced_from_chapter, 3, 1)
self.advanced_from_verse = QtGui.QComboBox(self.advancedTab)
self.advanced_from_verse.setObjectName('advanced_from_verse')
self.advancedLayout.addWidget(self.advanced_from_verse, 3, 2)
self.advanced_to_label = QtGui.QLabel(self.advancedTab)
self.advanced_to_label.setObjectName('advanced_to_label')
self.advancedLayout.addWidget(self.advanced_to_label, 4, 0, QtCore.Qt.AlignRight)
self.advanced_to_chapter = QtGui.QComboBox(self.advancedTab)
self.advanced_to_chapter.setObjectName('advanced_to_chapter')
self.advancedLayout.addWidget(self.advanced_to_chapter, 4, 1)
self.advanced_to_verse = QtGui.QComboBox(self.advancedTab)
self.advanced_to_verse.setObjectName('advanced_to_verse')
self.advancedLayout.addWidget(self.advanced_to_verse, 4, 2)
self.add_search_fields('advanced', UiStrings().Advanced)
# Combo Boxes
self.quickVersionComboBox.activated.connect(self.updateAutoCompleter)
self.quickSecondComboBox.activated.connect(self.updateAutoCompleter)
self.advancedVersionComboBox.activated.connect(self.onAdvancedVersionComboBox)
self.advancedSecondComboBox.activated.connect(self.onAdvancedSecondComboBox)
self.advancedBookComboBox.activated.connect(self.onAdvancedBookComboBox)
self.advancedFromChapter.activated.connect(self.onAdvancedFromChapter)
self.advancedFromVerse.activated.connect(self.onAdvancedFromVerse)
self.advancedToChapter.activated.connect(self.onAdvancedToChapter)
QtCore.QObject.connect(self.quickSearchEdit, QtCore.SIGNAL('searchTypeChanged(int)'), self.updateAutoCompleter)
self.quickVersionComboBox.activated.connect(self.updateAutoCompleter)
self.quickStyleComboBox.activated.connect(self.onQuickStyleComboBoxChanged)
self.advancedStyleComboBox.activated.connect(self.onAdvancedStyleComboBoxChanged)
self.quickVersionComboBox.activated.connect(self.update_auto_completer)
self.quickSecondComboBox.activated.connect(self.update_auto_completer)
self.advancedVersionComboBox.activated.connect(self.on_advanced_version_combo_box)
self.advancedSecondComboBox.activated.connect(self.on_advanced_second_combo_box)
self.advanced_book_combo_box.activated.connect(self.on_advanced_book_combo_box)
self.advanced_from_chapter.activated.connect(self.on_advanced_from_chapter)
self.advanced_from_verse.activated.connect(self.on_advanced_from_verse)
self.advanced_to_chapter.activated.connect(self.on_advanced_to_chapter)
QtCore.QObject.connect(self.quick_search_edit, QtCore.SIGNAL('searchTypeChanged(int)'),
self.update_auto_completer)
self.quickVersionComboBox.activated.connect(self.update_auto_completer)
self.quickStyleComboBox.activated.connect(self.on_quick_style_combo_box_changed)
self.advancedStyleComboBox.activated.connect(self.on_advanced_style_combo_box_changed)
# Buttons
self.advancedSearchButton.clicked.connect(self.onAdvancedSearchButton)
self.quickSearchButton.clicked.connect(self.onQuickSearchButton)
self.advancedSearchButton.clicked.connect(self.on_advanced_search_button)
self.quickSearchButton.clicked.connect(self.on_quick_search_button)
# Other stuff
self.quickSearchEdit.returnPressed.connect(self.onQuickSearchButton)
self.searchTabBar.currentChanged.connect(self.onSearchTabBarCurrentChanged)
self.quick_search_edit.returnPressed.connect(self.on_quick_search_button)
self.search_tab_bar.currentChanged.connect(self.on_search_tab_bar_current_changed)
def on_focus(self):
if self.quickTab.isVisible():
self.quickSearchEdit.setFocus()
self.quick_search_edit.setFocus()
else:
self.advancedBookComboBox.setFocus()
self.advanced_book_combo_box.setFocus()
def config_update(self):
log.debug('config_update')
@ -278,7 +277,7 @@ class BibleMediaItem(MediaManagerItem):
def retranslateUi(self):
log.debug('retranslateUi')
self.quickSearchLabel.setText(translate('BiblesPlugin.MediaItem', 'Find:'))
self.quick_search_label.setText(translate('BiblesPlugin.MediaItem', 'Find:'))
self.quickVersionLabel.setText('%s:' % UiStrings().Version)
self.quickSecondLabel.setText(translate('BiblesPlugin.MediaItem', 'Second:'))
self.quickStyleLabel.setText(UiStrings().LayoutStyle)
@ -286,13 +285,13 @@ class BibleMediaItem(MediaManagerItem):
self.quickStyleComboBox.setItemText(LayoutStyle.VersePerLine, UiStrings().VersePerLine)
self.quickStyleComboBox.setItemText(LayoutStyle.Continuous, UiStrings().Continuous)
self.quickLockButton.setToolTip(translate('BiblesPlugin.MediaItem',
'Toggle to keep or clear the previous results.'))
'Toggle to keep or clear the previous results.'))
self.quickSearchButton.setText(UiStrings().Search)
self.advancedBookLabel.setText(translate('BiblesPlugin.MediaItem', 'Book:'))
self.advancedChapterLabel.setText(translate('BiblesPlugin.MediaItem', 'Chapter:'))
self.advancedVerseLabel.setText(translate('BiblesPlugin.MediaItem', 'Verse:'))
self.advancedFromLabel.setText(translate('BiblesPlugin.MediaItem', 'From:'))
self.advancedToLabel.setText(translate('BiblesPlugin.MediaItem', 'To:'))
self.advanced_book_label.setText(translate('BiblesPlugin.MediaItem', 'Book:'))
self.advanced_chapter_label.setText(translate('BiblesPlugin.MediaItem', 'Chapter:'))
self.advanced_verse_label.setText(translate('BiblesPlugin.MediaItem', 'Verse:'))
self.advanced_from_label.setText(translate('BiblesPlugin.MediaItem', 'From:'))
self.advanced_to_label.setText(translate('BiblesPlugin.MediaItem', 'To:'))
self.advancedVersionLabel.setText('%s:' % UiStrings().Version)
self.advancedSecondLabel.setText(translate('BiblesPlugin.MediaItem', 'Second:'))
self.advancedStyleLabel.setText(UiStrings().LayoutStyle)
@ -300,14 +299,14 @@ class BibleMediaItem(MediaManagerItem):
self.advancedStyleComboBox.setItemText(LayoutStyle.VersePerLine, UiStrings().VersePerLine)
self.advancedStyleComboBox.setItemText(LayoutStyle.Continuous, UiStrings().Continuous)
self.advancedLockButton.setToolTip(translate('BiblesPlugin.MediaItem',
'Toggle to keep or clear the previous results.'))
'Toggle to keep or clear the previous results.'))
self.advancedSearchButton.setText(UiStrings().Search)
def initialise(self):
log.debug('bible manager initialise')
self.plugin.manager.media = self
self.loadBibles()
self.quickSearchEdit.set_search_types([
self.load_bibles()
self.quick_search_edit.set_search_types([
(BibleSearch.Reference, ':/bibles/bibles_search_reference.png',
translate('BiblesPlugin.MediaItem', 'Scripture Reference'),
translate('BiblesPlugin.MediaItem', 'Search Scripture Reference...')),
@ -315,11 +314,11 @@ class BibleMediaItem(MediaManagerItem):
translate('BiblesPlugin.MediaItem', 'Text Search'),
translate('BiblesPlugin.MediaItem', 'Search Text...'))
])
self.quickSearchEdit.set_current_search_type(Settings().value('%s/last search type' % self.settings_section))
self.quick_search_edit.set_current_search_type(Settings().value('%s/last search type' % self.settings_section))
self.config_update()
log.debug('bible manager initialise complete')
def loadBibles(self):
def load_bibles(self):
log.debug('Loading Bibles')
self.quickVersionComboBox.clear()
self.quickSecondComboBox.clear()
@ -340,80 +339,73 @@ class BibleMediaItem(MediaManagerItem):
bible = Settings().value(self.settings_section + '/advanced bible')
if bible in bibles:
find_and_set_in_combo_box(self.advancedVersionComboBox, bible)
self.initialiseAdvancedBible(str(bible))
self.initialise_advanced_bible(str(bible))
elif bibles:
self.initialiseAdvancedBible(bibles[0])
self.initialise_advanced_bible(bibles[0])
bible = Settings().value(self.settings_section + '/quick bible')
find_and_set_in_combo_box(self.quickVersionComboBox, bible)
def reload_bibles(self, process=False):
log.debug('Reloading Bibles')
self.plugin.manager.reload_bibles()
self.loadBibles()
self.load_bibles()
# If called from first time wizard re-run, process any new bibles.
if process:
self.plugin.app_startup()
self.updateAutoCompleter()
self.update_auto_completer()
def initialiseAdvancedBible(self, bible, last_book_id=None):
def initialise_advanced_bible(self, bible, last_book_id=None):
"""
This initialises the given bible, which means that its book names and
their chapter numbers is added to the combo boxes on the
'Advanced Search' Tab. This is not of any importance of the
'Quick Search' Tab.
This initialises the given bible, which means that its book names and their chapter numbers is added to the
combo boxes on the 'Advanced Search' Tab. This is not of any importance of the 'Quick Search' Tab.
``bible``
The bible to initialise (unicode).
``last_book_id``
The "book reference id" of the book which is choosen at the moment.
:param bible: The bible to initialise (unicode).
:param last_book_id: The "book reference id" of the book which is chosen at the moment.
(int)
"""
log.debug('initialiseAdvancedBible %s, %s', bible, last_book_id)
log.debug('initialise_advanced_bible %s, %s', bible, last_book_id)
book_data = self.plugin.manager.get_books(bible)
secondbible = self.advancedSecondComboBox.currentText()
if secondbible != '':
secondbook_data = self.plugin.manager.get_books(secondbible)
second_bible = self.advancedSecondComboBox.currentText()
if second_bible != '':
second_book_data = self.plugin.manager.get_books(second_bible)
book_data_temp = []
for book in book_data:
for secondbook in secondbook_data:
if book['book_reference_id'] == \
secondbook['book_reference_id']:
for second_book in second_book_data:
if book['book_reference_id'] == second_book['book_reference_id']:
book_data_temp.append(book)
book_data = book_data_temp
self.advancedBookComboBox.clear()
self.advanced_book_combo_box.clear()
first = True
initialise_chapter_verse = False
language_selection = self.plugin.manager.get_language_selection(bible)
book_names = BibleStrings().BookNames
for book in book_data:
row = self.advancedBookComboBox.count()
row = self.advanced_book_combo_box.count()
if language_selection == LanguageSelection.Bible:
self.advancedBookComboBox.addItem(book['name'])
self.advanced_book_combo_box.addItem(book['name'])
elif language_selection == LanguageSelection.Application:
data = BiblesResourcesDB.get_book_by_id(book['book_reference_id'])
self.advancedBookComboBox.addItem(book_names[data['abbreviation']])
self.advanced_book_combo_box.addItem(book_names[data['abbreviation']])
elif language_selection == LanguageSelection.English:
data = BiblesResourcesDB.get_book_by_id(book['book_reference_id'])
self.advancedBookComboBox.addItem(data['name'])
self.advancedBookComboBox.setItemData(row, book['book_reference_id'])
self.advanced_book_combo_box.addItem(data['name'])
self.advanced_book_combo_box.setItemData(row, book['book_reference_id'])
if first:
first = False
first_book = book
initialise_chapter_verse = True
if last_book_id and last_book_id == int(book['book_reference_id']):
index = self.advancedBookComboBox.findData(book['book_reference_id'])
index = self.advanced_book_combo_box.findData(book['book_reference_id'])
if index == -1:
# Not Found.
index = 0
self.advancedBookComboBox.setCurrentIndex(index)
self.advanced_book_combo_box.setCurrentIndex(index)
initialise_chapter_verse = False
if initialise_chapter_verse:
self.initialiseChapterVerse(bible, first_book['name'],
first_book['book_reference_id'])
self.initialise_chapter_verse(bible, first_book['name'], first_book['book_reference_id'])
def initialiseChapterVerse(self, bible, book, book_ref_id):
log.debug('initialiseChapterVerse %s, %s, %s', bible, book, book_ref_id)
def initialise_chapter_verse(self, bible, book, book_ref_id):
log.debug('initialise_chapter_verse %s, %s, %s', bible, book, book_ref_id)
book = self.plugin.manager.get_book_by_id(bible, book_ref_id)
self.chapter_count = self.plugin.manager.get_chapter_count(bible, book)
verse_count = self.plugin.manager.get_verse_count_by_book_ref_id(bible, book_ref_id, 1)
@ -422,36 +414,36 @@ class BibleMediaItem(MediaManagerItem):
critical_error_message_box(message=translate('BiblesPlugin.MediaItem', 'Bible not fully loaded.'))
else:
self.advancedSearchButton.setEnabled(True)
self.adjustComboBox(1, self.chapter_count, self.advancedFromChapter)
self.adjustComboBox(1, self.chapter_count, self.advancedToChapter)
self.adjustComboBox(1, verse_count, self.advancedFromVerse)
self.adjustComboBox(1, verse_count, self.advancedToVerse)
self.adjust_combo_box(1, self.chapter_count, self.advanced_from_chapter)
self.adjust_combo_box(1, self.chapter_count, self.advanced_to_chapter)
self.adjust_combo_box(1, verse_count, self.advanced_from_verse)
self.adjust_combo_box(1, verse_count, self.advanced_to_verse)
def updateAutoCompleter(self):
def update_auto_completer(self):
"""
This updates the bible book completion list for the search field. The
completion depends on the bible. It is only updated when we are doing a
reference search, otherwise the auto completion list is removed.
"""
log.debug('updateAutoCompleter')
log.debug('update_auto_completer')
# Save the current search type to the configuration.
Settings().setValue('%s/last search type' % self.settings_section, self.quickSearchEdit.current_search_type())
Settings().setValue('%s/last search type' % self.settings_section, self.quick_search_edit.current_search_type())
# Save the current bible to the configuration.
Settings().setValue(self.settings_section + '/quick bible', self.quickVersionComboBox.currentText())
books = []
# We have to do a 'Reference Search'.
if self.quickSearchEdit.current_search_type() == BibleSearch.Reference:
if self.quick_search_edit.current_search_type() == BibleSearch.Reference:
bibles = self.plugin.manager.get_bibles()
bible = self.quickVersionComboBox.currentText()
if bible:
book_data = bibles[bible].get_books()
secondbible = self.quickSecondComboBox.currentText()
if secondbible != '':
secondbook_data = bibles[secondbible].get_books()
second_bible = self.quickSecondComboBox.currentText()
if second_bible != '':
second_book_data = bibles[second_bible].get_books()
book_data_temp = []
for book in book_data:
for secondbook in secondbook_data:
if book.book_reference_id == secondbook.book_reference_id:
for second_book in second_book_data:
if book.book_reference_id == second_book.book_reference_id:
book_data_temp.append(book)
book_data = book_data_temp
language_selection = self.plugin.manager.get_language_selection(bible)
@ -467,7 +459,7 @@ class BibleMediaItem(MediaManagerItem):
data = BiblesResourcesDB.get_book_by_id(book.book_reference_id)
books.append(data['name'] + ' ')
books.sort(key=get_locale_key)
set_case_insensitive_completer(books, self.quickSearchEdit)
set_case_insensitive_completer(books, self.quick_search_edit)
def on_import_click(self):
if not hasattr(self, 'import_wizard'):
@ -482,9 +474,9 @@ class BibleMediaItem(MediaManagerItem):
elif self.advancedTab.isVisible():
bible = self.advancedVersionComboBox.currentText()
if bible:
self.editBibleForm = EditBibleForm(self, self.main_window, self.plugin.manager)
self.editBibleForm.loadBible(bible)
if self.editBibleForm.exec_():
self.edit_bible_form = EditBibleForm(self, self.main_window, self.plugin.manager)
self.edit_bible_form.loadBible(bible)
if self.edit_bible_form.exec_():
self.reload_bibles()
def on_delete_click(self):
@ -493,117 +485,113 @@ class BibleMediaItem(MediaManagerItem):
elif self.advancedTab.isVisible():
bible = self.advancedVersionComboBox.currentText()
if bible:
if QtGui.QMessageBox.question(self, UiStrings().ConfirmDelete,
translate('BiblesPlugin.MediaItem', 'Are you sure you want to completely delete "%s" Bible from '
'OpenLP?\n\nYou will need to re-import this Bible to use it again.') % bible,
if QtGui.QMessageBox.question(
self, UiStrings().ConfirmDelete,
translate('BiblesPlugin.MediaItem', 'Are you sure you want to completely delete "%s" Bible from '
'OpenLP?\n\nYou will need to re-import this Bible to use it again.') % bible,
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No),
QtGui.QMessageBox.Yes) == QtGui.QMessageBox.No:
QtGui.QMessageBox.Yes) == QtGui.QMessageBox.No:
return
self.plugin.manager.delete_bible(bible)
self.reload_bibles()
def onSearchTabBarCurrentChanged(self, index):
def on_search_tab_bar_current_changed(self, index):
if index == 0:
self.advancedTab.setVisible(False)
self.quickTab.setVisible(True)
self.quickSearchEdit.setFocus()
self.quick_search_edit.setFocus()
else:
self.quickTab.setVisible(False)
self.advancedTab.setVisible(True)
self.advancedBookComboBox.setFocus()
self.advanced_book_combo_box.setFocus()
def onLockButtonToggled(self, checked):
def on_lock_button_toggled(self, checked):
if checked:
self.sender().setIcon(self.lock_icon)
else:
self.sender().setIcon(self.unlock_icon)
def onQuickStyleComboBoxChanged(self):
def on_quick_style_combo_box_changed(self):
self.settings.layout_style = self.quickStyleComboBox.currentIndex()
self.advancedStyleComboBox.setCurrentIndex(self.settings.layout_style)
self.settings.layout_style_combo_box.setCurrentIndex(self.settings.layout_style)
Settings().setValue(self.settings_section + '/verse layout style', self.settings.layout_style)
def onAdvancedStyleComboBoxChanged(self):
def on_advanced_style_combo_box_changed(self):
self.settings.layout_style = self.advancedStyleComboBox.currentIndex()
self.quickStyleComboBox.setCurrentIndex(self.settings.layout_style)
self.settings.layout_style_combo_box.setCurrentIndex(self.settings.layout_style)
Settings().setValue(self.settings_section + '/verse layout style', self.settings.layout_style)
def onAdvancedVersionComboBox(self):
def on_advanced_version_combo_box(self):
Settings().setValue(self.settings_section + '/advanced bible', self.advancedVersionComboBox.currentText())
self.initialiseAdvancedBible(self.advancedVersionComboBox.currentText(),
self.advancedBookComboBox.itemData(int(self.advancedBookComboBox.currentIndex())))
def onAdvancedSecondComboBox(self):
self.initialiseAdvancedBible(self.advancedVersionComboBox.currentText(),
self.advancedBookComboBox.itemData(int(self.advancedBookComboBox.currentIndex())))
def onAdvancedBookComboBox(self):
item = int(self.advancedBookComboBox.currentIndex())
self.initialiseChapterVerse(
self.initialise_advanced_bible(
self.advancedVersionComboBox.currentText(),
self.advancedBookComboBox.currentText(),
self.advancedBookComboBox.itemData(item))
self.advanced_book_combo_box.itemData(int(self.advanced_book_combo_box.currentIndex())))
def onAdvancedFromVerse(self):
chapter_from = int(self.advancedFromChapter.currentText())
chapter_to = int(self.advancedToChapter.currentText())
def on_advanced_second_combo_box(self):
self.initialise_advanced_bible(
self.advancedVersionComboBox.currentText(),
self.advanced_book_combo_box.itemData(int(self.advanced_book_combo_box.currentIndex())))
def on_advanced_book_combo_box(self):
item = int(self.advanced_book_combo_box.currentIndex())
self.initialise_chapter_verse(
self.advancedVersionComboBox.currentText(),
self.advanced_book_combo_box.currentText(),
self.advanced_book_combo_box.itemData(item))
def on_advanced_from_verse(self):
chapter_from = int(self.advanced_from_chapter.currentText())
chapter_to = int(self.advanced_to_chapter.currentText())
if chapter_from == chapter_to:
bible = self.advancedVersionComboBox.currentText()
book_ref_id = self.advancedBookComboBox.itemData(int(self.advancedBookComboBox.currentIndex()))
verse_from = int(self.advancedFromVerse.currentText())
book_ref_id = self.advanced_book_combo_box.itemData(int(self.advanced_book_combo_box.currentIndex()))
verse_from = int(self.advanced_from_verse.currentText())
verse_count = self.plugin.manager.get_verse_count_by_book_ref_id(bible, book_ref_id, chapter_to)
self.adjustComboBox(verse_from, verse_count, self.advancedToVerse, True)
self.adjust_combo_box(verse_from, verse_count, self.advanced_to_verse, True)
def onAdvancedToChapter(self):
def on_advanced_to_chapter(self):
bible = self.advancedVersionComboBox.currentText()
book_ref_id = self.advancedBookComboBox.itemData(int(self.advancedBookComboBox.currentIndex()))
chapter_from = int(self.advancedFromChapter.currentText())
chapter_to = int(self.advancedToChapter.currentText())
verse_from = int(self.advancedFromVerse.currentText())
verse_to = int(self.advancedToVerse.currentText())
book_ref_id = self.advanced_book_combo_box.itemData(int(self.advanced_book_combo_box.currentIndex()))
chapter_from = int(self.advanced_from_chapter.currentText())
chapter_to = int(self.advanced_to_chapter.currentText())
verse_from = int(self.advanced_from_verse.currentText())
verse_to = int(self.advanced_to_verse.currentText())
verse_count = self.plugin.manager.get_verse_count_by_book_ref_id(bible, book_ref_id, chapter_to)
if chapter_from == chapter_to and verse_from > verse_to:
self.adjustComboBox(verse_from, verse_count, self.advancedToVerse)
self.adjust_combo_box(verse_from, verse_count, self.advanced_to_verse)
else:
self.adjustComboBox(1, verse_count, self.advancedToVerse)
self.adjust_combo_box(1, verse_count, self.advanced_to_verse)
def onAdvancedFromChapter(self):
def on_advanced_from_chapter(self):
bible = self.advancedVersionComboBox.currentText()
book_ref_id = self.advancedBookComboBox.itemData(
int(self.advancedBookComboBox.currentIndex()))
chapter_from = int(self.advancedFromChapter.currentText())
chapter_to = int(self.advancedToChapter.currentText())
book_ref_id = self.advanced_book_combo_box.itemData(
int(self.advanced_book_combo_box.currentIndex()))
chapter_from = int(self.advanced_from_chapter.currentText())
chapter_to = int(self.advanced_to_chapter.currentText())
verse_count = self.plugin.manager.get_verse_count_by_book_ref_id(bible, book_ref_id, chapter_from)
self.adjustComboBox(1, verse_count, self.advancedFromVerse)
self.adjust_combo_box(1, verse_count, self.advanced_from_verse)
if chapter_from > chapter_to:
self.adjustComboBox(1, verse_count, self.advancedToVerse)
self.adjustComboBox(chapter_from, self.chapter_count, self.advancedToChapter)
self.adjust_combo_box(1, verse_count, self.advanced_to_verse)
self.adjust_combo_box(chapter_from, self.chapter_count, self.advanced_to_chapter)
elif chapter_from == chapter_to:
self.adjustComboBox(chapter_from, self.chapter_count, self.advancedToChapter)
self.adjustComboBox(1, verse_count, self.advancedToVerse, True)
self.adjust_combo_box(chapter_from, self.chapter_count, self.advanced_to_chapter)
self.adjust_combo_box(1, verse_count, self.advanced_to_verse, True)
else:
self.adjustComboBox(chapter_from, self.chapter_count, self.advancedToChapter, True)
self.adjust_combo_box(chapter_from, self.chapter_count, self.advanced_to_chapter, True)
def adjustComboBox(self, range_from, range_to, combo, restore=False):
def adjust_combo_box(self, range_from, range_to, combo, restore=False):
"""
Adjusts the given como box to the given values.
``range_from``
The first number of the range (int).
``range_to``
The last number of the range (int).
``combo``
The combo box itself (QComboBox).
``restore``
If True, then the combo's currentText will be restored after
:param range_from: The first number of the range (int).
:param range_to: The last number of the range (int).
:param combo: The combo box itself (QComboBox).
:param restore: If True, then the combo's currentText will be restored after
adjusting (if possible).
"""
log.debug('adjustComboBox %s, %s, %s', combo, range_from, range_to)
log.debug('adjust_combo_box %s, %s, %s', combo, range_from, range_to)
if restore:
old_text = combo.currentText()
combo.clear()
@ -611,7 +599,7 @@ class BibleMediaItem(MediaManagerItem):
if restore and combo.findText(old_text) != -1:
combo.setCurrentIndex(combo.findText(old_text))
def onAdvancedSearchButton(self):
def on_advanced_search_button(self):
"""
Does an advanced search and saves the search results.
"""
@ -620,32 +608,32 @@ class BibleMediaItem(MediaManagerItem):
self.application.process_events()
bible = self.advancedVersionComboBox.currentText()
second_bible = self.advancedSecondComboBox.currentText()
book = self.advancedBookComboBox.currentText()
book_ref_id = self.advancedBookComboBox.itemData(int(self.advancedBookComboBox.currentIndex()))
chapter_from = self.advancedFromChapter.currentText()
chapter_to = self.advancedToChapter.currentText()
verse_from = self.advancedFromVerse.currentText()
verse_to = self.advancedToVerse.currentText()
book = self.advanced_book_combo_box.currentText()
book_ref_id = self.advanced_book_combo_box.itemData(int(self.advanced_book_combo_box.currentIndex()))
chapter_from = self.advanced_from_chapter.currentText()
chapter_to = self.advanced_to_chapter.currentText()
verse_from = self.advanced_from_verse.currentText()
verse_to = self.advanced_to_verse.currentText()
verse_separator = get_reference_separator('sep_v_display')
range_separator = get_reference_separator('sep_r_display')
verse_range = chapter_from + verse_separator + verse_from + range_separator + chapter_to + \
verse_separator + verse_to
versetext = '%s %s' % (book, verse_range)
verse_text = '%s %s' % (book, verse_range)
self.application.set_busy_cursor()
self.search_results = self.plugin.manager.get_verses(bible, versetext, book_ref_id)
self.search_results = self.plugin.manager.get_verses(bible, verse_text, book_ref_id)
if second_bible:
self.second_search_results = self.plugin.manager.get_verses(second_bible, versetext, book_ref_id)
self.second_search_results = self.plugin.manager.get_verses(second_bible, verse_text, book_ref_id)
if not self.advancedLockButton.isChecked():
self.list_view.clear()
if self.list_view.count() != 0:
self.__check_second_bible(bible, second_bible)
elif self.search_results:
self.displayResults(bible, second_bible)
self.display_results(bible, second_bible)
self.advancedSearchButton.setEnabled(True)
self.check_search_result()
self.application.set_normal_cursor()
def onQuickSearchButton(self):
def on_quick_search_button(self):
"""
Does a quick search and saves the search results. Quick search can
either be "Reference Search" or "Text Search".
@ -655,13 +643,13 @@ class BibleMediaItem(MediaManagerItem):
self.application.process_events()
bible = self.quickVersionComboBox.currentText()
second_bible = self.quickSecondComboBox.currentText()
text = self.quickSearchEdit.text()
if self.quickSearchEdit.current_search_type() == BibleSearch.Reference:
text = self.quick_search_edit.text()
if self.quick_search_edit.current_search_type() == BibleSearch.Reference:
# We are doing a 'Reference Search'.
self.search_results = self.plugin.manager.get_verses(bible, text)
if second_bible and self.search_results:
self.second_search_results = self.plugin.manager.get_verses(second_bible, text,
self.search_results[0].book.book_reference_id)
self.second_search_results = \
self.plugin.manager.get_verses(second_bible, text, self.search_results[0].book.book_reference_id)
else:
# We are doing a 'Text Search'.
self.application.set_busy_cursor()
@ -681,13 +669,13 @@ class BibleMediaItem(MediaManagerItem):
count += 1
continue
new_search_results.append(verse)
text.append((verse.book.book_reference_id, verse.chapter,
verse.verse, verse.verse))
text.append((verse.book.book_reference_id, verse.chapter, verse.verse, verse.verse))
if passage_not_found:
QtGui.QMessageBox.information(self, translate('BiblesPlugin.MediaItem', 'Information'),
QtGui.QMessageBox.information(
self, translate('BiblesPlugin.MediaItem', 'Information'),
translate('BiblesPlugin.MediaItem', 'The second Bible does not contain all the verses '
'that are in the main Bible. Only verses found in both Bibles will be shown. %d verses '
'have not been included in the results.') % count,
'that are in the main Bible. Only verses found in both Bibles will be shown. %d '
'verses have not been included in the results.') % count,
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
self.search_results = new_search_results
self.second_search_results = bibles[second_bible].get_verses(text)
@ -696,24 +684,24 @@ class BibleMediaItem(MediaManagerItem):
if self.list_view.count() != 0 and self.search_results:
self.__check_second_bible(bible, second_bible)
elif self.search_results:
self.displayResults(bible, second_bible)
self.display_results(bible, second_bible)
self.quickSearchButton.setEnabled(True)
self.check_search_result()
self.application.set_normal_cursor()
def displayResults(self, bible, second_bible=''):
def display_results(self, bible, second_bible=''):
"""
Displays the search results in the media manager. All data needed for
further action is saved for/in each row.
"""
items = self.buildDisplayResults(bible, second_bible, self.search_results)
items = self.build_display_results(bible, second_bible, self.search_results)
for bible_verse in items:
self.list_view.addItem(bible_verse)
self.list_view.selectAll()
self.search_results = {}
self.second_search_results = {}
def buildDisplayResults(self, bible, second_bible, search_results):
def build_display_results(self, bible, second_bible, search_results):
"""
Displays the search results in the media manager. All data needed for
further action is saved for/in each row.
@ -764,7 +752,7 @@ class BibleMediaItem(MediaManagerItem):
log.exception('The second_search_results does not have as many verses as the search_results.')
break
bible_text = '%s %d%s%d (%s, %s)' % (book, verse.chapter, verse_separator, verse.verse, version,
second_version)
second_version)
else:
bible_text = '%s %d%s%d (%s)' % (book, verse.chapter, verse_separator, verse.verse, version)
bible_verse = QtGui.QListWidgetItem(bible_text)
@ -772,11 +760,16 @@ class BibleMediaItem(MediaManagerItem):
items.append(bible_verse)
return items
def generate_slide_data(self, service_item, item=None, xmlVersion=False,
remote=False, context=ServiceItemContext.Service):
def generate_slide_data(self, service_item, item=None, xml_version=False, remote=False,
context=ServiceItemContext.Service):
"""
Generates and formats the slides for the service item as well as the
service item's title.
Generate the slide data. Needs to be implemented by the plugin.
:param service_item: The service item to be built on
:param item: The Song item to be used
:param xml_version: The xml version (not used)
:param remote: Triggered from remote
:param context: Why is it being generated
"""
log.debug('generating slide data')
if item:
@ -806,7 +799,7 @@ class BibleMediaItem(MediaManagerItem):
second_permissions = self._decode_qt_object(bitem, 'second_permissions')
second_text = self._decode_qt_object(bitem, 'second_text')
verses.add(book, chapter, verse, version, copyright, permissions)
verse_text = self.formatVerse(old_chapter, chapter, verse)
verse_text = self.format_verse(old_chapter, chapter, verse)
if second_bible:
bible_text = '%s%s\n\n%s&nbsp;%s' % (verse_text, text, verse_text, second_text)
raw_slides.append(bible_text.rstrip())
@ -825,8 +818,8 @@ class BibleMediaItem(MediaManagerItem):
bible_text = bible_text.strip(' ')
if not old_item:
start_item = bitem
elif self.checkTitle(bitem, old_item):
raw_title.append(self.formatTitle(start_item, old_item))
elif self.check_title(bitem, old_item):
raw_title.append(self.format_title(start_item, old_item))
start_item = bitem
old_item = bitem
old_chapter = chapter
@ -835,7 +828,7 @@ class BibleMediaItem(MediaManagerItem):
if second_bible:
verses.add_version(second_version, second_copyright, second_permissions)
service_item.raw_footer.append(verses.format_versions())
raw_title.append(self.formatTitle(start_item, bitem))
raw_title.append(self.format_title(start_item, bitem))
# If there are no more items we check whether we have to add bible_text.
if bible_text:
raw_slides.append(bible_text.lstrip())
@ -858,17 +851,14 @@ class BibleMediaItem(MediaManagerItem):
service_item.add_from_text(slide)
return True
def formatTitle(self, start_bitem, old_bitem):
def format_title(self, start_bitem, old_bitem):
"""
This method is called, when we have to change the title, because
we are at the end of a verse range. E. g. if we want to add
Genesis 1:1-6 as well as Daniel 2:14.
``start_item``
The first item of a range.
``old_item``
The last item of a range.
:param start_bitem: The first item of a range.
:param old_bitem: The last item of a range.
"""
verse_separator = get_reference_separator('sep_v_display')
range_separator = get_reference_separator('sep_r_display')
@ -893,17 +883,15 @@ class BibleMediaItem(MediaManagerItem):
range_separator + old_chapter + verse_separator + old_verse
return '%s %s (%s)' % (start_book, verse_range, bibles)
def checkTitle(self, bitem, old_bitem):
def check_title(self, bitem, old_bitem):
"""
This method checks if we are at the end of an verse range. If that is
the case, we return True, otherwise False. E. g. if we added
Genesis 1:1-6, but the next verse is Daniel 2:14, we return True.
``item``
The item we are dealing with at the moment.
``old_item``
The item we were previously dealing with.
:param bitem: The item we are dealing with at the moment.
:param old_bitem: The item we were previously dealing with.
"""
# Get all the necessary meta data.
book = self._decode_qt_object(bitem, 'book')
@ -930,22 +918,18 @@ class BibleMediaItem(MediaManagerItem):
return True
return False
def formatVerse(self, old_chapter, chapter, verse):
def format_verse(self, old_chapter, chapter, verse):
"""
Formats and returns the text, each verse starts with, for the given
chapter and verse. The text is either surrounded by round, square,
curly brackets or no brackets at all. For example::
u'{su}1:1{/su}'
``old_chapter``
The previous verse's chapter number (int).
``chapter``
The chapter number (int).
``verse``
The verse number (int).
:param old_chapter: The previous verse's chapter number (int).
:param chapter: The chapter number (int).
:param verse: The verse number (int).
"""
verse_separator = get_reference_separator('sep_v_display')
if not self.settings.is_verse_number_visible:
@ -969,16 +953,15 @@ class BibleMediaItem(MediaManagerItem):
bible = self.quickVersionComboBox.currentText()
search_results = self.plugin.manager.get_verses(bible, string, False, showError)
if search_results:
versetext = ' '.join([verse.text for verse in search_results])
return [[string, versetext]]
verse_text = ' '.join([verse.text for verse in search_results])
return [[string, verse_text]]
return []
def create_item_from_id(self, item_id):
"""
Create a media item from an item id.
"""
item = QtGui.QListWidgetItem()
bible = self.quickVersionComboBox.currentText()
search_results = self.plugin.manager.get_verses(bible, item_id, False)
items = self.buildDisplayResults(bible, '', search_results)
items = self.build_display_results(bible, '', search_results)
return items

View File

@ -55,8 +55,7 @@ class OpenSongBible(BibleDB):
"""
Recursively get all text in an objectify element and its child elements.
``element``
An objectify element to get the text from
:param element: An objectify element to get the text from
"""
verse_text = ''
if element.text:
@ -122,14 +121,16 @@ class OpenSongBible(BibleDB):
else:
verse_number += 1
self.create_verse(db_book.id, chapter_number, verse_number, self.get_text(verse))
self.wizard.increment_progress_bar(translate('BiblesPlugin.Opensong', 'Importing %s %s...',
'Importing <book name> <chapter>...')) % (db_book.name, chapter_number)
self.wizard.increment_progress_bar(
translate('BiblesPlugin.Opensong', 'Importing %s %s...',
'Importing <book name> <chapter>...')) % (db_book.name, chapter_number)
self.session.commit()
self.application.process_events()
except etree.XMLSyntaxError as inst:
critical_error_message_box(message=translate('BiblesPlugin.OpenSongImport',
'Incorrect Bible file type supplied. OpenSong Bibles may be '
'compressed. You must decompress them before import.'))
critical_error_message_box(
message=translate('BiblesPlugin.OpenSongImport',
'Incorrect Bible file type supplied. OpenSong Bibles may be '
'compressed. You must decompress them before import.'))
log.exception(inst)
success = False
except (IOError, AttributeError):

View File

@ -84,8 +84,8 @@ class OSISBible(BibleDB):
success = True
last_chapter = 0
match_count = 0
self.wizard.increment_progress_bar(translate('BiblesPlugin.OsisImport',
'Detecting encoding (this may take a few minutes)...'))
self.wizard.increment_progress_bar(
translate('BiblesPlugin.OsisImport', 'Detecting encoding (this may take a few minutes)...'))
try:
detect_file = open(self.filename, 'r')
details = chardet.detect(detect_file.read(1048576))
@ -101,7 +101,7 @@ class OSISBible(BibleDB):
osis = codecs.open(self.filename, 'r', details['encoding'])
repl = replacement
language_id = False
# Decide if the bible propably contains only NT or AT and NT or
# Decide if the bible probably contains only NT or AT and NT or
# AT, NT and Apocrypha
if lines_in_file < 11500:
book_count = 27
@ -154,10 +154,11 @@ class OSISBible(BibleDB):
if last_chapter != chapter:
if last_chapter != 0:
self.session.commit()
self.wizard.increment_progress_bar(translate('BiblesPlugin.OsisImport', 'Importing %s %s...',
'Importing <book name> <chapter>...') % (book_details['name'], chapter))
self.wizard.increment_progress_bar(
translate('BiblesPlugin.OsisImport', 'Importing %s %s...',
'Importing <book name> <chapter>...') % (book_details['name'], chapter))
last_chapter = chapter
# All of this rigmarol below is because the mod2osis tool from the Sword library embeds XML in the
# All of this rigmarole below is because the mod2osis tool from the Sword library embeds XML in the
# OSIS but neglects to enclose the verse text (with XML) in <[CDATA[ ]]> tags.
verse_text = self.note_regex.sub('', verse_text)
verse_text = self.title_regex.sub('', verse_text)

View File

@ -42,18 +42,15 @@ class VerseReferenceList(object):
def add(self, book, chapter, verse, version, copyright, permission):
self.add_version(version, copyright, permission)
if not self.verse_list or self.verse_list[self.current_index]['book'] != book:
self.verse_list.append({'version': version, 'book': book,
'chapter': chapter, 'start': verse, 'end': verse})
self.verse_list.append({'version': version, 'book': book, 'chapter': chapter, 'start': verse, 'end': verse})
self.current_index += 1
elif self.verse_list[self.current_index]['chapter'] != chapter:
self.verse_list.append({'version': version, 'book': book,
'chapter': chapter, 'start': verse, 'end': verse})
self.verse_list.append({'version': version, 'book': book, 'chapter': chapter, 'start': verse, 'end': verse})
self.current_index += 1
elif (self.verse_list[self.current_index]['end'] + 1) == verse:
self.verse_list[self.current_index]['end'] = verse
else:
self.verse_list.append({'version': version, 'book': book,
'chapter': chapter, 'start': verse, 'end': verse})
self.verse_list.append({'version': version, 'book': book, 'chapter': chapter, 'start': verse, 'end': verse})
self.current_index += 1
def add_version(self, version, copyright, permission):