File size: 3,724 Bytes
86c402d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
"""
Модуль содержит класс для представления структуры документа.
"""

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