diff --git a/kjvstudy_org/server.py b/kjvstudy_org/server.py index 42946bc..d423a43 100644 --- a/kjvstudy_org/server.py +++ b/kjvstudy_org/server.py @@ -1130,6 +1130,54 @@ def family_tree_page(request: Request): ) +@app.get("/family-tree/interactive", response_class=HTMLResponse) +def family_tree_interactive_page(request: Request): + """Interactive D3.js visualization of biblical family tree""" + books = list(bible.iter_books()) + + # Load GEDCOM file from static folder + static_dir = Path(__file__).parent / "static" + gedcom_path = static_dir / "adameve.ged" + + if not gedcom_path.exists(): + raise HTTPException( + status_code=404, + detail=f"GEDCOM file not found. Please place 'adameve.ged' in the static folder." + ) + + if not GedcomReader: + raise HTTPException( + status_code=500, + detail="GEDCOM parser not available. Please install ged4py." + ) + + # Parse GEDCOM data + try: + family_tree_data, generations = parse_gedcom_to_tree_data(gedcom_path) + except Exception as e: + raise HTTPException( + status_code=500, + detail=f"Failed to parse GEDCOM file: {str(e)}" + ) + + # Convert family tree data to JSON for D3.js + family_tree_json = json.dumps(family_tree_data, default=str) + + return templates.TemplateResponse( + "family_tree_interactive.html", + { + "request": request, + "books": books, + "family_tree_json": family_tree_json, + "breadcrumbs": [ + {"text": "Home", "url": "/"}, + {"text": "Family Tree", "url": "/family-tree"}, + {"text": "Interactive", "url": None} + ] + } + ) + + @app.get("/family-tree/generation/{gen_num}", response_class=HTMLResponse) def family_tree_generation_page(request: Request, gen_num: int): """Individual generation page""" diff --git a/kjvstudy_org/templates/family_tree.html b/kjvstudy_org/templates/family_tree.html index 93d1aea..f7bb629 100644 --- a/kjvstudy_org/templates/family_tree.html +++ b/kjvstudy_org/templates/family_tree.html @@ -92,6 +92,7 @@

The Bible contains detailed genealogies that trace God's plan through specific family lines, culminating in the birth of Jesus Christ. This record spans from the creation of Adam through countless generations to the birth of our Lord.

+

→ View Interactive Tree Visualization

diff --git a/kjvstudy_org/templates/family_tree_interactive.html b/kjvstudy_org/templates/family_tree_interactive.html new file mode 100644 index 0000000..ef5d4c4 --- /dev/null +++ b/kjvstudy_org/templates/family_tree_interactive.html @@ -0,0 +1,519 @@ +{% extends "base.html" %} + +{% block title %}Interactive Family Tree - KJV Study{% endblock %} +{% block description %}Explore biblical genealogies through an interactive visualization from Adam to Jesus Christ.{% endblock %} + +{% block head %} + + +{% endblock %} + +{% block content %} +

Interactive Family Tree

+

Biblical genealogies from Adam to Jesus Christ

+ +
+
+

Explore the biblical genealogies through an interactive tree visualization. Click on any person to expand their descendants, or hover to see more details. The tree traces the lineage from Adam through the patriarchs, judges, kings, and ultimately to Jesus Christ.

+
+
+ +
+ + + + +
+ +
+ + + Person (click to expand) + + + + Has descendants + +
+ +
+ + + + +{% endblock %} diff --git a/kjvstudy_org/templates/family_tree_person.html b/kjvstudy_org/templates/family_tree_person.html index 6828172..3e9aa8d 100644 --- a/kjvstudy_org/templates/family_tree_person.html +++ b/kjvstudy_org/templates/family_tree_person.html @@ -179,27 +179,37 @@ {% for verse in person.verses %}
- {% set ref_parts = verse.reference.split(' ') %} - {% if ref_parts|length >= 2 %} - {% set chapter_verse = ref_parts[-1] %} - {% if ':' in chapter_verse %} - {% set chapter = chapter_verse.split(':')[0] %} - {% set verse_part = chapter_verse.split(':')[1] %} - {% if '-' in verse_part %} - {% set verse_num = verse_part.split('-')[0] %} + {% if verse.reference %} + {% set ref_parts = verse.reference.split(' ') %} + {% if ref_parts|length >= 2 %} + {% set chapter_verse = ref_parts[-1] %} + {% if ':' in chapter_verse %} + {% set chapter = chapter_verse.split(':')[0] %} + {% set verse_part = chapter_verse.split(':')[1] %} + {% if '-' in verse_part %} + {% set verse_num = verse_part.split('-')[0] %} + {% else %} + {% set verse_num = verse_part %} + {% endif %} + {% set book = ' '.join(ref_parts[:-1]) %} + {{ verse.reference }} {% else %} - {% set verse_num = verse_part %} + {% set book = ' '.join(ref_parts[:-1]) %} + {% set chapter = ref_parts[-1] %} + {{ verse.reference }} {% endif %} - {% set book = ' '.join(ref_parts[:-1]) %} - {{ verse.reference }} {% else %} - {{ verse.reference }} + {{ verse.reference if verse.reference else verse }} {% endif %} + {% elif verse is string %} + {{ verse }} {% else %} - {{ verse.reference }} + {{ verse.text if verse.text else '' }} {% endif %}
+ {% if verse.text %}
{{ verse.text }}
+ {% endif %}
{% endfor %}