mirror of
https://github.com/kennethreitz/kjvstudy.org.git
synced 2026-06-05 14:50:17 +00:00
112 lines
3.1 KiB
Python
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
|