Add prev and next chapter navigation

This commit is contained in:
2023-04-01 23:36:53 -07:00
parent 58e81517cd
commit 29a085d789
4 changed files with 127 additions and 13 deletions
+70 -5
View File
@@ -26,7 +26,8 @@ TODO:
Replace send_file with something that loads headers and nav templates
Search phrase alias dictionary
Response Bible book reading
*Search highlighting
*Forward and Backward Navigation ** add to rich responses
Search highlighting
Styles
Bible Reading Plan
Bible Reader
@@ -43,14 +44,26 @@ cached = {
"book_names": [
i[0] for i in kjv_cur.execute("SELECT n FROM key_english").fetchall()
],
"chapter_list": [],
"json_dictionary": json.load(open("data/1828_Webster_KJV.json", "r")),
"html_response": open("html/response.html", "r").read(),
"html_navbar": open("html/navbar.html", "r").read(),
"css_navbar": open("styles/header.css", "r").read(),
"js_navbar": open("js/header.js", "r").read(),
"css_response": open("styles/human_readable.css", "r").read(),
"css_collapsible": open("styles/collapsible.css", "r").read(),
"js_collapsible": open("js/collapsible.js", "r").read(),
}
# Fill the chapter list with unique chapters for seeking back and forward by index.
#TODO Fix string-based..? sorting problem
[
cached["chapter_list"].append(int(str(chap)[:-3]))
for chap in cached.get("verse_ids")
if int(str(chap)[:-3]) not in cached["chapter_list"]
]
cached["chapter_list"].sort()
def build_html_reponse():
html = ""
@@ -110,6 +123,31 @@ def get_verse_id(book_id, chapter, verse):
return str(book_id) + chapterid + verseid
def get_next_prev_chapter(verseid):
current_chapter = verseid[:-3]
current_chapter_index = cached["chapter_list"].index(int(current_chapter))
#next_chapter_id = str(cached["chapter_list"][current_chapter_index + 1])
next_chapter_id = str(cached["chapter_list"][(current_chapter_index + 1) % len(cached["chapter_list"])])
#prev_chapter_id = str(cached["chapter_list"][current_chapter_index - 1])
prev_chapter_id = str(cached["chapter_list"][(current_chapter_index - 1) % len(cached["chapter_list"])])
next_chapter_name = " ".join(
(lookup_bookname(next_chapter_id[:-3]), str(next_chapter_id[-3:]).lstrip("0"))
)
prev_chapter_name = " ".join(
(lookup_bookname(prev_chapter_id[:-3]), str(prev_chapter_id[-3:]).lstrip("0"))
)
next_chapter_link = f"/show?kw={next_chapter_name}&view=rich"
prev_chapter_link = f"/show?kw={prev_chapter_name}&view=rich"
result = {
"prev_chapter_name": prev_chapter_name,
"prev_chapter_link": prev_chapter_link,
"next_chapter_name": next_chapter_name,
"next_chapter_link": next_chapter_link,
}
return result
def ref_input_cleaning(
ref, valid_chars=(string.ascii_letters + string.digits + ":-,"), ref_search=True
):
@@ -363,8 +401,19 @@ def response_single(scripture):
if arg_view == "plain":
return response_text(scripture)
elif arg_view == "rich":
l_r_nav = get_next_prev_chapter(
str(scripture[0])
) # get the first scripture, the id thereof
return (
cached["html_navbar"].format(query=request.args.get("kw", ""))
cached["html_navbar"].format(
query=request.args.get("kw", ""),
next_chapter_name=l_r_nav["next_chapter_name"],
next_chapter_link=l_r_nav["next_chapter_link"],
prev_chapter_name=l_r_nav["prev_chapter_name"],
prev_chapter_link=l_r_nav["prev_chapter_link"],
)
+ cached["js_navbar"]
+ cached["css_navbar"]
+ cached["css_response"]
+ response_rich(scripture)
)
@@ -381,8 +430,22 @@ def response_multi(scriptures):
for scripture in scriptures:
response.append(response_text(scripture))
elif arg_view == "rich":
l_r_nav = get_next_prev_chapter(
str(scriptures[0][0])
) # get the first scripture, the id thereof
response.append(cached["css_response"])
response.append(cached["html_navbar"].format(query=request.args.get("kw", "")))
response.append(
cached["html_navbar"].format(
query=request.args.get("kw", ""),
next_chapter_name=l_r_nav["next_chapter_name"],
next_chapter_link=l_r_nav["next_chapter_link"],
prev_chapter_name=l_r_nav["prev_chapter_name"],
prev_chapter_link=l_r_nav["prev_chapter_link"],
)
)
response.append(cached["css_navbar"])
response.append(cached["js_navbar"])
for scripture in scriptures:
response.append(response_rich(scripture))
else:
@@ -518,7 +581,9 @@ def sequential_read(start=0, num=1, uid=None, getuid=False):
except sqlite3.OperationalError:
logging.error(f"UID Database failed to insert {uid} into reading_tracker.")
return jsonify(
{"error": "Something went wrong with the UID database. Check permissions?"}
{
"error": "Something went wrong with the UID database. Check permissions?"
}
)
seq_conn.commit()
logging.info(f"Created new SEQ UID: {uid}")
@@ -557,4 +622,4 @@ def sequential_read(start=0, num=1, uid=None, getuid=False):
if __name__ == "__main__":
print("You must run this program within a uwsgi environment.")
#app.run(host="127.0.0.1", port=1612)
# app.run(host="127.0.0.1", port=1612)
+13 -8
View File
@@ -1,9 +1,14 @@
<div class="header" id="NavHeader">
<header>
<form action="/find">
<input type="text" name="kw" value="{query}">
<input type="hidden" name="view" value="rich"">
<input type="submit" value="Search">
<form>
<a href="/">Home</a> | <a href="/find">Quick Search</a> |
<a href="/random?view=rich">Random Verse</a> |
<a href="/votd?view=rich">Verse of the Day</a></header>
<a href="{prev_chapter_link}">{prev_chapter_name}</a> |
<a href="{next_chapter_link}">{next_chapter_name}</a>
<form action="/find">
<input type="text" name="kw" value="{query}">
<input type="hidden" name="view" value="rich"">
<input type="submit" value="Search">
</form>
<a href="/">Home</a> | <a href="/find">Quick Search</a> |
<a href="/random?view=rich">Random Verse</a> |
<a href="/votd?view=rich">Verse of the Day</a>
</header>
</div>
+19
View File
@@ -0,0 +1,19 @@
<script>
// When the user scrolls the page, execute myFunction
window.onscroll = function() {headerscroll()};
// Get the header
var header = document.getElementById("NavHeader");
// Get the offset position of the navbar
var sticky = header.offsetTop;
// Add the sticky class to the header when you reach its scroll position. Remove "sticky" when you leave the scroll position
function headerscroll() {
if (window.pageYOffset > sticky) {
header.classList.add("sticky");
} else {
header.classList.remove("sticky");
}
}
</script>
+25
View File
@@ -0,0 +1,25 @@
<style>
/* Style the header */
.header {
padding: 10px 16px;
background: #555;
color: #f1f1f1;
}
/* Page content */
.content {
padding: 16px;
}
/* The sticky class is added to the header with JS when it reaches its scroll position */
.sticky {
position: fixed;
top: 0;
width: 100%
}
/* Add some top padding to the page content to prevent sudden quick movement (as the header gets a new position at the top of the page (position:fixed and top:0) */
.sticky + .content {
padding-top: 102px;
}
</style>