dublib 0.2.0__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dublib
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: Коллекция модулей от DUB1401.
5
5
  Author-email: DUB1401 <vlad.milosta@outlook.com>
6
6
  License: This is free and unencumbered software released into the public domain.
@@ -54,8 +54,26 @@ Requires-Dist: requests
54
54
  # Поставляемые компоненты
55
55
  Библиотека включает следующие модули:
56
56
  * [Methods](docs/Methods.md)
57
- * [Terminalyzer](docs/Terminalyzer.md)
57
+ * [Polyglot](docs/Polyglot.md)
58
58
  * [StyledPrinter](docs/StyledPrinter.md)
59
+ * [Terminalyzer](docs/Terminalyzer.md)
59
60
  * [WebRequestor](docs/WebRequestor.md)
60
61
 
61
- _Copyright © DUB1401. 2023._
62
+ # Установка
63
+ Библиотека поддерживает установку из двух типов репозиториев:
64
+ * **PyPI** – стабильные выпуски (с возможностью выбора конкретной версии);
65
+ * **GitHub** – канал разработки со всеми последними изменениями и исправлениями.
66
+
67
+ _**Примечание:**_ Для установки библиотеки из репозитория GitHub на вашем устройстве должна присутствовать система контроля версий Git.
68
+ ```
69
+ # Установка из PyPi.
70
+ pip install dublib
71
+
72
+ # Установка конкретной версии из PyPi.
73
+ pip install dublib=={version}
74
+
75
+ # Установка из GitHub.
76
+ pip install git+https://github.com/DUB1401/dublib
77
+ ```
78
+
79
+ _Copyright © DUB1401. 2023-2024._
dublib-0.3.0/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # dublib
2
+ **dublib** – это библиотека, поставляющая компоненты, требующиеся в проектах [@DUB1401](https://github.com/DUB1401), написанных на Python.
3
+
4
+ # Поставляемые компоненты
5
+ Библиотека включает следующие модули:
6
+ * [Methods](docs/Methods.md)
7
+ * [Polyglot](docs/Polyglot.md)
8
+ * [StyledPrinter](docs/StyledPrinter.md)
9
+ * [Terminalyzer](docs/Terminalyzer.md)
10
+ * [WebRequestor](docs/WebRequestor.md)
11
+
12
+ # Установка
13
+ Библиотека поддерживает установку из двух типов репозиториев:
14
+ * **PyPI** – стабильные выпуски (с возможностью выбора конкретной версии);
15
+ * **GitHub** – канал разработки со всеми последними изменениями и исправлениями.
16
+
17
+ _**Примечание:**_ Для установки библиотеки из репозитория GitHub на вашем устройстве должна присутствовать система контроля версий Git.
18
+ ```
19
+ # Установка из PyPi.
20
+ pip install dublib
21
+
22
+ # Установка конкретной версии из PyPi.
23
+ pip install dublib=={version}
24
+
25
+ # Установка из GitHub.
26
+ pip install git+https://github.com/DUB1401/dublib
27
+ ```
28
+
29
+ _Copyright © DUB1401. 2023-2024._
@@ -3,7 +3,7 @@ requires = ["setuptools", "cython"]
3
3
 
4
4
  [project]
5
5
  name = "dublib"
6
- version = "0.2.0"
6
+ version = "0.3.0"
7
7
  description = "Коллекция модулей от DUB1401."
8
8
  authors = [
9
9
  {name = "DUB1401", email="vlad.milosta@outlook.com"}
@@ -3,7 +3,6 @@ class DuplicatedStyles(Exception):
3
3
  Исключение: использованы оба способа указания стилей.
4
4
  """
5
5
 
6
- # Конструктор: вызывается при обработке исключения.
7
6
  def __init__(self):
8
7
  """
9
8
  Исключение: использованы оба способа указания стилей.
@@ -14,6 +13,5 @@ class DuplicatedStyles(Exception):
14
13
  # Обеспечение доступа к оригиналу наследованного свойства.
15
14
  super().__init__(self.__Message)
16
15
 
17
- # Преобразователь: представляет содержимое класса как строку.
18
16
  def __str__(self):
19
17
  return self.__Message
@@ -1,20 +1,38 @@
1
+ class IdenticalIndicators(Exception):
2
+ """
3
+ Исключение: попытка установки одинаковых индикаторов ключей и флагов.
4
+ """
5
+
6
+ def __init__(self):
7
+ """
8
+ Исключение: попытка установки одинаковых индикаторов ключей и флагов.
9
+ """
10
+
11
+ # Добавление данных в сообщение об ошибке.
12
+ self.__Message = "Cannot set same indicators for keys and flags."
13
+ # Обеспечение доступа к оригиналу наследованного свойства.
14
+ super().__init__(self.__Message)
15
+
16
+ def __str__(self):
17
+ return self.__Message
18
+
1
19
  class InvalidArgumentType(Exception):
2
20
  """
3
- Исключение: неверный тип аргумента.
21
+ Исключение: неверное значение аргумента.
4
22
  """
5
23
 
6
- # Конструктор: вызывается при обработке исключения.
7
- def __init__(self, Value: str, Type: str):
24
+ def __init__(self, value: str, type_name: str):
8
25
  """
9
- Исключение: неверный тип аргумента.
26
+ Исключение: неверное значение аргумента.
27
+ value – значение аргумента;
28
+ type_name – название ожидаемого типа.
10
29
  """
11
30
 
12
31
  # Добавление данных в сообщение об ошибке.
13
- self.__Message = "\"" + Value + "\" isn't \"" + Type + "\"."
32
+ self.__Message = "\"" + value + "\" isn't \"" + type_name + "\"."
14
33
  # Обеспечение доступа к оригиналу наследованного свойства.
15
34
  super().__init__(self.__Message)
16
35
 
17
- # Преобразователь: представляет содержимое класса как строку.
18
36
  def __str__(self):
19
37
  return self.__Message
20
38
 
@@ -23,18 +41,17 @@ class MutuallyExclusiveFlags(Exception):
23
41
  Исключение: активированы взаимоисключающие флаги.
24
42
  """
25
43
 
26
- # Конструктор: вызывается при обработке исключения.
27
- def __init__(self, Command: str):
44
+ def __init__(self, command: str):
28
45
  """
29
46
  Исключение: активированы взаимоисключающие флаги.
47
+ command – команда, вызвавшая исключение.
30
48
  """
31
49
 
32
50
  # Добавление данных в сообщение об ошибке.
33
- self.__Message = "\"" + Command + "\"."
51
+ self.__Message = "\"" + command + "\"."
34
52
  # Обеспечение доступа к оригиналу наследованного свойства.
35
53
  super().__init__(self.__Message)
36
54
 
37
- # Преобразователь: представляет содержимое класса как строку.
38
55
  def __str__(self):
39
56
  return self.__Message
40
57
 
@@ -43,19 +60,18 @@ class MutuallyExclusiveKeys(Exception):
43
60
  Исключение: активированы взаимоисключающие ключи.
44
61
  """
45
62
 
46
- # Конструктор: вызывается при обработке исключения.
47
- def __init__(self, Command: str):
63
+ def __init__(self, command: str):
48
64
  """
49
65
  Исключение: активированы взаимоисключающие ключи.
66
+ command – команда, вызвавшая исключение.
50
67
  """
51
68
 
52
69
  # Добавление данных в сообщение об ошибке.
53
- self.__Message = "\"" + Command + "\"."
70
+ self.__Message = "\"" + command + "\"."
54
71
  # Обеспечение доступа к оригиналу наследованного свойства.
55
72
  super().__init__(self.__Message)
56
73
 
57
74
 
58
- # Преобразователь: представляет содержимое класса как строку.
59
75
  def __str__(self):
60
76
  return self.__Message
61
77
 
@@ -64,19 +80,17 @@ class MutuallyExclusivePositions(Exception):
64
80
  Исключение: активированы разные позиции на одном слое.
65
81
  """
66
82
 
67
- # Конструктор: вызывается при обработке исключения.
68
- def __init__(self, Command: str):
83
+ def __init__(self, command: str):
69
84
  """
70
85
  Исключение: активированы разные позиции на одном слое.
86
+ command – команда, вызвавшая исключение.
71
87
  """
72
88
 
73
89
  # Добавление данных в сообщение об ошибке.
74
- self.__Message = "\"" + Command + "\"."
90
+ self.__Message = "\"" + command + "\"."
75
91
  # Обеспечение доступа к оригиналу наследованного свойства.
76
92
  super().__init__(self.__Message)
77
93
 
78
-
79
- # Преобразователь: представляет содержимое класса как строку.
80
94
  def __str__(self):
81
95
  return self.__Message
82
96
 
@@ -85,18 +99,17 @@ class NotEnoughArguments(Exception):
85
99
  Исключение: недостаточно аргументов.
86
100
  """
87
101
 
88
- # Конструктор: вызывается при обработке исключения.
89
- def __init__(self, Command: str):
102
+ def __init__(self, command: str):
90
103
  """
91
104
  Исключение: недостаточно аргументов.
105
+ command – команда, вызвавшая исключение.
92
106
  """
93
107
 
94
108
  # Добавление данных в сообщение об ошибке.
95
- self.__Message = "\"" + Command + "\"."
109
+ self.__Message = "\"" + command + "\"."
96
110
  # Обеспечение доступа к оригиналу наследованного свойства.
97
111
  super().__init__(self.__Message)
98
112
 
99
- # Информатор: вызывается при выводе исключения в консоль.
100
113
  def __str__(self):
101
114
  return self.__Message
102
115
 
@@ -105,18 +118,17 @@ class TooManyArguments(Exception):
105
118
  Исключение: слишком много аргументов.
106
119
  """
107
120
 
108
- # Конструктор: вызывается при обработке исключения.
109
- def __init__(self, Command: str):
121
+ def __init__(self, command: str):
110
122
  """
111
123
  Исключение: слишком много аргументов.
124
+ command – команда, вызвавшая исключение.
112
125
  """
113
126
 
114
127
  # Добавление данных в сообщение об ошибке.
115
- self.__Message = "\"" + Command + "\"."
128
+ self.__Message = "\"" + command + "\"."
116
129
  # Обеспечение доступа к оригиналу наследованного свойства.
117
130
  super().__init__(self.__Message)
118
131
 
119
- # Преобразователь: представляет содержимое класса как строку.
120
132
  def __str__(self):
121
133
  return self.__Message
122
134
 
@@ -125,18 +137,16 @@ class UnknownCommand(Exception):
125
137
  Исключение: неизвестная комманда.
126
138
  """
127
139
 
128
- # Конструктор: вызывается при обработке исключения.
129
- def __init__(self, Command: str):
140
+ def __init__(self, command: str):
130
141
  """
131
142
  Исключение: неизвестная комманда.
143
+ command – команда, вызвавшая исключение.
132
144
  """
133
145
 
134
146
  # Добавление данных в сообщение об ошибке.
135
- self.__Message = "\"" + Command + "\"."
147
+ self.__Message = "\"" + command + "\"."
136
148
  # Обеспечение доступа к оригиналу наследованного свойства.
137
149
  super().__init__(self.__Message)
138
150
 
139
-
140
- # Преобразователь: представляет содержимое класса как строку.
141
151
  def __str__(self):
142
152
  return self.__Message
@@ -3,7 +3,6 @@ class ConfigRequired(Exception):
3
3
  Исключение: не задана конфигурация.
4
4
  """
5
5
 
6
- # Конструктор: вызывается при обработке исключения.
7
6
  def __init__(self):
8
7
  """
9
8
  Исключение: не задана конфигурация.
@@ -14,7 +13,6 @@ class ConfigRequired(Exception):
14
13
  # Обеспечение доступа к оригиналу наследованного свойства.
15
14
  super().__init__(self.__Message)
16
15
 
17
- # Преобразователь: представляет содержимое класса как строку.
18
16
  def __str__(self):
19
17
  return self.__Message
20
18
 
@@ -23,7 +21,6 @@ class SeleniumRequired(Exception):
23
21
  Исключение: не инициализирован или не установлен Selenium.
24
22
  """
25
23
 
26
- # Конструктор: вызывается при обработке исключения.
27
24
  def __init__(self):
28
25
  """
29
26
  Исключение: не инициализирован или не установлен Selenium.
@@ -34,6 +31,5 @@ class SeleniumRequired(Exception):
34
31
  # Обеспечение доступа к оригиналу наследованного свойства.
35
32
  super().__init__(self.__Message)
36
33
 
37
- # Преобразователь: представляет содержимое класса как строку.
38
34
  def __str__(self):
39
35
  return self.__Message
@@ -0,0 +1,211 @@
1
+ import shutil
2
+ import html
3
+ import json
4
+ import sys
5
+ import os
6
+ import re
7
+
8
+ #==========================================================================================#
9
+ # >>>>> ФУНКЦИИ РАБОТЫ С СИСТЕМОЙ <<<<< #
10
+ #==========================================================================================#
11
+
12
+ def CheckPythonMinimalVersion(major: int, minor: int, raise_exception: bool = True) -> bool:
13
+ """
14
+ Проверяет, соответствует ли используемая версия Python минимальной требуемой.
15
+ major – идентификатор Major-версии Python;
16
+ minor – идентификатор Minor-версии Python;
17
+ raise_exception – указывает, как поступать при несоответствии версии: выбрасывать исключение или возвращать значение.
18
+ """
19
+
20
+ # Состояние: корректна ли версия.
21
+ IsVersionCorrect = True
22
+
23
+ # Если версия Python старше минимальной требуемой.
24
+ if sys.version_info < (major, minor):
25
+
26
+ # Если указано выбросить исключение.
27
+ if raise_exception == True:
28
+ # Выброс исключения.
29
+ raise RuntimeError(f"Python {major}.{minor} or newer is required.")
30
+
31
+ else:
32
+ # Переключение статуса проверки.
33
+ IsVersionCorrect = False
34
+
35
+ return IsVersionCorrect
36
+
37
+ def Cls():
38
+ """
39
+ Очищает консоль.
40
+ """
41
+
42
+ os.system("cls" if os.name == "nt" else "clear")
43
+
44
+ def MakeRootDirectories(directories: list[str]):
45
+ """
46
+ Создаёт каталоги в текущей корневой директории скрипта.
47
+ directories – список названий каталогов.
48
+ """
49
+
50
+ # Для каждого названия каталога.
51
+ for Name in directories:
52
+ # Если каталог не существует, то создать его.
53
+ if os.path.exists(Name) == False: os.makedirs(Name)
54
+
55
+ def RemoveFolderContent(path: str):
56
+ """
57
+ Удаляет всё содержимое каталога.
58
+ path – путь к каталогу.
59
+ """
60
+
61
+ # Список содержимого в папке.
62
+ FolderContent = os.listdir(path)
63
+
64
+ # Для каждого элемента.
65
+ for Item in FolderContent:
66
+
67
+ # Если элемент является каталогом.
68
+ if os.path.isdir(path + "/" + Item):
69
+ # Удаление каталога.
70
+ shutil.rmtree(path + "/" + Item)
71
+
72
+ else:
73
+ # Удаление файла.
74
+ os.remove(path + "/" + Item)
75
+
76
+ def Shutdown():
77
+ """
78
+ Выключает устройство.
79
+ """
80
+
81
+ # Если устройство работает под управлением ОС семейства Linux.
82
+ if sys.platform in ["linux", "linux2"]: os.system("sudo shutdown now")
83
+ # Если устройство работает под управлением ОС семейства Windows.
84
+ if sys.platform == "win32": os.system("shutdown /s")
85
+
86
+ #==========================================================================================#
87
+ # >>>>> ФУНКЦИИ ОБРАБОТКИ ТИПОВ ДАННЫХ <<<<< #
88
+ #==========================================================================================#
89
+
90
+ def CheckForCyrillicPresence(text: str) -> bool:
91
+ """
92
+ Проверяет, имеются ли кирилические символы в строке.
93
+ text – проверяемая строка.
94
+ """
95
+
96
+ # Русский алфавит в нижнем регистре.
97
+ Alphabet = set("абвгдеёжзийклмнопрстуфхцчшщъыьэюя")
98
+ # Состояние: содержит ли строка кирилические символы.
99
+ IsTextContainsCyrillicCharacters = not Alphabet.isdisjoint(text.lower())
100
+
101
+ return IsTextContainsCyrillicCharacters
102
+
103
+ def MergeDictionaries(base_dictionary: dict, mergeable_dictionary: dict, overwrite: bool = False) -> dict:
104
+ """
105
+ Объединяет словари.
106
+ base_dictionary – словарь, в который идёт копирование;
107
+ mergeable_dictionary – словарь, из котрого идёт копирование;
108
+ overwrite – указывает, нужно ли перезаписывать значения конфликтующих ключей базового словаря.
109
+ """
110
+
111
+ # Для каждого ключа.
112
+ for Key in mergeable_dictionary.keys():
113
+
114
+ # Если перезапись отключена и ключ отсутствует в базовом словаре.
115
+ if overwrite == False and Key not in base_dictionary.keys():
116
+ # Копирование в базовый словарь ключа и его значения из объединяемого.
117
+ base_dictionary[Key] = mergeable_dictionary[Key]
118
+
119
+ # Если перезапись включена.
120
+ elif overwrite == True:
121
+ # Копирование в базовый словарь ключа и его значения из объединяемого.
122
+ base_dictionary[Key] = mergeable_dictionary[Key]
123
+
124
+ return base_dictionary
125
+
126
+ def RemoveRecurringSubstrings(string: str, substring: str) -> str:
127
+ """
128
+ Удаляет из строки подряд идущие повторяющиеся подстроки.
129
+ string – строка, из которой удаляются повторы;
130
+ Substring – удаляемая подстрока.
131
+ """
132
+
133
+ # Пока в строке находятся повторы указанного символа, удалять их.
134
+ while substring + substring in string: string = string.replace(substring + substring, substring)
135
+
136
+ return string
137
+
138
+ def ReplaceDictionaryKey(dictionary: dict, old_key: any, new_key: any) -> dict:
139
+ """
140
+ Заменяет ключ в словаре, сохраняя исходный порядок элементов.
141
+ dictionary – обрабатываемый словарь;
142
+ old_key – старое название ключа;
143
+ new_key – новое название ключа.
144
+ """
145
+
146
+ # Результат выполнения.
147
+ Result = dict()
148
+ # Если ключ не найден, выбросить исключение.
149
+ if old_key not in dictionary.keys(): raise KeyError(str(old_key))
150
+
151
+ # Для каждого ключа.
152
+ for Key in dictionary.keys():
153
+
154
+ # Если текущий ключ совпадает с искомым.
155
+ if Key == old_key:
156
+ # Замена ключа новым.
157
+ Result[new_key] = dictionary[old_key]
158
+
159
+ else:
160
+ # Копирование старой пары ключ-значение.
161
+ Result[Key] = dictionary[Key]
162
+
163
+ return Result
164
+
165
+ def ReplaceRegexSubstring(origin: str, regex: str, substring: str) -> str:
166
+ """
167
+ Заменяет все вхождения регулярного выражения в строке на подстроку.
168
+ origin – обрабатываемая строка;
169
+ regex – регулярное выражение для поиска подстрок;
170
+ substring – вставляемая подстрока.
171
+ """
172
+
173
+ # Список совпадений.
174
+ RegexSubstring = list()
175
+
176
+ while re.findall(regex, origin) != []:
177
+ # Буфер.
178
+ RegexSubstring = re.findall(regex, origin)
179
+ # Поиск всех совпадений.
180
+ RegexSubstring = RegexSubstring[0] if len(RegexSubstring) > 0 else None
181
+ # Удаление подстроки.
182
+ if RegexSubstring != None: origin = origin.replace(RegexSubstring, substring)
183
+
184
+ return origin
185
+
186
+ #==========================================================================================#
187
+ # >>>>> ФУНКЦИИ РАБОТЫ С JSON <<<<< #
188
+ #==========================================================================================#
189
+
190
+ def ReadJSON(path: str) -> dict:
191
+ """
192
+ Читает файл JSON и конвертирует его в словарь.
193
+ path – путь к файлу.
194
+ """
195
+
196
+ # Словарь для преобразования.
197
+ JSON = dict()
198
+ # Открытие и чтение файла JSON.
199
+ with open(path, encoding = "utf-8") as FileRead: JSON = json.load(FileRead)
200
+
201
+ return JSON
202
+
203
+ def WriteJSON(path: str, dictionary: dict):
204
+ """
205
+ Записывает стандартизированный JSON файл. Для отступов используются символы табуляции.
206
+ path – путь к файлу;
207
+ dictionary – словарь, конвертируемый в формат JSON.
208
+ """
209
+
210
+ # Запись словаря в JSON файл.
211
+ with open(path, "w", encoding = "utf-8") as FileWrite: json.dump(dictionary, FileWrite, ensure_ascii = False, indent = '\t', separators = (",", ": "))
@@ -0,0 +1,127 @@
1
+ from dublib.Methods import ReplaceRegexSubstring
2
+
3
+ import html
4
+ import re
5
+
6
+ class HTML:
7
+ """
8
+ Объектная реализация обработчика HTML.
9
+ """
10
+
11
+ #==========================================================================================#
12
+ # >>>>> СВОЙСТВА ТОЛЬКО ДЛЯ ЧТЕНИЯ <<<<< #
13
+ #==========================================================================================#
14
+
15
+ @property
16
+ def text(self) -> str:
17
+ """
18
+ Текст.
19
+ """
20
+
21
+ return self.__Text
22
+
23
+ @property
24
+ def plain_text(self) -> str:
25
+ """
26
+ Текст без тегов и спецсимволов HTML.
27
+ """
28
+
29
+ # Конвертирование спецсимволов HTML в Unicode.
30
+ PlainText = html.unescape(self.__Text)
31
+ # Удаление найденных по регулярному выражению тегов.
32
+ PlainText = str(re.sub(self.__AllTagsRegex, "", PlainText))
33
+
34
+ return PlainText
35
+
36
+ #==========================================================================================#
37
+ # >>>>> МЕТОДЫ <<<<< #
38
+ #==========================================================================================#
39
+
40
+ def __init__(self, text: str):
41
+ """
42
+ Объектная реализация обработчика HTML.
43
+ text – текст, подлежащий обработке.
44
+ """
45
+
46
+ #---> Генерация динамических свойств.
47
+ #==========================================================================================#
48
+ # Регулярное выражение фильтрации тегов HTML.
49
+ self.__AllTagsRegex = re.compile('<.*?>|&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-f]{1,6});')
50
+ # Обрабатываемый текст.
51
+ self.__Text = text
52
+
53
+ def __str__(self) -> str:
54
+ return self.__Text
55
+
56
+ def remove_tags(self):
57
+ """
58
+ Удаляет все теги HTML из текста.
59
+ """
60
+
61
+ # Удаление найденных по регулярному выражению тегов.
62
+ self.__Text = str(re.sub(self.__AllTagsRegex, "", self.__Text))
63
+
64
+ def unescape(self):
65
+ """
66
+ Преобразует спецсимволы HTML в Unicode.
67
+ """
68
+
69
+ # Конвертирование спецсимволов HTML в Unicode.
70
+ self.__Text = html.unescape(self.__Text)
71
+
72
+ class Markdown:
73
+ """
74
+ Объектная реализация обработчика Markdown.
75
+ """
76
+
77
+ #==========================================================================================#
78
+ # >>>>> СВОЙСТВА ТОЛЬКО ДЛЯ ЧТЕНИЯ <<<<< #
79
+ #==========================================================================================#
80
+
81
+ @property
82
+ def escaped_text(self) -> str:
83
+ """
84
+ Экранированный текст.
85
+ """
86
+ # Буфер текста.
87
+ Text = self.__Text
88
+ # Для каждого спецсимвола провести экранирование.
89
+ for Character in self.__SpecialCharacters: Text = ReplaceRegexSubstring(".This is a test. This is only a test.", f"(?<!\\\\)\\{Character}", f"\\{Character}")
90
+
91
+ return Text
92
+
93
+ @property
94
+ def text(self) -> str:
95
+ """
96
+ Текст.
97
+ """
98
+
99
+ return self.__Text
100
+
101
+ #==========================================================================================#
102
+ # >>>>> МЕТОДЫ <<<<< #
103
+ #==========================================================================================#
104
+
105
+ def __init__(self, text: str):
106
+ """
107
+ Объектная реализация обработчика Markdown.
108
+ text – текст, подлежащий обработке.
109
+ """
110
+
111
+ #---> Генерация динамических свойств.
112
+ #==========================================================================================#
113
+ # Обрабатываемый текст.
114
+ self.__Text = str(text)
115
+ # Список спецсимволов.
116
+ self.__SpecialCharacters = ['_', '*', '[', ']', '(', ')', '~', '`', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!']
117
+
118
+ def __str__(self) -> str:
119
+ return self.__Text
120
+
121
+ def escape(self):
122
+ """
123
+ Экранирует спецсимволы.
124
+ """
125
+
126
+ # Для каждого спецсимвола провести экранирование.
127
+ for Character in self.__SpecialCharacters: self.__Text = ReplaceRegexSubstring(".This is a test. This is only a test.", f"(?<!\\\\)\\{Character}", f"\\{Character}")