Update app.py
Browse files
app.py
CHANGED
|
@@ -16,37 +16,27 @@ def minify_html_file(html_file):
|
|
| 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, #
|
| 26 |
-
remove_empty_space=True, #
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 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
|
|
@@ -54,17 +44,10 @@ def minify_html_file(html_file):
|
|
| 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 |
-
|
| 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(
|
|
@@ -76,9 +59,10 @@ interface = gr.Interface(
|
|
| 76 |
gr.File(label="Скачать минифицированный файл")
|
| 77 |
],
|
| 78 |
title="HTML Минификатор",
|
| 79 |
-
description="Загрузите HTML файл для
|
| 80 |
-
"Инструмент удаляет комментарии, лишние
|
| 81 |
-
"
|
|
|
|
| 82 |
)
|
| 83 |
|
| 84 |
# Запускаем приложение
|
|
|
|
| 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 |
minified_content = htmlmin.minify(
|
| 23 |
original_content,
|
| 24 |
+
remove_comments=True, # Удаляем HTML-комментарии
|
| 25 |
+
remove_empty_space=True, # Удаляем лишние пробелы между тегами
|
| 26 |
+
reduce_empty_attributes=True, # Удаляем атрибуты с пустыми значениями (e.g., class="")
|
| 27 |
+
reduce_boolean_attributes=True,# Сокращаем булевы атрибуты (e.g., disabled="disabled" -> disabled)
|
| 28 |
+
remove_optional_attribute_quotes=False, # Оставляем кавычки атрибутов для безопасности
|
| 29 |
+
pre_tags=('pre', 'textarea') # Сохраняем содержимое <pre> и <textarea> без изменений
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
)
|
| 31 |
|
| 32 |
+
minified_size = len(minified_content.encode('utf-8')) # Размер после минификации
|
| 33 |
reduction_percent = ((original_size - minified_size) / original_size) * 100 if original_size > 0 else 0
|
| 34 |
|
| 35 |
status_message = f"Исходный размер: {original_size} байт\n" \
|
| 36 |
f"Минифицированный размер: {minified_size} байт\n" \
|
| 37 |
f"Уменьшение размера: {original_size - minified_size} байт ({reduction_percent:.2f}%)"
|
| 38 |
|
| 39 |
+
# Сохраняем минифицированный контент во временный файл для скачивания
|
|
|
|
|
|
|
| 40 |
with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.html', encoding='utf-8') as tmp_file:
|
| 41 |
tmp_file.write(minified_content)
|
| 42 |
temp_file_path = tmp_file.name
|
|
|
|
| 44 |
return minified_content, status_message, temp_file_path
|
| 45 |
|
| 46 |
except Exception as e:
|
| 47 |
+
# Очищаем временный файл в случае ошибки
|
| 48 |
if 'temp_file_path' in locals() and os.path.exists(temp_file_path):
|
| 49 |
+
os.remove(temp_file_path)
|
| 50 |
return "", f"Ошибка при минификации: {e}", None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 51 |
|
| 52 |
# Создаем интерфейс Gradio
|
| 53 |
interface = gr.Interface(
|
|
|
|
| 59 |
gr.File(label="Скачать минифицированный файл")
|
| 60 |
],
|
| 61 |
title="HTML Минификатор",
|
| 62 |
+
description="Загрузите HTML файл для минификации. "
|
| 63 |
+
"Инструмент удаляет комментарии, лишние пробелы и оптимизирует атрибуты, "
|
| 64 |
+
"уменьшая размер файла без потери функциональности. "
|
| 65 |
+
"Содержимое тегов <pre> и <textarea> сохраняется как есть."
|
| 66 |
)
|
| 67 |
|
| 68 |
# Запускаем приложение
|