File size: 3,094 Bytes
622a1cd
 
 
 
 
418f355
622a1cd
418f355
 
 
 
622a1cd
418f355
 
 
622a1cd
418f355
 
edf045f
 
622a1cd
edf045f
 
 
 
 
 
 
 
418f355
622a1cd
edf045f
418f355
 
622a1cd
edf045f
 
 
418f355
edf045f
622a1cd
418f355
 
 
edf045f
418f355
 
622a1cd
418f355
622a1cd
 
418f355
 
 
edf045f
622a1cd
edf045f
622a1cd
 
418f355
 
 
 
 
622a1cd
418f355
622a1cd
 
 
edf045f
 
 
418f355
 
edf045f
622a1cd
 
 
418f355
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
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 и возвращаем путь
        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}", ""

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