feat(reader): hash router, zero-flicker reload, honest weighted progress, and smart chapter detection
This commit is contained in:
@@ -120,21 +120,21 @@
|
||||
|
||||
---
|
||||
|
||||
### 6. 🔄 Комплексная переработка навигации, роутинга и честного прогресса чтения (In Progress)
|
||||
- [ ] **6.1. Нативная маршрутизация окон (URL Hash Router & Zero-Flicker F5)**:
|
||||
### 6. 🔄 Комплексная переработка навигации, роутинга и честного прогресса чтения (Completed)
|
||||
- [x] **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)**:
|
||||
- [x] **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)**:
|
||||
- [x] **6.3. Интеллектуальный парсинг глав и оглавление (Smart Chapter & ToC Detection)**:
|
||||
- Расширение детектора глав в `app/reader.py`:
|
||||
- Markdown-заголовки всех уровней (`# `, `## `, `### `, `#### `).
|
||||
- Нумерованные разделы и модули (`1. `, `1.1 `, `2.0 `, `Section 1`, `Part 1`, `Раздел 1`).
|
||||
@@ -142,7 +142,7 @@
|
||||
- Жирные заголовки в начале абзацев (`**Chapter 1**`, `**Глава 1**`).
|
||||
- Адаптивный порог авто-разбивки: снижение порога чанкования текста без явных глав с 3000 до 800–1000 слов, чтобы даже небольшие статьи имели логическое деление на части.
|
||||
- Интерактивное оглавление со статусами прочтения: `✔ Прочитано`, `▶ В процессе (45%)`, `○ Не начато`.
|
||||
- [ ] **6.4. Устойчивая фиксация позиции чтения (Paragraph Anchor + Scroll)**:
|
||||
- [x] **6.4. Устойчивая фиксация позиции чтения (Paragraph Anchor + Scroll)**:
|
||||
- Сохранение не только пикселей `scrollTop`, но и индекса первого видимого абзаца (`anchor_paragraph_idx`).
|
||||
- Устойчивость к изменению шрифта `Aa` и ориентации экрана: восстановление скролла к конкретному предложению/абзацу, а не слепым пикселям.
|
||||
- Фиксация скролл-контейнера `#reader-scroll-area` с аппаратным ускорением на мобильных.
|
||||
|
||||
Reference in New Issue
Block a user