|
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_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}", "" |
|
|
|
|
|
interface = gr.Interface( |
|
fn=minify_html_file, |
|
inputs=gr.File( |
|
label="Загрузите HTML-файл (.html)", |
|
file_types=['.html'], |
|
type="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() |