mirror of
https://github.com/futurepress/epub.js.git
synced 2025-10-03 14:59:18 +02:00
File Split
This commit is contained in:
parent
80051ad8b3
commit
a5d970bca2
4 changed files with 395 additions and 391 deletions
127
src/content.js
Normal file
127
src/content.js
Normal file
|
@ -0,0 +1,127 @@
|
|||
EPUBJS.Renderer.prototype.replace = function(query, func, finished, progress){
|
||||
var items = this.doc.querySelectorAll(query),
|
||||
resources = Array.prototype.slice.call(items),
|
||||
count = resources.length,
|
||||
after = function(result, full){
|
||||
count--;
|
||||
if(progress) progress(result, full, count);
|
||||
if(count <= 0 && finished) finished(true);
|
||||
};
|
||||
|
||||
if(count === 0) {
|
||||
finished(false);
|
||||
return;
|
||||
}
|
||||
|
||||
resources.forEach(function(item){
|
||||
|
||||
func(item, after);
|
||||
|
||||
}.bind(this));
|
||||
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.replaceWithStored = function(query, attr, func, callback) {
|
||||
var _oldUrls,
|
||||
_newUrls = {},
|
||||
_store = this.determineStore(),
|
||||
_cache = this.caches[query],
|
||||
_uri = EPUBJS.core.uri(this.book.chapter.absolute),
|
||||
_chapterBase = _uri.base,
|
||||
_attr = attr,
|
||||
_wait = 2000,
|
||||
progress = function(url, full, count) {
|
||||
_newUrls[full] = url;
|
||||
},
|
||||
finished = function(notempty) {
|
||||
if(callback) callback();
|
||||
|
||||
_.each(_oldUrls, function(url){
|
||||
_store.revokeUrl(url);
|
||||
});
|
||||
|
||||
_cache = _newUrls;
|
||||
};
|
||||
|
||||
if(!_store) return;
|
||||
|
||||
if(!_cache) _cache = {};
|
||||
_oldUrls = _.clone(_cache);
|
||||
|
||||
this.replace(query, function(link, done){
|
||||
var src = link.getAttribute(_attr),
|
||||
full = EPUBJS.core.resolveUrl(_chapterBase, src);
|
||||
|
||||
var replaceUrl = function(url) {
|
||||
var timeout;
|
||||
|
||||
link.onload = function(){
|
||||
clearTimeout(timeout);
|
||||
done(url, full);
|
||||
};
|
||||
|
||||
link.onerror = function(e){
|
||||
clearTimeout(timeout);
|
||||
done(url, full);
|
||||
console.error(e);
|
||||
};
|
||||
|
||||
if(query == "image") {
|
||||
//-- SVG needs this to trigger a load event
|
||||
link.setAttribute("externalResourcesRequired", "true");
|
||||
}
|
||||
|
||||
if(query == "link[href]") {
|
||||
//-- Only Stylesheet links seem to have a load events, just continue others
|
||||
done(url, full);
|
||||
}
|
||||
|
||||
link.setAttribute(_attr, url);
|
||||
|
||||
//-- If elements never fire Load Event, should continue anyways
|
||||
timeout = setTimeout(function(){
|
||||
done(url, full);
|
||||
}, _wait);
|
||||
|
||||
};
|
||||
|
||||
if(full in _oldUrls){
|
||||
replaceUrl(_oldUrls[full]);
|
||||
_newUrls[full] = _oldUrls[full];
|
||||
delete _oldUrls[full];
|
||||
}else{
|
||||
func(_store, full, replaceUrl, link);
|
||||
}
|
||||
|
||||
}, finished, progress);
|
||||
};
|
||||
|
||||
//-- Replaces the relative links within the book to use our internal page changer
|
||||
EPUBJS.Renderer.prototype.replaceLinks = function(callback){
|
||||
|
||||
var renderer = this;
|
||||
|
||||
this.replace("a[href]", function(link, done){
|
||||
|
||||
var href = link.getAttribute("href"),
|
||||
relative = href.search("://"),
|
||||
fragment = href[0] == "#";
|
||||
|
||||
if(relative != -1){
|
||||
|
||||
link.setAttribute("target", "_blank");
|
||||
|
||||
}else{
|
||||
|
||||
link.onclick = function(){
|
||||
renderer.book.goto(href);
|
||||
return false;
|
||||
};
|
||||
}
|
||||
|
||||
done();
|
||||
|
||||
}, callback);
|
||||
|
||||
};
|
||||
|
72
src/layout.js
Normal file
72
src/layout.js
Normal file
|
@ -0,0 +1,72 @@
|
|||
EPUBJS.Renderer.prototype.formatSpread = function(){
|
||||
|
||||
var divisor = 2,
|
||||
cutoff = 800;
|
||||
|
||||
//-- Check the width and decied on columns
|
||||
//-- Todo: a better place for this?
|
||||
this.elWidth = this.iframe.clientWidth;
|
||||
if(this.elWidth % 2 !== 0){
|
||||
this.elWidth -= 1;
|
||||
}
|
||||
|
||||
// this.gap = this.gap || Math.ceil(this.elWidth / 8);
|
||||
this.gap = Math.ceil(this.elWidth / 8);
|
||||
|
||||
if(this.gap % 2 !== 0){
|
||||
this.gap += 1;
|
||||
}
|
||||
|
||||
if(this.elWidth < cutoff || !this.book.settings.spreads) {
|
||||
this.spread = false; //-- Single Page
|
||||
|
||||
divisor = 1;
|
||||
this.colWidth = Math.floor(this.elWidth / divisor);
|
||||
}else{
|
||||
this.spread = true; //-- Double Page
|
||||
|
||||
this.colWidth = Math.floor((this.elWidth - this.gap) / divisor);
|
||||
}
|
||||
|
||||
this.spreadWidth = (this.colWidth + this.gap) * divisor;
|
||||
// if(this.bodyEl) this.bodyEl.style.margin = 0;
|
||||
// this.bodyEl.style.fontSize = localStorage.getItem("fontSize") || "medium";
|
||||
|
||||
//-- Clear Margins
|
||||
if(this.bodyEl) this.bodyEl.style.margin = "0";
|
||||
|
||||
this.docEl.style.overflow = "hidden";
|
||||
|
||||
this.docEl.style.width = this.elWidth + "px";
|
||||
|
||||
//-- Adjust height
|
||||
this.docEl.style.height = this.iframe.clientHeight + "px";
|
||||
|
||||
//-- Add columns
|
||||
this.docEl.style[EPUBJS.Renderer.columnAxis] = "horizontal";
|
||||
this.docEl.style[EPUBJS.Renderer.columnGap] = this.gap+"px";
|
||||
this.docEl.style[EPUBJS.Renderer.columnWidth] = this.colWidth+"px";
|
||||
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.fixedLayout = function(){
|
||||
this.paginated = false;
|
||||
|
||||
this.elWidth = this.iframe.width;
|
||||
this.docEl.style.width = this.elWidth;
|
||||
// this.setLeft(0);
|
||||
|
||||
this.docEl.style.width = this.elWidth;
|
||||
|
||||
//-- Adjust height
|
||||
this.docEl.style.height = "auto";
|
||||
|
||||
//-- Remove columns
|
||||
// this.docEl.style[EPUBJS.core.columnWidth] = "auto";
|
||||
|
||||
//-- Scroll
|
||||
this.docEl.style.overflow = "auto";
|
||||
this.iframe.scrolling = "yes";
|
||||
|
||||
// this.displayedPages = 1;
|
||||
};
|
196
src/navigation.js
Normal file
196
src/navigation.js
Normal file
|
@ -0,0 +1,196 @@
|
|||
EPUBJS.Renderer.prototype.page = function(pg){
|
||||
if(pg >= 1 && pg <= this.displayedPages){
|
||||
this.chapterPos = pg;
|
||||
this.leftPos = this.spreadWidth * (pg-1); //-- pages start at 1
|
||||
this.setLeft(this.leftPos);
|
||||
|
||||
this.currentLocationCfi = this.getPageCfi();
|
||||
|
||||
this.book.trigger("renderer:pageChanged", this.currentLocationCfi);
|
||||
|
||||
// localStorage.setItem("chapterPos", pg);
|
||||
return true;
|
||||
}
|
||||
//-- Return false if page is greater than the total
|
||||
return false;
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.nextPage = function(){
|
||||
if(this.chapterPos < this.displayedPages){
|
||||
this.chapterPos++;
|
||||
|
||||
this.leftPos += this.spreadWidth;
|
||||
|
||||
this.setLeft(this.leftPos);
|
||||
|
||||
this.currentLocationCfi = this.getPageCfi();
|
||||
|
||||
this.book.trigger("renderer:pageChanged", this.currentLocationCfi);
|
||||
|
||||
|
||||
return this.chapterPos;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.prevPage = function(){
|
||||
if(this.chapterPos > 1){
|
||||
this.chapterPos--;
|
||||
|
||||
this.leftPos -= this.spreadWidth;
|
||||
|
||||
this.setLeft(this.leftPos);
|
||||
|
||||
this.currentLocationCfi = this.getPageCfi();
|
||||
|
||||
this.book.trigger("renderer:pageChanged", this.currentLocationCfi);
|
||||
|
||||
return this.chapterPos;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.gotoChapterEnd = function(){
|
||||
this.chapterEnd();
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.chapterEnd = function(){
|
||||
this.page(this.displayedPages);
|
||||
};
|
||||
|
||||
//-- Find a section by fragement id
|
||||
EPUBJS.Renderer.prototype.section = function(fragment){
|
||||
var el = this.doc.getElementById(fragment),
|
||||
left, pg;
|
||||
|
||||
if(el){
|
||||
this.pageByElement(el);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
//-- Show the page containing an Element
|
||||
EPUBJS.Renderer.prototype.pageByElement = function(el){
|
||||
var left, pg;
|
||||
if(!el) return;
|
||||
|
||||
left = this.leftPos + el.getBoundingClientRect().left; //-- Calculate left offset compaired to scrolled position
|
||||
pg = Math.floor(left / this.spreadWidth) + 1; //-- pages start at 1
|
||||
this.page(pg);
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
EPUBJS.Renderer.prototype.walk = function(node) {
|
||||
var r, children, leng,
|
||||
startNode = node,
|
||||
prevNode,
|
||||
stack = [startNode];
|
||||
|
||||
var STOP = 10000, ITER=0;
|
||||
|
||||
while(!r && stack.length) {
|
||||
|
||||
node = stack.shift();
|
||||
|
||||
if( this.isElementVisible(node) ) {
|
||||
|
||||
r = node;
|
||||
|
||||
}
|
||||
|
||||
if(!r && node && node.childElementCount > 0){
|
||||
|
||||
children = node.children;
|
||||
if (children && children.length) {
|
||||
leng = children.length ? children.length : 0;
|
||||
} else {
|
||||
return r;
|
||||
}
|
||||
|
||||
for (var i = 0; i < leng; i++) {
|
||||
if(children[i] != prevNode) stack.push(children[i]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
if(!r && stack.length === 0 && startNode && startNode.parentNode !== null){
|
||||
|
||||
stack.push(startNode.parentNode);
|
||||
prevNode = startNode;
|
||||
startNode = startNode.parentNode;
|
||||
}
|
||||
|
||||
|
||||
ITER++;
|
||||
if(ITER > STOP) {
|
||||
console.error("ENDLESS LOOP");
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return r;
|
||||
};
|
||||
|
||||
|
||||
EPUBJS.Renderer.prototype.getPageCfi = function(){
|
||||
var prevEl = this.visibileEl;
|
||||
this.visibileEl = this.findFirstVisible(prevEl);
|
||||
|
||||
if(!this.visibileEl.id) {
|
||||
this.visibileEl.id = "EPUBJS-PAGE-" + this.chapterPos;
|
||||
}
|
||||
|
||||
this.pageIds[this.chapterPos] = this.visibileEl.id;
|
||||
|
||||
|
||||
return this.epubcfi.generateFragment(this.visibileEl, this.currentChapterCfi);
|
||||
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.gotoCfiFragment = function(cfi){
|
||||
var element;
|
||||
|
||||
if(_.isString(cfi)){
|
||||
cfi = this.epubcfi.parse(cfi);
|
||||
}
|
||||
|
||||
element = this.epubcfi.getElement(cfi, this.doc);
|
||||
this.pageByElement(element);
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.findFirstVisible = function(startEl){
|
||||
var el = startEl || this.bodyEl,
|
||||
found;
|
||||
|
||||
found = this.walk(el);
|
||||
|
||||
if(found) {
|
||||
return found;
|
||||
}else{
|
||||
return startEl;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.isElementVisible = function(el){
|
||||
var rect;
|
||||
|
||||
if(el && typeof el.getBoundingClientRect === 'function'){
|
||||
rect = el.getBoundingClientRect();
|
||||
|
||||
if( rect.width != 0 &&
|
||||
rect.height != 0 &&
|
||||
rect.left >= 0 &&
|
||||
rect.left < this.spreadWidth ) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
391
src/renderer.js
391
src/renderer.js
|
@ -272,80 +272,7 @@ EPUBJS.Renderer.prototype.setIframeSrc = function(url){
|
|||
};
|
||||
|
||||
|
||||
EPUBJS.Renderer.prototype.formatSpread = function(){
|
||||
|
||||
var divisor = 2,
|
||||
cutoff = 800;
|
||||
|
||||
//-- Check the width and decied on columns
|
||||
//-- Todo: a better place for this?
|
||||
this.elWidth = this.iframe.clientWidth;
|
||||
if(this.elWidth % 2 !== 0){
|
||||
this.elWidth -= 1;
|
||||
}
|
||||
|
||||
// this.gap = this.gap || Math.ceil(this.elWidth / 8);
|
||||
this.gap = Math.ceil(this.elWidth / 8);
|
||||
|
||||
if(this.gap % 2 !== 0){
|
||||
this.gap += 1;
|
||||
}
|
||||
|
||||
if(this.elWidth < cutoff || !this.book.settings.spreads) {
|
||||
this.spread = false; //-- Single Page
|
||||
|
||||
divisor = 1;
|
||||
this.colWidth = Math.floor(this.elWidth / divisor);
|
||||
}else{
|
||||
this.spread = true; //-- Double Page
|
||||
|
||||
this.colWidth = Math.floor((this.elWidth - this.gap) / divisor);
|
||||
}
|
||||
|
||||
this.spreadWidth = (this.colWidth + this.gap) * divisor;
|
||||
// if(this.bodyEl) this.bodyEl.style.margin = 0;
|
||||
// this.bodyEl.style.fontSize = localStorage.getItem("fontSize") || "medium";
|
||||
|
||||
//-- Clear Margins
|
||||
if(this.bodyEl) {
|
||||
this.bodyEl.style.margin = "0";
|
||||
|
||||
this.docEl.style.overflow = "hidden";
|
||||
|
||||
this.docEl.style.width = this.elWidth + "px";
|
||||
|
||||
//-- Adjust height
|
||||
this.docEl.style.height = this.iframe.clientHeight + "px";
|
||||
|
||||
//-- Add columns
|
||||
this.docEl.style[EPUBJS.Renderer.columnAxis] = "horizontal";
|
||||
this.docEl.style[EPUBJS.Renderer.columnGap] = this.gap+"px";
|
||||
this.docEl.style[EPUBJS.Renderer.columnWidth] = this.colWidth+"px";
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.fixedLayout = function(){
|
||||
this.paginated = false;
|
||||
|
||||
this.elWidth = this.iframe.width;
|
||||
this.docEl.style.width = this.elWidth;
|
||||
// this.setLeft(0);
|
||||
|
||||
this.docEl.style.width = this.elWidth;
|
||||
|
||||
//-- Adjust height
|
||||
this.docEl.style.height = "auto";
|
||||
|
||||
//-- Remove columns
|
||||
// this.docEl.style[EPUBJS.core.columnWidth] = "auto";
|
||||
|
||||
//-- Scroll
|
||||
this.docEl.style.overflow = "auto";
|
||||
this.iframe.scrolling = "yes";
|
||||
|
||||
// this.displayedPages = 1;
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.setStyle = function(style, val, prefixed){
|
||||
if(prefixed) {
|
||||
|
@ -413,48 +340,6 @@ EPUBJS.Renderer.prototype.calcPages = function() {
|
|||
this.currentChapter.pages = this.displayedPages;
|
||||
};
|
||||
|
||||
|
||||
EPUBJS.Renderer.prototype.nextPage = function(){
|
||||
if(this.chapterPos < this.displayedPages){
|
||||
this.chapterPos++;
|
||||
|
||||
this.leftPos += this.spreadWidth;
|
||||
|
||||
this.setLeft(this.leftPos);
|
||||
|
||||
this.currentLocationCfi = this.getPageCfi();
|
||||
|
||||
this.book.trigger("renderer:pageChanged", this.currentLocationCfi);
|
||||
|
||||
|
||||
return this.chapterPos;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.prevPage = function(){
|
||||
if(this.chapterPos > 1){
|
||||
this.chapterPos--;
|
||||
|
||||
this.leftPos -= this.spreadWidth;
|
||||
|
||||
this.setLeft(this.leftPos);
|
||||
|
||||
this.currentLocationCfi = this.getPageCfi();
|
||||
|
||||
this.book.trigger("renderer:pageChanged", this.currentLocationCfi);
|
||||
|
||||
return this.chapterPos;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.chapterEnd = function(){
|
||||
this.page(this.displayedPages);
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.setLeft = function(leftPos){
|
||||
// this.bodyEl.style.marginLeft = -leftPos + "px";
|
||||
// this.docEl.style.marginLeft = -leftPos + "px";
|
||||
|
@ -483,287 +368,11 @@ EPUBJS.Renderer.prototype.determineStore = function(callback){
|
|||
}
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.replace = function(query, func, finished, progress){
|
||||
var items = this.doc.querySelectorAll(query),
|
||||
resources = Array.prototype.slice.call(items),
|
||||
count = resources.length,
|
||||
after = function(result, full){
|
||||
count--;
|
||||
if(progress) progress(result, full, count);
|
||||
if(count <= 0 && finished) finished(true);
|
||||
};
|
||||
|
||||
if(count === 0) {
|
||||
finished(false);
|
||||
return;
|
||||
}
|
||||
|
||||
resources.forEach(function(item){
|
||||
|
||||
func(item, after);
|
||||
|
||||
}.bind(this));
|
||||
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.replaceWithStored = function(query, attr, func, callback) {
|
||||
var _oldUrls,
|
||||
_newUrls = {},
|
||||
_store = this.determineStore(),
|
||||
_cache = this.caches[query],
|
||||
_uri = EPUBJS.core.uri(this.book.chapter.absolute),
|
||||
_chapterBase = _uri.base,
|
||||
_attr = attr,
|
||||
_wait = 2000,
|
||||
progress = function(url, full, count) {
|
||||
_newUrls[full] = url;
|
||||
},
|
||||
finished = function(notempty) {
|
||||
if(callback) callback();
|
||||
|
||||
_.each(_oldUrls, function(url){
|
||||
_store.revokeUrl(url);
|
||||
});
|
||||
|
||||
_cache = _newUrls;
|
||||
};
|
||||
|
||||
if(!_store) return;
|
||||
|
||||
if(!_cache) _cache = {};
|
||||
_oldUrls = _.clone(_cache);
|
||||
|
||||
this.replace(query, function(link, done){
|
||||
var src = link.getAttribute(_attr),
|
||||
full = EPUBJS.core.resolveUrl(_chapterBase, src);
|
||||
|
||||
var replaceUrl = function(url) {
|
||||
var timeout;
|
||||
|
||||
link.onload = function(){
|
||||
clearTimeout(timeout);
|
||||
done(url, full);
|
||||
};
|
||||
|
||||
link.onerror = function(e){
|
||||
clearTimeout(timeout);
|
||||
done(url, full);
|
||||
console.error(e);
|
||||
};
|
||||
|
||||
if(query == "image") {
|
||||
//-- SVG needs this to trigger a load event
|
||||
link.setAttribute("externalResourcesRequired", "true");
|
||||
}
|
||||
|
||||
if(query == "link[href]") {
|
||||
//-- Only Stylesheet links seem to have a load events, just continue others
|
||||
done(url, full);
|
||||
}
|
||||
|
||||
link.setAttribute(_attr, url);
|
||||
|
||||
//-- If elements never fire Load Event, should continue anyways
|
||||
timeout = setTimeout(function(){
|
||||
done(url, full);
|
||||
}, _wait);
|
||||
|
||||
};
|
||||
|
||||
if(full in _oldUrls){
|
||||
replaceUrl(_oldUrls[full]);
|
||||
_newUrls[full] = _oldUrls[full];
|
||||
delete _oldUrls[full];
|
||||
}else{
|
||||
func(_store, full, replaceUrl, link);
|
||||
}
|
||||
|
||||
}, finished, progress);
|
||||
};
|
||||
|
||||
//-- Replaces the relative links within the book to use our internal page changer
|
||||
EPUBJS.Renderer.prototype.replaceLinks = function(callback){
|
||||
|
||||
var renderer = this;
|
||||
|
||||
this.replace("a[href]", function(link, done){
|
||||
|
||||
var href = link.getAttribute("href"),
|
||||
relative = href.search("://"),
|
||||
fragment = href[0] == "#";
|
||||
|
||||
if(relative != -1){
|
||||
|
||||
link.setAttribute("target", "_blank");
|
||||
|
||||
}else{
|
||||
|
||||
link.onclick = function(){
|
||||
renderer.book.goto(href);
|
||||
return false;
|
||||
};
|
||||
}
|
||||
|
||||
done();
|
||||
|
||||
}, callback);
|
||||
|
||||
};
|
||||
|
||||
|
||||
EPUBJS.Renderer.prototype.page = function(pg){
|
||||
if(pg >= 1 && pg <= this.displayedPages){
|
||||
this.chapterPos = pg;
|
||||
this.leftPos = this.spreadWidth * (pg-1); //-- pages start at 1
|
||||
this.setLeft(this.leftPos);
|
||||
|
||||
this.currentLocationCfi = this.getPageCfi();
|
||||
|
||||
this.book.trigger("renderer:pageChanged", this.currentLocationCfi);
|
||||
|
||||
// localStorage.setItem("chapterPos", pg);
|
||||
return true;
|
||||
}
|
||||
//-- Return false if page is greater than the total
|
||||
return false;
|
||||
};
|
||||
|
||||
//-- Find a section by fragement id
|
||||
EPUBJS.Renderer.prototype.section = function(fragment){
|
||||
var el = this.doc.getElementById(fragment),
|
||||
left, pg;
|
||||
|
||||
if(el){
|
||||
this.pageByElement(el);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
//-- Show the page containing an Element
|
||||
EPUBJS.Renderer.prototype.pageByElement = function(el){
|
||||
var left, pg;
|
||||
if(!el) return;
|
||||
|
||||
left = this.leftPos + el.getBoundingClientRect().left; //-- Calculate left offset compaired to scrolled position
|
||||
pg = Math.floor(left / this.spreadWidth) + 1; //-- pages start at 1
|
||||
this.page(pg);
|
||||
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.beforeDisplay = function(callback){
|
||||
this.book.triggerHooks("beforeChapterDisplay", callback.bind(this), this);
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.walk = function(node) {
|
||||
var r, children, leng,
|
||||
startNode = node,
|
||||
prevNode,
|
||||
stack = [startNode];
|
||||
|
||||
var STOP = 10000, ITER=0;
|
||||
|
||||
while(!r && stack.length) {
|
||||
|
||||
node = stack.shift();
|
||||
|
||||
if( this.isElementVisible(node) ) {
|
||||
|
||||
r = node;
|
||||
|
||||
}
|
||||
|
||||
if(!r && node && node.childElementCount > 0){
|
||||
|
||||
children = node.children;
|
||||
if (children && children.length) {
|
||||
leng = children.length ? children.length : 0;
|
||||
} else {
|
||||
return r;
|
||||
}
|
||||
|
||||
for (var i = 0; i < leng; i++) {
|
||||
if(children[i] != prevNode) stack.push(children[i]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
if(!r && stack.length === 0 && startNode && startNode.parentNode !== null){
|
||||
|
||||
stack.push(startNode.parentNode);
|
||||
prevNode = startNode;
|
||||
startNode = startNode.parentNode;
|
||||
}
|
||||
|
||||
|
||||
ITER++;
|
||||
if(ITER > STOP) {
|
||||
console.error("ENDLESS LOOP");
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return r;
|
||||
};
|
||||
|
||||
|
||||
EPUBJS.Renderer.prototype.getPageCfi = function(){
|
||||
var prevEl = this.visibileEl;
|
||||
this.visibileEl = this.findFirstVisible(prevEl);
|
||||
|
||||
if(!this.visibileEl.id) {
|
||||
this.visibileEl.id = "EPUBJS-PAGE-" + this.chapterPos;
|
||||
}
|
||||
|
||||
this.pageIds[this.chapterPos] = this.visibileEl.id;
|
||||
|
||||
|
||||
return this.epubcfi.generateFragment(this.visibileEl, this.currentChapterCfi);
|
||||
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.gotoCfiFragment = function(cfi){
|
||||
var element;
|
||||
|
||||
if(_.isString(cfi)){
|
||||
cfi = this.epubcfi.parse(cfi);
|
||||
}
|
||||
|
||||
element = this.epubcfi.getElement(cfi, this.doc);
|
||||
this.pageByElement(element);
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.findFirstVisible = function(startEl){
|
||||
var el = startEl || this.bodyEl,
|
||||
found;
|
||||
|
||||
found = this.walk(el);
|
||||
|
||||
if(found) {
|
||||
return found;
|
||||
}else{
|
||||
return startEl;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
EPUBJS.Renderer.prototype.isElementVisible = function(el){
|
||||
var rect;
|
||||
|
||||
if(el && typeof el.getBoundingClientRect === 'function'){
|
||||
rect = el.getBoundingClientRect();
|
||||
|
||||
if( rect.width != 0 &&
|
||||
rect.height != 0 &&
|
||||
rect.left >= 0 &&
|
||||
rect.left < this.spreadWidth ) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
|
||||
EPUBJS.Renderer.prototype.height = function(el){
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue