SeaCogs/bible/api.py

244 lines
7.1 KiB
Python

# All of this code was stolen from the 'free_python_bible_api' repository on GitHub.
# https://github.com/MatthiasELISEE/free_python_bible_api/blob/master/free_bible_api.py
import re
from collections import OrderedDict
import xmltodict
bible = "!failed"
def set_bible(file_name):
global bible
try:
with open(file_name) as fd:
bible = xmltodict.parse(fd.read())
bible = bible["osis"]["osisText"]["div"]
except KeyError:
raise Exception("Your xml OSIS bible is not correctly formatted.")
# only works for french and english without accents
def osisID_from_reference(reference):
reference = reference.replace(" ", "").lower()
parts = re.search("(\d?[a-z]+)(\d+)[:,.](\d+)", reference)
book = parts.group(1)
osis_chapter = parts.group(2)
osis_verse = parts.group(3)
# Esther not at the right place, but is just before Ezra
# James not at the right place, but is just after Luke
if "gen" in book:
osis_book = "Gen"
elif "exo" in book:
osis_book = "Exod"
elif "lev" in book:
osis_book = "Lev"
elif "deut" in book:
osis_book = "Num"
elif "jos" in book:
osis_book = "Josh"
elif "jug" in book or "judg" in book:
osis_book = "Judg"
elif "ruth" in book:
osis_book = "Ruth"
elif "1s" in book:
osis_book = "1Sam"
elif "2s" in book:
osis_book = "2Sam"
elif "1k" in book or "1r" in book:
osis_book = "1Kgs"
elif "2k" in book or "2r" in book:
osis_book = "2Kgs"
elif "1ch" in book:
osis_book = "1Chr"
elif "2ch" in book:
osis_book = "2Chr"
elif book.startswith("est"):
osis_book = "Esth"
elif book.startswith("e"):
osis_book = "Ezra"
elif book.startswith("n"):
osis_book = "Neh"
elif "job" in book:
osis_book = "Job"
elif book.startswith("ps"):
osis_book = "Ps"
elif book.startswith("pr"):
osis_book = "Prov"
elif "ecc" in book:
osis_book = "Eccl"
elif "song" in book or "cant" in book:
osis_book = "Song"
elif "isa" in book or "esa" in book:
osis_book = "Isa"
elif "jer" in book:
osis_book = "Jer"
elif "lam" in book:
osis_book = "Lam"
elif "eze" in book:
osis_book = "Ezek"
elif "dan" in book:
osis_book = "Dan"
elif book.startswith("ho") or book.startswith("os"):
osis_book = "Hos"
elif book.startswith("jo"):
osis_book = "Joel"
elif book.startswith("am"):
osis_book = "Amos"
elif book.startswith("ob"):
osis_book = "Obad"
elif book.startswith("mi"):
osis_book = "Mic"
elif "nah" in book:
osis_book = "Nah"
elif "hab" in book:
osis_book = "Hab"
elif "ph" in book and not book.startswith("ph"):
osis_book = "Zeph"
elif book.startswith("agg") or book.startswith("hag"):
osis_book = "Hag"
elif book.startswith("z"):
osis_book = "Zech"
elif book.startswith("ma"):
osis_book = "Mal"
elif book.startswith("mt") or book.startswith("mat"):
osis_book = "Matt"
elif book.startswith("ma"):
osis_book = "Mark"
elif book.startswith("lu"):
osis_book = "Luke"
elif book.startswith("ja"):
osis_book = "Jas"
elif book.startswith("j"):
osis_book = "John"
elif book.startswith("a"):
osis_book = "Acts"
elif book.startswith("ro") or book.startswith("rm"):
osis_book = "Rom"
elif book.startswith("1c"):
osis_book = "1Cor"
elif book.startswith("2c"):
osis_book = "2Cor"
elif book.startswith("g"):
osis_book = "Gal"
elif book.startswith("e"):
osis_book = "Eph"
elif "pp" in book:
osis_book = "Phil"
elif book.startswith("c"):
osis_book = "Col"
elif book.startswith("1th"):
osis_book = "1Thess"
elif book.startswith("2th"):
osis_book = "2Thess"
elif "1t" in book:
osis_book = "1Tim"
elif "2t" in book:
osis_book = "2Tim"
elif book.startswith("t"):
osis_book = "Titus"
elif book.startswith("p"):
osis_book = "Phlm"
elif book.startswith("h"):
osis_book = "Heb"
elif book.startswith("1p"):
osis_book = "1Pet"
elif book.startswith("2p"):
osis_book = "2Pet"
elif book.startswith("1"):
osis_book = "1John"
elif book.startswith("2"):
osis_book = "2John"
elif book.startswith("3"):
osis_book = "3John"
elif book.startswith("j"):
osis_book = "Jude"
elif book.startswith("r"):
osis_book = "Rev"
return osis_book + "." + osis_chapter + "." + osis_verse
def text_from_osisID(osisID):
global bible
if bible == "!failed":
raise IOError(
"You forgot to set the bible using the set_bible function. Sorry."
)
book_trigger = False
chapter_trigger = False
verse_trigger = False
returned = ""
for book in bible:
if book["@osisID"] == osisID:
book_trigger = True
# Workaround for 1-chapter books
if type(book["chapter"]) == OrderedDict:
chapters = [book["chapter"]]
else:
chapters = book["chapter"]
for chapter in chapters:
# Workaround to solve the problem of the preceding workaround
if type(chapter) != OrderedDict:
chapter = chapter[0]
if chapter["@osisID"] == osisID:
chapter_trigger = True
# But there's no 1-verse chapter lmbo
for verse in chapter["verse"]:
if verse["@osisID"] == osisID:
verse_trigger = True
if verse_trigger or chapter_trigger or book_trigger:
returned += verse["#text"] + "\n"
verse_trigger = False
chapter_trigger = False
book_trigger = False
if returned == "":
return "!failed"
return returned
def text_from_reference(reference):
return reference + " : " + text_from_osisID(osisID_from_reference(reference))
def text_from_references(reference):
reference_list = reference.split(";")
osisID_list = [osisID_from_reference(r) for r in reference_list]
splitted_references = []
for r in reference_list:
rs = r.split("-")
if len(rs) < 2:
continue
elif len(rs) > 2:
raise IOError("There are too much '-'")
else:
end = int(float(rs[1]))
osisID_start = osisID_from_reference(rs[0])
osisID = osisID_start.split(".")
start = int(float(osisID[2]))
del osisID[2]
for i in range(start, end + 1):
splitted_references.append(
"".join([osisID[0]] + [" "] + [osisID[1]] + [":"] + [str(i)])
)
reference_list.remove(r)
reference_list = splitted_references + reference_list
return "".join(text_from_reference(str(s)) for s in reference_list)
# using it with node https://ourcodeworld.com/articles/read/286/how-to-execute-a-python-script-and-retrieve-output-data-and-errors-in-node-js