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)