diff --git a/History/2026-08-19-live-filename.md b/History/2026-08-19-live-filename.md new file mode 100644 index 0000000..a622f62 --- /dev/null +++ b/History/2026-08-19-live-filename.md @@ -0,0 +1,39 @@ +# v0.0.40 — имя файла в live-блоке + сброс итогов — 2026-08-19 + +**Дата:** 2026-08-19 +**Версия:** 0.0.39 → 0.0.40 + +--- + +## Суть + +Два UX-фикса во время обработки: + +1. **Имя текущего файла в live-блоке.** Раньше `start`-событие (с именем файла) + слалось только в **проходе 2** (замена), который идёт ПОСЛЕ LLM. А LLM — в + проходе 1 и самый долгий. Поэтому во время LLM висело «Подготовка…» вместо + имени файла. + +2. **Сброс старых «Итогов» при повторной обфускации.** Раньше блок + «📊 Итоги обработки» не скрывался при новом запуске — старые итоги висели + во время новой обработки. + +## Изменения + +### `drhider/obfuscator.py` +- `progress_cb("start", i, total, name)` перенесён из прохода 2 в **проход 1** + (перед `extract_text` каждого файла). +- В проходе 2 остался только `progress_cb("done", ...)`. +- Порядок событий: `start`×N (extract_text) → `done`×N (замена). + +### `site/templates/index.html` +- В начале `uploadFiles()` добавлено скрытие `#statsBlock` и `#liveBlock` + (как уже скрывается `db`). + +### `site/app.py` +- `VERSION = "0.0.40"`. + +## Проверка +- Порядок событий: `[start(0), start(1), done(0), done(1)]` — корректно. +- `node --check`, `py_compile` — OK. +- Тесты: builder 20/20, replacer 10/10, scanner 20/20, zip 28/28. diff --git a/drhider/obfuscator.py b/drhider/obfuscator.py index de3936e..dd0d1e8 100644 --- a/drhider/obfuscator.py +++ b/drhider/obfuscator.py @@ -111,8 +111,13 @@ class TwoPassObfuscator: # ── Проход 1: сбор сущностей ── # Извлекаем Markdown из каждого файла all_texts: Dict[str, str] = {} + total = len(files) + + for i, (fname, content, ctype) in enumerate(files): + display_name = os.path.basename(fname) or fname + if progress_cb: + progress_cb("start", i, total, display_name) - for fname, content, ctype in files: text = extractor.extract_text(fname, content, ctype) all_texts[fname] = text @@ -131,13 +136,10 @@ class TwoPassObfuscator: # ── Проход 2: замена сущностей ── results: List[Tuple[str, bytes]] = [] - total = len(files) for i, (in_fname, content, ctype) in enumerate(files): fname = in_fname display_name = os.path.basename(in_fname) or in_fname - if progress_cb: - progress_cb("start", i, total, display_name) obf_content = content # По умолчанию — без изменений diff --git a/site/app.py b/site/app.py index ee049a4..e102cf3 100644 --- a/site/app.py +++ b/site/app.py @@ -20,7 +20,7 @@ if _sys_path_root not in sys.path: sys.path.insert(0, _sys_path_root) # Версия приложения (меняется при изменениях) -VERSION = "0.0.39" +VERSION = "0.0.40" def create_app(): diff --git a/site/templates/index.html b/site/templates/index.html index 364bee5..b6362dd 100644 --- a/site/templates/index.html +++ b/site/templates/index.html @@ -374,6 +374,8 @@ async function uploadFiles() { st.className = ''; st.textContent = ''; db.classList.remove('show'); + document.getElementById('statsBlock').classList.remove('show'); + document.getElementById('liveBlock').classList.remove('show'); ub.disabled = true; const total = files.length;