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.
- {dublib-0.2.0/src/dublib.egg-info → dublib-0.3.0}/PKG-INFO +21 -3
- dublib-0.3.0/README.md +29 -0
- {dublib-0.2.0 → dublib-0.3.0}/pyproject.toml +1 -1
- {dublib-0.2.0 → dublib-0.3.0}/src/dublib/Exceptions/StyledPrinter.py +0 -2
- {dublib-0.2.0 → dublib-0.3.0}/src/dublib/Exceptions/Terminalyzer.py +42 -32
- {dublib-0.2.0 → dublib-0.3.0}/src/dublib/Exceptions/WebRequestor.py +0 -4
- dublib-0.3.0/src/dublib/Methods.py +211 -0
- dublib-0.3.0/src/dublib/Polyglot.py +127 -0
- dublib-0.3.0/src/dublib/StyledPrinter.py +135 -0
- dublib-0.3.0/src/dublib/Terminalyzer.py +1024 -0
- {dublib-0.2.0 → dublib-0.3.0}/src/dublib/WebRequestor.py +191 -207
- {dublib-0.2.0 → dublib-0.3.0/src/dublib.egg-info}/PKG-INFO +21 -3
- {dublib-0.2.0 → dublib-0.3.0}/src/dublib.egg-info/SOURCES.txt +1 -0
- dublib-0.2.0/README.md +0 -11
- dublib-0.2.0/src/dublib/Methods.py +0 -196
- dublib-0.2.0/src/dublib/StyledPrinter.py +0 -155
- dublib-0.2.0/src/dublib/Terminalyzer.py +0 -753
- {dublib-0.2.0 → dublib-0.3.0}/LICENSE +0 -0
- {dublib-0.2.0 → dublib-0.3.0}/setup.cfg +0 -0
- {dublib-0.2.0 → dublib-0.3.0}/src/dublib/Exceptions/__init__.py +0 -0
- {dublib-0.2.0 → dublib-0.3.0}/src/dublib/__init__.py +0 -0
- {dublib-0.2.0 → dublib-0.3.0}/src/dublib.egg-info/dependency_links.txt +0 -0
- {dublib-0.2.0 → dublib-0.3.0}/src/dublib.egg-info/requires.txt +0 -0
- {dublib-0.2.0 → dublib-0.3.0}/src/dublib.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: dublib
|
|
3
|
-
Version: 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
|
-
* [
|
|
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
|
-
|
|
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,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 = "\"" +
|
|
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 = "\"" +
|
|
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 = "\"" +
|
|
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 = "\"" +
|
|
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 = "\"" +
|
|
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 = "\"" +
|
|
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 = "\"" +
|
|
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}")
|