v0.0.40: имя файла в live-блоке + сброс старых итогов при повторной обфускации
Deploy drhider / validate (push) Canceled after 0s
Deploy drhider / validate (push) Canceled after 0s
This commit is contained in:
@@ -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.
|
||||||
@@ -111,8 +111,13 @@ class TwoPassObfuscator:
|
|||||||
# ── Проход 1: сбор сущностей ──
|
# ── Проход 1: сбор сущностей ──
|
||||||
# Извлекаем Markdown из каждого файла
|
# Извлекаем Markdown из каждого файла
|
||||||
all_texts: Dict[str, str] = {}
|
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)
|
text = extractor.extract_text(fname, content, ctype)
|
||||||
all_texts[fname] = text
|
all_texts[fname] = text
|
||||||
|
|
||||||
@@ -131,13 +136,10 @@ class TwoPassObfuscator:
|
|||||||
|
|
||||||
# ── Проход 2: замена сущностей ──
|
# ── Проход 2: замена сущностей ──
|
||||||
results: List[Tuple[str, bytes]] = []
|
results: List[Tuple[str, bytes]] = []
|
||||||
total = len(files)
|
|
||||||
|
|
||||||
for i, (in_fname, content, ctype) in enumerate(files):
|
for i, (in_fname, content, ctype) in enumerate(files):
|
||||||
fname = in_fname
|
fname = in_fname
|
||||||
display_name = os.path.basename(in_fname) or 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 # По умолчанию — без изменений
|
obf_content = content # По умолчанию — без изменений
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@ if _sys_path_root not in sys.path:
|
|||||||
sys.path.insert(0, _sys_path_root)
|
sys.path.insert(0, _sys_path_root)
|
||||||
|
|
||||||
# Версия приложения (меняется при изменениях)
|
# Версия приложения (меняется при изменениях)
|
||||||
VERSION = "0.0.39"
|
VERSION = "0.0.40"
|
||||||
|
|
||||||
|
|
||||||
def create_app():
|
def create_app():
|
||||||
|
|||||||
@@ -374,6 +374,8 @@ async function uploadFiles() {
|
|||||||
st.className = '';
|
st.className = '';
|
||||||
st.textContent = '';
|
st.textContent = '';
|
||||||
db.classList.remove('show');
|
db.classList.remove('show');
|
||||||
|
document.getElementById('statsBlock').classList.remove('show');
|
||||||
|
document.getElementById('liveBlock').classList.remove('show');
|
||||||
ub.disabled = true;
|
ub.disabled = true;
|
||||||
const total = files.length;
|
const total = files.length;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user