|
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 |
|
) |
|
|
|
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}", "" |
|
|
|
|
|
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) |