mirror of
https://github.com/kennethreitz/kjvstudy.org.git
synced 2026-06-05 14:50:17 +00:00
Clean up scripts
This commit is contained in:
@@ -1,114 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Add missing Mark commentary verses."""
|
||||
import json
|
||||
|
||||
# Load existing Mark commentary
|
||||
with open('kjvstudy_org/data/verse_commentary/mark.json', 'r') as f:
|
||||
mark_data = json.load(f)
|
||||
|
||||
# Commentary data to add - I'll build this incrementally
|
||||
# Due to length constraints, I'm creating a comprehensive version
|
||||
|
||||
commentary_data = {
|
||||
"7": {
|
||||
"29": {
|
||||
"analysis": r"""<strong>For this saying go thy way; the devil is gone out of thy daughter</strong>—Jesus commends the Syrophoenician woman's persistent faith. Her humble response comparing herself to a dog eating crumbs demonstrated theological insight. She acknowledged Israel's priority while trusting that God's abundance extends beyond Jewish boundaries.<br><br>Jesus declares <strong>the devil is gone out</strong> using the Greek perfect tense, indicating completed action with ongoing results. The demon's expulsion was instantaneous and permanent. Remarkably, Jesus heals at a distance without seeing the child—demonstrating His sovereign authority transcends physical proximity.<br><br>This account breaks multiple boundaries: geographical (Gentile territory), ethnic (Phoenician woman), gender (woman initiating dialogue), and religious (pagan). Yet Jesus responds to persistent faith wherever He finds it. Her boldness teaches that true faith is active, relentless pursuit of Christ despite seeming rejection.""",
|
||||
"historical": "This miracle occurred in Tyre and Sidon (v.24), Gentile coastal cities in Phoenicia (modern Lebanon). Jesus had withdrawn after controversy with Pharisees (7:1-23). His ministry to this Gentile woman prefigures the gospel's extension to all nations—the children's bread would reach the Gentiles once Israel rejected their Messiah. The woman's persistence despite apparent rejection demonstrates extraordinary faith that secured what Jerusalem's religious establishment would reject.",
|
||||
"questions": [
|
||||
"How does this woman's persistent faith despite apparent rejection challenge your approach to prayer and seeking Christ?",
|
||||
"What does Jesus healing at a distance reveal about His authority transcending physical, geographical, and ethnic boundaries?",
|
||||
"How does this account prepare for the Great Commission and the gospel going to all nations?"
|
||||
]
|
||||
},
|
||||
"30": {
|
||||
"analysis": r"""<strong>She found the devil gone out, and her daughter laid upon the bed</strong>—The mother returns home to witness the fulfilled promise. The daughter was peacefully resting, no longer convulsing or tormented. The Greek perfect participle emphasizes the demon's complete and permanent departure—exactly as Jesus declared.<br><br>This demonstrates the reliability of Christ's word. He spoke deliverance; the woman believed; reality confirmed His promise. This pattern models Christian faith—believing promises we cannot yet see, trusting that Christ's word accomplishes what it declares. The demon's departure brought visible transformation: from torment to peace, from chaos to rest.<br><br>This pictures salvation's effect—Christ's word liberates from spiritual bondage, replacing Satan's tyranny with God's peace. When Christ speaks freedom, no demon can resist; when He declares peace, no force can disturb it.""",
|
||||
"historical": "First-century demonic possession often manifested physically—convulsions, violence, self-harm. The daughter's peaceful repose signaled complete liberation. That Jesus healed without elaborate ritual contrasts with Jewish and pagan exorcism practices involving complex incantations. His simple word sufficed—demonstrating messianic authority over all spiritual powers. This woman's testimony likely prepared the Decapolis region for Jesus's later ministry there (7:31).",
|
||||
"questions": [
|
||||
"How does finding Jesus's promise fulfilled strengthen your trust in God's Word even when you cannot yet see results?",
|
||||
"What does the daughter's peaceful rest reveal about Christ's salvation—is it partial or complete, temporary or permanent?",
|
||||
"In what areas do you need to believe Christ's word of liberation before seeing visible evidence?"
|
||||
]
|
||||
},
|
||||
"31": {
|
||||
"analysis": r"""<strong>Departing from Tyre and Sidon, he came unto the sea of Galilee, through the midst of the coasts of Decapolis</strong>—Jesus's geographical movements are theologically significant. This circuitous route—traveling north through Sidon, then southeast through the Decapolis (ten cities), a Gentile region—indicates intentional ministry among Gentiles rather than returning directly to Galilee.<br><br>The <strong>Decapolis</strong> was where Jesus previously healed the Gerasene demoniac who proclaimed throughout the region what Jesus had done (Mark 5:20). Now Jesus returns, and the people bring Him a deaf-mute (v.32). Faithful witness prepared soil for fruitful ministry.<br><br>Theologically, Jesus's Gentile ministry prefigures the Great Commission. Though His earthly mission primarily targeted Israel (Matthew 15:24), He repeatedly ministered to Gentiles—foreshadowing the gospel going to all nations and breaking down the dividing wall between Jew and Gentile (Ephesians 2:14). Isaiah prophesied Messiah would be a light for the Gentiles (Isaiah 49:6).""",
|
||||
"historical": "The Decapolis was a league of ten Greco-Roman cities established after Pompey's conquest (63 BC), predominantly Gentile centers of Hellenistic culture. That Jesus traveled extensively through Gentile territory demonstrates His mission's universal scope. The religious establishment criticized Him for eating with sinners (Mark 2:16); His ministry among idol-worshiping pagans was even more scandalous. Yet Jesus came to seek and save the lost (Luke 19:10), transcending ethnic and religious boundaries.",
|
||||
"questions": [
|
||||
"How does Jesus's intentional Gentile ministry challenge ethnic, cultural, or social boundaries you erect regarding who deserves to hear the gospel?",
|
||||
"What does Jesus's circuitous travel route teach about divine sovereignty in arranging ministry appointments?",
|
||||
"How does earlier testimony preparing the Decapolis illustrate the relationship between faithful witness and gospel receptivity?"
|
||||
]
|
||||
},
|
||||
"32": {
|
||||
"analysis": r"""<strong>They bring unto him one that was deaf, and had an impediment in his speech</strong>—The Greek describes one who speaks with difficulty—possibly mute or severely speech-impaired. This rare word appears in the Septuagint of Isaiah 35:6, which prophesies messianic signs: the lame leaping and the tongue of the dumb singing. Mark's vocabulary deliberately evokes Isaiah's prophecy, signaling that Jesus's healing fulfills messianic expectations.<br><br><strong>They beseech him to put his hand upon him</strong>—the crowd, presumably Gentiles in the Decapolis, showed faith by bringing the man to Jesus. Their request for Jesus's touch demonstrates belief that His touch conveys healing power. This man's condition created profound isolation—unable to hear or speak clearly, he lived in relational disconnection. His healing restored not just physical faculties but capacity for relationship and community.<br><br>Spiritually, this pictures humanity's pre-salvation state: deaf to God's voice, unable to speak His praise, isolated from divine-human communion.""",
|
||||
"historical": "In the ancient world, disabilities carried severe social stigma, often interpreted as divine judgment. Those unable to hear or speak faced limited economic opportunities and social marginalization. Jesus's consistent healing of such individuals demonstrated God's heart toward the marginalized. The crowd's compassionate action reflects the earlier testimony's impact in the Decapolis—when the Gerasene demoniac proclaimed what Jesus had done (Mark 5:20), skepticism gave way to expectant faith.",
|
||||
"questions": [
|
||||
"How does this man's deaf-muteness illustrate spiritual deafness to God's voice and inability to worship apart from Christ's touch?",
|
||||
"What does the crowd's compassionate action teach about intercessory faith for those who cannot approach Christ themselves?",
|
||||
"How does Jesus's healing of the marginalized demonstrate the kingdom's upside-down values compared to worldly hierarchies?"
|
||||
]
|
||||
},
|
||||
"33": {
|
||||
"analysis": r"""<strong>He took him aside from the multitude</strong>—Jesus withdrew the man privately, demonstrating sensitivity to human dignity. Public spectacle was not Jesus's goal; healing the person was. This allowed the man undivided attention without overwhelming crowds. Jesus individualizes care, treating each person uniquely.<br><br><strong>Put his fingers into his ears, and he spit, and touched his tongue</strong>—Jesus employed physical actions communicating healing intention even to a deaf man who could not hear verbal explanation. Touching the ears and tongue directly addressed the afflicted areas. The use of saliva, considered to have healing properties in ancient culture, was a tangible sign the man could understand.<br><br>Why these physical means? Jesus did not need ritual—His word alone sufficed (John 4:50). Rather, these actions accommodated the man's condition, using sensory communication he could perceive. This models incarnational ministry—God entering our world, speaking our language, touching our lives in ways we comprehend.""",
|
||||
"historical": "First-century Jewish and Greco-Roman cultures both attributed healing properties to saliva. Jesus adapted cultural contexts, using familiar frameworks to communicate miraculous realities. Taking the man aside also protected him from potential mockery. Crowds could be fickle—seeking entertainment rather than genuine faith. Jesus guarded the man's dignity, allowing healing in relational intimacy rather than public spectacle.",
|
||||
"questions": [
|
||||
"How does Jesus's use of physical means demonstrate God's accommodating grace in meeting humans where we are?",
|
||||
"What does taking the man aside privately teach about ministry prioritizing individuals' dignity over public spectacle?",
|
||||
"How does Jesus's varied healing methods challenge our tendency to formularize God's work or insist on uniform methodology?"
|
||||
]
|
||||
},
|
||||
"34": {
|
||||
"analysis": r"""<strong>Looking up to heaven, he sighed</strong>—Jesus's upward gaze directed the man's attention to heaven, the source of healing power. Though Jesus possessed intrinsic divine authority, He consistently modeled dependence on the Father (John 5:19). The Greek verb for sighed or groaned reveals Jesus's emotional response to human suffering—He was not clinically detached but deeply moved by the brokenness sin introduced into creation.<br><br>This sigh echoes Romans 8:22-23, where Paul describes all creation groaning under bondage to corruption. Jesus entered fully into humanity's suffering, bearing our griefs and sorrows (Isaiah 53:4). His groan was not frustration but lament over sin's consequences and compassionate empathy with human affliction.<br><br><strong>Ephphatha, that is, Be opened</strong>—Mark preserves Jesus's Aramaic word, the common language of first-century Palestinian Jews, then translates for Greek readers. The command addressed both ears and speech simultaneously—comprehensive healing restoring full communicative capacity. The Aramaic preservation adds eyewitness authenticity and emotional immediacy.""",
|
||||
"historical": "Aramaic was the lingua franca of the eastern Roman Empire. Jesus's ministry occurred in Aramaic, though the Gospels were written in Greek for wider dissemination. Mark occasionally preserves Aramaic phrases adding authenticity. Jesus's groan reflects His true humanity—though fully divine, He experienced grief, compassion, and sorrow. Hebrews 4:15 affirms He was tempted in every way, just as we are, making Him a sympathetic High Priest who understands human suffering firsthand.",
|
||||
"questions": [
|
||||
"How does Jesus's sigh reveal His compassionate entry into human suffering, and how does this shape your understanding of Christ's empathy?",
|
||||
"What does looking to heaven before healing teach about dependence on God even in ministry done through divine authority?",
|
||||
"How does Jesus's use of the man's heart language demonstrate personal, intimate care rather than formulaic ministry?"
|
||||
]
|
||||
},
|
||||
"35": {
|
||||
"analysis": r"""<strong>Straightway his ears were opened, and the string of his tongue was loosed, and he spake plain</strong>—Mark's characteristic adverb straightway emphasizes instantaneous healing. No gradual improvement—the man's ears were opened (passive voice: God acted) and he heard perfectly. The string of his tongue was loosed—literally the bond was loosed—depicting speech impediment as bondage from which Christ liberates.<br><br>The imagery of loosing bonds recalls Isaiah 58:6: loose the bonds of wickedness, let the oppressed go free. Jesus's healing ministry embodied jubilee liberation—the Messiah releasing captives (Luke 4:18-19). Physical healings were signs pointing to deeper spiritual reality: Christ came to unbind humanity from sin's bondage, open deaf ears to God's voice, and loose mute tongues to worship.<br><br><strong>He spake plain</strong>—not halting or garbled but clearly, correctly. This completeness characterizes all Jesus's healings—He does not partially restore but fully renews. This previews eschatological restoration when all creation is made new—not partially improved but completely glorified.""",
|
||||
"historical": "This miracle fulfills Isaiah 35:5-6: Then the eyes of the blind shall be opened, and the ears of the deaf unstopped; then shall the lame man leap like a deer, and the tongue of the mute sing for joy. Isaiah prophesied messianic age markers—Jesus's healings authenticated His messianic identity. When John the Baptist's disciples asked if Jesus was the Coming One, Jesus responded by citing His healings (Matthew 11:4-5). The man's immediate, perfect speech testified to the healing's genuineness—no psychological explanation could account for instant transformation.",
|
||||
"questions": [
|
||||
"How does the instant, complete nature of this healing illustrate that salvation is God's sovereign work, not human achievement?",
|
||||
"In what ways does physical healing serve as a sign pointing to deeper spiritual healing from sin's bondage?",
|
||||
"What bonds in your life need Christ's liberating word to loose them, and how do you seek His transforming touch?"
|
||||
]
|
||||
},
|
||||
"36": {
|
||||
"analysis": r"""<strong>He charged them that they should tell no man</strong>—Jesus repeatedly commanded silence after healings, particularly in Mark's Gospel. This messianic secret motif has several explanations: (1) Jesus wanted to avoid premature confrontation before His appointed hour; (2) popular messianic expectations focused on political liberation from Rome rather than spiritual salvation—widespread publicity would attract crowds seeking earthly kingdom establishment; (3) Jesus prioritized teaching and relationship over mere signs.<br><br><strong>But the more he charged them, so much the more a great deal they published it</strong>—human nature emerges: the more Jesus commanded silence, the more zealously they proclaimed. The Greek verb means proclaimed, heralded—the same word used for gospel preaching. They could not contain their witness. Mark's irony is palpable: those commanded to silence shout loudest, while religious leaders remain silent or oppose.<br><br>This illustrates gospel power: genuine encounter with Christ produces irrepressible testimony. The healed cannot stay silent (Acts 4:20). Conversely, those seeking signs for entertainment miss the point entirely.""",
|
||||
"historical": "First-century Palestine seethed with messianic expectation and revolutionary fervor. Multiple messianic pretenders arose promising to overthrow Rome. If Jesus was publicly proclaimed as Messiah-miracle-worker, crowds would try to force Him into that mold (John 6:15 records an attempt). Such movements provoked Roman crackdowns. Jesus's timing was providential—He would be proclaimed Messiah during Passion Week when the cross was imminent, after teaching clarified the kingdom's spiritual nature. Until then, premature publicity threatened His mission's completion.",
|
||||
"questions": [
|
||||
"Why does genuine encounter with Christ produce irrepressible witness, and how does this contrast with dutiful evangelism lacking transformation?",
|
||||
"What does Jesus's concern about premature publicity teach about the relationship between popularity and faithful ministry?",
|
||||
"How can you balance avoiding celebrity or spectacle with Christ's command to publicly witness and proclaim the gospel?"
|
||||
]
|
||||
},
|
||||
"37": {
|
||||
"analysis": r"""<strong>Were beyond measure astonished</strong>—Mark intensifies the Greek: the adverb means exceedingly beyond measure, while the verb indicates overwhelming astonishment, being struck out of one's senses. Their amazement exceeded normal surprise—they witnessed something categorically unprecedented. This profound awe is appropriate response to divine in-breaking.<br><br><strong>He hath done all things well</strong>—this declaration echoes Genesis 1:31: God saw everything that he had made, and behold, it was very good. The crowd recognizes Jesus's works parallel creation itself—He does all things well just as God did in creating the world. This is not merely good but beautiful, proper, fitting—restoration to original design. Jesus's healings reverse the Fall's curse, previewing new creation where all is made beautiful again.<br><br><strong>He maketh both the deaf to hear, and the dumb to speak</strong>—this precise language quotes Isaiah 35:5-6, the messianic prophecy. The crowd's words align perfectly with Isaiah's vision, testifying that Jesus fulfills prophetic expectations. This acclamation from Gentiles demonstrates that outsiders recognized what Jerusalem's scribes refused to acknowledge.""",
|
||||
"historical": "The Decapolis region's enthusiastic response contrasts with Galilean rejection (Mark 6:1-6) and Pharisaic opposition. Those who should have recognized their Messiah—Jews schooled in Scripture, religious leaders—rejected Him. Meanwhile, Gentiles in pagan territory immediately recognized divine action. This pattern anticipates the gospel's trajectory: rejected by Israel's majority, it would spread to Gentiles worldwide (Acts 13:46, Romans 11:11-12). He hath done all things well also testified against critics who accused Jesus of working through Beelzebul (Mark 3:22)—evil cannot produce such good.",
|
||||
"questions": [
|
||||
"How does recognizing that Jesus does all things well shape your trust in His sovereignty over circumstances that seem chaotic or broken?",
|
||||
"Why do outsiders and the marginalized often recognize Jesus's identity more readily than religious insiders?",
|
||||
"In what ways do Jesus's healings preview the new creation where God will make all things new (Revelation 21:5)?"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Now add Mark 11:27-33 and 15:40-47
|
||||
# (Continuing with the rest of the verses...)
|
||||
|
||||
print("Adding Mark 7:29-37...")
|
||||
for chapter, verses in commentary_data.items():
|
||||
if chapter not in mark_data['commentary']:
|
||||
mark_data['commentary'][chapter] = {}
|
||||
for verse, content in verses.items():
|
||||
mark_data['commentary'][chapter][verse] = content
|
||||
|
||||
print(f"Added {len(commentary_data['7'])} verses to Mark chapter 7")
|
||||
|
||||
# Write back
|
||||
with open('kjvstudy_org/data/verse_commentary/mark.json', 'w') as f:
|
||||
json.dump(mark_data, f, indent=2, ensure_ascii=False)
|
||||
|
||||
print("Successfully updated mark.json!")
|
||||
@@ -1,75 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Add missing Amos commentary."""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
PROJECT_ROOT = Path(__file__).parent.parent
|
||||
DATA_DIR = PROJECT_ROOT / "kjvstudy_org" / "data" / "verse_commentary"
|
||||
|
||||
filepath = DATA_DIR / "amos.json"
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
commentary = data.get("commentary", {})
|
||||
|
||||
# Add new entries - Part 1: Chapters 1-3
|
||||
new_entries = {
|
||||
"1": {
|
||||
"14": {
|
||||
"analysis": "<strong>I will kindle a fire in the wall of Rabbah</strong> (אַצִּית אֵשׁ בְּחוֹמַת רַבָּה, <em>atsit esh b'chomat rabbah</em>)—God's judgment comes as consuming fire against Ammon's capital. The Hebrew אַצִּית (<em>atsit</em>, 'I will kindle') emphasizes divine agency; this is not merely human warfare but Yahweh's direct intervention. <strong>With shouting in the day of battle, with a tempest in the day of the whirlwind</strong> combines military siege (תְּרוּעָה, <em>teruah</em>, the war cry) with natural disaster imagery—God orchestrates both human armies and cosmic forces for judgment.<br><br>Rabbah (modern Amman, Jordan) represented Ammonite pride and military power. The 'palaces' (אַרְמְנוֹתֶיהָ, <em>armenoteha</em>) symbolize accumulated wealth gained through oppression. This prophecy was fulfilled when Nebuchadnezzar conquered Ammon in 582 BC, though Christ ultimately judges all nations at His return (Matthew 25:31-46).",
|
||||
"historical": "Amos prophesied around 760-750 BC during Jeroboam II's reign. Ammon, descended from Lot (Genesis 19:38), had longstanding enmity with Israel. They committed atrocities against Gilead (Amos 1:13), including ripping open pregnant women to expand territory—crimes that demanded divine retribution.",
|
||||
"questions": [
|
||||
"How does God's sovereignty over nations challenge modern nationalism and the belief that any country is beyond judgment?",
|
||||
"What 'palaces' of accumulated wealth in your life might represent injustice or oppression of others?",
|
||||
"How should the certainty of divine judgment against evil comfort those who suffer injustice today?"
|
||||
]
|
||||
},
|
||||
"15": {
|
||||
"analysis": "<strong>Their king shall go into captivity, he and his princes together</strong> (וְהָלַךְ מַלְכָּם בַּגּוֹלָה, <em>v'halach malkam bagolah</em>)—The Hebrew מַלְכָּם (<em>malkam</em>) is a wordplay: it means both 'their king' and references Molech/Milcom, the Ammonite deity to whom children were sacrificed (1 Kings 11:5, 33). Both human rulers and false gods prove powerless before Yahweh. <strong>Saith the LORD</strong> (אָמַר יְהוָה, <em>amar YHWH</em>) is the prophetic authentication formula—this is not Amos's opinion but God's irrevocable decree.<br><br>The collapse of both political and religious systems signifies total judgment. No refuge remains—not in military might, political alliances, or false worship. This pattern repeats throughout history when nations trust in anything besides the true God.",
|
||||
"historical": "The Babylonian exile fulfilled this prophecy. Archaeological evidence shows Rabbah was destroyed in the 6th century BC. Ironically, Ammonites had long practiced child sacrifice to Molech, and now their god and king both went into captivity—helpless before the covenant God of Israel.",
|
||||
"questions": [
|
||||
"What false 'kings' or authorities do people trust in today instead of the LORD—government, wealth, ideology, self?",
|
||||
"How does the exile of both human rulers and false gods demonstrate that all idolatry ends in captivity?",
|
||||
"In what ways might Christians today be trusting in political power rather than the kingdom of God?"
|
||||
]
|
||||
}
|
||||
},
|
||||
"2": {
|
||||
"15": {
|
||||
"analysis": "In this verse detailing Moab's coming judgment, three classes of warriors prove helpless: <strong>he that handleth the bow</strong> (תֹּפֵשׂ הַקֶּשֶׁת, <em>tofes haqeshet</em>, the archer), <strong>he that is swift of foot</strong> (קַל בְּרַגְלָיו, <em>qal b'raglav</em>, literally 'light in his feet'), and <strong>he that rideth the horse</strong> (רֹכֵב הַסּוּס, <em>rochev hasus</em>, the cavalry). The threefold repetition—'shall not deliver himself' (לֹא יְמַלֵּט, <em>lo yemalet</em>)—hammers home human inability to escape divine judgment.<br><br>Ancient warfare relied on these three military advantages: long-range attack (archers), speed (runners for messages and retreat), and mobile power (cavalry). Yet when God judges, no human strategy suffices. This prefigures Romans 8:33—when God justifies, who can condemn? Conversely, when God condemns, no created thing can deliver (Romans 8:38-39).",
|
||||
"historical": "Moab, descended from Lot (Genesis 19:37), occupied territory east of the Dead Sea. They possessed skilled archers and swift-footed messengers. This prophecy found fulfillment in multiple invasions: by Assyria (715 BC), Babylon (582 BC), and finally Arab conquest that erased Moabite identity entirely.",
|
||||
"questions": [
|
||||
"What modern 'advantages'—technology, wealth, intelligence—do people trust for security instead of God?",
|
||||
"How does the futility of military might in escaping judgment challenge nations that trust in weapons?",
|
||||
"If no one can flee from God's judgment, what makes the gospel offer of escape through Christ so extraordinary?"
|
||||
]
|
||||
},
|
||||
"16": {
|
||||
"analysis": "<strong>He that is courageous among the mighty shall flee away naked in that day</strong> (וְאַמִּיץ לִבּוֹ בַגִּבּוֹרִים עָרוֹם יָנוּס, <em>v'amitz libo bagiborim arom yanus</em>)—The Hebrew emphasizes irony: אַמִּיץ (<em>amitz</em>) means 'strong, courageous,' yet even the bravest warrior flees עָרוֹם (<em>arom</em>, 'naked, stripped of armor'). The stripping represents complete defeat and humiliation; ancient warriors viewed losing armor as disgrace worse than death. <strong>Saith the LORD</strong> seals this as prophetic certainty, not military speculation.<br><br>This reversal motif appears throughout Scripture: the proud brought low (Isaiah 2:11-17), the mighty made weak (1 Corinthians 1:27-29). Human courage crumbles before divine judgment—no bravado, ideology, or self-confidence can stand when God rises to judge. Only those covered in Christ's righteousness (Isaiah 61:10) have a covering that endures judgment.",
|
||||
"historical": "Moabite warriors were renowned for courage (2 Kings 3:26-27 records their desperation in battle). Yet Nebuchadnezzar's armies stripped them of both armor and land. The 'nakedness' fulfills the covenant curses of Deuteronomy 28:48—Israel's judgment falling on nations who opposed God's purposes.",
|
||||
"questions": [
|
||||
"What does it mean to face judgment 'naked'—without the covering of Christ's righteousness?",
|
||||
"How does this verse challenge cultures that glorify human courage and strength as ultimate values?",
|
||||
"In what areas of life are you trusting your own 'courage' rather than seeking refuge in God?"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Merge new entries
|
||||
for chapter, verses in new_entries.items():
|
||||
if chapter not in commentary:
|
||||
commentary[chapter] = {}
|
||||
for verse, entry in verses.items():
|
||||
if verse not in commentary[chapter]:
|
||||
commentary[chapter][verse] = entry
|
||||
print(f"Added Amos {chapter}:{verse}")
|
||||
|
||||
data["commentary"] = commentary
|
||||
|
||||
# Save
|
||||
with open(filepath, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, ensure_ascii=False, indent=2)
|
||||
|
||||
print(f"\nSaved to {filepath}")
|
||||
@@ -1,274 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Add remaining Amos commentary - Chapters 4-9."""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
PROJECT_ROOT = Path(__file__).parent.parent
|
||||
DATA_DIR = PROJECT_ROOT / "kjvstudy_org" / "data" / "verse_commentary"
|
||||
|
||||
filepath = DATA_DIR / "amos.json"
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
commentary = data.get("commentary", {})
|
||||
|
||||
# Remaining Amos commentary
|
||||
new_entries = {
|
||||
"4": {
|
||||
"13": {
|
||||
"analysis": "This doxology proclaims Yahweh's cosmic sovereignty: <strong>He that formeth the mountains</strong> (יֹצֵר הָרִים, <em>yotzer harim</em>)—the participle emphasizes continuous creative power. <strong>And createth the wind</strong> (וּבֹרֵא רוּחַ, <em>uvore ruach</em>)—רוּחַ (<em>ruach</em>) means both 'wind' and 'spirit,' suggesting God's control over both physical and spiritual realms. <strong>And declareth unto man what is his thought</strong> (וּמַגִּיד לְאָדָם מַה־שֵּׂחוֹ, <em>umagid l'adam mah-secho</em>)—God reveals His purposes to humans through prophetic revelation. <strong>That maketh the morning darkness</strong> (עֹשֶׂה שַׁחַר עֵיפָה, <em>oseh shachar eifah</em>)—He controls day and night. <strong>And treadeth upon the high places of the earth</strong> (וְדֹרֵךְ עַל־בָּמֳתֵי אָרֶץ, <em>v'dorech al-bamotei aretz</em>)—walking on earth's high places demonstrates absolute authority. <strong>The LORD, The God of hosts, is his name</strong> (יְהוָה אֱלֹהֵי־צְבָאוֹת שְׁמוֹ, <em>YHWH Elohei-tzva'ot sh'mo</em>).<br><br>This hymnic interruption follows severe judgment oracles, reminding Israel who they're resisting. The God who judges is the Creator-Sustainer of all reality. Similar doxologies appear in Amos 5:8-9 and 9:5-6, structuring the book around God's cosmic majesty—rebellion against such a God guarantees destruction.",
|
||||
"historical": "These doxological fragments may derive from ancient Israelite hymns. Their placement after judgment oracles serves theological purpose: reminding hearers that Amos speaks for the sovereign Creator, not merely offering political opinion. The phrases echo creation language from Genesis and anticipate New Testament Christology (Colossians 1:15-17).",
|
||||
"questions": [
|
||||
"How does recognizing God as Creator of mountains and wind humble human pride and self-sufficiency?",
|
||||
"What does it mean that the same God who reveals His thoughts is also the God who judges sin?",
|
||||
"How should God's cosmic sovereignty shape our understanding of His authority to judge nations and individuals?"
|
||||
]
|
||||
}
|
||||
},
|
||||
"5": {
|
||||
"25": {
|
||||
"analysis": "<strong>Have ye offered unto me sacrifices and offerings in the wilderness forty years, O house of Israel?</strong> (הַזְּבָחִים וּמִנְחָה הִגַּשְׁתֶּם־לִי בַמִּדְבָּר, <em>hazevachim uminchah higashtem-li bamidbar</em>)—This rhetorical question expects 'no' as the answer. During the wilderness wandering (Exodus-Deuteronomy), Israel frequently rebelled rather than worshiped. The Hebrew construction emphasizes the pronoun לִי (<em>li</em>, 'to ME')—even when they performed rituals, their hearts weren't directed toward Yahweh but toward idols (Acts 7:42-43 confirms this interpretation).<br><br>God isn't merely criticizing ritual hypocrisy but exposing deep-rooted idolatry spanning generations. The wilderness generation set a pattern: outward religious conformity masking inward rebellion. This challenges any presumption of covenant faithfulness based on ritual performance rather than heart devotion.",
|
||||
"historical": "Stephen cited this verse in Acts 7:42-43, interpreting it to mean Israel carried idols even in the wilderness. The golden calf incident (Exodus 32) and subsequent rebellions confirm persistent idolatry. Amos addresses 8th-century Israel by reminding them their ancestors' pattern of faithlessness.",
|
||||
"questions": [
|
||||
"How might modern Christians maintain religious rituals while their hearts worship other gods—success, comfort, reputation?",
|
||||
"What does it mean to offer sacrifices 'unto me' versus performing religious duties without heart engagement?",
|
||||
"How does this verse challenge generational assumptions of faithfulness based on religious heritage rather than genuine devotion?"
|
||||
]
|
||||
},
|
||||
"26": {
|
||||
"analysis": "<strong>But ye have borne the tabernacle of your Moloch and Chiun your images</strong> (וּנְשָׂאתֶם אֵת סִכּוּת מַלְכְּכֶם וְאֵת כִּיּוּן צַלְמֵיכֶם, <em>un'satem et sikkut malkechem v'et kiyun tzalmeichem</em>)—Moloch (מֹלֶךְ, <em>molech</em>) was the Ammonite deity requiring child sacrifice; Chiun/Kiyyun (כִּיּוּן, <em>kiyun</em>) likely refers to a star deity, possibly Saturn. <strong>The star of your god, which ye made to yourselves</strong> (כּוֹכַב אֱלֹהֵיכֶם אֲשֶׁר עֲשִׂיתֶם לָכֶם, <em>kochav eloheichem asher asitem lachem</em>)—they created gods with their own hands, inverting the Creator-creature relationship.<br><br>Idolatry always involves exchanging the truth of God for a lie (Romans 1:25), worshiping and serving the creature rather than the Creator. The reference to carrying these idols suggests Israel transported them during wilderness wandering and continued this practice in Canaan—syncretism spanning generations.",
|
||||
"historical": "Acts 7:43 translates differently: 'Remphan' instead of 'Chiun,' following the Septuagint. Both refer to astral deities. Canaanite religion featured star worship, and Israel repeatedly fell into this syncretism (Deuteronomy 4:19; 2 Kings 23:5). Amos exposes how Israel's worship mixed Yahwism with paganism.",
|
||||
"questions": [
|
||||
"What modern 'stars' or celebrities do people worship instead of God—following them, imitating them, trusting their wisdom?",
|
||||
"How does making our own gods—through selective theology or cultural accommodation—repeat Israel's error?",
|
||||
"Why is syncretism (mixing true worship with false) more dangerous than outright paganism?"
|
||||
]
|
||||
},
|
||||
"27": {
|
||||
"analysis": "<strong>Therefore will I cause you to go into captivity beyond Damascus</strong> (וְהִגְלֵיתִי אֶתְכֶם מֵהָלְאָה לְדַמָּשֶׂק, <em>v'higleiti etchem mehale'ah l'Damaseq</em>)—The judgment fits the crime: they carried idols, so God will cause them to be carried away (הִגְלֵיתִי, <em>higleiti</em>, 'I will exile'). <strong>Beyond Damascus</strong> means further than Syria—fulfilled when Assyria (whose capital Nineveh lay northeast of Damascus) deported Israel in 722 BC. <strong>Saith the LORD, whose name is The God of hosts</strong> (אָמַר יְהוָה אֱלֹהֵי־צְבָאוֹת שְׁמוֹ, <em>amar YHWH Elohei-tzva'ot sh'mo</em>)—the covenant God who commands heavenly armies pronounces this irrevocable decree.<br><br>This is measure-for-measure justice: they wanted other gods, so God removes them from the promised land given specifically for worshiping Him alone. Exile is the covenant curse for idolatry (Deuteronomy 28:36, 64-68). Yet even in judgment, God maintains covenant faithfulness—He warned them repeatedly before acting.",
|
||||
"historical": "The Assyrian conquest of 722 BC fulfilled this precisely. Sargon II deported Israelites to Mesopotamia and Media (2 Kings 17:6)—regions 'beyond Damascus.' The ten northern tribes never returned as a nation, becoming the 'lost tribes.' This demonstrates God's faithfulness to His word, even in judgment.",
|
||||
"questions": [
|
||||
"How does exile function as both punishment and mercy—removing people from covenant blessings they despised?",
|
||||
"What modern forms of 'exile' might God use to discipline His people when they pursue idols?",
|
||||
"How should the certainty of God's judgment encourage Christians to take warnings seriously rather than presuming on grace?"
|
||||
]
|
||||
}
|
||||
},
|
||||
"6": {
|
||||
"2": {
|
||||
"analysis": "<strong>Pass ye unto Calneh, and see; and from thence go ye to Hamath the great: then go down to Gath of the Philistines</strong>—God commands Israel to examine three conquered cities as object lessons. Calneh (Assyrian Kullani) fell to Tiglath-Pileser III around 738 BC. Hamath (Syrian city) was defeated by Assyria circa 720 BC. Gath (Philistine city) had been conquered by Uzziah of Judah (2 Chronicles 26:6). <strong>Be they better than these kingdoms? or their border greater than your border?</strong> (הֲטוֹבִים מִן־הַמַּמְלָכוֹת הָאֵלֶּה, <em>hatovim min-hamamlachot ha'eleh</em>)—rhetorical question: if these great cities fell, what makes Israel think they're immune?<br><br>This confronts nationalistic pride and false security. Israel trusted in their covenant status, but covenant unfaithfulness removes covenant protection. If powerful nations fell to judgment, covenantbreakers will fare no better. Peter echoes this: 'judgment must begin at the house of God' (1 Peter 4:17).",
|
||||
"historical": "Amos likely prophesied this between 760-750 BC, before some of these cities fell—making it a genuine prophecy. Israel's complacency during prosperous times blinded them to approaching judgment. They thought their election guaranteed safety, but election without obedience brings greater accountability (Amos 3:2).",
|
||||
"questions": [
|
||||
"What forms of false security—national identity, church membership, religious heritage—do people trust instead of genuine faith?",
|
||||
"How does examining other fallen nations or churches warn against presumption on God's patience?",
|
||||
"Why do prosperous times often breed spiritual complacency and blindness to approaching judgment?"
|
||||
]
|
||||
},
|
||||
"3": {
|
||||
"analysis": "<strong>Ye that put far away the evil day</strong> (הַמְנַדִּים לְיוֹם רָע, <em>hamenadim l'yom ra</em>)—they mentally distance themselves from coming judgment, assuming it won't arrive. The Hebrew נָדָה (<em>nadah</em>) means 'to remove, put at a distance.' <strong>And cause the seat of violence to come near</strong> (וַתַּגִּישׁוּן שֶׁבֶת חָמָס, <em>vatagishun shevet chamas</em>)—while pushing judgment away, they bring violent oppression near. שֶׁבֶת (<em>shevet</em>, 'seat, throne') suggests enthroned violence—injustice institutionalized in their society.<br><br>This describes psychological denial: people suppress awareness of judgment while embracing the very sins that guarantee it. Romans 2:4-5 warns against despising God's patience, storing up wrath. The more people distance themselves from judgment mentally, the closer they bring it actually through continued sin.",
|
||||
"historical": "Israel's prosperity under Jeroboam II created illusion of divine favor despite systemic injustice. The wealthy oppressed the poor while assuming covenant status protected them. This cognitive dissonance—ignoring warnings while multiplying sins—typifies pre-judgment societies throughout Scripture.",
|
||||
"questions": [
|
||||
"How do modern people 'put far away the evil day' by dismissing biblical warnings about judgment?",
|
||||
"What does it mean to have violence 'enthroned' in society—normalized, legalized, institutionalized?",
|
||||
"How can churches avoid the trap of assuming God's patience means approval rather than opportunity for repentance?"
|
||||
]
|
||||
},
|
||||
"4": {
|
||||
"analysis": "<strong>That lie upon beds of ivory</strong> (הַשֹּׁכְבִים עַל־מִטּוֹת שֵׁן, <em>hashochevim al-mitot shen</em>)—ivory-inlaid beds represented extreme luxury in the ancient world. <strong>And stretch themselves upon their couches</strong> (וּסְרֻחִים עַל־עַרְשׂוֹתָם, <em>useruchim al-arsotam</em>)—the verb סָרַח (<em>sarach</em>) implies sprawling indolently. <strong>And eat the lambs out of the flock, and the calves out of the midst of the stall</strong>—consuming the choicest meat without concern for cost or scarcity. This isn't merely enjoying God's blessings but self-indulgent luxury while others starve.<br><br>The condemnation isn't wealth per se but indifference: <strong>they are not grieved for the affliction of Joseph</strong> (Amos 6:6). They feast while their brothers suffer, displaying the same cold self-absorption as Dives ignoring Lazarus (Luke 16:19-31). Luxury that breeds apathy toward suffering is sin.",
|
||||
"historical": "Archaeological excavations at Samaria uncovered ivory fragments from palace decorations, confirming the biblical account. The Northern Kingdom's aristocracy lived in opulence while exploiting the poor through unjust courts, predatory lending, and land seizure—wealth built on others' suffering.",
|
||||
"questions": [
|
||||
"How might modern Christians live in ivory-bed comfort while remaining indifferent to brothers and sisters suffering persecution or poverty?",
|
||||
"What does it mean to consume 'the choicest' of everything while others lack basics—is this stewardship or self-indulgence?",
|
||||
"How can believers cultivate grief over others' affliction rather than insulating ourselves in comfortable isolation?"
|
||||
]
|
||||
},
|
||||
"5": {
|
||||
"analysis": "<strong>That chant to the sound of the viol</strong> (הַפֹּרְטִים עַל־פִּי הַנָּבֶל, <em>haforetim al-pi hanavel</em>)—פָּרַט (<em>parat</em>) means to improvise or play frivolously. <strong>And invent to themselves instruments of musick, like David</strong> (חָשְׁבוּ לָהֶם כְּלֵי־שִׁיר כְּדָוִיד, <em>chashvu lahem klei-shir k'David</em>)—they compare their frivolous entertainment to David's sacred psalmody. This isn't condemning music but mocking their pretension: they think their drunken songs equal David's Spirit-inspired worship.<br><br>The sin is twofold: trivializing worship by equating entertainment with praise, and remaining absorbed in pleasure while the nation faces judgment. Like those on the Titanic playing music as the ship sank, they feast and sing while catastrophe approaches. Revelation 18:22 pronounces similar judgment on Babylon—music ceases when God judges.",
|
||||
"historical": "David invented musical instruments for temple worship (2 Chronicles 7:6). Israel's elite perverted this legacy, using music for self-indulgent entertainment rather than God-honoring worship. They maintained religious forms while hearts pursued pleasure—form without power (2 Timothy 3:5).",
|
||||
"questions": [
|
||||
"How might modern worship music focus more on entertainment and emotional experience than genuine encounter with God?",
|
||||
"What does it mean to remain absorbed in entertainment and leisure while the church or world faces crisis?",
|
||||
"How can Christians discern between enjoying God's gifts (music, food, comfort) and self-indulgent excess that blinds us to others' needs?"
|
||||
]
|
||||
},
|
||||
"6": {
|
||||
"analysis": "<strong>That drink wine in bowls</strong> (הַשֹּׁתִים בְּמִזְרְקֵי יַיִן, <em>hashotim b'mizrekei yayin</em>)—מִזְרָק (<em>mizrak</em>) typically refers to large ceremonial bowls used in temple service for catching sacrificial blood (Exodus 27:3). Drinking wine from such vessels suggests either mocking sacred objects or consuming alcohol in enormous quantities. <strong>And anoint themselves with the chief ointments</strong> (וְרֵאשִׁית שְׁמָנִים יִמְשָׁחוּ, <em>v'reishit shemanim yimshahu</em>)—using premium oils for personal luxury. <strong>But they are not grieved for the affliction of Joseph</strong> (וְלֹא נֶחְלוּ עַל־שֵׁבֶר יוֹסֵף, <em>v'lo nechlu al-shever Yosef</em>)—the verb חָלָה (<em>chalah</em>) means 'to be sick, grieved, wounded.' They feel no pain over their nation's brokenness (שֵׁבֶר, <em>shever</em>, 'fracture, ruin').<br><br>'Joseph' represents the northern tribes (descendants of Joseph's sons Ephraim and Manasseh). While the nation fractures morally and spiritually, the elite remain absorbed in luxury and entertainment. This lack of grief over sin is itself sin—demonstrating hardened hearts impervious to conviction.",
|
||||
"historical": "This describes Israel's aristocracy in the mid-8th century BC. Despite systemic injustice, religious apostasy, and looming Assyrian threat, the wealthy remained self-absorbed. Their callousness toward 'Joseph's affliction' meant indifference to their own people's suffering—the ultimate covenant betrayal.",
|
||||
"questions": [
|
||||
"How do modern Christians numb themselves to the 'affliction of Joseph'—the suffering church worldwide?",
|
||||
"What does it mean to grieve over sin and brokenness rather than merely maintaining comfort and entertainment?",
|
||||
"How can believers cultivate spiritual sensitivity rather than the callousness that luxury often breeds?"
|
||||
]
|
||||
},
|
||||
"7": {
|
||||
"analysis": "<strong>Therefore now shall they go captive with the first that go captive</strong> (לָכֵן עַתָּה יִגְלוּ בְּרֹאשׁ גֹּלִים, <em>lachen atah yiglu v'rosh golim</em>)—the phrase בְּרֹאשׁ גֹּלִים (<em>v'rosh golim</em>, 'at the head of exiles') means they'll be first deported. The leaders in luxury become leaders in exile. <strong>And the banquet of them that stretched themselves shall be removed</strong> (וְסָר מִרְזַח סְרוּחִים, <em>v'sar mirzach seruchim</em>)—מִרְזֵחַ (<em>mirzeach</em>) refers to funeral feasts or revelry; their parties end abruptly.<br><br>This is poetic justice: those who lived most comfortably suffer most severely in judgment. Jesus taught similar reversal: 'many that are first shall be last' (Matthew 19:30). Privilege without responsibility, comfort without compassion, leadership without integrity—all bring greater accountability (Luke 12:48).",
|
||||
"historical": "When Assyria conquered Samaria in 722 BC, they deported the leadership and aristocracy first—standard ancient Near Eastern practice. The wealthy elite who ignored warnings experienced the judgment they dismissed. Archaeological evidence confirms Samaria's destruction and deportation of its upper classes.",
|
||||
"questions": [
|
||||
"How does greater privilege bring greater responsibility and potentially greater judgment?",
|
||||
"What 'banquets' or comforts might God remove to discipline His people and wake them from spiritual apathy?",
|
||||
"How should Christian leaders respond to this warning about being 'first' in judgment if they lead in unfaithfulness?"
|
||||
]
|
||||
},
|
||||
"8": {
|
||||
"analysis": "<strong>The Lord GOD hath sworn by himself</strong> (נִשְׁבַּע אֲדֹנָי יְהוִה בְּנַפְשׁוֹ, <em>nishba Adonai YHWH b'nafsho</em>, literally 'sworn by His soul/life')—when God swears by Himself, the oath is irrevocable (Hebrews 6:13-18). <strong>I abhor the excellency of Jacob, and hate his palaces</strong> (תֹּעֵב אָנֹכִי אֶת־גְּאוֹן יַעֲקֹב וְאַרְמְנֹתָיו שָׂנֵאתִי, <em>toev anochi et-ge'on Ya'akov v'armenotav saneti</em>)—the Hebrew intensifies with both 'abhor' (תָּעַב, <em>ta'av</em>) and 'hate' (שָׂנֵא, <em>sane</em>). גְּאוֹן (<em>ge'on</em>, 'pride, excellency') here means arrogant self-sufficiency, not legitimate glory. <strong>Therefore will I deliver up the city with all that is therein</strong>—total destruction.<br><br>This shocking statement—God abhors and hates His covenant people—demonstrates how sin transforms blessing into curse. Their 'excellency' (covenant status, prosperity) became pride; their palaces (symbols of success) became monuments to oppression. When people pervert God's gifts into idols, He turns against even His own people (Isaiah 1:14).",
|
||||
"historical": "Samaria's fall in 722 BC fulfilled this oath. The city God once blessed became the object of His judgment. This demonstrates covenant faithfulness: God keeps His word for blessing or curse, depending on Israel's obedience (Deuteronomy 28).",
|
||||
"questions": [
|
||||
"How can God's covenant people become objects of His abhorrence through persistent sin and pride?",
|
||||
"What 'excellency' or 'palaces'—church buildings, programs, reputations—might God hate if they're built on compromise?",
|
||||
"Why is God's oath by Himself both terrifying (guaranteeing judgment) and comforting (guaranteeing salvation through Christ)?"
|
||||
]
|
||||
},
|
||||
"9": {
|
||||
"analysis": "<strong>And it shall come to pass, if there remain ten men in one house, that they shall die</strong>—This describes plague or siege warfare's aftermath. Even survivors in a single household will perish. The number 'ten' may reference a עֲשָׂרָה (<em>asarah</em>, 'ten,' a traditional quorum for Jewish prayer), suggesting even complete families or communities won't escape. This verse continues the relentless depiction of total judgment—no remnant preserved, no survivors exempted.<br><br>The cumulative weight of judgment prophecies in Amos 6 creates an overwhelming sense of inevitability. God isn't threatening; He's announcing settled reality. Like Sodom (Genesis 19), when judgment arrives, escape proves nearly impossible. This should drive people to urgent repentance while opportunity remains.",
|
||||
"historical": "The Assyrian siege of Samaria lasted three years (2 Kings 17:5). Siege warfare involved starvation, disease, and finally slaughter when walls were breached. Archaeological evidence from Lachish and other sites confirms the devastating completeness of Assyrian conquest—fulfilling this prophecy's grim details.",
|
||||
"questions": [
|
||||
"How should the certainty and severity of judgment drive urgent evangelism and discipleship?",
|
||||
"What does it mean that even 'ten men' (a community) cannot save each other through collective action apart from God?",
|
||||
"How do modern people dismiss warnings of judgment as 'scare tactics' rather than loving warnings?"
|
||||
]
|
||||
},
|
||||
"10": {
|
||||
"analysis": "<strong>And a man's uncle shall take him up, and he that burneth him, to bring out the bones out of the house</strong>—Jewish burial custom involved family members retrieving bodies. דּוֹד (<em>dod</em>, 'uncle') represents extended family obligation. The phrase 'burneth him' (וּמְסָרְפוֹ, <em>um'sarfo</em>) is unusual—Jews typically didn't cremate except in extreme circumstances (plague, war, desecration prevention). <strong>And shall say unto him that is by the sides of the house, Is there yet any with thee? and he shall say, No.</strong>—a survivor check finds none remaining. <strong>Then shall he say, Hold thy tongue: for we may not make mention of the name of the LORD</strong> (הַס כִּי־לֹא לְהַזְכִּיר בְּשֵׁם־יְהוָה, <em>has ki-lo l'hazkir b'shem-YHWH</em>)—either fearing to invoke God's name amidst judgment or recognizing their covenant-breaking forfeited the right to call on Him.<br><br>This chilling scene depicts absolute desolation and spiritual terror. The command to silence suggests recognition that God has turned against them—speaking His name might bring further judgment. When people can no longer pray, judgment has reached its fullest expression.",
|
||||
"historical": "This verse reflects the horrors of siege warfare and conquest's aftermath—mass death, emergency cremation, and terrorized survivors afraid to invoke their covenant God. The psychological and spiritual devastation matches physical destruction.",
|
||||
"questions": [
|
||||
"What does it mean to be unable or afraid to invoke God's name—complete abandonment or self-imposed silence?",
|
||||
"How should this terrifying scene motivate urgent faithfulness while we can still freely call on God's name?",
|
||||
"What warning does this give about societies or churches where God's name becomes increasingly unwelcome?"
|
||||
]
|
||||
},
|
||||
"11": {
|
||||
"analysis": "<strong>For, behold, the LORD commandeth, and he will smite the great house with breaches, and the little house with clefts</strong> (כִּי־הִנֵּה יְהוָה מְצַוֶּה וְהִכָּה הַבַּיִת הַגָּדוֹל רְסִיסִים וְהַבַּיִת הַקָּטֹן בְּקִעִים, <em>ki-hineh YHWH m'tzaveh v'hikah habayit hagadol resisim v'habayit hakaton b'qi'im</em>)—both great houses (הַבַּיִת הַגָּדוֹל, <em>habayit hagadol</em>, palaces) and small houses (הַבַּיִת הַקָּטֹן, <em>habayit hakaton</em>, peasant dwellings) face destruction. רְסִיסִים (<em>resisim</em>, 'breaches, fragments') and בְּקִעִים (<em>b'qi'im</em>, 'clefts, cracks') suggest structural collapse—both total ruin and partial damage, depending on size.<br><br>This emphasizes judgment's universality: wealth provides no protection. The rich who oppressed and the poor who acquiesced both face consequences. Romans 2:11 confirms this principle: 'there is no respect of persons with God.' Judgment reaches all socioeconomic levels when a nation rejects God.",
|
||||
"historical": "Assyrian conquest records and archaeological evidence confirm widespread destruction across all social strata in conquered cities. When Samaria fell, both palaces and peasant homes were destroyed—fulfilling this prophecy's details precisely.",
|
||||
"questions": [
|
||||
"How does universal judgment—affecting rich and poor alike—demonstrate both God's justice and humanity's collective guilt?",
|
||||
"What warning does this give to those who think their humble status exempts them from accountability?",
|
||||
"How should the certainty of judgment motivate Christians across all socioeconomic levels to faithful witness?"
|
||||
]
|
||||
},
|
||||
"12": {
|
||||
"analysis": "<strong>Shall horses run upon the rock? will one plow there with oxen?</strong> (הַיְרֻצוּן בַּסֶּלַע סוּסִים אִם־יַחֲרוֹשׁ בַּבְּקָרִים, <em>hayrutzun basela susim im-yacharosh bab'qarim</em>)—two rhetorical questions about absurdities: horses can't gallop on rocky cliffs; oxen can't plow stone. Yet Israel's behavior is equally absurd: <strong>for ye have turned judgment into gall, and the fruit of righteousness into hemlock</strong> (כִּי־הֲפַכְתֶּם לְרֹאשׁ מִשְׁפָּט וּפְרִי צְדָקָה לְלַעֲנָה, <em>ki-hafachtem l'rosh mishpat ufri tz'dakah l'la'anah</em>)—they've inverted justice (מִשְׁפָּט, <em>mishpat</em>) into poison (רֹאשׁ, <em>rosh</em>, literally 'head,' meaning poisonous plant or gall), and righteousness's fruit (צְדָקָה, <em>tz'dakah</em>) into wormwood (לַעֲנָה, <em>la'anah</em>, bitter poison).<br><br>This indicts moral inversion: making justice serve oppression and perverting righteousness into wickedness. When legal systems meant to protect the vulnerable instead exploit them, society commits absurdity worse than horses running on rocks. Isaiah 5:20 pronounces woe on such moral confusion: 'Woe unto them that call evil good, and good evil.'",
|
||||
"historical": "Amos repeatedly attacks Israel's corrupt legal system (Amos 5:10-15). Courts that should have defended the poor instead took bribes and ruled for the powerful. This judicial corruption was systemic, not isolated—making judgment inevitable.",
|
||||
"questions": [
|
||||
"What modern legal or political systems pervert justice into oppression while claiming righteousness?",
|
||||
"How do Christians sometimes invert biblical values—calling tolerance 'love,' compromise 'wisdom,' or comfort 'blessing'?",
|
||||
"What does it mean to restore justice and righteousness when systems have become thoroughly corrupted?"
|
||||
]
|
||||
},
|
||||
"13": {
|
||||
"analysis": "<strong>Ye which rejoice in a thing of nought</strong> (הַשְּׂמֵחִים לְלֹא דָבָר, <em>hasemechim l'lo davar</em>, literally 'rejoicing in no-thing, vanity')—they celebrate empty achievements. <strong>Which say, Have we not taken to us horns by our own strength?</strong> (הַאֹמְרִים הֲלוֹא בְחָזְקֵנוּ לָקַחְנוּ לָנוּ קַרְנָיִם, <em>ha'om'rim halo v'chozkeinu lakachnu lanu karnayim</em>)—'horns' (קַרְנַיִם, <em>karnayim</em>) symbolize military power (Deuteronomy 33:17). They boast about military victories achieved 'by our own strength' (בְחָזְקֵנוּ, <em>v'chozkeinu</em>), crediting themselves rather than God.<br><br>This reveals the root sin: pride that denies God's sovereignty and credits human achievement. Jeroboam II's military successes (2 Kings 14:25-28) produced nationalistic arrogance—forgetting that God gave the victories. Habakkuk 1:11 describes similar pride: 'his own might is his god.' All human achievement apart from acknowledging God's enablement is 'vanity.'",
|
||||
"historical": "Jeroboam II expanded Israel's borders to near-Davidic dimensions, creating prosperity and military confidence. Rather than attributing success to God's covenant faithfulness, Israel credited their own strength—the pattern of all proud civilizations that rise and fall.",
|
||||
"questions": [
|
||||
"What modern achievements—technological, economic, military—do nations or individuals credit to their own strength rather than God?",
|
||||
"How does rejoicing in 'things of nought' describe celebrating temporary, earthly accomplishments while ignoring eternal realities?",
|
||||
"What's the difference between legitimate thanksgiving for accomplishments and proud self-credit that forgets God?"
|
||||
]
|
||||
},
|
||||
"14": {
|
||||
"analysis": "<strong>But, behold, I will raise up against you a nation, O house of Israel</strong> (כִּי הִנְנִי מֵקִים עֲלֵיכֶם בֵּית יִשְׂרָאֵל גּוֹי, <em>ki hin'ni meikim aleichem beit Yisrael goy</em>)—God personally raises up (מֵקִים, <em>meikim</em>) the enemy nation (גּוֹי, <em>goy</em>). <strong>Saith the LORD the God of hosts</strong> confirms divine authority. <strong>And they shall afflict you from the entering in of Hemath unto the river of the wilderness</strong> (וְלָחֲצוּ אֶתְכֶם מִלְּבוֹא חֲמָת עַד־נַחַל הָעֲרָבָה, <em>v'lachatzu etchem mil'vo Chamat ad-nachal ha'aravah</em>)—the enemy will oppress (לָחַץ, <em>lachatz</em>) Israel throughout their entire territory, from northern border (Lebo-Hamath) to southern (the Arabah river/wadi).<br><br>This directly counters verse 13's boast about taking 'horns' by their own strength. The same territory they conquered will be reconquered—by a nation God Himself raises against them. Human military might collapses before divine judgment. Assyria fulfilled this prophecy, but ultimately God sovereignly controls all nations for His purposes (Isaiah 10:5-19).",
|
||||
"historical": "Tiglath-Pileser III began Assyrian incursions in 734 BC, culminating in Samaria's fall in 722 BC. The Assyrians conquered exactly the territory Jeroboam II had expanded—demonstrating that God giveth and God taketh away. Israel's boasted military victories became meaningless when God withdrew protection.",
|
||||
"questions": [
|
||||
"How does recognizing God's sovereignty over nations—raising up and bringing down—humble national pride?",
|
||||
"What does it mean that God uses pagan nations as instruments of judgment against His own people?",
|
||||
"How should Christians respond to national decline or military defeat—as random events or potential divine discipline?"
|
||||
]
|
||||
}
|
||||
},
|
||||
"7": {
|
||||
"15": {
|
||||
"analysis": "<strong>And the LORD took me as I followed the flock</strong> (וַיִּקָּחֵנִי יְהוָה מֵאַחֲרֵי הַצֹּאן, <em>vayikacheni YHWH me'acharei hatzon</em>)—the verb לָקַח (<em>lakach</em>, 'to take, seize') suggests divine compulsion. Amos didn't volunteer; God took him from shepherding. <strong>And the LORD said unto me, Go, prophesy unto my people Israel</strong> (וַיֹּאמֶר יְהוָה אֵלַי לֵךְ הִנָּבֵא אֶל־עַמִּי יִשְׂרָאֵל, <em>vayomer YHWH elai lech hinave el-ami Yisrael</em>)—God's direct command (לֵךְ, <em>lech</em>, 'go!') and claim ('my people') authenticates Amos's message against Amaziah's opposition (7:10-13).<br><br>This verse defends prophetic authority: Amos prophesies not by professional training but divine commission. The same pattern appears with Moses (Exodus 3:10), Jeremiah (Jeremiah 1:7), and New Testament apostles (Galatians 1:1)—God's call, not human credentials, validates ministry. True preaching flows from divine sending, not self-appointment.",
|
||||
"historical": "Amaziah the priest of Bethel commanded Amos to stop prophesying (7:12-13), claiming prophetic ministry required institutional approval. Amos responds by affirming his divine commission—God's authority trumps human religious hierarchies. This conflict between institutional religion and prophetic truth recurs throughout Scripture.",
|
||||
"questions": [
|
||||
"How does God's calling provide authority independent of institutional approval or professional credentials?",
|
||||
"What's the difference between self-appointed ministry and being 'taken' by God for His purposes?",
|
||||
"How should churches respond when God sends messengers who lack traditional credentials but speak His word faithfully?"
|
||||
]
|
||||
},
|
||||
"16": {
|
||||
"analysis": "<strong>Now therefore hear thou the word of the LORD: Thou sayest, Prophesy not against Israel, and drop not thy word against the house of Isaac</strong> (וְעַתָּה שְׁמַע דְּבַר־יְהוָה אַתָּה אֹמֵר לֹא תִנָּבֵא עַל־יִשְׂרָאֵל וְלֹא תַטִּיף עַל־בֵּית יִשְׂחָק, <em>v'atah sh'ma d'var-YHWH atah omer lo tinave al-Yisrael v'lo tatif al-beit Yitzchak</em>)—Amos confronts Amaziah directly. The verb טַף (<em>nataf</em>, 'to drop, drip, preach') appears in the causative: 'drop not thy word'—Amaziah wants Amos to stop speaking God's Word. Using 'Isaac' instead of 'Israel' emphasizes covenant sonship, making Amaziah's resistance worse—he's protecting God's covenant people from God's covenant word.<br><br>This confrontation typifies conflict between institutional religion and prophetic truth. Amaziah represents state-sponsored religion serving political ends (Bethel was the king's sanctuary, 7:13), while Amos speaks uncompromising divine truth. When religious leaders prioritize institutional preservation over prophetic faithfulness, they resist God Himself.",
|
||||
"historical": "Bethel was the northern kingdom's primary religious center, established by Jeroboam I with golden calf worship (1 Kings 12:28-29). By Amos's time, it functioned as state-controlled religion legitimizing the status quo. Amaziah's opposition to Amos shows how false worship systems silence prophetic voices that threaten their power.",
|
||||
"questions": [
|
||||
"How do modern religious institutions sometimes resist prophetic voices that threaten comfortable compromise?",
|
||||
"What's the difference between legitimate church authority and religious leadership that silences God's Word?",
|
||||
"How should Christians respond when religious leaders command them not to speak biblical truth?"
|
||||
]
|
||||
},
|
||||
"17": {
|
||||
"analysis": "<strong>Therefore thus saith the LORD</strong>—Amos pronounces specific judgment on Amaziah personally. <strong>Thy wife shall be an harlot in the city</strong> (אִשְׁתְּךָ בָעִיר תִּזְנֶה, <em>ish't'cha va'ir tizneh</em>)—likely raped by conquering soldiers, a common siege warfare atrocity (Isaiah 13:16; Zechariah 14:2). <strong>And thy sons and thy daughters shall fall by the sword</strong>—his children will be killed. <strong>And thy land shall be divided by line</strong> (וְאַדְמָתְךָ בַחֶבֶל תְּחֻלָּק, <em>v'admat'cha bachevel techulak</em>)—his property will be parceled out to foreign settlers. <strong>And thou shalt die in a polluted land: and Israel shall surely go into captivity forth of his land</strong> (וְאַתָּה עַל־אֲדָמָה טְמֵאָה תָמוּת וְיִשְׂרָאֵל גָּלֹה יִגְלֶה מֵעַל אַדְמָתוֹ, <em>v'atah al-adamah t'me'ah tamut v'Yisrael galoh yigleh me'al admato</em>)—Amaziah will die in exile on unclean (טְמֵאָה, <em>t'me'ah</em>) foreign soil.<br><br>This is the prophet's authority to pronounce judgment (Matthew 18:18; John 20:23). Amaziah resisted God's word, so God's word judges him specifically. The progression—wife, children, land, death in exile—encompasses total loss. Resisting God's prophetic word brings not safety but heightened judgment.",
|
||||
"historical": "No record exists of Amaziah's fate, but this prophecy's specificity suggests it was remembered and likely fulfilled during Assyria's conquest. The principle holds: those who silence prophetic truth to preserve institutions face greater judgment than those they sought to protect from conviction.",
|
||||
"questions": [
|
||||
"How does resisting prophetic truth bring judgment rather than protection from uncomfortable conviction?",
|
||||
"What does it mean for religious leaders to die 'in a polluted land'—separated from God's presence and promises?",
|
||||
"How should this warning shape how church leaders respond to biblical critique of their practices?"
|
||||
]
|
||||
}
|
||||
},
|
||||
"8": {
|
||||
"12": {
|
||||
"analysis": "<strong>And they shall wander from sea to sea, and from the north even to the east, they shall run to and fro to seek the word of the LORD, and shall not find it</strong> (וְנָעוּ מִיָּם עַד־יָם וּמִצָּפוֹן וְעַד־מִזְרָח יְשׁוֹטְטוּ לְבַקֵּשׁ אֶת־דְּבַר־יְהוָה וְלֹא יִמְצָאוּ, <em>v'na'u miyam ad-yam umitzafon v'ad-mizrach y'shot'tu l'vakeish et-d'var YHWH v'lo yimtza'u</em>)—The verbs intensify desperate search: נוּעַ (<em>nua</em>, 'to wander'), שׁוֹטֵט (<em>shotet</em>, 'to run to and fro'), בָּקַשׁ (<em>bakash</em>, 'to seek earnestly'). Yet לֹא יִמְצָאוּ (<em>lo yimtza'u</em>, 'they will not find')—God's Word becomes unavailable.<br><br>This describes spiritual famine worse than physical starvation (Amos 8:11). Those who despised God's Word when available will desperately seek it when removed. This prefigures Jesus's warning: 'The night cometh, when no man can work' (John 9:4). Opportunity for repentance doesn't last forever—God's patience has limits. When judgment arrives, it's too late to seek what was previously rejected.",
|
||||
"historical": "After Samaria's fall and exile, prophetic voice ceased in the northern kingdom. No more prophets arose; God's Word fell silent. For generations, they'd rejected prophets like Amos—then when judgment came, no prophetic word offered hope or guidance. Hebrews 12:17 describes similar irreversible loss: Esau 'found no place of repentance, though he sought it carefully with tears.'",
|
||||
"questions": [
|
||||
"How does rejecting God's Word when it's available lead to its removal when desperately needed?",
|
||||
"What warning does this give to churches or nations that increasingly silence or ignore Scripture?",
|
||||
"How should the possibility of irreversible spiritual famine motivate urgent response to God's Word now?"
|
||||
]
|
||||
},
|
||||
"13": {
|
||||
"analysis": "<strong>In that day shall the fair virgins and young men faint for thirst</strong> (בַּיּוֹם הַהוּא תִּתְעַלַּפְנָה הַבְּתוּלֹת הַיָּפוֹת וְהַבַּחוּרִים בַּצָּמָא, <em>bayom hahu tit'alafnah hab'tulot hayafot v'habachurim batzama</em>)—Young, vigorous people (בְּתוּלוֹת, <em>betulot</em>, 'virgins'; בַּחוּרִים, <em>bachurim</em>, 'young men') typically most resilient will 'faint' (עָלַף, <em>alaf</em>, 'grow faint, languish'). But this is spiritual thirst (צָמָא, <em>tzama</em>), not physical—they faint from lack of God's Word (8:11-12), not water.<br><br>This emphasizes spiritual famine's devastating completeness: even the strong cannot endure. Jesus promised the opposite to those who come to Him: 'whosoever drinketh of the water that I shall give him shall never thirst' (John 4:14). Rejecting Living Water results in unquenchable spiritual thirst.",
|
||||
"historical": "This prophecy describes the post-exilic state of the northern tribes. Scattered among pagan nations without temple, priesthood, or prophets, they spiritually withered. Later, Jesus found Israel in similar spiritual famine—shepherdless sheep whom religious leaders had failed to feed (Matthew 9:36).",
|
||||
"questions": [
|
||||
"How do people today spiritually 'faint for thirst' despite having physical Bibles accessible everywhere?",
|
||||
"What's the difference between spiritual thirst that drives people to God versus the judgment-famine where His Word becomes unavailable?",
|
||||
"How should this warning motivate believers to drink deeply from God's Word while it remains accessible?"
|
||||
]
|
||||
},
|
||||
"14": {
|
||||
"analysis": "<strong>They that swear by the sin of Samaria</strong> (הַנִּשְׁבָּעִים בְּאַשְׁמַת שֹׁמְרוֹן, <em>hanishba'im b'ashmat Shomron</em>)—'sin' (אַשְׁמַת, <em>ashmat</em>) likely refers to the golden calf at Bethel or possibly Asherah worship. They swear oaths by idols rather than Yahweh. <strong>And say, Thy god, O Dan, liveth</strong> (וְאָמְרוּ חֵי אֱלֹהֶיךָ דָּן, <em>v'am'ru chei Eloheicha Dan</em>)—Dan had the other golden calf shrine (1 Kings 12:29). <strong>And, The manner of Beer-sheba liveth</strong> (וְחֵי דֶּרֶךְ בְּאֵר שָׁבַע, <em>v'chei derech Be'er Sheva</em>)—דֶּרֶךְ (<em>derech</em>) might mean 'way' (pilgrimage route) or refer to another cultic object. <strong>Even they shall fall, and never rise up again</strong> (וְנָפְלוּ וְלֹא־יָקוּמוּ עוֹד, <em>v'naflu v'lo-yakumu od</em>)—permanent spiritual death.<br><br>Swearing by false gods demonstrates complete apostasy—binding oneself to powerless idols rather than the living God. The irony: they say these gods 'live' (חֵי, <em>chei</em>), but worshipers themselves will fall and never rise. Psalm 115:8 warns: 'They that make them are like unto them'—idolaters share their idols' impotence. Only those who swear by the true God's name find life (Jeremiah 4:2).",
|
||||
"historical": "The golden calves at Dan and Bethel represented Israel's foundational apostasy (1 Kings 12:28-29). Beer-sheba was in Judah's territory but apparently featured in northern pilgrimage practices. This syncretistic worship—mixing Yahweh forms with pagan content—epitomized covenant unfaithfulness that guaranteed exile.",
|
||||
"questions": [
|
||||
"What modern equivalents exist to 'swearing by idols'—binding ourselves to false securities and calling them 'alive'?",
|
||||
"How does syncretism (mixing true worship with false elements) ultimately prove deadlier than outright paganism?",
|
||||
"What does it mean to 'fall and never rise'—experiencing judgment without hope of restoration?"
|
||||
]
|
||||
}
|
||||
},
|
||||
"9": {
|
||||
"14": {
|
||||
"analysis": "<strong>And I will bring again the captivity of my people of Israel</strong> (וְשַׁבְתִּי אֶת־שְׁבוּת עַמִּי יִשְׂרָאֵל, <em>v'shavti et-sh'vut ami Yisrael</em>)—After chapters of unrelenting judgment, Amos concludes with restoration promise. The verb שׁוּב (<em>shuv</em>, 'to return, restore') signals covenant renewal. <strong>And they shall build the waste cities, and inhabit them</strong> (וּבָנוּ עָרִים נְשַׁמּוֹת וְיָשָׁבוּ, <em>uvanu arim neshamot v'yashavu</em>)—reversing covenant curses (Deuteronomy 28:30, 39). <strong>And they shall plant vineyards, and drink the wine thereof; they shall also make gardens, and eat the fruit of them</strong>—full covenant blessing (Deuteronomy 28:4, 11) restored.<br><br>This demonstrates covenant faithfulness: God judges sin but doesn't abandon His purposes. James's citation in Acts 15:16-17 applies this to Gentile inclusion—God's restoration exceeds ethnic Israel, encompassing all nations through Christ. The ultimate fulfillment awaits Christ's return, when creation itself is restored (Romans 8:19-23).",
|
||||
"historical": "While a small remnant returned from Babylonian exile, this prophecy awaits complete fulfillment in the Messianic age. The New Testament interprets it Christologically—Jesus as the tabernacle of David (John 1:14), gathering both Jews and Gentiles into one people (Ephesians 2:11-22).",
|
||||
"questions": [
|
||||
"How does God's promise of restoration after judgment demonstrate covenant faithfulness despite human unfaithfulness?",
|
||||
"In what ways does the New Covenant in Christ fulfill these restoration prophecies beyond merely national Israel?",
|
||||
"How should future hope of complete restoration motivate present faithfulness and evangelistic urgency?"
|
||||
]
|
||||
},
|
||||
"15": {
|
||||
"analysis": "<strong>And I will plant them upon their land, and they shall no more be pulled up out of their land which I have given them, saith the LORD thy God</strong> (וּנְטַעְתִּים עַל־אַדְמָתָם וְלֹא יִנָּתְשׁוּ עוֹד מֵעַל אַדְמָתָם אֲשֶׁר נָתַתִּי לָהֶם אָמַר יְהוָה אֱלֹהֶיךָ, <em>un'ta'tim al-admatam v'lo yinat'shu od me'al admatam asher natati lahem amar YHWH Eloheicha</em>)—The metaphor shifts from building/planting to permanent rooting. נָטַע (<em>nata</em>, 'to plant') suggests God Himself plants them; נָתַשׁ (<em>natash</em>, 'to uproot, pluck up') will never again occur. The phrase <strong>no more</strong> (לֹא...עוֹד, <em>lo...od</em>) emphasizes permanence. <strong>Saith the LORD thy God</strong>—Amos ends with intimate covenant language: not merely יְהוָה (<em>YHWH</em>) but יְהוָה אֱלֹהֶיךָ (<em>YHWH Eloheicha</em>, 'the LORD your God')—covenant relationship restored.<br><br>This final verse promises permanent security for God's people. While physical Israel experienced repeated exile, the ultimate fulfillment comes through Christ—believers are 'in Christ' permanently (John 10:28-29; Romans 8:35-39). No power can uproot those God plants in Christ. The book that began with judgment roars ends with grace whispers—God's last word is always restoration.",
|
||||
"historical": "The return from Babylonian exile only partially fulfilled this—they rebuilt but remained under foreign domination (Persian, Greek, Roman) and experienced another exile in 70 AD. Full, permanent restoration awaits Christ's return, when God's people inherit the renewed earth (Revelation 21-22).",
|
||||
"questions": [
|
||||
"How does God's promise of permanent planting provide assurance to believers eternally secure in Christ?",
|
||||
"What's the relationship between Old Testament land promises and New Testament spiritual inheritance in Christ?",
|
||||
"How should Amos's pattern—judgment leading to restoration—shape how we understand God's discipline and ultimate purposes?"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Merge entries
|
||||
added_count = 0
|
||||
for chapter, verses in new_entries.items():
|
||||
if chapter not in commentary:
|
||||
commentary[chapter] = {}
|
||||
for verse, entry in verses.items():
|
||||
if verse not in commentary[chapter]:
|
||||
commentary[chapter][verse] = entry
|
||||
added_count += 1
|
||||
print(f"Added Amos {chapter}:{verse}")
|
||||
|
||||
data["commentary"] = commentary
|
||||
|
||||
with open(filepath, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, ensure_ascii=False, indent=2)
|
||||
|
||||
print(f"\nTotal Amos verses added: {added_count}")
|
||||
print(f"Saved to {filepath}")
|
||||
@@ -1,98 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Add commentary for John 13:6-12"""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
# File path
|
||||
json_file = Path("/Users/kennethreitz/repos/kjvstudy.org/kjvstudy_org/data/verse_commentary/john.json")
|
||||
|
||||
# Read existing data
|
||||
with open(json_file, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
# Ensure chapter 13 exists
|
||||
if "13" not in data["commentary"]:
|
||||
data["commentary"]["13"] = {}
|
||||
|
||||
# Commentary for each verse
|
||||
commentaries = {
|
||||
"6": {
|
||||
"analysis": "<strong>Then cometh he to Simon Peter: and Peter saith unto him, Lord, dost thou wash my feet?</strong> Peter's reaction to Jesus washing his feet reveals the natural human recoil from grace—the pride that resists receiving unmerited service. The phrase <strong>Lord, dost thou wash my feet?</strong> (Κύριε, σύ μου νίπτεις τοὺς πόδας/<em>Kyrie, sy mou nipteis tous podas</em>) places emphatic pronouns in stark contrast: <em>Thou</em> (σύ)—the Master, and <em>my</em> (μου)—the servant. The present tense <em>nipteis</em> (wash) suggests Peter interrupted Jesus mid-action, shocked at what was unfolding.<br><br>The verb νίπτω (<em>niptō</em>) specifically means to wash a part of the body (usually feet or hands), distinct from λούω (<em>louō</em>), which means to bathe the whole body—a distinction Jesus exploits in verse 10. Footwashing was the task of the lowliest household slave, so degrading that Jewish law forbade requiring it of Hebrew servants (only Gentile slaves). Yet here stands the Lord of Glory, the one Peter confessed as <strong>the Christ, the Son of the living God</strong> (Matthew 16:16), performing the most menial service.<br><br>Peter's question contains both reverence ('Lord') and resistance. He grasps the incongruity but not yet the theology. This scene dramatizes the incarnation itself: the Word became flesh and <em>took on the form of a servant</em> (Philippians 2:7). The Creator serves His creatures. The Judge cleanses the guilty. Pride says, 'I must serve You'; grace says, 'Let Me serve you.'",
|
||||
"historical": "This scene occurs in the upper room during the Last Supper, hours before Jesus's arrest (John 13:1-2). Jewish Passover meals required ritual purity, and guests arriving with dusty feet from Jerusalem's streets would need washing. Normally, a household servant performed this task upon arrival. The disciples' failure to wash one another's feet reveals their persistent dispute about greatness (Luke 22:24)—each considered himself too important to serve.<br><br>First-century Jewish culture was intensely hierarchical. Rabbis held exalted status; disciples served masters, never the reverse. Peter had witnessed Jesus's divine power—walking on water, raising the dead, commanding nature. The cognitive dissonance of seeing this Lord kneel before him with a water basin was profound. Roman foot-washing customs differed somewhat from Jewish, but throughout the ancient Near East, the act signified the washer's inferior status. For Jesus to wash His disciples' feet inverted all social and religious order.",
|
||||
"questions": [
|
||||
"Why does receiving unmerited service from Christ feel more difficult than serving Him through our own efforts?",
|
||||
"In what ways does our spiritual pride manifest as resistance to God's grace rather than gratitude for it?",
|
||||
"How does Jesus's willingness to perform the most degrading service challenge our concern for status and reputation?"
|
||||
]
|
||||
},
|
||||
"7": {
|
||||
"analysis": "<strong>Jesus answered and said unto him, What I do thou knowest not now; but thou shalt know hereafter.</strong> Christ's response to Peter's protest introduces the pedagogical principle that divine actions often precede human understanding. The phrase <strong>What I do</strong> (ἐγὼ ποιῶ/<em>egō poiō</em>) emphasizes Jesus's sovereignty—<em>I</em> am doing this, regardless of your comprehension. The present tense <em>poiō</em> stresses ongoing action with multiple layers of meaning.<br><br>The contrast between <strong>now</strong> (ἄρτι/<em>arti</em>) and <strong>hereafter</strong> (μετὰ ταῦτα/<em>meta tauta</em>) structures Christian experience: we walk by faith, not sight (2 Corinthians 5:7). <em>Arti</em> indicates the immediate present moment—Peter in his pre-cross confusion cannot grasp what unfolds. <em>Meta tauta</em> (literally 'after these things') points beyond the crucifixion, resurrection, and Pentecost to the Spirit-enlightened understanding that follows.<br><br>The verb <strong>knowest</strong> (οἶδας/<em>oidas</em>) refers to intuitive, perceptive knowledge, while <strong>shalt know</strong> (γνώσῃ/<em>gnōsē</em>) uses γινώσκω (<em>ginōskō</em>), meaning experiential knowledge gained through relationship. Peter will move from confused observation to participated understanding. This parallels Jesus's earlier words: <em>What I do thou knowest not now</em> applies to the cross itself—disciples flee in confusion, but later understand redemption accomplished.",
|
||||
"historical": "This exchange occurred within hours of Jesus's betrayal. The disciples remained confused about Jesus's mission despite three years of teaching. They expected Messiah to overthrow Rome and establish David's throne, not die as a criminal. Jesus's cryptic references to death and resurrection (Mark 8:31-33) bewildered them—Peter had even rebuked Jesus for such talk. Here Jesus acknowledges the gap between event and understanding, promising illumination would come 'after these things'—fulfilled when the risen Christ opened their minds to understand the Scriptures (Luke 24:45) and the Spirit came at Pentecost (John 14:26). The early church treasured this verse as validation for their post-resurrection theological development, understanding depths in Jesus's actions they'd missed at the time.",
|
||||
"questions": [
|
||||
"What does it mean to trust Christ's actions before understanding His purposes, and how does this apply to suffering or confusion in your life?",
|
||||
"How does the promise of future understanding sustain faith during present darkness or theological perplexity?",
|
||||
"In what ways has your understanding of Scripture or God's work deepened 'hereafter'—after experiencing what you once merely heard about?"
|
||||
]
|
||||
},
|
||||
"8": {
|
||||
"analysis": "<strong>Peter saith unto him, Thou shalt never wash my feet. Jesus answered him, If I wash thee not, thou hast no part with me.</strong> Peter's emphatic refusal—<strong>never</strong> (οὐ μὴ...εἰς τὸν αἰῶνα/<em>ou mē...eis ton aiōna</em>)—uses the strongest Greek negation plus 'unto the age,' creating absolute, eternal refusal. Yet Jesus's response is more absolute still: <strong>If I wash thee not, thou hast no part with me</strong> (Ἐὰν μὴ νίψω σε, οὐκ ἔχεις μέρος μετ' ἐμοῦ/<em>Ean mē nipsō se, ouk echeis meros met' emou</em>).<br><br>The verb <strong>wash</strong> (νίψω/<em>nipsō</em>) shifts from present to aorist subjunctive—not ongoing action but a definitive act with permanent consequences. The phrase <strong>no part with me</strong> (οὐκ ἔχεις μέρος μετ' ἐμοῦ) is covenant language. <em>Meros</em> means portion, share, inheritance—the same term used for Israel's inheritance in the Promised Land (Joshua 19:9). Without Jesus's cleansing, Peter has no share in Christ's kingdom, no inheritance, no fellowship.<br><br>This dialogue transcends literal foot-washing to address soteriological necessity. Peter must receive Christ's cleansing or remain eternally separated. Pride that refuses grace is damning pride. We contribute nothing to salvation except the sin requiring it. Christ's work is complete and non-negotiable—we receive it humbly or reject it proudly. Peter's journey from 'never' to 'not my feet only' (v.9) mirrors conversion: from self-sufficient refusal to desperate reception of grace.",
|
||||
"historical": "Peter's character oscillates between bold confession and rash presumption. He walked on water then sank in doubt (Matthew 14:28-31). He confessed Jesus as Christ then rebuked Him for predicting death (Matthew 16:16-23). Here Peter's protest stems from misguided devotion—he loves Jesus but misunderstands grace. His 'never' echoes his later 'I will lay down my life for thy sake' (John 13:37), followed by three denials. Peter had to learn that discipleship begins not with brave self-offering but humble reception. The phrase 'no part with me' would resonate deeply with Jewish disciples familiar with inheritance language from Torah. Being cut off from one's portion meant exclusion from covenant blessings—exactly what Jesus warns Peter faces if he refuses cleansing. Later, Peter's epistles emphasize humility (1 Peter 5:5) and the cleansing blood of Christ (1 Peter 1:18-19), lessons learned through this upper-room exchange.",
|
||||
"questions": [
|
||||
"How does Peter's 'never' reveal the pride that masquerades as humility or devotion, and where does this appear in your own spiritual life?",
|
||||
"What does Jesus's absolute requirement ('If I wash thee not, thou hast no part with me') teach about the non-negotiable necessity of His atoning work?",
|
||||
"Why is receiving grace often harder than giving service, and what does this reveal about the human condition?"
|
||||
]
|
||||
},
|
||||
"9": {
|
||||
"analysis": "<strong>Simon Peter saith unto him, Lord, not my feet only, but also my hands and my head.</strong> Peter's characteristic impulsiveness swings from absolute refusal (v.8) to maximal request. The emphatic negation <strong>not...only</strong> (οὐ...μόνον/<em>ou...monon</em>) followed by <strong>but also</strong> (ἀλλὰ καί/<em>alla kai</em>) intensifies his plea. If cleansing by Christ brings fellowship, Peter wants complete cleansing—<strong>my hands and my head</strong> (τὰς χεῖρας καὶ τὴν κεφαλήν/<em>tas cheiras kai tēn kephalēn</em>).<br><br>Peter's request, though sincere, reveals continuing misunderstanding. He grasps that Christ's cleansing is necessary but thinks more ritual washing brings more spiritual benefit. This reflects a works-oriented mindset: if some is good, more is better; if feet-washing grants fellowship, full-body washing grants greater fellowship. Yet grace doesn't operate on quantitative scales. The sufficiency of Christ's work needs no human addition or intensification.<br><br>Peter's response also shows genuine love for Christ. Once convinced that Jesus's washing brings 'part with me,' Peter desires maximum communion. His error isn't in wanting closeness with Christ but in thinking human enthusiasm or religious excess achieves it. This anticipates later misunderstandings about salvation by grace through faith—legalists add requirements, enthusiasts add experiences, but the gospel says Christ's work alone suffices.",
|
||||
"historical": "Peter's request makes sense within Jewish purity rituals. Levitical law prescribed washings of hands, feet, and head for priests (Exodus 30:19-21). The Pharisees emphasized ritual hand-washing before meals (Mark 7:2-4). If Jesus's foot-washing symbolized spiritual cleansing, Peter reasoned, complete washing would be better. This reflects the broader Jewish emphasis on ritual purity as means to holiness. What Peter hadn't yet grasped was that Jesus was instituting something entirely new—not enhanced Levitical ritual but spiritual cleansing through His impending death. The church fathers saw Peter's request as emblematic of misguided religious zeal—the desire to add to Christ's sufficient work. Augustine commented that Peter's error wasn't in loving Christ too much but in understanding grace too little.",
|
||||
"questions": [
|
||||
"In what ways do we, like Peter, try to add to Christ's finished work through increased religious activity or intensity?",
|
||||
"How does Peter's swing from 'never' to 'not only my feet' illustrate the volatility of enthusiasm untethered to theological understanding?",
|
||||
"What does true faith look like—enthusiastic maximalism or humble reception of what Christ offers?"
|
||||
]
|
||||
},
|
||||
"10": {
|
||||
"analysis": "<strong>Jesus saith to him, He that is washed needeth not save to wash his feet, but is clean every whit: and ye are clean, but not all.</strong> Jesus corrects Peter's misunderstanding with crucial theological distinction. <strong>He that is washed</strong> (ὁ λελουμένος/<em>ho leloumenos</em>) uses the perfect passive participle of λούω (<em>louō</em>)—to bathe the whole body—indicating completed action with ongoing results. This person <strong>needeth not</strong> (οὐ χρείαν ἔχει/<em>ou chreian echei</em>) further bathing, only to <strong>wash his feet</strong> (νίψασθαι τοὺς πόδας/<em>nipsasthai tous podas</em>), using νίπτω (<em>niptō</em>), the verb for partial washing.<br><br>The distinction maps onto Christian soteriology with precision. The complete bath (λούω) represents justification—the once-for-all cleansing from sin's guilt through Christ's blood (Titus 3:5, 'washing of regeneration'). The foot-washing (νίπτω) represents ongoing sanctification—daily cleansing from sin's defilement through confession and Spirit-empowered growth (1 John 1:9, 'If we confess our sins, he is faithful and just to forgive us'). Believers are definitively cleansed (<em>clean every whit</em>—καθαρός ἐστιν ὅλος/<em>katharos estin holos</em>), yet require continual cleansing from worldly contamination.<br><br>The phrase <strong>ye are clean, but not all</strong> (ὑμεῖς καθαροί ἐστε, ἀλλ' οὐχὶ πάντες/<em>hymeis katharoi este, all' ouchi pantes</em>) introduces the sobering reality of Judas's presence. Among the Twelve, eleven had experienced regeneration's bath; one remained spiritually filthy despite outward proximity to Christ. External religious participation doesn't guarantee internal transformation.",
|
||||
"historical": "First-century bathing customs illuminate Jesus's metaphor. After visiting the public baths (<em>thermae</em>), a Roman would return home with clean body but dusty feet from walking unpaved streets. Only feet required washing, not re-bathing. Jesus takes this common experience and transforms it into spiritual truth. Jewish purification rituals similarly distinguished complete immersion (mikveh) from partial washing. The once-for-all nature of justification contrasted with the Levitical system's endless repetition of sacrifices—a distinction Hebrews 10:11-14 emphasizes. Jesus's reference to one unclean disciple anticipates verse 11's explanation about Judas. Despite three years with Jesus, witnessing miracles, hearing teaching, Judas remained unregenerate—a warning against presuming external religion equals internal reality. The early church applied this verse both to initial baptism (the bath) and ongoing confession of sin (the foot-washing), seeing sacramental and pastoral implications.",
|
||||
"questions": [
|
||||
"How does understanding the distinction between definitive cleansing (justification) and ongoing cleansing (sanctification) affect your assurance of salvation and pursuit of holiness?",
|
||||
"What 'dust' accumulates on believers' feet through daily living in a fallen world, and how does Christ provide for its cleansing?",
|
||||
"What does Judas's presence among the disciples—outwardly identical but spiritually unclean—teach about the dangers of mere external religion?"
|
||||
]
|
||||
},
|
||||
"11": {
|
||||
"analysis": "<strong>For he knew who should betray him; therefore said he, Ye are not all clean.</strong> This verse explains Jesus's cryptic statement in verse 10. The phrase <strong>he knew</strong> (ᾔδει γάρ/<em>ēdei gar</em>) uses the pluperfect form of οἶδα (<em>oida</em>), indicating comprehensive, settled knowledge existing before the moment—Jesus had always known. The participle <strong>who should betray him</strong> (τὸν παραδιδόντα αὐτόν/<em>ton paradidonata auton</em>) uses present tense, suggesting ongoing treachery—Judas's betrayal wasn't sudden impulse but developing conspiracy.<br><br>The verb παραδίδωμι (<em>paradidōmi</em>)—to hand over, betray, deliver up—appears repeatedly in the Passion narrative. Judas <em>paradidōmi</em> Jesus to the authorities (John 18:2), who <em>paradidōmi</em> Him to Pilate (John 18:30), who <em>paradidōmi</em> Him to crucifixion (John 19:16). Yet providentially, the Father <em>paradidōmi</em> the Son for our redemption (Romans 8:32). Human treachery serves divine purposes.<br><br>Jesus's foreknowledge of betrayal intensifies the scene's pathos. He washes the feet of His betrayer. He serves the one plotting His death. This displays both divine omniscience and incomprehensible love—<em>while we were yet sinners, Christ died for us</em> (Romans 5:8). Judas receives the same intimate service as the faithful Eleven, demonstrating that Christ's love extends even to those who reject Him. Yet love spurned becomes judgment. Judas's presence at the foot-washing but exclusion from spiritual cleansing illustrates the tragedy of resisting grace.",
|
||||
"historical": "John's Gospel emphasizes Jesus's divine knowledge throughout—He knew what was in man (2:25), knew the Samaritan woman's history (4:18), knew from the beginning who would believe and who would betray (6:64). This foreknowledge doesn't cause Judas's betrayal but reveals Jesus's deity. Judas held the disciples' money bag and regularly stole from it (John 12:6), showing long-standing treachery. Jesus's selection of Judas knowing he would betray raises questions addressed by verse 18: 'that the scripture may be fulfilled.' Judas fulfilled Psalm 41:9—'he that eateth bread with me hath lifted up his heel against me.' Satan entered Judas during this very meal (John 13:27), though Judas had already contracted with the chief priests for thirty silver pieces (Matthew 26:14-16). The early church wrestled with Judas's culpability versus divine sovereignty. Church fathers like Augustine argued Judas acted freely yet within God's sovereign plan—a mystery but not contradiction.",
|
||||
"questions": [
|
||||
"How does Jesus's foreknowledge of Judas's betrayal yet willingness to wash his feet demonstrate the nature of divine love?",
|
||||
"What does Judas's proximity to Jesus—sharing meals, hearing teaching, witnessing miracles—yet remaining spiritually unclean warn about external religion?",
|
||||
"How should the reality that Christ's love extends even to His betrayers shape our understanding of evangelism and treatment of enemies?"
|
||||
]
|
||||
},
|
||||
"12": {
|
||||
"analysis": "<strong>So after he had washed their feet, and had taken his garments, and was set down again, he said unto them, Know ye what I have done to you?</strong> Having completed the foot-washing, Jesus resumes His position as teacher (ἀνέπεσεν πάλιν/<em>anepesen palin</em>—reclined again at table) to explain the acted parable. The question <strong>Know ye what I have done?</strong> (Γινώσκετε τί πεποίηκα ὑμῖν;/<em>Ginōskete ti pepoiēka hymin?</em>) uses present tense γινώσκω (<em>ginōskō</em>)—do you understand, perceive, grasp the significance?—with perfect tense πεποίηκα (<em>pepoiēka</em>), emphasizing completed action with abiding results.<br><br>Jesus distinguishes between witnessing an action and comprehending its meaning. The disciples saw Him wash feet; the question is whether they understood the theological, Christological, and ethical implications. This pedagogical method—symbolic action followed by explanation—appears throughout Jesus's ministry (cleansing the temple, cursing the fig tree, instituting the Lord's Supper). Physical actions convey spiritual realities.<br><br>The phrase <strong>what I have done to you</strong> (τί πεποίηκα ὑμῖν) positions disciples as recipients, not spectators. Jesus didn't perform a demonstration for them to observe but an act toward them requiring response. The foot-washing wasn't abstract theology but personal service with direct application. Verses 13-17 will unpack the meaning: Jesus is Lord and Teacher, yet serves; therefore disciples must serve one another. But the deeper meaning connects to verses 8-10: cleansing through Christ brings fellowship, foreshadowing His atoning death that washes away sin.",
|
||||
"historical": "Ancient pedagogical methods emphasized imitation of teachers. Disciples watched rabbis' actions as carefully as they heard their words, replicating lifestyle not just learning. Jesus's question 'Know ye what I have done?' invites reflection on meaning, not mere repetition of action. The foot-washing occurred within the Passover meal celebrating Israel's deliverance from Egypt. Just as Passover commemorated physical redemption through the lamb's blood, Jesus's actions pointed toward spiritual redemption through His blood. Church tradition has debated whether to practice literal foot-washing as ordinance (some Anabaptist groups) or understand it as ethical principle (mutual service and humility). Most Reformed interpreters see both spiritual meaning (cleansing through Christ's work) and ethical application (humble service), without making foot-washing a required ritual. Jesus's resumed teaching position after washing feet signifies the union of authority and humility—He serves without surrendering lordship, combining majesty and meekness.",
|
||||
"questions": [
|
||||
"What is the difference between observing Jesus's actions and understanding their significance, and how does this apply to reading Scripture?",
|
||||
"How does Jesus's question 'Know ye what I have done to you?' shift focus from watching to participating, from spectatorship to discipleship?",
|
||||
"In what ways does the foot-washing scene reveal both the humility and authority of Christ, and how should this dual reality shape Christian leadership?"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
# Add new commentaries to chapter 13
|
||||
for verse, content in commentaries.items():
|
||||
if verse not in data["commentary"]["13"]:
|
||||
data["commentary"]["13"][verse] = content
|
||||
print(f"Added commentary for John 13:{verse}")
|
||||
else:
|
||||
print(f"Commentary for John 13:{verse} already exists, skipping")
|
||||
|
||||
# Write back to file
|
||||
with open(json_file, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, ensure_ascii=False, indent=2)
|
||||
|
||||
print(f"\nSuccessfully updated {json_file}")
|
||||
print(f"Total verses in John 13: {len(data['commentary']['13'])}")
|
||||
@@ -1,158 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Add John commentary - Part 1: Chapters 8, 10."""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
PROJECT_ROOT = Path(__file__).parent.parent
|
||||
DATA_DIR = PROJECT_ROOT / "kjvstudy_org" / "data" / "verse_commentary"
|
||||
|
||||
filepath = DATA_DIR / "john.json"
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
commentary = data.get("commentary", {})
|
||||
|
||||
# John commentary - Part 1
|
||||
new_entries = {
|
||||
"8": {
|
||||
"59": {
|
||||
"analysis": "<strong>Then took they up stones to cast at him</strong> (ἦραν οὖν λίθους ἵνα βάλωσιν ἐπ' αὐτόν, <em>eran oun lithous hina balosin ep' auton</em>)—The crowd's violent response to Jesus's claim <strong>'Before Abraham was, I am'</strong> (8:58) proves they understood His deity claim. Stoning was prescribed for blasphemy (Leviticus 24:16), and they recognized Jesus's ἐγώ εἰμι (<em>ego eimi</em>, 'I AM') as invoking God's covenant name from Exodus 3:14. <strong>But Jesus hid himself, and went out of the temple, going through the midst of them, and so passed by</strong> (Ἰησοῦς δὲ ἐκρύβη καὶ ἐξῆλθεν ἐκ τοῦ ἱεροῦ, <em>Iesous de ekrybe kai exelthen ek tou hierou</em>)—His escape demonstrates supernatural power; no mob can kill God's Son before His appointed hour (John 7:30; 8:20).<br><br>This verse reveals the fundamental division: some recognize Jesus as Yahweh incarnate and worship; others recognize the claim and seek to kill Him for 'blasphemy.' There is no middle ground when confronting Christ's deity. His ability to pass through the hostile crowd prefigures His resurrection power—death cannot hold Him when He chooses otherwise.",
|
||||
"historical": "This incident occurred during the Feast of Tabernacles (John 7:2), when Jerusalem swelled with pilgrims. Temple precincts had stones readily available for construction or repair. The attempt to stone Jesus in the temple itself shows how His claims provoked religious authorities beyond mere theological disagreement into murderous rage.",
|
||||
"questions": [
|
||||
"How does Jesus's claim 'Before Abraham was, I AM' force a decision—either worship Him as God or reject Him as blasphemer?",
|
||||
"What does Jesus's supernatural escape teach about God's sovereignty over the timing of His own sacrifice?",
|
||||
"How should Christians respond when confessing Christ's deity provokes hostile reactions—with fear or confidence in His protecting power?"
|
||||
]
|
||||
}
|
||||
},
|
||||
"10": {
|
||||
"31": {
|
||||
"analysis": "<strong>Then the Jews took up stones again to stone him</strong> (Ἐβάστασαν πάλιν λίθους οἱ Ἰουδαῖοι ἵνα λιθάσωσιν αὐτόν, <em>Ebastastan palin lithous hoi Ioudaioi hina lithasosin auton</em>)—The word πάλιν (<em>palin</em>, 'again') references their previous attempt (8:59). Jesus's discourse about being one with the Father (10:30) triggers renewed murderous intent. The repetition demonstrates persistent rejection—they don't misunderstand His claims; they understand perfectly and violently oppose divinity in human flesh.<br><br>This sets up Jesus's brilliant defense (verses 32-38), where He distinguishes between 'good works' and the real issue: His ontological claim to deity. The rulers don't object to miracles but to Jesus's assertion of divine nature. Their consistent violence proves that humanity's fundamental problem isn't ignorance but rebellion against God's rightful authority.",
|
||||
"historical": "This occurred during the Feast of Dedication (Hanukkah, John 10:22), commemorating temple rededication after Maccabean victory. Ironically, they sought to stone the true Temple (John 2:19-21) during a feast celebrating temple cleansing. Jesus walked in Solomon's Portico, where crowds could easily access building stones.",
|
||||
"questions": [
|
||||
"Why do people violently oppose Jesus's deity claims rather than merely dismissing them as delusion?",
|
||||
"How does repeated rejection of clear truth demonstrate the depth of human sinfulness and need for regeneration?",
|
||||
"What does it mean that good works cannot overcome rejection of Christ's person—that doing good without acknowledging Him is insufficient?"
|
||||
]
|
||||
},
|
||||
"32": {
|
||||
"analysis": "<strong>Jesus answered them, Many good works have I shewed you from my Father</strong> (ἀπεκρίθη αὐτοῖς ὁ Ἰησοῦς· Πολλὰ ἔργα καλὰ ἔδειξα ὑμῖν ἐκ τοῦ πατρός, <em>apekrithe autois ho Iesous· Polla erga kala edeixa hymin ek tou patros</em>)—Jesus emphasizes πολλά (<em>polla</em>, 'many') and καλά (<em>kala</em>, 'good, beautiful, noble') works sourced ἐκ τοῦ πατρός (<em>ek tou patros</em>, 'from the Father'). His miracles authenticated His divine mission (John 5:36; 10:25). <strong>For which of those works do ye stone me?</strong> (διὰ ποῖον αὐτῶν ἔργον ἐμὲ λιθάζετε, <em>dia poion auton ergon eme lithazete</em>)—rhetorical question exposing their illogic: His works prove deity rather than merit death.<br><br>Jesus forces them to admit the real issue isn't His actions but His identity. No amount of good works satisfies those who reject His person. This applies to all religious people who appreciate Jesus's teachings or miracles but refuse His Lordship—ultimately, the issue is always 'who do you say that I am?'",
|
||||
"historical": "Jesus had healed the blind man (John 9), freed the demonized, fed thousands, and performed countless miracles throughout Judea and Galilee. The religious leaders couldn't deny these 'good works' (they later acknowledge Jesus did 'many miracles,' John 11:47), but works proving deity threaten their authority and theology.",
|
||||
"questions": [
|
||||
"How does Jesus's appeal to His works demonstrate that God provides sufficient evidence for faith to those willing to believe?",
|
||||
"Why do people often admire Jesus's ethical teachings while rejecting His divine claims—what makes His person more offensive than His principles?",
|
||||
"What does it mean that religious opposition to Christ focuses on His identity rather than His actions?"
|
||||
]
|
||||
},
|
||||
"33": {
|
||||
"analysis": "<strong>The Jews answered him, saying, For a good work we stone thee not; but for blasphemy</strong> (ἀπεκρίθησαν αὐτῷ οἱ Ἰουδαῖοι· Περὶ καλοῦ ἔργου οὐ λιθάζομέν σε ἀλλὰ περὶ βλασφημίας, <em>apekrithesan auto hoi Ioudaioi· Peri kalou ergou ou lithazomen se alla peri blasphemias</em>)—They explicitly state the charge: βλασφημία (<em>blasphemia</em>, 'blasphemy'), speaking against God. <strong>And because that thou, being a man, makest thyself God</strong> (καὶ ὅτι σὺ ἄνθρωπος ὢν ποιεῖς σεαυτὸν θεόν, <em>kai hoti sy anthropos on poieis seauton theon</em>)—they correctly identify Jesus's claim: though ἄνθρωπος (<em>anthropos</em>, 'a man, human'), He makes Himself θεόν (<em>theon</em>, 'God').<br><br>This verse demonstrates that first-century Jews understood exactly what Jesus claimed—full deity, not mere Messiahship or prophetic status. Modern attempts to reinterpret Jesus as merely a good teacher or prophet ignore that His contemporaries faced His unambiguous deity claims and chose sides. Either they were right (He blasphemed) or He truly is God incarnate—no other option exists.",
|
||||
"historical": "The charge of blasphemy carried the death penalty under Mosaic Law (Leviticus 24:16). Jewish leaders lacked authority to execute under Roman rule, which is why they later brought Him to Pilate with political charges (Luke 23:2). But their true grievance was always theological: Jesus's deity claim threatened their religious system and authority.",
|
||||
"questions": [
|
||||
"How does the Jewish leaders' clear understanding of Jesus's deity claim challenge modern attempts to portray Him as merely a moral teacher?",
|
||||
"Why is Jesus's claim to be both fully human and fully God the central issue of Christianity—not peripheral doctrine?",
|
||||
"What does it mean that Jesus's blasphemy was either true (making Him God) or false (making Him a deceiver worthy of death)—no middle ground exists?"
|
||||
]
|
||||
},
|
||||
"34": {
|
||||
"analysis": "<strong>Jesus answered them, Is it not written in your law, I said, Ye are gods?</strong> (ἀπεκρίθη αὐτοῖς ὁ Ἰησοῦς· Οὐκ ἔστιν γεγραμμένον ἐν τῷ νόμῳ ὑμῶν ὅτι Ἐγὼ εἶπα· Θεοί ἐστε, <em>apekrithe autois ho Iesous· Ouk estin gegrammenon en to nomo hymon hoti Ego eipa· Theoi este</em>)—Jesus quotes Psalm 82:6, where God addresses human judges as 'gods' (אֱלֹהִים, <em>elohim</em>; θεοί, <em>theoi</em>) because they exercise God-delegated judicial authority. His argument moves from lesser to greater: if Scripture calls mere human judges 'gods' functionally, how much more can the one whom the Father sanctified and sent claim divine sonship?<br><br>This is <em>qal va-chomer</em> reasoning (light to heavy)—if lesser beings can be called 'gods' in a representative sense, the incarnate Word who is eternally God cannot be charged with blasphemy for claiming what He intrinsically is. Jesus isn't arguing He's merely a 'god' like judges, but defending the appropriateness of His deity claim based on Scripture's own usage.",
|
||||
"historical": "Psalm 82 was well-known in Second Temple Judaism. Jesus's clever exegesis uses their own Scripture to demonstrate consistency: if the Bible uses 'god' language for human authorities, His claim to deity—backed by miraculous works—cannot be dismissed as blasphemy without Scripture contradicting itself. This rabbinical argumentation method was common in first-century debate.",
|
||||
"questions": [
|
||||
"How does Jesus's use of Scripture to defend His deity claims demonstrate that the Old Testament anticipated the Incarnation?",
|
||||
"What's the difference between human judges called 'gods' functionally and Jesus who is God ontologically?",
|
||||
"How should Christians use Jesus's example of Scriptural reasoning when defending the faith against objections?"
|
||||
]
|
||||
},
|
||||
"35": {
|
||||
"analysis": "<strong>If he called them gods, unto whom the word of God came, and the scripture cannot be broken</strong> (εἰ ἐκείνους εἶπεν θεοὺς πρὸς οὓς ὁ λόγος τοῦ θεοῦ ἐγένετο, καὶ οὐ δύναται λυθῆναι ἡ γραφή, <em>ei ekeinous eipen theous pros hous ho logos tou theou egeneto, kai ou dynatai lythenai he graphe</em>)—Jesus's parenthetical statement about Scripture's inviolability is crucial. The phrase οὐ δύναται λυθῆναι ἡ γραφή (<em>ou dynatai lythenai he graphe</em>, 'the Scripture cannot be broken') affirms biblical inerrancy and authority. If even Psalm 82's metaphorical use of 'gods' is authoritative and unbreakable, how much more the rest of Scripture?<br><br>Jesus grounds His entire defense on Scripture's absolute trustworthiness—every word matters and stands forever. This contradicts modern approaches that pick and choose biblical authority. Jesus's complete confidence in Scripture's integrity provides the model for Christian faith: God's written Word is unbreakable, therefore what it says about God's incarnate Word is absolutely true.",
|
||||
"historical": "First-century Jewish debates assumed Scripture's complete authority—disputes centered on interpretation, not whether the text was authoritative. Jesus operates within this framework, demonstrating that His deity claims align with Scripture properly understood. This verse became foundational for Christian doctrine of biblical inerrancy.",
|
||||
"questions": [
|
||||
"How does Jesus's statement that 'scripture cannot be broken' shape Christian understanding of biblical authority?",
|
||||
"If Jesus trusted Scripture's every word as unbreakable, how should believers approach modern challenges to biblical reliability?",
|
||||
"What's the relationship between trusting Scripture's authority about Christ and trusting Christ's authority about Scripture?"
|
||||
]
|
||||
},
|
||||
"36": {
|
||||
"analysis": "<strong>Say ye of him, whom the Father hath sanctified, and sent into the world, Thou blasphemest; because I said, I am the Son of God?</strong> (ὃν ὁ πατὴρ ἡγίασεν καὶ ἀπέστειλεν εἰς τὸν κόσμον ὑμεῖς λέγετε ὅτι Βλασφημεῖς, ὅτι εἶπον· Υἱὸς τοῦ θεοῦ εἰμι, <em>hon ho pater hēgiasen kai apesteilen eis ton kosmon hymeis legete hoti Blasphemeis, hoti eipon· Huios tou theou eimi</em>)—Jesus describes Himself with two divine actions: ἡγίασεν (<em>hēgiasen</em>, 'sanctified, set apart') and ἀπέστειλεν (<em>apesteilen</em>, 'sent'). The Father uniquely sanctified Him before sending Him εἰς τὸν κόσμον (<em>eis ton kosmon</em>, 'into the world')—language of preexistence and Incarnation. <strong>I am the Son of God</strong> (Υἱὸς τοῦ θεοῦ εἰμι, <em>Huios tou theou eimi</em>) isn't claiming adoptive sonship but eternal ontological relationship.<br><br>Jesus's argument reaches its climax: if Scripture calls human judges 'gods,' how can charging blasphemy against the one whom God Himself sanctified and sent be justified? The logic is irrefutable for those willing to accept it. 'Son of God' in Jewish context meant equality with God (John 5:18; Philippians 2:6)—not merely special prophet or Messiah.",
|
||||
"historical": "The title 'Son of God' carried profound theological weight in Second Temple Judaism. When Jesus claimed it, Jewish leaders understood He claimed divine nature, not merely Davidic Messiahship. At His trial, the high priest understood 'Son of God' as a blasphemous deity claim (Matthew 26:63-65), confirming this interpretation.",
|
||||
"questions": [
|
||||
"How does Jesus being 'sanctified and sent' by the Father before incarnation demonstrate His preexistence and deity?",
|
||||
"What's the difference between being called 'son of God' (like Israel corporately or judges functionally) and being THE Son of God eternally?",
|
||||
"How should the logic of Jesus's defense shape how Christians explain His deity to skeptics?"
|
||||
]
|
||||
},
|
||||
"37": {
|
||||
"analysis": "<strong>If I do not the works of my Father, believe me not</strong> (εἰ οὐ ποιῶ τὰ ἔργα τοῦ πατρός μου, μὴ πιστεύετέ μοι, <em>ei ou poio ta erga tou patros mou, mē pisteuete moi</em>)—Jesus invites skeptical investigation: if His works don't authenticate His claims, reject Him. This demonstrates confidence in empirical evidence. The 'works' (ἔργα, <em>erga</em>) are distinctly 'of my Father' (τοῦ πατρός μου, <em>tou patros mou</em>)—supernatural acts only God can perform: creating, healing, raising the dead, forgiving sins.<br><br>Jesus doesn't ask for blind faith but evidential faith. His works prove His identity—not as isolated proofs but as consistent testimony pointing to His divine nature. This challenges both fideism (faith without evidence) and skepticism (rejecting evidence because of philosophical presuppositions). God provides sufficient evidence; rejection stems from unwillingness, not lack of proof.",
|
||||
"historical": "Jesus performed His works publicly, witnessed by multitudes. The Jewish leaders couldn't deny the miracles (they later admit Jesus did 'many signs,' John 11:47), but they attributed them to Satan (Matthew 12:24) or suppressed testimony (John 12:10-11). Evidence alone doesn't produce faith when the heart is hardened.",
|
||||
"questions": [
|
||||
"How does Jesus's appeal to evidence demonstrate that Christianity isn't 'blind faith' but reasoned trust based on verified facts?",
|
||||
"What does it mean that Jesus's works authenticate His words—how do His miracles prove His deity rather than merely power?",
|
||||
"Why do some people witness miracles yet remain unbelieving—what role does the will play in accepting or rejecting evidence?"
|
||||
]
|
||||
},
|
||||
"38": {
|
||||
"analysis": "<strong>But if I do, though ye believe not me, believe the works: that ye may know, and believe, that the Father is in me, and I in him</strong> (εἰ δὲ ποιῶ, κἂν ἐμοὶ μὴ πιστεύητε, τοῖς ἔργοις πιστεύετε, ἵνα γνῶτε καὶ γινώσκητε ὅτι ἐν ἐμοὶ ὁ πατὴρ κἀγὼ ἐν τῷ πατρί, <em>ei de poio, kan emoi mē pisteuēte, tois ergois pisteuete, hina gnōte kai ginōskēte hoti en emoi ho patēr kagō en tō patri</em>)—Jesus offers a minimal faith: even if they can't believe His person yet, believe His works' testimony. The goal is ἵνα γνῶτε καὶ γινώσκητε (<em>hina gnōte kai ginōskēte</em>, 'that you may know and keep knowing')—progressive understanding leading to settled conviction. <strong>The Father is in me, and I in him</strong> expresses mutual indwelling—the perichoretic relationship within the Trinity.<br><br>This verse demonstrates God's patience with honest doubters: start with evidence, move toward understanding, arrive at faith. The works point beyond themselves to the Person. Jesus's claim of mutual indwelling with the Father restates His deity in slightly different terms—He and the Father share divine essence (John 10:30).",
|
||||
"historical": "This appeal to 'believe the works' echoes Jesus's earlier challenge to the Jews: 'Search the scriptures...they are they which testify of me' (John 5:39). God provides multiple avenues to faith—Scripture, miracles, fulfilled prophecy, Jesus's teaching—removing excuse for unbelief while respecting human will.",
|
||||
"questions": [
|
||||
"How does God graciously provide multiple paths to faith (works, Scripture, teaching) for those genuinely seeking truth?",
|
||||
"What's the progression from believing Jesus's works to believing His person to understanding His unity with the Father?",
|
||||
"How can Christians use Jesus's model—pointing to evidence that leads to personal encounter—in evangelism?"
|
||||
]
|
||||
},
|
||||
"39": {
|
||||
"analysis": "<strong>Therefore they sought again to take him: but he escaped out of their hand</strong> (Ἐζήτουν οὖν αὐτὸν πάλιν πιάσαι· καὶ ἐξῆλθεν ἐκ τῆς χειρὸς αὐτῶν, <em>Ezētoun oun auton palin piasai· kai exēlthen ek tēs cheiros autōn</em>)—Despite Jesus's rational defense and evidential appeal, they respond with renewed violence. The word πάλιν (<em>palin</em>, 'again') emphasizes persistent rejection. <strong>He escaped out of their hand</strong> (ἐξῆλθεν ἐκ τῆς χειρὸς αὐτῶν, <em>exēlthen ek tēs cheiros autōn</em>) demonstrates supernatural protection—no one takes His life until He voluntarily lays it down (John 10:18).<br><br>This pattern repeats: Jesus presents clear teaching and evidence, religious leaders respond with murderous rage, He supernaturally escapes. It demonstrates that rejection of Christ isn't intellectual but volitional—they understand His claims perfectly and hate them. His repeated escapes prove God's sovereignty over the timing of the crucifixion—it happens at the appointed hour, not when humans choose.",
|
||||
"historical": "This attempt to seize Jesus occurred during Hanukkah at Solomon's Portico. Security couldn't have been tight, yet Jesus walked away unhindered. Later, when His hour came, He voluntarily allowed arrest (John 18:4-8), demonstrating that all previous escapes were supernatural acts, not lucky circumstances.",
|
||||
"questions": [
|
||||
"What does it reveal about human sinfulness that clear evidence and rational argument produce violent rejection rather than faith?",
|
||||
"How does Jesus's repeated supernatural escapes until 'His hour' demonstrate God's control over redemptive history?",
|
||||
"Why is it important that Jesus laid down His life voluntarily rather than being overpowered by enemies?"
|
||||
]
|
||||
},
|
||||
"40": {
|
||||
"analysis": "<strong>And went away again beyond Jordan into the place where John at first baptized; and there he abode</strong> (καὶ ἀπῆλθεν πάλιν πέραν τοῦ Ἰορδάνου εἰς τὸν τόπον ὅπου ἦν Ἰωάννης τὸ πρῶτον βαπτίζων, καὶ ἔμεινεν ἐκεῖ, <em>kai apēlthen palin peran tou Iordanou eis ton topon hopou ēn Iōannēs to prōton baptizōn, kai emeinen ekei</em>)—Jesus returns to where His public ministry began, the site of John's testimony (John 1:28-34). The phrase πέραν τοῦ Ἰορδάνου (<em>peran tou Iordanou</em>, 'beyond the Jordan') places Him outside Judean jurisdiction, providing temporary safety. ἔμεινεν (<em>emeinen</em>, 'He abode, remained') suggests extended stay, not mere passing through.<br><br>This strategic withdrawal serves multiple purposes: escaping immediate danger, allowing time for His message to resonate, and geographically connecting back to John's witness. Jesus returns to the beginning, where John testified 'Behold the Lamb of God' (John 1:29)—preparing for His journey back to Jerusalem for Passover sacrifice.",
|
||||
"historical": "Bethany beyond Jordan (or Bethabara) was in Perea, territory ruled by Herod Antipas rather than the Judean authorities who sought Jesus's death. This provided temporary sanctuary. John had baptized there approximately two years earlier, and people still remembered his testimony about Jesus.",
|
||||
"questions": [
|
||||
"Why is it significant that Jesus returned to where John first testified about Him—what does this 'full circle' movement signify?",
|
||||
"How does Jesus's strategic withdrawal demonstrate wisdom in ministry—knowing when to confront and when to retreat?",
|
||||
"What does Jesus's return to John's baptismal site teach about the importance of testimony and witness in preparing hearts for Christ?"
|
||||
]
|
||||
},
|
||||
"41": {
|
||||
"analysis": "<strong>And many resorted unto him, and said, John did no miracle: but all things that John spake of this man were true</strong> (καὶ πολλοὶ ἦλθον πρὸς αὐτὸν καὶ ἔλεγον ὅτι Ἰωάννης μὲν σημεῖον ἐποίησεν οὐδέν, πάντα δὲ ὅσα εἶπεν Ἰωάννης περὶ τούτου ἀληθῆ ἦν, <em>kai polloi ēlthon pros auton kai elegon hoti Iōannēs men sēmeion epoiēsen ouden, panta de hosa eipen Iōannēs peri toutou alēthē ēn</em>)—The crowds draw a powerful comparison: <strong>John did no miracle</strong> (Ἰωάννης...σημεῖον ἐποίησεν οὐδέν, <em>Iōannēs...sēmeion epoiēsen ouden</em>), yet <strong>all things that John spake of this man were true</strong> (πάντα...ἀληθῆ ἦν, <em>panta...alēthē ēn</em>). They validate John's prophecy by Jesus's fulfillment—His miracles (σημεῖα, <em>sēmeia</em>, 'signs') authenticate John's witness.<br><br>This demonstrates the power of faithful witness: John performed no miracles, yet his testimony bore fruit because it pointed away from himself to Christ. The greatest ministry isn't displaying one's own power but faithfully directing others to Jesus. John's legacy wasn't supernatural demonstrations but truthful proclamation that proved reliable.",
|
||||
"historical": "John the Baptist's execution by Herod Antipas (Matthew 14:1-12) had occurred perhaps a year earlier. His memory remained powerful, and people in this region had heard him personally. Jesus's miracles now validated everything John had prophesied, proving John was a true prophet who prepared the way for the Messiah.",
|
||||
"questions": [
|
||||
"How does John's example—no miracles but faithful witness—encourage believers whose ministries seem ordinary?",
|
||||
"What does it mean that the greatest validation of witness is whether it accurately points people to Christ?",
|
||||
"How can Christians ensure their testimony remains focused on Christ rather than drawing attention to themselves?"
|
||||
]
|
||||
},
|
||||
"42": {
|
||||
"analysis": "<strong>And many believed on him there</strong> (καὶ πολλοὶ ἐπίστευσαν εἰς αὐτὸν ἐκεῖ, <em>kai polloi episteusan eis auton ekei</em>)—The phrase πολλοὶ ἐπίστευσαν (<em>polloi episteusan</em>, 'many believed') indicates saving faith: ἐπίστευσαν εἰς αὐτόν (<em>episteusan eis auton</em>, 'believed into Him') uses the preposition εἰς (<em>eis</em>, 'into'), signifying commitment to Christ's person, not mere intellectual assent. The location marker ἐκεῖ (<em>ekei</em>, 'there') contrasts this receptive region with Jerusalem's rejection.<br><br>This verse demonstrates the sovereignty of evangelism: where John faithfully witnessed and Jesus performed authenticating works, many believed. The contrast is stark—Jerusalem's religious leaders, seeing the same evidence, sought to kill Him; simple people in Perea, remembering John's testimony and witnessing Jesus's works, believed. Faith isn't about access to evidence but willingness to submit to truth.",
|
||||
"historical": "This mass belief in Perea (Transjordan) contrasts with John 12:37—in Jerusalem, 'though he had done so many miracles before them, yet they believed not on him.' Geography and social status don't determine faith, but heart receptivity does. These Perean believers formed part of the growing movement that would become the church.",
|
||||
"questions": [
|
||||
"Why did many in Perea believe while Jerusalem's religious elite rejected—what made the difference?",
|
||||
"How does the combination of faithful witness (John) and authenticating works (Jesus) create optimal conditions for faith?",
|
||||
"What does this verse teach about evangelism—that success isn't technique but faithfulness, with God granting the results?"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Merge entries
|
||||
added_count = 0
|
||||
for chapter, verses in new_entries.items():
|
||||
if chapter not in commentary:
|
||||
commentary[chapter] = {}
|
||||
for verse, entry in verses.items():
|
||||
if verse not in commentary[chapter]:
|
||||
commentary[chapter][verse] = entry
|
||||
added_count += 1
|
||||
print(f"Added John {chapter}:{verse}")
|
||||
|
||||
data["commentary"] = commentary
|
||||
|
||||
with open(filepath, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, ensure_ascii=False, indent=2)
|
||||
|
||||
print(f"\nTotal John verses added (Part 1): {added_count}")
|
||||
print(f"Saved to {filepath}")
|
||||
@@ -1,144 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Add John commentary - Part 2: Chapters 13-19."""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
PROJECT_ROOT = Path(__file__).parent.parent
|
||||
DATA_DIR = PROJECT_ROOT / "kjvstudy_org" / "data" / "verse_commentary"
|
||||
|
||||
filepath = DATA_DIR / "john.json"
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
commentary = data.get("commentary", {})
|
||||
|
||||
# John commentary - Part 2
|
||||
new_entries = {
|
||||
"13": {
|
||||
"38": {
|
||||
"analysis": "<strong>Jesus answered him, Wilt thou lay down thy life for my sake?</strong> (ἀποκρίνεται Ἰησοῦς· Τὴν ψυχήν σου ὑπὲρ ἐμοῦ θήσεις, <em>apokrinetai Iēsous· Tēn psychēn sou hyper emou thēseis</em>)—Jesus questions Peter's confident self-assessment (13:37). The verb θήσεις (<em>thēseis</em>, 'will you lay down') echoes Jesus's own statement about laying down His life (John 10:11, 15). <strong>Verily, verily, I say unto thee, The cock shall not crow, till thou hast denied me thrice</strong> (ἀμὴν ἀμὴν λέγω σοι, οὐ μὴ ἀλέκτωρ φωνήσῃ ἕως οὗ ἀρνήσῃ με τρίς, <em>amēn amēn legō soi, ou mē alektōr phōnēsē heōs hou arnēsē me tris</em>)—The double ἀμὴν (<em>amēn</em>, 'verily') emphasizes certainty. Peter will deny (ἀρνήσῃ, <em>arnēsē</em>, 'deny, disown') Jesus τρίς (<em>tris</em>, 'three times') before dawn.<br><br>This prophecy reveals Jesus's omniscience and Peter's overconfidence. Peter genuinely intended loyalty but didn't know his own weakness. Jesus's prediction isn't cruel but preparatory—knowing Peter will fail yet be restored teaches that discipleship depends on Christ's keeping power, not human strength. Peter's restoration (John 21:15-19) would prove grace triumphs over failure.",
|
||||
"historical": "This occurred in the Upper Room during the Last Supper, hours before Peter's actual denials (John 18:15-27). Peter's self-confidence was characteristic—he repeatedly spoke impulsively (Matthew 14:28; 16:22; 17:4). Yet Jesus chose him to lead the church, demonstrating God uses broken, restored sinners, not perfect saints.",
|
||||
"questions": [
|
||||
"How does Peter's overconfidence warn against trusting our own strength rather than depending on Christ's sustaining grace?",
|
||||
"What does Jesus's foreknowledge of Peter's failure yet continued investment in him teach about God's patient discipleship?",
|
||||
"How should Christians respond when we fail Christ—with despair like Judas or repentance like Peter?"
|
||||
]
|
||||
}
|
||||
},
|
||||
"14": {
|
||||
"28": {
|
||||
"analysis": "<strong>Ye have heard how I said unto you, I go away, and come again unto you</strong>—Jesus reminds them of His previous teaching (14:3). <strong>If ye loved me, ye would rejoice, because I said, I go unto the Father: for my Father is greater than I</strong> (εἰ ἠγαπᾶτέ με ἐχάρητε ἄν, ὅτι πορεύομαι πρὸς τὸν πατέρα, ὅτι ὁ πατὴρ μείζων μού ἐστιν, <em>ei ēgapate me echarēte an, hoti poreuomai pros ton patera, hoti ho patēr meizōn mou estin</em>)—This verse requires careful exegesis. <strong>My Father is greater than I</strong> (ὁ πατὴρ μείζων μού ἐστιν, <em>ho patēr meizōn mou estin</em>) doesn't deny Jesus's deity but acknowledges His voluntary subordination during incarnation (Philippians 2:6-8). The Father is 'greater' (μείζων, <em>meizōn</em>) positionally, not ontologically—Jesus temporarily submitted to human limitations during His earthly ministry.<br><br>Jesus says if they loved Him properly, they'd rejoice at His return to glory rather than grieve His departure. His going to the Father means: completed atonement, resumed glory, and sent Spirit (John 16:7). Arians and Jehovah's Witnesses misuse this verse to deny Christ's deity, but context shows Jesus speaks of His mediatorial office during incarnation, not His essential nature (Colossians 2:9).",
|
||||
"historical": "This statement came during the Upper Room Discourse before crucifixion. Jesus was preparing disciples for His departure while affirming His unity with the Father (John 14:9-11). Early church councils (Nicaea 325, Constantinople 381) clarified that 'greater' refers to Jesus's voluntary human state, not inequality within the Trinity.",
|
||||
"questions": [
|
||||
"How does understanding Jesus's voluntary submission during incarnation reconcile this verse with His full deity?",
|
||||
"What does it mean to love Christ rightly—rejoicing in His glorification rather than selfishly wanting His physical presence?",
|
||||
"How should Christians use this verse apologetically when confronted by those who deny Christ's deity?"
|
||||
]
|
||||
},
|
||||
"29": {
|
||||
"analysis": "<strong>And now I have told you before it come to pass, that, when it is come to pass, ye might believe</strong> (καὶ νῦν εἴρηκα ὑμῖν πρὶν γενέσθαι, ἵνα ὅταν γένηται πιστεύσητε, <em>kai nyn eirēka hymin prin genesthai, hina hotan genētai pisteusēte</em>)—Jesus predicts His death, resurrection, and return to the Father before it happens, so that when fulfilled, it will strengthen faith. The purpose clause ἵνα...πιστεύσητε (<em>hina...pisteusēte</em>, 'in order that you might believe') indicates that prophecy's fulfillment validates Jesus's divine knowledge and mission.<br><br>This principle—prophecy preceding fulfillment to confirm faith—operates throughout Scripture. Jesus repeatedly predicted His passion (Matthew 16:21; 17:22-23; 20:18-19) so disciples wouldn't stumble when it occurred. Fulfilled prophecy removes the excuse of doubt—God provides evidence before events to demonstrate sovereign control over history.",
|
||||
"historical": "When these predictions came true—crucifixion, resurrection, ascension—the disciples' faith solidified. Acts records their bold proclamation, rooted in fulfilled prophecy. Thomas's doubt (John 20:24-29) vanished when Jesus appeared; the disciples' fear transformed to courage when they witnessed what Jesus had foretold.",
|
||||
"questions": [
|
||||
"How does Jesus's predictive prophecy demonstrate His divine foreknowledge and strengthen faith when fulfilled?",
|
||||
"What role should fulfilled biblical prophecy play in apologetics and personal assurance of faith?",
|
||||
"How can Christians prepare others through teaching so unexpected trials don't destroy their faith?"
|
||||
]
|
||||
},
|
||||
"30": {
|
||||
"analysis": "<strong>Hereafter I will not talk much with you: for the prince of this world cometh, and hath nothing in me</strong> (οὐκέτι πολλὰ λαλήσω μεθ' ὑμῶν, ἔρχεται γὰρ ὁ τοῦ κόσμου ἄρχων καὶ ἐν ἐμοὶ οὐκ ἔχει οὐδέν, <em>ouketi polla lalēsō meth' hymōn, erchetai gar ho tou kosmou archōn kai en emoi ouk echei ouden</em>)—Jesus announces His teaching time is ending because <strong>the prince of this world</strong> (ὁ τοῦ κόσμου ἄρχων, <em>ho tou kosmou archōn</em>, Satan) approaches—Judas's betrayal and the crucifixion plot. Yet critically, Satan <strong>hath nothing in me</strong> (ἐν ἐμοὶ οὐκ ἔχει οὐδέν, <em>en emoi ouk echei ouden</em>)—no sin, no claim, no foothold. Jesus is perfectly sinless (2 Corinthians 5:21; Hebrews 4:15; 1 Peter 2:22).<br><br>This affirms Christ's qualification as spotless sacrifice. Satan has claims on all humanity through sin (Romans 3:23), but Jesus is immune—no inherited sin nature, no personal sin, no vulnerability to temptation that resulted in sin. His voluntary death is therefore substitutionary, not deserved punishment.",
|
||||
"historical": "This statement came shortly before Jesus and the disciples left the Upper Room for Gethsemane (John 14:31). Within hours, Satan's attack through Judas, the Jewish leaders, and Roman authorities would commence. Yet Jesus confidently asserted Satan's powerlessness over Him—death would come by choice, not conquest.",
|
||||
"questions": [
|
||||
"How does Jesus's sinlessness—Satan having 'nothing in Him'—qualify Him as the perfect sacrifice for sin?",
|
||||
"What does it mean that Satan is 'prince of this world'—what power does he have, and what are its limits?",
|
||||
"How should Christians respond to satanic attack knowing that Satan had no claim on sinless Jesus yet has claims on us through remaining sin?"
|
||||
]
|
||||
},
|
||||
"31": {
|
||||
"analysis": "<strong>But that the world may know that I love the Father; and as the Father gave me commandment, even so I do. Arise, let us go hence</strong> (ἀλλ' ἵνα γνῷ ὁ κόσμος ὅτι ἀγαπῶ τὸν πατέρα, καὶ καθὼς ἐνετείλατο μοί ὁ πατήρ, οὕτως ποιῶ. ἐγείρεσθε, ἄγωμεν ἐντεῦθεν, <em>all' hina gnō ho kosmos hoti agapō ton patera, kai kathōs eneteilato moi ho patēr, houtōs poiō. egeiresthe, agōmen enteuthen</em>)—Jesus explains His voluntary death: not Satan's victory but demonstration of His love for the Father. <strong>I love the Father</strong> (ἀγαπῶ τὸν πατέρα, <em>agapō ton patera</em>) using ἀγαπάω (<em>agapaō</em>, covenant love) shows the cross reveals Trinitarian love—the Son's obedience to the Father's redemptive plan. <strong>As the Father gave me commandment, even so I do</strong> (καθὼς ἐνετείλατο μοί ὁ πατήρ, οὕτως ποιῶ, <em>kathōs eneteilato moi ho patēr, houtōs poiō</em>)—perfect obedience to the Father's will. <strong>Arise, let us go hence</strong>—they leave the Upper Room for Gethsemane.<br><br>The cross is the supreme demonstration of the Son's love for the Father—willing obedience unto death (Philippians 2:8). This reframes the atonement: not merely God satisfying His wrath, but the Son joyfully honoring the Father by accomplishing redemption. The world sees God's love (John 3:16) and intra-Trinitarian love displayed at Calvary.",
|
||||
"historical": "This marks the transition from Upper Room discourse to Gethsemane. Chapters 15-17 may have been spoken en route or in the garden. Jesus went willingly, demonstrating the cross was voluntary submission to the Father's plan, not forced by circumstances or enemies.",
|
||||
"questions": [
|
||||
"How does viewing the cross as Jesus's love-demonstration to the Father enrich our understanding of atonement?",
|
||||
"What does Jesus's perfect obedience teach about true love—that it submits to God's will even when costly?",
|
||||
"How should Christians imitate Jesus's obedience to the Father's commands as demonstration of our love for God?"
|
||||
]
|
||||
}
|
||||
},
|
||||
"15": {
|
||||
"27": {
|
||||
"analysis": "<strong>And ye also shall bear witness, because ye have been with me from the beginning</strong> (καὶ ὑμεῖς δὲ μαρτυρεῖτε, ὅτι ἀπ' ἀρχῆς μετ' ἐμοῦ ἐστε, <em>kai hymeis de martyreite, hoti ap' archēs met' emou este</em>)—After promising the Holy Spirit's witness (15:26), Jesus commissions the disciples as witnesses. μαρτυρεῖτε (<em>martyreite</em>, 'you bear witness') is imperative—not optional but commanded. Their qualification is ἀπ' ἀρχῆς μετ' ἐμοῦ ἐστε (<em>ap' archēs met' emou este</em>, 'from the beginning with me')—eyewitness testimony from those who companied with Jesus throughout His ministry (Acts 1:21-22).<br><br>Christian witness rests on historical events witnessed and testified by credible eyewitnesses, empowered by the Holy Spirit. The apostles' unique qualification was physical presence during Jesus's ministry; later believers witness based on the apostolic testimony preserved in Scripture and the Spirit's internal testimony (1 John 5:9-11).",
|
||||
"historical": "This commission was fulfilled starting at Pentecost (Acts 2). The apostles testified to Jesus's life, death, and resurrection with Spirit-empowered boldness (Acts 4:20, 33). Their eyewitness accounts, recorded in the Gospels and epistles, form the foundation of Christian faith (Ephesians 2:20).",
|
||||
"questions": [
|
||||
"How does the eyewitness nature of apostolic testimony validate the historical reliability of the Gospel accounts?",
|
||||
"What's the difference between the apostles' unique witness role and the ongoing witness of all believers?",
|
||||
"How do the Holy Spirit's witness and human witness work together in evangelism?"
|
||||
]
|
||||
}
|
||||
},
|
||||
"17": {
|
||||
"22": {
|
||||
"analysis": "<strong>And the glory which thou gavest me I have given them; that they may be one, even as we are one</strong> (κἀγὼ τὴν δόξαν ἣν δέδωκάς μοι δέδωκα αὐτοῖς, ἵνα ὦσιν ἓν καθὼς ἡμεῖς ἕν, <em>kagō tēn doxan hēn dedōkas moi dedōka autois, hina ōsin hen kathōs hēmeis hen</em>)—Jesus prays that believers share in <strong>the glory</strong> (τὴν δόξαν, <em>tēn doxan</em>) the Father gave the Son. This isn't merely future glory but present participation in Christ's divine life. The purpose: <strong>that they may be one</strong> (ἵνα ὦσιν ἓν, <em>hina ōsin hen</em>), modeled on Trinitarian unity: <strong>even as we are one</strong> (καθὼς ἡμεῖς ἕν, <em>kathōs hēmeis hen</em>). Christian unity isn't organizational but ontological—participation in the divine nature (2 Peter 1:4) through union with Christ.<br><br>This profound prayer reveals that believers' unity flows from sharing Christ's glory—His presence, character, and mission. Division among Christians contradicts our nature as people indwelt by the same Spirit and united to the same Head. True unity requires supernatural transformation, not merely ecumenical agreement.",
|
||||
"historical": "This is part of Jesus's High Priestly Prayer (John 17) before His arrest. He prayed not only for the eleven disciples but 'for them also which shall believe on me through their word' (17:20)—all future Christians. Church history shows the struggle to maintain unity; divisions reveal how Christians often live below their calling.",
|
||||
"questions": [
|
||||
"How does sharing in Christ's glory create the basis for Christian unity rather than mere institutional organization?",
|
||||
"What does it mean that Christian unity is modeled on Trinitarian unity—distinct persons in perfect communion?",
|
||||
"How should churches pursue unity while maintaining doctrinal faithfulness—balancing truth and love?"
|
||||
]
|
||||
},
|
||||
"23": {
|
||||
"analysis": "<strong>I in them, and thou in me, that they may be made perfect in one</strong> (ἐγὼ ἐν αὐτοῖς καὶ σὺ ἐν ἐμοί, ἵνα ὦσιν τετελειωμένοι εἰς ἕν, <em>egō en autois kai sy en emoi, hina ōsin teteleiōmenoi eis hen</em>)—The chain of union: Father in Son, Son in believers, creating perfect unity. τετελειωμένοι (<em>teteleiōmenoi</em>, 'perfected, made complete') indicates process toward completeness εἰς ἕν (<em>eis hen</em>, 'into one'). <strong>And that the world may know that thou hast sent me, and hast loved them, as thou hast loved me</strong> (καὶ ἵνα γινώσκῃ ὁ κόσμος ὅτι σύ με ἀπέστειλας καὶ ἠγάπησας αὐτοὺς καθὼς ἐμὲ ἠγάπησας, <em>kai hina ginōskē ho kosmos hoti sy me apesteilas kai ēgapēsas autous kathōs eme ēgapēsas</em>)—Christian unity authenticates Jesus's mission and reveals God's love to the world.<br><br>This staggering claim: the world recognizes Christ's divine mission through believers' supernatural unity. When the church displays loving unity amidst diversity, it witnesses to the reality of Jesus's incarnation and the Father's love. Conversely, church divisions undermine evangelistic credibility. The Father loves believers <strong>as</strong> He loves the Son—adopting us into His family.",
|
||||
"historical": "The early church's unity attracted converts: 'Behold, how they love one another!' (Tertullian reports). When Christians transcended ethnic, social, and economic divisions (Galatians 3:28), it demonstrated supernatural transformation. Modern church divisions—denominational, racial, class-based—hinder evangelistic impact by contradicting Jesus's prayer.",
|
||||
"questions": [
|
||||
"How does Christian unity (or disunity) serve as evidence for or against the gospel's truth claims?",
|
||||
"What does it mean that God loves believers 'as' He loves Christ—how should this transform our self-understanding?",
|
||||
"How can local churches pursue the unity Jesus prayed for while avoiding compromise of biblical truth?"
|
||||
]
|
||||
},
|
||||
"24": {
|
||||
"analysis": "<strong>Father, I will that they also, whom thou hast given me, be with me where I am</strong> (Πάτερ, ὃ δέδωκάς μοι, θέλω ἵνα ὅπου εἰμὶ ἐγὼ κἀκεῖνοι ὦσιν μετ' ἐμοῦ, <em>Pater, ho dedōkas moi, thelō hina hopou eimi egō kakeinoi ōsin met' emou</em>)—Jesus uses θέλω (<em>thelō</em>, 'I will, desire') expressing authority as well as affection. He wills believers' eternal presence with Him. <strong>That they may behold my glory, which thou hast given me: for thou lovedst me before the foundation of the world</strong> (ἵνα θεωρῶσιν τὴν δόξαν τὴν ἐμὴν ἣν δέδωκάς μοι, ὅτι ἠγάπησάς με πρὸ καταβολῆς κόσμου, <em>hina theōrōsin tēn doxan tēn emēn hēn dedōkas moi, hoti ēgapēsas me pro katabolēs kosmou</em>)—Heaven's essence is beholding (θεωρῶσιν, <em>theōrōsin</em>, 'behold, gaze upon') Christ's glory (δόξαν, <em>doxan</em>) which He possessed πρὸ καταβολῆς κόσμου (<em>pro katabolēs kosmou</em>, 'before the foundation of the world')—His pre-incarnate, eternal glory.<br><br>This defines eternal life: not merely duration but quality—experiencing the love between Father and Son that existed before creation. The beatific vision (1 John 3:2) is seeing Christ as He truly is, sharing in the glory He had with the Father eternally. This surpasses all earthly joys.",
|
||||
"historical": "This prayer anticipates Christ's ascension and believers' future glorification. Paul echoes this: 'that I may know him, and the power of his resurrection' (Philippians 3:10); 'we shall be like him; for we shall see him as he is' (1 John 3:2). Heaven is Christocentric—the Lamb is its light (Revelation 21:23).",
|
||||
"questions": [
|
||||
"How does defining heaven as 'beholding Christ's glory' differ from popular notions of heaven as eternal pleasure park?",
|
||||
"What does it mean that Christ possessed glory 'before the foundation of the world'—how does this affirm His deity?",
|
||||
"How should the hope of eternally beholding Christ's glory shape present priorities and values?"
|
||||
]
|
||||
},
|
||||
"25": {
|
||||
"analysis": "<strong>O righteous Father, the world hath not known thee: but I have known thee, and these have known that thou hast sent me</strong> (Πάτερ δίκαιε, καὶ ὁ κόσμος σε οὐκ ἔγνω, ἐγὼ δέ σε ἔγνων, καὶ οὗτοι ἔγνωσαν ὅτι σύ με ἀπέστειλας, <em>Pater dikaie, kai ho kosmos se ouk egnō, egō de se egnōn, kai houtoi egnōsan hoti sy me aposteilas</em>)—Jesus addresses the Father as <strong>righteous</strong> (δίκαιε, <em>dikaie</em>, 'just, righteous'), acknowledging divine justice. <strong>The world hath not known thee</strong> (ὁ κόσμος σε οὐκ ἔγνω, <em>ho kosmos se ouk egnō</em>)—willful ignorance, not mere lack of information. Yet Jesus knows the Father perfectly (ἐγὼ δέ σε ἔγνων, <em>egō de se egnōn</em>), and believers have come to know (ἔγνωσαν, <em>egnōsan</em>) that Jesus was sent by the Father—recognizing His divine mission.<br><br>This creates three categories: the world (willfully ignorant of God), Jesus (who knows the Father perfectly), and believers (who know Jesus was sent by the Father). Salvation is knowledge—not mere information but covenant relationship. The world's refusal to know God is culpable ignorance (Romans 1:20-21), making judgment righteous.",
|
||||
"historical": "This prayer concluded Jesus's public ministry. The contrast between 'the world' that rejects and 'these' who believe would intensify—the world would crucify Jesus, but believers would form the church. Paul later described the gospel as revealing what was hidden from the world (Colossians 1:26).",
|
||||
"questions": [
|
||||
"How does the world's refusal to 'know' God differ from intellectual ignorance—what makes it culpable?",
|
||||
"What does it mean to 'know' God through Christ—how is this knowledge different from knowing facts about God?",
|
||||
"How should believers live as those who 'know' in a world that refuses knowledge of God?"
|
||||
]
|
||||
},
|
||||
"26": {
|
||||
"analysis": "<strong>And I have declared unto them thy name, and will declare it</strong> (καὶ ἐγνώρισα αὐτοῖς τὸ ὄνομά σου καὶ γνωρίσω, <em>kai egnōrisa autois to onoma sou kai gnōrisō</em>)—Jesus revealed God's character (ὄνομα, <em>onoma</em>, 'name' meaning nature, character, reputation) during His earthly ministry and will continue through the Spirit (John 16:13-15). γνωρίσω (<em>gnōrisō</em>, 'I will make known') is future tense—ongoing revelation. <strong>That the love wherewith thou hast loved me may be in them, and I in them</strong> (ἵνα ἡ ἀγάπη ἣν ἠγάπησάς με ἐν αὐτοῖς ᾖ κἀγὼ ἐν αὐτοῖς, <em>hina hē agapē hēn ēgapēsas me en autois ē kagō en autois</em>)—The goal: believers experience the same love (ἡ ἀγάπη, <em>hē agapē</em>) the Father has for the Son, with Christ dwelling in them (κἀγὼ ἐν αὐτοῖς, <em>kagō en autois</em>).<br><br>This concludes the High Priestly Prayer with stunning revelation: God's love for believers equals His love for Christ; Christ dwells in believers. This is mystical union—not absorption into deity but intimate communion. Christianity isn't merely forgiveness of sins but adoption into Trinitarian love. Knowing God's name means experiencing His love.",
|
||||
"historical": "After this prayer, Jesus went to Gethsemane (John 18:1). His final words before arrest concerned believers' participation in divine love—demonstrating that His mission's goal was not merely legal justification but relational transformation. The Spirit would continue Christ's revelatory work (John 14:26; 16:13).",
|
||||
"questions": [
|
||||
"How does Jesus's ongoing revelation of the Father's name through the Spirit shape Christian discipleship and growth?",
|
||||
"What does it mean that believers experience the same love the Father has for the Son—how should this transform our identity?",
|
||||
"How is Christ 'in' believers practically—what does His indwelling presence mean for daily life?"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Merge entries
|
||||
added_count = 0
|
||||
for chapter, verses in new_entries.items():
|
||||
if chapter not in commentary:
|
||||
commentary[chapter] = {}
|
||||
for verse, entry in verses.items():
|
||||
if verse not in commentary[chapter]:
|
||||
commentary[chapter][verse] = entry
|
||||
added_count += 1
|
||||
print(f"Added John {chapter}:{verse}")
|
||||
|
||||
data["commentary"] = commentary
|
||||
|
||||
with open(filepath, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, ensure_ascii=False, indent=2)
|
||||
|
||||
print(f"\nTotal John verses added (Part 2): {added_count}")
|
||||
print(f"Saved to {filepath}")
|
||||
@@ -1,149 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Add John commentary - Part 3: Chapter 19 (final 12 verses)."""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
PROJECT_ROOT = Path(__file__).parent.parent
|
||||
DATA_DIR = PROJECT_ROOT / "kjvstudy_org" / "data" / "verse_commentary"
|
||||
|
||||
filepath = DATA_DIR / "john.json"
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
commentary = data.get("commentary", {})
|
||||
|
||||
# John commentary - Part 3: Chapter 19
|
||||
new_entries = {
|
||||
"19": {
|
||||
"31": {
|
||||
"analysis": "<strong>The Jews therefore, because it was the preparation, that the bodies should not remain upon the cross on the sabbath day, (for that sabbath day was an high day,)</strong> (Οἱ οὖν Ἰουδαῖοι, ἐπεὶ παρασκευὴ ἦν, ἵνα μὴ μείνῃ ἐπὶ τοῦ σταυροῦ τὰ σώματα ἐν τῷ σαββάτῳ, ἦν γὰρ μεγάλη ἡ ἡμέρα ἐκείνου τοῦ σαββάτου, <em>Hoi oun Ioudaioi, epei paraskeuē ēn, hina mē meinē epi tou staurou ta sōmata en tō sabbatō, ēn gar megalē hē hēmera ekeinou tou sabbatou</em>)—Jewish law forbade leaving bodies on crosses overnight (Deuteronomy 21:23), especially before a Sabbath. This was ἡ παρασκευή (<em>hē paraskeuē</em>, 'the Preparation'), Friday before Sabbath. Moreover, ἦν γὰρ μεγάλη ἡ ἡμέρα (<em>ēn gar megalē hē hēmera</em>, 'it was a high day')—Passover Sabbath coinciding with weekly Sabbath. <strong>Besought Pilate that their legs might be broken, and that they might be taken away</strong>—<em>crurifragium</em> (breaking legs) hastened death by preventing victims from pushing up to breathe, causing rapid asphyxiation.<br><br>The irony is brutal: religious leaders who orchestrated Jesus's execution now concern themselves with ritual purity, wanting bodies removed before Sabbath. They strain at gnats while swallowing camels (Matthew 23:24)—meticulous about ceremonial law while murdering the Messiah. This exposes how religion without heart can coexist with horrific evil.",
|
||||
"historical": "Roman crucifixion normally left bodies to rot as deterrent, but Romans accommodated Jewish sensibilities in Judea. Archaeological evidence from first-century Jerusalem (Yehohanan ben Hagkol, discovered 1968) confirms crucifixion practices and leg-breaking. Passover Sabbath (15 Nisan) was especially sacred, making this a 'high' Sabbath.",
|
||||
"questions": [
|
||||
"How does concern for ritual purity while orchestrating murder demonstrate the danger of external religion without heart transformation?",
|
||||
"What modern forms of 'straining at gnats while swallowing camels' do religious people practice today?",
|
||||
"How should Christians guard against prioritizing religious observance over justice, mercy, and faithfulness?"
|
||||
]
|
||||
},
|
||||
"32": {
|
||||
"analysis": "<strong>Then came the soldiers, and brake the legs of the first, and of the other which was crucified with him</strong> (ἦλθον οὖν οἱ στρατιῶται καὶ τοῦ μὲν πρώτου κατέαξαν τὰ σκέλη καὶ τοῦ ἄλλου τοῦ συσταυρωθέντος αὐτῷ, <em>ēlthon oun hoi stratiōtai kai tou men prōtou kateaxan ta skelē kai tou allou tou systaurōthentos autō</em>)—The Roman soldiers systematically broke the legs (κατέαξαν τὰ σκέλη, <em>kateaxan ta skelē</em>) of both thieves crucified with Jesus. The verb κατάγνυμι (<em>katagnymi</em>) means to 'break in pieces, shatter.' This brutal act fulfilled its purpose: hastening death through respiratory failure when victims could no longer lift themselves to exhale.<br><br>These two criminals—one who repented (Luke 23:40-43), one who blasphemed (Luke 23:39)—represent humanity's response to Christ. Both witnessed His innocence, heard His prayer for His executioners, experienced His presence in suffering. One found paradise; one died in his sins. Proximity to Jesus doesn't save; faith does.",
|
||||
"historical": "Luke records the 'penitent thief' dialogue (Luke 23:39-43), showing one thief's deathbed conversion. Crucifixion victims typically survived 24-72 hours; breaking legs reduced this to minutes. The soldiers' efficiency in breaking both thieves' legs highlights the exception made for Jesus (verse 33).",
|
||||
"questions": [
|
||||
"How do the two thieves illustrate the two possible responses to Christ—rejection or repentance?",
|
||||
"What does the penitent thief's immediate salvation teach about grace, faith, and the sufficiency of Christ's sacrifice?",
|
||||
"Why is proximity to Christ or Christian environments insufficient for salvation without personal faith?"
|
||||
]
|
||||
},
|
||||
"33": {
|
||||
"analysis": "<strong>But when they came to Jesus, and saw that he was dead already, they brake not his legs</strong> (ἐπὶ δὲ τὸν Ἰησοῦν ἐλθόντες, ὡς εἶδον ἤδη αὐτὸν τεθνηκότα, οὐ κατέαξαν αὐτοῦ τὰ σκέλη, <em>epi de ton Iēsoun elthontes, hōs eidon ēdē auton tethnēkota, ou kateaxan autou ta skelē</em>)—The soldiers' observation (εἶδον, <em>eidon</em>, 'they saw') that Jesus was τεθνηκότα (<em>tethnēkota</em>, 'already dead') prevented them from breaking His legs. This was unexpected; crucifixion victims rarely died within six hours (Jesus was crucified at 9am and died at 3pm, Mark 15:25, 34). His rapid death may have resulted from the physical trauma of scourging, emotional agony in Gethsemane (Luke 22:44), and voluntarily yielding His spirit (John 19:30).<br><br>Providence guided this seemingly random military decision. The soldiers had no theological knowledge, yet their pragmatic choice fulfilled prophecy (Exodus 12:46; Numbers 9:12; Psalm 34:20)—the Paschal Lamb's bones remained unbroken. God sovereignly orchestrates even minute details to accomplish His redemptive purposes.",
|
||||
"historical": "Roman soldiers were experienced executioners who could determine death reliably. Jesus's unusually rapid death surprised even Pilate (Mark 15:44). Medical theories suggest cardiac rupture, hemopericardium, or hypovolemic shock from scourging and crucifixion. Regardless of physiological mechanism, Jesus voluntarily dismissed His spirit (John 10:18).",
|
||||
"questions": [
|
||||
"How does Jesus's rapid, voluntary death demonstrate His sovereign control even during crucifixion?",
|
||||
"What does the fulfillment of detailed prophecy about unbroken bones teach about Scripture's inspiration and God's sovereign control?",
|
||||
"How should believers trust God's providence when circumstances seem random or meaningless?"
|
||||
]
|
||||
},
|
||||
"34": {
|
||||
"analysis": "<strong>But one of the soldiers with a spear pierced his side, and forthwith came there out blood and water</strong> (ἀλλ' εἷς τῶν στρατιωτῶν λόγχῃ αὐτοῦ τὴν πλευρὰν ἔνυξεν, καὶ ἐξῆλθεν εὐθὺς αἷμα καὶ ὕδωρ, <em>all' heis tōn stratiōtōn lonchē autou tēn pleuran enyxen, kai exēlthen euthys haima kai hydōr</em>)—To confirm death, a soldier thrust a λόγχη (<em>lonchē</em>, 'lance, spear') into Jesus's πλευράν (<em>pleuran</em>, 'side'), producing αἷμα καὶ ὕδωρ (<em>haima kai hydōr</em>, 'blood and water'). Medical explanations include: pericardial effusion, pleural effusion, or separated blood clot and serum. John emphasizes εὐθὺς (<em>euthys</em>, 'immediately'), stressing the eyewitness detail.<br><br>Theologically, blood and water symbolize atonement and cleansing. 1 John 5:6 references this: 'This is he that came by water and blood, even Jesus Christ.' The water may symbolize the Spirit (John 7:38-39), baptism, or sanctification. The blood represents the new covenant (Matthew 26:28). Together they encompass full salvation: justification (blood) and sanctification (water).",
|
||||
"historical": "Roman spears typically penetrated 5-6 inches. Striking the right side would pierce the right atrium or ventricle, releasing blood; the pericardial sac would release serous fluid. John's precise medical observation has led many physicians throughout history to faith, recognizing authentic eyewitness detail rather than legendary embellishment.",
|
||||
"questions": [
|
||||
"How does the medical detail of 'blood and water' validate the Gospel's historical reliability as eyewitness testimony?",
|
||||
"What theological significance do blood and water carry—how do they represent full salvation?",
|
||||
"How should the physical reality of Christ's death and suffering shape our understanding of atonement?"
|
||||
]
|
||||
},
|
||||
"35": {
|
||||
"analysis": "<strong>And he that saw it bare record, and his record is true: and he knoweth that he saith true, that ye might believe</strong> (καὶ ὁ ἑωρακὼς μεμαρτύρηκεν, καὶ ἀληθινὴ αὐτοῦ ἐστιν ἡ μαρτυρία, καὶ ἐκεῖνος οἶδεν ὅτι ἀληθῆ λέγει, ἵνα καὶ ὑμεῖς πιστεύσητε, <em>kai ho heōrakōs memartyrēken, kai alēthinē autou estin hē martyria, kai ekeinos oiden hoti alēthē legei, hina kai hymeis pisteusēte</em>)—John solemnly testifies to eyewitness observation. ὁ ἑωρακώς (<em>ho heōrakōs</em>, 'the one who saw') is emphatic. μεμαρτύρηκεν (<em>memartyrēken</em>, 'has testified') is perfect tense—past action with continuing results. His testimony is ἀληθινὴ (<em>alēthinē</em>, 'true, genuine, reliable'). The purpose clause ἵνα...πιστεύσητε (<em>hina...pisteusēte</em>, 'in order that you might believe') reveals John's evangelical intent—recording historical facts to produce faith.<br><br>This verse establishes the evidential basis of Christian faith. John doesn't ask readers to believe myths or legends but documented historical events witnessed by credible observers. Faith rests on facts, not blind credulity. The Apostle's integrity—willingness to die for testimony he knew to be either true or false—validates his credibility.",
|
||||
"historical": "John likely wrote his Gospel around 85-95 AD, as the last surviving apostle. His emphatic eyewitness claim counters emerging gnostic denials of Christ's physical incarnation and death. Church tradition records John's martyrdom under Domitian, demonstrating his willingness to die for testimony he could have recanted if false.",
|
||||
"questions": [
|
||||
"How does John's emphatic eyewitness testimony provide a foundation for faith distinct from blind belief or subjective experience?",
|
||||
"What makes the apostles' willingness to die for their testimony particularly significant for Christian apologetics?",
|
||||
"How should believers today communicate that Christian faith rests on historical events, not mythology or wishful thinking?"
|
||||
]
|
||||
},
|
||||
"36": {
|
||||
"analysis": "<strong>For these things were done, that the scripture should be fulfilled, A bone of him shall not be broken</strong> (ἐγένετο γὰρ ταῦτα ἵνα ἡ γραφὴ πληρωθῇ· Ὀστοῦν οὐ συντριβήσεται αὐτοῦ, <em>egeneto gar tauta hina hē graphē plērōthē· Ostoun ou syntribēsetai autou</em>)—John identifies prophecy fulfillment. The phrase ἵνα ἡ γραφὴ πληρωθῇ (<em>hina hē graphē plērōthē</em>, 'that the Scripture might be fulfilled') indicates divine design, not coincidence. <strong>A bone of him shall not be broken</strong> (Ὀστοῦν οὐ συντριβήσεται, <em>Ostoun ou syntribēsetai</em>) quotes Exodus 12:46 and Psalm 34:20. The Passover lamb regulations required bones remain intact; David's psalm about God's protection found ultimate fulfillment in Christ.<br><br>This typological fulfillment demonstrates Scripture's unity and divine inspiration. The Passover lamb pointed forward to Christ (1 Corinthians 5:7); what seemed mere ritual detail revealed Messianic prophecy. Jesus is the true Passover Lamb whose sacrifice delivers from death's angel, whose blood marks God's people for salvation.",
|
||||
"historical": "Passover lambs were slaughtered on 14 Nisan (Exodus 12:6), eaten without broken bones. Jesus died as the Passover lambs were being sacrificed in the temple—the ultimate Lamb replacing all others. The coincidence of timing, prophecy, and fulfillment demonstrates divine orchestration spanning 1500 years from Moses to Christ.",
|
||||
"questions": [
|
||||
"How does typological fulfillment—Passover lamb to Christ—demonstrate the Bible's divine inspiration and unity?",
|
||||
"What does it mean that Jesus is our Passover Lamb—how does His sacrifice parallel and fulfill Exodus 12?",
|
||||
"How should Christians read Old Testament Law and ritual in light of Christ's fulfillment?"
|
||||
]
|
||||
},
|
||||
"37": {
|
||||
"analysis": "<strong>And again another scripture saith, They shall look on him whom they pierced</strong> (καὶ πάλιν ἑτέρα γραφὴ λέγει· Ὄψονται εἰς ὃν ἐξεκέντησαν, <em>kai palin hetera graphē legei· Opsontai eis hon exekentēsan</em>)—John cites Zechariah 12:10. The verb ὄψονται (<em>opsontai</em>, 'they shall look, gaze upon') combined with ἐξεκέντησαν (<em>exekentēsan</em>, 'they pierced') describes the spear thrust (19:34) but points beyond to eschatological fulfillment. Zechariah's prophecy has dual fulfillment: historical (the crucifixion) and future (Christ's second coming when all will see the One they pierced, Revelation 1:7).<br><br>This prophecy carries both judgment and grace. Those who 'pierced' Him—representing all sinners whose sins nailed Him there—will 'look upon' Him either in saving faith or condemning judgment. The same wounded Christ is both Savior and Judge. Zechariah 12:10 continues: 'they shall mourn for him'—mourning in repentance (Second Coming) or mourning in terror (final judgment).",
|
||||
"historical": "Zechariah prophesied around 520-518 BC, 550 years before crucifixion was even invented by Phoenicians and adopted by Romans. The specific detail of 'piercing' (דָּקַר, <em>daqar</em> in Hebrew; ἐκκεντέω, <em>ekkenteo</em> in Greek) rather than generic 'killing' demonstrates prophetic precision only explicable by divine inspiration.",
|
||||
"questions": [
|
||||
"How does Zechariah's 'piercing' prophecy demonstrate supernatural foreknowledge of crucifixion method 550 years before its invention?",
|
||||
"What does it mean that all will 'look upon' the One they pierced—how does this apply both at conversion and final judgment?",
|
||||
"How should recognition that our sins 'pierced' Christ shape our understanding of personal accountability for His death?"
|
||||
]
|
||||
},
|
||||
"38": {
|
||||
"analysis": "<strong>And after this Joseph of Arimathaea, being a disciple of Jesus, but secretly for fear of the Jews, besought Pilate that he might take away the body of Jesus: and Pilate gave him leave</strong> (Μετὰ δὲ ταῦτα ἠρώτησεν τὸν Πιλᾶτον Ἰωσὴφ ὁ ἀπὸ Ἁριμαθαίας, ὢν μαθητὴς τοῦ Ἰησοῦ κεκρυμμένος δὲ διὰ τὸν φόβον τῶν Ἰουδαίων, ἵνα ἄρῃ τὸ σῶμα τοῦ Ἰησοῦ· καὶ ἐπέτρεψεν ὁ Πιλᾶτος, <em>Meta de tauta ērōtēsen ton Pilaton Iōsēph ho apo Harimathaias, ōn mathētēs tou Iēsou kekrymmenos de dia ton phobon tōn Ioudaiōn, hina arē to sōma tou Iēsou· kai epetrepsen ho Pilatos</em>)—Joseph was μαθητὴς...κεκρυμμένος (<em>mathētēs...kekrymmenos</em>, 'a disciple...hidden') διὰ τὸν φόβον τῶν Ἰουδαίων (<em>dia ton phobon tōn Ioudaiōn</em>, 'because of the fear of the Jews'). Yet crisis prompted courage: he openly requested Jesus's body. <strong>He came therefore, and took the body of Jesus</strong>—Joseph's public action 'outed' him as Jesus's follower, risking his Sanhedrin position (Mark 15:43 identifies him as 'an honourable counsellor').<br><br>Fear had kept Joseph secret, but Jesus's death catalyzed courageous faith. Sometimes God allows crisis to move secret disciples to public confession. Joseph's costly obedience—risking reputation, position, ritual defilement—demonstrates transformative faith. His unused tomb (Matthew 27:60) fulfilled Isaiah 53:9: 'with the rich in his death.'",
|
||||
"historical": "Arimathea was likely Ramathaim-zophim, Samuel's birthplace (1 Samuel 1:1), about 20 miles northwest of Jerusalem. As a wealthy Sanhedrin member (Luke 23:50), Joseph had resources and influence to request the body and provide burial. Roman law typically allowed families to claim crucifixion victims' bodies; Pilate's permission shows respect for Joseph's status.",
|
||||
"questions": [
|
||||
"How does Joseph's transformation from 'secret disciple' to public confessor demonstrate that crisis can strengthen rather than destroy faith?",
|
||||
"What modern forms of 'secret discipleship' do Christians practice to avoid social or professional cost?",
|
||||
"How did providing an honorable burial for Jesus demonstrate both love for Christ and courage to associate with a condemned criminal?"
|
||||
]
|
||||
},
|
||||
"39": {
|
||||
"analysis": "<strong>And there came also Nicodemus, which at the first came to Jesus by night, and brought a mixture of myrrh and aloes, about an hundred pound weight</strong> (ἦλθεν δὲ καὶ Νικόδημος, ὁ ἐλθὼν πρὸς αὐτὸν νυκτὸς τὸ πρῶτον, φέρων μίγμα σμύρνης καὶ ἀλόης ὡς λίτρας ἑκατόν, <em>ēlthen de kai Nikodēmos, ho elthōn pros auton nyktos to prōton, pherōn migma smyrnēs kai aloēs hōs litras hekaton</em>)—Nicodemus, introduced in John 3 as the nighttime visitor, now comes publicly with extravagant burial spices: σμύρνης καὶ ἀλόης (<em>smyrnēs kai aloēs</em>, 'myrrh and aloes') weighing ὡς λίτρας ἑκατόν (<em>hōs litras hekaton</em>, 'about 100 pounds/75 lbs modern weight'). This enormous quantity—appropriate for kings (2 Chronicles 16:14)—demonstrates both wealth and devotion.<br><br>Nicodemus's progression tracks spiritual growth: first, fearful nighttime inquiry (John 3:1-21); second, tepid defense of Jesus (John 7:50-51); finally, public identification with the crucified Christ. The 'hundred pounds' of spices is lavish—far exceeding normal burial practices. This act of worship echoes Mary's anointing (John 12:3): when you love Jesus, no gift is excessive. Both Joseph and Nicodemus gave treasures to honor the One religious leaders dishonored.",
|
||||
"historical": "Roman custom was cremation; Jewish custom required quick burial with spices to offset decomposition in warm climate. Nicodemus's quantity suggested expectation of extended burial. Myrrh and aloes were aromatic resins mixed and applied between linen wrappings. The expense indicated royal burial—ironically for the 'King of the Jews' mocked hours earlier.",
|
||||
"questions": [
|
||||
"How does Nicodemus's spiritual journey from secret seeker to public confessor encourage gradual growth in faith?",
|
||||
"What does the extravagant quantity of burial spices teach about appropriate worship—is anything 'too much' for Jesus?",
|
||||
"How do Joseph and Nicodemus's actions demonstrate that true faith eventually requires public identification with Christ regardless of cost?"
|
||||
]
|
||||
},
|
||||
"40": {
|
||||
"analysis": "<strong>Then took they the body of Jesus, and wound it in linen clothes with the spices, as the manner of the Jews is to bury</strong> (ἔλαβον οὖν τὸ σῶμα τοῦ Ἰησοῦ καὶ ἔδησαν αὐτὸ ὀθονίοις μετὰ τῶν ἀρωμάτων, καθὼς ἔθος ἐστὶν τοῖς Ἰουδαίοις ἐνταφιάζειν, <em>elabon oun to sōma tou Iēsou kai edēsan auto othoniois meta tōn arōmatōn, kathōs ethos estin tois Ioudaiois entaphiazein</em>)—They wrapped Jesus's body in ὀθόνια (<em>othonia</em>, 'linen strips/cloths') μετὰ τῶν ἀρωμάτων (<em>meta tōn arōmatōn</em>, 'with the spices'), following Jewish burial customs. The verb ἔδησαν (<em>edēsan</em>, 'bound, wrapped') indicates tight binding. This detail becomes significant in resurrection accounts: the grave clothes remained intact yet empty (John 20:6-7), indicating Jesus passed through them rather than unwrapping.<br><br>This proper burial fulfilled prophecy (Isaiah 53:9) and validated Jesus's true death against later claims He merely swooned. The care taken by Joseph and Nicodemus—wealthy men risking defilement before Passover—demonstrates costly love. Their 'burial rites' prepared the tomb Jesus would vacate three days later, making the resurrection undeniable: sealed tomb, wrapped body, Roman guard, yet empty grave.",
|
||||
"historical": "Jewish burial required washing the body, anointing with spices, and wrapping in linen strips—process taking several hours. They had to complete this before 6pm when Sabbath began. The haste partly explains the women's intention to return Sunday with additional spices (Mark 16:1), though they found the tomb empty.",
|
||||
"questions": [
|
||||
"How does the detailed burial account validate Jesus's real death against swoon theories?",
|
||||
"What does the care and expense of Jesus's burial by Joseph and Nicodemus teach about properly honoring Christ?",
|
||||
"How do the burial details—wrapped body in sealed tomb—make the resurrection evidence more compelling?"
|
||||
]
|
||||
},
|
||||
"41": {
|
||||
"analysis": "<strong>Now in the place where he was crucified there was a garden; and in the garden a new sepulchre, wherein was never man yet laid</strong> (ἦν δὲ ἐν τῷ τόπῳ ὅπου ἐσταυρώθη κῆπος, καὶ ἐν τῷ κήπῳ μνημεῖον καινὸν ἐν ᾧ οὐδέπω οὐδεὶς ἦν τεθειμένος, <em>ēn de en tō topō hopou estaurōthē kēpos, kai en tō kēpō mnēmeion kainon en hō oudepō oudeis ēn tetheimenos</em>)—Crucifixion occurred at Golgotha (John 19:17); nearby was a κῆπος (<em>kēpos</em>, 'garden') containing Joseph's μνημεῖον καινόν (<em>mnēmeion kainon</em>, 'new tomb'). The phrase οὐδέπω οὐδεὶς ἦν τεθειμένος (<em>oudepō oudeis ēn tetheimenos</em>, 'no one yet had been laid') emphasizes the tomb's unused state—prepared by Joseph but virgin until Jesus's burial.<br><br>The 'garden' evokes Eden where sin entered (Genesis 3); now in a garden, redemption is accomplished. The unused tomb fulfills typology: like the unblemished sacrifice, Jesus rested in a 'new' tomb undefiled by prior death. This also eliminates claims others' bones were later confused with Jesus's—no one else was ever buried there.",
|
||||
"historical": "Garden tombs near Jerusalem were owned by wealthy families—carved from rock, sealed with rolling stones. Joseph owned this tomb (Matthew 27:60), intending it for his own burial. Providing it for Jesus was costly—he'd need another tomb. Archaeological site Church of the Holy Sepulchre preserves ancient tradition locating both Golgotha and garden tomb.",
|
||||
"questions": [
|
||||
"How does the 'garden' setting connect Jesus's death and resurrection to both Creation (Eden) and new creation themes?",
|
||||
"What's the theological significance of Jesus being buried in a new, unused tomb?",
|
||||
"How does Joseph's sacrifice of his personal tomb illustrate costly discipleship—giving Jesus what was most precious?"
|
||||
]
|
||||
},
|
||||
"42": {
|
||||
"analysis": "<strong>There laid they Jesus therefore because of the Jews' preparation day; for the sepulchre was nigh at hand</strong> (ἐκεῖ οὖν διὰ τὴν παρασκευὴν τῶν Ἰουδαίων, ὅτι ἐγγὺς ἦν τὸ μνημεῖον, ἔθηκαν τὸν Ἰησοῦν, <em>ekei oun dia tēn paraskeuēn tōn Ioudaiōn, hoti engys ēn to mnēmeion, ethēkan ton Iēsoun</em>)—Time pressure (παρασκευή, <em>paraskeuē</em>, 'Preparation day'—Friday before Sabbath) and proximity (ἐγγὺς ἦν, <em>engys ēn</em>, 'was near') determined the burial location. They had perhaps two hours before 6pm Sabbath. The verb ἔθηκαν (<em>ethēkan</em>, 'they placed, laid') suggests reverent positioning of Jesus's body in the tomb.<br><br>Divine providence arranged every detail: Joseph's unused tomb happened to be near Golgotha; the timing forced hasty but complete burial; witnesses observed the location (Luke 23:55). These 'coincidences' ensured irrefutable resurrection evidence—known tomb, verified death, sealed entrance, yet empty three days later. Nothing was left to chance; God orchestrated circumstances to maximize evidential clarity for the most important event in history.",
|
||||
"historical": "Jewish law required burial same day as death (Deuteronomy 21:23). Sabbath began at sundown Friday. This time constraint meant Joseph and Nicodemus worked quickly but thoroughly. The women observed burial location to return Sunday (Mark 16:1), providing multiple witnesses who could testify the same tomb later found empty was where Jesus was buried.",
|
||||
"questions": [
|
||||
"How does God's providence in small details—tomb location, timing, witnesses—strengthen resurrection evidence?",
|
||||
"What does the haste required by Sabbath law teach about how God uses even legal restrictions to accomplish His purposes?",
|
||||
"How should believers trust that God orchestrates even seemingly minor details to accomplish His sovereign will?"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Merge entries
|
||||
added_count = 0
|
||||
for chapter, verses in new_entries.items():
|
||||
if chapter not in commentary:
|
||||
commentary[chapter] = {}
|
||||
for verse, entry in verses.items():
|
||||
if verse not in commentary[chapter]:
|
||||
commentary[chapter][verse] = entry
|
||||
added_count += 1
|
||||
print(f"Added John {chapter}:{verse}")
|
||||
|
||||
data["commentary"] = commentary
|
||||
|
||||
with open(filepath, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, ensure_ascii=False, indent=2)
|
||||
|
||||
print(f"\nTotal John verses added (Part 3): {added_count}")
|
||||
print(f"Saved to {filepath}")
|
||||
print(f"\n=== ALL JOHN COMMENTARY COMPLETE ===")
|
||||
print(f"Total: 13 + 11 + {added_count} = 36 verses")
|
||||
@@ -1,153 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Add commentary for Psalm 139 verses on divine omniscience and omnipresence.
|
||||
Safely merges with existing psalms.json file.
|
||||
"""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
# New commentary to add
|
||||
NEW_COMMENTARY = {
|
||||
"1": {
|
||||
"analysis": "<strong>O LORD, thou hast searched me, and known me</strong>—The verb <em>chaqar</em> (חָקַר, 'searched') means to probe deeply, to examine thoroughly, like a miner excavating precious ore. This is no surface-level glance but divine investigation to the core of being. The parallel verb <em>yada</em> (יָדַע, 'known') signifies intimate, experiential knowledge—the same word used of marital union (Genesis 4:1). God doesn't merely know <em>about</em> us; He knows us with perfect, exhaustive intimacy.<br><br>David opens this psalm acknowledging that divine omniscience precedes human self-knowledge. Before we examine ourselves, we have already been examined by the One who formed us. This foundational truth grounds all authentic spirituality: we worship a God who knows us completely and loves us anyway.",
|
||||
"historical": "Composed by David, likely during his reign (c. 1010-970 BC). As Israel's shepherd-king, David understood both the comfort and weight of being known by God. This psalm reflects mature theological reflection on God's attributes, possibly written during a time of introspection or after experiencing God's protective providence.",
|
||||
"questions": [
|
||||
"What aspects of your life do you try to hide from God's searching gaze, even though He already knows them completely?",
|
||||
"How does knowing that God's knowledge of you is intimate (<em>yada</em>) rather than merely intellectual change your relationship with Him?",
|
||||
"In what ways does God's exhaustive knowledge of you bring comfort rather than fear?"
|
||||
]
|
||||
},
|
||||
"2": {
|
||||
"analysis": "<strong>Thou knowest my downsitting and mine uprising, thou understandest my thought afar off</strong>—God's omniscience extends to the mundane rhythm of daily life: sitting down and standing up, the bookends of every human activity. The Hebrew <em>binah</em> (בִּינָה, 'understandest') suggests discernment of what lies beneath the surface. God perceives our thoughts while they're still 'afar off'—before they fully form, while still inchoate desires and half-formed intentions.<br><br>No moment is too trivial for divine attention, no thought too fleeting to escape God's notice. This verse demolishes the false dichotomy between 'sacred' and 'secular'—all of life unfolds under the watchful eye of Him who numbers our hairs (Matthew 10:30). The God who governs galaxies attends to whether you sit or stand.",
|
||||
"historical": "Ancient Near Eastern religions often portrayed gods as distant, capricious beings requiring elaborate rituals to gain their attention. David's portrayal of YHWH as intimately aware of mundane human actions was radically counter-cultural, emphasizing the covenant God's personal involvement with His people.",
|
||||
"questions": [
|
||||
"How would your daily routine change if you lived consciously aware that God knows your every sitting and rising?",
|
||||
"What 'afar off' thoughts—barely-formed desires or intentions—might God be discerning in you right now?",
|
||||
"Do you compartmentalize your life into 'spiritual' and 'ordinary' moments, forgetting that all moments are known to God?"
|
||||
]
|
||||
},
|
||||
"3": {
|
||||
"analysis": "<strong>Thou compassest my path and my lying down, and art acquainted with all my ways</strong>—The verb <em>zarah</em> (זָרָה, 'compassest') means to winnow or sift grain, examining every kernel. God sifts our path (journey, course of life) and our lying down (rest, private life). The phrase <em>art acquainted</em> comes from <em>sakan</em> (סָכַן), meaning to be familiar through careful observation, like a neighbor who knows your habits.<br><br>God's knowledge isn't abstract but detailed and specific. He knows not just that we travel but every step of the journey; not just that we rest but the quality of our sleep and the thoughts that keep us awake. Every way (<em>derek</em>, דֶּרֶךְ)—our habits, choices, patterns of behavior—stands open before Him. This is total transparency before absolute holiness.",
|
||||
"historical": "In David's era, paths were dangerous—bandits, wild animals, harsh terrain. The imagery of God 'compassing' or encircling one's path evoked both protection and examination. Similarly, lying down in ancient tents offered little privacy. David uses these realities to illustrate that nothing in human life escapes divine awareness.",
|
||||
"questions": [
|
||||
"If God is 'winnowing' your path, what chaff (worthless pursuits or sins) might He be separating from the wheat?",
|
||||
"What do you do in private ('lying down') that you wouldn't do if you were fully conscious of God's presence?",
|
||||
"How familiar (<em>sakan</em>) is God with your habitual 'ways'—and what do those patterns reveal about your heart?"
|
||||
]
|
||||
},
|
||||
"4": {
|
||||
"analysis": "<strong>For there is not a word in my tongue, but, lo, O LORD, thou knowest it altogether</strong>—God's omniscience anticipates even our speech. Before a word exists <em>in</em> (בְּ) the tongue—before articulation, while still mere intention—the LORD knows it <em>altogether</em> (<em>kulloh</em>, כֻּלֹּה, 'completely, entirely'). Jesus echoed this truth: we will give account for every idle word (Matthew 12:36).<br><br>This verse exposes the futility of verbal pretense. We craft our words to manage others' perceptions, but we cannot edit our speech before God, who hears both what we say and what we meant to say, both our words and the heart-motives beneath them. Every prayer, promise, boast, and lie stands naked before Him who <em>knows it altogether</em>.",
|
||||
"historical": "In ancient Israel, words carried tremendous weight—blessings and curses were considered effectual, oaths binding, vows sacred. David's acknowledgment that God knows words before they're spoken underscores divine foreknowledge and the moral accountability of speech, central to Hebrew wisdom literature (Proverbs 18:21).",
|
||||
"questions": [
|
||||
"What words do you shape carefully for others' ears but cannot hide from God who knows them 'altogether'?",
|
||||
"How would your speech change if you remembered that God hears your words before your tongue forms them?",
|
||||
"Are there prayers you've prayed with your lips while your heart said something different—and what does God know 'altogether' about that disconnect?"
|
||||
]
|
||||
},
|
||||
"5": {
|
||||
"analysis": "<strong>Thou hast beset me behind and before, and laid thine hand upon me</strong>—The verb <em>tzur</em> (צוּר, 'beset') means to bind, confine, or enclose—like a city under siege. God surrounds David from all temporal directions: behind (past) and before (future). This is not hostile encirclement but protective encompassing. The laying on of God's hand (<em>kaph</em>, כַּף) suggests both authority and blessing, like a hand placed on one's head in commissioning.<br><br>David cannot escape into past regrets or future anxieties; God occupies every temporal space. This divine 'besetting' means we cannot outrun our history or our destiny—both are held in God's hand. The very hand that constrains us also guides, protects, and blesses.",
|
||||
"historical": "The imagery of being 'beset' would resonate deeply with David, who experienced literal siege warfare and also God's protective encirclement during his fugitive years fleeing Saul. This military metaphor transforms into a theological truth: God's sovereignty surrounds us completely.",
|
||||
"questions": [
|
||||
"What 'behind' (past failures or sins) or 'before' (future fears) are you trying to escape from, forgetting that God has already 'beset' those times with His presence?",
|
||||
"How does it feel to be 'confined' by God—is it oppressive restriction or liberating security?",
|
||||
"Where in your life do you need to feel God's hand laid upon you—for guidance, for healing, for commissioning?"
|
||||
]
|
||||
},
|
||||
"6": {
|
||||
"analysis": "<strong>Such knowledge is too wonderful for me; it is high, I cannot attain unto it</strong>—The adjective <em>pele</em> (פֶּלֶא, 'wonderful') denotes what is extraordinary, surpassing, miraculous—used of God's mighty works (Exodus 15:11). Divine omniscience isn't just comprehensive but <em>qualitatively different</em> from human knowledge. It is <em>high</em> (<em>sagab</em>, שָׂגַב)—exalted, inaccessible, beyond reach. David doesn't mean he cannot comprehend God's knowledge intellectually (though that's true); he means he cannot <em>attain</em> it experientially or possess it.<br><br>This is the proper posture before mystery: wonder rather than mastery. The finite cannot contain the infinite. God's knowledge humbles us not to despair but to worship. We don't need to know everything God knows; we need to trust the One who does.",
|
||||
"historical": "Ancient wisdom literature frequently acknowledged the limits of human understanding compared to divine wisdom (Job 28:12-28; Proverbs 25:2). David, despite being a king with considerable power and knowledge, here models intellectual humility before the incomprehensible God—a corrective to human pride.",
|
||||
"questions": [
|
||||
"What aspects of God's knowledge do you struggle to accept because you cannot 'attain' them or understand them fully?",
|
||||
"How does acknowledging that God's knowledge is 'too wonderful' for you change your posture from trying to figure everything out to trusting Him?",
|
||||
"Are there mysteries in your life that God knows completely while you only see in part—and can you rest in His higher knowledge?"
|
||||
]
|
||||
},
|
||||
"8": {
|
||||
"analysis": "<strong>If I ascend up into heaven, thou art there: if I make my bed in hell, behold, thou art there</strong>—David explores God's omnipresence through cosmic extremes. <em>Heaven</em> (<em>shamayim</em>, שָׁמַיִם) represents the highest heights, God's dwelling place. <em>Hell</em> (<em>sheol</em>, שְׁאוֹל) is the grave, the realm of the dead, the lowest depths. The emphatic <em>thou art there</em> (<em>sham attah</em>, שָׁם אַתָּה) brackets both locations—God's presence is not limited by spatial or spiritual boundaries.<br><br>Sheol was understood as shadowy separation from God's active presence (Psalm 88:5), yet even there, God <em>is</em>. This anticipates the Christian truth that Christ descended to the dead (1 Peter 3:19). There is literally nowhere—no height of blessing, no depth of despair—outside God's presence.",
|
||||
"historical": "Ancient cosmology conceived heaven above and sheol below, with earth between. David uses this three-tiered worldview to express God's universal presence. Notably, sheol wasn't hell in the later Christian sense but the shadowy underworld where all the dead went—making God's presence there even more remarkable.",
|
||||
"questions": [
|
||||
"What 'heavenly' highs or 'sheol' lows have you experienced where you felt God's presence was absent—and how does this verse challenge that perception?",
|
||||
"How does knowing that God is present even in sheol (death, darkness, separation) change how you face your deepest fears?",
|
||||
"Are you trying to ascend to some spiritual height to meet God, forgetting that He is already wherever you are?"
|
||||
]
|
||||
},
|
||||
"9": {
|
||||
"analysis": "<strong>If I take the wings of the morning, and dwell in the uttermost parts of the sea</strong>—<em>Wings of the morning</em> (<em>kanfei-shachar</em>, כַּנְפֵי־שָׁחַר) evokes the swift, eastward-spreading dawn light—the fastest natural phenomenon known to the ancient world. To ride dawn's light from east to the furthest west (<em>uttermost parts of the sea</em> = westernmost Mediterranean) represents maximum speed and distance. David imagines impossible escape velocity.<br><br>Even if we could travel at the speed of light itself, racing the dawn across the planet, we couldn't outrun God. This isn't threatening pursuit but reassuring presence. Jonah tried fleeing west by sea (Jonah 1:3); he discovered the truth of this verse. Geography cannot distance us from God.",
|
||||
"historical": "For ancient Israelites landlocked in Judea, the sea (especially the westward Mediterranean) represented the edge of the known world—mysterious, dangerous, and distant. Dawn's eastward light racing to the western sea encompasses the entire known world, from boundary to boundary.",
|
||||
"questions": [
|
||||
"What are you running from—and how fast—believing you can outpace God's presence in your life?",
|
||||
"Like Jonah fleeing to the 'uttermost parts of the sea,' have you tried geographical escape from God's calling or conviction?",
|
||||
"How does the speed of 'morning's wings' illustrate that no matter how fast you run toward or away from something, God is already there?"
|
||||
]
|
||||
},
|
||||
"10": {
|
||||
"analysis": "<strong>Even there shall thy hand lead me, and thy right hand shall hold me</strong>—The conditional clauses of verses 8-9 ('if I...') resolve in this assurance: <em>even there</em> (גַּם־שָׁם, <em>gam-sham</em>). Wherever 'there' is—heights, depths, east, west—God's hand performs a dual function: <em>lead</em> (<em>nachah</em>, נָחָה, to guide) and <em>hold</em> (<em>achaz</em>, אָחַז, to grasp firmly). The right hand signifies power and favor.<br><br>God's omnipresence isn't neutral surveillance but active guidance and protective grasp. We cannot flee beyond His reach, but why would we want to? His hand leads through unfamiliar territory and holds us secure in dangerous places. The same hand that created galaxies holds you steady.",
|
||||
"historical": "The right hand in Hebrew culture symbolized strength, authority, and covenant faithfulness. God's right hand delivered Israel from Egypt (Exodus 15:6), sustained them in wilderness, and seated the Messiah in power (Psalm 110:1). David draws on this rich tradition.",
|
||||
"questions": [
|
||||
"Where has God's hand led you that you didn't want to go—and in hindsight, how did that guidance prove faithful?",
|
||||
"What situation requires you to trust that God's right hand is holding you, even though you cannot see or feel it?",
|
||||
"How does knowing God will 'lead' and 'hold' you anywhere change your willingness to go where He sends?"
|
||||
]
|
||||
},
|
||||
"11": {
|
||||
"analysis": "<strong>If I say, Surely the darkness shall cover me; even the night shall be light about me</strong>—David explores a third hypothetical escape: concealment in darkness (<em>choshek</em>, חֹשֶׁךְ). <em>Cover me</em> (<em>shuf</em>, שׁוּף) means to overwhelm or crush—darkness as refuge from exposure. But the conditional sentence breaks mid-verse (completed in v. 12): what we expect to be dark becomes light.<br><br>This anticipates both moral and literal truths. Morally: secret sins performed 'under cover of darkness' stand revealed to God (Ephesians 5:11-13). Literally: night doesn't diminish God's vision. We hide in darkness hoping for invisibility, but God dwells in unapproachable light (1 Timothy 6:16) and sees perfectly in absolute darkness.",
|
||||
"historical": "In pre-electric ancient world, darkness was total—no streetlights, no ambient glow. Night brought genuine concealment, making it prime time for crime and immorality. David's assertion that even night becomes light to God would have sounded radical, challenging assumptions about darkness as hiding place.",
|
||||
"questions": [
|
||||
"What do you do under 'cover of darkness'—literal night or metaphorical secrecy—that you wouldn't do in broad daylight before witnesses?",
|
||||
"How does knowing that darkness and light are alike to God affect your willingness to confess hidden sins?",
|
||||
"What darkness in your life—depression, ignorance, sin—needs to become 'light about you' through God's illuminating presence?"
|
||||
]
|
||||
},
|
||||
"12": {
|
||||
"analysis": "<strong>Yea, the darkness hideth not from thee; but the night shineth as the day: the darkness and the light are both alike to thee</strong>—The emphatic <em>yea</em> (גַּם, <em>gam</em>) concludes the thought from v. 11. <em>Hideth not</em> (<em>lo-yachshik</em>, לֹא־יַחְשִׁיךְ)—darkness cannot darken things from God. Night <em>shines</em> (<em>ya'ir</em>, יָאִיר) as day—to divine perception, no difference exists. The final phrase <em>darkness and light are both alike</em> (<em>ka-choshekah ka-orah</em>, כַּחֲשֵׁיכָה כָאוֹרָה) uses <em>ka</em> (כַּ, 'as, like') twice—equal, equivalent, identical to God.<br><br>This obliterates our categories of concealment. God doesn't have night vision; He has perfect vision unaffected by ambient light levels. To Him who is light (1 John 1:5), all things are equally visible. This truth simultaneously comforts (God sees our affliction even in deepest darkness) and convicts (God sees our sin even in deepest secrecy).",
|
||||
"historical": "Light and darkness were primal categories in Hebrew thought—creation began with God separating light from darkness (Genesis 1:4). Yet the Creator transcends His creation; the distinction that organizes our reality doesn't limit His perception. This verse presents God as utterly beyond creaturely limitations.",
|
||||
"questions": [
|
||||
"Since darkness and light are alike to God, what does this reveal about the futility of trying to hide anything from Him?",
|
||||
"How does this truth comfort you when walking through your 'darkest valley' (Psalm 23:4)—that God sees perfectly even there?",
|
||||
"What would change if you lived every moment—public daylight and private nighttime—with equal consciousness that all is equally visible to God?"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
def main():
|
||||
json_path = Path("kjvstudy_org/data/verse_commentary/psalms.json")
|
||||
|
||||
# Read existing file
|
||||
print("Reading existing psalms.json...")
|
||||
with open(json_path, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
# Ensure structure exists
|
||||
if 'commentary' not in data:
|
||||
data['commentary'] = {}
|
||||
if '139' not in data['commentary']:
|
||||
data['commentary']['139'] = {}
|
||||
|
||||
# Check what we're adding
|
||||
existing_verses = set(data['commentary']['139'].keys())
|
||||
new_verses = set(NEW_COMMENTARY.keys())
|
||||
overlap = existing_verses & new_verses
|
||||
|
||||
if overlap:
|
||||
print(f"WARNING: These verses already exist: {sorted(overlap, key=int)}")
|
||||
print("They will be OVERWRITTEN.")
|
||||
|
||||
# Merge new commentary
|
||||
print(f"\nAdding commentary for Psalm 139 verses: {sorted(NEW_COMMENTARY.keys(), key=int)}")
|
||||
for verse, commentary in NEW_COMMENTARY.items():
|
||||
data['commentary']['139'][verse] = commentary
|
||||
|
||||
# Write back to file
|
||||
print("\nWriting updated file...")
|
||||
with open(json_path, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, indent=2, ensure_ascii=False)
|
||||
|
||||
# Summary
|
||||
all_verses = sorted(data['commentary']['139'].keys(), key=int)
|
||||
print(f"\n✓ Success! Psalm 139 now has commentary for {len(all_verses)} verses:")
|
||||
print(f" Verses: {', '.join(all_verses)}")
|
||||
print(f"\n Added: {', '.join(sorted(NEW_COMMENTARY.keys(), key=int))}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,198 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Analyze data coverage to identify gaps and areas for improvement.
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from collections import defaultdict
|
||||
|
||||
# Add parent directory to path
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||
|
||||
from kjvstudy_org.kjv import bible
|
||||
from kjvstudy_org.utils.commentary_loader import load_commentary_flat
|
||||
|
||||
|
||||
def analyze_commentary_coverage():
|
||||
"""Analyze verse commentary coverage."""
|
||||
print("=" * 80)
|
||||
print("VERSE COMMENTARY COVERAGE ANALYSIS")
|
||||
print("=" * 80)
|
||||
print()
|
||||
|
||||
commentary = load_commentary_flat()
|
||||
|
||||
total_verses = 31102
|
||||
verses_with_commentary = len(commentary)
|
||||
coverage_pct = (verses_with_commentary / total_verses) * 100
|
||||
|
||||
print(f"Total verses in Bible: {total_verses:,}")
|
||||
print(f"Verses with commentary: {verses_with_commentary:,}")
|
||||
print(f"Coverage: {coverage_pct:.1f}%")
|
||||
print()
|
||||
|
||||
# Analyze by book
|
||||
by_book = defaultdict(int)
|
||||
for verse_ref in commentary.keys():
|
||||
book = verse_ref.split(':')[0] if ':' in verse_ref else verse_ref.split(' ')[0]
|
||||
by_book[book] += 1
|
||||
|
||||
print(f"Books with commentary ({len(by_book)} books):")
|
||||
for book, count in sorted(by_book.items(), key=lambda x: x[1], reverse=True):
|
||||
print(f" {book}: {count} verses")
|
||||
print()
|
||||
|
||||
return verses_with_commentary
|
||||
|
||||
|
||||
def analyze_cross_reference_coverage():
|
||||
"""Analyze cross-reference coverage."""
|
||||
print("=" * 80)
|
||||
print("CROSS-REFERENCE COVERAGE ANALYSIS")
|
||||
print("=" * 80)
|
||||
print()
|
||||
|
||||
cross_refs = {}
|
||||
xref_dir = Path("kjvstudy_org/data/cross_references")
|
||||
legacy = Path("kjvstudy_org/data/cross_references.json")
|
||||
if xref_dir.exists():
|
||||
for path in xref_dir.glob("*.json"):
|
||||
with open(path, "r") as f:
|
||||
cross_refs.update(json.load(f))
|
||||
elif legacy.exists():
|
||||
with open(legacy, "r") as f:
|
||||
cross_refs = json.load(f)
|
||||
|
||||
total_verses = 31102
|
||||
verses_with_xrefs = len(cross_refs)
|
||||
total_xrefs = sum(len(refs) for refs in cross_refs.values())
|
||||
avg_xrefs_per_verse = total_xrefs / verses_with_xrefs if verses_with_xrefs > 0 else 0
|
||||
|
||||
# Count how many have descriptions
|
||||
xrefs_with_descriptions = 0
|
||||
xrefs_without_descriptions = 0
|
||||
|
||||
for refs in cross_refs.values():
|
||||
for ref in refs:
|
||||
if ref.get('note') and ref['note'].strip():
|
||||
xrefs_with_descriptions += 1
|
||||
else:
|
||||
xrefs_without_descriptions += 1
|
||||
|
||||
coverage_pct = (verses_with_xrefs / total_verses) * 100
|
||||
description_pct = (xrefs_with_descriptions / total_xrefs) * 100 if total_xrefs > 0 else 0
|
||||
|
||||
print(f"Total verses in Bible: {total_verses:,}")
|
||||
print(f"Verses with cross-references: {verses_with_xrefs:,}")
|
||||
print(f"Coverage: {coverage_pct:.1f}%")
|
||||
print()
|
||||
print(f"Total cross-reference entries: {total_xrefs:,}")
|
||||
print(f"Average per verse: {avg_xrefs_per_verse:.1f}")
|
||||
print()
|
||||
print(f"Cross-refs with descriptions: {xrefs_with_descriptions:,} ({description_pct:.1f}%)")
|
||||
print(f"Cross-refs without descriptions: {xrefs_without_descriptions:,}")
|
||||
print()
|
||||
|
||||
|
||||
def analyze_word_studies():
|
||||
"""Analyze word studies coverage."""
|
||||
print("=" * 80)
|
||||
print("WORD STUDIES ANALYSIS")
|
||||
print("=" * 80)
|
||||
print()
|
||||
|
||||
word_studies_file = Path("kjvstudy_org/data/word_studies.json")
|
||||
with open(word_studies_file, 'r') as f:
|
||||
word_studies = json.load(f)
|
||||
|
||||
total_studies = len(word_studies)
|
||||
|
||||
# Categorize by OT/NT coverage
|
||||
has_ot = 0
|
||||
has_nt = 0
|
||||
has_both = 0
|
||||
|
||||
for word, data in word_studies.items():
|
||||
ot = bool(data.get('ot_term'))
|
||||
nt = bool(data.get('nt_term'))
|
||||
|
||||
if ot and nt:
|
||||
has_both += 1
|
||||
elif ot:
|
||||
has_ot += 1
|
||||
elif nt:
|
||||
has_nt += 1
|
||||
|
||||
print(f"Total word studies: {total_studies}")
|
||||
print(f" Both OT and NT: {has_both}")
|
||||
print(f" OT only: {has_ot}")
|
||||
print(f" NT only: {has_nt}")
|
||||
print()
|
||||
|
||||
# Show sample words
|
||||
print("Sample words studied:")
|
||||
for word in list(word_studies.keys())[:10]:
|
||||
print(f" - {word}")
|
||||
print()
|
||||
|
||||
|
||||
def analyze_books_without_data():
|
||||
"""Identify books with minimal study material."""
|
||||
print("=" * 80)
|
||||
print("BOOKS WITH MINIMAL STUDY MATERIAL")
|
||||
print("=" * 80)
|
||||
print()
|
||||
|
||||
books = bible.get_books()
|
||||
|
||||
# Load commentary
|
||||
commentary = load_commentary_flat()
|
||||
|
||||
# Count verses per book
|
||||
book_stats = {}
|
||||
|
||||
for book in books:
|
||||
chapters = bible.get_chapters_for_book(book)
|
||||
total_verses = sum(len(bible.get_verses_by_book_chapter(book, ch)) for ch in chapters)
|
||||
|
||||
# Count commentary for this book
|
||||
commentary_count = sum(1 for ref in commentary.keys() if ref.startswith(book + ':') or ref.startswith(book + ' '))
|
||||
|
||||
book_stats[book] = {
|
||||
'total_verses': total_verses,
|
||||
'commentary': commentary_count,
|
||||
'commentary_pct': (commentary_count / total_verses * 100) if total_verses > 0 else 0
|
||||
}
|
||||
|
||||
# Sort by lowest commentary percentage
|
||||
sorted_books = sorted(book_stats.items(), key=lambda x: x[1]['commentary_pct'])
|
||||
|
||||
print("Books with lowest commentary coverage:")
|
||||
print()
|
||||
for book, stats in sorted_books[:15]:
|
||||
print(f"{book:20} {stats['total_verses']:4} verses, {stats['commentary']:4} commentary ({stats['commentary_pct']:.1f}%)")
|
||||
print()
|
||||
|
||||
|
||||
def main():
|
||||
"""Run all analyses."""
|
||||
analyze_commentary_coverage()
|
||||
analyze_cross_reference_coverage()
|
||||
analyze_word_studies()
|
||||
analyze_books_without_data()
|
||||
|
||||
print("=" * 80)
|
||||
print("RECOMMENDATIONS FOR IMPROVEMENT")
|
||||
print("=" * 80)
|
||||
print()
|
||||
print("1. Expand verse commentary to more books (currently 6-7% coverage)")
|
||||
print("2. Add more word studies (currently 53 terms)")
|
||||
print("3. Focus commentary on underserved books")
|
||||
print("4. Consider adding thematic commentary (not just verse-by-verse)")
|
||||
print()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,160 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Bulk add commentary for Amos and John missing verses."""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
PROJECT_ROOT = Path(__file__).parent.parent
|
||||
DATA_DIR = PROJECT_ROOT / "kjvstudy_org" / "data" / "verse_commentary"
|
||||
|
||||
def merge_commentary(book_slug, new_entries):
|
||||
"""Merge new commentary entries into existing file."""
|
||||
filepath = DATA_DIR / f"{book_slug}.json"
|
||||
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
commentary = data.get("commentary", {})
|
||||
added_count = 0
|
||||
|
||||
# Merge new entries
|
||||
for chapter, verses in new_entries.items():
|
||||
if chapter not in commentary:
|
||||
commentary[chapter] = {}
|
||||
for verse, entry in verses.items():
|
||||
if verse not in commentary[chapter]:
|
||||
commentary[chapter][verse] = entry
|
||||
added_count += 1
|
||||
print(f"Added {data['book']} {chapter}:{verse}")
|
||||
|
||||
data["commentary"] = commentary
|
||||
|
||||
# Save
|
||||
with open(filepath, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, ensure_ascii=False, indent=2)
|
||||
|
||||
print(f"\nAdded {added_count} verses to {filepath}\n")
|
||||
return added_count
|
||||
|
||||
# AMOS COMMENTARY
|
||||
amos_commentary = {
|
||||
"1": {
|
||||
"14": {
|
||||
"analysis": "<strong>I will kindle a fire in the wall of Rabbah</strong> (אַצִּית אֵשׁ בְּחוֹמַת רַבָּה, <em>atsit esh b'chomat rabbah</em>)—God's judgment comes as consuming fire against Ammon's capital. The Hebrew אַצִּית (<em>atsit</em>, 'I will kindle') emphasizes divine agency; this is not merely human warfare but Yahweh's direct intervention. <strong>With shouting in the day of battle, with a tempest in the day of the whirlwind</strong> combines military siege (תְּרוּעָה, <em>teruah</em>, the war cry) with natural disaster imagery—God orchestrates both human armies and cosmic forces for judgment.<br><br>Rabbah (modern Amman, Jordan) represented Ammonite pride and military power. The 'palaces' (אַרְמְנוֹתֶיהָ, <em>armenoteha</em>) symbolize accumulated wealth gained through oppression. This prophecy was fulfilled when Nebuchadnezzar conquered Ammon in 582 BC, though Christ ultimately judges all nations at His return (Matthew 25:31-46).",
|
||||
"historical": "Amos prophesied around 760-750 BC during Jeroboam II's reign. Ammon, descended from Lot (Genesis 19:38), had longstanding enmity with Israel. They committed atrocities against Gilead (Amos 1:13), including ripping open pregnant women to expand territory—crimes that demanded divine retribution.",
|
||||
"questions": [
|
||||
"How does God's sovereignty over nations challenge modern nationalism and the belief that any country is beyond judgment?",
|
||||
"What 'palaces' of accumulated wealth in your life might represent injustice or oppression of others?",
|
||||
"How should the certainty of divine judgment against evil comfort those who suffer injustice today?"
|
||||
]
|
||||
},
|
||||
"15": {
|
||||
"analysis": "<strong>Their king shall go into captivity, he and his princes together</strong> (וְהָלַךְ מַלְכָּם בַּגּוֹלָה, <em>v'halach malkam bagolah</em>)—The Hebrew מַלְכָּם (<em>malkam</em>) is a wordplay: it means both 'their king' and references Molech/Milcom, the Ammonite deity to whom children were sacrificed (1 Kings 11:5, 33). Both human rulers and false gods prove powerless before Yahweh. <strong>Saith the LORD</strong> (אָמַר יְהוָה, <em>amar YHWH</em>) is the prophetic authentication formula—this is not Amos's opinion but God's irrevocable decree.<br><br>The collapse of both political and religious systems signifies total judgment. No refuge remains—not in military might, political alliances, or false worship. This pattern repeats throughout history when nations trust in anything besides the true God.",
|
||||
"historical": "The Babylonian exile fulfilled this prophecy. Archaeological evidence shows Rabbah was destroyed in the 6th century BC. Ironically, Ammonites had long practiced child sacrifice to Molech, and now their god and king both went into captivity—helpless before the covenant God of Israel.",
|
||||
"questions": [
|
||||
"What false 'kings' or authorities do people trust in today instead of the LORD—government, wealth, ideology, self?",
|
||||
"How does the exile of both human rulers and false gods demonstrate that all idolatry ends in captivity?",
|
||||
"In what ways might Christians today be trusting in political power rather than the kingdom of God?"
|
||||
]
|
||||
}
|
||||
},
|
||||
"2": {
|
||||
"15": {
|
||||
"analysis": "In this verse detailing Moab's coming judgment, three classes of warriors prove helpless: <strong>he that handleth the bow</strong> (תֹּפֵשׂ הַקֶּשֶׁת, <em>tofes haqeshet</em>, the archer), <strong>he that is swift of foot</strong> (קַל בְּרַגְלָיו, <em>qal b'raglav</em>, literally 'light in his feet'), and <strong>he that rideth the horse</strong> (רֹכֵב הַסּוּס, <em>rochev hasus</em>, the cavalry). The threefold repetition—'shall not deliver himself' (לֹא יְמַלֵּט, <em>lo yemalet</em>)—hammers home human inability to escape divine judgment.<br><br>Ancient warfare relied on these three military advantages: long-range attack (archers), speed (runners for messages and retreat), and mobile power (cavalry). Yet when God judges, no human strategy suffices. This prefigures Romans 8:33—when God justifies, who can condemn? Conversely, when God condemns, no created thing can deliver.",
|
||||
"historical": "Moab, descended from Lot (Genesis 19:37), occupied territory east of the Dead Sea. They possessed skilled archers and swift-footed messengers. This prophecy found fulfillment in multiple invasions: by Assyria (715 BC), Babylon (582 BC), and finally Arab conquest that erased Moabite identity entirely.",
|
||||
"questions": [
|
||||
"What modern 'advantages'—technology, wealth, intelligence—do people trust for security instead of God?",
|
||||
"How does the futility of military might in escaping judgment challenge nations that trust in weapons?",
|
||||
"If no one can flee from God's judgment, what makes the gospel offer of escape through Christ so extraordinary?"
|
||||
]
|
||||
},
|
||||
"16": {
|
||||
"analysis": "<strong>He that is courageous among the mighty shall flee away naked in that day</strong> (וְאַמִּיץ לִבּוֹ בַגִּבּוֹרִים עָרוֹם יָנוּס, <em>v'amitz libo bagiborim arom yanus</em>)—The Hebrew emphasizes irony: אַמִּיץ (<em>amitz</em>) means 'strong, courageous,' yet even the bravest warrior flees עָרוֹם (<em>arom</em>, 'naked, stripped of armor'). The stripping represents complete defeat and humiliation; ancient warriors viewed losing armor as disgrace worse than death. <strong>Saith the LORD</strong> seals this as prophetic certainty, not military speculation.<br><br>This reversal motif appears throughout Scripture: the proud brought low (Isaiah 2:11-17), the mighty made weak (1 Corinthians 1:27-29). Human courage crumbles before divine judgment—no bravado, ideology, or self-confidence can stand when God rises to judge. Only those covered in Christ's righteousness (Isaiah 61:10) have a covering that endures judgment.",
|
||||
"historical": "Moabite warriors were renowned for courage (2 Kings 3:26-27 records their desperation in battle). Yet Nebuchadnezzar's armies stripped them of both armor and land. The 'nakedness' fulfills the covenant curses of Deuteronomy 28:48—Israel's judgment falling on nations who opposed God's purposes.",
|
||||
"questions": [
|
||||
"What does it mean to face judgment 'naked'—without the covering of Christ's righteousness?",
|
||||
"How does this verse challenge cultures that glorify human courage and strength as ultimate values?",
|
||||
"In what areas of life are you trusting your own 'courage' rather than seeking refuge in God?"
|
||||
]
|
||||
}
|
||||
},
|
||||
"3": {
|
||||
"8": {
|
||||
"analysis": "<strong>The lion hath roared, who will not fear?</strong> (אַרְיֵה שָׁאָג מִי לֹא יִירָא, <em>aryeh sha'ag mi lo yira</em>)—Amos uses rhetorical questions to establish cause and effect. The lion's roar (שָׁאָג, <em>sha'ag</em>) triggers instinctive fear; similarly, <strong>the Lord GOD hath spoken, who can but prophesy?</strong> (אֲדֹנָי יְהוִה דִּבֶּר מִי לֹא יִנָּבֵא, <em>Adonai YHWH diber mi lo yinave</em>). When God speaks (דִּבֶּר, <em>diber</em>), the prophet cannot remain silent—prophecy becomes compulsion, not career choice.<br><br>This defends Amos's prophetic authority against critics. He prophesies not from presumption but necessity—God has spoken, therefore he must speak. The same compulsion drove Peter and John: 'We cannot but speak the things which we have seen and heard' (Acts 4:20). True preaching flows from divine encounter, not human agenda.",
|
||||
"historical": "Amos spoke this around 760 BC when confronted by Amaziah the priest at Bethel (Amos 7:10-17), who commanded him to stop prophesying. Amos wasn't a professional prophet but a shepherd whom God seized and sent. This verse justifies his divine commission despite lacking formal prophetic credentials.",
|
||||
"questions": [
|
||||
"How does this verse challenge the modern view of preaching as profession rather than prophetic compulsion?",
|
||||
"When was the last time God's Word created such urgency in you that you couldn't remain silent?",
|
||||
"What does it mean for the church when preachers speak from personal wisdom rather than 'the Lord GOD hath spoken'?"
|
||||
]
|
||||
},
|
||||
"9": {
|
||||
"analysis": "<strong>Publish in the palaces at Ashdod, and in the palaces in the land of Egypt</strong>—God summons pagan nations as witnesses against Israel's sin. The Hebrew הַשְׁמִיעוּ (<em>hashmi'u</em>, 'proclaim, announce publicly') demands widespread proclamation. Ashdod (Philistine city) and Egypt (Israel's former oppressor) represent notorious wickedness, yet even they will be shocked by <strong>the great tumults</strong> (מְהוּמֹת רַבּוֹת, <em>mehumot rabot</em>, 'great confusion/chaos') and <strong>the oppressed</strong> (עֲשׁוּקִים, <em>ashuqim</em>, 'the oppressed/exploited') within Samaria.<br><br>This is devastating irony: Israel, called to be holy and distinct (Exodus 19:6), has become morally inferior to pagans. When God calls the wicked to witness against His people, judgment is certain. Similarly, Jesus said Sodom and Gomorrah would fare better than cities that rejected Him (Matthew 11:23-24).",
|
||||
"historical": "Samaria was Israel's capital, built by Omri (1 Kings 16:24) and famous for wealth and wickedness. By 760 BC, the Northern Kingdom's prosperity under Jeroboam II masked systemic injustice—the rich oppressing the poor while maintaining religious ritual. Archaeological excavations reveal luxury goods and elaborate architecture alongside evidence of extreme economic disparity.",
|
||||
"questions": [
|
||||
"How should it convict us when secular society recognizes injustice that religious people ignore or perpetuate?",
|
||||
"What 'tumults' and 'oppression' might be visible in churches or Christian communities today?",
|
||||
"Why does prosperity often blind religious people to their own sin and social injustice?"
|
||||
]
|
||||
},
|
||||
"10": {
|
||||
"analysis": "<strong>They know not to do right</strong> (וְלֹא־יָדְעוּ עֲשׂוֹת־נְכֹחָה, <em>v'lo yad'u asot n'chochah</em>)—The Hebrew יָדְעוּ (<em>yad'u</em>, 'to know') implies not mere intellectual ignorance but moral corruption; they've lost the capacity to recognize righteousness. The word נְכֹחָה (<em>n'chochah</em>, 'right, straight, honest') contrasts with their crooked dealings. <strong>Who store up violence and robbery in their palaces</strong> (הָאוֹצְרִים חָמָס וָשֹׁד בְּאַרְמְנוֹתֵיהֶם, <em>ha'otz'rim chamas v'shod b'armenoteihem</em>)—their wealth is 'stored up' violence (חָמָס, <em>chamas</em>) and plunder (שֹׁד, <em>shod</em>).<br><br>This indicts economic systems built on exploitation. Their palaces—symbols of success—are actually warehouses of injustice. James 5:1-6 echoes this: the wages of defrauded workers cry out to God. When injustice becomes normalized, people lose moral clarity entirely.",
|
||||
"historical": "During Jeroboam II's reign (793-753 BC), Israel experienced unprecedented prosperity through military expansion and trade. The wealthy elite accumulated luxury goods through predatory lending, land seizure, and corrupt courts. Amos confronts this 'prosperity gospel'—wealth divorced from justice proves spiritual bankruptcy.",
|
||||
"questions": [
|
||||
"How might modern Christians 'store up violence and robbery' through economic systems we benefit from but don't examine?",
|
||||
"What does it mean to lose the ability to recognize what is right due to cultural or economic complicity in injustice?",
|
||||
"How can churches today avoid confusing material prosperity with God's blessing when it's built on exploitation?"
|
||||
]
|
||||
},
|
||||
"11": {
|
||||
"analysis": "<strong>An adversary there shall be even round about the land</strong> (צַר וּסְבִיב הָאָרֶץ, <em>tzar us'viv ha'aretz</em>)—The enemy surrounds them completely; no escape remains. The term צַר (<em>tzar</em>, 'adversary, enemy, distress') appears with geographical emphasis: וּסְבִיב (<em>us'viv</em>, 'all around'). <strong>He shall bring down thy strength from thee</strong> (וְהוֹרִיד מִמֵּךְ עֻזֵּךְ, <em>v'horid mimech uzech</em>)—their military power (עֻזֵּךְ, <em>uzech</em>) will be 'brought down' (הוֹרִיד, <em>horid</em>, literally 'caused to descend'). <strong>Thy palaces shall be spoiled</strong> (וְנָבֹזּוּ אַרְמְנוֹתַיִךְ, <em>v'navozu armenotayich</em>)—plundered completely.<br><br>This reverses Israel's covenant promises. God promised protection from enemies (Leviticus 26:6-8), but covenant-breaking brings covenant curses (Leviticus 26:14-17). The Assyrian invasion of 722 BC fulfilled this literally—Samaria fell after three-year siege, and the nation never recovered.",
|
||||
"historical": "In 724 BC, Shalmaneser V of Assyria besieged Samaria; his successor Sargon II completed the conquest in 722 BC. The Assyrians deported 27,290 Israelites according to Assyrian records, replacing them with foreign peoples (2 Kings 17:5-6, 24). The Northern Kingdom ceased to exist—fulfilling Amos's prophecy exactly.",
|
||||
"questions": [
|
||||
"How does breaking covenant with God remove His protection and guarantee judgment?",
|
||||
"What false securities—military might, economic power, political alliances—do nations trust in today?",
|
||||
"How should the certainty of God's judgment against covenant-breaking inform Christian faithfulness in our generation?"
|
||||
]
|
||||
},
|
||||
"12": {
|
||||
"analysis": "The shepherd metaphor is devastatingly ironic: <strong>As the shepherd taketh out of the mouth of the lion two legs, or a piece of an ear</strong> (כַּאֲשֶׁר יַצִּיל הָרֹעֶה מִפִּי הָאַרְיֵה, <em>ka'asher yatzil haro'eh mipi ha'aryeh</em>)—these aren't rescued sheep but proof of death for the shepherd's legal defense (Exodus 22:13). Similarly, <strong>so shall the children of Israel be taken out</strong> (כֵּן יִנָּצְלוּ בְנֵי־יִשְׂרָאֵל, <em>ken yinatz'lu b'nei yisrael</em>)—a remnant survives, but barely. <strong>In the corner of a bed, and in Damascus in a couch</strong> describes luxury furniture fragments—all that remains of their opulence.<br><br>The Hebrew יִנָּצְלוּ (<em>yinatz'lu</em>) typically means 'delivered/rescued,' but here it's bitterly ironic: they're 'delivered' only as evidence of destruction. Like torn sheep parts, Israel will be reduced to fragments—a warning that affluence cannot protect from judgment.",
|
||||
"historical": "This prophecy was fulfilled multiply: the Assyrian conquest left only remnants, the Babylonian exile scattered survivors, and even today the ten northern tribes remain 'lost.' The reference to Damascus (Syria) and luxury couches emphasizes that those trusting in wealth and political alliances would be first to suffer.",
|
||||
"questions": [
|
||||
"How does this verse challenge the modern belief that material prosperity indicates God's favor?",
|
||||
"What does it mean to be 'saved' yet only as a fragment—bearing permanent marks of judgment?",
|
||||
"How should the reality of judgment as a consuming 'lion' shape Christian urgency in evangelism?"
|
||||
]
|
||||
},
|
||||
"13": {
|
||||
"analysis": "<strong>Hear ye, and testify in the house of Jacob</strong> (שִׁמְעוּ וְהָעִידוּ בְּבֵית יַעֲקֹב, <em>shim'u v'ha'idu b'veit ya'akov</em>)—The Hebrew הָעִידוּ (<em>ha'idu</em>, 'testify, bear witness') is legal language; God calls witnesses against His people. The use of 'Jacob' rather than 'Israel' may emphasize their unchanged carnal nature—still deceivers like their ancestor. <strong>Saith the Lord GOD, the God of hosts</strong> (נְאֻם אֲדֹנָי יְהוִה אֱלֹהֵי הַצְּבָאוֹת, <em>ne'um Adonai YHWH Elohei hatzva'ot</em>)—triple divine titles underscore absolute authority.<br><br>This courtroom scene portrays God prosecuting His covenant lawsuit (<em>riv</em>) against Israel. The same God who delivered them now testifies against them—a tragic reversal. Yet even in judgment, God calls witnesses, maintaining judicial righteousness rather than acting as arbitrary tyrant.",
|
||||
"historical": "The covenant lawsuit (prophetic riv) was a standard Ancient Near Eastern legal form. God isn't violating His covenant but enforcing it through its curse provisions (Deuteronomy 28-29). This public witness ensures Israel cannot claim ignorance or injustice when judgment falls.",
|
||||
"questions": [
|
||||
"How does God's use of legal process even in judgment display His righteousness and patience?",
|
||||
"What does it mean that God testifies against His own people—those who bear His name?",
|
||||
"How should churches today respond when God's Word testifies against their practices?"
|
||||
]
|
||||
},
|
||||
"14": {
|
||||
"analysis": "<strong>In the day that I shall visit the transgressions of Israel upon him</strong> (בְּיוֹם פָּקְדִי פִשְׁעֵי־יִשְׂרָאֵל עָלָיו, <em>b'yom pokdi pish'ei yisrael alav</em>)—The verb פָּקַד (<em>pakad</em>, 'visit, attend to, punish') appears frequently in judgment contexts; God's 'visitation' brings reckoning. <strong>I will also visit the altars of Beth-el</strong> (וּפָקַדְתִּי עַל־מִזְבְּחוֹת בֵּית־אֵל, <em>ufakadti al-mizbechot beit-el</em>)—Bethel's golden calf altar, established by Jeroboam I (1 Kings 12:28-29), epitomized Israel's syncretistic worship. <strong>The horns of the altar shall be cut off</strong> (וְנִגְדְּעוּ קַרְנוֹת הַמִּזְבֵּחַ, <em>v'nigde'u karnot hamizbeach</em>)—altar horns provided sanctuary (1 Kings 1:50), but now even that refuge is destroyed.<br><br>The cutting off of altar horns symbolizes judgment reaching even sacred spaces. No false worship, religious tradition, or holy place can protect covenant-breakers. This prefigures Christ's prophecy that Jerusalem's temple would be destroyed (Matthew 24:1-2)—structures of false confidence collapse under divine judgment.",
|
||||
"historical": "Bethel ('House of God') was where Jacob encountered God (Genesis 28:19), making Jeroboam's idolatry there particularly blasphemous. This sanctuary became the center of Israel's apostate worship. In 722 BC, the Assyrians destroyed these altars; Josiah later desecrated the site completely (2 Kings 23:15-16).",
|
||||
"questions": [
|
||||
"What false refuges—religious traditions, church buildings, rituals—do people trust instead of Christ alone?",
|
||||
"How does God's judgment on religious institutions that bear His name warn contemporary churches?",
|
||||
"In what ways might modern Christians be like Israel—maintaining religious forms while living in covenant unfaithfulness?"
|
||||
]
|
||||
},
|
||||
"15": {
|
||||
"analysis": "<strong>I will smite the winter house with the summer house</strong> (וְהִכֵּיתִי בֵית־הַחֹרֶף עַל־בֵּית הַקָּיִץ, <em>v'hikeiti beit-hachoref al-beit hakayitz</em>)—The wealthy maintained separate residences for different seasons; winter houses were typically in valleys, summer houses on cool heights. God will strike both simultaneously. <strong>The houses of ivory shall perish</strong> (וְאָבְדוּ בָּתֵּי הַשֵּׁן, <em>v'avdu batei hashen</em>, literally 'houses of tooth/ivory')—ivory inlays represented extreme luxury (1 Kings 22:39 mentions Ahab's ivory house). <strong>The great houses shall have an end</strong> (וְסָפוּ בָּתִּים רַבִּים, <em>v'safu batim rabim</em>)—utter destruction.<br><br>This passage condemns not wealth itself but wealth gained through oppression (Amos 3:10) and maintained through indifference to poverty (Amos 6:4-6). Jesus echoed this in the parable of the rich fool (Luke 12:16-21)—accumulated luxury without God is death. Archaeological excavations at Samaria confirm extensive ivory decorations, fulfilling this prophecy's specificity.",
|
||||
"historical": "The Northern Kingdom's aristocracy lived in unprecedented luxury during Jeroboam II's reign. Ivory fragments discovered at Samaria (1931-1935 excavations) confirm palace opulence. When Assyria conquered in 722 BC, these houses were destroyed—the wealthy who trusted in comfort experienced the judgment they'd ignored.",
|
||||
"questions": [
|
||||
"How does having multiple homes or excessive luxury while others suffer represent covenant unfaithfulness?",
|
||||
"What 'houses of ivory'—symbols of accumulated comfort—might blind Christians today to injustice and coming judgment?",
|
||||
"How can believers hold wealth and possessions with open hands, recognizing they belong to God and will not endure?"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# This file is getting large - will continue in parts
|
||||
print("Processing Amos commentary...")
|
||||
amos_count = merge_commentary("amos", amos_commentary)
|
||||
print(f"Total Amos verses added: {amos_count}\n")
|
||||
@@ -1,69 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Check for verses marked as 'full' that contain narrative introductions."""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
import sys
|
||||
|
||||
# Add parent directory to path
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||
|
||||
from kjvstudy_org.kjv import get_verse
|
||||
|
||||
# Load red letter data
|
||||
data_path = Path(__file__).parent.parent / "kjvstudy_org" / "data" / "red_letter_verses.json"
|
||||
with open(data_path) as f:
|
||||
data = json.load(f)
|
||||
|
||||
# Common narrative patterns that indicate the verse has narrative before Jesus speaks
|
||||
narrative_patterns = [
|
||||
"And he answered and said",
|
||||
"And Jesus answered and said",
|
||||
"And he said unto them",
|
||||
"And Jesus said unto them",
|
||||
"Then said he",
|
||||
"Then Jesus said",
|
||||
"And he saith unto them",
|
||||
"And Jesus saith unto them",
|
||||
"Then saith he",
|
||||
"Then Jesus saith",
|
||||
"And he spake",
|
||||
"And Jesus spake",
|
||||
]
|
||||
|
||||
# Check verses marked as "full"
|
||||
issues = []
|
||||
for ref, value in data['verses'].items():
|
||||
if value == 'full':
|
||||
# Parse reference
|
||||
parts = ref.rsplit(' ', 1)
|
||||
if len(parts) == 2:
|
||||
book = parts[0]
|
||||
chapter_verse = parts[1].split(':')
|
||||
if len(chapter_verse) == 2:
|
||||
chapter = int(chapter_verse[0])
|
||||
verse = int(chapter_verse[1])
|
||||
|
||||
# Get the actual verse text
|
||||
verse_data = get_verse(book, chapter, verse)
|
||||
if verse_data:
|
||||
text = verse_data['text']
|
||||
|
||||
# Check if it starts with narrative
|
||||
for pattern in narrative_patterns:
|
||||
if text.startswith(pattern):
|
||||
issues.append({
|
||||
'ref': ref,
|
||||
'text': text,
|
||||
'pattern': pattern
|
||||
})
|
||||
break
|
||||
|
||||
print(f"Found {len(issues)} verses marked as 'full' that start with narrative:")
|
||||
print()
|
||||
|
||||
for issue in issues[:30]: # Show first 30
|
||||
print(f"{issue['ref']}:")
|
||||
print(f" Pattern: {issue['pattern']}")
|
||||
print(f" Text: {issue['text'][:120]}...")
|
||||
print()
|
||||
@@ -1,711 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Check if top searched/famous Bible verses have commentary coverage.
|
||||
|
||||
This script contains a curated list of the most popular Bible verses
|
||||
based on search volume, memorization lists, and cultural significance.
|
||||
"""
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||
|
||||
from kjvstudy_org.utils.commentary_loader import load_commentary
|
||||
|
||||
# Top 1000 most popular/searched Bible verses
|
||||
# Organized by category for easier maintenance
|
||||
TOP_VERSES = [
|
||||
# === JOHN (Gospel of Love) ===
|
||||
("John", 3, 16), # For God so loved the world
|
||||
("John", 3, 17),
|
||||
("John", 1, 1), # In the beginning was the Word
|
||||
("John", 1, 14), # The Word became flesh
|
||||
("John", 14, 6), # I am the way, the truth, and the life
|
||||
("John", 14, 1), # Let not your heart be troubled
|
||||
("John", 14, 2),
|
||||
("John", 14, 3),
|
||||
("John", 14, 27), # Peace I leave with you
|
||||
("John", 8, 32), # The truth shall make you free
|
||||
("John", 8, 36), # If the Son sets you free
|
||||
("John", 10, 10), # I am come that they might have life
|
||||
("John", 10, 11), # I am the good shepherd
|
||||
("John", 10, 27), # My sheep hear my voice
|
||||
("John", 10, 28),
|
||||
("John", 11, 25), # I am the resurrection and the life
|
||||
("John", 11, 26),
|
||||
("John", 11, 35), # Jesus wept
|
||||
("John", 13, 34), # A new commandment
|
||||
("John", 13, 35),
|
||||
("John", 15, 5), # I am the vine
|
||||
("John", 15, 13), # Greater love hath no man
|
||||
("John", 16, 33), # In the world ye shall have tribulation
|
||||
("John", 17, 3), # This is life eternal
|
||||
("John", 17, 17), # Sanctify them through thy truth
|
||||
("John", 19, 30), # It is finished
|
||||
("John", 20, 31), # These are written that ye might believe
|
||||
|
||||
# === ROMANS (Doctrine) ===
|
||||
("Romans", 1, 16), # I am not ashamed of the gospel
|
||||
("Romans", 1, 17),
|
||||
("Romans", 3, 23), # All have sinned
|
||||
("Romans", 3, 24),
|
||||
("Romans", 5, 1), # Justified by faith
|
||||
("Romans", 5, 8), # While we were yet sinners
|
||||
("Romans", 6, 23), # Wages of sin is death
|
||||
("Romans", 8, 1), # No condemnation
|
||||
("Romans", 8, 28), # All things work together for good
|
||||
("Romans", 8, 31), # If God be for us
|
||||
("Romans", 8, 37), # More than conquerors
|
||||
("Romans", 8, 38), # Nothing can separate us
|
||||
("Romans", 8, 39),
|
||||
("Romans", 10, 9), # Confess with thy mouth
|
||||
("Romans", 10, 10),
|
||||
("Romans", 10, 13), # Whosoever shall call
|
||||
("Romans", 10, 17), # Faith cometh by hearing
|
||||
("Romans", 12, 1), # Present your bodies
|
||||
("Romans", 12, 2), # Be not conformed
|
||||
("Romans", 12, 12),
|
||||
("Romans", 12, 21), # Overcome evil with good
|
||||
|
||||
# === PSALMS (Poetry/Worship) ===
|
||||
("Psalms", 23, 1), # The LORD is my shepherd
|
||||
("Psalms", 23, 2),
|
||||
("Psalms", 23, 3),
|
||||
("Psalms", 23, 4), # Valley of the shadow of death
|
||||
("Psalms", 23, 5),
|
||||
("Psalms", 23, 6),
|
||||
("Psalms", 1, 1), # Blessed is the man
|
||||
("Psalms", 1, 2),
|
||||
("Psalms", 1, 3),
|
||||
("Psalms", 19, 1), # The heavens declare
|
||||
("Psalms", 19, 14), # Let the words of my mouth
|
||||
("Psalms", 27, 1), # The LORD is my light
|
||||
("Psalms", 27, 4),
|
||||
("Psalms", 34, 1),
|
||||
("Psalms", 34, 8), # Taste and see
|
||||
("Psalms", 37, 4), # Delight thyself in the LORD
|
||||
("Psalms", 37, 5),
|
||||
("Psalms", 46, 1), # God is our refuge
|
||||
("Psalms", 46, 10), # Be still and know
|
||||
("Psalms", 51, 1), # Have mercy upon me
|
||||
("Psalms", 51, 10), # Create in me a clean heart
|
||||
("Psalms", 91, 1), # He that dwelleth
|
||||
("Psalms", 91, 2),
|
||||
("Psalms", 91, 11),
|
||||
("Psalms", 100, 1),
|
||||
("Psalms", 100, 4), # Enter into his gates
|
||||
("Psalms", 100, 5),
|
||||
("Psalms", 103, 1), # Bless the LORD, O my soul
|
||||
("Psalms", 103, 2),
|
||||
("Psalms", 103, 12),# As far as the east from the west
|
||||
("Psalms", 118, 24),# This is the day
|
||||
("Psalms", 119, 11),# Thy word have I hid
|
||||
("Psalms", 119, 105),# Thy word is a lamp
|
||||
("Psalms", 121, 1), # I will lift up mine eyes
|
||||
("Psalms", 121, 2),
|
||||
("Psalms", 127, 1), # Except the LORD build the house
|
||||
("Psalms", 133, 1), # How good and pleasant
|
||||
("Psalms", 139, 14),# Fearfully and wonderfully made
|
||||
("Psalms", 139, 23),
|
||||
("Psalms", 139, 24),
|
||||
("Psalms", 145, 18),
|
||||
("Psalms", 150, 6), # Let every thing that hath breath
|
||||
|
||||
# === PROVERBS (Wisdom) ===
|
||||
("Proverbs", 3, 5), # Trust in the LORD
|
||||
("Proverbs", 3, 6), # In all thy ways acknowledge him
|
||||
("Proverbs", 3, 7),
|
||||
("Proverbs", 4, 23), # Keep thy heart
|
||||
("Proverbs", 16, 3), # Commit thy works
|
||||
("Proverbs", 16, 9),
|
||||
("Proverbs", 16, 18),# Pride goeth before destruction
|
||||
("Proverbs", 18, 21),# Death and life in the tongue
|
||||
("Proverbs", 22, 6), # Train up a child
|
||||
("Proverbs", 27, 17),# Iron sharpeneth iron
|
||||
("Proverbs", 31, 10),# Virtuous woman
|
||||
("Proverbs", 31, 25),
|
||||
("Proverbs", 31, 30),# Favour is deceitful
|
||||
|
||||
# === MATTHEW (Gospel) ===
|
||||
("Matthew", 5, 3), # Blessed are the poor in spirit
|
||||
("Matthew", 5, 4),
|
||||
("Matthew", 5, 5), # Blessed are the meek
|
||||
("Matthew", 5, 6),
|
||||
("Matthew", 5, 7),
|
||||
("Matthew", 5, 8), # Blessed are the pure in heart
|
||||
("Matthew", 5, 9),
|
||||
("Matthew", 5, 10),
|
||||
("Matthew", 5, 11),
|
||||
("Matthew", 5, 12),
|
||||
("Matthew", 5, 14), # Ye are the light of the world
|
||||
("Matthew", 5, 16), # Let your light so shine
|
||||
("Matthew", 5, 44), # Love your enemies
|
||||
("Matthew", 6, 9), # Our Father which art in heaven
|
||||
("Matthew", 6, 10),
|
||||
("Matthew", 6, 11),
|
||||
("Matthew", 6, 12),
|
||||
("Matthew", 6, 13),
|
||||
("Matthew", 6, 14),
|
||||
("Matthew", 6, 19),
|
||||
("Matthew", 6, 20),
|
||||
("Matthew", 6, 21), # Where your treasure is
|
||||
("Matthew", 6, 24), # Cannot serve two masters
|
||||
("Matthew", 6, 25),
|
||||
("Matthew", 6, 26),
|
||||
("Matthew", 6, 27),
|
||||
("Matthew", 6, 28),
|
||||
("Matthew", 6, 29),
|
||||
("Matthew", 6, 30),
|
||||
("Matthew", 6, 31),
|
||||
("Matthew", 6, 32),
|
||||
("Matthew", 6, 33), # Seek ye first the kingdom
|
||||
("Matthew", 6, 34), # Take no thought for the morrow
|
||||
("Matthew", 7, 1), # Judge not
|
||||
("Matthew", 7, 7), # Ask and it shall be given
|
||||
("Matthew", 7, 8),
|
||||
("Matthew", 7, 12), # Golden Rule
|
||||
("Matthew", 7, 13), # Enter ye in at the strait gate
|
||||
("Matthew", 7, 14),
|
||||
("Matthew", 11, 28), # Come unto me all ye that labour
|
||||
("Matthew", 11, 29),
|
||||
("Matthew", 11, 30),
|
||||
("Matthew", 16, 18), # Upon this rock
|
||||
("Matthew", 18, 20), # Where two or three are gathered
|
||||
("Matthew", 19, 14), # Suffer little children
|
||||
("Matthew", 19, 26), # With God all things are possible
|
||||
("Matthew", 22, 37), # Love the Lord thy God
|
||||
("Matthew", 22, 38),
|
||||
("Matthew", 22, 39), # Love thy neighbour
|
||||
("Matthew", 28, 18), # All power is given unto me
|
||||
("Matthew", 28, 19), # Go ye therefore
|
||||
("Matthew", 28, 20), # Lo, I am with you always
|
||||
|
||||
# === GENESIS (Beginnings) ===
|
||||
("Genesis", 1, 1), # In the beginning
|
||||
("Genesis", 1, 2),
|
||||
("Genesis", 1, 3), # Let there be light
|
||||
("Genesis", 1, 26), # Let us make man
|
||||
("Genesis", 1, 27),
|
||||
("Genesis", 1, 31), # Very good
|
||||
("Genesis", 2, 7),
|
||||
("Genesis", 2, 18), # Not good for man to be alone
|
||||
("Genesis", 2, 24), # Leave father and mother
|
||||
("Genesis", 3, 15), # Seed of the woman
|
||||
("Genesis", 12, 1), # Get thee out of thy country
|
||||
("Genesis", 12, 2),
|
||||
("Genesis", 12, 3), # I will bless them that bless thee
|
||||
("Genesis", 28, 15), # I am with thee
|
||||
("Genesis", 50, 20), # Ye thought evil, God meant good
|
||||
|
||||
# === ISAIAH (Messianic Prophecy) ===
|
||||
("Isaiah", 7, 14), # A virgin shall conceive
|
||||
("Isaiah", 9, 6), # For unto us a child is born
|
||||
("Isaiah", 9, 7),
|
||||
("Isaiah", 40, 3), # Voice crying in the wilderness
|
||||
("Isaiah", 40, 8), # The word of our God shall stand
|
||||
("Isaiah", 40, 28),
|
||||
("Isaiah", 40, 29),
|
||||
("Isaiah", 40, 30),
|
||||
("Isaiah", 40, 31), # They that wait upon the LORD
|
||||
("Isaiah", 41, 10), # Fear thou not, I am with thee
|
||||
("Isaiah", 43, 2), # When thou passest through the waters
|
||||
("Isaiah", 53, 3), # Despised and rejected
|
||||
("Isaiah", 53, 4),
|
||||
("Isaiah", 53, 5), # By his stripes we are healed
|
||||
("Isaiah", 53, 6), # All we like sheep have gone astray
|
||||
("Isaiah", 55, 8), # My thoughts are not your thoughts
|
||||
("Isaiah", 55, 9),
|
||||
("Isaiah", 55, 10),
|
||||
("Isaiah", 55, 11), # My word shall not return void
|
||||
("Isaiah", 58, 11),
|
||||
("Isaiah", 61, 1), # The Spirit of the Lord GOD
|
||||
|
||||
# === PHILIPPIANS ===
|
||||
("Philippians", 1, 6), # He which hath begun a good work
|
||||
("Philippians", 1, 21), # To live is Christ
|
||||
("Philippians", 2, 3),
|
||||
("Philippians", 2, 4),
|
||||
("Philippians", 2, 5), # Let this mind be in you
|
||||
("Philippians", 2, 8),
|
||||
("Philippians", 2, 9),
|
||||
("Philippians", 2, 10),
|
||||
("Philippians", 2, 11),
|
||||
("Philippians", 3, 13),
|
||||
("Philippians", 3, 14), # Press toward the mark
|
||||
("Philippians", 4, 4), # Rejoice in the Lord always
|
||||
("Philippians", 4, 6), # Be careful for nothing
|
||||
("Philippians", 4, 7), # Peace of God
|
||||
("Philippians", 4, 8), # Whatsoever things are true
|
||||
("Philippians", 4, 11),
|
||||
("Philippians", 4, 12),
|
||||
("Philippians", 4, 13), # I can do all things
|
||||
("Philippians", 4, 19), # My God shall supply
|
||||
|
||||
# === EPHESIANS ===
|
||||
("Ephesians", 2, 8), # By grace are ye saved
|
||||
("Ephesians", 2, 9),
|
||||
("Ephesians", 2, 10),
|
||||
("Ephesians", 3, 20), # Exceeding abundantly
|
||||
("Ephesians", 4, 26), # Be ye angry and sin not
|
||||
("Ephesians", 4, 29),
|
||||
("Ephesians", 4, 32), # Be ye kind
|
||||
("Ephesians", 5, 25), # Husbands love your wives
|
||||
("Ephesians", 6, 1), # Children obey your parents
|
||||
("Ephesians", 6, 4),
|
||||
("Ephesians", 6, 10), # Be strong in the Lord
|
||||
("Ephesians", 6, 11), # Put on the whole armour
|
||||
("Ephesians", 6, 12), # We wrestle not against flesh
|
||||
("Ephesians", 6, 13),
|
||||
("Ephesians", 6, 14),
|
||||
("Ephesians", 6, 15),
|
||||
("Ephesians", 6, 16),
|
||||
("Ephesians", 6, 17),
|
||||
("Ephesians", 6, 18),
|
||||
|
||||
# === GALATIANS ===
|
||||
("Galatians", 2, 20), # I am crucified with Christ
|
||||
("Galatians", 5, 1), # Stand fast in the liberty
|
||||
("Galatians", 5, 16),
|
||||
("Galatians", 5, 22), # Fruit of the Spirit
|
||||
("Galatians", 5, 23),
|
||||
("Galatians", 6, 2), # Bear ye one another's burdens
|
||||
("Galatians", 6, 7), # Be not deceived
|
||||
("Galatians", 6, 9), # Let us not be weary
|
||||
|
||||
# === HEBREWS ===
|
||||
("Hebrews", 4, 12), # Word of God is quick
|
||||
("Hebrews", 4, 15),
|
||||
("Hebrews", 4, 16), # Come boldly unto the throne
|
||||
("Hebrews", 10, 25), # Not forsaking the assembling
|
||||
("Hebrews", 11, 1), # Faith is the substance
|
||||
("Hebrews", 11, 6), # Without faith impossible to please
|
||||
("Hebrews", 12, 1), # Great cloud of witnesses
|
||||
("Hebrews", 12, 2), # Looking unto Jesus
|
||||
("Hebrews", 13, 5), # I will never leave thee
|
||||
("Hebrews", 13, 6),
|
||||
("Hebrews", 13, 8), # Jesus Christ the same
|
||||
|
||||
# === JAMES ===
|
||||
("James", 1, 2), # Count it all joy
|
||||
("James", 1, 3),
|
||||
("James", 1, 4),
|
||||
("James", 1, 5), # If any lack wisdom
|
||||
("James", 1, 12),
|
||||
("James", 1, 17), # Every good gift
|
||||
("James", 1, 19), # Swift to hear
|
||||
("James", 1, 22), # Be ye doers of the word
|
||||
("James", 2, 17), # Faith without works
|
||||
("James", 4, 7), # Submit to God, resist the devil
|
||||
("James", 4, 8), # Draw nigh to God
|
||||
("James", 4, 10),
|
||||
("James", 5, 16), # Pray one for another
|
||||
|
||||
# === 1 PETER ===
|
||||
("1 Peter", 2, 9), # Ye are a chosen generation
|
||||
("1 Peter", 2, 24), # By whose stripes ye were healed
|
||||
("1 Peter", 3, 15), # Sanctify the Lord God
|
||||
("1 Peter", 4, 8), # Charity shall cover
|
||||
("1 Peter", 5, 7), # Casting all your care
|
||||
("1 Peter", 5, 8), # Be sober, be vigilant
|
||||
|
||||
# === 2 PETER ===
|
||||
("2 Peter", 1, 3),
|
||||
("2 Peter", 1, 4), # Exceeding great and precious promises
|
||||
("2 Peter", 3, 8), # One day is with the Lord
|
||||
("2 Peter", 3, 9), # Not willing that any should perish
|
||||
|
||||
# === 1 JOHN ===
|
||||
("1 John", 1, 7), # Walk in the light
|
||||
("1 John", 1, 8),
|
||||
("1 John", 1, 9), # If we confess our sins
|
||||
("1 John", 3, 1), # Behold what manner of love
|
||||
("1 John", 4, 4), # Greater is he that is in you
|
||||
("1 John", 4, 7), # Let us love one another
|
||||
("1 John", 4, 8), # God is love
|
||||
("1 John", 4, 10),
|
||||
("1 John", 4, 11),
|
||||
("1 John", 4, 18), # Perfect love casteth out fear
|
||||
("1 John", 4, 19), # We love him because he first loved us
|
||||
("1 John", 5, 14), # If we ask according to his will
|
||||
("1 John", 5, 15),
|
||||
|
||||
# === 2 CORINTHIANS ===
|
||||
("2 Corinthians", 4, 18),
|
||||
("2 Corinthians", 5, 7), # Walk by faith, not by sight
|
||||
("2 Corinthians", 5, 17), # If any man be in Christ
|
||||
("2 Corinthians", 5, 21), # He hath made him to be sin
|
||||
("2 Corinthians", 9, 7), # God loveth a cheerful giver
|
||||
("2 Corinthians", 10, 5), # Casting down imaginations
|
||||
("2 Corinthians", 12, 9), # My grace is sufficient
|
||||
("2 Corinthians", 12, 10),
|
||||
|
||||
# === 1 CORINTHIANS ===
|
||||
("1 Corinthians", 6, 19), # Your body is the temple
|
||||
("1 Corinthians", 6, 20),
|
||||
("1 Corinthians", 10, 13), # God is faithful, temptation
|
||||
("1 Corinthians", 13, 1),
|
||||
("1 Corinthians", 13, 2),
|
||||
("1 Corinthians", 13, 3),
|
||||
("1 Corinthians", 13, 4), # Charity suffereth long
|
||||
("1 Corinthians", 13, 5),
|
||||
("1 Corinthians", 13, 6),
|
||||
("1 Corinthians", 13, 7),
|
||||
("1 Corinthians", 13, 8),
|
||||
("1 Corinthians", 13, 13), # Faith, hope, charity
|
||||
("1 Corinthians", 15, 55), # O death, where is thy sting
|
||||
("1 Corinthians", 15, 57),
|
||||
("1 Corinthians", 15, 58),
|
||||
("1 Corinthians", 16, 13),
|
||||
|
||||
# === COLOSSIANS ===
|
||||
("Colossians", 1, 16),
|
||||
("Colossians", 1, 17),
|
||||
("Colossians", 2, 6),
|
||||
("Colossians", 2, 7),
|
||||
("Colossians", 3, 1),
|
||||
("Colossians", 3, 2), # Set your affection on things above
|
||||
("Colossians", 3, 12),
|
||||
("Colossians", 3, 13),
|
||||
("Colossians", 3, 14),
|
||||
("Colossians", 3, 15),
|
||||
("Colossians", 3, 16),
|
||||
("Colossians", 3, 17), # Whatsoever ye do in word or deed
|
||||
("Colossians", 3, 23),
|
||||
|
||||
# === 1 THESSALONIANS ===
|
||||
("1 Thessalonians", 4, 16),
|
||||
("1 Thessalonians", 4, 17), # Caught up together
|
||||
("1 Thessalonians", 5, 16),
|
||||
("1 Thessalonians", 5, 17), # Pray without ceasing
|
||||
("1 Thessalonians", 5, 18), # In every thing give thanks
|
||||
|
||||
# === 2 TIMOTHY ===
|
||||
("2 Timothy", 1, 7), # Spirit not of fear
|
||||
("2 Timothy", 2, 15), # Study to shew thyself approved
|
||||
("2 Timothy", 3, 16), # All scripture is given
|
||||
("2 Timothy", 3, 17),
|
||||
("2 Timothy", 4, 7), # I have fought a good fight
|
||||
|
||||
# === 1 TIMOTHY ===
|
||||
("1 Timothy", 2, 5), # One mediator
|
||||
("1 Timothy", 4, 12), # Let no man despise thy youth
|
||||
("1 Timothy", 6, 10), # Love of money
|
||||
("1 Timothy", 6, 12), # Fight the good fight
|
||||
|
||||
# === TITUS ===
|
||||
("Titus", 2, 11),
|
||||
("Titus", 2, 12),
|
||||
("Titus", 3, 5), # Not by works of righteousness
|
||||
|
||||
# === LUKE ===
|
||||
("Luke", 1, 37), # Nothing impossible with God
|
||||
("Luke", 2, 10),
|
||||
("Luke", 2, 11), # Unto you is born
|
||||
("Luke", 2, 14), # Glory to God in the highest
|
||||
("Luke", 6, 27),
|
||||
("Luke", 6, 28),
|
||||
("Luke", 6, 31), # Golden Rule (Luke version)
|
||||
("Luke", 6, 37), # Judge not
|
||||
("Luke", 6, 38), # Give and it shall be given
|
||||
("Luke", 9, 23), # Take up his cross daily
|
||||
("Luke", 10, 27),
|
||||
("Luke", 11, 9),
|
||||
("Luke", 11, 10),
|
||||
("Luke", 12, 15),
|
||||
("Luke", 15, 7), # Joy over one sinner
|
||||
("Luke", 15, 10),
|
||||
("Luke", 18, 27), # Impossible with men, possible with God
|
||||
("Luke", 19, 10), # Son of man came to seek and save
|
||||
|
||||
# === MARK ===
|
||||
("Mark", 8, 36), # What shall it profit a man
|
||||
("Mark", 9, 23), # All things are possible to him that believeth
|
||||
("Mark", 10, 27), # With God all things are possible
|
||||
("Mark", 10, 45), # Son of man came to minister
|
||||
("Mark", 11, 24), # What things soever ye desire
|
||||
("Mark", 11, 25),
|
||||
("Mark", 12, 30),
|
||||
("Mark", 12, 31),
|
||||
("Mark", 16, 15), # Go ye into all the world
|
||||
|
||||
# === ACTS ===
|
||||
("Acts", 1, 8), # Ye shall receive power
|
||||
("Acts", 2, 38), # Repent and be baptized
|
||||
("Acts", 4, 12), # Neither is there salvation in any other
|
||||
("Acts", 16, 31), # Believe on the Lord Jesus Christ
|
||||
("Acts", 17, 11), # More noble than those in Thessalonica
|
||||
("Acts", 20, 35), # More blessed to give than to receive
|
||||
|
||||
# === REVELATION ===
|
||||
("Revelation", 1, 8), # Alpha and Omega
|
||||
("Revelation", 3, 20), # Behold, I stand at the door
|
||||
("Revelation", 21, 1),
|
||||
("Revelation", 21, 4), # God shall wipe away all tears
|
||||
("Revelation", 22, 13),
|
||||
("Revelation", 22, 17), # Let him that is athirst come
|
||||
("Revelation", 22, 20),
|
||||
|
||||
# === JEREMIAH ===
|
||||
("Jeremiah", 17, 7),
|
||||
("Jeremiah", 17, 8),
|
||||
("Jeremiah", 29, 11), # I know the thoughts
|
||||
("Jeremiah", 29, 12),
|
||||
("Jeremiah", 29, 13), # Seek me and find me
|
||||
("Jeremiah", 31, 3), # Everlasting love
|
||||
("Jeremiah", 33, 3), # Call unto me
|
||||
|
||||
# === MICAH ===
|
||||
("Micah", 6, 8), # What doth the LORD require
|
||||
|
||||
# === HABAKKUK ===
|
||||
("Habakkuk", 2, 4), # The just shall live by faith
|
||||
|
||||
# === NAHUM ===
|
||||
("Nahum", 1, 7), # The LORD is good, a stronghold
|
||||
|
||||
# === ZEPHANIAH ===
|
||||
("Zephaniah", 3, 17), # The LORD thy God in the midst
|
||||
|
||||
# === MALACHI ===
|
||||
("Malachi", 3, 10), # Bring ye all the tithes
|
||||
|
||||
# === JOSHUA ===
|
||||
("Joshua", 1, 8), # This book of the law
|
||||
("Joshua", 1, 9), # Be strong and of a good courage
|
||||
("Joshua", 24, 15), # As for me and my house
|
||||
|
||||
# === DEUTERONOMY ===
|
||||
("Deuteronomy", 6, 4), # Hear O Israel, the LORD our God
|
||||
("Deuteronomy", 6, 5),
|
||||
("Deuteronomy", 6, 6),
|
||||
("Deuteronomy", 6, 7),
|
||||
("Deuteronomy", 31, 6), # Be strong and of a good courage
|
||||
("Deuteronomy", 31, 8),
|
||||
|
||||
# === EXODUS ===
|
||||
("Exodus", 14, 14), # The LORD shall fight for you
|
||||
("Exodus", 20, 3), # Ten Commandments
|
||||
("Exodus", 20, 4),
|
||||
("Exodus", 20, 5),
|
||||
("Exodus", 20, 6),
|
||||
("Exodus", 20, 7),
|
||||
("Exodus", 20, 8),
|
||||
("Exodus", 20, 9),
|
||||
("Exodus", 20, 10),
|
||||
("Exodus", 20, 11),
|
||||
("Exodus", 20, 12),
|
||||
("Exodus", 20, 13),
|
||||
("Exodus", 20, 14),
|
||||
("Exodus", 20, 15),
|
||||
("Exodus", 20, 16),
|
||||
("Exodus", 20, 17),
|
||||
|
||||
# === NUMBERS ===
|
||||
("Numbers", 6, 24), # The LORD bless thee
|
||||
("Numbers", 6, 25),
|
||||
("Numbers", 6, 26),
|
||||
|
||||
# === JOB ===
|
||||
("Job", 1, 21), # The LORD gave, the LORD hath taken
|
||||
("Job", 13, 15), # Though he slay me, yet will I trust
|
||||
("Job", 19, 25), # I know that my redeemer liveth
|
||||
|
||||
# === ECCLESIASTES ===
|
||||
("Ecclesiastes", 3, 1), # To every thing there is a season
|
||||
("Ecclesiastes", 3, 2),
|
||||
("Ecclesiastes", 3, 3),
|
||||
("Ecclesiastes", 3, 4),
|
||||
("Ecclesiastes", 3, 11),# He hath made every thing beautiful
|
||||
("Ecclesiastes", 4, 9),
|
||||
("Ecclesiastes", 4, 10),
|
||||
("Ecclesiastes", 4, 12),# A threefold cord
|
||||
("Ecclesiastes", 12, 13),
|
||||
("Ecclesiastes", 12, 14),
|
||||
|
||||
# === DANIEL ===
|
||||
("Daniel", 3, 17),
|
||||
("Daniel", 3, 18),
|
||||
|
||||
# === LAMENTATIONS ===
|
||||
("Lamentations", 3, 22),
|
||||
("Lamentations", 3, 23), # Great is thy faithfulness
|
||||
|
||||
# === EZEKIEL ===
|
||||
("Ezekiel", 37, 1),
|
||||
("Ezekiel", 37, 3),
|
||||
|
||||
# === HOSEA ===
|
||||
("Hosea", 6, 6), # I desired mercy
|
||||
|
||||
# === AMOS ===
|
||||
("Amos", 3, 3), # Can two walk together
|
||||
|
||||
# === ZECHARIAH ===
|
||||
("Zechariah", 4, 6), # Not by might
|
||||
|
||||
# === RUTH ===
|
||||
("Ruth", 1, 16), # Whither thou goest
|
||||
|
||||
# === ESTHER ===
|
||||
("Esther", 4, 14), # For such a time as this
|
||||
|
||||
# === NEHEMIAH ===
|
||||
("Nehemiah", 8, 10), # The joy of the LORD is your strength
|
||||
|
||||
# === 2 CHRONICLES ===
|
||||
("2 Chronicles", 7, 14),# If my people shall humble themselves
|
||||
|
||||
# === JUDE ===
|
||||
("Jude", 1, 24), # Now unto him that is able to keep
|
||||
("Jude", 1, 25),
|
||||
|
||||
# === PHILEMON ===
|
||||
("Philemon", 1, 6),
|
||||
|
||||
# === 2 JOHN ===
|
||||
("2 John", 1, 6),
|
||||
|
||||
# === 3 JOHN ===
|
||||
("3 John", 1, 4), # No greater joy
|
||||
|
||||
# === Additional highly searched verses ===
|
||||
("Matthew", 4, 4), # Man shall not live by bread alone
|
||||
("Matthew", 5, 13), # Ye are the salt of the earth
|
||||
("Matthew", 5, 48), # Be ye therefore perfect
|
||||
("Matthew", 7, 21),
|
||||
("Matthew", 10, 28),
|
||||
("Matthew", 10, 29),
|
||||
("Matthew", 10, 30),
|
||||
("Matthew", 10, 31),
|
||||
("Matthew", 16, 24),
|
||||
("Matthew", 16, 25),
|
||||
("Matthew", 16, 26),
|
||||
("Matthew", 18, 3),
|
||||
("Matthew", 19, 6), # What God hath joined together
|
||||
("Matthew", 21, 22),
|
||||
("Matthew", 24, 35), # Heaven and earth shall pass away
|
||||
("John", 4, 24), # God is a Spirit
|
||||
("John", 6, 35), # I am the bread of life
|
||||
("John", 6, 37),
|
||||
("John", 8, 12), # I am the light of the world
|
||||
("John", 12, 46),
|
||||
("John", 14, 12),
|
||||
("John", 14, 13),
|
||||
("John", 14, 14),
|
||||
("John", 14, 15),
|
||||
("John", 14, 16),
|
||||
("John", 14, 21),
|
||||
("John", 14, 23),
|
||||
("John", 14, 26),
|
||||
("John", 15, 1),
|
||||
("John", 15, 4),
|
||||
("John", 15, 7),
|
||||
("John", 15, 9),
|
||||
("John", 15, 10),
|
||||
("John", 15, 11),
|
||||
("John", 15, 12),
|
||||
("John", 15, 16),
|
||||
("Romans", 2, 4),
|
||||
("Romans", 4, 5),
|
||||
("Romans", 5, 3),
|
||||
("Romans", 5, 4),
|
||||
("Romans", 5, 5),
|
||||
("Romans", 5, 6),
|
||||
("Romans", 6, 1),
|
||||
("Romans", 6, 2),
|
||||
("Romans", 6, 3),
|
||||
("Romans", 6, 4),
|
||||
("Romans", 6, 11),
|
||||
("Romans", 6, 12),
|
||||
("Romans", 6, 13),
|
||||
("Romans", 6, 14),
|
||||
("Romans", 8, 5),
|
||||
("Romans", 8, 6),
|
||||
("Romans", 8, 9),
|
||||
("Romans", 8, 11),
|
||||
("Romans", 8, 14),
|
||||
("Romans", 8, 15),
|
||||
("Romans", 8, 16),
|
||||
("Romans", 8, 17),
|
||||
("Romans", 8, 18),
|
||||
("Romans", 8, 26),
|
||||
("Romans", 8, 27),
|
||||
("Romans", 8, 29),
|
||||
("Romans", 8, 30),
|
||||
("Romans", 8, 32),
|
||||
("Romans", 8, 33),
|
||||
("Romans", 8, 34),
|
||||
("Romans", 8, 35),
|
||||
("Romans", 8, 36),
|
||||
("Romans", 11, 33),
|
||||
("Romans", 11, 36),
|
||||
("Romans", 12, 3),
|
||||
("Romans", 12, 4),
|
||||
("Romans", 12, 5),
|
||||
("Romans", 12, 6),
|
||||
("Romans", 12, 9),
|
||||
("Romans", 12, 10),
|
||||
("Romans", 12, 11),
|
||||
("Romans", 12, 14),
|
||||
("Romans", 12, 15),
|
||||
("Romans", 12, 16),
|
||||
("Romans", 12, 17),
|
||||
("Romans", 12, 18),
|
||||
("Romans", 12, 19),
|
||||
("Romans", 12, 20),
|
||||
("Romans", 13, 10),
|
||||
("Romans", 14, 8),
|
||||
("Romans", 15, 13),
|
||||
]
|
||||
|
||||
def main():
|
||||
# Load existing commentary
|
||||
commentary = load_commentary()
|
||||
|
||||
# Check coverage
|
||||
covered = []
|
||||
missing = []
|
||||
|
||||
for book, chapter, verse in TOP_VERSES:
|
||||
if book in commentary and chapter in commentary[book] and verse in commentary[book][chapter]:
|
||||
covered.append((book, chapter, verse))
|
||||
else:
|
||||
missing.append((book, chapter, verse))
|
||||
|
||||
total = len(TOP_VERSES)
|
||||
covered_count = len(covered)
|
||||
missing_count = len(missing)
|
||||
|
||||
print("=" * 70)
|
||||
print("TOP VERSES COMMENTARY COVERAGE CHECK")
|
||||
print("=" * 70)
|
||||
print()
|
||||
print(f"Total top verses checked: {total}")
|
||||
print(f"Covered: {covered_count} ({100*covered_count/total:.1f}%)")
|
||||
print(f"Missing: {missing_count} ({100*missing_count/total:.1f}%)")
|
||||
print()
|
||||
|
||||
if missing:
|
||||
print("=" * 70)
|
||||
print("MISSING VERSES (need commentary)")
|
||||
print("=" * 70)
|
||||
|
||||
# Group by book
|
||||
by_book = {}
|
||||
for book, chapter, verse in missing:
|
||||
if book not in by_book:
|
||||
by_book[book] = []
|
||||
by_book[book].append((chapter, verse))
|
||||
|
||||
for book in sorted(by_book.keys()):
|
||||
verses = by_book[book]
|
||||
print(f"\n{book} ({len(verses)} verses):")
|
||||
for chapter, verse in sorted(verses):
|
||||
print(f" {chapter}:{verse}")
|
||||
else:
|
||||
print("All top verses have commentary coverage!")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,339 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Commentary CLI - Command-line tool for managing verse commentary.
|
||||
|
||||
Usage:
|
||||
# Check coverage against top verses
|
||||
uv run python scripts/commentary_cli.py coverage
|
||||
|
||||
# List missing verses for a book
|
||||
uv run python scripts/commentary_cli.py missing Isaiah
|
||||
|
||||
# Get verse text (for agent use)
|
||||
uv run python scripts/commentary_cli.py verse Isaiah 7 14
|
||||
|
||||
# Add commentary for a verse
|
||||
uv run python scripts/commentary_cli.py add Isaiah 7 14 --analysis "..." --historical "..." --questions "Q1" "Q2"
|
||||
|
||||
# Validate commentary file
|
||||
uv run python scripts/commentary_cli.py validate Isaiah
|
||||
|
||||
# Show stats for all books
|
||||
uv run python scripts/commentary_cli.py stats
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
# Add project root to path
|
||||
PROJECT_ROOT = Path(__file__).parent.parent
|
||||
sys.path.insert(0, str(PROJECT_ROOT))
|
||||
|
||||
DATA_DIR = PROJECT_ROOT / "kjvstudy_org" / "data" / "verse_commentary"
|
||||
|
||||
|
||||
def slugify(book: str) -> str:
|
||||
"""Create filesystem-friendly file name for a book."""
|
||||
slug = re.sub(r"[^a-z0-9]+", book.lower(), "")
|
||||
slug = re.sub(r"[^a-z0-9]+", "_", book.lower())
|
||||
slug = re.sub(r"_+", "_", slug).strip("_")
|
||||
return slug or "book"
|
||||
|
||||
|
||||
def load_book_commentary(book: str) -> dict:
|
||||
"""Load commentary file for a book."""
|
||||
slug = slugify(book)
|
||||
filepath = DATA_DIR / f"{slug}.json"
|
||||
|
||||
if not filepath.exists():
|
||||
return {"book": book, "commentary": {}}
|
||||
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
return json.load(f)
|
||||
|
||||
|
||||
def save_book_commentary(book: str, data: dict) -> Path:
|
||||
"""Save commentary file for a book."""
|
||||
slug = slugify(book)
|
||||
filepath = DATA_DIR / f"{slug}.json"
|
||||
|
||||
with open(filepath, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, ensure_ascii=False, indent=2)
|
||||
|
||||
return filepath
|
||||
|
||||
|
||||
def get_verse_text(book: str, chapter: int, verse: int) -> dict | None:
|
||||
"""Get verse text from the KJV module."""
|
||||
try:
|
||||
from kjvstudy_org.kjv import Bible
|
||||
bible = Bible()
|
||||
text = bible.get_verse_text(book, chapter, verse)
|
||||
if text:
|
||||
return {"book": book, "chapter": chapter, "verse": verse, "text": text}
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f"Error loading verse: {e}", file=sys.stderr)
|
||||
return None
|
||||
|
||||
|
||||
def cmd_verse(args):
|
||||
"""Get verse text."""
|
||||
verse = get_verse_text(args.book, args.chapter, args.verse)
|
||||
if verse:
|
||||
print(json.dumps(verse, indent=2))
|
||||
else:
|
||||
print(f"Verse not found: {args.book} {args.chapter}:{args.verse}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def cmd_coverage(args):
|
||||
"""Check coverage against top verses list."""
|
||||
# Import check_top_verses functionality
|
||||
from check_top_verses import TOP_VERSES, check_coverage
|
||||
|
||||
covered, missing = check_coverage()
|
||||
total = len(TOP_VERSES)
|
||||
|
||||
print(f"Coverage: {len(covered)}/{total} ({100*len(covered)/total:.1f}%)")
|
||||
print(f"Missing: {len(missing)} verses")
|
||||
|
||||
if args.verbose and missing:
|
||||
print("\nMissing verses:")
|
||||
for book, verses in sorted(missing.items()):
|
||||
print(f" {book}: {', '.join(map(str, verses))}")
|
||||
|
||||
|
||||
def cmd_missing(args):
|
||||
"""List missing verses for a book."""
|
||||
from check_top_verses import TOP_VERSES
|
||||
|
||||
book = args.book
|
||||
if book not in TOP_VERSES:
|
||||
print(f"Book '{book}' not in top verses list", file=sys.stderr)
|
||||
print(f"Available books: {', '.join(sorted(TOP_VERSES.keys()))}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
data = load_book_commentary(book)
|
||||
commentary = data.get("commentary", {})
|
||||
|
||||
missing = []
|
||||
for chapter, verses in TOP_VERSES[book].items():
|
||||
chapter_data = commentary.get(str(chapter), {})
|
||||
for verse in verses:
|
||||
if str(verse) not in chapter_data:
|
||||
missing.append(f"{chapter}:{verse}")
|
||||
|
||||
if missing:
|
||||
print(f"Missing verses in {book}:")
|
||||
for ref in missing:
|
||||
print(f" {ref}")
|
||||
else:
|
||||
print(f"All top verses covered in {book}")
|
||||
|
||||
|
||||
def cmd_add(args):
|
||||
"""Add commentary for a verse."""
|
||||
book = args.book
|
||||
chapter = str(args.chapter)
|
||||
verse = str(args.verse)
|
||||
|
||||
# Load existing data
|
||||
data = load_book_commentary(book)
|
||||
commentary = data.get("commentary", {})
|
||||
|
||||
# Check if verse already exists
|
||||
if chapter in commentary and verse in commentary[chapter]:
|
||||
if not args.force:
|
||||
print(f"Commentary already exists for {book} {chapter}:{verse}", file=sys.stderr)
|
||||
print("Use --force to overwrite", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
# Build commentary entry
|
||||
entry = {
|
||||
"analysis": args.analysis,
|
||||
"historical": args.historical,
|
||||
"questions": args.questions or []
|
||||
}
|
||||
|
||||
# Add to structure
|
||||
if chapter not in commentary:
|
||||
commentary[chapter] = {}
|
||||
commentary[chapter][verse] = entry
|
||||
data["commentary"] = commentary
|
||||
|
||||
# Save
|
||||
filepath = save_book_commentary(book, data)
|
||||
print(f"Added commentary for {book} {chapter}:{verse}")
|
||||
print(f"Saved to: {filepath}")
|
||||
|
||||
|
||||
def cmd_validate(args):
|
||||
"""Validate commentary file structure."""
|
||||
book = args.book
|
||||
data = load_book_commentary(book)
|
||||
|
||||
errors = []
|
||||
warnings = []
|
||||
|
||||
if "book" not in data:
|
||||
errors.append("Missing 'book' field")
|
||||
|
||||
if "commentary" not in data:
|
||||
errors.append("Missing 'commentary' field")
|
||||
else:
|
||||
for chapter, verses in data["commentary"].items():
|
||||
if not isinstance(verses, dict):
|
||||
errors.append(f"Chapter {chapter} is not a dict")
|
||||
continue
|
||||
|
||||
for verse, entry in verses.items():
|
||||
ref = f"{chapter}:{verse}"
|
||||
|
||||
if not isinstance(entry, dict):
|
||||
errors.append(f"{ref}: Entry is not a dict")
|
||||
continue
|
||||
|
||||
if "analysis" not in entry:
|
||||
warnings.append(f"{ref}: Missing 'analysis'")
|
||||
if "historical" not in entry:
|
||||
warnings.append(f"{ref}: Missing 'historical'")
|
||||
if "questions" not in entry:
|
||||
warnings.append(f"{ref}: Missing 'questions'")
|
||||
elif not isinstance(entry.get("questions"), list):
|
||||
errors.append(f"{ref}: 'questions' is not a list")
|
||||
|
||||
if errors:
|
||||
print(f"ERRORS in {book}:")
|
||||
for e in errors:
|
||||
print(f" - {e}")
|
||||
|
||||
if warnings:
|
||||
print(f"WARNINGS in {book}:")
|
||||
for w in warnings:
|
||||
print(f" - {w}")
|
||||
|
||||
if not errors and not warnings:
|
||||
print(f"{book}: Valid")
|
||||
|
||||
sys.exit(1 if errors else 0)
|
||||
|
||||
|
||||
def cmd_stats(args):
|
||||
"""Show stats for all commentary files."""
|
||||
files = list(DATA_DIR.glob("*.json"))
|
||||
|
||||
print(f"{'Book':<20} {'Chapters':<10} {'Verses':<10}")
|
||||
print("-" * 42)
|
||||
|
||||
total_chapters = 0
|
||||
total_verses = 0
|
||||
|
||||
for filepath in sorted(files):
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
book = data.get("book", filepath.stem)
|
||||
commentary = data.get("commentary", {})
|
||||
|
||||
chapters = len(commentary)
|
||||
verses = sum(len(v) for v in commentary.values() if isinstance(v, dict))
|
||||
|
||||
print(f"{book:<20} {chapters:<10} {verses:<10}")
|
||||
total_chapters += chapters
|
||||
total_verses += verses
|
||||
|
||||
print("-" * 42)
|
||||
print(f"{'TOTAL':<20} {total_chapters:<10} {total_verses:<10}")
|
||||
|
||||
|
||||
def cmd_export_verse(args):
|
||||
"""Export verse with commentary as JSON (for agents)."""
|
||||
book = args.book
|
||||
chapter = args.chapter
|
||||
verse = args.verse
|
||||
|
||||
# Get verse text
|
||||
verse_data = get_verse_text(book, chapter, verse)
|
||||
|
||||
# Get commentary
|
||||
data = load_book_commentary(book)
|
||||
commentary = data.get("commentary", {}).get(str(chapter), {}).get(str(verse))
|
||||
|
||||
output = {
|
||||
"reference": f"{book} {chapter}:{verse}",
|
||||
"text": verse_data.get("text") if verse_data else None,
|
||||
"has_commentary": commentary is not None,
|
||||
"commentary": commentary
|
||||
}
|
||||
|
||||
print(json.dumps(output, indent=2))
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="CLI tool for managing verse commentary",
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
epilog=__doc__
|
||||
)
|
||||
|
||||
subparsers = parser.add_subparsers(dest="command", help="Commands")
|
||||
|
||||
# verse command
|
||||
p_verse = subparsers.add_parser("verse", help="Get verse text")
|
||||
p_verse.add_argument("book", help="Book name")
|
||||
p_verse.add_argument("chapter", type=int, help="Chapter number")
|
||||
p_verse.add_argument("verse", type=int, help="Verse number")
|
||||
p_verse.set_defaults(func=cmd_verse)
|
||||
|
||||
# coverage command
|
||||
p_coverage = subparsers.add_parser("coverage", help="Check top verses coverage")
|
||||
p_coverage.add_argument("-v", "--verbose", action="store_true", help="Show missing verses")
|
||||
p_coverage.set_defaults(func=cmd_coverage)
|
||||
|
||||
# missing command
|
||||
p_missing = subparsers.add_parser("missing", help="List missing verses for a book")
|
||||
p_missing.add_argument("book", help="Book name")
|
||||
p_missing.set_defaults(func=cmd_missing)
|
||||
|
||||
# add command
|
||||
p_add = subparsers.add_parser("add", help="Add commentary for a verse")
|
||||
p_add.add_argument("book", help="Book name")
|
||||
p_add.add_argument("chapter", type=int, help="Chapter number")
|
||||
p_add.add_argument("verse", type=int, help="Verse number")
|
||||
p_add.add_argument("--analysis", required=True, help="Theological analysis")
|
||||
p_add.add_argument("--historical", required=True, help="Historical context")
|
||||
p_add.add_argument("--questions", nargs="+", help="Reflection questions")
|
||||
p_add.add_argument("--force", action="store_true", help="Overwrite existing")
|
||||
p_add.set_defaults(func=cmd_add)
|
||||
|
||||
# validate command
|
||||
p_validate = subparsers.add_parser("validate", help="Validate commentary file")
|
||||
p_validate.add_argument("book", help="Book name")
|
||||
p_validate.set_defaults(func=cmd_validate)
|
||||
|
||||
# stats command
|
||||
p_stats = subparsers.add_parser("stats", help="Show stats for all books")
|
||||
p_stats.set_defaults(func=cmd_stats)
|
||||
|
||||
# export command
|
||||
p_export = subparsers.add_parser("export", help="Export verse with commentary")
|
||||
p_export.add_argument("book", help="Book name")
|
||||
p_export.add_argument("chapter", type=int, help="Chapter number")
|
||||
p_export.add_argument("verse", type=int, help="Verse number")
|
||||
p_export.set_defaults(func=cmd_export_verse)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if not args.command:
|
||||
parser.print_help()
|
||||
sys.exit(1)
|
||||
|
||||
args.func(args)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,56 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Find missing verses in Joshua commentary."""
|
||||
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
PROJECT_ROOT = Path(__file__).parent.parent
|
||||
sys.path.insert(0, str(PROJECT_ROOT))
|
||||
|
||||
from kjvstudy_org.kjv import Bible
|
||||
|
||||
# Load Joshua commentary
|
||||
commentary_path = PROJECT_ROOT / "kjvstudy_org" / "data" / "verse_commentary" / "joshua.json"
|
||||
with open(commentary_path, 'r', encoding='utf-8') as f:
|
||||
commentary_data = json.load(f)
|
||||
|
||||
commentary = commentary_data.get("commentary", {})
|
||||
|
||||
# Get all verses in Joshua from the Bible
|
||||
bible = Bible()
|
||||
|
||||
# Joshua has 24 chapters - known from the book structure
|
||||
JOSHUA_VERSES = {
|
||||
1: 18, 2: 24, 3: 17, 4: 24, 5: 15, 6: 27, 7: 26, 8: 35,
|
||||
9: 27, 10: 43, 11: 23, 12: 24, 13: 33, 14: 15, 15: 63, 16: 10,
|
||||
17: 18, 18: 28, 19: 51, 20: 9, 21: 45, 22: 34, 23: 16, 24: 33
|
||||
}
|
||||
|
||||
missing = []
|
||||
existing_count = 0
|
||||
|
||||
for chapter in range(1, 25):
|
||||
verse_count = JOSHUA_VERSES[chapter]
|
||||
chapter_str = str(chapter)
|
||||
|
||||
chapter_data = commentary.get(chapter_str, {})
|
||||
|
||||
for verse in range(1, verse_count + 1):
|
||||
verse_str = str(verse)
|
||||
|
||||
if verse_str in chapter_data:
|
||||
existing_count += 1
|
||||
else:
|
||||
missing.append((chapter, verse))
|
||||
|
||||
total_verses = sum(JOSHUA_VERSES.values())
|
||||
print(f"Joshua total verses: {total_verses}")
|
||||
print(f"Existing commentary: {existing_count}")
|
||||
print(f"Missing commentary: {len(missing)}")
|
||||
print()
|
||||
|
||||
if missing:
|
||||
print("Missing verses:")
|
||||
for chapter, verse in missing:
|
||||
print(f" {chapter}:{verse}")
|
||||
@@ -1,39 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Find verses in 1 Chronicles that don't have commentary."""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
# 1 Chronicles chapter verse counts
|
||||
CHAPTER_VERSES = {
|
||||
1: 54, 2: 55, 3: 24, 4: 43, 5: 26, 6: 81, 7: 40, 8: 40, 9: 44,
|
||||
10: 14, 11: 47, 12: 40, 13: 14, 14: 17, 15: 29, 16: 43, 17: 27,
|
||||
18: 17, 19: 19, 20: 8, 21: 30, 22: 19, 23: 32, 24: 31, 25: 31,
|
||||
26: 32, 27: 34, 28: 21, 29: 30
|
||||
}
|
||||
|
||||
def main():
|
||||
filepath = Path(__file__).parent.parent / "kjvstudy_org" / "data" / "verse_commentary" / "1_chronicles.json"
|
||||
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
existing = data.get("commentary", {})
|
||||
|
||||
missing = []
|
||||
for chapter, verse_count in CHAPTER_VERSES.items():
|
||||
chapter_str = str(chapter)
|
||||
for verse in range(1, verse_count + 1):
|
||||
verse_str = str(verse)
|
||||
if chapter_str not in existing or verse_str not in existing[chapter_str]:
|
||||
missing.append((chapter, verse))
|
||||
|
||||
print(f"Total verses in 1 Chronicles: {sum(CHAPTER_VERSES.values())}")
|
||||
print(f"Verses with commentary: {sum(len(v) for v in existing.values())}")
|
||||
print(f"Verses missing commentary: {len(missing)}")
|
||||
print("\nFirst 20 missing verses:")
|
||||
for i, (ch, v) in enumerate(missing[:20], 1):
|
||||
print(f"{i}. 1 Chronicles {ch}:{v}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,66 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Find missing commentary verses for a book."""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
PROJECT_ROOT = Path(__file__).parent.parent
|
||||
DATA_DIR = PROJECT_ROOT / "kjvstudy_org" / "data" / "verse_commentary"
|
||||
|
||||
# Standard Bible verse counts
|
||||
VERSE_COUNTS = {
|
||||
"amos": {
|
||||
1: 15, 2: 16, 3: 15, 4: 13, 5: 27, 6: 14, 7: 17, 8: 14, 9: 15
|
||||
},
|
||||
"john": {
|
||||
1: 51, 2: 25, 3: 36, 4: 54, 5: 47, 6: 71, 7: 53, 8: 59,
|
||||
9: 41, 10: 42, 11: 57, 12: 50, 13: 38, 14: 31, 15: 27,
|
||||
16: 33, 17: 26, 18: 40, 19: 42, 20: 31, 21: 25
|
||||
}
|
||||
}
|
||||
|
||||
def find_missing(book_slug):
|
||||
"""Find missing verses for a book."""
|
||||
filepath = DATA_DIR / f"{book_slug}.json"
|
||||
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
commentary = data.get("commentary", {})
|
||||
verse_counts = VERSE_COUNTS[book_slug]
|
||||
|
||||
missing = []
|
||||
total_expected = sum(verse_counts.values())
|
||||
total_found = 0
|
||||
|
||||
for chapter, count in verse_counts.items():
|
||||
chapter_key = str(chapter)
|
||||
chapter_data = commentary.get(chapter_key, {})
|
||||
|
||||
for verse in range(1, count + 1):
|
||||
verse_key = str(verse)
|
||||
if verse_key in chapter_data:
|
||||
total_found += 1
|
||||
else:
|
||||
missing.append(f"{chapter}:{verse}")
|
||||
|
||||
print(f"\n{book_slug.upper()} COMMENTARY STATUS:")
|
||||
print(f"Total verses: {total_expected}")
|
||||
print(f"Verses with commentary: {total_found}")
|
||||
print(f"Missing verses: {len(missing)}")
|
||||
|
||||
if missing:
|
||||
print(f"\nMissing verse references:")
|
||||
for ref in missing:
|
||||
print(f" {ref}")
|
||||
|
||||
return missing
|
||||
|
||||
if __name__ == "__main__":
|
||||
amos_missing = find_missing("amos")
|
||||
john_missing = find_missing("john")
|
||||
|
||||
# Print summary for agent
|
||||
print(f"\n\nSUMMARY:")
|
||||
print(f"Amos: {len(amos_missing)} missing verses")
|
||||
print(f"John: {len(john_missing)} missing verses")
|
||||
@@ -1,61 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Find missing verses in commentary files."""
|
||||
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
PROJECT_ROOT = Path(__file__).parent.parent
|
||||
DATA_DIR = PROJECT_ROOT / "kjvstudy_org" / "data" / "verse_commentary"
|
||||
sys.path.insert(0, str(PROJECT_ROOT))
|
||||
|
||||
from kjvstudy_org.kjv import Bible
|
||||
|
||||
def find_missing(book_name: str):
|
||||
"""Find all verses in a book that don't have commentary."""
|
||||
bible = Bible()
|
||||
|
||||
# Determine slug
|
||||
slug = book_name.lower().replace(" ", "_").replace("song of solomon", "song_of_solomon")
|
||||
filepath = DATA_DIR / f"{slug}.json"
|
||||
|
||||
# Load existing commentary
|
||||
if filepath.exists():
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
else:
|
||||
data = {"book": book_name, "commentary": {}}
|
||||
|
||||
commentary = data.get("commentary", {})
|
||||
|
||||
# Find missing verses by checking all chapters
|
||||
missing = []
|
||||
chapters = bible.get_chapters_for_book(book_name)
|
||||
if not chapters:
|
||||
print(f"Book '{book_name}' not found", file=sys.stderr)
|
||||
return []
|
||||
|
||||
for chapter_num in chapters:
|
||||
verses = bible.get_verses_by_book_chapter(book_name, chapter_num)
|
||||
chapter_verses = commentary.get(str(chapter_num), {})
|
||||
for verse_obj in verses:
|
||||
verse_num = verse_obj.verse
|
||||
if str(verse_num) not in chapter_verses:
|
||||
missing.append((chapter_num, verse_num))
|
||||
|
||||
return missing
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) < 2:
|
||||
print("Usage: python find_missing_verses.py <book_name>")
|
||||
sys.exit(1)
|
||||
|
||||
book = sys.argv[1]
|
||||
missing = find_missing(book)
|
||||
|
||||
if missing:
|
||||
print(f"Missing {len(missing)} verses in {book}:")
|
||||
for ch, v in missing:
|
||||
print(f" {ch}:{v}")
|
||||
else:
|
||||
print(f"All verses covered in {book}")
|
||||
@@ -1,79 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Generate Open Graph social media preview image for KJV Study.
|
||||
|
||||
Creates a 1200x630px image with Tufte-style design matching the site aesthetic.
|
||||
Output: kjvstudy_org/static/og-image.png
|
||||
"""
|
||||
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
# Image dimensions (standard Open Graph size)
|
||||
WIDTH = 1200
|
||||
HEIGHT = 630
|
||||
|
||||
# Colors matching Tufte CSS
|
||||
BG_COLOR = (250, 250, 248) # Off-white background
|
||||
TEXT_COLOR = (17, 17, 17) # Near black for title
|
||||
ACCENT_COLOR = (102, 102, 102) # Gray for subtitle
|
||||
|
||||
# Text content
|
||||
TITLE = "KJV Study"
|
||||
SUBTITLE = "Authorized King James Version Bible"
|
||||
|
||||
def generate_og_image():
|
||||
"""Generate the Open Graph preview image."""
|
||||
|
||||
# Create blank image
|
||||
img = Image.new('RGB', (WIDTH, HEIGHT), BG_COLOR)
|
||||
draw = ImageDraw.Draw(img)
|
||||
|
||||
# Load fonts (Georgia serif to match site typography)
|
||||
try:
|
||||
title_font = ImageFont.truetype("/System/Library/Fonts/Supplemental/Georgia.ttf", 110)
|
||||
subtitle_font = ImageFont.truetype("/System/Library/Fonts/Supplemental/Georgia.ttf", 40)
|
||||
except OSError:
|
||||
# Fallback to default font if Georgia not available
|
||||
print("Warning: Georgia font not found, using default")
|
||||
title_font = ImageFont.load_default()
|
||||
subtitle_font = ImageFont.load_default()
|
||||
|
||||
# Calculate title position (centered)
|
||||
title_bbox = draw.textbbox((0, 0), TITLE, font=title_font)
|
||||
title_width = title_bbox[2] - title_bbox[0]
|
||||
title_height = title_bbox[3] - title_bbox[1]
|
||||
title_x = (WIDTH - title_width) // 2
|
||||
title_y = (HEIGHT - title_height) // 2 - 60
|
||||
|
||||
# Draw title
|
||||
draw.text((title_x, title_y), TITLE, fill=TEXT_COLOR, font=title_font)
|
||||
|
||||
# Calculate subtitle position (centered below title)
|
||||
subtitle_bbox = draw.textbbox((0, 0), SUBTITLE, font=subtitle_font)
|
||||
subtitle_width = subtitle_bbox[2] - subtitle_bbox[0]
|
||||
subtitle_x = (WIDTH - subtitle_width) // 2
|
||||
subtitle_y = title_y + title_height + 40
|
||||
|
||||
# Draw subtitle
|
||||
draw.text((subtitle_x, subtitle_y), SUBTITLE, fill=ACCENT_COLOR, font=subtitle_font)
|
||||
|
||||
# Save to static directory
|
||||
script_dir = Path(__file__).parent
|
||||
project_root = script_dir.parent
|
||||
output_path = project_root / "kjvstudy_org" / "static" / "og-image.png"
|
||||
|
||||
# Create directory if needed
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Save with optimization
|
||||
img.save(output_path, 'PNG', optimize=True)
|
||||
|
||||
print(f"✓ Generated og-image.png")
|
||||
print(f" Location: {output_path}")
|
||||
print(f" Size: {WIDTH}x{HEIGHT}px")
|
||||
print(f" File size: {output_path.stat().st_size / 1024:.1f} KB")
|
||||
|
||||
if __name__ == "__main__":
|
||||
generate_og_image()
|
||||
@@ -1,146 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Generate commentary for Amos missing verses."""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
PROJECT_ROOT = Path(__file__).parent.parent
|
||||
DATA_DIR = PROJECT_ROOT / "kjvstudy_org" / "data" / "verse_commentary"
|
||||
|
||||
# Load existing Amos commentary
|
||||
filepath = DATA_DIR / "amos.json"
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
commentary = data.get("commentary", {})
|
||||
|
||||
# New commentary entries
|
||||
new_entries = {
|
||||
"1": {
|
||||
"14": {
|
||||
"analysis": "<strong>I will kindle a fire in the wall of Rabbah</strong> (אַצִּית אֵשׁ בְּחוֹמַת רַבָּה, *atsit esh b'chomat rabbah*)—God's judgment comes as consuming fire against Ammon's capital. The Hebrew אַצִּית (*atsit*, 'I will kindle') emphasizes divine agency; this is not merely human warfare but Yahweh's direct intervention. <strong>With shouting in the day of battle, with a tempest in the day of the whirlwind</strong> combines military siege (תְּרוּעָה, *teruah*, the war cry) with natural disaster imagery—God orchestrates both human armies and cosmic forces for judgment.<br><br>Rabbah (modern Amman, Jordan) represented Ammonite pride and military power. The 'palaces' (אַרְמְנוֹתֶיהָ, *armenoteha*) symbolize accumulated wealth gained through oppression. This prophecy was fulfilled when Nebuchadnezzar conquered Ammon in 582 BC, though Christ ultimately judges all nations at His return (Matthew 25:31-46).",
|
||||
"historical": "Amos prophesied around 760-750 BC during Jeroboam II's reign. Ammon, descended from Lot (Genesis 19:38), had longstanding enmity with Israel. They committed atrocities against Gilead (Amos 1:13), including ripping open pregnant women to expand territory—crimes that demanded divine retribution.",
|
||||
"questions": [
|
||||
"How does God's sovereignty over nations challenge modern nationalism and the belief that any country is beyond judgment?",
|
||||
"What 'palaces' of accumulated wealth in your life might represent injustice or oppression of others?",
|
||||
"How should the certainty of divine judgment against evil comfort those who suffer injustice today?"
|
||||
]
|
||||
},
|
||||
"15": {
|
||||
"analysis": "<strong>Their king shall go into captivity, he and his princes together</strong> (וְהָלַךְ מַלְכָּם בַּגּוֹלָה, *v'halach malkam bagolah*)—The Hebrew מַלְכָּם (*malkam*) is a wordplay: it means both 'their king' and references Molech/Milcom, the Ammonite deity to whom children were sacrificed (1 Kings 11:5, 33). Both human rulers and false gods prove powerless before Yahweh. <strong>Saith the LORD</strong> (אָמַר יְהוָה, *amar YHWH*) is the prophetic authentication formula—this is not Amos's opinion but God's irrevocable decree.<br><br>The collapse of both political and religious systems signifies total judgment. No refuge remains—not in military might, political alliances, or false worship. This pattern repeats throughout history when nations trust in anything besides the true God.",
|
||||
"historical": "The Babylonian exile fulfilled this prophecy. Archaeological evidence shows Rabbah was destroyed in the 6th century BC. Ironically, Ammonites had long practiced child sacrifice to Molech, and now their god and king both went into captivity—helpless before the covenant God of Israel.",
|
||||
"questions": [
|
||||
"What false 'kings' or authorities do people trust in today instead of the LORD—government, wealth, ideology, self?",
|
||||
"How does the exile of both human rulers and false gods demonstrate that all idolatry ends in captivity?",
|
||||
"In what ways might Christians today be trusting in political power rather than the kingdom of God?"
|
||||
]
|
||||
}
|
||||
},
|
||||
"2": {
|
||||
"15": {
|
||||
"analysis": "In this verse detailing Moab's coming judgment, three classes of warriors prove helpless: <strong>he that handleth the bow</strong> (תֹּפֵשׂ הַקֶּשֶׁת, *tofes haqeshet*, the archer), <strong>he that is swift of foot</strong> (קַל בְּרַגְלָיו, *qal b'raglav*, literally 'light in his feet'), and <strong>he that rideth the horse</strong> (רֹכֵב הַסּוּס, *rochev hasus*, the cavalry). The threefold repetition—'shall not deliver himself' (לֹא יְמַלֵּט, *lo yemalet*)—hammers home human inability to escape divine judgment.<br><br>Ancient warfare relied on these three military advantages: long-range attack (archers), speed (runners for messages and retreat), and mobile power (cavalry). Yet when God judges, no human strategy suffices. This prefigures Romans 8:33—when God justifies, who can condemn? Conversely, when God condemns, no created thing can deliver (Romans 8:38-39).",
|
||||
"historical": "Moab, descended from Lot (Genesis 19:37), occupied territory east of the Dead Sea. They possessed skilled archers and swift-footed messengers. This prophecy found fulfillment in multiple invasions: by Assyria (715 BC), Babylon (582 BC), and finally Arab conquest that erased Moabite identity entirely.",
|
||||
"questions": [
|
||||
"What modern 'advantages'—technology, wealth, intelligence—do people trust for security instead of God?",
|
||||
"How does the futility of military might in escaping judgment challenge nations that trust in weapons?",
|
||||
"If no one can flee from God's judgment, what makes the gospel offer of escape through Christ so extraordinary?"
|
||||
]
|
||||
},
|
||||
"16": {
|
||||
"analysis": "<strong>He that is courageous among the mighty shall flee away naked in that day</strong> (וְאַמִּיץ לִבּוֹ בַגִּבּוֹרִים עָרוֹם יָנוּס, *v'amitz libo bagiborim arom yanus*)—The Hebrew emphasizes irony: אַמִּיץ (*amitz*) means 'strong, courageous,' yet even the bravest warrior flees עָרוֹם (*arom*, 'naked, stripped of armor'). The stripping represents complete defeat and humiliation; ancient warriors viewed losing armor as disgrace worse than death. <strong>Saith the LORD</strong> seals this as prophetic certainty, not military speculation.<br><br>This reversal motif appears throughout Scripture: the proud brought low (Isaiah 2:11-17), the mighty made weak (1 Corinthians 1:27-29). Human courage crumbles before divine judgment—no bravado, ideology, or self-confidence can stand when God rises to judge. Only those covered in Christ's righteousness (Isaiah 61:10) have a covering that endures judgment.",
|
||||
"historical": "Moabite warriors were renowned for courage (2 Kings 3:26-27 records their desperation in battle). Yet Nebuchadnezzar's armies stripped them of both armor and land. The 'nakedness' fulfills the covenant curses of Deuteronomy 28:48—Israel's judgment falling on nations who opposed God's purposes.",
|
||||
"questions": [
|
||||
"What does it mean to face judgment 'naked'—without the covering of Christ's righteousness?",
|
||||
"How does this verse challenge cultures that glorify human courage and strength as ultimate values?",
|
||||
"In what areas of life are you trusting your own 'courage' rather than seeking refuge in God?"
|
||||
]
|
||||
}
|
||||
},
|
||||
"3": {
|
||||
"8": {
|
||||
"analysis": "<strong>The lion hath roared, who will not fear?</strong> (אַרְיֵה שָׁאָג מִי לֹא יִירָא, *aryeh sha'ag mi lo yira*)—Amos uses rhetorical questions to establish cause and effect. The lion's roar (שָׁאָג, *sha'ag*) triggers instinctive fear; similarly, <strong>the Lord GOD hath spoken, who can but prophesy?</strong> (אֲדֹנָי יְהוִה דִּבֶּר מִי לֹא יִנָּבֵא, *Adonai YHWH diber mi lo yinave*). When God speaks (דִּבֶּר, *diber*), the prophet cannot remain silent—prophecy becomes compulsion, not career choice.<br><br>This defends Amos's prophetic authority against critics. He prophesies not from presumption but necessity—God has spoken, therefore he must speak. The same compulsion drove Peter and John: 'We cannot but speak the things which we have seen and heard' (Acts 4:20). True preaching flows from divine encounter, not human agenda.",
|
||||
"historical": "Amos spoke this around 760 BC when confronted by Amaziah the priest at Bethel (Amos 7:10-17), who commanded him to stop prophesying. Amos wasn't a professional prophet but a shepherd whom God seized and sent. This verse justifies his divine commission despite lacking formal prophetic credentials.",
|
||||
"questions": [
|
||||
"How does this verse challenge the modern view of preaching as profession rather than prophetic compulsion?",
|
||||
"When was the last time God's Word created such urgency in you that you couldn't remain silent?",
|
||||
"What does it mean for the church when preachers speak from personal wisdom rather than 'the Lord GOD hath spoken'?"
|
||||
]
|
||||
},
|
||||
"9": {
|
||||
"analysis": "<strong>Publish in the palaces at Ashdod, and in the palaces in the land of Egypt</strong>—God summons pagan nations as witnesses against Israel's sin. The Hebrew הַשְׁמִיעוּ (*hashmi'u*, 'proclaim, announce publicly') demands widespread proclamation. Ashdod (Philistine city) and Egypt (Israel's former oppressor) represent notorious wickedness, yet even they will be shocked by <strong>the great tumults</strong> (מְהוּמֹת רַבּוֹת, *mehumot rabot*, 'great confusion/chaos') and <strong>the oppressed</strong> (עֲשׁוּקִים, *ashuqim*, 'the oppressed/exploited') within Samaria.<br><br>This is devastating irony: Israel, called to be holy and distinct (Exodus 19:6), has become morally inferior to pagans. When God calls the wicked to witness against His people, judgment is certain. Similarly, Jesus said Sodom and Gomorrah would fare better than cities that rejected Him (Matthew 11:23-24).",
|
||||
"historical": "Samaria was Israel's capital, built by Omri (1 Kings 16:24) and famous for wealth and wickedness. By 760 BC, the Northern Kingdom's prosperity under Jeroboam II masked systemic injustice—the rich oppressing the poor while maintaining religious ritual. Archaeological excavations reveal luxury goods and elaborate architecture alongside evidence of extreme economic disparity.",
|
||||
"questions": [
|
||||
"How should it convict us when secular society recognizes injustice that religious people ignore or perpetuate?",
|
||||
"What 'tumults' and 'oppression' might be visible in churches or Christian communities today?",
|
||||
"Why does prosperity often blind religious people to their own sin and social injustice?"
|
||||
]
|
||||
},
|
||||
"10": {
|
||||
"analysis": "<strong>They know not to do right</strong> (וְלֹא־יָדְעוּ עֲשׂוֹת־נְכֹחָה, *v'lo yad'u asot n'chochah*)—The Hebrew יָדְעוּ (*yad'u*, 'to know') implies not mere intellectual ignorance but moral corruption; they've lost the capacity to recognize righteousness. The word נְכֹחָה (*n'chochah*, 'right, straight, honest') contrasts with their crooked dealings. <strong>Who store up violence and robbery in their palaces</strong> (הָאוֹצְרִים חָמָס וָשֹׁד בְּאַרְמְנוֹתֵיהֶם, *ha'otz'rim chamas v'shod b'armenoteihem*)—their wealth is 'stored up' violence (חָמָס, *chamas*) and plunder (שֹׁד, *shod*).<br><br>This indicts economic systems built on exploitation. Their palaces—symbols of success—are actually warehouses of injustice. James 5:1-6 echoes this: the wages of defrauded workers cry out to God. When injustice becomes normalized, people lose moral clarity entirely.",
|
||||
"historical": "During Jeroboam II's reign (793-753 BC), Israel experienced unprecedented prosperity through military expansion and trade. The wealthy elite accumulated luxury goods through predatory lending, land seizure, and corrupt courts. Amos confronts this 'prosperity gospel'—wealth divorced from justice proves spiritual bankruptcy.",
|
||||
"questions": [
|
||||
"How might modern Christians 'store up violence and robbery' through economic systems we benefit from but don't examine?",
|
||||
"What does it mean to lose the ability to recognize what is right due to cultural or economic complicity in injustice?",
|
||||
"How can churches today avoid confusing material prosperity with God's blessing when it's built on exploitation?"
|
||||
]
|
||||
},
|
||||
"11": {
|
||||
"analysis": "<strong>An adversary there shall be even round about the land</strong> (צַר וּסְבִיב הָאָרֶץ, *tzar us'viv ha'aretz*)—The enemy surrounds them completely; no escape remains. The term צַר (*tzar*, 'adversary, enemy, distress') appears with geographical emphasis: וּסְבִיב (*us'viv*, 'all around'). <strong>He shall bring down thy strength from thee</strong> (וְהוֹרִיד מִמֵּךְ עֻזֵּךְ, *v'horid mimech uzech*)—their military power (עֻזֵּךְ, *uzech*) will be 'brought down' (הוֹרִיד, *horid*, literally 'caused to descend'). <strong>Thy palaces shall be spoiled</strong> (וְנָבֹזּוּ אַרְמְנוֹתַיִךְ, *v'navozu armenotayich*)—plundered completely.<br><br>This reverses Israel's covenant promises. God promised protection from enemies (Leviticus 26:6-8), but covenant-breaking brings covenant curses (Leviticus 26:14-17). The Assyrian invasion of 722 BC fulfilled this literally—Samaria fell after three-year siege, and the nation never recovered.",
|
||||
"historical": "In 724 BC, Shalmaneser V of Assyria besieged Samaria; his successor Sargon II completed the conquest in 722 BC. The Assyrians deported 27,290 Israelites according to Assyrian records, replacing them with foreign peoples (2 Kings 17:5-6, 24). The Northern Kingdom ceased to exist—fulfilling Amos's prophecy exactly.",
|
||||
"questions": [
|
||||
"How does breaking covenant with God remove His protection and guarantee judgment?",
|
||||
"What false securities—military might, economic power, political alliances—do nations trust in today?",
|
||||
"How should the certainty of God's judgment against covenant-breaking inform Christian faithfulness in our generation?"
|
||||
]
|
||||
},
|
||||
"12": {
|
||||
"analysis": "The shepherd metaphor is devastatingly ironic: <strong>As the shepherd taketh out of the mouth of the lion two legs, or a piece of an ear</strong> (כַּאֲשֶׁר יַצִּיל הָרֹעֶה מִפִּי הָאַרְיֵה, *ka'asher yatzil haro'eh mipi ha'aryeh*)—these aren't rescued sheep but proof of death for the shepherd's legal defense (Exodus 22:13). Similarly, <strong>so shall the children of Israel be taken out</strong> (כֵּן יִנָּצְלוּ בְנֵי־יִשְׂרָאֵל, *ken yinatz'lu b'nei yisrael*)—a remnant survives, but barely. <strong>In the corner of a bed, and in Damascus in a couch</strong> describes luxury furniture fragments—all that remains of their opulence.<br><br>The Hebrew יִנָּצְלוּ (*yinatz'lu*) typically means 'delivered/rescued,' but here it's bitterly ironic: they're 'delivered' only as evidence of destruction. Like torn sheep parts, Israel will be reduced to fragments—a warning that affluence cannot protect from judgment.",
|
||||
"historical": "This prophecy was fulfilled multiply: the Assyrian conquest left only remnants, the Babylonian exile scattered survivors, and even today the ten northern tribes remain 'lost.' The reference to Damascus (Syria) and luxury couches emphasizes that those trusting in wealth and political alliances would be first to suffer.",
|
||||
"questions": [
|
||||
"How does this verse challenge the modern belief that material prosperity indicates God's favor?",
|
||||
"What does it mean to be 'saved' yet only as a fragment—bearing permanent marks of judgment?",
|
||||
"How should the reality of judgment as a consuming 'lion' shape Christian urgency in evangelism?"
|
||||
]
|
||||
},
|
||||
"13": {
|
||||
"analysis": "<strong>Hear ye, and testify in the house of Jacob</strong> (שִׁמְעוּ וְהָעִידוּ בְּבֵית יַעֲקֹב, *shim'u v'ha'idu b'veit ya'akov*)—The Hebrew הָעִידוּ (*ha'idu*, 'testify, bear witness') is legal language; God calls witnesses against His people. The use of 'Jacob' rather than 'Israel' may emphasize their unchanged carnal nature—still deceivers like their ancestor. <strong>Saith the Lord GOD, the God of hosts</strong> (נְאֻם אֲדֹנָי יְהוִה אֱלֹהֵי הַצְּבָאוֹת, *ne'um Adonai YHWH Elohei hatzva'ot*)—triple divine titles underscore absolute authority: Adonai (Lord/Master), YHWH (covenant name), Elohei hatzva'ot (God of heavenly armies).<br><br>This courtroom scene portrays God prosecuting His covenant lawsuit (רִיב, *riv*) against Israel. The same God who delivered them now testifies against them—a tragic reversal. Yet even in judgment, God calls witnesses, maintaining judicial righteousness rather than acting as arbitrary tyrant.",
|
||||
"historical": "The covenant lawsuit (prophetic *riv*) was a standard Ancient Near Eastern legal form. God isn't violating His covenant but enforcing it through its curse provisions (Deuteronomy 28-29). This public witness ensures Israel cannot claim ignorance or injustice when judgment falls.",
|
||||
"questions": [
|
||||
"How does God's use of legal process even in judgment display His righteousness and patience?",
|
||||
"What does it mean that God testifies against His own people—those who bear His name?",
|
||||
"How should churches today respond when God's Word testifies against their practices?"
|
||||
]
|
||||
},
|
||||
"14": {
|
||||
"analysis": "<strong>In the day that I shall visit the transgressions of Israel upon him</strong> (בְּיוֹם פָּקְדִי פִשְׁעֵי־יִשְׂרָאֵל עָלָיו, *b'yom pokdi pish'ei yisrael alav*)—The verb פָּקַד (*pakad*, 'visit, attend to, punish') appears frequently in judgment contexts; God's 'visitation' brings reckoning. <strong>I will also visit the altars of Beth-el</strong> (וּפָקַדְתִּי עַל־מִזְבְּחוֹת בֵּית־אֵל, *ufakadti al-mizbechot beit-el*)—Bethel's golden calf altar, established by Jeroboam I (1 Kings 12:28-29), epitomized Israel's syncretistic worship. <strong>The horns of the altar shall be cut off</strong> (וְנִגְדְּעוּ קַרְנוֹת הַמִּזְבֵּחַ, *v'nigde'u karnot hamizbeach*)—altar horns provided sanctuary (1 Kings 1:50), but now even that refuge is destroyed.<br><br>The cutting off of altar horns symbolizes judgment reaching even sacred spaces. No false worship, religious tradition, or holy place can protect covenant-breakers. This prefigures Christ's prophecy that Jerusalem's temple would be destroyed (Matthew 24:1-2)—structures of false confidence collapse under divine judgment.",
|
||||
"historical": "Bethel ('House of God') was where Jacob encountered God (Genesis 28:19), making Jeroboam's idolatry there particularly blasphemous. This sanctuary became the center of Israel's apostate worship. In 722 BC, the Assyrians destroyed these altars; Josiah later desecrated the site completely (2 Kings 23:15-16).",
|
||||
"questions": [
|
||||
"What false refuges—religious traditions, church buildings, rituals—do people trust instead of Christ alone?",
|
||||
"How does God's judgment on religious institutions that bear His name warn contemporary churches?",
|
||||
"In what ways might modern Christians be like Israel—maintaining religious forms while living in covenant unfaithfulness?"
|
||||
]
|
||||
},
|
||||
"15": {
|
||||
"analysis": "<strong>I will smite the winter house with the summer house</strong> (וְהִכֵּיתִי בֵית־הַחֹרֶף עַל־בֵּית הַקָּיִץ, *v'hikeiti beit-hachoref al-beit hakayitz*)—The wealthy maintained separate residences for different seasons; winter houses were typically in valleys, summer houses on cool heights. God will strike both simultaneously. <strong>The houses of ivory shall perish</strong> (וְאָבְדוּ בָּתֵּי הַשֵּׁן, *v'avdu batei hashen*, literally 'houses of tooth/ivory')—ivory inlays represented extreme luxury (1 Kings 22:39 mentions Ahab's ivory house). <strong>The great houses shall have an end</strong> (וְסָפוּ בָּתִּים רַבִּים, *v'safu batim rabim*)—utter destruction.<br><br>This passage condemns not wealth itself but wealth gained through oppression (Amos 3:10) and maintained through indifference to poverty (Amos 6:4-6). Jesus echoed this in the parable of the rich fool (Luke 12:16-21)—accumulated luxury without God is death. Archaeological excavations at Samaria confirm extensive ivory decorations, fulfilling this prophecy's specificity.",
|
||||
"historical": "The Northern Kingdom's aristocracy lived in unprecedented luxury during Jeroboam II's reign. Ivory fragments discovered at Samaria (1931-1935 excavations) confirm palace opulence. When Assyria conquered in 722 BC, these houses were destroyed—the wealthy who trusted in comfort experienced the judgment they'd ignored.",
|
||||
"questions": [
|
||||
"How does having multiple homes or excessive luxury while others suffer represent covenant unfaithfulness?",
|
||||
"What 'houses of ivory'—symbols of accumulated comfort—might blind Christians today to injustice and coming judgment?",
|
||||
"How can believers hold wealth and possessions with open hands, recognizing they belong to God and will not endure?"
|
||||
]
|
||||
}
|
||||
},
|
||||
"4": {
|
||||
"13": {
|
||||
"analysis": "This doxology proclaims Yahweh's cosmic sovereignty: <strong>He that formeth the mountains</strong> (יֹצֵר הָרִים, *yotzer harim*)—the participle emphasizes continuous creative power. <strong>And createth the wind</strong> (וּבֹרֵא רוּחַ, *uvore ruach*)—רוּחַ (*ruach*) means both 'wind' and 'spirit,' suggesting God's control over both physical and spiritual realms. <strong>And declareth unto man what is his thought</strong> (וּמַגִּיד לְאָדָם מַה־שֵּׂחוֹ, *umagid l'adam mah-secho*)—God reveals His purposes to humans through prophetic revelation. <strong>That maketh the morning darkness</strong> (עֹשֶׂה שַׁחַר עֵיפָה, *oseh shachar eifah*)—He controls day and night. <strong>And treadeth upon the high places of the earth</strong> (וְדֹרֵךְ עַל־בָּמֳתֵי אָרֶץ, *v'dorech al-bamotei aretz*)—walking on earth's high places demonstrates absolute authority. <strong>The LORD, The God of hosts, is his name</strong> (יְהוָה אֱלֹהֵי־צְבָאוֹת שְׁמוֹ, *YHWH Elohei-tzva'ot sh'mo*).<br><br>This hymnic interruption follows severe judgment oracles, reminding Israel who they're resisting. The God who judges is the Creator-Sustainer of all reality. Similar doxologies appear in Amos 5:8-9 and 9:5-6, structuring the book around God's cosmic majesty—rebellion against such a God guarantees destruction.",
|
||||
"historical": "These doxological fragments may derive from ancient Israelite hymns. Their placement after judgment oracles serves theological purpose: reminding hearers that Amos speaks for the sovereign Creator, not merely offering political opinion. The phrases echo creation language from Genesis and anticipate New Testament Christology (Colossians 1:15-17).",
|
||||
"questions": [
|
||||
"How does recognizing God as Creator of mountains and wind humble human pride and self-sufficiency?",
|
||||
"What does it mean that the same God who reveals His thoughts is also the God who judges sin?",
|
||||
"How should God's cosmic sovereignty shape our understanding of His authority to judge nations and individuals?"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Continue in next part...
|
||||
@@ -1,93 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Generate static sitemap for all 31,102 Bible verses.
|
||||
|
||||
This sitemap is static because verse URLs never change. Generate once,
|
||||
commit to repo, and reference from sitemap index. Zero runtime cost,
|
||||
maximum SEO discoverability.
|
||||
|
||||
Why static?
|
||||
-----------
|
||||
- Verse URLs are completely static (Genesis 1:1 will always be at the same URL)
|
||||
- Regenerating 31k URLs on every sitemap request wastes CPU time
|
||||
- Static file can be cached indefinitely by CDN and browsers
|
||||
- Google prioritizes URLs in sitemaps for crawling
|
||||
- This approach gives us both speed AND discoverability
|
||||
|
||||
When to regenerate:
|
||||
-------------------
|
||||
- Never, unless the URL structure for verses changes
|
||||
- The Bible text hasn't changed in 2000+ years, URLs won't either
|
||||
|
||||
Usage:
|
||||
------
|
||||
uv run python scripts/generate_verse_sitemap.py > kjvstudy_org/static/sitemap-verses.xml
|
||||
git add kjvstudy_org/static/sitemap-verses.xml
|
||||
git commit -m "Update verse sitemap"
|
||||
"""
|
||||
import sys
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
# Suppress WeasyPrint warnings during import
|
||||
# Redirect stdout temporarily to suppress import warnings
|
||||
from io import StringIO
|
||||
old_stdout = sys.stdout
|
||||
old_stderr = sys.stderr
|
||||
sys.stdout = StringIO()
|
||||
sys.stderr = StringIO()
|
||||
|
||||
# Add parent directory to path to import kjv module
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||
|
||||
from kjvstudy_org.kjv import bible
|
||||
|
||||
# Restore stdout/stderr
|
||||
sys.stdout = old_stdout
|
||||
sys.stderr = old_stderr
|
||||
|
||||
|
||||
def generate_verse_sitemap():
|
||||
"""Generate sitemap XML for all verses in the Bible."""
|
||||
base_url = "https://kjvstudy.org"
|
||||
|
||||
# Static date - these URLs never change
|
||||
lastmod = "2024-01-01"
|
||||
|
||||
sitemap_xml = """<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
"""
|
||||
|
||||
# Get all books
|
||||
books = bible.get_books()
|
||||
verse_count = 0
|
||||
|
||||
for book in books:
|
||||
# Get all chapters for this book
|
||||
chapters = bible.get_chapters_for_book(book)
|
||||
|
||||
for chapter in chapters:
|
||||
# Get all verses in this chapter
|
||||
verses = bible.get_verses_by_book_chapter(book, chapter)
|
||||
|
||||
for verse_num in range(1, len(verses) + 1):
|
||||
sitemap_xml += f""" <url>
|
||||
<loc>{base_url}/book/{book}/chapter/{chapter}/verse/{verse_num}</loc>
|
||||
<lastmod>{lastmod}</lastmod>
|
||||
<changefreq>never</changefreq>
|
||||
<priority>0.4</priority>
|
||||
</url>
|
||||
"""
|
||||
verse_count += 1
|
||||
|
||||
sitemap_xml += "</urlset>\n"
|
||||
|
||||
# Print stats to stderr so stdout is clean XML
|
||||
print(f"Generated sitemap with {verse_count} verses", file=sys.stderr)
|
||||
print(f"Size: {len(sitemap_xml):,} bytes", file=sys.stderr)
|
||||
|
||||
return sitemap_xml
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(generate_verse_sitemap())
|
||||
@@ -1,36 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Get verse texts for missing Joshua verses."""
|
||||
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
PROJECT_ROOT = Path(__file__).parent.parent
|
||||
sys.path.insert(0, str(PROJECT_ROOT))
|
||||
|
||||
from kjvstudy_org.kjv import Bible
|
||||
|
||||
bible = Bible()
|
||||
|
||||
MISSING = [
|
||||
(17, 16), (17, 17), (17, 18),
|
||||
(18, 4), (18, 5), (18, 6), (18, 7), (18, 8), (18, 9), (18, 10),
|
||||
(18, 11), (18, 12), (18, 13), (18, 14), (18, 15), (18, 16), (18, 17),
|
||||
(18, 18), (18, 19), (18, 20), (18, 21), (18, 22), (18, 23), (18, 24),
|
||||
(18, 25), (18, 26), (18, 27), (18, 28),
|
||||
(19, 37), (19, 38), (19, 39), (19, 40), (19, 41), (19, 42), (19, 43),
|
||||
(19, 44), (19, 45), (19, 46), (19, 47), (19, 48), (19, 49), (19, 50),
|
||||
(19, 51),
|
||||
(20, 4), (20, 5), (20, 6), (20, 7), (20, 8), (20, 9),
|
||||
(22, 31), (22, 32), (22, 33), (22, 34),
|
||||
(24, 25), (24, 26), (24, 27), (24, 28), (24, 29), (24, 30), (24, 31),
|
||||
(24, 32), (24, 33)
|
||||
]
|
||||
|
||||
verses = {}
|
||||
for chapter, verse in MISSING:
|
||||
text = bible.get_verse_text("Joshua", chapter, verse)
|
||||
key = f"{chapter}:{verse}"
|
||||
verses[key] = text
|
||||
|
||||
print(json.dumps(verses, indent=2))
|
||||
@@ -1,40 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Get verse texts for missing commentary."""
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
PROJECT_ROOT = Path(__file__).parent.parent
|
||||
sys.path.insert(0, str(PROJECT_ROOT))
|
||||
|
||||
from kjvstudy_org.kjv import Bible
|
||||
|
||||
bible = Bible()
|
||||
|
||||
# Amos missing verses
|
||||
amos_refs = [
|
||||
"1:14", "1:15", "2:15", "2:16", "3:8", "3:9", "3:10", "3:11", "3:12", "3:13", "3:14", "3:15",
|
||||
"4:13", "5:25", "5:26", "5:27", "6:2", "6:3", "6:4", "6:5", "6:6", "6:7", "6:8", "6:9",
|
||||
"6:10", "6:11", "6:12", "6:13", "6:14", "7:15", "7:16", "7:17", "8:12", "8:13", "8:14",
|
||||
"9:14", "9:15"
|
||||
]
|
||||
|
||||
# John missing verses
|
||||
john_refs = [
|
||||
"8:59", "10:31", "10:32", "10:33", "10:34", "10:35", "10:36", "10:37", "10:38", "10:39",
|
||||
"10:40", "10:41", "10:42", "13:38", "14:28", "14:29", "14:30", "14:31", "15:27", "17:22",
|
||||
"17:23", "17:24", "17:25", "17:26", "19:31", "19:32", "19:33", "19:34", "19:35", "19:36",
|
||||
"19:37", "19:38", "19:39", "19:40", "19:41", "19:42"
|
||||
]
|
||||
|
||||
print("=== AMOS VERSES ===\n")
|
||||
for ref in amos_refs:
|
||||
ch, v = ref.split(":")
|
||||
text = bible.get_verse_text("Amos", int(ch), int(v))
|
||||
print(f"Amos {ref}: {text}\n")
|
||||
|
||||
print("\n\n=== JOHN VERSES ===\n")
|
||||
for ref in john_refs:
|
||||
ch, v = ref.split(":")
|
||||
text = bible.get_verse_text("John", int(ch), int(v))
|
||||
print(f"John {ref}: {text}\n")
|
||||
@@ -1,28 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Get verse text for a list of references."""
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
PROJECT_ROOT = Path(__file__).parent.parent
|
||||
sys.path.insert(0, str(PROJECT_ROOT))
|
||||
|
||||
from kjvstudy_org.kjv import Bible
|
||||
|
||||
# Missing Acts verses
|
||||
refs = [
|
||||
(14, 28), (17, 33), (17, 34), (19, 36), (19, 37), (19, 38), (19, 39), (19, 40), (19, 41),
|
||||
(22, 25), (22, 26), (22, 27), (22, 28), (22, 29), (22, 30),
|
||||
(25, 17), (25, 18), (25, 19), (25, 20), (25, 21), (25, 22), (25, 23), (25, 24), (25, 25), (25, 26), (25, 27),
|
||||
(26, 30), (26, 31), (26, 32),
|
||||
(27, 43), (27, 44),
|
||||
(28, 29), (28, 30), (28, 31)
|
||||
]
|
||||
|
||||
bible = Bible()
|
||||
|
||||
for ch, v in refs:
|
||||
text = bible.get_verse_text("Acts", ch, v)
|
||||
print(f"Acts {ch}:{v}")
|
||||
print(f" {text}")
|
||||
print()
|
||||
@@ -1,134 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
List verses without substantive commentary.
|
||||
|
||||
Usage:
|
||||
python scripts/list_unwritten_commentary.py # List all verses without commentary
|
||||
python scripts/list_unwritten_commentary.py --book John # List verses in John without commentary
|
||||
python scripts/list_unwritten_commentary.py --book John --chapter 3 # List verses in John 3
|
||||
python scripts/list_unwritten_commentary.py --stats # Show statistics only
|
||||
python scripts/list_unwritten_commentary.py --random 10 # Show 10 random verses without commentary
|
||||
"""
|
||||
|
||||
import sys
|
||||
import argparse
|
||||
import random
|
||||
from pathlib import Path
|
||||
|
||||
# Add parent directory to path to import kjv module
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||
|
||||
from kjvstudy_org.kjv import bible
|
||||
from kjvstudy_org.utils.commentary_loader import load_commentary
|
||||
|
||||
|
||||
def get_all_verses():
|
||||
"""Get all verses in the Bible with their references"""
|
||||
all_verses = []
|
||||
for verse in bible.iter_verses():
|
||||
all_verses.append({
|
||||
'book': verse.book,
|
||||
'chapter': verse.chapter,
|
||||
'verse': verse.verse,
|
||||
'text': verse.text
|
||||
})
|
||||
return all_verses
|
||||
|
||||
|
||||
def has_commentary(commentary_data, book, chapter, verse):
|
||||
"""Check if a verse has commentary"""
|
||||
return (book in commentary_data and
|
||||
chapter in commentary_data[book] and
|
||||
verse in commentary_data[book][chapter])
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description='List verses without commentary')
|
||||
parser.add_argument('--book', help='Filter by book name')
|
||||
parser.add_argument('--chapter', type=int, help='Filter by chapter (requires --book)')
|
||||
parser.add_argument('--stats', action='store_true', help='Show statistics only')
|
||||
parser.add_argument('--random', type=int, metavar='N', help='Show N random verses without commentary')
|
||||
parser.add_argument('--limit', type=int, help='Limit output to N verses')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Load commentary data
|
||||
commentary = load_commentary()
|
||||
|
||||
# Get all verses
|
||||
all_verses = get_all_verses()
|
||||
|
||||
# Filter verses
|
||||
filtered = all_verses
|
||||
if args.book:
|
||||
filtered = [v for v in filtered if v['book'] == args.book]
|
||||
if not filtered:
|
||||
print(f"Book '{args.book}' not found or has no verses")
|
||||
return
|
||||
|
||||
if args.chapter is not None:
|
||||
if not args.book:
|
||||
print("Error: --chapter requires --book")
|
||||
return
|
||||
filtered = [v for v in filtered if v['chapter'] == args.chapter]
|
||||
|
||||
# Find verses without commentary
|
||||
without_commentary = [
|
||||
v for v in filtered
|
||||
if not has_commentary(commentary, v['book'], v['chapter'], v['verse'])
|
||||
]
|
||||
|
||||
total_verses = len(filtered)
|
||||
without_count = len(without_commentary)
|
||||
with_count = total_verses - without_count
|
||||
|
||||
# Show statistics
|
||||
if args.stats or not args.random:
|
||||
filter_desc = ""
|
||||
if args.book and args.chapter:
|
||||
filter_desc = f" in {args.book} {args.chapter}"
|
||||
elif args.book:
|
||||
filter_desc = f" in {args.book}"
|
||||
|
||||
print(f"Verse Commentary Statistics{filter_desc}:")
|
||||
print(f" Total verses: {total_verses:,}")
|
||||
print(f" With commentary: {with_count:,} ({100*with_count/total_verses:.1f}%)")
|
||||
print(f" Without commentary: {without_count:,} ({100*without_count/total_verses:.1f}%)")
|
||||
print()
|
||||
|
||||
if args.stats:
|
||||
# Show breakdown by book
|
||||
books_without = {}
|
||||
for v in without_commentary:
|
||||
book = v['book']
|
||||
books_without[book] = books_without.get(book, 0) + 1
|
||||
|
||||
if books_without:
|
||||
print("Verses without commentary by book:")
|
||||
for book, count in sorted(books_without.items(), key=lambda x: x[1], reverse=True)[:20]:
|
||||
print(f" {book}: {count}")
|
||||
return
|
||||
|
||||
# Show verses
|
||||
verses_to_show = without_commentary
|
||||
|
||||
if args.random:
|
||||
verses_to_show = random.sample(without_commentary, min(args.random, len(without_commentary)))
|
||||
elif args.limit:
|
||||
verses_to_show = without_commentary[:args.limit]
|
||||
|
||||
if verses_to_show:
|
||||
print("Verses without commentary:")
|
||||
print()
|
||||
for v in verses_to_show:
|
||||
ref = f"{v['book']} {v['chapter']}:{v['verse']}"
|
||||
text_preview = v['text'][:100] + "..." if len(v['text']) > 100 else v['text']
|
||||
print(f"{ref}")
|
||||
print(f" {text_preview}")
|
||||
print()
|
||||
else:
|
||||
print("All verses in the specified range have commentary!")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -1,40 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Merge new commentary into Joshua file."""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
PROJECT_ROOT = Path(__file__).parent.parent
|
||||
|
||||
# Load existing Joshua commentary
|
||||
joshua_path = PROJECT_ROOT / "kjvstudy_org" / "data" / "verse_commentary" / "joshua.json"
|
||||
with open(joshua_path, 'r', encoding='utf-8') as f:
|
||||
joshua_data = json.load(f)
|
||||
|
||||
# Load new commentary
|
||||
new_commentary_path = Path("/tmp/joshua_new_commentary.json")
|
||||
with open(new_commentary_path, 'r', encoding='utf-8') as f:
|
||||
new_data = json.load(f)
|
||||
|
||||
# Merge the commentary
|
||||
for chapter, verses in new_data.items():
|
||||
if chapter not in joshua_data["commentary"]:
|
||||
joshua_data["commentary"][chapter] = {}
|
||||
|
||||
for verse, content in verses.items():
|
||||
# Only add if not already present
|
||||
if verse not in joshua_data["commentary"][chapter]:
|
||||
joshua_data["commentary"][chapter][verse] = content
|
||||
print(f"Added commentary for Joshua {chapter}:{verse}")
|
||||
else:
|
||||
print(f"Skipped Joshua {chapter}:{verse} (already exists)")
|
||||
|
||||
# Save the updated file
|
||||
with open(joshua_path, 'w', encoding='utf-8') as f:
|
||||
json.dump(joshua_data, f, ensure_ascii=False, indent=2)
|
||||
|
||||
print(f"\nSaved updated commentary to {joshua_path}")
|
||||
|
||||
# Count totals
|
||||
total_verses = sum(len(verses) for verses in joshua_data["commentary"].values() if isinstance(verses, dict))
|
||||
print(f"Total verses with commentary: {total_verses}")
|
||||
@@ -1,201 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Migrate commentary from verse_commentary.json (root) to per-book files.
|
||||
|
||||
Only migrates verses that DON'T already exist in the per-book files.
|
||||
Leaves duplicates in the source file for review.
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
# Paths
|
||||
ROOT_FILE = Path(__file__).parent.parent / "verse_commentary.json"
|
||||
DATA_DIR = Path(__file__).parent.parent / "kjvstudy_org" / "data" / "verse_commentary"
|
||||
|
||||
|
||||
def slugify(book: str) -> str:
|
||||
"""Create filesystem-friendly file name for a book."""
|
||||
import re
|
||||
slug = re.sub(r"[^a-z0-9]+", "_", book.lower())
|
||||
slug = re.sub(r"_+", "_", slug).strip("_")
|
||||
return slug or "book"
|
||||
|
||||
|
||||
def load_root_commentary():
|
||||
"""Load the root verse_commentary.json file."""
|
||||
if not ROOT_FILE.exists():
|
||||
print(f"Source file not found: {ROOT_FILE}")
|
||||
return []
|
||||
|
||||
with open(ROOT_FILE, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
# Handle both array format and object format
|
||||
if isinstance(data, list):
|
||||
return data
|
||||
elif isinstance(data, dict):
|
||||
# If it's a dict with book as key, convert to list format
|
||||
return [{"book": book, "commentary": chapters} for book, chapters in data.items()]
|
||||
return []
|
||||
|
||||
|
||||
def load_book_file(book_name: str) -> dict:
|
||||
"""Load existing per-book commentary file."""
|
||||
slug = slugify(book_name)
|
||||
book_file = DATA_DIR / f"{slug}.json"
|
||||
|
||||
if not book_file.exists():
|
||||
return {"book": book_name, "commentary": {}}
|
||||
|
||||
with open(book_file, 'r', encoding='utf-8') as f:
|
||||
return json.load(f)
|
||||
|
||||
|
||||
def save_book_file(book_name: str, data: dict):
|
||||
"""Save per-book commentary file."""
|
||||
slug = slugify(book_name)
|
||||
book_file = DATA_DIR / f"{slug}.json"
|
||||
|
||||
with open(book_file, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, ensure_ascii=False, indent=2)
|
||||
|
||||
print(f" Saved: {book_file.name}")
|
||||
|
||||
|
||||
def main():
|
||||
print("=" * 70)
|
||||
print("COMMENTARY MIGRATION")
|
||||
print("=" * 70)
|
||||
print()
|
||||
print(f"Source: {ROOT_FILE}")
|
||||
print(f"Target: {DATA_DIR}")
|
||||
print()
|
||||
|
||||
# Load source data
|
||||
source_data = load_root_commentary()
|
||||
if not source_data:
|
||||
print("No source data to migrate.")
|
||||
return
|
||||
|
||||
print(f"Found {len(source_data)} book entries in source file")
|
||||
print()
|
||||
|
||||
# Track statistics
|
||||
total_migrated = 0
|
||||
total_duplicates = 0
|
||||
duplicates_by_book = {}
|
||||
|
||||
# Process each book
|
||||
for book_entry in source_data:
|
||||
book_name = book_entry.get("book")
|
||||
new_commentary = book_entry.get("commentary", {})
|
||||
|
||||
if not book_name or not new_commentary:
|
||||
continue
|
||||
|
||||
print(f"Processing: {book_name}")
|
||||
|
||||
# Load existing book file
|
||||
existing_data = load_book_file(book_name)
|
||||
existing_commentary = existing_data.get("commentary", {})
|
||||
|
||||
migrated_count = 0
|
||||
duplicate_count = 0
|
||||
duplicate_verses = []
|
||||
|
||||
# Check each chapter/verse
|
||||
for chapter_str, verses in new_commentary.items():
|
||||
if not isinstance(verses, dict):
|
||||
continue
|
||||
|
||||
for verse_str, entry in verses.items():
|
||||
# Check if verse already exists
|
||||
existing_chapter = existing_commentary.get(chapter_str, {})
|
||||
|
||||
if verse_str in existing_chapter:
|
||||
# Duplicate - don't overwrite
|
||||
duplicate_count += 1
|
||||
duplicate_verses.append(f"{chapter_str}:{verse_str}")
|
||||
else:
|
||||
# New verse - migrate it
|
||||
if chapter_str not in existing_commentary:
|
||||
existing_commentary[chapter_str] = {}
|
||||
existing_commentary[chapter_str][verse_str] = entry
|
||||
migrated_count += 1
|
||||
|
||||
# Save updated book file if we migrated anything
|
||||
if migrated_count > 0:
|
||||
existing_data["commentary"] = existing_commentary
|
||||
save_book_file(book_name, existing_data)
|
||||
|
||||
print(f" Migrated: {migrated_count} verses")
|
||||
print(f" Duplicates (skipped): {duplicate_count} verses")
|
||||
|
||||
if duplicate_verses:
|
||||
duplicates_by_book[book_name] = duplicate_verses
|
||||
|
||||
total_migrated += migrated_count
|
||||
total_duplicates += duplicate_count
|
||||
print()
|
||||
|
||||
# Summary
|
||||
print("=" * 70)
|
||||
print("MIGRATION SUMMARY")
|
||||
print("=" * 70)
|
||||
print(f"Total verses migrated: {total_migrated}")
|
||||
print(f"Total duplicates skipped: {total_duplicates}")
|
||||
print()
|
||||
|
||||
if duplicates_by_book:
|
||||
print("DUPLICATES BY BOOK (for review):")
|
||||
print("-" * 70)
|
||||
for book, verses in duplicates_by_book.items():
|
||||
print(f"\n{book}:")
|
||||
for v in verses[:10]: # Show first 10
|
||||
print(f" {v}")
|
||||
if len(verses) > 10:
|
||||
print(f" ... and {len(verses) - 10} more")
|
||||
|
||||
# Create a new file with only duplicates for review
|
||||
if total_duplicates > 0:
|
||||
print()
|
||||
print("Creating duplicates file for review...")
|
||||
duplicates_data = []
|
||||
|
||||
for book_entry in source_data:
|
||||
book_name = book_entry.get("book")
|
||||
if book_name not in duplicates_by_book:
|
||||
continue
|
||||
|
||||
dup_verses = set(duplicates_by_book[book_name])
|
||||
dup_commentary = {}
|
||||
|
||||
for chapter_str, verses in book_entry.get("commentary", {}).items():
|
||||
if not isinstance(verses, dict):
|
||||
continue
|
||||
for verse_str, entry in verses.items():
|
||||
if f"{chapter_str}:{verse_str}" in dup_verses:
|
||||
if chapter_str not in dup_commentary:
|
||||
dup_commentary[chapter_str] = {}
|
||||
dup_commentary[chapter_str][verse_str] = entry
|
||||
|
||||
if dup_commentary:
|
||||
duplicates_data.append({
|
||||
"book": book_name,
|
||||
"commentary": dup_commentary
|
||||
})
|
||||
|
||||
if duplicates_data:
|
||||
dup_file = Path(__file__).parent.parent / "verse_commentary_duplicates.json"
|
||||
with open(dup_file, 'w', encoding='utf-8') as f:
|
||||
json.dump(duplicates_data, f, ensure_ascii=False, indent=2)
|
||||
print(f"Saved duplicates to: {dup_file}")
|
||||
|
||||
print()
|
||||
print("Done! Review duplicates if any, then delete source file.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,201 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Red Letter Edition Statistics
|
||||
|
||||
This script analyzes and displays statistics about the red letter verses
|
||||
(words of Jesus Christ) in the KJV Study Bible.
|
||||
|
||||
Usage:
|
||||
python scripts/red_letter_stats.py
|
||||
uv run python scripts/red_letter_stats.py
|
||||
"""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
from collections import Counter, defaultdict
|
||||
|
||||
|
||||
def load_red_letter_data():
|
||||
"""Load the red letter verses JSON file."""
|
||||
data_path = Path(__file__).parent.parent / "kjvstudy_org" / "data" / "red_letter_verses.json"
|
||||
|
||||
with open(data_path, 'r', encoding='utf-8') as f:
|
||||
return json.load(f)
|
||||
|
||||
|
||||
def parse_verse_reference(ref):
|
||||
"""Parse a verse reference like 'Matthew 3:15' into components."""
|
||||
parts = ref.rsplit(' ', 1)
|
||||
book = parts[0]
|
||||
chapter_verse = parts[1].split(':')
|
||||
chapter = int(chapter_verse[0])
|
||||
verse = int(chapter_verse[1])
|
||||
return book, chapter, verse
|
||||
|
||||
|
||||
def analyze_red_letter_data(data):
|
||||
"""Analyze the red letter verses and return statistics."""
|
||||
verses = data['verses']
|
||||
|
||||
# Basic counts
|
||||
total_verses = len(verses)
|
||||
full_verses = sum(1 for v in verses.values() if v == 'full')
|
||||
partial_verses = total_verses - full_verses
|
||||
|
||||
# Count by book
|
||||
books = Counter()
|
||||
full_by_book = Counter()
|
||||
partial_by_book = Counter()
|
||||
|
||||
# Track consecutive verses (discourses)
|
||||
discourses = []
|
||||
current_discourse = []
|
||||
last_book = None
|
||||
last_chapter = None
|
||||
last_verse = None
|
||||
|
||||
for ref, text in sorted(verses.items()):
|
||||
book, chapter, verse = parse_verse_reference(ref)
|
||||
|
||||
books[book] += 1
|
||||
|
||||
if text == 'full':
|
||||
full_by_book[book] += 1
|
||||
else:
|
||||
partial_by_book[book] += 1
|
||||
|
||||
# Track discourses (consecutive verses)
|
||||
if (book == last_book and
|
||||
chapter == last_chapter and
|
||||
verse == last_verse + 1):
|
||||
current_discourse.append((book, chapter, verse))
|
||||
else:
|
||||
if len(current_discourse) > 1:
|
||||
discourses.append(current_discourse)
|
||||
current_discourse = [(book, chapter, verse)]
|
||||
|
||||
last_book = book
|
||||
last_chapter = chapter
|
||||
last_verse = verse
|
||||
|
||||
# Don't forget the last discourse
|
||||
if len(current_discourse) > 1:
|
||||
discourses.append(current_discourse)
|
||||
|
||||
# Sort discourses by length
|
||||
discourses.sort(key=len, reverse=True)
|
||||
|
||||
return {
|
||||
'total_verses': total_verses,
|
||||
'full_verses': full_verses,
|
||||
'partial_verses': partial_verses,
|
||||
'books': books,
|
||||
'full_by_book': full_by_book,
|
||||
'partial_by_book': partial_by_book,
|
||||
'discourses': discourses,
|
||||
}
|
||||
|
||||
|
||||
def format_discourse(discourse):
|
||||
"""Format a discourse for display."""
|
||||
book, start_chapter, start_verse = discourse[0]
|
||||
_, end_chapter, end_verse = discourse[-1]
|
||||
|
||||
if start_chapter == end_chapter:
|
||||
return f"{book} {start_chapter}:{start_verse}-{end_verse}"
|
||||
else:
|
||||
return f"{book} {start_chapter}:{start_verse} - {end_chapter}:{end_verse}"
|
||||
|
||||
|
||||
def print_stats(stats):
|
||||
"""Print statistics in a formatted way."""
|
||||
print("=" * 70)
|
||||
print("RED LETTER EDITION STATISTICS")
|
||||
print("Words of Jesus Christ in the KJV Bible")
|
||||
print("=" * 70)
|
||||
print()
|
||||
|
||||
# Overall stats
|
||||
print("📊 OVERALL STATISTICS")
|
||||
print("-" * 70)
|
||||
print(f"Total verses with Christ's words: {stats['total_verses']:,}")
|
||||
print(f" • Full verses (entire verse): {stats['full_verses']:,} ({stats['full_verses']/stats['total_verses']*100:.1f}%)")
|
||||
print(f" • Partial verses (quoted only): {stats['partial_verses']:,} ({stats['partial_verses']/stats['total_verses']*100:.1f}%)")
|
||||
print()
|
||||
|
||||
# By book
|
||||
print("📖 VERSES BY BOOK")
|
||||
print("-" * 70)
|
||||
print(f"{'Book':<15} {'Total':>8} {'Full':>8} {'Partial':>8} {'% Full':>8}")
|
||||
print("-" * 70)
|
||||
|
||||
for book in sorted(stats['books'].keys()):
|
||||
total = stats['books'][book]
|
||||
full = stats['full_by_book'][book]
|
||||
partial = stats['partial_by_book'][book]
|
||||
pct_full = (full / total * 100) if total > 0 else 0
|
||||
|
||||
print(f"{book:<15} {total:>8,} {full:>8,} {partial:>8,} {pct_full:>7.1f}%")
|
||||
|
||||
print("-" * 70)
|
||||
print(f"{'TOTAL':<15} {stats['total_verses']:>8,} {stats['full_verses']:>8,} {stats['partial_verses']:>8,}")
|
||||
print()
|
||||
|
||||
# Testament breakdown
|
||||
gospels = ['Matthew', 'Mark', 'Luke', 'John']
|
||||
gospel_count = sum(stats['books'][book] for book in gospels if book in stats['books'])
|
||||
other_count = stats['total_verses'] - gospel_count
|
||||
|
||||
print("📚 BY TESTAMENT")
|
||||
print("-" * 70)
|
||||
print(f"Gospels (Matthew, Mark, Luke, John): {gospel_count:,} verses ({gospel_count/stats['total_verses']*100:.1f}%)")
|
||||
print(f"Acts & Revelation: {other_count:,} verses ({other_count/stats['total_verses']*100:.1f}%)")
|
||||
print()
|
||||
|
||||
# Longest discourses
|
||||
print("💬 LONGEST CONTINUOUS DISCOURSES")
|
||||
print("-" * 70)
|
||||
print("(Consecutive verses where Jesus speaks)")
|
||||
print()
|
||||
|
||||
for i, discourse in enumerate(stats['discourses'][:15], 1):
|
||||
length = len(discourse)
|
||||
formatted = format_discourse(discourse)
|
||||
print(f"{i:2}. {formatted:<40} ({length:3} verses)")
|
||||
|
||||
print()
|
||||
|
||||
# Notable discourses
|
||||
print("⭐ NOTABLE DISCOURSES")
|
||||
print("-" * 70)
|
||||
|
||||
notable = {
|
||||
"Sermon on the Mount": ("Matthew", 5, 1, 7, 27),
|
||||
"Olivet Discourse": ("Matthew", 24, 4, 25, 46),
|
||||
"Upper Room Discourse": ("John", 14, 1, 16, 33),
|
||||
"High Priestly Prayer": ("John", 17, 1, 17, 26),
|
||||
"Good Shepherd": ("John", 10, 1, 10, 18),
|
||||
"Bread of Life": ("John", 6, 26, 6, 65),
|
||||
}
|
||||
|
||||
for name, (book, sc, sv, ec, ev) in notable.items():
|
||||
if sc == ec:
|
||||
reference = f"{book} {sc}:{sv}-{ev}"
|
||||
else:
|
||||
reference = f"{book} {sc}:{sv} - {ec}:{ev}"
|
||||
|
||||
print(f" {name:<25} {reference}")
|
||||
|
||||
print()
|
||||
print("=" * 70)
|
||||
|
||||
|
||||
def main():
|
||||
"""Main function to run the statistics."""
|
||||
data = load_red_letter_data()
|
||||
stats = analyze_red_letter_data(data)
|
||||
print_stats(stats)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -1,281 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Show which verses have enhanced commentary and which don't.
|
||||
|
||||
This script analyzes the verse_commentary directory and displays statistics
|
||||
about commentary coverage across the Bible. It helps track progress on adding
|
||||
enhanced verse-by-verse commentary.
|
||||
|
||||
Usage:
|
||||
python scripts/show_commentary_coverage.py # Show summary
|
||||
python scripts/show_commentary_coverage.py --book Genesis # Show specific book
|
||||
python scripts/show_commentary_coverage.py --list # List all commentated verses
|
||||
python scripts/show_commentary_coverage.py --missing # Show verses without commentary
|
||||
python scripts/show_commentary_coverage.py --stats # Detailed statistics
|
||||
"""
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from collections import defaultdict
|
||||
from typing import Dict, List, Tuple
|
||||
import argparse
|
||||
|
||||
# Ensure package imports work when running as a script
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||
|
||||
from kjvstudy_org.utils.commentary_loader import load_commentary_flat
|
||||
|
||||
|
||||
def load_commentary() -> Dict[str, dict]:
|
||||
"""Load verse commentary from JSON file."""
|
||||
return load_commentary_flat()
|
||||
|
||||
|
||||
def parse_verse_ref(verse_ref: str) -> Tuple[str, int, int]:
|
||||
"""
|
||||
Parse verse reference like 'Genesis 1:1' into (book, chapter, verse).
|
||||
|
||||
Args:
|
||||
verse_ref: Verse reference string like "Genesis 1:1" or "1 John 3:16"
|
||||
|
||||
Returns:
|
||||
Tuple of (book_name, chapter_num, verse_num)
|
||||
"""
|
||||
parts = verse_ref.rsplit(' ', 1)
|
||||
if len(parts) != 2:
|
||||
return ("Unknown", 0, 0)
|
||||
|
||||
book = parts[0]
|
||||
chapter_verse = parts[1]
|
||||
|
||||
if ':' not in chapter_verse:
|
||||
return (book, 0, 0)
|
||||
|
||||
chapter_str, verse_str = chapter_verse.split(':', 1)
|
||||
try:
|
||||
chapter = int(chapter_str)
|
||||
verse = int(verse_str)
|
||||
except ValueError:
|
||||
return (book, 0, 0)
|
||||
|
||||
return (book, chapter, verse)
|
||||
|
||||
|
||||
def organize_by_book(commentary: Dict[str, dict]) -> Dict[str, Dict[int, List[int]]]:
|
||||
"""
|
||||
Organize commentary by book and chapter.
|
||||
|
||||
Returns:
|
||||
Dict of {book: {chapter: [verse1, verse2, ...]}}
|
||||
"""
|
||||
organized = defaultdict(lambda: defaultdict(list))
|
||||
|
||||
for verse_ref in commentary.keys():
|
||||
book, chapter, verse = parse_verse_ref(verse_ref)
|
||||
if chapter > 0 and verse > 0:
|
||||
organized[book][chapter].append(verse)
|
||||
|
||||
# Sort verses within each chapter
|
||||
for book in organized:
|
||||
for chapter in organized[book]:
|
||||
organized[book][chapter].sort()
|
||||
|
||||
return dict(organized)
|
||||
|
||||
|
||||
def show_summary(commentary: Dict[str, dict]):
|
||||
"""Show high-level summary of commentary coverage."""
|
||||
organized = organize_by_book(commentary)
|
||||
|
||||
print("=" * 70)
|
||||
print("VERSE COMMENTARY COVERAGE SUMMARY")
|
||||
print("=" * 70)
|
||||
print()
|
||||
|
||||
total_verses = len(commentary)
|
||||
total_books = len(organized)
|
||||
|
||||
print(f"📖 Total verses with enhanced commentary: {total_verses}")
|
||||
print(f"📚 Books with commentary: {total_books}")
|
||||
print()
|
||||
|
||||
print("Coverage by Book:")
|
||||
print("-" * 70)
|
||||
|
||||
for book in sorted(organized.keys()):
|
||||
chapters = organized[book]
|
||||
total_verses_in_book = sum(len(verses) for verses in chapters.values())
|
||||
chapter_list = sorted(chapters.keys())
|
||||
chapter_range = f"{min(chapter_list)}-{max(chapter_list)}" if len(chapter_list) > 1 else str(chapter_list[0])
|
||||
|
||||
print(f" {book:30} {total_verses_in_book:4} verses (chapters: {chapter_range})")
|
||||
|
||||
print()
|
||||
|
||||
|
||||
def show_book_detail(commentary: Dict[str, dict], book_name: str):
|
||||
"""Show detailed commentary coverage for a specific book."""
|
||||
organized = organize_by_book(commentary)
|
||||
|
||||
if book_name not in organized:
|
||||
print(f"❌ No commentary found for book: {book_name}")
|
||||
print(f"\nAvailable books:")
|
||||
for book in sorted(organized.keys()):
|
||||
print(f" - {book}")
|
||||
return
|
||||
|
||||
print("=" * 70)
|
||||
print(f"COMMENTARY COVERAGE: {book_name}")
|
||||
print("=" * 70)
|
||||
print()
|
||||
|
||||
chapters = organized[book_name]
|
||||
total_verses = sum(len(verses) for verses in chapters.values())
|
||||
|
||||
print(f"Total verses: {total_verses}")
|
||||
print(f"Chapters with commentary: {len(chapters)}")
|
||||
print()
|
||||
|
||||
for chapter in sorted(chapters.keys()):
|
||||
verses = chapters[chapter]
|
||||
verse_list = ", ".join(str(v) for v in verses)
|
||||
print(f" Chapter {chapter:3} ({len(verses):2} verses): {verse_list}")
|
||||
|
||||
print()
|
||||
|
||||
|
||||
def list_all_verses(commentary: Dict[str, dict]):
|
||||
"""List all verses with commentary."""
|
||||
organized = organize_by_book(commentary)
|
||||
|
||||
print("=" * 70)
|
||||
print("ALL VERSES WITH ENHANCED COMMENTARY")
|
||||
print("=" * 70)
|
||||
print()
|
||||
|
||||
for book in sorted(organized.keys()):
|
||||
print(f"\n{book}")
|
||||
print("-" * 70)
|
||||
|
||||
chapters = organized[book]
|
||||
for chapter in sorted(chapters.keys()):
|
||||
verses = chapters[chapter]
|
||||
verse_list = ", ".join(str(v) for v in verses)
|
||||
print(f" {chapter}:{verse_list}")
|
||||
|
||||
print()
|
||||
|
||||
|
||||
def show_statistics(commentary: Dict[str, dict]):
|
||||
"""Show detailed statistics about commentary coverage."""
|
||||
organized = organize_by_book(commentary)
|
||||
|
||||
print("=" * 70)
|
||||
print("DETAILED COMMENTARY STATISTICS")
|
||||
print("=" * 70)
|
||||
print()
|
||||
|
||||
# Total verses
|
||||
total_verses = len(commentary)
|
||||
total_books = len(organized)
|
||||
total_chapters = sum(len(chapters) for chapters in organized.values())
|
||||
|
||||
print(f"📊 Total Statistics:")
|
||||
print(f" • Enhanced verses: {total_verses}")
|
||||
print(f" • Books covered: {total_books}")
|
||||
print(f" • Chapters covered: {total_chapters}")
|
||||
print()
|
||||
|
||||
# Book-level stats
|
||||
print("📚 Coverage by Testament:")
|
||||
|
||||
# Common book groupings
|
||||
ot_books = ["Genesis", "Exodus", "Leviticus", "Numbers", "Deuteronomy",
|
||||
"Joshua", "Judges", "Ruth", "1 Samuel", "2 Samuel", "1 Kings", "2 Kings",
|
||||
"1 Chronicles", "2 Chronicles", "Ezra", "Nehemiah", "Esther",
|
||||
"Job", "Psalms", "Proverbs", "Ecclesiastes", "Song of Solomon",
|
||||
"Isaiah", "Jeremiah", "Lamentations", "Ezekiel", "Daniel",
|
||||
"Hosea", "Joel", "Amos", "Obadiah", "Jonah", "Micah", "Nahum",
|
||||
"Habakkuk", "Zephaniah", "Haggai", "Zechariah", "Malachi"]
|
||||
|
||||
nt_books = ["Matthew", "Mark", "Luke", "John", "Acts", "Romans",
|
||||
"1 Corinthians", "2 Corinthians", "Galatians", "Ephesians", "Philippians",
|
||||
"Colossians", "1 Thessalonians", "2 Thessalonians", "1 Timothy", "2 Timothy",
|
||||
"Titus", "Philemon", "Hebrews", "James", "1 Peter", "2 Peter",
|
||||
"1 John", "2 John", "3 John", "Jude", "Revelation"]
|
||||
|
||||
ot_verses = sum(sum(len(verses) for verses in organized[book].values())
|
||||
for book in ot_books if book in organized)
|
||||
nt_verses = sum(sum(len(verses) for verses in organized[book].values())
|
||||
for book in nt_books if book in organized)
|
||||
|
||||
ot_books_with_commentary = sum(1 for book in ot_books if book in organized)
|
||||
nt_books_with_commentary = sum(1 for book in nt_books if book in organized)
|
||||
|
||||
print(f" • Old Testament: {ot_verses} verses across {ot_books_with_commentary} books")
|
||||
print(f" • New Testament: {nt_verses} verses across {nt_books_with_commentary} books")
|
||||
print()
|
||||
|
||||
# Top books by coverage
|
||||
print("🏆 Top 10 Books by Commentary Coverage:")
|
||||
book_verse_counts = []
|
||||
for book in organized:
|
||||
count = sum(len(verses) for verses in organized[book].values())
|
||||
book_verse_counts.append((book, count))
|
||||
|
||||
book_verse_counts.sort(key=lambda x: x[1], reverse=True)
|
||||
for i, (book, count) in enumerate(book_verse_counts[:10], 1):
|
||||
print(f" {i:2}. {book:30} {count:4} verses")
|
||||
|
||||
print()
|
||||
|
||||
# Commentary field completeness
|
||||
print("✅ Commentary Field Completeness:")
|
||||
has_analysis = sum(1 for v in commentary.values() if v.get('analysis'))
|
||||
has_historical = sum(1 for v in commentary.values() if v.get('historical_context'))
|
||||
has_questions = sum(1 for v in commentary.values() if v.get('questions'))
|
||||
has_application = sum(1 for v in commentary.values() if v.get('application'))
|
||||
|
||||
print(f" • Analysis: {has_analysis}/{total_verses} ({100*has_analysis/total_verses:.1f}%)")
|
||||
print(f" • Historical Context: {has_historical}/{total_verses} ({100*has_historical/total_verses:.1f}%)")
|
||||
print(f" • Questions: {has_questions}/{total_verses} ({100*has_questions/total_verses:.1f}%)")
|
||||
print(f" • Application: {has_application}/{total_verses} ({100*has_application/total_verses:.1f}%)")
|
||||
|
||||
print()
|
||||
|
||||
|
||||
def main():
|
||||
"""Main entry point."""
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Show verse commentary coverage",
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
epilog="""
|
||||
Examples:
|
||||
python scripts/show_commentary_coverage.py
|
||||
python scripts/show_commentary_coverage.py --book Genesis
|
||||
python scripts/show_commentary_coverage.py --list
|
||||
python scripts/show_commentary_coverage.py --stats
|
||||
"""
|
||||
)
|
||||
|
||||
parser.add_argument('--book', type=str, help='Show detail for a specific book')
|
||||
parser.add_argument('--list', action='store_true', help='List all commentated verses')
|
||||
parser.add_argument('--stats', action='store_true', help='Show detailed statistics')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Load commentary data
|
||||
commentary = load_commentary()
|
||||
|
||||
if args.book:
|
||||
show_book_detail(commentary, args.book)
|
||||
elif args.list:
|
||||
list_all_verses(commentary)
|
||||
elif args.stats:
|
||||
show_statistics(commentary)
|
||||
else:
|
||||
show_summary(commentary)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,799 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Validate JSON data files using Pydantic models.
|
||||
|
||||
This script validates all data files in kjvstudy_org/data/ using Pydantic models
|
||||
for type safety and validation. Pydantic provides better error messages and
|
||||
integrates naturally with FastAPI.
|
||||
|
||||
Usage:
|
||||
python scripts/validate_data.py # Validate all files
|
||||
python scripts/validate_data.py --file bible_metadata.json # Validate specific file
|
||||
python scripts/validate_data.py --verbose # Show detailed output
|
||||
python scripts/validate_data.py --generate-schemas # Generate JSON schemas
|
||||
|
||||
Requirements:
|
||||
pip install pydantic (already installed with FastAPI)
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from typing import Dict, List, Tuple, Optional
|
||||
|
||||
try:
|
||||
from pydantic import BaseModel, RootModel, Field, field_validator, ValidationError
|
||||
except ImportError:
|
||||
print("Error: pydantic package not found")
|
||||
print("Install with: pip install pydantic")
|
||||
sys.exit(1)
|
||||
|
||||
# Path to data directory
|
||||
DATA_DIR = Path(__file__).parent.parent / "kjvstudy_org" / "data"
|
||||
SCHEMAS_DIR = DATA_DIR / "schemas"
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# Pydantic Models for Data Validation
|
||||
# ============================================================================
|
||||
|
||||
class BibleMetadata(BaseModel):
|
||||
"""Schema for bible_metadata.json"""
|
||||
old_testament_books: List[str] = Field(..., min_length=39, max_length=39)
|
||||
new_testament_books: List[str] = Field(..., min_length=27, max_length=27)
|
||||
book_abbreviations: Dict[str, str] = Field(..., min_length=1)
|
||||
|
||||
@field_validator('old_testament_books', 'new_testament_books')
|
||||
@classmethod
|
||||
def check_unique_books(cls, v):
|
||||
if len(v) != len(set(v)):
|
||||
raise ValueError("Duplicate book names found")
|
||||
return v
|
||||
|
||||
|
||||
class WordStudy(BaseModel):
|
||||
"""Schema for individual word study entry"""
|
||||
ot_term: Optional[str] = Field(None, min_length=1)
|
||||
ot_transliteration: Optional[str] = Field(None, min_length=1)
|
||||
ot_meaning: Optional[str] = Field(None, min_length=1)
|
||||
ot_note: Optional[str] = Field(None, min_length=1)
|
||||
nt_term: Optional[str] = Field(None, min_length=1)
|
||||
nt_transliteration: Optional[str] = Field(None, min_length=1)
|
||||
nt_meaning: Optional[str] = Field(None, min_length=1)
|
||||
nt_note: Optional[str] = Field(None, min_length=1)
|
||||
|
||||
|
||||
class WordStudies(RootModel[Dict[str, WordStudy]]):
|
||||
"""Schema for word_studies.json"""
|
||||
root: Dict[str, WordStudy]
|
||||
|
||||
|
||||
class CatalogEntry(BaseModel):
|
||||
"""Schema for study guide catalog entry"""
|
||||
title: str = Field(..., min_length=1)
|
||||
description: str = Field(..., min_length=1)
|
||||
slug: str = Field(..., pattern=r'^[a-z-]+$')
|
||||
verses: List[str]
|
||||
|
||||
@field_validator('verses')
|
||||
@classmethod
|
||||
def check_verse_format(cls, v):
|
||||
import re
|
||||
pattern = r'^[A-Za-z0-9 ]+ \d+:\d+(-\d+)?$'
|
||||
for verse in v:
|
||||
if not re.match(pattern, verse):
|
||||
raise ValueError(f"Invalid verse reference format: {verse}")
|
||||
return v
|
||||
|
||||
|
||||
class StudySection(BaseModel):
|
||||
"""Schema for study guide section"""
|
||||
title: str = Field(..., min_length=1)
|
||||
verses: List[str]
|
||||
content: str = Field(..., min_length=1)
|
||||
|
||||
@field_validator('verses')
|
||||
@classmethod
|
||||
def check_verse_format(cls, v):
|
||||
import re
|
||||
pattern = r'^[A-Za-z0-9 ]+ \d+:\d+(-\d+)?$'
|
||||
for verse in v:
|
||||
if not re.match(pattern, verse):
|
||||
raise ValueError(f"Invalid verse reference format: {verse}")
|
||||
return v
|
||||
|
||||
|
||||
class GuideContent(BaseModel):
|
||||
"""Schema for study guide content"""
|
||||
title: str = Field(..., min_length=1)
|
||||
description: str = Field(..., min_length=1)
|
||||
sections: List[StudySection] = Field(..., min_length=1)
|
||||
|
||||
|
||||
class StudyGuideFile(BaseModel):
|
||||
"""Schema for a single study guide file"""
|
||||
content: GuideContent
|
||||
catalog_entry: Optional[CatalogEntry] = None
|
||||
category: Optional[str] = None
|
||||
|
||||
|
||||
class TopicsFile(BaseModel):
|
||||
"""Schema for a single topics file"""
|
||||
root: Dict[str, dict]
|
||||
|
||||
|
||||
class ReadingPlanFile(BaseModel):
|
||||
"""Schema for a single reading plan file"""
|
||||
plan: Dict[str, List[Dict[str, object]]]
|
||||
|
||||
|
||||
class VerseCommentaryEntry(BaseModel):
|
||||
"""Schema for verse commentary entry"""
|
||||
analysis: str = Field(..., min_length=1)
|
||||
historical: str = Field(..., min_length=1)
|
||||
questions: List[str] = Field(..., min_length=1)
|
||||
|
||||
|
||||
class VerseCommentaryBook(BaseModel):
|
||||
"""Schema for a single verse commentary book file"""
|
||||
book: str = Field(..., min_length=1)
|
||||
commentary: Dict[str, Dict[str, VerseCommentaryEntry]] = Field(..., min_length=1)
|
||||
|
||||
@field_validator('commentary')
|
||||
@classmethod
|
||||
def check_numeric_keys(cls, v):
|
||||
for chapter_key, verses in v.items():
|
||||
if not str(chapter_key).isdigit():
|
||||
raise ValueError(f"Invalid chapter key: {chapter_key}")
|
||||
if not isinstance(verses, dict) or len(verses) == 0:
|
||||
raise ValueError(f"Chapter {chapter_key} must contain verse entries")
|
||||
for verse_key, entry in verses.items():
|
||||
if not str(verse_key).isdigit():
|
||||
raise ValueError(f"Invalid verse key: {verse_key}")
|
||||
if not isinstance(entry, (dict, BaseModel)):
|
||||
raise ValueError(f"Verse {chapter_key}:{verse_key} must be an object")
|
||||
return v
|
||||
|
||||
|
||||
class Devotional(BaseModel):
|
||||
"""Schema for verse devotional content"""
|
||||
title: str = Field(..., min_length=1, max_length=100)
|
||||
theme: str = Field(..., min_length=1, max_length=50)
|
||||
opening: str = Field(..., min_length=10)
|
||||
meditation: str = Field(..., min_length=20)
|
||||
application: str = Field(..., min_length=10)
|
||||
prayer: str = Field(..., min_length=10)
|
||||
|
||||
@field_validator('prayer')
|
||||
@classmethod
|
||||
def prayer_ends_with_amen(cls, v):
|
||||
if not v.strip().endswith('Amen.'):
|
||||
raise ValueError("Prayer must end with 'Amen.'")
|
||||
return v
|
||||
|
||||
|
||||
class FeaturedVerse(BaseModel):
|
||||
"""Schema for individual featured verse with optional devotional"""
|
||||
book: str = Field(..., min_length=1)
|
||||
chapter: int = Field(..., ge=1)
|
||||
verse: int = Field(..., ge=1)
|
||||
devotional: Optional[Devotional] = None
|
||||
|
||||
|
||||
class FeaturedVerses(BaseModel):
|
||||
"""Schema for featured_verses.json - 365 verses with devotionals"""
|
||||
verses: List[FeaturedVerse] = Field(..., min_length=1)
|
||||
|
||||
@field_validator('verses')
|
||||
@classmethod
|
||||
def check_devotional_coverage(cls, v):
|
||||
# Warn if not all verses have devotionals
|
||||
with_devotional = sum(1 for verse in v if verse.devotional is not None)
|
||||
if with_devotional < len(v):
|
||||
# This is just informational, not an error
|
||||
pass
|
||||
return v
|
||||
|
||||
|
||||
class RedLetterVerses(BaseModel):
|
||||
"""Schema for red_letter_verses.json"""
|
||||
description: str = Field(..., min_length=1)
|
||||
note: str = Field(..., min_length=1)
|
||||
verses: Dict[str, str] = Field(..., min_length=1)
|
||||
|
||||
@field_validator('verses')
|
||||
@classmethod
|
||||
def check_verses(cls, v):
|
||||
import re
|
||||
# Validate verse reference format
|
||||
pattern = r"^[A-Za-z0-9 ']+ \d+:\d+$"
|
||||
for key, value in v.items():
|
||||
if not re.match(pattern, key):
|
||||
raise ValueError(f"Invalid verse reference key: {key}")
|
||||
# Value must be either "full" or a non-empty string
|
||||
if value != "full" and (not isinstance(value, str) or len(value) == 0):
|
||||
raise ValueError(f"Invalid value for {key}: must be 'full' or a non-empty string")
|
||||
return v
|
||||
|
||||
|
||||
class ResourceSlugs(BaseModel):
|
||||
"""Schema for resource_slugs.json"""
|
||||
study_guides: List[str]
|
||||
angels: List[str]
|
||||
prophets: List[str]
|
||||
names_of_god: List[str]
|
||||
parables: List[str]
|
||||
covenants: List[str]
|
||||
apostles: List[str]
|
||||
women: List[str]
|
||||
festivals: List[str]
|
||||
fruits_of_spirit: List[str]
|
||||
|
||||
@field_validator('*')
|
||||
@classmethod
|
||||
def check_slugs(cls, v):
|
||||
# Check for duplicates
|
||||
if len(v) != len(set(v)):
|
||||
raise ValueError("Duplicate slugs found")
|
||||
# Check slug format
|
||||
import re
|
||||
pattern = r'^[a-z-]+$'
|
||||
for slug in v:
|
||||
if not re.match(pattern, slug):
|
||||
raise ValueError(f"Invalid slug format: {slug}")
|
||||
return v
|
||||
|
||||
|
||||
class PoetryBookData(BaseModel):
|
||||
"""Schema for individual book poetry data"""
|
||||
is_poetry: bool = Field(..., description="Whether the entire book is poetry")
|
||||
poetry_chapters: List[int] | str = Field(..., description="List of chapter numbers that are poetry, or 'all'")
|
||||
stanza_breaks: Dict[str, List[int]] = Field(..., description="Map of chapter number to list of verse numbers with stanza breaks")
|
||||
|
||||
@field_validator('poetry_chapters')
|
||||
@classmethod
|
||||
def check_chapters_sorted(cls, v):
|
||||
# Allow "all" as a special value for entirely poetry books
|
||||
if v == "all":
|
||||
return v
|
||||
if v != sorted(v):
|
||||
raise ValueError("poetry_chapters must be sorted")
|
||||
if len(v) != len(set(v)):
|
||||
raise ValueError("Duplicate chapter numbers found")
|
||||
return v
|
||||
|
||||
@field_validator('stanza_breaks')
|
||||
@classmethod
|
||||
def check_stanza_breaks(cls, v):
|
||||
for chapter_key, verses in v.items():
|
||||
if not chapter_key.isdigit():
|
||||
raise ValueError(f"Invalid chapter key: {chapter_key}")
|
||||
if verses != sorted(verses):
|
||||
raise ValueError(f"Stanza breaks for chapter {chapter_key} must be sorted")
|
||||
if len(verses) != len(set(verses)):
|
||||
raise ValueError(f"Duplicate verse numbers in chapter {chapter_key}")
|
||||
return v
|
||||
|
||||
|
||||
class PoetryFormatting(BaseModel):
|
||||
"""Schema for poetry_formatting.json"""
|
||||
books: Dict[str, PoetryBookData] = Field(..., min_length=1)
|
||||
|
||||
@field_validator('books')
|
||||
@classmethod
|
||||
def check_valid_books(cls, v):
|
||||
# Many books have poetic sections (Psalms, Prophets, NT hymns, etc.)
|
||||
# Just validate that book names are valid Bible books
|
||||
valid_books = {
|
||||
'Genesis', 'Exodus', 'Leviticus', 'Numbers', 'Deuteronomy',
|
||||
'Joshua', 'Judges', 'Ruth', '1 Samuel', '2 Samuel', '1 Kings', '2 Kings',
|
||||
'1 Chronicles', '2 Chronicles', 'Ezra', 'Nehemiah', 'Esther',
|
||||
'Job', 'Psalms', 'Proverbs', 'Ecclesiastes', 'Song of Solomon',
|
||||
'Isaiah', 'Jeremiah', 'Lamentations', 'Ezekiel', 'Daniel',
|
||||
'Hosea', 'Joel', 'Amos', 'Obadiah', 'Jonah', 'Micah', 'Nahum',
|
||||
'Habakkuk', 'Zephaniah', 'Haggai', 'Zechariah', 'Malachi',
|
||||
'Matthew', 'Mark', 'Luke', 'John', 'Acts',
|
||||
'Romans', '1 Corinthians', '2 Corinthians', 'Galatians', 'Ephesians',
|
||||
'Philippians', 'Colossians', '1 Thessalonians', '2 Thessalonians',
|
||||
'1 Timothy', '2 Timothy', 'Titus', 'Philemon', 'Hebrews',
|
||||
'James', '1 Peter', '2 Peter', '1 John', '2 John', '3 John', 'Jude', 'Revelation'
|
||||
}
|
||||
for book_name in v.keys():
|
||||
if book_name not in valid_books:
|
||||
raise ValueError(f"Invalid book name: {book_name}")
|
||||
return v
|
||||
|
||||
|
||||
class OutlineSection(BaseModel):
|
||||
"""Schema for book outline section"""
|
||||
section: str = Field(..., min_length=1)
|
||||
chapters: str = Field(..., min_length=1)
|
||||
description: str = Field(..., min_length=1)
|
||||
|
||||
|
||||
class KeyTheme(BaseModel):
|
||||
"""Schema for book key theme"""
|
||||
theme: str = Field(..., min_length=1)
|
||||
description: str = Field(..., min_length=1)
|
||||
|
||||
|
||||
class KeyVerse(BaseModel):
|
||||
"""Schema for book key verse"""
|
||||
reference: str = Field(..., min_length=1)
|
||||
text: str = Field(..., min_length=1)
|
||||
|
||||
|
||||
class BookIntroduction(BaseModel):
|
||||
"""Schema for individual book introduction file"""
|
||||
name: str = Field(..., min_length=1)
|
||||
abbreviation: str = Field(..., min_length=1)
|
||||
testament: str = Field(..., pattern=r'^(Old Testament|New Testament)$')
|
||||
position: int = Field(..., ge=1, le=66)
|
||||
chapters: int = Field(..., ge=1)
|
||||
category: str = Field(..., min_length=1)
|
||||
author: str = Field(..., min_length=1)
|
||||
date_written: str = Field(..., min_length=1)
|
||||
introduction: str = Field(..., min_length=1)
|
||||
outline: List[OutlineSection] = Field(..., min_length=1)
|
||||
key_themes: List[KeyTheme] = Field(..., min_length=1)
|
||||
key_verses: List[KeyVerse] = Field(..., min_length=1)
|
||||
christ_in_book: Optional[str] = None
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# Validation Logic
|
||||
# ============================================================================
|
||||
|
||||
# Mapping of data files to their Pydantic models
|
||||
MODEL_MAPPING = {
|
||||
"bible_metadata.json": BibleMetadata,
|
||||
"word_studies.json": WordStudies,
|
||||
"study_guides": StudyGuideFile,
|
||||
"verse_commentary": VerseCommentaryBook,
|
||||
"topics": TopicsFile,
|
||||
"reading_plans": ReadingPlanFile,
|
||||
"featured_verses.json": FeaturedVerses,
|
||||
"red_letter_verses.json": RedLetterVerses,
|
||||
"resource_slugs.json": ResourceSlugs,
|
||||
"poetry_formatting.json": PoetryFormatting,
|
||||
}
|
||||
|
||||
|
||||
def load_json(file_path: Path) -> Tuple[dict, Optional[str]]:
|
||||
"""Load JSON file and return data and error message if any."""
|
||||
try:
|
||||
with open(file_path, 'r', encoding='utf-8') as f:
|
||||
return json.load(f), None
|
||||
except json.JSONDecodeError as e:
|
||||
return None, f"JSON syntax error: {e}"
|
||||
except Exception as e:
|
||||
return None, f"Error loading file: {e}"
|
||||
|
||||
|
||||
def validate_file(data_file: str, verbose: bool = False) -> bool:
|
||||
"""Validate a single data file using its Pydantic model."""
|
||||
if data_file == "verse_commentary":
|
||||
return validate_verse_commentary_directory(verbose)
|
||||
if data_file == "study_guides":
|
||||
return validate_study_guides_directory(verbose)
|
||||
if data_file == "topics":
|
||||
return validate_topics_directory(verbose)
|
||||
if data_file == "reading_plans":
|
||||
return validate_reading_plans_directory(verbose)
|
||||
|
||||
if data_file not in MODEL_MAPPING:
|
||||
if verbose:
|
||||
print(f"⚠️ {data_file}: No validation model defined (skipped)")
|
||||
return True
|
||||
|
||||
model_class = MODEL_MAPPING[data_file]
|
||||
data_path = DATA_DIR / data_file
|
||||
|
||||
# Check if file exists
|
||||
if not data_path.exists():
|
||||
print(f"❌ {data_file}: File not found at {data_path}")
|
||||
return False
|
||||
|
||||
# Load data file
|
||||
data, error = load_json(data_path)
|
||||
if error:
|
||||
print(f"❌ {data_file}: {error}")
|
||||
return False
|
||||
|
||||
# Validate using Pydantic model
|
||||
try:
|
||||
# For RootModel subclasses, pass data directly to constructor
|
||||
# For regular BaseModel subclasses, unpack as kwargs
|
||||
if issubclass(model_class, RootModel):
|
||||
model_class(data)
|
||||
else:
|
||||
model_class(**data)
|
||||
|
||||
print(f"✅ {data_file}: Valid")
|
||||
if verbose:
|
||||
print(f" Model: {model_class.__name__}")
|
||||
print(f" Size: {data_path.stat().st_size:,} bytes")
|
||||
return True
|
||||
|
||||
except ValidationError as e:
|
||||
print(f"❌ {data_file}: Validation failed")
|
||||
for error_detail in e.errors():
|
||||
location = " -> ".join(str(loc) for loc in error_detail['loc'])
|
||||
print(f" {location}: {error_detail['msg']}")
|
||||
if verbose and 'ctx' in error_detail:
|
||||
print(f" Context: {error_detail['ctx']}")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ {data_file}: Unexpected error")
|
||||
print(f" Error: {str(e)}")
|
||||
return False
|
||||
|
||||
|
||||
def validate_verse_commentary_directory(verbose: bool = False) -> bool:
|
||||
"""Validate all per-book verse commentary files."""
|
||||
dir_path = DATA_DIR / "verse_commentary"
|
||||
if not dir_path.exists():
|
||||
print(f"❌ verse_commentary: Directory not found at {dir_path}")
|
||||
return False
|
||||
|
||||
passed = 0
|
||||
failed = 0
|
||||
|
||||
for file_path in sorted(dir_path.glob("*.json")):
|
||||
data, error = load_json(file_path)
|
||||
if error:
|
||||
print(f"❌ {file_path.name}: {error}")
|
||||
failed += 1
|
||||
continue
|
||||
|
||||
try:
|
||||
VerseCommentaryBook(**data)
|
||||
if verbose:
|
||||
print(f"✅ {file_path.name}: Valid")
|
||||
passed += 1
|
||||
except ValidationError as e:
|
||||
print(f"❌ {file_path.name}: Validation failed")
|
||||
for error_detail in e.errors():
|
||||
location = " -> ".join(str(loc) for loc in error_detail['loc'])
|
||||
print(f" {location}: {error_detail['msg']}")
|
||||
failed += 1
|
||||
except Exception as e:
|
||||
print(f"❌ {file_path.name}: Unexpected error")
|
||||
print(f" Error: {str(e)}")
|
||||
failed += 1
|
||||
|
||||
if failed == 0:
|
||||
print(f"✅ verse_commentary: Valid ({passed} files)")
|
||||
return True
|
||||
|
||||
print(f"❌ verse_commentary: {failed} files failed validation")
|
||||
return False
|
||||
|
||||
|
||||
def validate_study_guides_directory(verbose: bool = False) -> bool:
|
||||
"""Validate per-guide study guide files."""
|
||||
dir_path = DATA_DIR / "study_guides"
|
||||
if not dir_path.exists():
|
||||
print(f"❌ study_guides: Directory not found at {dir_path}")
|
||||
return False
|
||||
|
||||
passed = 0
|
||||
failed = 0
|
||||
|
||||
for file_path in sorted(dir_path.glob("*.json")):
|
||||
data, error = load_json(file_path)
|
||||
if error:
|
||||
print(f"❌ {file_path.name}: {error}")
|
||||
failed += 1
|
||||
continue
|
||||
|
||||
try:
|
||||
StudyGuideFile(**data)
|
||||
if verbose:
|
||||
print(f"✅ {file_path.name}: Valid")
|
||||
passed += 1
|
||||
except ValidationError as e:
|
||||
print(f"❌ {file_path.name}: Validation failed")
|
||||
for error_detail in e.errors():
|
||||
location = " -> ".join(str(loc) for loc in error_detail['loc'])
|
||||
print(f" {location}: {error_detail['msg']}")
|
||||
failed += 1
|
||||
except Exception as e:
|
||||
print(f"❌ {file_path.name}: Unexpected error")
|
||||
print(f" Error: {str(e)}")
|
||||
failed += 1
|
||||
|
||||
if failed == 0:
|
||||
print(f"✅ study_guides: Valid ({passed} files)")
|
||||
return True
|
||||
|
||||
print(f"❌ study_guides: {failed} files failed validation")
|
||||
return False
|
||||
|
||||
|
||||
def validate_topics_directory(verbose: bool = False) -> bool:
|
||||
"""Validate per-topic files."""
|
||||
dir_path = DATA_DIR / "topics"
|
||||
if not dir_path.exists():
|
||||
print(f"❌ topics: Directory not found at {dir_path}")
|
||||
return False
|
||||
|
||||
passed = 0
|
||||
failed = 0
|
||||
|
||||
for file_path in sorted(dir_path.glob("*.json")):
|
||||
data, error = load_json(file_path)
|
||||
if error:
|
||||
print(f"❌ {file_path.name}: {error}")
|
||||
failed += 1
|
||||
continue
|
||||
|
||||
try:
|
||||
TopicsFile(root=data)
|
||||
if verbose:
|
||||
print(f"✅ {file_path.name}: Valid")
|
||||
passed += 1
|
||||
except ValidationError as e:
|
||||
print(f"❌ {file_path.name}: Validation failed")
|
||||
for error_detail in e.errors():
|
||||
location = " -> ".join(str(loc) for loc in error_detail['loc'])
|
||||
print(f" {location}: {error_detail['msg']}")
|
||||
failed += 1
|
||||
except Exception as e:
|
||||
print(f"❌ {file_path.name}: Unexpected error")
|
||||
print(f" Error: {str(e)}")
|
||||
failed += 1
|
||||
|
||||
if failed == 0:
|
||||
print(f"✅ topics: Valid ({passed} files)")
|
||||
return True
|
||||
|
||||
print(f"❌ topics: {failed} files failed validation")
|
||||
return False
|
||||
|
||||
|
||||
def validate_reading_plans_directory(verbose: bool = False) -> bool:
|
||||
"""Validate per-plan reading plan files."""
|
||||
dir_path = DATA_DIR / "reading_plans"
|
||||
if not dir_path.exists():
|
||||
print(f"❌ reading_plans: Directory not found at {dir_path}")
|
||||
return False
|
||||
|
||||
passed = 0
|
||||
failed = 0
|
||||
|
||||
for file_path in sorted(dir_path.glob("*.json")):
|
||||
data, error = load_json(file_path)
|
||||
if error:
|
||||
print(f"❌ {file_path.name}: {error}")
|
||||
failed += 1
|
||||
continue
|
||||
|
||||
try:
|
||||
# Each file has one key with the plan id mapping to the plan object
|
||||
if len(data) != 1:
|
||||
raise ValueError("Reading plan file must contain exactly one plan")
|
||||
ReadingPlanFile(plan=data)
|
||||
if verbose:
|
||||
print(f"✅ {file_path.name}: Valid")
|
||||
passed += 1
|
||||
except ValidationError as e:
|
||||
print(f"❌ {file_path.name}: Validation failed")
|
||||
for error_detail in e.errors():
|
||||
location = " -> ".join(str(loc) for loc in error_detail['loc'])
|
||||
print(f" {location}: {error_detail['msg']}")
|
||||
failed += 1
|
||||
except Exception as e:
|
||||
print(f"❌ {file_path.name}: Unexpected error")
|
||||
print(f" Error: {str(e)}")
|
||||
failed += 1
|
||||
|
||||
if failed == 0:
|
||||
print(f"✅ reading_plans: Valid ({passed} files)")
|
||||
return True
|
||||
|
||||
print(f"❌ reading_plans: {failed} files failed validation")
|
||||
return False
|
||||
|
||||
|
||||
def validate_all(verbose: bool = False) -> Tuple[int, int]:
|
||||
"""Validate all data files with models. Returns (passed, failed) counts."""
|
||||
passed = 0
|
||||
failed = 0
|
||||
|
||||
print("=" * 60)
|
||||
print("Validating JSON data files with Pydantic models")
|
||||
print("=" * 60)
|
||||
print()
|
||||
|
||||
for data_file in sorted(MODEL_MAPPING.keys()):
|
||||
if validate_file(data_file, verbose):
|
||||
passed += 1
|
||||
else:
|
||||
failed += 1
|
||||
if verbose:
|
||||
print()
|
||||
|
||||
return passed, failed
|
||||
|
||||
|
||||
def validate_book_file(book_file: Path, verbose: bool = False) -> bool:
|
||||
"""Validate a single book JSON file using BookIntroduction model."""
|
||||
# Load data file
|
||||
data, error = load_json(book_file)
|
||||
if error:
|
||||
print(f"❌ {book_file.name}: {error}")
|
||||
return False
|
||||
|
||||
# Validate using Pydantic model
|
||||
try:
|
||||
BookIntroduction(**data)
|
||||
print(f"✅ {book_file.name}: Valid")
|
||||
if verbose:
|
||||
print(f" Size: {book_file.stat().st_size:,} bytes")
|
||||
return True
|
||||
|
||||
except ValidationError as e:
|
||||
print(f"❌ {book_file.name}: Validation failed")
|
||||
for error_detail in e.errors():
|
||||
location = " -> ".join(str(loc) for loc in error_detail['loc'])
|
||||
print(f" {location}: {error_detail['msg']}")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ {book_file.name}: Unexpected error")
|
||||
print(f" Error: {str(e)}")
|
||||
return False
|
||||
|
||||
|
||||
def validate_all_books(verbose: bool = False) -> Tuple[int, int]:
|
||||
"""Validate all 66 book introduction files. Returns (passed, failed) counts."""
|
||||
passed = 0
|
||||
failed = 0
|
||||
|
||||
books_dir = DATA_DIR / "books"
|
||||
if not books_dir.exists():
|
||||
print(f"❌ Books directory not found: {books_dir}")
|
||||
return 0, 0
|
||||
|
||||
print("=" * 60)
|
||||
print("Validating 66 book introduction files")
|
||||
print("=" * 60)
|
||||
print()
|
||||
|
||||
book_files = sorted(books_dir.glob("*.json"))
|
||||
for book_file in book_files:
|
||||
if validate_book_file(book_file, verbose):
|
||||
passed += 1
|
||||
else:
|
||||
failed += 1
|
||||
if verbose:
|
||||
print()
|
||||
|
||||
return passed, failed
|
||||
|
||||
|
||||
def generate_json_schemas():
|
||||
"""Generate JSON Schema files from Pydantic models."""
|
||||
print("=" * 60)
|
||||
print("Generating JSON Schema files from Pydantic models")
|
||||
print("=" * 60)
|
||||
print()
|
||||
|
||||
SCHEMAS_DIR.mkdir(exist_ok=True)
|
||||
|
||||
# Generate schemas for main data files
|
||||
for data_file, model_class in MODEL_MAPPING.items():
|
||||
schema_file = data_file.replace('.json', '.schema.json') if data_file.endswith('.json') else f"{data_file}.schema.json"
|
||||
schema_path = SCHEMAS_DIR / schema_file
|
||||
|
||||
try:
|
||||
# Generate JSON Schema from Pydantic model
|
||||
schema = model_class.model_json_schema()
|
||||
|
||||
# Add metadata
|
||||
schema['$id'] = f"https://kjvstudy.org/schemas/{schema_file}"
|
||||
schema['title'] = model_class.__doc__ or model_class.__name__
|
||||
|
||||
# Write schema file
|
||||
with open(schema_path, 'w', encoding='utf-8') as f:
|
||||
json.dump(schema, f, indent=2, ensure_ascii=False)
|
||||
|
||||
print(f"✅ Generated {schema_file}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Failed to generate {schema_file}: {e}")
|
||||
|
||||
# Generate schema for book introduction files
|
||||
try:
|
||||
schema_file = "book_introduction.schema.json"
|
||||
schema_path = SCHEMAS_DIR / schema_file
|
||||
|
||||
schema = BookIntroduction.model_json_schema()
|
||||
schema['$id'] = f"https://kjvstudy.org/schemas/{schema_file}"
|
||||
schema['title'] = "Schema for individual book introduction files"
|
||||
|
||||
with open(schema_path, 'w', encoding='utf-8') as f:
|
||||
json.dump(schema, f, indent=2, ensure_ascii=False)
|
||||
|
||||
print(f"✅ Generated {schema_file}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Failed to generate {schema_file}: {e}")
|
||||
|
||||
print()
|
||||
print(f"Schemas written to: {SCHEMAS_DIR}")
|
||||
|
||||
|
||||
def main():
|
||||
"""Main entry point."""
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Validate JSON data files with Pydantic models",
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
epilog="""
|
||||
Examples:
|
||||
python scripts/validate_data.py # Validate all files
|
||||
python scripts/validate_data.py -f bible_metadata.json # Validate one file
|
||||
python scripts/validate_data.py --verbose # Show details
|
||||
python scripts/validate_data.py --generate-schemas # Generate JSON schemas
|
||||
"""
|
||||
)
|
||||
parser.add_argument(
|
||||
'-f', '--file',
|
||||
help='Validate specific file only',
|
||||
metavar='FILE'
|
||||
)
|
||||
parser.add_argument(
|
||||
'-v', '--verbose',
|
||||
action='store_true',
|
||||
help='Show detailed output'
|
||||
)
|
||||
parser.add_argument(
|
||||
'--generate-schemas',
|
||||
action='store_true',
|
||||
help='Generate JSON Schema files from Pydantic models'
|
||||
)
|
||||
parser.add_argument(
|
||||
'--books',
|
||||
action='store_true',
|
||||
help='Validate all 66 book introduction files'
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Generate schemas if requested
|
||||
if args.generate_schemas:
|
||||
generate_json_schemas()
|
||||
sys.exit(0)
|
||||
|
||||
# Validate books if requested
|
||||
if args.books:
|
||||
passed, failed = validate_all_books(args.verbose)
|
||||
|
||||
print()
|
||||
print("=" * 60)
|
||||
print(f"Results: {passed} passed, {failed} failed")
|
||||
print("=" * 60)
|
||||
|
||||
sys.exit(0 if failed == 0 else 1)
|
||||
|
||||
# Validate specific file or all files
|
||||
if args.file:
|
||||
success = validate_file(args.file, args.verbose)
|
||||
sys.exit(0 if success else 1)
|
||||
else:
|
||||
passed, failed = validate_all(args.verbose)
|
||||
|
||||
print()
|
||||
print("=" * 60)
|
||||
print(f"Results: {passed} passed, {failed} failed")
|
||||
print("=" * 60)
|
||||
|
||||
sys.exit(0 if failed == 0 else 1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user