muryshev's picture
update
86c402d
raw
history blame
3.92 kB
"""
Модуль содержит класс для представления текстовых блоков документа.
"""
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