forked from akai/readest
refactor(toc): cache navigable structure per book (#3869)
* refactor(toc): cache TOC + section fragments per book
Moves the TOC regrouping and section-fragment computation out of
foliate-js/epub.js #updateSubItems into the readest client as
computeBookNav / hydrateBookNav in utils/toc.ts. The result is
persisted to Books/{hash}/nav.json — capturing the book's full
navigable structure (TOC hierarchy + sections with hierarchical
fragments). Compute once, persist locally, hydrate on subsequent
opens. Designed to serve current human-facing navigation (TOC
sidebar, progress math) and future agentic navigation (LLM-driven
seeking by structural location).
Versioned by BOOK_NAV_VERSION for forward invalidation. Existing
books regenerate transparently on next open.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* chore: update worktree scripts
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -13,7 +13,7 @@ import { Insets } from '@/types/misc';
|
||||
import { EnvConfigType } from '@/services/environment';
|
||||
import { FoliateView } from '@/types/view';
|
||||
import { DocumentLoader, TOCItem } from '@/libs/document';
|
||||
import { updateToc } from '@/utils/toc';
|
||||
import { BOOK_NAV_VERSION, computeBookNav, hydrateBookNav, updateToc } from '@/utils/toc';
|
||||
import { formatTitle, getMetadataHash, getPrimaryLanguage } from '@/utils/book';
|
||||
import { getBaseFilename } from '@/utils/path';
|
||||
import { SUPPORTED_LANGNAMES } from '@/services/constants';
|
||||
@@ -181,6 +181,21 @@ export const useReaderStore = create<ReaderStore>((set, get) => ({
|
||||
}
|
||||
// Filter out invalid booknotes
|
||||
config.booknotes = config.booknotes?.filter((booknote) => booknote.cfi) ?? [];
|
||||
// Load cached book navigation (TOC + section fragments) or compute and persist.
|
||||
if (book.format === 'EPUB' && bookDoc.rendition?.layout !== 'pre-paginated') {
|
||||
const cachedNav = await appService.loadBookNav(book);
|
||||
if (cachedNav?.version === BOOK_NAV_VERSION) {
|
||||
hydrateBookNav(bookDoc, cachedNav);
|
||||
} else {
|
||||
const freshNav = await computeBookNav(bookDoc);
|
||||
hydrateBookNav(bookDoc, freshNav);
|
||||
try {
|
||||
await appService.saveBookNav(book, freshNav);
|
||||
} catch (e) {
|
||||
console.warn('Failed to persist book nav cache:', e);
|
||||
}
|
||||
}
|
||||
}
|
||||
await updateToc(
|
||||
bookDoc,
|
||||
config.viewSettings?.sortedTOC ?? false,
|
||||
|
||||
Reference in New Issue
Block a user