diff --git a/site/app.py b/site/app.py index b12bb46..e1b705a 100644 --- a/site/app.py +++ b/site/app.py @@ -22,7 +22,7 @@ if _sys_path_root not in sys.path: sys.path.insert(0, _sys_path_root) # Версия приложения (меняется при изменениях) -VERSION = "1.1.0" +VERSION = "1.1.1" def setup_logging(): diff --git a/site/static/fonts/Ubuntu.woff2 b/site/static/fonts/Ubuntu.woff2 new file mode 100644 index 0000000..588b284 Binary files /dev/null and b/site/static/fonts/Ubuntu.woff2 differ diff --git a/site/templates/index.html b/site/templates/index.html index 7cf3c3d..2cc6988 100644 --- a/site/templates/index.html +++ b/site/templates/index.html @@ -10,16 +10,24 @@ Obfuscator — обфускация документов @@ -453,43 +444,41 @@ HELP
+

Обфускация документов

+

Загрузите документы — получите ZIP с обезличенными копиями. CSV с таблицей замен скачивается отдельно.

-
Обфускация документов
-

- Загрузите документы (.docx, .doc, .pdf, .txt, .md, .zip) — получите ZIP с обезличенными копиями.
- CSV с таблицей замен скачивается отдельно.
- Ограничения: один файл не более 50 МБ, суммарно не более 500 МБ. Файлы сверх - лимитов помечаются статусом «пропущен» и не участвуют в обфускации. Пустые, повреждённые файлы и сканы без - текстового слоя получают статус «не извлечён» — они тоже не попадают в результат.
- ⏱ Время обработки каждого файла — ориентировочное (обновляется по факту). -

+
+
    +
  • Форматы: .docx, .doc, .pdf, .txt, .md, .zip. Не более 50 МБ на файл и 500 МБ суммарно — файлы сверх лимитов получают статус «пропущен».
  • +
  • Пустые, повреждённые файлы и сканы без текстового слоя получают статус «не извлечён» и не попадают в результат.
  • +
  • Время обработки каждого файла ориентировочное и обновляется по факту.
  • +
  • Фильтр по маскам: положите в корень папки файл obscure.lst. Подробнее — кнопка HELP.
  • +
+
-

- Фильтр по маскам: положите в корень папки файл obscure.lst. Подробнее — кнопка HELP. -

