Files
2025-11-30 21:26:59 -05:00

112 lines
3.1 KiB
Python

"""
Cross-reference system for linking related Bible verses.
Organized by major theological themes and narrative connections.
"""
import json
from functools import lru_cache
from pathlib import Path
@lru_cache(maxsize=1)
def _load_cross_references():
"""Load cross-references from per-book JSON files (fallback to legacy file)."""
base_dir = Path(__file__).parent / "data"
crossref_dir = base_dir / "cross_references"
legacy_path = base_dir / "cross_references.json"
aggregated = {}
if crossref_dir.exists():
for path in sorted(crossref_dir.glob("*.json")):
with open(path, "r", encoding="utf-8") as f:
content = json.load(f)
if isinstance(content, dict):
aggregated.update(content)
elif legacy_path.exists():
with open(legacy_path, "r", encoding="utf-8") as f:
aggregated = json.load(f)
return aggregated
CROSS_REFERENCES = _load_cross_references()
def get_cross_references(book: str, chapter: int, verse: int) -> list:
"""
Get cross-references for a specific verse with verse text for tooltips.
Args:
book: Book name (e.g., "Genesis", "John")
chapter: Chapter number
verse: Verse number
Returns:
List of cross-reference dictionaries with 'ref', 'note', and 'text' keys
"""
from .kjv import bible
key = f"{book}:{chapter}:{verse}"
refs = CROSS_REFERENCES.get(key, [])
# Enhance each reference with the actual verse text
enhanced_refs = []
for ref in refs:
enhanced_ref = ref.copy()
# Parse the reference to get the verse text
ref_str = ref['ref']
parts = ref_str.rsplit(' ', 1)
if len(parts) == 2:
ref_book = parts[0]
chapter_verse = parts[1]
if ':' in chapter_verse:
ref_chapter, ref_verse = chapter_verse.split(':')
ref_chapter = int(ref_chapter)
ref_verse = int(ref_verse)
# Get the verse text using the bible object
try:
verse_text = bible.get_verse_text(ref_book, ref_chapter, ref_verse)
enhanced_ref['text'] = verse_text if verse_text else ""
except Exception:
enhanced_ref['text'] = ""
else:
enhanced_ref['text'] = ""
else:
enhanced_ref['text'] = ""
enhanced_refs.append(enhanced_ref)
return enhanced_refs
def parse_reference(ref: str) -> dict:
"""
Parse a reference string like "Genesis 1:1" into components.
Args:
ref: Reference string
Returns:
Dictionary with 'book', 'chapter', 'verse' keys
"""
parts = ref.rsplit(' ', 1)
if len(parts) != 2:
return None
book = parts[0]
chapter_verse = parts[1].split(':')
if len(chapter_verse) != 2:
return None
try:
return {
'book': book,
'chapter': int(chapter_verse[0]),
'verse': int(chapter_verse[1])
}
except ValueError:
return None