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. Remove a particular element from the BeautifulSoup tree.
``parent`` :param parent: The element from which items need to be removed.
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.
``tag``
A string of the tab type, e.g. "div"
``class_``
An HTML class attribute for further qualification.
""" """
if class_: if class_:
all_tags = parent.find_all(tag, 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. Extract a verse (or part of a verse) from a tag.
``tag`` :param tag: The BeautifulSoup Tag element with the stuff we want.
The BeautifulSoup Tag element with the stuff we want.
""" """
if isinstance(tag, NavigableString): if isinstance(tag, NavigableString):
return None, str(tag) return None, str(tag)
@ -122,8 +116,7 @@ class BGExtract(object):
""" """
Remove all the rubbish from the HTML page. Remove all the rubbish from the HTML page.
``tag`` :param tag: The base tag within which we want to remove stuff.
The base tag within which we want to remove stuff.
""" """
self._remove_elements(tag, 'sup', 'crossreference') self._remove_elements(tag, 'sup', 'crossreference')
self._remove_elements(tag, 'sup', 'footnote') 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. Extract all the verses from a pre-prepared list of HTML tags.
``tags`` :param tags: A list of BeautifulSoup Tag elements.
A list of BeautifulSoup Tag elements.
""" """
verses = [] verses = []
tags = tags[::-1] 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 Use the old style of parsing for those Bibles on BG who mysteriously have not been migrated to the new (still
broken) HTML. broken) HTML.
``div`` :param div: The parent div.
The parent div.
""" """
verse_list = {} verse_list = {}
# Cater for inconsistent mark up in the first verse of a chapter. # 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. Access and decode Bibles via the BibleGateway website.
``version`` :param version: The version of the Bible like 31 for New International version.
The version of the Bible like 31 for New International version. :param book_name: Name of the Book.
:param chapter: Chapter number.
``book_name``
Name of the Book.
``chapter``
Chapter number.
""" """
log.debug('BGExtract.get_bible_chapter("%s", "%s", "%s")', version, book_name, chapter) log.debug('BGExtract.get_bible_chapter("%s", "%s", "%s")', version, book_name, chapter)
url_book_name = urllib.parse.quote(book_name.encode("utf-8")) 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): 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`` :param version: The version of the Bible like NIV for New International Version
The version of the Bible like NIV for New International Version
""" """
log.debug('BGExtract.get_books_from_http("%s")', version) log.debug('BGExtract.get_books_from_http("%s")', version)
url_params = urllib.parse.urlencode({'action': 'getVersionInfo', 'vid': '%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 Access and decode bibles via Bibleserver mobile website
``version`` :param version: The version of the bible like NIV for New International 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
``book_name``
Text name of bible book e.g. Genesis, 1. John, 1John or Offenbarung
``chapter``
Chapter number
""" """
log.debug('BSExtract.get_bible_chapter("%s", "%s", "%s")', version, book_name, chapter) log.debug('BSExtract.get_bible_chapter("%s", "%s", "%s")', version, book_name, chapter)
url_version = urllib.parse.quote(version.encode("utf-8")) 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. Load a list of all books a Bible contains from Bibleserver mobile website.
``version`` :param version: The version of the Bible like NIV for New International Version
The version of the Bible like NIV for New International Version
""" """
log.debug('BSExtract.get_books_from_http("%s")', version) log.debug('BSExtract.get_books_from_http("%s")', version)
url_version = urllib.parse.quote(version.encode("utf-8")) 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) soup = get_soup_for_bible_ref(chapter_url)
if not soup: if not soup:
return None return None
@ -408,14 +387,9 @@ class CWExtract(object):
""" """
Access and decode bibles via the Crosswalk website Access and decode bibles via the Crosswalk website
``version`` :param version: The version of the Bible like niv for New International 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
``book_name``
Text name of in english e.g. 'gen' for Genesis
``chapter``
Chapter number
""" """
log.debug('CWExtract.get_bible_chapter("%s", "%s", "%s")', version, book_name, chapter) log.debug('CWExtract.get_bible_chapter("%s", "%s", "%s")', version, book_name, chapter)
url_book_name = book_name.replace(' ', '-') 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. Load a list of all books a Bible contain from the Crosswalk website.
``version`` :param version: The version of the bible like NIV for New International Version
The version of the bible like NIV for New International Version
""" """
log.debug('CWExtract.get_books_from_http("%s")', 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) soup = get_soup_for_bible_ref(chapter_url)
if not soup: if not soup:
return None return None
@ -533,7 +506,8 @@ class HTTPBible(BibleDB):
failure. failure.
""" """
self.wizard.progress_bar.setMaximum(68) 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_source', self.download_source)
self.save_meta('download_name', self.download_name) self.save_meta('download_name', self.download_name)
if self.proxy_server: if self.proxy_server:
@ -552,8 +526,8 @@ class HTTPBible(BibleDB):
handler = BSExtract(self.proxy_server) handler = BSExtract(self.proxy_server)
books = handler.get_books_from_http(self.download_name) books = handler.get_books_from_http(self.download_name)
if not books: if not books:
log.error('Importing books from %s - download name: "%s" '\ log.error('Importing books from %s - download name: "%s" failed' %
'failed' % (self.download_source, self.download_name)) (self.download_source, self.download_name))
return False return False
self.wizard.progress_bar.setMaximum(len(books) + 2) self.wizard.progress_bar.setMaximum(len(books) + 2)
self.wizard.increment_progress_bar(translate( 'BiblesPlugin.HTTPBible', 'Registering Language...')) 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) 'BiblesPlugin.HTTPBible', 'Importing %s...', 'Importing <book name>...') % book)
book_ref_id = self.get_book_ref_id_by_name(book, len(books), language_id) book_ref_id = self.get_book_ref_id_by_name(book, len(books), language_id)
if not book_ref_id: if not book_ref_id:
log.error('Importing books from %s - download name: "%s" '\ log.error('Importing books from %s - download name: "%s" failed' %
'failed' % (self.download_source, self.download_name)) (self.download_source, self.download_name))
return False return False
book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
log.debug('Book details: Name:%s; id:%s; testament_id:%s', 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']) self.create_book(book, book_ref_id, book_details['testament_id'])
if self.stop_import_flag: if self.stop_import_flag:
return False return False
@ -612,7 +586,7 @@ class HTTPBible(BibleDB):
critical_error_message_box( critical_error_message_box(
translate('BiblesPlugin', 'No Book Found'), translate('BiblesPlugin', 'No Book Found'),
translate('BiblesPlugin', 'No matching book could be found in this Bible. Check that you have ' 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 [] return []
book = db_book.name book = db_book.name
if BibleDB.get_verse_count(self, book_id, reference[1]) == 0: 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. Return the number of chapters in a particular book.
``book`` :param book: The book object to get the chapter count for.
The book object to get the chapter count for.
""" """
log.debug('HTTPBible.get_chapter_count("%s")', book.name) log.debug('HTTPBible.get_chapter_count("%s")', book.name)
return BiblesResourcesDB.get_chapter_count(book.book_reference_id) 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. Return the number of verses for the specified chapter and book.
``book`` :param book_id: The name of the book.
The name of the book. :param chapter: The chapter whose verses are being counted.
``chapter``
The chapter whose verses are being counted.
""" """
log.debug('HTTPBible.get_verse_count("%s", %s)', book_id, chapter) log.debug('HTTPBible.get_verse_count("%s", %s)', book_id, chapter)
return BiblesResourcesDB.get_verse_count(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. Gets a webpage and returns a parsed and optionally cleaned soup or None.
``reference_url`` :param reference_url: The URL to obtain the soup from.
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
``header`` passing to BeautifulSoup for parsing.
An optional HTTP header to pass to the bible web server. :param pre_parse_substitute: The text to replace any matches to the regular expression with.
``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.
""" """
if not reference_url: if not reference_url:
return None return None
@ -742,9 +705,10 @@ def send_error_message(error_type):
critical_error_message_box( critical_error_message_box(
translate('BiblesPlugin.HTTPBible', 'Download Error'), translate('BiblesPlugin.HTTPBible', 'Download Error'),
translate('BiblesPlugin.HTTPBible', 'There was a problem downloading your verse selection. Please check ' 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': elif error_type == 'parse':
critical_error_message_box( critical_error_message_box(
translate('BiblesPlugin.HTTPBible', 'Parse Error'), translate('BiblesPlugin.HTTPBible', 'Parse Error'),
translate('BiblesPlugin.HTTPBible', 'There was a problem extracting your verse selection. If this 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 from .osis import OSISBible
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -57,7 +56,7 @@ class BibleFormat(object):
@staticmethod @staticmethod
def get_class(format): def get_class(format):
""" """
Return the appropriate imeplementation class. Return the appropriate implementation class.
``format`` ``format``
The Bible format. The Bible format.
@ -146,7 +145,7 @@ class BibleManager(object):
download_name = self.db_cache[name].get_object(BibleMeta, 'download_name').value download_name = self.db_cache[name].get_object(BibleMeta, 'download_name').value
meta_proxy = self.db_cache[name].get_object(BibleMeta, 'proxy_server') 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, 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: if meta_proxy:
web_bible.proxy_server = meta_proxy.value web_bible.proxy_server = meta_proxy.value
self.db_cache[name] = web_bible 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. Sets the reference to the dialog with the progress bar on it.
``dialog`` :param wizard: The reference to the import wizard.
The reference to the import wizard.
""" """
self.import_wizard = wizard self.import_wizard = wizard
@ -165,11 +163,8 @@ class BibleManager(object):
""" """
Register a bible in the bible cache, and then import the verses. Register a bible in the bible cache, and then import the verses.
``type`` :param type: What type of Bible, one of the ``BibleFormat`` values.
What type of Bible, one of the ``BibleFormat`` values. :param kwargs: Keyword arguments to send to the actual importer class.
``**kwargs``
Keyword arguments to send to the actual importer class.
""" """
class_ = BibleFormat.get_class(type) class_ = BibleFormat.get_class(type)
kwargs['path'] = self.path kwargs['path'] = self.path
@ -182,8 +177,7 @@ class BibleManager(object):
""" """
Delete a bible completely. Delete a bible completely.
``name`` :param name: The name of the bible.
The name of the bible.
""" """
log.debug('BibleManager.delete_bible("%s")', name) log.debug('BibleManager.delete_bible("%s")', name)
bible = self.db_cache[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. Returns a list of Bible books, and the number of chapters in that book.
``bible`` :param bible: Unicode. The Bible to get the list of books from.
Unicode. The Bible to get the list of books from.
""" """
log.debug('BibleManager.get_books("%s")', bible) log.debug('BibleManager.get_books("%s")', bible)
return [ return [
@ -219,11 +212,8 @@ class BibleManager(object):
""" """
Returns a book object by given id. Returns a book object by given id.
``bible`` :param bible: Unicode. The Bible to get the list of books from.
Unicode. The Bible to get the list of books from. :param id: Unicode. The book_reference_id to get the book for.
``id``
Unicode. The book_reference_id to get the book for.
""" """
log.debug('BibleManager.get_book_by_id("%s", "%s")', bible, id) log.debug('BibleManager.get_book_by_id("%s", "%s")', bible, id)
return self.db_cache[bible].get_book_by_book_ref_id(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. Returns the number of Chapters for a given book.
``bible`` :param bible: Unicode. The Bible to get the list of books from.
Unicode. The Bible to get the list of books from. :param book: The book object to get the chapter count for.
``book``
The book object to get the chapter count for.
""" """
log.debug('BibleManager.get_book_chapter_count ("%s", "%s")', bible, book.name) log.debug('BibleManager.get_book_chapter_count ("%s", "%s")', bible, book.name)
return self.db_cache[bible].get_chapter_count(book) return self.db_cache[bible].get_chapter_count(book)
def get_verse_count(self, bible, book, chapter): def get_verse_count(self, bible, book, chapter):
""" """
Returns all the number of verses for a given Returns all the number of verses for a given book and chapterMaxBibleBookVerses.
book and chapterMaxBibleBookVerses.
""" """
log.debug('BibleManager.get_verse_count("%s", "%s", %s)', log.debug('BibleManager.get_verse_count("%s", "%s", %s)', bible, book, chapter)
bible, book, chapter)
language_selection = self.get_language_selection(bible) language_selection = self.get_language_selection(bible)
book_ref_id = self.db_cache[bible].get_book_ref_id_by_localised_name(book, language_selection) 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) 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) 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) 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 Parses a scripture reference, fetches the verses from the Bible
specified, and returns a list of ``Verse`` objects. specified, and returns a list of ``Verse`` objects.
``bible`` :param bible: Unicode. The Bible to use.
Unicode. The Bible to use. :param verse_text:
Unicode. The scripture reference. Valid scripture references are:
``versetext``
Unicode. The scripture reference. Valid scripture references are:
- Genesis 1 - Genesis 1
- Genesis 1-2 - Genesis 1-2
@ -279,55 +262,53 @@ class BibleManager(object):
- Genesis 1:1-2:10 - Genesis 1:1-2:10
- Genesis 1:1-10,2:1-10 - Genesis 1:1-10,2:1-10
``book_ref_id`` :param book_ref_id: Unicode. The book reference id from the book in verse_text.
Unicode. The book referece id from the book in versetext.
For second bible this is necessary. 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 not bible:
if show_error: if show_error:
self.main_window.information_message( self.main_window.information_message(
translate('BiblesPlugin.BibleManager', 'No Bibles Available'), translate('BiblesPlugin.BibleManager', 'No Bibles Available'),
translate('BiblesPlugin.BibleManager', translate('BiblesPlugin.BibleManager', 'There are no Bibles currently installed. Please use the '
'There are no Bibles currently installed. Please use the ' 'Import Wizard to install one or more Bibles.')
'Import Wizard to install one or more Bibles.') )
)
return None return None
language_selection = self.get_language_selection(bible) language_selection = self.get_language_selection(bible)
reflist = parse_reference(versetext, self.db_cache[bible], reflist = parse_reference(verse_text, self.db_cache[bible], language_selection, book_ref_id)
language_selection, book_ref_id)
if reflist: if reflist:
return self.db_cache[bible].get_verses(reflist, show_error) return self.db_cache[bible].get_verses(reflist, show_error)
else: else:
if show_error: if show_error:
reference_seperators = { reference_separators = {
'verse': get_reference_separator('sep_v_display'), 'verse': get_reference_separator('sep_v_display'),
'range': get_reference_separator('sep_r_display'), 'range': get_reference_separator('sep_r_display'),
'list': get_reference_separator('sep_l_display')} 'list': get_reference_separator('sep_l_display')}
self.main_window.information_message( self.main_window.information_message(
translate('BiblesPlugin.BibleManager', 'Scripture Reference Error'), translate('BiblesPlugin.BibleManager', 'Scripture Reference Error'),
translate('BiblesPlugin.BibleManager', 'Your scripture reference is either not supported by ' translate('BiblesPlugin.BibleManager', 'Your scripture reference is either not supported by '
'OpenLP or is invalid. Please make sure your reference ' 'OpenLP or is invalid. Please make sure your reference '
'conforms to one of the following patterns or consult the manual:\n\n' 'conforms to one of the following patterns or consult the manual:\n\n'
'Book Chapter\n' 'Book Chapter\n'
'Book Chapter%(range)sChapter\n' 'Book Chapter%(range)sChapter\n'
'Book Chapter%(verse)sVerse%(range)sVerse\n' 'Book Chapter%(verse)sVerse%(range)sVerse\n'
'Book Chapter%(verse)sVerse%(range)sVerse%(list)sVerse' 'Book Chapter%(verse)sVerse%(range)sVerse%(list)sVerse'
'%(range)sVerse\n' '%(range)sVerse\n'
'Book Chapter%(verse)sVerse%(range)sVerse%(list)sChapter' 'Book Chapter%(verse)sVerse%(range)sVerse%(list)sChapter'
'%(verse)sVerse%(range)sVerse\n' '%(verse)sVerse%(range)sVerse\n'
'Book Chapter%(verse)sVerse%(range)sChapter%(verse)sVerse', 'Book Chapter%(verse)sVerse%(range)sChapter%(verse)sVerse',
'Please pay attention to the appended "s" of the wildcards ' 'Please pay attention to the appended "s" of the wildcards '
'and refrain from translating the words inside the names in the brackets.') % reference_seperators 'and refrain from translating the words inside the names in the brackets.')
) % reference_separators
)
return None return None
def get_language_selection(self, bible): def get_language_selection(self, bible):
""" """
Returns the language selection of a bible. Returns the language selection of a bible.
``bible`` :param bible: Unicode. The Bible to get the language selection from.
Unicode. The Bible to get the language selection from.
""" """
log.debug('BibleManager.get_language_selection("%s")', bible) log.debug('BibleManager.get_language_selection("%s")', bible)
language_selection = self.get_meta_data(bible, 'book_name_language') 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. Does a verse search for the given bible and text.
``bible`` :param bible: The bible to search in (unicode).
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).
``second_bible``
The second bible (unicode). We do not search in this bible.
``text``
The text to search for (unicode).
""" """
log.debug('BibleManager.verse_search("%s", "%s")', bible, text) log.debug('BibleManager.verse_search("%s", "%s")', bible, text)
if not bible: if not bible:
self.main_window.information_message( self.main_window.information_message(
translate('BiblesPlugin.BibleManager', 'No Bibles Available'), translate('BiblesPlugin.BibleManager', 'No Bibles Available'),
translate('BiblesPlugin.BibleManager', translate('BiblesPlugin.BibleManager',
'There are no Bibles currently installed. Please use the Import Wizard to install one or more' 'There are no Bibles currently installed. Please use the Import Wizard to install one or '
' Bibles.') 'more Bibles.')
) )
return None return None
# Check if the bible or second_bible is a web bible. # 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 = '' second_webbible = ''
if second_bible: if second_bible:
second_webbible = self.db_cache[second_bible].get_object(BibleMeta, 'download_source') 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( self.main_window.information_message(
translate('BiblesPlugin.BibleManager', 'Web Bible cannot be used'), translate('BiblesPlugin.BibleManager', 'Web Bible cannot be used'),
translate('BiblesPlugin.BibleManager', 'Text Search is not available with Web Bibles.') translate('BiblesPlugin.BibleManager', 'Text Search is not available with Web Bibles.')
) )
return None return None
if text: if text:
return self.db_cache[bible].verse_search(text) return self.db_cache[bible].verse_search(text)
@ -382,23 +358,20 @@ class BibleManager(object):
self.main_window.information_message( self.main_window.information_message(
translate('BiblesPlugin.BibleManager', 'Scripture Reference Error'), translate('BiblesPlugin.BibleManager', 'Scripture Reference Error'),
translate('BiblesPlugin.BibleManager', 'You did not enter a search keyword.\nYou can separate ' 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 ' '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.') 'them by a comma to search for one of them.')
) )
return None return None
def save_meta_data(self, bible, version, copyright, permissions, def save_meta_data(self, bible, version, copyright, permissions, book_name_language=None):
book_name_language=None):
""" """
Saves the bibles meta data. Saves the bibles meta data.
""" """
log.debug('save_meta data %s, %s, %s, %s', log.debug('save_meta data %s, %s, %s, %s', bible, version, copyright, permissions)
bible, version, copyright, permissions)
self.db_cache[bible].save_meta('name', version) self.db_cache[bible].save_meta('name', version)
self.db_cache[bible].save_meta('copyright', copyright) self.db_cache[bible].save_meta('copyright', copyright)
self.db_cache[bible].save_meta('permissions', permissions) self.db_cache[bible].save_meta('permissions', permissions)
self.db_cache[bible].save_meta('book_name_language', self.db_cache[bible].save_meta('book_name_language', book_name_language)
book_name_language)
def get_meta_data(self, bible, key): def get_meta_data(self, bible, key):
""" """

View File

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

View File

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

View File

@ -84,8 +84,8 @@ class OSISBible(BibleDB):
success = True success = True
last_chapter = 0 last_chapter = 0
match_count = 0 match_count = 0
self.wizard.increment_progress_bar(translate('BiblesPlugin.OsisImport', self.wizard.increment_progress_bar(
'Detecting encoding (this may take a few minutes)...')) translate('BiblesPlugin.OsisImport', 'Detecting encoding (this may take a few minutes)...'))
try: try:
detect_file = open(self.filename, 'r') detect_file = open(self.filename, 'r')
details = chardet.detect(detect_file.read(1048576)) details = chardet.detect(detect_file.read(1048576))
@ -101,7 +101,7 @@ class OSISBible(BibleDB):
osis = codecs.open(self.filename, 'r', details['encoding']) osis = codecs.open(self.filename, 'r', details['encoding'])
repl = replacement repl = replacement
language_id = False 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 # AT, NT and Apocrypha
if lines_in_file < 11500: if lines_in_file < 11500:
book_count = 27 book_count = 27
@ -154,10 +154,11 @@ class OSISBible(BibleDB):
if last_chapter != chapter: if last_chapter != chapter:
if last_chapter != 0: if last_chapter != 0:
self.session.commit() self.session.commit()
self.wizard.increment_progress_bar(translate('BiblesPlugin.OsisImport', 'Importing %s %s...', self.wizard.increment_progress_bar(
'Importing <book name> <chapter>...') % (book_details['name'], chapter)) translate('BiblesPlugin.OsisImport', 'Importing %s %s...',
'Importing <book name> <chapter>...') % (book_details['name'], chapter))
last_chapter = 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. # OSIS but neglects to enclose the verse text (with XML) in <[CDATA[ ]]> tags.
verse_text = self.note_regex.sub('', verse_text) verse_text = self.note_regex.sub('', verse_text)
verse_text = self.title_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): def add(self, book, chapter, verse, version, copyright, permission):
self.add_version(version, copyright, permission) self.add_version(version, copyright, permission)
if not self.verse_list or self.verse_list[self.current_index]['book'] != book: if not self.verse_list or self.verse_list[self.current_index]['book'] != book:
self.verse_list.append({'version': version, 'book': book, self.verse_list.append({'version': version, 'book': book, 'chapter': chapter, 'start': verse, 'end': verse})
'chapter': chapter, 'start': verse, 'end': verse})
self.current_index += 1 self.current_index += 1
elif self.verse_list[self.current_index]['chapter'] != chapter: elif self.verse_list[self.current_index]['chapter'] != chapter:
self.verse_list.append({'version': version, 'book': book, self.verse_list.append({'version': version, 'book': book, 'chapter': chapter, 'start': verse, 'end': verse})
'chapter': chapter, 'start': verse, 'end': verse})
self.current_index += 1 self.current_index += 1
elif (self.verse_list[self.current_index]['end'] + 1) == verse: elif (self.verse_list[self.current_index]['end'] + 1) == verse:
self.verse_list[self.current_index]['end'] = verse self.verse_list[self.current_index]['end'] = verse
else: else:
self.verse_list.append({'version': version, 'book': book, self.verse_list.append({'version': version, 'book': book, 'chapter': chapter, 'start': verse, 'end': verse})
'chapter': chapter, 'start': verse, 'end': verse})
self.current_index += 1 self.current_index += 1
def add_version(self, version, copyright, permission): def add_version(self, version, copyright, permission):