mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-23 15:30:45 -04:00
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.
227 lines
5.1 KiB
JavaScript
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;
|
|
}
|