Kovid Goyal d17c59f695
kepubify: Add the useless JS script that Kobo includes in KEPUB it generates
This script is obviously better injected by firmware and I assume
modern firmware does that but Kobo's KEPUBification process has not been
updated to leave it out. So mirror it on the off chance that they
actually think this is the right way to do this.
2025-02-23 11:00:16 +05:30

227 lines
5.1 KiB
JavaScript

var gPosition = 0;
var gProgress = 0;
var gCurrentPage = 0;
var gPageCount = 0;
var gClientHeight = null;
function getPosition()
{
return gPosition;
}
function getProgress()
{
return gProgress;
}
function getPageCount()
{
return gPageCount;
}
function getCurrentPage()
{
return gCurrentPage;
}
function turnOnNightMode(nightModeOn) {
var body = document.getElementsByTagName('body')[0].style;
var aTags = document.getElementsByTagName('a');
var textColor;
var bgColor;
if (nightModeOn > 0) {
textColor = "#FFFFFF !important";
bgColor = "#000000 !important";
} else {
textColor = "#000000 !important";
bgColor = "#FFFFFF !important";
}
for (i = 0; i < aTags.length; i++) {
aTags[i].style.color = textColor;
}
body.color = textColor;
body.backgroundColor = bgColor;
window.device.turnOnNightModeDone();
}
function setupBookColumns()
{
var body = document.getElementsByTagName('body')[0].style;
body.marginLeft = '0px !important';
body.marginRight = '0px !important';
body.marginTop = '0px !important';
body.marginBottom = '0px !important';
body.paddingTop = '0px !important';
body.paddingBottom = '0px !important';
body.webkitNbspMode = 'space';
var bc = document.getElementById('book-columns').style;
bc.width = (window.innerWidth * 2) + 'px !important';
bc.height = window.innerHeight + 'px !important';
bc.marginTop = '0px !important';
bc.webkitColumnWidth = window.innerWidth + 'px !important';
bc.webkitColumnGap = '0px !important';
bc.overflow = 'none';
bc.paddingTop = '0px !important';
bc.paddingBottom = '0px !important';
gCurrentPage = 1;
gProgress = gPosition = 0;
var bi = document.getElementById('book-inner').style;
bi.marginLeft = '10px';
bi.marginRight = '10px';
bi.padding = '0';
window.device.print ("bc.height = "+ bc.height);
window.device.print ("window.innerHeight ="+ window.innerHeight);
gPageCount = document.body.scrollWidth / window.innerWidth;
if (gClientHeight < window.innerHeight) {
gPageCount = 1;
}
}
function paginate(tagId)
{
// Get the height of the page. We do this only once. In setupBookColumns we compare this
// value to the height of the window and then decide wether to force the page count to one.
if (gClientHeight == undefined) {
gClientHeight = document.getElementById('book-columns').clientHeight;
}
setupBookColumns();
//window.scrollTo(0, window.innerHeight);
window.device.reportPageCount(gPageCount);
var tagIdPageNumber = 0;
if (tagId.length > 0) {
tagIdPageNumber = estimatePageNumberForAnchor (tagId);
}
window.device.finishedPagination(tagId, tagIdPageNumber);
}
function repaginate(tagId) {
window.device.print ("repaginating, gPageCount:" + gPageCount);
paginate(tagId);
}
function paginateAndMaintainProgress()
{
var savedProgress = gProgress;
setupBookColumns();
goProgress(savedProgress);
}
function updateBookmark()
{
gProgress = (gCurrentPage - 1.0) / gPageCount;
var anchorName = estimateFirstAnchorForPageNumber(gCurrentPage - 1);
window.device.finishedUpdateBookmark(anchorName);
}
function goBack()
{
if (gCurrentPage > 1)
{
--gCurrentPage;
gPosition -= window.innerWidth;
window.scrollTo(gPosition, 0);
window.device.pageChanged();
} else {
window.device.previousChapter();
}
}
function goForward()
{
if (gCurrentPage < gPageCount)
{
++gCurrentPage;
gPosition += window.innerWidth;
window.scrollTo(gPosition, 0);
window.device.pageChanged();
} else {
window.device.nextChapter();
}
}
function goPage(pageNumber, callPageReadyWhenDone)
{
if (pageNumber > 0 && pageNumber <= gPageCount)
{
gCurrentPage = pageNumber;
gPosition = (gCurrentPage - 1) * window.innerWidth;
window.scrollTo(gPosition, 0);
if (callPageReadyWhenDone > 0) {
window.device.pageReady();
} else {
window.device.pageChanged();
}
}
}
function goProgress(progress)
{
progress += 0.0001;
var progressPerPage = 1.0 / gPageCount;
var newPage = 0;
for (var page = 0; page < gPageCount; page++) {
var low = page * progressPerPage;
var high = low + progressPerPage;
if (progress >= low && progress < high) {
newPage = page;
break;
}
}
gCurrentPage = newPage + 1;
gPosition = (gCurrentPage - 1) * window.innerWidth;
window.scrollTo(gPosition, 0);
updateProgress();
}
/* BOOKMARKING CODE */
/**
* Estimate the first anchor for the specified page number. This is used on the broken WebKit
* where we do not know for sure if the specific anchor actually is on the page.
*/
function estimateFirstAnchorForPageNumber(page)
{
var spans = document.getElementsByTagName('span');
var lastKoboSpanId = "";
for (var i = 0; i < spans.length; i++) {
if (spans[i].id.substr(0, 5) == "kobo.") {
lastKoboSpanId = spans[i].id;
if (spans[i].offsetTop >= (page * window.innerHeight)) {
return spans[i].id;
}
}
}
return lastKoboSpanId;
}
/**
* Estimate the page number for the specified anchor. This is used on the broken WebKit where we
* do not know for sure how things are columnized. The page number returned is zero based.
*/
function estimatePageNumberForAnchor(spanId)
{
var span = document.getElementById(spanId);
if (span) {
return Math.floor(span.offsetTop / window.innerHeight);
}
return 0;
}