diff --git a/examples/web_apps/bible_explorer.py b/examples/web_apps/bible_explorer.py new file mode 100644 index 0000000..4012078 --- /dev/null +++ b/examples/web_apps/bible_explorer.py @@ -0,0 +1,238 @@ +from fastapi import FastAPI, Request, HTTPException +from fastapi.templating import Jinja2Templates +from fastapi.staticfiles import StaticFiles +from pydantic import BaseModel +from typing import List +import simplemind as sm + +app = FastAPI() +app.mount("/static", StaticFiles(directory="static"), name="static") +templates = Jinja2Templates(directory="templates") + + +class CrossReference(BaseModel): + """Model for cross references.""" + + verse_reference: str + explanation: str + relevance: str + + +class BibleVerseAnalysis(BaseModel): + """Model for a Bible verse and its analysis.""" + + book: str + chapter: int + verse: int + text: str + historical_context: str + theological_significance: str + practical_application: str + cross_references: List[CrossReference] + + +# Bible data constants +BIBLE_BOOKS = [ + # Old Testament + "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", + # New Testament + "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", +] + +BIBLE_BOOK_CHAPTERS = { + # Old Testament + "Genesis": 50, + "Exodus": 40, + "Leviticus": 27, + "Numbers": 36, + "Deuteronomy": 34, + "Joshua": 24, + "Judges": 21, + "Ruth": 4, + "1 Samuel": 31, + "2 Samuel": 24, + "1 Kings": 22, + "2 Kings": 25, + "1 Chronicles": 29, + "2 Chronicles": 36, + "Ezra": 10, + "Nehemiah": 13, + "Esther": 10, + "Job": 42, + "Psalms": 150, + "Proverbs": 31, + "Ecclesiastes": 12, + "Song of Solomon": 8, + "Isaiah": 66, + "Jeremiah": 52, + "Lamentations": 5, + "Ezekiel": 48, + "Daniel": 12, + "Hosea": 14, + "Joel": 3, + "Amos": 9, + "Obadiah": 1, + "Jonah": 4, + "Micah": 7, + "Nahum": 3, + "Habakkuk": 3, + "Zephaniah": 3, + "Haggai": 2, + "Zechariah": 14, + "Malachi": 4, + # New Testament + "Matthew": 28, + "Mark": 16, + "Luke": 24, + "John": 21, + "Acts": 28, + "Romans": 16, + "1 Corinthians": 16, + "2 Corinthians": 13, + "Galatians": 6, + "Ephesians": 6, + "Philippians": 4, + "Colossians": 4, + "1 Thessalonians": 5, + "2 Thessalonians": 3, + "1 Timothy": 6, + "2 Timothy": 4, + "Titus": 3, + "Philemon": 1, + "Hebrews": 13, + "James": 5, + "1 Peter": 5, + "2 Peter": 3, + "1 John": 5, + "2 John": 1, + "3 John": 1, + "Jude": 1, + "Revelation": 22, +} + + +# Add a new endpoint to get chapter count +@app.get("/chapters/{book}") +async def get_chapter_count(book: str): + if book in BIBLE_BOOK_CHAPTERS: + return {"chapters": BIBLE_BOOK_CHAPTERS[book]} + return {"chapters": 0} + + +@app.get("/") +async def home(request: Request): + return templates.TemplateResponse( + "index.html", + { + "request": request, + "bible_books": BIBLE_BOOKS, + "current_book": "Genesis", + "current_chapter": 1, + "current_verse": 1, + }, + ) + + +@app.get("/verse/{book}/{chapter}/{verse}") +async def get_verse(book: str, chapter: int, verse: int): + # Validate book and chapter + if book not in BIBLE_BOOK_CHAPTERS: + raise HTTPException(status_code=400, detail="Invalid book name") + + if chapter < 1 or chapter > BIBLE_BOOK_CHAPTERS[book]: + raise HTTPException( + status_code=400, + detail=f"Invalid chapter. {book} has {BIBLE_BOOK_CHAPTERS[book]} chapters", + ) + + prompt = f""" + For {book} {chapter}:{verse}, provide: + 1. The ESV Bible text + 2. Analysis of the verse + + Return in this exact format: + {{ + "book": "{book}", + "chapter": {chapter}, + "verse": {verse}, + "text": "The ESV Bible text", + "historical_context": "brief historical background", + "theological_significance": "main theological points", + "practical_application": "how to apply this verse today", + "cross_references": [ + {{ + "verse_reference": "Book Chapter:Verse", + "explanation": "why this verse is related", + "relevance": "how it connects to the main verse" + }} + ] + }} + """ + + data = sm.generate_data(prompt, response_model=BibleVerseAnalysis) + + return data