optimiz / app.py
Serg4451D's picture
Update app.py
edf045f verified
raw
history blame
3.3 kB
import gradio as gr
import htmlmin
import os
import tempfile
def minify_html_file(html_file):
"""
Минифицирует HTML: удаляет комментарии, пробелы и оптимизирует атрибуты,
сохраняя содержимое <pre> и <textarea> нетронутым.
Возвращает:
1) минифицированный код
2) статус (размеры и % оптимизации)
3) путь до временного файла для скачивания
"""
# Если файл не загружен
if html_file is None:
return "", "❗ Пожалуйста, загрузите HTML файл.", ""
try:
# Читаем исходный контент
with open(html_file.name, '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 # сохраняем <pre> и <textarea>
)
min_size = len(minified.encode('utf-8'))
saving = orig_size - min_size
percent = (saving / orig_size * 100) if orig_size > 0 else 0.0
status = (
f"Исходный размер: {orig_size} байт\n"
f"Минифицированный размер: {min_size} байт\n"
f"Экономия: {saving} байт ({percent:.2f}%)"
)
# Сохраняем во временный файл и возвращаем путь
tmp = tempfile.NamedTemporaryFile(
mode='w',
delete=False,
suffix='.html',
encoding='utf-8'
)
tmp.write(minified)
tmp.close()
return minified, status, tmp.name
except Exception as e:
# В случае ошибки — удаляем файл, если он был создан
if 'tmp' in locals() and os.path.exists(tmp.name):
os.remove(tmp.name)
return "", f"❌ Ошибка при минификации:\n{e}", ""
# --- Gradio UI ---
interface = gr.Interface(
fn=minify_html_file,
inputs=gr.File(label="Загрузите HTML файл (.html)", file_types=['.html'], type="file"),
outputs=[
gr.Textbox(label="Минифицированный HTML код", lines=25, interactive=False),
gr.Textbox(label="Результат оптимизации", interactive=False),
gr.File(label="Скачать минифицированный файл")
],
title="🌐 HTML Минификатор",
description=(
"Загрузите ваш HTML-файл для минификации. "
"Инструмент удаляет комментарии, лишние пробелы и оптимизирует атрибуты, "
"сохраняя контент внутри <pre> и <textarea> нетронутым."
)
)
if __name__ == "__main__":
interface.launch(share=True)