optimiz / app.py
Serg4451D's picture
Update app.py
418f355 verified
raw
history blame
3.09 kB
import gradio as gr
import htmlmin
import os
import tempfile
def minify_html_file(html_path):
"""
Принимает путь к HTML-файлу, минифицирует его и возвращает:
1) минифицированный код в виде текста,
2) информацию о размере до/после и сэкономленных байтах,
3) путь к временному файлу для скачивания.
"""
if not html_path:
return "", "❗ Пожалуйста, загрузите HTML-файл.", ""
try:
# Читаем оригинальный код
with open(html_path, 'r', encoding='utf-8') as f:
original = f.read()
orig_size = len(original.encode('utf-8'))
# Минифицируем
minified = htmlmin.minify(
original,
remove_comments=True,
remove_empty_space=True,
reduce_empty_attributes=True,
reduce_boolean_attributes=True,
remove_optional_attribute_quotes=False,
keep_pre=True
)
min_size = len(minified.encode('utf-8'))
saved = orig_size - min_size
pct = (saved / orig_size * 100) if orig_size else 0.0
status = (
f"Исходный размер: {orig_size} байт\n"
f"Минифицированный размер: {min_size} байт\n"
f"Экономия: {saved} байт ({pct:.2f}%)"
)
# Сохраняем в tmp и возвращаем путь
tmp_file = tempfile.NamedTemporaryFile(
mode='w', delete=False, suffix='.html', encoding='utf-8'
)
tmp_file.write(minified)
tmp_file.close()
return minified, status, tmp_file.name
except Exception as e:
# При ошибке удаляем файл, если создался
if 'tmp_file' in locals() and os.path.exists(tmp_file.name):
os.remove(tmp_file.name)
return "", f"❌ Ошибка при минификации:\n{e}", ""
# --- Gradio UI ---
interface = gr.Interface(
fn=minify_html_file,
inputs=gr.File(
label="Загрузите HTML-файл (.html)",
file_types=['.html'],
type="filepath" # <-- заменили "file" на "filepath"
),
outputs=[
gr.Textbox(label="Минифицированный HTML-код", lines=20, interactive=False),
gr.Textbox(label="Результат оптимизации", interactive=False),
gr.File(label="Скачать минифицированный файл")
],
title="🌐 HTML Минификатор",
description=(
"Загрузите ваш HTML-файл для минификации. "
"Удаляем комментарии, лишние пробелы, оптимизируем атрибуты "
"и сохраняем <pre>/<textarea> без изменений."
)
)
if __name__ == "__main__":
interface.launch()