""" Модуль содержит класс для представления текстовых блоков документа. """ from dataclasses import asdict, dataclass, field from typing import Any, Callable from .parsed_structure import DocumentElement @dataclass class TextStyle: """ Стиль текстового блока. """ # Стиль параграфа paragraph_style: str = "" paragraph_style_name: str = "" alignment: str = "" # Автонумерация has_numbering: bool = False numbering_level: int = 0 numbering_id: str = "" numbering_format: str = "" # decimal, bullet, roman, etc. # Флаги для bold fully_bold: bool = False partly_bold: bool = False # Флаги для italic fully_italic: bool = False partly_italic: bool = False # Флаги для underline fully_underlined: bool = False partly_underlined: bool = False def to_dict(self) -> dict[str, Any]: """ Преобразует стиль в словарь. Returns: dict[str, Any]: Словарное представление стиля. """ return asdict(self) @dataclass class ParsedTextBlock(DocumentElement): """ Текстовый блок документа. """ text: str = "" style: TextStyle = field(default_factory=TextStyle) anchors: list[str] = field(default_factory=list) # Список идентификаторов якорей (закладок) links: list[str] = field(default_factory=list) # Список идентификаторов ссылок # Технические метаданные о блоке metadata: list[dict[str, Any]] = field(default_factory=list) # Для хранения технической информации # Примечания и сноски к тексту footnotes: list[dict[str, Any]] = field(default_factory=list) # Для хранения сносок title_of_table: int | None = None def to_string(self) -> str: """ Преобразует текстовый блок в строковое представление. Returns: str: Текст блока. """ return self.text def apply(self, func: Callable[[str], str]) -> None: """ Применяет функцию к тексту блока. Args: func (Callable[[str], str]): Функция для применения к тексту. """ self.text = func(self.text) # Применяем к текстовым значениям в метаданных if isinstance(self.metadata, list): for item in self.metadata: if isinstance(item, dict) and 'text' in item: item['text'] = func(item['text']) # Применяем к сноскам if isinstance(self.footnotes, list): for note in self.footnotes: if isinstance(note, dict) and 'text' in note: note['text'] = func(note['text']) def to_dict(self) -> dict[str, Any]: """ Преобразует текстовый блок в словарь. Returns: dict[str, Any]: Словарное представление текстового блока. """ result = { 'text': self.text, 'style': self.style.to_dict(), 'anchors': self.anchors, 'links': self.links, 'metadata': self.metadata, 'footnotes': self.footnotes, 'page_number': self.page_number, 'index_in_document': self.index_in_document, 'title_of_table': self.title_of_table, } return result