Lettore 0.3.0: bookmark per posizione (carattere) e paginazione corretta

- Bookmark cw:v2:<offset assoluto caratteri> invece di capitolo+frazione;
  migrazione automatica delle chiavi v1 (parseBookmarkKey)
- Lunghezze testo per capitolo in C++ (text node del DOM, entità decodificate,
  body-only) per mappare offset assoluto -> capitolo
- Paginazione: stile iniettato height:auto/overflow:visible + unlock JS dei
  contenitori hidden — il CSS di molti EPUB bloccava lo scroll e ogni tap
  saltava al capitolo successivo
- prevPage dall'inizio capitolo -> ultima pagina del capitolo precedente
- Cambio font mantiene la posizione (restore per carattere)
- Label menu: pagina corrente/totale del capitolo; max su documentElement+body
- Test: harness C++ (Qt) e test JS con DOM mock
This commit is contained in:
2026-08-21 07:57:57 +02:00
parent 1589762aac
commit d418660a2c
5 changed files with 361 additions and 59 deletions
+13 -3
View File
@@ -36,14 +36,21 @@ public:
Q_INVOKABLE QString chapterTitle(int index) const;
// elenco [{index, title}] per la lista capitoli
Q_INVOKABLE QVariantList chapterList() const;
// lunghezza in caratteri del testo VISIBILE del capitolo (entità decodificate,
// head/script/style esclusi) — stesso criterio del conteggio JS nel lettore
Q_INVOKABLE int chapterTextLength(int index) const;
// caratteri di testo complessivi prima dell'inizio del capitolo index
Q_INVOKABLE qint64 chapterStartChar(int index) const;
// HTML del capitolo con lo stile di reflow iniettato (font-size e margini in px)
Q_INVOKABLE QString chapterHtml(int index, int fontSizePx, int marginPx, int marginVerticalPx) const;
// base URL (file://) per risolvere immagini/CSS relativi del capitolo
Q_INVOKABLE QString chapterBaseUrl(int index) const;
// chiave segno locale, es. "cw:v1:3:0.42" (capitolo 3, 42% del capitolo)
Q_INVOKABLE QString makeBookmarkKey(int chapterIndex, double fraction) const;
// restituisce {chapter, fraction} oppure mappa vuota se la chiave non è valida
// chiave segno locale v2, es. "cw:v2:12345" (posizione = carattere assoluto
// nel libro, indipendente da font, margini e reflow)
Q_INVOKABLE QString makeBookmarkKey(int chapterIndex, qint64 charOffset) const;
// restituisce {chapter, charOffset} con charOffset NEL capitolo; accetta
// chiavi v2 ("cw:v2:<assoluto>") e v1 ("cw:v1:<cap>:<frac>", migrazione)
Q_INVOKABLE QVariantMap parseBookmarkKey(const QString &key) const;
signals:
@@ -56,12 +63,15 @@ private:
void parseTocEpub3(const QString &navPath);
void parseTocEpub2(const QString &ncxPath);
QString absolutePath(const QString &relativeToOpfDir) const;
// lunghezze in caratteri del testo visibile, calcolate all'open
void computeTextLengths();
QString m_baseDir;
QString m_opfDir;
QString m_title;
QString m_author;
QList<EpubChapter> m_chapters;
QList<int> m_textLengths;
};
#endif // EPUB_H