Serg4451D commited on
Commit
622a1cd
·
verified ·
1 Parent(s): 9ebf048

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +86 -0
app.py ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import htmlmin
3
+ import os
4
+ import tempfile
5
+
6
+ def minify_html_file(html_file):
7
+ """
8
+ Минифицирует содержимое HTML файла и возвращает минифицированный текст,
9
+ информацию об оптимизации и путь к временному файлу для скачивания.
10
+ """
11
+ if html_file is None:
12
+ return "", "Пожалуйста, загрузите HTML файл.", None
13
+
14
+ try:
15
+ # Читаем содержимое файла
16
+ with open(html_file.name, 'r', encoding='utf-8') as f:
17
+ original_content = f.read()
18
+
19
+ original_size = len(original_content.encode('utf-8')) # Размер в байтах
20
+
21
+ # Параметры минификации для максимальной эффективности
22
+ # (можно регулировать, если нужно менее агрессивное сжатие)
23
+ minified_content = htmlmin.minify(
24
+ original_content,
25
+ remove_comments=True, # Удалять HTML комментарии
26
+ remove_empty_space=True, # Удалять пробелы между тегами и внутри блоков
27
+ remove_empty_attributes=True, # Удалять пустые атрибуты (e.g., class="")
28
+ reduce_empty_attributes=True, # Синоним remove_empty_attributes
29
+ reduce_boolean_attributes=True,# Сокращать булевы атрибуты (e.g., <input disabled>)
30
+ remove_optional_attribute_quotes=False, # Оставлять кавычки атрибутов (убирать их может быть рискованно)
31
+ remove_redundant_attributes=True, # Удалять избыточные атрибуты (e.g. type="text/javascript")
32
+ do_not_minify_page_inline_css=False, # Минифицировать <style> блоки
33
+ do_not_minify_page_inline_js=False, # Минифицировать <script> блоки
34
+ remove_http_protocol_attributes=False, # Не удалять http: из ссылок (может нарушить старые ссылки)
35
+ remove_input_attributes=False, # Не удалять type="text" у input
36
+ keep_pre=False # Минифицировать содержимое <pre> (может сломать форматирование)
37
+ # Можно добавить другие опции, см. документацию htmlmin
38
+ )
39
+
40
+ minified_size = len(minified_content.encode('utf-8')) # Размер минифицированного контента
41
+ reduction_percent = ((original_size - minified_size) / original_size) * 100 if original_size > 0 else 0
42
+
43
+ status_message = f"Исходный размер: {original_size} байт\n" \
44
+ f"Минифицированный размер: {minified_size} байт\n" \
45
+ f"Уменьшение размера: {original_size - minified_size} байт ({reduction_percent:.2f}%)"
46
+
47
+ # Сохраняем минифицированное содержимое во временный файл для скачивания
48
+ # Используем NamedTemporaryFile для безопасного создания файла и получения пути
49
+ # delete=False означает, что файл не будет удален сразу после закрытия, Gradio управляет этим
50
+ with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.html', encoding='utf-8') as tmp_file:
51
+ tmp_file.write(minified_content)
52
+ temp_file_path = tmp_file.name
53
+
54
+ return minified_content, status_message, temp_file_path
55
+
56
+ except Exception as e:
57
+ # Удаляем временный файл, если он был создан до ошибки
58
+ if 'temp_file_path' in locals() and os.path.exists(temp_file_path):
59
+ os.remove(temp_file_path)
60
+ return "", f"Ошибка при минификации: {e}", None
61
+ finally:
62
+ # Gradio сам очищает временные файлы, созданные через file_obj.name
63
+ # Но если вы создаете свои временные файлы (как tmp_file), нужно убедиться в их удалении
64
+ # В данном случае NamedTemporaryFile с delete=False и управлением через Gradio download component достаточно.
65
+ # Просто убедимся, что исходный временный файл от Gradio корректно обрабатывается (он удаляется автоматически)
66
+ pass
67
+
68
+
69
+ # Создаем интерфейс Gradio
70
+ interface = gr.Interface(
71
+ fn=minify_html_file,
72
+ inputs=gr.File(label="Загрузите HTML файл (.html)", file_types=['.html'], type="file"),
73
+ outputs=[
74
+ gr.Textbox(label="Минифицированный HTML код", lines=25, interactive=False),
75
+ gr.Textbox(label="Результат оптимизации", interactive=False),
76
+ gr.File(label="Скачать минифицированный файл")
77
+ ],
78
+ title="HTML Минификатор",
79
+ description="Загрузите HTML файл для максимальной минификации. "
80
+ "Инструмент удаляет комментарии, лишние пробелы, оптимизирует инлайн CSS и JS, "
81
+ "что значительно уменьшает размер файла без потери функциональности."
82
+ )
83
+
84
+ # Запускаем приложение
85
+ if __name__ == "__main__":
86
+ interface.launch()