File size: 3,300 Bytes
622a1cd edf045f 622a1cd edf045f 622a1cd edf045f 622a1cd edf045f 622a1cd edf045f 622a1cd edf045f 622a1cd edf045f 622a1cd edf045f 622a1cd edf045f 622a1cd edf045f 622a1cd edf045f 622a1cd edf045f 622a1cd edf045f 622a1cd edf045f 622a1cd edf045f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
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) |