- - + +
-
⏱ Обработка…
+
Обработка…
—
0.0 с
-
🤖 ИИ обрабатывает… 0.0 с
+
ИИ обрабатывает… 0.0 с
-
📊 Итоги обработки
+
Итоги обработки
Общее время
@@ -533,8 +522,8 @@ mount: '#filePicker', allowedExt: DOC_EXTS, labels: { - pickFiles: '📄 Выбрать файлы', - pickFolder: '📁 Выбрать папку', + pickFiles: 'Выбрать файлы', + pickFolder: 'Выбрать папку', clear: 'Очистить', empty: 'Нет выбранных файлов', statusReady: 'готов', @@ -574,7 +563,7 @@ } if (currentSid) { fetch('/api/cancel/' + currentSid, { method: 'POST' }).catch(() => { }); - st.textContent = '⏹ Остановка… завершаем текущий файл'; + st.textContent = 'Остановка… завершаем текущий файл'; } } @@ -660,7 +649,7 @@ if (!res.ok) { if (res.aborted) { st.className = 'status'; - st.textContent = '⏹ Загрузка отменена пользователем.'; + st.textContent = 'Загрузка отменена пользователем.'; } else { st.className = 'status error'; st.textContent = res.error || 'Ошибка загрузки'; @@ -676,7 +665,7 @@ if (TEST_UPLOAD_ONLY) { st.className = 'status done'; - st.textContent = '✅ Загружено ' + uploadedCount + ' файлов (тест: обработка пропущена). Сессия: ' + currentSid; + st.textContent = 'Загружено ' + uploadedCount + ' файлов (тест: обработка пропущена). Сессия: ' + currentSid; setBusy(false); cb.style.display = 'none'; ub.disabled = false; @@ -738,7 +727,7 @@ curRows.forEach(r => r.classList.remove('row-current')); curRows[idx].classList.add('row-current'); const td = curRows[idx].querySelectorAll('td')[2]; - if (td) td.innerHTML = '⚙️'; + if (td) td.innerHTML = '…'; } currentLiveFile = 'Файл ' + (d.idx + 1) + '/' + total + ': ' + d.name; liveFileEl.textContent = currentLiveFile; @@ -757,7 +746,7 @@ curRows.forEach(r => r.classList.remove('row-current')); curRows[idx].classList.add('row-current'); const td = curRows[idx].querySelectorAll('td')[2]; - if (td) td.innerHTML = '⚙️ анализ…'; + if (td) td.innerHTML = 'анализ…'; } liveFileEl.textContent = 'Файл ' + (d.idx + 1) + '/' + total + ': ' + d.name; }); @@ -773,7 +762,7 @@ if (curRows[idx]) { curRows[idx].classList.remove('row-current'); const td = curRows[idx].querySelectorAll('td')[2]; - if (td) td.innerHTML = '✅ готов'; + if (td) td.innerHTML = 'готов'; } }); activeES.addEventListener('llm', function (e) { @@ -781,7 +770,7 @@ if (d.active) { liveLlmTime.textContent = d.elapsed + ' с'; liveLlm.classList.add('show'); - liveFileEl.textContent = '🤖 ИИ анализирует все файлы…'; + liveFileEl.textContent = 'ИИ анализирует все файлы…'; if (typeof d.eta_sec === 'number' && d.eta_sec >= 0) liveEta.textContent = '⏳ осталось ~' + fmtSec(d.eta_sec); else liveEta.textContent = ''; } else { @@ -805,7 +794,7 @@ : ((performance.now() - (fileTimers[idx] || performance.now())) / 1000).toFixed(1); if (curRows[idx]) { const td = curRows[idx].querySelectorAll('td')[2]; - if (td) td.innerHTML = '✅ ' + sec + 'с'; + if (td) td.innerHTML = '' + sec + 'с'; } }); activeES.addEventListener('cancelled', function (e) { @@ -813,7 +802,7 @@ finishProcUI(); const totalSec = ((performance.now() - t0) / 1000).toFixed(1); st.className = 'status done'; - st.textContent = '⏹ Остановлено. Сохранено ' + d.saved + ' из ' + d.total + ' файлов + таблица замен (общее ' + totalSec + 'с)'; + st.textContent = 'Остановлено. Сохранено ' + d.saved + ' из ' + d.total + ' файлов + таблица замен (общее ' + totalSec + 'с)'; const sb = document.getElementById('statsBlock'); document.getElementById('stTotalTime').textContent = totalSec + ' с'; if (d.llm_sec > 0) { @@ -835,7 +824,7 @@ const d = JSON.parse(e.data); const totalSec = ((performance.now() - t0) / 1000).toFixed(1); st.className = 'status done'; - st.textContent = '✅ Обработано ' + d.total + ' файлов: общее ' + totalSec + 'с, из них ИИ ' + (d.llm_sec > 0 ? d.llm_sec + 'с' : '0с'); + st.textContent = 'Обработано ' + d.total + ' файлов: общее ' + totalSec + 'с, из них ИИ ' + (d.llm_sec > 0 ? d.llm_sec + 'с' : '0с'); const sb = document.getElementById('statsBlock'); document.getElementById('stTotalTime').textContent = totalSec + ' с'; if (d.llm_sec > 0) { @@ -957,7 +946,8 @@

  • Файл ищется только в корне папки; имя без учёта регистра: obscure.lst, - OBSCURE.LST.
  • + OBSCURE.LST. +
  • Если файла нет — обрабатываются все поддерживаемые документы (как раньше).
  • Сам obscure.lst не загружается и не обфусцируется.
  • Другие .lst игнорируются; вложенный subdir/obscure.lst фильтр не включает.
  • @@ -993,21 +983,25 @@ [a-z], - [abc] + [abc] + класс или диапазон символов [!a], - [^a] + [^a] + любой символ, кроме указанных - reports/ + reports/ + то же, что - reports/** — всё поддерево + reports/** — всё поддерево + @@ -1043,7 +1037,7 @@ reports/name*.docx
    -

    ⏹ Остановить обработку?

    +

    Остановить обработку?

    Будут сохранены: полностью обработанные файлы и таблица замен. Необработанные файлы в результат не попадут.