feat(epub.js): add autosaving of current book reading position in localStorage to open this book on the last read point
This commit is contained in:
@@ -166,6 +166,8 @@ var reader;
|
|||||||
|
|
||||||
reader.book.ready.then(() => {
|
reader.book.ready.then(() => {
|
||||||
let locations_key = reader.book.key() + "-locations";
|
let locations_key = reader.book.key() + "-locations";
|
||||||
|
// Key to persist last-read position for this book in localStorage
|
||||||
|
let position_key = "calibre.reader.position." + reader.book.key();
|
||||||
let stored_locations = localStorage.getItem(locations_key);
|
let stored_locations = localStorage.getItem(locations_key);
|
||||||
let make_locations, save_locations;
|
let make_locations, save_locations;
|
||||||
if (stored_locations) {
|
if (stored_locations) {
|
||||||
@@ -185,6 +187,22 @@ var reader;
|
|||||||
}
|
}
|
||||||
make_locations
|
make_locations
|
||||||
.then(() => {
|
.then(() => {
|
||||||
|
// Try to restore last position (CFI) from localStorage if present
|
||||||
|
try {
|
||||||
|
var _savedPos = localStorage.getItem(position_key);
|
||||||
|
if (_savedPos) {
|
||||||
|
try {
|
||||||
|
var _posObj = JSON.parse(_savedPos);
|
||||||
|
if (_posObj && _posObj.cfi) {
|
||||||
|
// Display the saved CFI location
|
||||||
|
try {
|
||||||
|
reader.rendition.display(_posObj.cfi);
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
} catch (e) {}
|
||||||
|
|
||||||
reader.rendition.on("relocated", (location) => {
|
reader.rendition.on("relocated", (location) => {
|
||||||
let percentage = Math.round(location.end.percentage * 100);
|
let percentage = Math.round(location.end.percentage * 100);
|
||||||
progressDiv.textContent = percentage + "%";
|
progressDiv.textContent = percentage + "%";
|
||||||
@@ -194,7 +212,6 @@ var reader;
|
|||||||
const current =
|
const current =
|
||||||
reader.book.locations.locationFromCfi(cfi) || 0; // 1-based index typically
|
reader.book.locations.locationFromCfi(cfi) || 0; // 1-based index typically
|
||||||
const total = reader.book.locations.length() || 0;
|
const total = reader.book.locations.length() || 0;
|
||||||
const remaining = Math.max(total - current, 0);
|
|
||||||
|
|
||||||
if (total > 0) {
|
if (total > 0) {
|
||||||
pagesDiv.textContent = current + "/" + total;
|
pagesDiv.textContent = current + "/" + total;
|
||||||
@@ -203,6 +220,18 @@ var reader;
|
|||||||
pagesDiv.textContent = "";
|
pagesDiv.textContent = "";
|
||||||
pagesDiv.style.visibility = "hidden";
|
pagesDiv.style.visibility = "hidden";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Persist last position (CFI + percentage) to localStorage so reader can restore on next open
|
||||||
|
try {
|
||||||
|
var posObj = {
|
||||||
|
cfi: location.start.cfi,
|
||||||
|
percentage: location.start.percentage,
|
||||||
|
};
|
||||||
|
localStorage.setItem(
|
||||||
|
position_key,
|
||||||
|
JSON.stringify(posObj)
|
||||||
|
);
|
||||||
|
} catch (e) {}
|
||||||
});
|
});
|
||||||
reader.rendition.reportLocation();
|
reader.rendition.reportLocation();
|
||||||
progressDiv.style.visibility = "visible";
|
progressDiv.style.visibility = "visible";
|
||||||
|
|||||||
Reference in New Issue
Block a user