forked from openlp/openlp
Rewritten openlp.plugins.bibles.lib.parse_reference() function.
Localization of bible reference separators. Non-breaking space between verse numbers and verse text. Web-Import from bibleserver.com Replaced commas in title strings of biblegateway.csv => completely updated the file Two known issues: The localized separators are still hard coded and need GUI configuration. Not all of the new bibles are full usable, because OpenLP has still unlocalized code for the book names (applies also to other bible imports like OSIS). bzr-revno: 1152
This commit is contained in:
commit
347d772143
|
@ -43,10 +43,12 @@ class WebDownload(object):
|
||||||
Unknown = -1
|
Unknown = -1
|
||||||
Crosswalk = 0
|
Crosswalk = 0
|
||||||
BibleGateway = 1
|
BibleGateway = 1
|
||||||
|
Bibleserver = 2
|
||||||
|
|
||||||
Names = {
|
Names = {
|
||||||
0: u'Crosswalk',
|
0: u'Crosswalk',
|
||||||
1: u'BibleGateway'
|
1: u'BibleGateway',
|
||||||
|
2: u'Bibleserver'
|
||||||
}
|
}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -232,8 +234,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard):
|
||||||
The index of the combo box.
|
The index of the combo box.
|
||||||
"""
|
"""
|
||||||
self.bibleComboBox.clear()
|
self.bibleComboBox.clear()
|
||||||
bibles = [unicode(translate('BiblesPlugin.ImportWizardForm', bible)) for
|
bibles = self.web_bible_list[index].keys()
|
||||||
bible in self.web_bible_list[index].keys()]
|
|
||||||
bibles.sort()
|
bibles.sort()
|
||||||
for bible in bibles:
|
for bible in bibles:
|
||||||
self.bibleComboBox.addItem(bible)
|
self.bibleComboBox.addItem(bible)
|
||||||
|
@ -338,31 +339,27 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard):
|
||||||
"""
|
"""
|
||||||
Load the list of Crosswalk and BibleGateway bibles.
|
Load the list of Crosswalk and BibleGateway bibles.
|
||||||
"""
|
"""
|
||||||
# Load and store Crosswalk Bibles.
|
# Load Crosswalk Bibles.
|
||||||
filepath = AppLocation.get_directory(AppLocation.PluginsDir)
|
filepath = AppLocation.get_directory(AppLocation.PluginsDir)
|
||||||
filepath = os.path.join(filepath, u'bibles', u'resources')
|
filepath = os.path.join(filepath, u'bibles', u'resources')
|
||||||
books_file = None
|
books_file = None
|
||||||
try:
|
try:
|
||||||
self.web_bible_list[WebDownload.Crosswalk] = {}
|
self.web_bible_list[WebDownload.Crosswalk] = {}
|
||||||
books_file = open(
|
books_file = open(
|
||||||
os.path.join(filepath, u'crosswalkbooks.csv'), 'r')
|
os.path.join(filepath, u'crosswalkbooks.csv'), 'rb')
|
||||||
dialect = csv.Sniffer().sniff(books_file.read(1024))
|
dialect = csv.Sniffer().sniff(books_file.read(1024))
|
||||||
books_file.seek(0)
|
books_file.seek(0)
|
||||||
books_reader = csv.reader(books_file, dialect)
|
books_reader = csv.reader(books_file, dialect)
|
||||||
for line in books_reader:
|
for line in books_reader:
|
||||||
ver = line[0]
|
ver = unicode(line[0], u'utf-8')
|
||||||
name = line[1]
|
name = unicode(line[1], u'utf-8')
|
||||||
if not isinstance(ver, unicode):
|
|
||||||
ver = unicode(ver, u'utf8')
|
|
||||||
if not isinstance(name, unicode):
|
|
||||||
name = unicode(name, u'utf8')
|
|
||||||
self.web_bible_list[WebDownload.Crosswalk][ver] = name.strip()
|
self.web_bible_list[WebDownload.Crosswalk][ver] = name.strip()
|
||||||
except IOError:
|
except IOError:
|
||||||
log.exception(u'Crosswalk resources missing')
|
log.exception(u'Crosswalk resources missing')
|
||||||
finally:
|
finally:
|
||||||
if books_file:
|
if books_file:
|
||||||
books_file.close()
|
books_file.close()
|
||||||
# Load and store BibleGateway Bibles.
|
# Load BibleGateway Bibles.
|
||||||
books_file = None
|
books_file = None
|
||||||
try:
|
try:
|
||||||
self.web_bible_list[WebDownload.BibleGateway] = {}
|
self.web_bible_list[WebDownload.BibleGateway] = {}
|
||||||
|
@ -384,6 +381,26 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard):
|
||||||
finally:
|
finally:
|
||||||
if books_file:
|
if books_file:
|
||||||
books_file.close()
|
books_file.close()
|
||||||
|
# Load and Bibleserver Bibles.
|
||||||
|
filepath = AppLocation.get_directory(AppLocation.PluginsDir)
|
||||||
|
filepath = os.path.join(filepath, u'bibles', u'resources')
|
||||||
|
books_file = None
|
||||||
|
try:
|
||||||
|
self.web_bible_list[WebDownload.Bibleserver] = {}
|
||||||
|
books_file = open(
|
||||||
|
os.path.join(filepath, u'bibleserver.csv'), 'rb')
|
||||||
|
dialect = csv.Sniffer().sniff(books_file.read(1024))
|
||||||
|
books_file.seek(0)
|
||||||
|
books_reader = csv.reader(books_file, dialect)
|
||||||
|
for line in books_reader:
|
||||||
|
ver = unicode(line[0], u'utf-8')
|
||||||
|
name = unicode(line[1], u'utf-8')
|
||||||
|
self.web_bible_list[WebDownload.Bibleserver][ver] = name.strip()
|
||||||
|
except IOError, UnicodeError:
|
||||||
|
log.exception(u'Bibleserver resources missing')
|
||||||
|
finally:
|
||||||
|
if books_file:
|
||||||
|
books_file.close()
|
||||||
|
|
||||||
def getFileName(self, title, editbox):
|
def getFileName(self, title, editbox):
|
||||||
filename = QtGui.QFileDialog.getOpenFileName(self, title,
|
filename = QtGui.QFileDialog.getOpenFileName(self, title,
|
||||||
|
@ -457,6 +474,9 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard):
|
||||||
elif download_location == WebDownload.BibleGateway:
|
elif download_location == WebDownload.BibleGateway:
|
||||||
bible = \
|
bible = \
|
||||||
self.web_bible_list[WebDownload.BibleGateway][bible_version]
|
self.web_bible_list[WebDownload.BibleGateway][bible_version]
|
||||||
|
elif download_location == WebDownload.Bibleserver:
|
||||||
|
bible = \
|
||||||
|
self.web_bible_list[WebDownload.Bibleserver][bible_version]
|
||||||
importer = self.manager.import_bible(
|
importer = self.manager.import_bible(
|
||||||
BibleFormat.WebDownload,
|
BibleFormat.WebDownload,
|
||||||
name=license_version,
|
name=license_version,
|
||||||
|
|
|
@ -208,6 +208,7 @@ class Ui_BibleImportWizard(object):
|
||||||
self.locationComboBox.setObjectName(u'LocationComboBox')
|
self.locationComboBox.setObjectName(u'LocationComboBox')
|
||||||
self.locationComboBox.addItem(u'')
|
self.locationComboBox.addItem(u'')
|
||||||
self.locationComboBox.addItem(u'')
|
self.locationComboBox.addItem(u'')
|
||||||
|
self.locationComboBox.addItem(u'')
|
||||||
self.downloadOptionsLayout.setWidget(0, QtGui.QFormLayout.FieldRole,
|
self.downloadOptionsLayout.setWidget(0, QtGui.QFormLayout.FieldRole,
|
||||||
self.locationComboBox)
|
self.locationComboBox)
|
||||||
self.bibleLabel = QtGui.QLabel(self.downloadOptionsTab)
|
self.bibleLabel = QtGui.QLabel(self.downloadOptionsTab)
|
||||||
|
@ -388,6 +389,8 @@ class Ui_BibleImportWizard(object):
|
||||||
translate('BiblesPlugin.ImportWizardForm', 'Crosswalk'))
|
translate('BiblesPlugin.ImportWizardForm', 'Crosswalk'))
|
||||||
self.locationComboBox.setItemText(1,
|
self.locationComboBox.setItemText(1,
|
||||||
translate('BiblesPlugin.ImportWizardForm', 'BibleGateway'))
|
translate('BiblesPlugin.ImportWizardForm', 'BibleGateway'))
|
||||||
|
self.locationComboBox.setItemText(2,
|
||||||
|
translate('BiblesPlugin.ImportWizardForm', 'Bibleserver'))
|
||||||
self.bibleLabel.setText(
|
self.bibleLabel.setText(
|
||||||
translate('BiblesPlugin.ImportWizardForm', 'Bible:'))
|
translate('BiblesPlugin.ImportWizardForm', 'Bible:'))
|
||||||
self.webDownloadTabWidget.setTabText(
|
self.webDownloadTabWidget.setTabText(
|
||||||
|
|
|
@ -32,134 +32,164 @@ import re
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
BIBLE_REFERENCE = re.compile(
|
def get_reference_match(match_type):
|
||||||
r'^([\w ]+?) *([0-9]+)' # Initial book and chapter
|
local_separator = unicode(u':;;\s*[:vV]\s*;;-;;\s*-\s*;;,;;\s*,\s*;;end'
|
||||||
r'(?: *[:|v|V] *([0-9]+))?' # Verse for first chapter
|
).split(u';;') # English
|
||||||
r'(?: *- *([0-9]+|end$))?' # Range for verses or chapters
|
# local_separator = unicode(u',;;\s*,\s*;;-;;\s*-\s*;;.;;\.;;[Ee]nde'
|
||||||
r'(?:(?:,([0-9]+))?' # Second chapter
|
# ).split(u';;') # German
|
||||||
r' *[,|:|v|V] *([0-9]+|end$)' # More range for verses or chapters
|
separators = {
|
||||||
r'(?: *- *([0-9]+|end$))?)?$', # End of second verse range
|
u'sep_v_display': local_separator[0], u'sep_v': local_separator[1],
|
||||||
re.UNICODE)
|
u'sep_r_display': local_separator[2], u'sep_r': local_separator[3],
|
||||||
|
u'sep_l_display': local_separator[4], u'sep_l': local_separator[5],
|
||||||
|
u'sep_e': local_separator[6]}
|
||||||
|
|
||||||
def check_end(match_group):
|
# verse range match: (<chapter>:)?<verse>(-((<chapter>:)?<verse>|end)?)?
|
||||||
"""
|
range_string = str(r'(?:(?P<from_chapter>[0-9]+)%(sep_v)s)?(?P<from_verse>'
|
||||||
Check if a regular expression match group contains the text u'end' or
|
r'[0-9]+)(?P<range_to>%(sep_r)s(?:(?:(?P<to_chapter>[0-9]+)%(sep_v)s)?'
|
||||||
should be converted to an int.
|
r'(?P<to_verse>[0-9]+)|%(sep_e)s)?)?') % separators
|
||||||
|
if match_type == u'range':
|
||||||
``match_group``
|
return re.compile(r'^\s*' + range_string + r'\s*$', re.UNICODE)
|
||||||
The match group to check.
|
elif match_type == u'range_separator':
|
||||||
"""
|
return re.compile(separators[u'sep_l'])
|
||||||
if match_group == u'end':
|
elif match_type == u'full':
|
||||||
return -1
|
# full reference match: <book>(<range>(,|(?=$)))+
|
||||||
|
return re.compile(str(r'^\s*(?!\s)(?P<book>[\d]*[^\d]+)(?<!\s)\s*'
|
||||||
|
r'(?P<ranges>(?:' + range_string + r'(?:%(sep_l)s|(?=\s*$)))+)\s*$')
|
||||||
|
% separators, re.UNICODE)
|
||||||
else:
|
else:
|
||||||
return int(match_group)
|
return separators[match_type]
|
||||||
|
|
||||||
def parse_reference(reference):
|
def parse_reference(reference):
|
||||||
"""
|
"""
|
||||||
This is the über-awesome function that takes a person's typed in string
|
This is the next generation über-awesome function that takes a person's
|
||||||
and converts it to a reference list, a list of references to be queried
|
typed in string and converts it to a reference list, a list of references to
|
||||||
from the Bible database files.
|
be queried from the Bible database files.
|
||||||
|
|
||||||
The ``BIBLE_REFERENCE`` constant regular expression produces the following
|
This is a user manual like description, how the references are working.
|
||||||
match groups:
|
|
||||||
|
|
||||||
0. (match string)
|
- Each reference starts with the book name. A chapter name is manditory.
|
||||||
This is a special group consisting of the whole string that matched.
|
``John 3`` refers to Gospel of John chapter 3
|
||||||
1. ``[\w ]+``
|
- A reference range can be given after a range separator.
|
||||||
The book the reference is from.
|
``John 3-5`` refers to John chapters 3 to 5
|
||||||
2. ``[0-9]+``
|
- Single verses can be addressed after a verse separator
|
||||||
The first (or only) chapter in the reference.
|
``John 3:16`` refers to John chapter 3 verse 16
|
||||||
3. ``None`` or ``[0-9]+``
|
``John 3:16-4:3`` refers to John chapter 3 verse 16 to chapter 4 verse 3
|
||||||
``None``, or the only verse, or the first verse in a verse range or,
|
- After a verse reference all further single values are treat as verse in
|
||||||
the start verse in a chapter range.
|
the last selected chapter.
|
||||||
4. ``None`` or ``[0-9]+`` or ``end``
|
``John 3:16-18`` refers to John chapter 3 verses 16 to 18
|
||||||
``None``, or the end verse of the first verse range, or the end chapter
|
- After a list separator it is possible to refer to additional verses. They
|
||||||
of a chapter range.
|
are build analog to the first ones. This way it is possible to define each
|
||||||
5. ``None`` or ``[0-9]+``
|
number of verse references. It is not possible to refer to verses in
|
||||||
``None``, or the second chapter in multiple (non-ranged) chapters.
|
additional books.
|
||||||
6. ``None`` or ``[0-9]+`` or ``end``
|
``John 3:16,18`` refers to John chapter 3 verses 16 and 18
|
||||||
``None``, the start of the second verse range. or the end of a chapter
|
``John 3:16-18,20`` refers to John chapter 3 verses 16 to 18 and 20
|
||||||
range.
|
``John 3:16-18,4:1`` refers to John chapter 3 verses 16 to 18 and
|
||||||
7. ``None`` or ``[0-9]+`` or ``end``
|
chapter 3 verse 1
|
||||||
``None``, or the end of the second verse range.
|
- If there is a range separator without further verse declaration the last
|
||||||
|
refered chapter is addressed until the end.
|
||||||
|
|
||||||
|
``range_string`` is a regular expression which matches for verse range
|
||||||
|
declarations:
|
||||||
|
|
||||||
|
1. ``(?:(?P<from_chapter>[0-9]+)%(sep_v)s)?'
|
||||||
|
It starts with a optional chapter reference ``from_chapter`` followed by
|
||||||
|
a verse separator.
|
||||||
|
2. ``(?P<from_verse>[0-9]+)``
|
||||||
|
The verse reference ``from_verse`` is manditory
|
||||||
|
3. ``(?P<range_to>%(sep_r)s(?:`` ... ``|%(sep_e)s)?)?``
|
||||||
|
A ``range_to`` declaration is optional. It starts with a range separator
|
||||||
|
and contains optional a chapter and verse declaration or a end
|
||||||
|
separator.
|
||||||
|
4. ``(?:(?P<to_chapter>[0-9]+)%(sep_v)s)?``
|
||||||
|
The ``to_chapter`` reference with separator is equivalent to group 1.
|
||||||
|
5. ``(?P<to_verse>[0-9]+)``
|
||||||
|
The ``to_verse`` reference is equivalent to group 2.
|
||||||
|
|
||||||
|
The full reference is matched against get_reference_match(u'full'). This
|
||||||
|
regular expression looks like this:
|
||||||
|
|
||||||
|
1. ``^\s*(?!\s)(?P<book>[\d]*[^\d]+)(?<!\s)\s*``
|
||||||
|
The ``book`` group starts with the first non-whitespace character. There
|
||||||
|
are optional leading digits followed by non-digits. The group ends
|
||||||
|
before the whitspace in front of the next digit.
|
||||||
|
2. ``(?P<ranges>(?:`` + range_string + ``(?:%(sep_l)s|(?=\s*$)))+)\s*$``
|
||||||
|
The second group contains all ``ranges``. This can be multiple
|
||||||
|
declarations of a range_string separated by a list separator.
|
||||||
|
|
||||||
The reference list is a list of tuples, with each tuple structured like
|
The reference list is a list of tuples, with each tuple structured like
|
||||||
this::
|
this::
|
||||||
|
|
||||||
(book, chapter, start_verse, end_verse)
|
(book, chapter, from_verse, to_verse)
|
||||||
|
|
||||||
``reference``
|
``reference``
|
||||||
The bible reference to parse.
|
The bible reference to parse.
|
||||||
|
|
||||||
Returns None or a reference list.
|
Returns None or a reference list.
|
||||||
"""
|
"""
|
||||||
reference = reference.strip()
|
|
||||||
log.debug('parse_reference("%s")', reference)
|
log.debug('parse_reference("%s")', reference)
|
||||||
unified_ref_list = []
|
match = get_reference_match(u'full').match(reference)
|
||||||
match = BIBLE_REFERENCE.match(reference)
|
|
||||||
if match:
|
if match:
|
||||||
log.debug(u'Matched reference %s' % reference)
|
log.debug(u'Matched reference %s' % reference)
|
||||||
book = match.group(1)
|
book = match.group(u'book')
|
||||||
chapter = int(match.group(2))
|
ranges = match.group(u'ranges')
|
||||||
if match.group(7):
|
range_list = get_reference_match(u'range_separator').split(ranges)
|
||||||
# Two verse ranges
|
ref_list = []
|
||||||
vr1_start = int(match.group(3))
|
chapter = None
|
||||||
vr1_end = int(match.group(4))
|
for this_range in range_list:
|
||||||
unified_ref_list.append((book, chapter, vr1_start, vr1_end))
|
range_match = get_reference_match(u'range').match(this_range)
|
||||||
vr2_start = int(match.group(6))
|
from_chapter = range_match.group(u'from_chapter')
|
||||||
vr2_end = check_end(match.group(7))
|
from_verse = range_match.group(u'from_verse')
|
||||||
if match.group(5):
|
has_range = range_match.group(u'range_to')
|
||||||
# One verse range per chapter
|
to_chapter = range_match.group(u'to_chapter')
|
||||||
chapter2 = int(match.group(5))
|
to_verse = range_match.group(u'to_verse')
|
||||||
unified_ref_list.append((book, chapter2, vr2_start, vr2_end))
|
if from_chapter:
|
||||||
|
from_chapter = int(from_chapter)
|
||||||
|
if from_verse:
|
||||||
|
from_verse = int(from_verse)
|
||||||
|
if to_chapter:
|
||||||
|
to_chapter = int(to_chapter)
|
||||||
|
if to_verse:
|
||||||
|
to_verse = int(to_verse)
|
||||||
|
# Fill chapter fields with reasonable values.
|
||||||
|
if from_chapter:
|
||||||
|
chapter = from_chapter
|
||||||
|
elif chapter:
|
||||||
|
from_chapter = chapter
|
||||||
else:
|
else:
|
||||||
unified_ref_list.append((book, chapter, vr2_start, vr2_end))
|
from_chapter = from_verse
|
||||||
elif match.group(6):
|
from_verse = None
|
||||||
# Chapter range with verses
|
if to_chapter:
|
||||||
if match.group(3):
|
if to_chapter < from_chapter:
|
||||||
vr1_start = int(match.group(3))
|
continue
|
||||||
else:
|
|
||||||
vr1_start = 1
|
|
||||||
if match.group(2) == match.group(4):
|
|
||||||
vr1_end = int(match.group(6))
|
|
||||||
unified_ref_list.append((book, chapter, vr1_start, vr1_end))
|
|
||||||
else:
|
|
||||||
vr1_end = -1
|
|
||||||
unified_ref_list.append((book, chapter, vr1_start, vr1_end))
|
|
||||||
vr2_end = check_end(match.group(6))
|
|
||||||
if int(match.group(4)) > chapter:
|
|
||||||
for i in range(chapter + 1, int(match.group(4)) + 1):
|
|
||||||
if i == int(match.group(4)):
|
|
||||||
unified_ref_list.append((book, i, 1, vr2_end))
|
|
||||||
else:
|
|
||||||
unified_ref_list.append((book, i, 1, -1))
|
|
||||||
elif match.group(4):
|
|
||||||
# Chapter range or chapter and verse range
|
|
||||||
if match.group(3):
|
|
||||||
vr1_start = int(match.group(3))
|
|
||||||
vr1_end = check_end(match.group(4))
|
|
||||||
if vr1_end == -1 or vr1_end > vr1_start:
|
|
||||||
unified_ref_list.append((book, chapter, vr1_start, vr1_end))
|
|
||||||
else:
|
else:
|
||||||
log.debug(u'Ambiguous reference: %s' % reference)
|
chapter = to_chapter
|
||||||
return None
|
elif to_verse:
|
||||||
elif match.group(4) != u'end':
|
if chapter:
|
||||||
for i in range(chapter, int(match.group(4)) + 1):
|
to_chapter = chapter
|
||||||
unified_ref_list.append((book, i, 1, -1))
|
else:
|
||||||
|
to_chapter = to_verse
|
||||||
|
to_verse = None
|
||||||
|
# Append references to the list
|
||||||
|
if has_range:
|
||||||
|
if not from_verse:
|
||||||
|
from_verse = 1
|
||||||
|
if not to_verse:
|
||||||
|
to_verse = -1
|
||||||
|
if to_chapter > from_chapter:
|
||||||
|
ref_list.append((book, from_chapter, from_verse, -1))
|
||||||
|
for i in range(from_chapter + 1, to_chapter - 1):
|
||||||
|
ref_list.append((book, i, 1, -1))
|
||||||
|
ref_list.append((book, to_chapter, 1, to_verse))
|
||||||
|
elif to_verse >= from_verse or to_verse == -1:
|
||||||
|
ref_list.append((book, from_chapter, from_verse, to_verse))
|
||||||
|
elif from_verse:
|
||||||
|
ref_list.append((book, from_chapter, from_verse, from_verse))
|
||||||
else:
|
else:
|
||||||
log.debug(u'Unsupported reference: %s' % reference)
|
ref_list.append((book, from_chapter, 1, -1))
|
||||||
return None
|
return ref_list
|
||||||
elif match.group(3):
|
|
||||||
# Single chapter and verse
|
|
||||||
verse = int(match.group(3))
|
|
||||||
unified_ref_list.append((book, chapter, verse, verse))
|
|
||||||
else:
|
|
||||||
# Single chapter
|
|
||||||
unified_ref_list.append((book, chapter, -1, -1))
|
|
||||||
else:
|
else:
|
||||||
log.debug(u'Invalid reference: %s' % reference)
|
log.debug(u'Invalid reference: %s' % reference)
|
||||||
return None
|
return None
|
||||||
return unified_ref_list
|
|
||||||
|
|
||||||
|
|
||||||
class SearchResults(object):
|
class SearchResults(object):
|
||||||
|
|
|
@ -240,6 +240,66 @@ class BGExtract(object):
|
||||||
return SearchResults(bookname, chapter, verse_list)
|
return SearchResults(bookname, chapter, verse_list)
|
||||||
|
|
||||||
|
|
||||||
|
class BSExtract(object):
|
||||||
|
"""
|
||||||
|
Extract verses from Bibleserver.com
|
||||||
|
"""
|
||||||
|
def __init__(self,proxyurl=None):
|
||||||
|
log.debug(u'init %s', proxyurl)
|
||||||
|
self.proxyurl = proxyurl
|
||||||
|
|
||||||
|
def get_bible_chapter(self, version, bookname, chapter):
|
||||||
|
"""
|
||||||
|
Access and decode bibles via Bibleserver mobile website
|
||||||
|
|
||||||
|
``version``
|
||||||
|
The version of the bible like NIV for New International Version
|
||||||
|
|
||||||
|
``bookname``
|
||||||
|
Text name of bible book e.g. Genesis, 1. John, 1John or Offenbarung
|
||||||
|
|
||||||
|
``chapter``
|
||||||
|
Chapter number
|
||||||
|
"""
|
||||||
|
log.debug(u'get_bible_chapter %s,%s,%s', version, bookname, chapter)
|
||||||
|
chapter_url = u'http://m.bibleserver.com/text/%s/%s%s' % \
|
||||||
|
(version, bookname, chapter)
|
||||||
|
|
||||||
|
log.debug(u'URL: %s', chapter_url)
|
||||||
|
page = None
|
||||||
|
try:
|
||||||
|
page = urllib2.urlopen(chapter_url)
|
||||||
|
Receiver.send_message(u'openlp_process_events')
|
||||||
|
except urllib2.URLError:
|
||||||
|
log.exception(u'The web bible page could not be downloaded.')
|
||||||
|
finally:
|
||||||
|
if not page:
|
||||||
|
return None
|
||||||
|
soup = None
|
||||||
|
try:
|
||||||
|
soup = BeautifulSoup(page)
|
||||||
|
except HTMLParseError:
|
||||||
|
log.exception(u'BeautifulSoup could not parse the bible page.')
|
||||||
|
finally:
|
||||||
|
if not soup:
|
||||||
|
return None
|
||||||
|
Receiver.send_message(u'openlp_process_events')
|
||||||
|
try:
|
||||||
|
content = soup.find(u'div', u'content').find(u'div').findAll(u'div')
|
||||||
|
except:
|
||||||
|
log.exception(u'No verses found.')
|
||||||
|
finally:
|
||||||
|
if not content:
|
||||||
|
return None
|
||||||
|
verse_number = re.compile(r'v(\d{2})(\d{3})(\d{3}) verse')
|
||||||
|
verses = {}
|
||||||
|
for verse in content:
|
||||||
|
Receiver.send_message(u'openlp_process_events')
|
||||||
|
versenumber = int(verse_number.sub(r'\3', verse[u'class']))
|
||||||
|
verses[versenumber] = verse.contents[1].rstrip(u'\n')
|
||||||
|
return SearchResults(bookname, chapter, verses)
|
||||||
|
|
||||||
|
|
||||||
class CWExtract(object):
|
class CWExtract(object):
|
||||||
"""
|
"""
|
||||||
Extract verses from CrossWalk/BibleStudyTools
|
Extract verses from CrossWalk/BibleStudyTools
|
||||||
|
@ -426,8 +486,10 @@ class HTTPBible(BibleDB):
|
||||||
log.debug(u'source = %s', self.download_source)
|
log.debug(u'source = %s', self.download_source)
|
||||||
if self.download_source.lower() == u'crosswalk':
|
if self.download_source.lower() == u'crosswalk':
|
||||||
ev = CWExtract(self.proxy_server)
|
ev = CWExtract(self.proxy_server)
|
||||||
else:
|
elif self.download_source.lower() == u'biblegateway':
|
||||||
ev = BGExtract(self.proxy_server)
|
ev = BGExtract(self.proxy_server)
|
||||||
|
elif self.download_source.lower() == u'bibleserver':
|
||||||
|
ev = BSExtract(self.proxy_server)
|
||||||
return ev.get_bible_chapter(self.download_name, book, chapter)
|
return ev.get_bible_chapter(self.download_name, book, chapter)
|
||||||
|
|
||||||
def get_books(self):
|
def get_books(self):
|
||||||
|
|
|
@ -112,6 +112,7 @@ class BibleFormat(object):
|
||||||
def get_availability(format):
|
def get_availability(format):
|
||||||
return BibleFormat._format_availability.get(format, True)
|
return BibleFormat._format_availability.get(format, True)
|
||||||
|
|
||||||
|
|
||||||
class BibleManager(object):
|
class BibleManager(object):
|
||||||
"""
|
"""
|
||||||
The Bible manager which holds and manages all the Bibles.
|
The Bible manager which holds and manages all the Bibles.
|
||||||
|
@ -311,7 +312,7 @@ class BibleManager(object):
|
||||||
'Scripture Reference Error'),
|
'Scripture Reference Error'),
|
||||||
translate('BiblesPlugin.BibleManager', 'You did not enter a '
|
translate('BiblesPlugin.BibleManager', 'You did not enter a '
|
||||||
'search keyword.\nYou can separate different keywords by a '
|
'search keyword.\nYou can separate different keywords by a '
|
||||||
'space to search for all of your keywords and you can seperate '
|
'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
|
||||||
|
|
||||||
|
@ -356,3 +357,4 @@ class BibleManager(object):
|
||||||
BibleFormat.set_availability(BibleFormat.OpenLP1, has_openlp1)
|
BibleFormat.set_availability(BibleFormat.OpenLP1, has_openlp1)
|
||||||
|
|
||||||
__all__ = [u'BibleFormat']
|
__all__ = [u'BibleFormat']
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ from PyQt4 import QtCore, QtGui
|
||||||
from openlp.core.lib import MediaManagerItem, Receiver, BaseListWithDnD, \
|
from openlp.core.lib import MediaManagerItem, Receiver, BaseListWithDnD, \
|
||||||
ItemCapabilities, translate
|
ItemCapabilities, translate
|
||||||
from openlp.plugins.bibles.forms import BibleImportForm
|
from openlp.plugins.bibles.forms import BibleImportForm
|
||||||
|
from openlp.plugins.bibles.lib import get_reference_match
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -553,12 +554,15 @@ class BibleMediaItem(MediaManagerItem):
|
||||||
bible = unicode(self.AdvancedVersionComboBox.currentText())
|
bible = unicode(self.AdvancedVersionComboBox.currentText())
|
||||||
second_bible = unicode(self.AdvancedSecondBibleComboBox.currentText())
|
second_bible = unicode(self.AdvancedSecondBibleComboBox.currentText())
|
||||||
book = unicode(self.AdvancedBookComboBox.currentText())
|
book = unicode(self.AdvancedBookComboBox.currentText())
|
||||||
chapter_from = int(self.AdvancedFromChapter.currentText())
|
chapter_from = self.AdvancedFromChapter.currentText()
|
||||||
chapter_to = int(self.AdvancedToChapter.currentText())
|
chapter_to = self.AdvancedToChapter.currentText()
|
||||||
verse_from = int(self.AdvancedFromVerse.currentText())
|
verse_from = self.AdvancedFromVerse.currentText()
|
||||||
verse_to = int(self.AdvancedToVerse.currentText())
|
verse_to = self.AdvancedToVerse.currentText()
|
||||||
versetext = u'%s %s:%s-%s:%s' % (book, chapter_from, verse_from,
|
verse_separator = get_reference_match(u'sep_v_display')
|
||||||
chapter_to, verse_to)
|
range_separator = get_reference_match(u'sep_r_display')
|
||||||
|
verse_range = chapter_from + verse_separator + verse_from + \
|
||||||
|
range_separator + chapter_to + verse_separator + verse_to
|
||||||
|
versetext = u'%s %s' % (book, verse_range)
|
||||||
self.search_results = self.parent.manager.get_verses(bible, versetext)
|
self.search_results = self.parent.manager.get_verses(bible, versetext)
|
||||||
if second_bible:
|
if second_bible:
|
||||||
self.second_search_results = self.parent.manager.get_verses(
|
self.second_search_results = self.parent.manager.get_verses(
|
||||||
|
@ -709,7 +713,7 @@ class BibleMediaItem(MediaManagerItem):
|
||||||
obj = reference[QtCore.QString(key)]
|
obj = reference[QtCore.QString(key)]
|
||||||
if isinstance(obj, QtCore.QVariant):
|
if isinstance(obj, QtCore.QVariant):
|
||||||
obj = obj.toPyObject()
|
obj = obj.toPyObject()
|
||||||
return unicode(obj)
|
return unicode(obj).strip()
|
||||||
|
|
||||||
def generateSlideData(self, service_item, item=None, xmlVersion=False):
|
def generateSlideData(self, service_item, item=None, xmlVersion=False):
|
||||||
"""
|
"""
|
||||||
|
@ -739,7 +743,8 @@ class BibleMediaItem(MediaManagerItem):
|
||||||
second_bible = self._decodeQtObject(bitem, 'second_bible')
|
second_bible = self._decodeQtObject(bitem, 'second_bible')
|
||||||
second_version = self._decodeQtObject(bitem, 'second_version')
|
second_version = self._decodeQtObject(bitem, 'second_version')
|
||||||
second_copyright = self._decodeQtObject(bitem, 'second_copyright')
|
second_copyright = self._decodeQtObject(bitem, 'second_copyright')
|
||||||
second_permissions = self._decodeQtObject(bitem, 'second_permissions')
|
second_permissions = \
|
||||||
|
self._decodeQtObject(bitem, 'second_permissions')
|
||||||
second_text = self._decodeQtObject(bitem, 'second_text')
|
second_text = self._decodeQtObject(bitem, 'second_text')
|
||||||
verse_text = self.formatVerse(old_chapter, chapter, verse)
|
verse_text = self.formatVerse(old_chapter, chapter, verse)
|
||||||
footer = u'%s (%s %s %s)' % (book, version, copyright, permissions)
|
footer = u'%s (%s %s %s)' % (book, version, copyright, permissions)
|
||||||
|
@ -750,21 +755,21 @@ class BibleMediaItem(MediaManagerItem):
|
||||||
second_copyright, second_permissions)
|
second_copyright, second_permissions)
|
||||||
if footer not in raw_footer:
|
if footer not in raw_footer:
|
||||||
raw_footer.append(footer)
|
raw_footer.append(footer)
|
||||||
bible_text = u'%s %s\n\n%s %s' % (verse_text, text, verse_text,
|
bible_text = u'%s\u00a0%s\n\n%s\u00a0%s' % (verse_text, text,
|
||||||
second_text)
|
verse_text, second_text)
|
||||||
raw_slides.append(bible_text)
|
raw_slides.append(bible_text)
|
||||||
bible_text = u''
|
bible_text = u''
|
||||||
# If we are 'Verse Per Slide' then create a new slide.
|
# If we are 'Verse Per Slide' then create a new slide.
|
||||||
elif self.parent.settings_tab.layout_style == 0:
|
elif self.parent.settings_tab.layout_style == 0:
|
||||||
bible_text = u'%s %s' % (verse_text, text)
|
bible_text = u'%s\u00a0%s' % (verse_text, text)
|
||||||
raw_slides.append(bible_text)
|
raw_slides.append(bible_text)
|
||||||
bible_text = u''
|
bible_text = u''
|
||||||
# If we are 'Verse Per Line' then force a new line.
|
# If we are 'Verse Per Line' then force a new line.
|
||||||
elif self.parent.settings_tab.layout_style == 1:
|
elif self.parent.settings_tab.layout_style == 1:
|
||||||
bible_text = u'%s %s %s\n' % (bible_text, verse_text, text)
|
bible_text = u'%s %s\u00a0%s\n' % (bible_text, verse_text, text)
|
||||||
# We have to be 'Continuous'.
|
# We have to be 'Continuous'.
|
||||||
else:
|
else:
|
||||||
bible_text = u'%s %s %s\n' % (bible_text, verse_text, text)
|
bible_text = u'%s %s\u00a0%s\n' % (bible_text, verse_text, text)
|
||||||
if first_item:
|
if first_item:
|
||||||
start_item = item
|
start_item = item
|
||||||
first_item = False
|
first_item = False
|
||||||
|
@ -816,36 +821,31 @@ class BibleMediaItem(MediaManagerItem):
|
||||||
``old_item``
|
``old_item``
|
||||||
The last item of a range.
|
The last item of a range.
|
||||||
"""
|
"""
|
||||||
|
verse_separator = get_reference_match(u'sep_v_display')
|
||||||
|
range_separator = get_reference_match(u'sep_r_display')
|
||||||
old_bitem = self.listView.item(old_item.row())
|
old_bitem = self.listView.item(old_item.row())
|
||||||
old_chapter = int(self._decodeQtObject(old_bitem, 'chapter'))
|
old_chapter = self._decodeQtObject(old_bitem, 'chapter')
|
||||||
old_verse = int(self._decodeQtObject(old_bitem, 'verse'))
|
old_verse = self._decodeQtObject(old_bitem, 'verse')
|
||||||
start_bitem = self.listView.item(start_item.row())
|
start_bitem = self.listView.item(start_item.row())
|
||||||
start_book = self._decodeQtObject(start_bitem, 'book')
|
start_book = self._decodeQtObject(start_bitem, 'book')
|
||||||
start_chapter = int(self._decodeQtObject(start_bitem, 'chapter'))
|
start_chapter = self._decodeQtObject(start_bitem, 'chapter')
|
||||||
start_verse = int(self._decodeQtObject(start_bitem, 'verse'))
|
start_verse = self._decodeQtObject(start_bitem, 'verse')
|
||||||
start_bible = self._decodeQtObject(start_bitem, 'bible')
|
start_bible = self._decodeQtObject(start_bitem, 'bible')
|
||||||
start_second_bible = self._decodeQtObject(start_bitem, 'second_bible')
|
start_second_bible = self._decodeQtObject(start_bitem, 'second_bible')
|
||||||
if start_second_bible:
|
if start_second_bible:
|
||||||
if start_verse == old_verse and start_chapter == old_chapter:
|
bibles = u'%s, %s' % (start_bible, start_second_bible)
|
||||||
title = u'%s %s:%s (%s, %s)' % (start_book, start_chapter,
|
|
||||||
start_verse, start_bible, start_second_bible)
|
|
||||||
elif start_chapter == old_chapter:
|
|
||||||
title = u'%s %s:%s-%s (%s, %s)' % (start_book, start_chapter,
|
|
||||||
start_verse, old_verse, start_bible, start_second_bible)
|
|
||||||
else:
|
|
||||||
title = u'%s %s:%s-%s:%s (%s, %s)' % (start_book, start_chapter,
|
|
||||||
start_verse, old_chapter, old_verse, start_bible,
|
|
||||||
start_second_bible)
|
|
||||||
else:
|
else:
|
||||||
if start_verse == old_verse and start_chapter == old_chapter:
|
bibles = start_bible
|
||||||
title = u'%s %s:%s (%s)' % (start_book, start_chapter,
|
if start_chapter == old_chapter:
|
||||||
start_verse, start_bible)
|
if start_verse == old_verse:
|
||||||
elif start_chapter == old_chapter:
|
verse_range = start_chapter + verse_separator + start_verse
|
||||||
title = u'%s %s:%s-%s (%s)' % (start_book, start_chapter,
|
|
||||||
start_verse, old_verse, start_bible)
|
|
||||||
else:
|
else:
|
||||||
title = u'%s %s:%s-%s:%s (%s)' % (start_book, start_chapter,
|
verse_range = start_chapter + verse_separator + start_verse + \
|
||||||
start_verse, old_chapter, old_verse, start_bible)
|
range_separator + old_verse
|
||||||
|
else:
|
||||||
|
verse_range = start_chapter + verse_separator + start_verse + \
|
||||||
|
range_separator + old_chapter + verse_separator + old_verse
|
||||||
|
title = u'%s %s (%s)' % (start_book, verse_range, bibles)
|
||||||
return title
|
return title
|
||||||
|
|
||||||
def checkTitle(self, item, old_item):
|
def checkTitle(self, item, old_item):
|
||||||
|
@ -907,9 +907,10 @@ class BibleMediaItem(MediaManagerItem):
|
||||||
``verse``
|
``verse``
|
||||||
The verse number (int).
|
The verse number (int).
|
||||||
"""
|
"""
|
||||||
|
verse_separator = get_reference_match(u'sep_v_display')
|
||||||
if not self.parent.settings_tab.show_new_chapters or \
|
if not self.parent.settings_tab.show_new_chapters or \
|
||||||
old_chapter != chapter:
|
old_chapter != chapter:
|
||||||
verse_text = u'%s:%s' % (chapter, verse)
|
verse_text = unicode(chapter) + verse_separator + unicode(verse)
|
||||||
else:
|
else:
|
||||||
verse_text = u'%s' % verse
|
verse_text = u'%s' % verse
|
||||||
if self.parent.settings_tab.display_style == 1:
|
if self.parent.settings_tab.display_style == 1:
|
||||||
|
|
|
@ -1,80 +1,81 @@
|
||||||
|
João Ferreira de Almeida Atualizada,AA
|
||||||
|
التفسير التطبيقى للكتاب المقدس,ALAB
|
||||||
|
Shqip,ALB
|
||||||
|
Amplified Bible,AMP
|
||||||
Amuzgo de Guerrero,AMU
|
Amuzgo de Guerrero,AMU
|
||||||
Arabic Life Application Bible,ALAB
|
American Standard Version,ASV
|
||||||
Bulgarian Bible,BULG
|
La Bible du Semeur,BDS
|
||||||
1940 Bulgarian Bible,BG1940
|
Български 1940,BG1940
|
||||||
Chinanteco de Comaltepec,CCO
|
Български,BULG
|
||||||
Cakchiquel Occidental,CKW
|
Chinanteco de Comaltepec,CCO
|
||||||
Haitian Creole Version,HCV
|
Contemporary English Version,CEV
|
||||||
Slovo na cestu,SNC
|
Cakchiquel Occidental,CKW
|
||||||
Dette er Biblen på dansk,DN1933
|
Hrvatski,CRO
|
||||||
Hoffnung für Alle,HOF
|
Castilian,CST
|
||||||
Luther Bibel 1545,LUTH1545
|
聖經和合本 (简体中文),CUVS
|
||||||
New International Version,NIV
|
聖經和合本 (繁体中文),CUV
|
||||||
New American Standard Bible,NASB
|
Darby Translation,DARBY
|
||||||
The Message,MSG
|
Dette er Biblen på dansk,DN1933
|
||||||
Amplified Bible,AMP
|
Det Norsk Bibelselskap 1930,DNB1930
|
||||||
New Living Translation,NLT
|
English Standard Version,ESV
|
||||||
King James Version,KJV
|
GOD’S WORD Translation,GW
|
||||||
English Standard Version,ESV
|
Holman Christian Standard Bible,HCSB
|
||||||
Contemporary English Version,CEV
|
Kreyòl ayisyen bib,HCV
|
||||||
New King James Version,NKJV
|
Hiligaynon Bible,HLGN
|
||||||
New Century Version,NCV
|
Hoffnung für Alle,HOF
|
||||||
21st Century King James Version,KJ21
|
Het Boek,HTB
|
||||||
American Standard Version,ASV
|
Icelandic Bible,ICELAND
|
||||||
Young's Literal Translation,YLT
|
Jacalteco – Oriental,JAC
|
||||||
Darby Translation,DARBY
|
Károlyi-biblia,KAR
|
||||||
Holman Christian Standard Bible,HCSB
|
Kekchi,KEK
|
||||||
New International Reader's Version,NIRV
|
21st Century King James Version,KJ21
|
||||||
Wycliffe New Testament,WYC
|
King James Version,KJV
|
||||||
Worldwide English (New Testament),WE
|
La Biblia de las Américas,LBLA
|
||||||
New International Version - UK,NIVUK
|
Levande Bibeln,LB
|
||||||
Today's New International Version,TNIV
|
La Parola è Vita,LM
|
||||||
|
La Nuova Diodati,LND
|
||||||
|
Louis Segond,LSG
|
||||||
|
Luther Bibel 1545,LUTH1545
|
||||||
|
Māori Bible,MAORI
|
||||||
|
Македонски Новиот Завет,MNT
|
||||||
|
The Message,MSG
|
||||||
|
Mam de Comitancillo Central,MVC
|
||||||
|
Mam de Todos Santos Cuchumatán,MVJ
|
||||||
|
New American Standard Bible,NASB
|
||||||
|
New Century Version,NCV
|
||||||
|
Náhuatl de Guerrero,NGU
|
||||||
|
New International Reader's Version,NIRV
|
||||||
|
New International Version 1984,NIV1984
|
||||||
|
New International Version 2010,NIV
|
||||||
|
New International Version - UK,NIVUK
|
||||||
|
New King James Version,NKJV
|
||||||
|
New Living Translation,NLT
|
||||||
|
Nádej pre kazdého,NPK
|
||||||
|
Nueva Versión Internacional,NVI
|
||||||
|
O Livro,OL
|
||||||
|
Quiché – Centro Occidental,QUT
|
||||||
|
Reimer 2001,REIMER
|
||||||
|
Română Cornilescu,RMNN
|
||||||
|
Новый перевод на русский язык,RUSV
|
||||||
|
Reina-Valera Antigua,RVA
|
||||||
Reina-Valera 1960,RVR1960
|
Reina-Valera 1960,RVR1960
|
||||||
Nueva Versión Internacional,NVI
|
Reina-Valera 1995,RVR1995
|
||||||
Reina-Valera 1995,RVR1995
|
Slovo na cestu,SNC
|
||||||
Castilian,CST
|
Ang Salita ng Diyos,SND
|
||||||
Reina-Valera Antigua,RVA
|
Swahili New Testament,SNT
|
||||||
Biblia en Lenguaje Sencillo,BLS
|
Svenska 1917,SV1917
|
||||||
La Biblia de las Américas,LBLA
|
Levande Bibeln,SVL
|
||||||
Louis Segond,LSG
|
Создать страницу,SZ
|
||||||
La Bible du Semeur,BDS
|
Traducción en lenguaje actual,TLA
|
||||||
1881 Westcott-Hort New Testament,WHNU
|
New Romanian Translation,TLCR
|
||||||
1550 Stephanus New Testament,TR1550
|
Today’s New International Version 2005,TNIV
|
||||||
1894 Scrivener New Testament,TR1894
|
Textus Receptus Stephanus 1550,TR1550
|
||||||
The Westminster Leningrad Codex,WLC
|
Textus Receptus Scrivener 1894,TR1894
|
||||||
Hiligaynon Bible,HLGN
|
Українська Біблія. Переклад Івана Огієнка,UKR
|
||||||
Croatian Bible,CRO
|
Uspanteco,USP
|
||||||
Hungarian Károli,KAR
|
Kinh Thánh tiếng Việt 1934,VIET
|
||||||
Icelandic Bible,ICELAND
|
Worldwide English (New Testament),WE
|
||||||
La Nuova Diodati,LND
|
Codex Vaticanus Westcott-Hort 1881,WHNU
|
||||||
La Parola è Vita,LM
|
Westminster Leningrad Codex,WLC
|
||||||
Jacalteco, Oriental,JAC
|
Wycliffe New Testament,WYC
|
||||||
Kekchi,KEK
|
Young's Literal Translation,YLT
|
||||||
Korean Bible,KOREAN
|
|
||||||
Maori Bible,MAORI
|
|
||||||
Macedonian New Testament,MNT
|
|
||||||
Mam, Central,MVC
|
|
||||||
Mam de Todos Santos Chuchumatán,MVJ
|
|
||||||
Reimer 2001,REIMER
|
|
||||||
Náhuatl de Guerrero,NGU
|
|
||||||
Het Boek,HTB
|
|
||||||
Det Norsk Bibelselskap 1930,DNB1930
|
|
||||||
Levande Bibeln,LB
|
|
||||||
O Livro,OL
|
|
||||||
João Ferreira de Almeida Atualizada,AA
|
|
||||||
Quiché, Centro Occidental,QUT
|
|
||||||
Romanian,RMNN
|
|
||||||
Romanian,TLCR
|
|
||||||
Russian Synodal Version,RUSV
|
|
||||||
Slovo Zhizny,SZ
|
|
||||||
Nádej pre kazdého,NPK
|
|
||||||
Albanian Bible,ALB
|
|
||||||
Levande Bibeln,SVL
|
|
||||||
Svenska 1917,SV1917
|
|
||||||
Swahili New Testament,SNT
|
|
||||||
Ang Salita ng Diyos,SND
|
|
||||||
Ukrainian Bible,UKR
|
|
||||||
Uspanteco,USP
|
|
||||||
1934 Vietnamese Bible,VIET
|
|
||||||
Chinese Union Version (Simplified),CUVS
|
|
||||||
Chinese Union Version (Traditional),CUV
|
|
||||||
|
|
Can't render this file because it has a wrong number of fields in line 51.
|
|
@ -0,0 +1,39 @@
|
||||||
|
عربي, ARA
|
||||||
|
Bible – překlad 21. století, B21
|
||||||
|
Bible du Semeur, BDS
|
||||||
|
Българската Библия, BLG
|
||||||
|
Český ekumenický překlad, CEP
|
||||||
|
Hrvatski, CRO
|
||||||
|
Священное Писание, CRS
|
||||||
|
Version La Biblia al Dia, CST
|
||||||
|
中文和合本(简体), CUVS
|
||||||
|
Bibelen på hverdagsdansk, DK
|
||||||
|
Revidierte Elberfelder, ELB
|
||||||
|
Einheitsübersetzung, EU
|
||||||
|
Gute Nachricht Bibel, GNB
|
||||||
|
Hoffnung für alle, HFA
|
||||||
|
Hungarian, HUN
|
||||||
|
Het Boek, HTB
|
||||||
|
La Parola è Vita, ITA
|
||||||
|
IBS-fordítás (Új Károli), KAR
|
||||||
|
King James Version, KJV
|
||||||
|
Luther 1984, LUT
|
||||||
|
Septuaginta, LXX
|
||||||
|
Neue Genfer Übersetzung, NGÜ
|
||||||
|
New International Readers Version, NIRV
|
||||||
|
New International Version, NIV
|
||||||
|
Neues Leben, NL
|
||||||
|
En Levende Bok (NOR), NOR
|
||||||
|
Nádej pre kazdého, NPK
|
||||||
|
Noua traducere în limba românã, NTR
|
||||||
|
Nueva Versión Internacional, NVI
|
||||||
|
הברית הישנה, OT
|
||||||
|
Słowo Życia, POL
|
||||||
|
O Livro, PRT
|
||||||
|
Новый перевод на русский язык, RUS
|
||||||
|
Slovo na cestu, SNC
|
||||||
|
Schlachter 2000, SLT
|
||||||
|
En Levande Bok (SWE), SVL
|
||||||
|
Today's New International Version, TNIV
|
||||||
|
Türkçe, TR
|
||||||
|
Biblia Vulgata, VUL
|
|
|
@ -24,4 +24,4 @@ New International Reader's Version,nrv
|
||||||
The Darby Translation,dby
|
The Darby Translation,dby
|
||||||
The Webster Bible,wbt
|
The Webster Bible,wbt
|
||||||
The Latin Vulgate,vul
|
The Latin Vulgate,vul
|
||||||
Weymouth New Testament,wnt
|
Weymouth New Testament,wnt
|
||||||
|
|
|
Loading…
Reference in New Issue