OPEN SOURCE
software/src/context/pericope.py
このサイトで読み、必要なファイルを保存できます。
日常訳はAIを用いて作成された翻訳です。人間の聖書学・原語の専門家による全訳の検証は確認されていません。既存の翻訳や原語資料と照らし合わせてお読みください。
1"""Pericope management for chunk-based translation."""23from __future__ import annotations45import json6from pathlib import Path78from src.models.pericope import Pericope, PericopeIndex91011class PericopeManager:12"""Manages pericope data for chunk-based translation.1314Loads pericope boundaries from JSON and provides lookup15functionality to find the pericope containing any verse.16"""1718def __init__(self, data_path: Path | str | None = None) -> None:19"""Initialize the pericope manager.2021Args:22data_path: Path to pericopes.json. If None, uses default.23"""24if data_path is None:25self._data_path = Path("data/metadata/pericopes.json")26else:27self._data_path = Path(data_path)2829self._indexes: dict[str, PericopeIndex] = {}30self._loaded = False3132@property33def data_path(self) -> Path:34"""Get the data file path."""35return self._data_path3637def _ensure_loaded(self) -> None:38"""Ensure pericope data is loaded."""39if not self._loaded:40self.load()4142def load(self) -> None:43"""Load pericope data from JSON file."""44self._indexes.clear()45self._loaded = True4647if not self._data_path.exists():48return4950with self._data_path.open("r", encoding="utf-8") as f:51data = json.load(f)5253for book_name, book_data in data.get("books", {}).items():54pericopes = []55for p_data in book_data.get("pericopes", []):56pericopes.append(Pericope(**p_data))5758self._indexes[book_name] = PericopeIndex(59book=book_name,60name=book_data.get("name", book_name.title()),61pericopes=pericopes,62sblgnt_paragraphs=book_data.get("sblgnt_paragraphs"),63)6465def reload(self) -> None:66"""Force reload from file."""67self._loaded = False68self.load()6970def get_pericope(71self, book: str, chapter: int, verse: int72) -> Pericope | None:73"""Get the pericope containing a verse.7475Args:76book: Book name.77chapter: Chapter number.78verse: Verse number.7980Returns:81The Pericope containing the verse, or None if not found.82"""83self._ensure_loaded()8485index = self._indexes.get(book.lower())86if index is None:87return None8889return index.find_pericope(chapter, verse)9091def get_pericope_by_id(self, pericope_id: str) -> tuple[str, Pericope] | None:92"""Get a pericope by its ID.9394Args:95pericope_id: The pericope identifier.9697Returns:98Tuple of (book_name, Pericope) if found, None otherwise.99"""100self._ensure_loaded()101102for book_name, index in self._indexes.items():103pericope = index.get_pericope_by_id(pericope_id)104if pericope:105return (book_name, pericope)106107return None108109def get_book_pericopes(self, book: str) -> list[Pericope]:110"""Get all pericopes for a book.111112Args:113book: Book name.114115Returns:116List of pericopes for the book.117"""118self._ensure_loaded()119120index = self._indexes.get(book.lower())121if index is None:122return []123124return index.pericopes125126def get_chapter_pericopes(self, book: str, chapter: int) -> list[Pericope]:127"""Get all pericopes that include verses from a chapter.128129Args:130book: Book name.131chapter: Chapter number.132133Returns:134List of pericopes containing verses from the chapter.135"""136self._ensure_loaded()137138index = self._indexes.get(book.lower())139if index is None:140return []141142return index.get_chapter_pericopes(chapter)143144def get_available_books(self) -> list[str]:145"""Get list of books with pericope data.146147Returns:148List of book names.149"""150self._ensure_loaded()151return list(self._indexes.keys())152153def has_pericope_data(self, book: str) -> bool:154"""Check if pericope data exists for a book.155156Args:157book: Book name.158159Returns:160True if pericope data exists.161"""162self._ensure_loaded()163index = self._indexes.get(book.lower())164return index is not None and len(index.pericopes) > 0165166def get_book_index(self, book: str) -> PericopeIndex | None:167"""Get the full pericope index for a book.168169Args:170book: Book name.171172Returns:173PericopeIndex or None if not found.174"""175self._ensure_loaded()176return self._indexes.get(book.lower())177178def get_statistics(self) -> dict:179"""Get statistics about loaded pericope data.180181Returns:182Dictionary with statistics.183"""184self._ensure_loaded()185186total_pericopes = 0187total_verses = 0188books_with_data = []189190for book_name, index in self._indexes.items():191if index.pericopes:192books_with_data.append(book_name)193total_pericopes += len(index.pericopes)194for p in index.pericopes:195total_verses += p.verse_count196197return {198"books_with_data": len(books_with_data),199"book_names": books_with_data,200"total_pericopes": total_pericopes,201"total_verses_covered": total_verses,202}203204def __len__(self) -> int:205"""Get total number of pericopes across all books."""206self._ensure_loaded()207return sum(len(idx.pericopes) for idx in self._indexes.values())208