Serg4451D commited on
Commit
edf045f
·
verified ·
1 Parent(s): 60c0cd2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +50 -37
app.py CHANGED
@@ -5,51 +5,64 @@ import tempfile
5
 
6
  def minify_html_file(html_file):
7
  """
8
- Минифицирует содержимое HTML файла и возвращает минифицированный текст,
9
- информацию об оптимизации и путь к временному файлу для скачивания.
 
 
 
 
10
  """
 
11
  if html_file is None:
12
- return "", "Пожалуйста, загрузите HTML файл.", None
13
 
14
  try:
15
- # Читаем содержимое файла
16
  with open(html_file.name, 'r', encoding='utf-8') as f:
17
- original_content = f.read()
18
 
19
- original_size = len(original_content.encode('utf-8')) # Размер в байтах
20
 
21
- # Минифицируем содержимое с параметрами для максимальной эффективности
22
- minified_content = htmlmin.minify(
23
- original_content,
24
- remove_comments=True, # Удаляем HTML-комментарии
25
- remove_empty_space=True, # Удаляем лишние пробелы между тегами
26
- reduce_empty_attributes=True, # Удаляем атрибуты с пустыми значениями (e.g., class="")
27
- reduce_boolean_attributes=True,# Сокращаем булевы атрибуты (e.g., disabled="disabled" -> disabled)
28
- remove_optional_attribute_quotes=False, # Оставляем кавычки атрибутов для безопасности
29
- pre_tags=('pre', 'textarea') # Сохраняем содержимое <pre> и <textarea> без изменений
30
  )
31
 
32
- minified_size = len(minified_content.encode('utf-8')) # Размер после минификации
33
- reduction_percent = ((original_size - minified_size) / original_size) * 100 if original_size > 0 else 0
 
34
 
35
- status_message = f"Исходный размер: {original_size} байт\n" \
36
- f"Минифицированный размер: {minified_size} байт\n" \
37
- f"Уменьшение размера: {original_size - minified_size} байт ({reduction_percent:.2f}%)"
 
 
38
 
39
- # Сохраняем минифицированный контент во временный файл для скачивания
40
- with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.html', encoding='utf-8') as tmp_file:
41
- tmp_file.write(minified_content)
42
- temp_file_path = tmp_file.name
 
 
 
 
 
43
 
44
- return minified_content, status_message, temp_file_path
45
 
46
  except Exception as e:
47
- # Очищаем временный файл в случае ошибки
48
- if 'temp_file_path' in locals() and os.path.exists(temp_file_path):
49
- os.remove(temp_file_path)
50
- return "", f"Ошибка при минификации: {e}", None
51
 
52
- # Создаем интерфейс Gradio
53
  interface = gr.Interface(
54
  fn=minify_html_file,
55
  inputs=gr.File(label="Загрузите HTML файл (.html)", file_types=['.html'], type="file"),
@@ -58,13 +71,13 @@ interface = gr.Interface(
58
  gr.Textbox(label="Результат оптимизации", interactive=False),
59
  gr.File(label="Скачать минифицированный файл")
60
  ],
61
- title="HTML Минификатор",
62
- description="Загрузите HTML файл для минификации. "
63
- "Инструмент удаляет комментарии, лишние пробелы и оптимизирует атрибуты, "
64
- "уменьшая размер файла без потери функциональности. "
65
- "Содержимое тегов <pre> и <textarea> сохраняется как есть."
 
66
  )
67
 
68
- # Запускаем приложение
69
  if __name__ == "__main__":
70
- interface.launch()
 
5
 
6
  def minify_html_file(html_file):
7
  """
8
+ Минифицирует HTML: удаляет комментарии, пробелы и оптимизирует атрибуты,
9
+ сохраняя содержимое <pre> и <textarea> нетронутым.
10
+ Возвращает:
11
+ 1) минифицированный код
12
+ 2) статус (размеры и % оптимизации)
13
+ 3) путь до временного файла для скачивания
14
  """
15
+ # Если файл не загружен
16
  if html_file is None:
17
+ return "", "Пожалуйста, загрузите HTML файл.", ""
18
 
19
  try:
20
+ # Читаем исходный контент
21
  with open(html_file.name, 'r', encoding='utf-8') as f:
22
+ original = f.read()
23
 
24
+ orig_size = len(original.encode('utf-8'))
25
 
26
+ # Минифицируем
27
+ minified = htmlmin.minify(
28
+ original,
29
+ remove_comments=True,
30
+ remove_empty_space=True,
31
+ reduce_empty_attributes=True,
32
+ reduce_boolean_attributes=True,
33
+ remove_optional_attribute_quotes=False,
34
+ keep_pre=True # сохраняем <pre> и <textarea>
35
  )
36
 
37
+ min_size = len(minified.encode('utf-8'))
38
+ saving = orig_size - min_size
39
+ percent = (saving / orig_size * 100) if orig_size > 0 else 0.0
40
 
41
+ status = (
42
+ f"Исходный размер: {orig_size} байт\n"
43
+ f"Минифицированный размер: {min_size} байт\n"
44
+ f"Экономия: {saving} байт ({percent:.2f}%)"
45
+ )
46
 
47
+ # Сохраняем во временный файл и возвращаем путь
48
+ tmp = tempfile.NamedTemporaryFile(
49
+ mode='w',
50
+ delete=False,
51
+ suffix='.html',
52
+ encoding='utf-8'
53
+ )
54
+ tmp.write(minified)
55
+ tmp.close()
56
 
57
+ return minified, status, tmp.name
58
 
59
  except Exception as e:
60
+ # В случае ошибки удаляем файл, если он был создан
61
+ if 'tmp' in locals() and os.path.exists(tmp.name):
62
+ os.remove(tmp.name)
63
+ return "", f"Ошибка при миниф��кации:\n{e}", ""
64
 
65
+ # --- Gradio UI ---
66
  interface = gr.Interface(
67
  fn=minify_html_file,
68
  inputs=gr.File(label="Загрузите HTML файл (.html)", file_types=['.html'], type="file"),
 
71
  gr.Textbox(label="Результат оптимизации", interactive=False),
72
  gr.File(label="Скачать минифицированный файл")
73
  ],
74
+ title="🌐 HTML Минификатор",
75
+ description=(
76
+ "Загрузите ваш HTML-файл для минификации. "
77
+ "Инструмент удаляет комментарии, лишние пробелы и оптимизирует атрибуты, "
78
+ "сохраняя контент внутри <pre> и <textarea> нетронутым."
79
+ )
80
  )
81
 
 
82
  if __name__ == "__main__":
83
+ interface.launch(share=True)