Consolidate resource pages into single generic template

- Created resource_index.html as a unified template for all resource pages
- Updated routes to use the generic template with configurable data
- Added link_verses and link_names filters to descriptions for automatic linking
- Added 6 new resources to /resources page (Miracles, I Am Statements,
  Beatitudes, Ten Commandments, Armor of God, Prayers)
- Deleted 6 redundant individual templates (miracles.html, prayers.html,
  beatitudes.html, ten_commandments.html, armor_of_god.html, i_am_statements.html)

This reduces code duplication and ensures consistent verse linking across
all resource pages.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-25 19:28:30 -05:00
parent 02ede39842
commit d621301b78
11 changed files with 308 additions and 1284 deletions
+36 -12
View File
@@ -576,10 +576,14 @@ def miracles_page(request: Request):
"""Miracles of Jesus page."""
return templates.TemplateResponse(
request,
"miracles.html",
"resource_index.html",
{
"books": get_books(),
"miracles_data": MIRACLES_DATA,
"resource_data": MIRACLES_DATA,
"page_title": "Miracles of Jesus",
"page_subtitle": "Signs and Wonders Manifesting Divine Authority",
"page_description": "Explore the miracles of Jesus Christ recorded in the Gospels - healings, nature miracles, exorcisms, and raisings from the dead.",
"base_url": "/miracles-of-jesus",
"breadcrumbs": [
{"text": "Home", "url": "/"},
{"text": "Miracles of Jesus", "url": None}
@@ -624,10 +628,14 @@ def prayers_page(request: Request):
"""Prayers of the Bible page."""
return templates.TemplateResponse(
request,
"prayers.html",
"resource_index.html",
{
"books": get_books(),
"prayers_data": PRAYERS_DATA,
"resource_data": PRAYERS_DATA,
"page_title": "Prayers of the Bible",
"page_subtitle": "Sacred Conversations with the Almighty",
"page_description": "Explore the prayers recorded in Scripture - from the Psalms to the prayers of Jesus, Paul, and the early church.",
"base_url": "/prayers-of-the-bible",
"breadcrumbs": [
{"text": "Home", "url": "/"},
{"text": "Prayers of the Bible", "url": None}
@@ -672,10 +680,14 @@ def beatitudes_page(request: Request):
"""The Beatitudes page."""
return templates.TemplateResponse(
request,
"beatitudes.html",
"resource_index.html",
{
"books": get_books(),
"beatitudes_data": BEATITUDES_DATA,
"resource_data": BEATITUDES_DATA,
"page_title": "The Beatitudes",
"page_subtitle": "The Blessings of the Kingdom",
"page_description": "Explore the Beatitudes from Jesus's Sermon on the Mount - the foundational blessings that describe the character of kingdom citizens.",
"base_url": "/beatitudes",
"breadcrumbs": [
{"text": "Home", "url": "/"},
{"text": "The Beatitudes", "url": None}
@@ -720,10 +732,14 @@ def ten_commandments_page(request: Request):
"""The Ten Commandments page."""
return templates.TemplateResponse(
request,
"ten_commandments.html",
"resource_index.html",
{
"books": get_books(),
"commandments_data": TEN_COMMANDMENTS_DATA,
"resource_data": TEN_COMMANDMENTS_DATA,
"page_title": "The Ten Commandments",
"page_subtitle": "The Moral Law of God",
"page_description": "Study the Ten Commandments given by God to Moses on Mount Sinai - the foundation of biblical morality and divine law.",
"base_url": "/ten-commandments",
"breadcrumbs": [
{"text": "Home", "url": "/"},
{"text": "The Ten Commandments", "url": None}
@@ -768,10 +784,14 @@ def armor_of_god_page(request: Request):
"""The Armor of God page."""
return templates.TemplateResponse(
request,
"armor_of_god.html",
"resource_index.html",
{
"books": get_books(),
"armor_data": ARMOR_OF_GOD_DATA,
"resource_data": ARMOR_OF_GOD_DATA,
"page_title": "The Armor of God",
"page_subtitle": "Divine Equipment for Spiritual Warfare",
"page_description": "Study the Armor of God from Ephesians 6 - the spiritual equipment believers need to stand against the wiles of the devil.",
"base_url": "/armor-of-god",
"breadcrumbs": [
{"text": "Home", "url": "/"},
{"text": "The Armor of God", "url": None}
@@ -816,10 +836,14 @@ def i_am_statements_page(request: Request):
"""I Am Statements of Jesus page."""
return templates.TemplateResponse(
request,
"i_am_statements.html",
"resource_index.html",
{
"books": get_books(),
"statements_data": I_AM_STATEMENTS_DATA,
"resource_data": I_AM_STATEMENTS_DATA,
"page_title": "I Am Statements of Jesus",
"page_subtitle": "Divine Self-Revelations in the Gospel of John",
"page_description": "Explore the seven 'I Am' statements of Jesus in John's Gospel - profound declarations of His divine nature and mission.",
"base_url": "/i-am-statements",
"breadcrumbs": [
{"text": "Home", "url": "/"},
{"text": "I Am Statements", "url": None}
+36
View File
@@ -1713,6 +1713,42 @@ def resources_page(request: Request):
"description": "The parables spoken by Christ to illustrate spiritual truths",
"count": "11 parables"
},
{
"name": "Miracles of Jesus",
"url": "/miracles-of-jesus",
"description": "Signs and wonders manifesting divine authority over nature, disease, demons, and death",
"count": "35+ miracles"
},
{
"name": "I Am Statements",
"url": "/i-am-statements",
"description": "The seven 'I Am' statements of Jesus in John's Gospel revealing His divine nature",
"count": "7 statements"
},
{
"name": "The Beatitudes",
"url": "/beatitudes",
"description": "The blessings proclaimed by Jesus in the Sermon on the Mount",
"count": "8 beatitudes"
},
{
"name": "Ten Commandments",
"url": "/ten-commandments",
"description": "The moral law given by God to Moses on Mount Sinai",
"count": "10 commandments"
},
{
"name": "Armor of God",
"url": "/armor-of-god",
"description": "The spiritual equipment for warfare described in Ephesians 6",
"count": "7 pieces"
},
{
"name": "Prayers of the Bible",
"url": "/prayers-of-the-bible",
"description": "Sacred prayers from the Psalms, Jesus, Paul, and the early church",
"count": "20+ prayers"
},
{
"name": "Biblical Covenants",
"url": "/biblical-covenants",
-212
View File
@@ -1,212 +0,0 @@
{% extends "base.html" %}
{% block title %}The Armor of God - KJV Study{% endblock %}
{% block description %}Study the Armor of God from Ephesians 6 - the spiritual equipment believers need to stand against the wiles of the devil.{% endblock %}
{% block head %}
<style>
.armor-section {
margin: 1.5rem 0;
padding-top: 1rem;
}
.armor-section:not(:first-of-type) {
border-top: 1px solid #eee;
}
.armor-entry {
margin: 1.5rem 0 2rem 0;
}
.armor-name {
font-size: 1.8rem;
font-weight: 400;
margin-bottom: 0.25rem;
}
.armor-name a {
color: var(--link-color);
text-decoration: none;
}
.armor-name a:hover {
color: var(--link-hover);
border-bottom: 1px solid var(--link-hover);
}
.armor-title {
font-size: 1.1rem;
color: #666;
font-style: italic;
margin-bottom: 1rem;
}
.armor-description {
max-width: 60%;
font-size: 1.2rem;
line-height: 1.9;
margin: 1.5rem 0;
}
.verse-list {
margin: 1.5rem 0 0 0;
}
.verse-item {
margin: 1.2rem 0;
padding-left: 1.5rem;
border-left: 2px solid #ddd;
}
.verse-ref {
font-weight: 600;
margin-bottom: 0.5rem;
}
.verse-ref a {
color: #333;
text-decoration: none;
border-bottom: 1px solid #ddd;
}
.verse-ref a:hover {
border-bottom-color: #333;
}
.verse-text {
max-width: 60%;
font-style: italic;
color: #444;
line-height: 1.8;
}
.intro-text {
max-width: 60%;
font-size: 1.2rem;
line-height: 1.9;
margin: 1rem 0;
}
.toc {
max-width: 55%;
margin: 2rem 0;
padding: 1.5rem;
border-left: 3px solid var(--border-color-darker);
}
.toc h2 {
margin-top: 0;
font-size: 1.1rem;
font-weight: 600;
margin-bottom: 1rem;
}
.toc ul {
list-style: none;
padding: 0;
margin: 0;
}
.toc li {
margin: 0.5rem 0;
line-height: 1.6;
}
.toc a {
color: var(--text-color);
text-decoration: none;
border-bottom: 1px solid transparent;
}
.toc a:hover {
color: var(--link-color);
border-bottom-color: var(--link-color);
}
.toc li.toc-h3 {
padding-left: 1.5rem;
font-size: 0.95rem;
}
</style>
{% endblock %}
{% block content %}
<h1>The Armor of God</h1>
<p class="subtitle">Divine Equipment for Spiritual Warfare</p>
<nav class="toc" id="toc">
<h2>Contents</h2>
<ul id="toc-list"></ul>
</nav>
<section>
<p class="intro-text"><span class="newthought">The Armor of God</span>, described in Ephesians 6:10-18, provides believers with divine equipment for the spiritual warfare that characterizes the Christian life.<label for="sn-armor" class="margin-toggle sidenote-number"></label>
<input type="checkbox" id="sn-armor" class="margin-toggle"/>
<span class="sidenote">Paul wrote from Roman imprisonment, likely observing the armor of his guards. He transformed this familiar military imagery into a powerful metaphor for spiritual protection and combat. Each piece corresponds to a Roman soldier's equipment, yet represents spiritual realities infinitely more powerful than any human armament.</span> This passage reminds believers that their true enemies are not flesh and blood but spiritual forces of wickedness.</p>
<p class="intro-text">Paul's command to "put on the whole armour of God" emphasizes that partial equipment leaves dangerous vulnerabilities.<label for="sn-whole" class="margin-toggle sidenote-number"></label>
<input type="checkbox" id="sn-whole" class="margin-toggle"/>
<span class="sidenote">The Greek πανοπλία (<em>panoplia</em>), translated "whole armour," refers to the complete equipment of a heavily armed soldier. Against cunning spiritual foes, believers cannot afford gaps in their protection. Each piece serves an essential function, and neglecting any leaves one exposed to the enemy's attacks.</span> Only by taking up every piece of God's provision can believers stand firm against the devil's schemes.</p>
</section>
{% for category, items in armor_data.items() %}
<section class="armor-section">
<h2>{{ category }}</h2>
{% for item_name, item in items.items() %}
<article class="armor-entry">
<h3 class="armor-name"><a href="/armor-of-god/{{ item_name|lower|replace(' ', '-')|replace("'", '') }}">{{ item_name }}</a></h3>
<p class="armor-title">{{ item.title }}</p>
<div class="armor-description">
{{ item.description | safe }}
</div>
{% if item.verses %}
<div class="verse-list">
{% for verse in item.verses %}
<div class="verse-item">
<div class="verse-ref">
{% set ref_parts = verse.reference.split(' ') %}
{% if ref_parts|length >= 2 %}
{% set chapter_verse = ref_parts[-1] %}
{% if ':' in chapter_verse %}
{% set chapter = chapter_verse.split(':')[0] %}
{% set verse_num = chapter_verse.split(':')[1] %}
{% set book = ' '.join(ref_parts[:-1]) %}
<a href="/book/{{ book }}/chapter/{{ chapter }}/verse/{{ verse_num }}">{{ verse.reference }}</a>
{% endif %}
{% endif %}
</div>
<div class="verse-text">{{ verse.text | link_names | safe }}</div>
</div>
{% endfor %}
</div>
{% endif %}
</article>
{% endfor %}
</section>
{% endfor %}
<script>
document.addEventListener('DOMContentLoaded', function() {
const tocList = document.getElementById('toc-list');
const headings = document.querySelectorAll('section h2, section h3, section article h3');
headings.forEach((heading, index) => {
if (!heading.id) {
heading.id = 'section-' + heading.textContent.toLowerCase().replace(/[^a-z0-9]+/g, '-');
}
const li = document.createElement('li');
if (heading.tagName === 'H3') {
li.classList.add('toc-h3');
}
const a = document.createElement('a');
a.href = '#' + heading.id;
a.textContent = heading.textContent;
li.appendChild(a);
tocList.appendChild(li);
});
});
</script>
{% endblock %}
-212
View File
@@ -1,212 +0,0 @@
{% extends "base.html" %}
{% block title %}The Beatitudes - KJV Study{% endblock %}
{% block description %}Study the Beatitudes from Jesus' Sermon on the Mount in Matthew 5 - the eight blessings that describe the character of kingdom citizens.{% endblock %}
{% block head %}
<style>
.beatitude-section {
margin: 1.5rem 0;
padding-top: 1rem;
}
.beatitude-section:not(:first-of-type) {
border-top: 1px solid #eee;
}
.beatitude-entry {
margin: 1.5rem 0 2rem 0;
}
.beatitude-name {
font-size: 1.8rem;
font-weight: 400;
margin-bottom: 0.25rem;
}
.beatitude-name a {
color: var(--link-color);
text-decoration: none;
}
.beatitude-name a:hover {
color: var(--link-hover);
border-bottom: 1px solid var(--link-hover);
}
.beatitude-title {
font-size: 1.1rem;
color: #666;
font-style: italic;
margin-bottom: 1rem;
}
.beatitude-description {
max-width: 60%;
font-size: 1.2rem;
line-height: 1.9;
margin: 1.5rem 0;
}
.verse-list {
margin: 1.5rem 0 0 0;
}
.verse-item {
margin: 1.2rem 0;
padding-left: 1.5rem;
border-left: 2px solid #ddd;
}
.verse-ref {
font-weight: 600;
margin-bottom: 0.5rem;
}
.verse-ref a {
color: #333;
text-decoration: none;
border-bottom: 1px solid #ddd;
}
.verse-ref a:hover {
border-bottom-color: #333;
}
.verse-text {
max-width: 60%;
font-style: italic;
color: #444;
line-height: 1.8;
}
.intro-text {
max-width: 60%;
font-size: 1.2rem;
line-height: 1.9;
margin: 1rem 0;
}
.toc {
max-width: 55%;
margin: 2rem 0;
padding: 1.5rem;
border-left: 3px solid var(--border-color-darker);
}
.toc h2 {
margin-top: 0;
font-size: 1.1rem;
font-weight: 600;
margin-bottom: 1rem;
}
.toc ul {
list-style: none;
padding: 0;
margin: 0;
}
.toc li {
margin: 0.5rem 0;
line-height: 1.6;
}
.toc a {
color: var(--text-color);
text-decoration: none;
border-bottom: 1px solid transparent;
}
.toc a:hover {
color: var(--link-color);
border-bottom-color: var(--link-color);
}
.toc li.toc-h3 {
padding-left: 1.5rem;
font-size: 0.95rem;
}
</style>
{% endblock %}
{% block content %}
<h1>The Beatitudes</h1>
<p class="subtitle">The Character of Kingdom Citizens</p>
<nav class="toc" id="toc">
<h2>Contents</h2>
<ul id="toc-list"></ul>
</nav>
<section>
<p class="intro-text"><span class="newthought">The Beatitudes</span> open the Sermon on the Mount, presenting the revolutionary values of Christ's kingdom in direct contrast to worldly wisdom.<label for="sn-beatitudes" class="margin-toggle sidenote-number"></label>
<input type="checkbox" id="sn-beatitudes" class="margin-toggle"/>
<span class="sidenote">The term "beatitude" derives from the Latin <em>beatitudo</em>, translating the Greek μακάριος (<em>makarios</em>), meaning "blessed," "happy," or "fortunate." Each beatitude begins with this pronouncement of divine favor upon those possessing the described quality.</span> These eight declarations describe not merely what kingdom citizens should do, but what they fundamentally are—transformed persons whose character reflects their King.</p>
<p class="intro-text">Christ spoke these words on a mountainside in Galilee, seated as a rabbi teaching His disciples while multitudes listened.<label for="sn-setting" class="margin-toggle sidenote-number"></label>
<input type="checkbox" id="sn-setting" class="margin-toggle"/>
<span class="sidenote">The Sermon on the Mount (Matthew 5-7) constitutes the most comprehensive statement of kingdom ethics in Scripture. Some see parallels to Moses receiving the Law on Sinai—Jesus as the new Moses delivering the new law from a new mountain. Yet Christ came not to abolish the Law but to fulfill it, revealing its deepest spiritual intent.</span> The Beatitudes form a unity, each building upon the previous, together presenting the portrait of a true disciple.</p>
</section>
{% for category, beatitudes in beatitudes_data.items() %}
<section class="beatitude-section">
<h2>{{ category }}</h2>
{% for beatitude_name, beatitude in beatitudes.items() %}
<article class="beatitude-entry">
<h3 class="beatitude-name"><a href="/beatitudes/{{ beatitude_name|lower|replace(' ', '-')|replace("'", '') }}">{{ beatitude_name }}</a></h3>
<p class="beatitude-title">{{ beatitude.title }}</p>
<div class="beatitude-description">
{{ beatitude.description | safe }}
</div>
{% if beatitude.verses %}
<div class="verse-list">
{% for verse in beatitude.verses %}
<div class="verse-item">
<div class="verse-ref">
{% set ref_parts = verse.reference.split(' ') %}
{% if ref_parts|length >= 2 %}
{% set chapter_verse = ref_parts[-1] %}
{% if ':' in chapter_verse %}
{% set chapter = chapter_verse.split(':')[0] %}
{% set verse_num = chapter_verse.split(':')[1] %}
{% set book = ' '.join(ref_parts[:-1]) %}
<a href="/book/{{ book }}/chapter/{{ chapter }}/verse/{{ verse_num }}">{{ verse.reference }}</a>
{% endif %}
{% endif %}
</div>
<div class="verse-text">{{ verse.text | link_names | safe }}</div>
</div>
{% endfor %}
</div>
{% endif %}
</article>
{% endfor %}
</section>
{% endfor %}
<script>
document.addEventListener('DOMContentLoaded', function() {
const tocList = document.getElementById('toc-list');
const headings = document.querySelectorAll('section h2, section h3, section article h3');
headings.forEach((heading, index) => {
if (!heading.id) {
heading.id = 'section-' + heading.textContent.toLowerCase().replace(/[^a-z0-9]+/g, '-');
}
const li = document.createElement('li');
if (heading.tagName === 'H3') {
li.classList.add('toc-h3');
}
const a = document.createElement('a');
a.href = '#' + heading.id;
a.textContent = heading.textContent;
li.appendChild(a);
tocList.appendChild(li);
});
});
</script>
{% endblock %}
-212
View File
@@ -1,212 +0,0 @@
{% extends "base.html" %}
{% block title %}I Am Statements of Jesus - KJV Study{% endblock %}
{% block description %}Study the seven "I Am" statements of Jesus in John's Gospel - profound declarations revealing His divine nature and mission.{% endblock %}
{% block head %}
<style>
.statement-section {
margin: 1.5rem 0;
padding-top: 1rem;
}
.statement-section:not(:first-of-type) {
border-top: 1px solid #eee;
}
.statement-entry {
margin: 1.5rem 0 2rem 0;
}
.statement-name {
font-size: 1.8rem;
font-weight: 400;
margin-bottom: 0.25rem;
}
.statement-name a {
color: var(--link-color);
text-decoration: none;
}
.statement-name a:hover {
color: var(--link-hover);
border-bottom: 1px solid var(--link-hover);
}
.statement-title {
font-size: 1.1rem;
color: #666;
font-style: italic;
margin-bottom: 1rem;
}
.statement-description {
max-width: 60%;
font-size: 1.2rem;
line-height: 1.9;
margin: 1.5rem 0;
}
.verse-list {
margin: 1.5rem 0 0 0;
}
.verse-item {
margin: 1.2rem 0;
padding-left: 1.5rem;
border-left: 2px solid #ddd;
}
.verse-ref {
font-weight: 600;
margin-bottom: 0.5rem;
}
.verse-ref a {
color: #333;
text-decoration: none;
border-bottom: 1px solid #ddd;
}
.verse-ref a:hover {
border-bottom-color: #333;
}
.verse-text {
max-width: 60%;
font-style: italic;
color: #444;
line-height: 1.8;
}
.intro-text {
max-width: 60%;
font-size: 1.2rem;
line-height: 1.9;
margin: 1rem 0;
}
.toc {
max-width: 55%;
margin: 2rem 0;
padding: 1.5rem;
border-left: 3px solid var(--border-color-darker);
}
.toc h2 {
margin-top: 0;
font-size: 1.1rem;
font-weight: 600;
margin-bottom: 1rem;
}
.toc ul {
list-style: none;
padding: 0;
margin: 0;
}
.toc li {
margin: 0.5rem 0;
line-height: 1.6;
}
.toc a {
color: var(--text-color);
text-decoration: none;
border-bottom: 1px solid transparent;
}
.toc a:hover {
color: var(--link-color);
border-bottom-color: var(--link-color);
}
.toc li.toc-h3 {
padding-left: 1.5rem;
font-size: 0.95rem;
}
</style>
{% endblock %}
{% block content %}
<h1>I Am Statements of Jesus</h1>
<p class="subtitle">Divine Self-Revelation in the Gospel of John</p>
<nav class="toc" id="toc">
<h2>Contents</h2>
<ul id="toc-list"></ul>
</nav>
<section>
<p class="intro-text"><span class="newthought">The "I Am" statements</span> of Jesus in John's Gospel constitute some of the most profound declarations in all of Scripture, revealing Christ's divine nature and saving mission.<label for="sn-iam" class="margin-toggle sidenote-number"></label>
<input type="checkbox" id="sn-iam" class="margin-toggle"/>
<span class="sidenote">The Greek ἐγώ εἰμι (<em>ego eimi</em>), "I am," echoes the divine name revealed to Moses at the burning bush—אֶהְיֶה אֲשֶׁר אֶהְיֶה (<em>ehyeh asher ehyeh</em>), "I AM THAT I AM" (Exodus 3:14). Jesus' use of this construction made explicit claims to deity that His Jewish audience understood perfectly.</span> Each statement reveals a different aspect of who Christ is and what He offers to those who believe.</p>
<p class="intro-text">John organized his Gospel around these "signs" and declarations to prove that Jesus is "the Christ, the Son of God; and that believing ye might have life through his name" (John 20:31).<label for="sn-purpose" class="margin-toggle sidenote-number"></label>
<input type="checkbox" id="sn-purpose" class="margin-toggle"/>
<span class="sidenote">The seven "I Am" statements with predicates (Bread of Life, Light of the World, Door, Good Shepherd, Resurrection and Life, Way/Truth/Life, True Vine) each use vivid imagery to communicate spiritual truths. The absolute "I AM" statement in John 8:58 makes the most direct claim to deity.</span> Together, these declarations present a comprehensive portrait of Christ as the answer to every human need.</p>
</section>
{% for category, statements in statements_data.items() %}
<section class="statement-section">
<h2>{{ category }}</h2>
{% for statement_name, statement in statements.items() %}
<article class="statement-entry">
<h3 class="statement-name"><a href="/i-am-statements/{{ statement_name|lower|replace(' ', '-')|replace("'", '')|replace(',', '') }}">{{ statement_name }}</a></h3>
<p class="statement-title">{{ statement.title }}</p>
<div class="statement-description">
{{ statement.description | safe }}
</div>
{% if statement.verses %}
<div class="verse-list">
{% for verse in statement.verses %}
<div class="verse-item">
<div class="verse-ref">
{% set ref_parts = verse.reference.split(' ') %}
{% if ref_parts|length >= 2 %}
{% set chapter_verse = ref_parts[-1] %}
{% if ':' in chapter_verse %}
{% set chapter = chapter_verse.split(':')[0] %}
{% set verse_num = chapter_verse.split(':')[1] %}
{% set book = ' '.join(ref_parts[:-1]) %}
<a href="/book/{{ book }}/chapter/{{ chapter }}/verse/{{ verse_num }}">{{ verse.reference }}</a>
{% endif %}
{% endif %}
</div>
<div class="verse-text">{{ verse.text | link_names | safe }}</div>
</div>
{% endfor %}
</div>
{% endif %}
</article>
{% endfor %}
</section>
{% endfor %}
<script>
document.addEventListener('DOMContentLoaded', function() {
const tocList = document.getElementById('toc-list');
const headings = document.querySelectorAll('section h2, section h3, section article h3');
headings.forEach((heading, index) => {
if (!heading.id) {
heading.id = 'section-' + heading.textContent.toLowerCase().replace(/[^a-z0-9]+/g, '-');
}
const li = document.createElement('li');
if (heading.tagName === 'H3') {
li.classList.add('toc-h3');
}
const a = document.createElement('a');
a.href = '#' + heading.id;
a.textContent = heading.textContent;
li.appendChild(a);
tocList.appendChild(li);
});
});
</script>
{% endblock %}
-212
View File
@@ -1,212 +0,0 @@
{% extends "base.html" %}
{% block title %}Miracles of Jesus - KJV Study{% endblock %}
{% block description %}Explore the miracles of Jesus Christ recorded in the Gospels - healings, nature miracles, exorcisms, and raisings from the dead.{% endblock %}
{% block head %}
<style>
.miracle-section {
margin: 1.5rem 0;
padding-top: 1rem;
}
.miracle-section:not(:first-of-type) {
border-top: 1px solid #eee;
}
.miracle-entry {
margin: 1.5rem 0 2rem 0;
}
.miracle-name {
font-size: 1.8rem;
font-weight: 400;
margin-bottom: 0.25rem;
}
.miracle-name a {
color: var(--link-color);
text-decoration: none;
}
.miracle-name a:hover {
color: var(--link-hover);
border-bottom: 1px solid var(--link-hover);
}
.miracle-title {
font-size: 1.1rem;
color: #666;
font-style: italic;
margin-bottom: 1rem;
}
.miracle-description {
max-width: 60%;
font-size: 1.2rem;
line-height: 1.9;
margin: 1.5rem 0;
}
.verse-list {
margin: 1.5rem 0 0 0;
}
.verse-item {
margin: 1.2rem 0;
padding-left: 1.5rem;
border-left: 2px solid #ddd;
}
.verse-ref {
font-weight: 600;
margin-bottom: 0.5rem;
}
.verse-ref a {
color: #333;
text-decoration: none;
border-bottom: 1px solid #ddd;
}
.verse-ref a:hover {
border-bottom-color: #333;
}
.verse-text {
max-width: 60%;
font-style: italic;
color: #444;
line-height: 1.8;
}
.intro-text {
max-width: 60%;
font-size: 1.2rem;
line-height: 1.9;
margin: 1rem 0;
}
.toc {
max-width: 55%;
margin: 2rem 0;
padding: 1.5rem;
border-left: 3px solid var(--border-color-darker);
}
.toc h2 {
margin-top: 0;
font-size: 1.1rem;
font-weight: 600;
margin-bottom: 1rem;
}
.toc ul {
list-style: none;
padding: 0;
margin: 0;
}
.toc li {
margin: 0.5rem 0;
line-height: 1.6;
}
.toc a {
color: var(--text-color);
text-decoration: none;
border-bottom: 1px solid transparent;
}
.toc a:hover {
color: var(--link-color);
border-bottom-color: var(--link-color);
}
.toc li.toc-h3 {
padding-left: 1.5rem;
font-size: 0.95rem;
}
</style>
{% endblock %}
{% block content %}
<h1>Miracles of Jesus</h1>
<p class="subtitle">Signs and Wonders Manifesting Divine Authority</p>
<nav class="toc" id="toc">
<h2>Contents</h2>
<ul id="toc-list"></ul>
</nav>
<section>
<p class="intro-text"><span class="newthought">The miracles of Jesus</span> constitute a vital part of His messianic credentials, demonstrating divine authority over nature, disease, demons, and death itself.<label for="sn-miracles" class="margin-toggle sidenote-number"></label>
<input type="checkbox" id="sn-miracles" class="margin-toggle"/>
<span class="sidenote">The Greek σημεῖον (<em>sēmeion</em>, sign) emphasizes the revelatory function of miracles, while δύναμις (<em>dynamis</em>, power) stresses the supernatural energy displayed. John's Gospel particularly employs "signs" to demonstrate that Jesus is the Christ, the Son of God.</span> These mighty works fulfilled Old Testament prophecies concerning the Messiah and authenticated His divine mission.</p>
<p class="intro-text">Peter testified at Pentecost: "Jesus of Nazareth, a man approved of God among you by miracles and wonders and signs, which God did by him in the midst of you, as ye yourselves also know" (Acts 2:22). The Gospels record over thirty-five specific miracles, with many more indicated but not detailed.<label for="sn-purpose" class="margin-toggle sidenote-number"></label>
<input type="checkbox" id="sn-purpose" class="margin-toggle"/>
<span class="sidenote">John concluded his Gospel noting that Jesus did "many other signs" not recorded, "but these are written, that ye might believe that Jesus is the Christ, the Son of God; and that believing ye might have life through his name" (John 20:30-31).</span></p>
</section>
{% for category, miracles in miracles_data.items() %}
<section class="miracle-section">
<h2>{{ category }}</h2>
{% for miracle_name, miracle in miracles.items() %}
<article class="miracle-entry">
<h3 class="miracle-name"><a href="/miracles-of-jesus/{{ miracle_name|lower|replace(' ', '-')|replace("'", '') }}">{{ miracle_name }}</a></h3>
<p class="miracle-title">{{ miracle.title }}</p>
<div class="miracle-description">
{{ miracle.description | safe }}
</div>
{% if miracle.verses %}
<div class="verse-list">
{% for verse in miracle.verses %}
<div class="verse-item">
<div class="verse-ref">
{% set ref_parts = verse.reference.split(' ') %}
{% if ref_parts|length >= 2 %}
{% set chapter_verse = ref_parts[-1] %}
{% if ':' in chapter_verse %}
{% set chapter = chapter_verse.split(':')[0] %}
{% set verse_num = chapter_verse.split(':')[1] %}
{% set book = ' '.join(ref_parts[:-1]) %}
<a href="/book/{{ book }}/chapter/{{ chapter }}/verse/{{ verse_num }}">{{ verse.reference }}</a>
{% endif %}
{% endif %}
</div>
<div class="verse-text">{{ verse.text | link_names | safe }}</div>
</div>
{% endfor %}
</div>
{% endif %}
</article>
{% endfor %}
</section>
{% endfor %}
<script>
document.addEventListener('DOMContentLoaded', function() {
const tocList = document.getElementById('toc-list');
const headings = document.querySelectorAll('section h2, section h3, section article h3');
headings.forEach((heading, index) => {
if (!heading.id) {
heading.id = 'section-' + heading.textContent.toLowerCase().replace(/[^a-z0-9]+/g, '-');
}
const li = document.createElement('li');
if (heading.tagName === 'H3') {
li.classList.add('toc-h3');
}
const a = document.createElement('a');
a.href = '#' + heading.id;
a.textContent = heading.textContent;
li.appendChild(a);
tocList.appendChild(li);
});
});
</script>
{% endblock %}
-212
View File
@@ -1,212 +0,0 @@
{% extends "base.html" %}
{% block title %}Prayers of the Bible - KJV Study{% endblock %}
{% block description %}Explore the great prayers recorded in Scripture - from Abraham's intercession to Paul's epistolary prayers, including the Lord's Prayer and Jesus' High Priestly Prayer.{% endblock %}
{% block head %}
<style>
.prayer-section {
margin: 1.5rem 0;
padding-top: 1rem;
}
.prayer-section:not(:first-of-type) {
border-top: 1px solid #eee;
}
.prayer-entry {
margin: 1.5rem 0 2rem 0;
}
.prayer-name {
font-size: 1.8rem;
font-weight: 400;
margin-bottom: 0.25rem;
}
.prayer-name a {
color: var(--link-color);
text-decoration: none;
}
.prayer-name a:hover {
color: var(--link-hover);
border-bottom: 1px solid var(--link-hover);
}
.prayer-title {
font-size: 1.1rem;
color: #666;
font-style: italic;
margin-bottom: 1rem;
}
.prayer-description {
max-width: 60%;
font-size: 1.2rem;
line-height: 1.9;
margin: 1.5rem 0;
}
.verse-list {
margin: 1.5rem 0 0 0;
}
.verse-item {
margin: 1.2rem 0;
padding-left: 1.5rem;
border-left: 2px solid #ddd;
}
.verse-ref {
font-weight: 600;
margin-bottom: 0.5rem;
}
.verse-ref a {
color: #333;
text-decoration: none;
border-bottom: 1px solid #ddd;
}
.verse-ref a:hover {
border-bottom-color: #333;
}
.verse-text {
max-width: 60%;
font-style: italic;
color: #444;
line-height: 1.8;
}
.intro-text {
max-width: 60%;
font-size: 1.2rem;
line-height: 1.9;
margin: 1rem 0;
}
.toc {
max-width: 55%;
margin: 2rem 0;
padding: 1.5rem;
border-left: 3px solid var(--border-color-darker);
}
.toc h2 {
margin-top: 0;
font-size: 1.1rem;
font-weight: 600;
margin-bottom: 1rem;
}
.toc ul {
list-style: none;
padding: 0;
margin: 0;
}
.toc li {
margin: 0.5rem 0;
line-height: 1.6;
}
.toc a {
color: var(--text-color);
text-decoration: none;
border-bottom: 1px solid transparent;
}
.toc a:hover {
color: var(--link-color);
border-bottom-color: var(--link-color);
}
.toc li.toc-h3 {
padding-left: 1.5rem;
font-size: 0.95rem;
}
</style>
{% endblock %}
{% block content %}
<h1>Prayers of the Bible</h1>
<p class="subtitle">Speaking with God Throughout the Scriptures</p>
<nav class="toc" id="toc">
<h2>Contents</h2>
<ul id="toc-list"></ul>
</nav>
<section>
<p class="intro-text"><span class="newthought">Prayer permeates Scripture</span> from Genesis to Revelation, revealing the intimate communion between God and His people.<label for="sn-prayer" class="margin-toggle sidenote-number"></label>
<input type="checkbox" id="sn-prayer" class="margin-toggle"/>
<span class="sidenote">The Hebrew תְּפִלָּה (<em>tephillah</em>) emphasizes intercession and supplication, while the Greek προσευχή (<em>proseuchē</em>) conveys the broader concept of prayer as worship, petition, and communion with God. Both testaments present prayer as essential to the life of faith.</span> These recorded prayers teach us how to approach the Almighty—with reverence and boldness, confession and thanksgiving, petition and intercession.</p>
<p class="intro-text">From Abraham's intercession for Sodom to Paul's apostolic prayers for the churches, these examples demonstrate the breadth and depth of biblical prayer.<label for="sn-examples" class="margin-toggle sidenote-number"></label>
<input type="checkbox" id="sn-examples" class="margin-toggle"/>
<span class="sidenote">Jesus Himself provided the supreme model, teaching His disciples the Lord's Prayer and spending entire nights in communion with His Father. His high priestly prayer in John 17 reveals the heart of intercessory prayer at its most profound.</span> They cover every human situation: joy and sorrow, triumph and defeat, thanksgiving and lament, personal need and corporate concern.</p>
</section>
{% for category, prayers in prayers_data.items() %}
<section class="prayer-section">
<h2>{{ category }}</h2>
{% for prayer_name, prayer in prayers.items() %}
<article class="prayer-entry">
<h3 class="prayer-name"><a href="/prayers-of-the-bible/{{ prayer_name|lower|replace(' ', '-')|replace("'", '') }}">{{ prayer_name }}</a></h3>
<p class="prayer-title">{{ prayer.title }}</p>
<div class="prayer-description">
{{ prayer.description | safe }}
</div>
{% if prayer.verses %}
<div class="verse-list">
{% for verse in prayer.verses %}
<div class="verse-item">
<div class="verse-ref">
{% set ref_parts = verse.reference.split(' ') %}
{% if ref_parts|length >= 2 %}
{% set chapter_verse = ref_parts[-1] %}
{% if ':' in chapter_verse %}
{% set chapter = chapter_verse.split(':')[0] %}
{% set verse_num = chapter_verse.split(':')[1] %}
{% set book = ' '.join(ref_parts[:-1]) %}
<a href="/book/{{ book }}/chapter/{{ chapter }}/verse/{{ verse_num }}">{{ verse.reference }}</a>
{% endif %}
{% endif %}
</div>
<div class="verse-text">{{ verse.text | link_names | safe }}</div>
</div>
{% endfor %}
</div>
{% endif %}
</article>
{% endfor %}
</section>
{% endfor %}
<script>
document.addEventListener('DOMContentLoaded', function() {
const tocList = document.getElementById('toc-list');
const headings = document.querySelectorAll('section h2, section h3, section article h3');
headings.forEach((heading, index) => {
if (!heading.id) {
heading.id = 'section-' + heading.textContent.toLowerCase().replace(/[^a-z0-9]+/g, '-');
}
const li = document.createElement('li');
if (heading.tagName === 'H3') {
li.classList.add('toc-h3');
}
const a = document.createElement('a');
a.href = '#' + heading.id;
a.textContent = heading.textContent;
li.appendChild(a);
tocList.appendChild(li);
});
});
</script>
{% endblock %}
+223
View File
@@ -0,0 +1,223 @@
{% extends "base.html" %}
{% block title %}{{ page_title }} - KJV Study{% endblock %}
{% block description %}{{ page_description }}{% endblock %}
{% block head %}
<style>
.resource-section {
margin: 1.5rem 0;
padding-top: 1rem;
}
.resource-section:not(:first-of-type) {
border-top: 1px solid var(--border-color);
}
.resource-entry {
margin: 1.5rem 0 2rem 0;
}
.resource-name {
font-size: 1.8rem;
font-weight: 400;
margin-bottom: 0.25rem;
}
.resource-name a {
color: var(--link-color);
text-decoration: none;
}
.resource-name a:hover {
color: var(--link-hover);
border-bottom: 1px solid var(--link-hover);
}
.resource-item-title {
font-size: 1.1rem;
color: var(--text-secondary);
font-style: italic;
margin-bottom: 1rem;
}
.resource-item-description {
max-width: 60%;
font-size: 1.2rem;
line-height: 1.9;
margin: 1.5rem 0;
}
.verse-list {
margin: 1.5rem 0 0 0;
}
.verse-item {
margin: 1.2rem 0;
padding-left: 1.5rem;
border-left: 2px solid var(--border-color-darker);
}
.verse-ref {
font-weight: 600;
margin-bottom: 0.5rem;
}
.verse-ref a {
color: var(--link-color);
text-decoration: none;
border-bottom: 1px solid var(--border-color-dark);
}
.verse-ref a:hover {
border-bottom-color: var(--link-hover);
}
.verse-text {
max-width: 60%;
font-style: italic;
color: var(--text-secondary);
line-height: 1.8;
}
.intro-text {
max-width: 60%;
font-size: 1.2rem;
line-height: 1.9;
margin: 1rem 0;
}
.toc {
max-width: 55%;
margin: 2rem 0;
padding: 1.5rem;
border-left: 3px solid var(--border-color-darker);
}
.toc h2 {
margin-top: 0;
font-size: 1.1rem;
font-weight: 600;
margin-bottom: 1rem;
}
.toc ul {
list-style: none;
padding: 0;
margin: 0;
}
.toc li {
margin: 0.5rem 0;
line-height: 1.6;
}
.toc a {
color: var(--text-color);
text-decoration: none;
border-bottom: 1px solid transparent;
}
.toc a:hover {
color: var(--link-color);
border-bottom-color: var(--link-color);
}
.toc li.toc-h3 {
padding-left: 1.5rem;
font-size: 0.95rem;
}
@media (max-width: 768px) {
.resource-item-description,
.verse-text,
.intro-text,
.toc {
max-width: 100%;
}
}
</style>
{% endblock %}
{% block content %}
<h1>{{ page_title }}</h1>
<p class="subtitle">{{ page_subtitle }}</p>
<nav class="toc" id="toc">
<h2>Contents</h2>
<ul id="toc-list"></ul>
</nav>
{% if intro_sidenotes %}
<section>
{% for intro in intro_sidenotes %}
<p class="intro-text">{{ intro.text | link_names | link_verses | safe }}</p>
{% endfor %}
</section>
{% endif %}
{% for category, items in resource_data.items() %}
<section class="resource-section">
<h2>{{ category }}</h2>
{% for item_name, item in items.items() %}
<article class="resource-entry">
<h3 class="resource-name"><a href="{{ base_url }}/{{ item_name|lower|replace(' ', '-')|replace("'", '') }}">{{ item_name }}</a></h3>
<p class="resource-item-title">{{ item.title }}</p>
<div class="resource-item-description">
{{ item.description | link_names | link_verses | safe }}
</div>
{% if item.verses %}
<div class="verse-list">
{% for verse in item.verses %}
<div class="verse-item">
<div class="verse-ref">
{% set ref_parts = verse.reference.rsplit(' ', 1) %}
{% if ref_parts|length == 2 %}
{% set book_name = ref_parts[0] %}
{% set chapter_verse = ref_parts[1] %}
{% if ':' in chapter_verse %}
{% set ch = chapter_verse.split(':')[0] %}
{% set v = chapter_verse.split(':')[1].split('-')[0] %}
<a href="/book/{{ book_name }}/chapter/{{ ch }}/verse/{{ v }}">{{ verse.reference }}</a>
{% else %}
{{ verse.reference }}
{% endif %}
{% else %}
{{ verse.reference }}
{% endif %}
</div>
<div class="verse-text">{{ verse.text | link_names | safe }}</div>
</div>
{% endfor %}
</div>
{% endif %}
</article>
{% endfor %}
</section>
{% endfor %}
<script>
document.addEventListener('DOMContentLoaded', function() {
const tocList = document.getElementById('toc-list');
const headings = document.querySelectorAll('section h2, section h3, section article h3');
headings.forEach((heading, index) => {
if (!heading.id) {
heading.id = 'section-' + heading.textContent.toLowerCase().replace(/[^a-z0-9]+/g, '-');
}
const li = document.createElement('li');
if (heading.tagName === 'H3') {
li.classList.add('toc-h3');
}
const a = document.createElement('a');
a.href = '#' + heading.id;
a.textContent = heading.textContent;
li.appendChild(a);
tocList.appendChild(li);
});
});
</script>
{% endblock %}
@@ -1,212 +0,0 @@
{% extends "base.html" %}
{% block title %}The Ten Commandments - KJV Study{% endblock %}
{% block description %}Study the Ten Commandments given by God to Moses on Mount Sinai - the moral law that reveals God's holy character and humanity's need for grace.{% endblock %}
{% block head %}
<style>
.commandment-section {
margin: 1.5rem 0;
padding-top: 1rem;
}
.commandment-section:not(:first-of-type) {
border-top: 1px solid #eee;
}
.commandment-entry {
margin: 1.5rem 0 2rem 0;
}
.commandment-name {
font-size: 1.8rem;
font-weight: 400;
margin-bottom: 0.25rem;
}
.commandment-name a {
color: var(--link-color);
text-decoration: none;
}
.commandment-name a:hover {
color: var(--link-hover);
border-bottom: 1px solid var(--link-hover);
}
.commandment-title {
font-size: 1.1rem;
color: #666;
font-style: italic;
margin-bottom: 1rem;
}
.commandment-description {
max-width: 60%;
font-size: 1.2rem;
line-height: 1.9;
margin: 1.5rem 0;
}
.verse-list {
margin: 1.5rem 0 0 0;
}
.verse-item {
margin: 1.2rem 0;
padding-left: 1.5rem;
border-left: 2px solid #ddd;
}
.verse-ref {
font-weight: 600;
margin-bottom: 0.5rem;
}
.verse-ref a {
color: #333;
text-decoration: none;
border-bottom: 1px solid #ddd;
}
.verse-ref a:hover {
border-bottom-color: #333;
}
.verse-text {
max-width: 60%;
font-style: italic;
color: #444;
line-height: 1.8;
}
.intro-text {
max-width: 60%;
font-size: 1.2rem;
line-height: 1.9;
margin: 1rem 0;
}
.toc {
max-width: 55%;
margin: 2rem 0;
padding: 1.5rem;
border-left: 3px solid var(--border-color-darker);
}
.toc h2 {
margin-top: 0;
font-size: 1.1rem;
font-weight: 600;
margin-bottom: 1rem;
}
.toc ul {
list-style: none;
padding: 0;
margin: 0;
}
.toc li {
margin: 0.5rem 0;
line-height: 1.6;
}
.toc a {
color: var(--text-color);
text-decoration: none;
border-bottom: 1px solid transparent;
}
.toc a:hover {
color: var(--link-color);
border-bottom-color: var(--link-color);
}
.toc li.toc-h3 {
padding-left: 1.5rem;
font-size: 0.95rem;
}
</style>
{% endblock %}
{% block content %}
<h1>The Ten Commandments</h1>
<p class="subtitle">The Moral Law of God</p>
<nav class="toc" id="toc">
<h2>Contents</h2>
<ul id="toc-list"></ul>
</nav>
<section>
<p class="intro-text"><span class="newthought">The Ten Commandments</span>, or Decalogue, were given by God to Moses on Mount Sinai, written by the finger of God upon two tablets of stone.<label for="sn-decalogue" class="margin-toggle sidenote-number"></label>
<input type="checkbox" id="sn-decalogue" class="margin-toggle"/>
<span class="sidenote">The Hebrew עֲשֶׂרֶת הַדְּבָרִים (<em>aseret ha-devarim</em>), "the ten words," gives us the term "Decalogue." These commandments summarize the moral law, expressing God's unchanging standards of righteousness for all humanity. They reveal both God's holy character and humanity's sinful condition.</span> These ten words constitute the summary of the moral law, revealing God's requirements for right relationship with Himself and with others.</p>
<p class="intro-text">The commandments divide naturally into two tables: the first four addressing duties toward God, the remaining six addressing duties toward neighbor.<label for="sn-tables" class="margin-toggle sidenote-number"></label>
<input type="checkbox" id="sn-tables" class="margin-toggle"/>
<span class="sidenote">Jesus summarized the entire Law with two commandments: love God with all your heart, soul, mind, and strength (encompassing the first table), and love your neighbor as yourself (encompassing the second). He declared, "On these two commandments hang all the law and the prophets" (Matthew 22:37-40).</span> Christ affirmed that these commandments reveal the minimum requirements of love—first toward God, then toward neighbor.</p>
</section>
{% for category, commandments in commandments_data.items() %}
<section class="commandment-section">
<h2>{{ category }}</h2>
{% for commandment_name, commandment in commandments.items() %}
<article class="commandment-entry">
<h3 class="commandment-name"><a href="/ten-commandments/{{ commandment_name|lower|replace(' ', '-')|replace("'", '') }}">{{ commandment_name }}</a></h3>
<p class="commandment-title">{{ commandment.title }}</p>
<div class="commandment-description">
{{ commandment.description | safe }}
</div>
{% if commandment.verses %}
<div class="verse-list">
{% for verse in commandment.verses %}
<div class="verse-item">
<div class="verse-ref">
{% set ref_parts = verse.reference.split(' ') %}
{% if ref_parts|length >= 2 %}
{% set chapter_verse = ref_parts[-1] %}
{% if ':' in chapter_verse %}
{% set chapter = chapter_verse.split(':')[0] %}
{% set verse_num = chapter_verse.split(':')[1] %}
{% set book = ' '.join(ref_parts[:-1]) %}
<a href="/book/{{ book }}/chapter/{{ chapter }}/verse/{{ verse_num }}">{{ verse.reference }}</a>
{% endif %}
{% endif %}
</div>
<div class="verse-text">{{ verse.text | link_names | safe }}</div>
</div>
{% endfor %}
</div>
{% endif %}
</article>
{% endfor %}
</section>
{% endfor %}
<script>
document.addEventListener('DOMContentLoaded', function() {
const tocList = document.getElementById('toc-list');
const headings = document.querySelectorAll('section h2, section h3, section article h3');
headings.forEach((heading, index) => {
if (!heading.id) {
heading.id = 'section-' + heading.textContent.toLowerCase().replace(/[^a-z0-9]+/g, '-');
}
const li = document.createElement('li');
if (heading.tagName === 'H3') {
li.classList.add('toc-h3');
}
const a = document.createElement('a');
a.href = '#' + heading.id;
a.textContent = heading.textContent;
li.appendChild(a);
tocList.appendChild(li);
});
});
</script>
{% endblock %}
+5
View File
@@ -36,3 +36,8 @@ kjvstudy_org = ["static/*", "templates/*"]
[tool.uv]
package = true
[dependency-groups]
dev = [
"pytest>=8.3.5",
]
Generated
+8
View File
@@ -353,6 +353,11 @@ dev = [
{ name = "pytest-xdist" },
]
[package.dev-dependencies]
dev = [
{ name = "pytest" },
]
[package.metadata]
requires-dist = [
{ name = "biblepy", specifier = ">=0.1.3" },
@@ -367,6 +372,9 @@ requires-dist = [
]
provides-extras = ["dev"]
[package.metadata.requires-dev]
dev = [{ name = "pytest", specifier = ">=8.3.5" }]
[[package]]
name = "markdown-it-py"
version = "3.0.0"