muryshev's picture
update
86c402d
Raw History Blame Contribute Delete
3.72 kB
"""
Модуль содержит класс для представления структуры документа.
"""
from dataclasses import dataclass, field
from typing import Any, Callable
from .parsed_formula import ParsedFormula
from .parsed_image import ParsedImage
from .parsed_meta import ParsedMeta
from .parsed_structure import ParsedStructure
from .parsed_table import ParsedTable
from .parsed_text_block import ParsedTextBlock
@dataclass
class ParsedDocument(ParsedStructure):
"""
Документ, полученный в результате парсинга.
"""
name: str = ""
type: str = ""
meta: ParsedMeta = field(default_factory=ParsedMeta)
paragraphs: list[ParsedTextBlock] = field(default_factory=list)
tables: list[ParsedTable] = field(default_factory=list)
images: list[ParsedImage] = field(default_factory=list)
formulas: list[ParsedFormula] = field(default_factory=list)
def to_string(self) -> str:
"""
Преобразует документ в строковое представление.
Returns:
str: Строковое представление документа.
"""
result = [f"Документ: {self.name} (тип: {self.type})"]
if self.paragraphs:
result.append("\nПараграфы:")
for p in self.paragraphs:
result.append(p.to_string())
if self.tables:
result.append("\nТаблицы:")
for t in self.tables:
result.append(t.to_string())
if self.images:
result.append("\nИзображения:")
for i in self.images:
result.append(i.to_string())
if self.formulas:
result.append("\nФормулы:")
for f in self.formulas:
result.append(f.to_string())
return "\n".join(result)
def apply(self, func: Callable[[str], str]) -> None:
"""
Применяет функцию ко всем строковым элементам документа.
Args:
func (Callable[[str], str]): Функция для применения к текстовым элементам.
"""
self.name = func(self.name)
self.type = func(self.type)
# Применяем к параграфам
for p in self.paragraphs:
p.apply(func)
# Применяем к таблицам
for t in self.tables:
t.apply(func)
# Применяем к изображениям
for i in self.images:
i.apply(func)
# Применяем к формулам
for f in self.formulas:
f.apply(func)
def to_dict(self) -> dict[str, Any]:
"""
Преобразует документ в словарь.
Returns:
dict[str, Any]: Словарное представление документа.
"""
# Преобразуем тип в строку, если это объект FileType
type_str = str(self.type) if not isinstance(self.type, str) else self.type
result = {
'name': self.name,
'type': type_str,
'meta': self.meta.to_dict(),
'paragraphs': [p.to_dict() for p in self.paragraphs],
'tables': [t.to_dict() for t in self.tables],
'images': [i.to_dict() for i in self.images],
'formulas': [f.to_dict() for f in self.formulas]
}
return result