File size: 3,923 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
106
107
108
109
110
111
112
113
114
115
116
117
"""
Модуль содержит класс для представления текстовых блоков документа.
"""

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