docs: add comprehensive rework plan for navigation, honest progress and chapter detection to TODO.md

This commit is contained in:
2026-10-05 16:59:25 +03:00
parent 6ee67c0653
commit f642a131ad
+26 -12
View File
@@ -120,18 +120,32 @@
---
### 6. 📖 Запоминание позиции чтения и прогресс главы (Scroll position, Chapter Progress & Auto-restore)
- [x] **Индикатор прогресса текущей главы**:
- Тонкий неоновый прогресс-бар в шапке читалки (`reader-chapter-progress-bar`), плавно показывающий процент прочитанного в текущей главе.
- Процентный бейдж в центре тулбара читалки рядом с выбором главы (`reader-scroll-pct-badge`, например `42%`).
- [x] **Автоматическое сохранение позиции чтения**:
- Отслеживание скролла читалки в реальном времени (`handleReaderScroll`).
- Мгновенное сохранение в `localStorage` (`notes_book_{id}_pos`: номер главы, точные пиксели `scrollTop`, доля прогресса `fraction`).
- Фоновая отправка прогресса на бэкенд (`PUT /api/books/{id}/progress`) с дебаунсом 800 мс.
- Гарантированная фиксация позиции при закрытии/обновлении страницы через `beforeunload` + `navigator.sendBeacon`.
- [x] **Бесшовное восстановление чтения при перезагрузке страницы**:
- Сервис запоминает активный экран и ID открытой книги (`notes_active_book_id`).
- При обновлении страницы (`F5` или свайп на телефоне) приложение автоматически открывает читалку на той же книге, той же главе и восстанавливает точную позицию скролла вплоть до пикселя.
### 6. 🔄 Комплексная переработка навигации, роутинга и честного прогресса чтения (In Progress)
- [ ] **6.1. Нативная маршрутизация окон (URL Hash Router & Zero-Flicker F5)**:
- Внедрение хэш-роутинга: `#dictionary`, `#srs`, `#bookshelf`, `#reader/:book_id`, `#reader/:book_id/ch/:chapter_idx`.
- Синхронное переключение `view` при старте скрипта (до любых сетевых запросов авторизации): если в URL `#reader/...`, сразу скрывать `#dictionary-view` и показывать скелетон читалки, устраняя мигание словарем.
- Развязка асинхронных вызовов: `loadBookshelf()` больше не должен принудительно гасить `readerInterface`, если уже инициировано открытие книги через `openBook()`.
- Поддержка нативной истории браузера (кнопки «Назад» / «Вперёд» на мыши, клавиатуре и мобильных свайпах).
- Автоматическая синхронизация активного экрана в URL и `localStorage`.
- [ ] **6.2. Честный непрерывный расчет прогресса книги и главы (Weighted Reading Progress)**:
- Устранение бага ложных «100%»: полная ликвидация формулы `(current_ch + 1) / total_ch`, выдававшей 100% на первой странице одноглавных документов.
- Прогресс текущей главы в реальном времени: непрерывный расчет от вертикального скролла (`scrollTop / (scrollHeight - clientHeight) * 100`) от 0% до 100%.
- Взвешенный общий прогресс книги: расчет по объему слов прочитанных глав + точная доля текущей главы:
$$\text{TotalProgress} = \frac{\sum_{i=0}^{\text{cur}-1} \text{words}(ch_i) + \text{words}(ch_{\text{cur}}) \times \frac{\text{ChapterPct}}{100}}{\text{TotalWords}} \times 100\%$$
- Для документа на 1000 слов прогресс будет плавно расти: 0% $\rightarrow$ 15% $\rightarrow$ 50% $\rightarrow$ 100%.
- Отображение честного суммарного прогресса на карточках книг в библиотеке и в тулбаре читалки.
- [ ] **6.3. Интеллектуальный парсинг глав и оглавление (Smart Chapter & ToC Detection)**:
- Расширение детектора глав в `app/reader.py`:
- Markdown-заголовки всех уровней (`# `, `## `, `### `, `#### `).
- Нумерованные разделы и модули (`1. `, `1.1 `, `2.0 `, `Section 1`, `Part 1`, `Раздел 1`).
- Выделенные строки в верхнем регистре (ALL CAPS) от 3 до 60 символов, обрамленные пустыми строками (`INTRODUCTION`, `ETHERNET BASICS`).
- Жирные заголовки в начале абзацев (`**Chapter 1**`, `**Глава 1**`).
- Адаптивный порог авто-разбивки: снижение порога чанкования текста без явных глав с 3000 до 800–1000 слов, чтобы даже небольшие статьи имели логическое деление на части.
- Интерактивное оглавление со статусами прочтения: `✔ Прочитано`, `▶ В процессе (45%)`, `○ Не начато`.
- [ ] **6.4. Устойчивая фиксация позиции чтения (Paragraph Anchor + Scroll)**:
- Сохранение не только пикселей `scrollTop`, но и индекса первого видимого абзаца (`anchor_paragraph_idx`).
- Устойчивость к изменению шрифта `Aa` и ориентации экрана: восстановление скролла к конкретному предложению/абзацу, а не слепым пикселям.
- Фиксация скролл-контейнера `#reader-scroll-area` с аппаратным ускорением на мобильных.
---