1
0
Fork 0
mirror of https://github.com/futurepress/epub.js.git synced 2025-10-03 14:59:18 +02:00

updated pagination to give pageRange and anchorPage

This commit is contained in:
fchasen 2014-04-23 22:30:15 -07:00
parent 36ccb1230b
commit 1fb81952c1
14 changed files with 494 additions and 142 deletions

2
books

@ -1 +1 @@
Subproject commit ab9755a74714b647290c861f666515de220935d8
Subproject commit 950c742b3d66cc7ac53bd0663a41315f001da1c4

View file

@ -2574,6 +2574,9 @@ EPUBJS.Book.prototype.createHiddenRender = function(renderer, _width, _height) {
renderer.setMinSpreadWidth(this.settings.minSpreadWidth);
this._registerReplacements(renderer);
if(this.settings.forceSingle) {
renderer.forceSingle(true);
}
hiddenEl = document.createElement("div");
hiddenEl.style.visibility = "hidden";
@ -2627,12 +2630,30 @@ EPUBJS.Book.prototype.generatePageList = function(width, height){
deferred.resolve(pageList);
}.bind(this));
pager.on("renderer:locationChanged", function(cfi){
pager.on("renderer:visibleRangeChanged", function(range){
var endX, endY;
var endRange, endCfi;
currentPage += 1;
pageList.push({
"cfi" : cfi,
"cfi" : range.start,
"page" : currentPage
});
if (pager.layoutMethod == "ReflowableSpreads") {
endX = pager.layout.colWidth + pager.layout.gap + 1;
endY = 1;
endRange = pager.getRange(endX, endY);
if(endRange) {
endCfi = pager.currentChapter.cfiFromRange(endRange);
currentPage += 1;
pageList.push({
"cfi" : endCfi,
"page" : currentPage
});
}
}
});
@ -2643,16 +2664,18 @@ EPUBJS.Book.prototype.generatePageList = function(width, height){
// Width and Height are optional and will default to the current dimensions
EPUBJS.Book.prototype.generatePagination = function(width, height) {
var book = this;
var defered = new RSVP.defer();
this.ready.spine.promise.then(function(){
book.generatePageList(width, height).then(function(pageList){
book.pageList = book.contents.pageList = pageList;
book.pagination.process(pageList);
book.ready.pageList.resolve(book.pageList);
defered.resolve(book.pageList);
});
});
return this.pageListReady;
return defered.promise;
};
// Process the pagination from a JSON array containing the pagelist
@ -2706,15 +2729,25 @@ EPUBJS.Book.prototype.listenToRenderer = function(renderer){
});
});
renderer.on("renderer:visibleRangeChanged", function(range) {
var startPage, endPage, percent;
var pageRange = [];
renderer.on("renderer:locationChanged", function(cfi) {
var page, percent;
if(this.pageList.length > 0) {
page = this.pagination.pageFromCfi(cfi);
percent = this.pagination.percentageFromPage(page);
startPage = this.pagination.pageFromCfi(range.start);
percent = this.pagination.percentageFromPage(startPage);
pageRange.push(startPage);
if(range.end) {
endPage = this.pagination.pageFromCfi(range.end);
if(startPage != endPage) {
pageRange.push(endPage);
}
}
this.trigger("book:pageChanged", {
"page": page,
"percentage": percent
"anchorPage": startPage,
"percentage": percent,
"pageRange" : pageRange
});
// TODO: Add event for first and last page.
@ -3309,6 +3342,7 @@ EPUBJS.Book.prototype.useSpreads = function(use) {
EPUBJS.Book.prototype.forceSingle = function(use) {
this.renderer.forceSingle(use);
this.settings.forceSingle = use;
if(this.isRendered) {
this.renderer.reformat();
}
@ -3525,10 +3559,14 @@ EPUBJS.Chapter.prototype.cfiFromRange = function(_range) {
// Find Exact Range in original document
if(startContainer) {
range.setStart(startContainer, _range.startOffset);
if(!_range.collapsed && endContainer) {
range.setEnd(endContainer, _range.endOffset);
try {
range.setStart(startContainer, _range.startOffset);
if(!_range.collapsed && endContainer) {
range.setEnd(endContainer, _range.endOffset);
}
} catch (e) {
console.log("missed");
startContainer = false;
}
}
@ -4783,7 +4821,8 @@ EPUBJS.Layout.ReflowableSpreads.prototype.format = function(documentElement, _wi
documentElement.style[columnAxis] = "horizontal";
documentElement.style[columnGap] = gap+"px";
documentElement.style[columnWidth] = colWidth+"px";
this.colWidth = colWidth;
this.gap = gap;
return {
pageWidth : this.spreadWidth,
pageHeight : _height
@ -5669,6 +5708,7 @@ EPUBJS.Renderer.prototype.Events = [
"renderer:chapterUnloaded",
"renderer:chapterDisplayed",
"renderer:locationChanged",
"renderer:visibleLocationChanged",
"renderer:resized",
"renderer:spreads"
];
@ -5754,8 +5794,8 @@ EPUBJS.Renderer.prototype.load = function(url){
this.doc = this.render.document;
// Format the contents using the current layout method
formated = this.layout.format(contents, this.render.width, this.render.height);
this.render.setPageDimensions(formated.pageWidth, formated.pageHeight);
this.formated = this.layout.format(contents, this.render.width, this.render.height);
this.render.setPageDimensions(this.formated.pageWidth, this.formated.pageHeight);
if(!this.initWidth && !this.initHeight){
this.render.window.addEventListener("resize", this.resized, false);
@ -5772,10 +5812,13 @@ EPUBJS.Renderer.prototype.load = function(url){
this.updatePages(pages);
msg.cfi = this.currentLocationCfi = this.getPageCfi();
this.trigger("renderer:chapterDisplayed", msg);
this.visibleRangeCfi = this.getVisibleRangeCfi();
this.currentLocationCfi = this.visibleRangeCfi.start;
this.trigger("renderer:locationChanged", this.currentLocationCfi);
this.trigger("renderer:visibleRangeChanged", this.visibleRangeCfi);
msg.cfi = this.currentLocationCfi;
this.trigger("renderer:chapterDisplayed", msg);
this.visible(true);
@ -5878,8 +5921,11 @@ EPUBJS.Renderer.prototype.reformat = function(){
var formated, pages;
if(!this.contents) return;
formated = this.layout.format(this.contents, this.render.width, this.render.height);
this.render.setPageDimensions(formated.pageWidth, formated.pageHeight);
this.layoutMethod = this.determineLayout(this.layoutSettings);
this.layout = new EPUBJS.Layout[this.layoutMethod]();
this.formated = this.layout.format(this.contents, this.render.width, this.render.height);
this.render.setPageDimensions(this.formated.pageWidth, this.formated.pageHeight);
pages = renderer.layout.calculatePages();
renderer.updatePages(pages);
@ -5951,9 +5997,11 @@ EPUBJS.Renderer.prototype.page = function(pg){
this.chapterPos = pg;
this.render.page(pg);
this.currentLocationCfi = this.getPageCfi();
this.visibleRangeCfi = this.getVisibleRangeCfi();
this.currentLocationCfi = this.visibleRangeCfi.start;
this.trigger("renderer:locationChanged", this.currentLocationCfi);
this.trigger("renderer:visibleRangeChanged", this.visibleRangeCfi);
return true;
}
//-- Return false if page is greater than the total
@ -5961,6 +6009,7 @@ EPUBJS.Renderer.prototype.page = function(pg){
};
// Short cut to find next page's cfi starting at the last visible element
/*
EPUBJS.Renderer.prototype.nextPage = function(){
var pg = this.chapterPos + 1;
if(pg <= this.displayedPages){
@ -5976,6 +6025,10 @@ EPUBJS.Renderer.prototype.nextPage = function(){
//-- Return false if page is greater than the total
return false;
};
*/
EPUBJS.Renderer.prototype.nextPage = function(){
return this.page(this.chapterPos + 1);
};
EPUBJS.Renderer.prototype.prevPage = function(){
return this.page(this.chapterPos - 1);
@ -6070,8 +6123,25 @@ EPUBJS.Renderer.prototype.getPageCfi = function(prevEl){
var range = this.doc.createRange();
var position;
// TODO : this might need to take margin / padding into account?
var x = 0;
var y = 0;
var x = 1;//this.formated.pageWidth/2;
var y = 1;//;this.formated.pageHeight/2;
range = this.getRange(x, y);
// var test = this.doc.defaultView.getSelection();
// var r = this.doc.createRange();
// test.removeAllRanges();
// r.setStart(range.startContainer, range.startOffset);
// r.setEnd(range.startContainer, range.startOffset + 1);
// test.addRange(r);
return this.currentChapter.cfiFromRange(range);
};
EPUBJS.Renderer.prototype.getRange = function(x, y){
var range = this.doc.createRange();
var position;
if(typeof document.caretPositionFromPoint !== "undefined"){
position = this.doc.caretPositionFromPoint(x, y);
@ -6089,8 +6159,26 @@ EPUBJS.Renderer.prototype.getPageCfi = function(prevEl){
// r.setStart(range.startContainer, range.startOffset);
// r.setEnd(range.startContainer, range.startOffset + 1);
// test.addRange(r);
return range;
};
return this.currentChapter.cfiFromRange(range);
EPUBJS.Renderer.prototype.getVisibleRangeCfi = function(prevEl){
var startX = 1;
var startY = 1;
var endX = this.width-1;
var endY = this.height-1;
var startRange = this.getRange(startX, startY);
var endRange = this.getRange(endX, endY); //fix if carret not avail
var startCfi = this.currentChapter.cfiFromRange(startRange);
var endCfi;
if(endRange) {
endCfi = this.currentChapter.cfiFromRange(endRange);
}
return {
start: startCfi,
end: endCfi || false
};
};
// Goto a cfi position in the current chapter
@ -6239,7 +6327,7 @@ EPUBJS.Renderer.prototype.forceSingle = function(bool){
this.spreads = false;
} else {
this.isForcedSingle = false;
this.spreads = this.determineSpreads(width);
this.spreads = this.determineSpreads(this.minSpreadWidth);
}
};

File diff suppressed because one or more lines are too long

6
build/epub.min.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -2573,6 +2573,9 @@ EPUBJS.Book.prototype.createHiddenRender = function(renderer, _width, _height) {
renderer.setMinSpreadWidth(this.settings.minSpreadWidth);
this._registerReplacements(renderer);
if(this.settings.forceSingle) {
renderer.forceSingle(true);
}
hiddenEl = document.createElement("div");
hiddenEl.style.visibility = "hidden";
@ -2626,12 +2629,30 @@ EPUBJS.Book.prototype.generatePageList = function(width, height){
deferred.resolve(pageList);
}.bind(this));
pager.on("renderer:locationChanged", function(cfi){
pager.on("renderer:visibleRangeChanged", function(range){
var endX, endY;
var endRange, endCfi;
currentPage += 1;
pageList.push({
"cfi" : cfi,
"cfi" : range.start,
"page" : currentPage
});
if (pager.layoutMethod == "ReflowableSpreads") {
endX = pager.layout.colWidth + pager.layout.gap + 1;
endY = 1;
endRange = pager.getRange(endX, endY);
if(endRange) {
endCfi = pager.currentChapter.cfiFromRange(endRange);
currentPage += 1;
pageList.push({
"cfi" : endCfi,
"page" : currentPage
});
}
}
});
@ -2642,16 +2663,18 @@ EPUBJS.Book.prototype.generatePageList = function(width, height){
// Width and Height are optional and will default to the current dimensions
EPUBJS.Book.prototype.generatePagination = function(width, height) {
var book = this;
var defered = new RSVP.defer();
this.ready.spine.promise.then(function(){
book.generatePageList(width, height).then(function(pageList){
book.pageList = book.contents.pageList = pageList;
book.pagination.process(pageList);
book.ready.pageList.resolve(book.pageList);
defered.resolve(book.pageList);
});
});
return this.pageListReady;
return defered.promise;
};
// Process the pagination from a JSON array containing the pagelist
@ -2705,15 +2728,25 @@ EPUBJS.Book.prototype.listenToRenderer = function(renderer){
});
});
renderer.on("renderer:visibleRangeChanged", function(range) {
var startPage, endPage, percent;
var pageRange = [];
renderer.on("renderer:locationChanged", function(cfi) {
var page, percent;
if(this.pageList.length > 0) {
page = this.pagination.pageFromCfi(cfi);
percent = this.pagination.percentageFromPage(page);
startPage = this.pagination.pageFromCfi(range.start);
percent = this.pagination.percentageFromPage(startPage);
pageRange.push(startPage);
if(range.end) {
endPage = this.pagination.pageFromCfi(range.end);
if(startPage != endPage) {
pageRange.push(endPage);
}
}
this.trigger("book:pageChanged", {
"page": page,
"percentage": percent
"anchorPage": startPage,
"percentage": percent,
"pageRange" : pageRange
});
// TODO: Add event for first and last page.
@ -3308,6 +3341,7 @@ EPUBJS.Book.prototype.useSpreads = function(use) {
EPUBJS.Book.prototype.forceSingle = function(use) {
this.renderer.forceSingle(use);
this.settings.forceSingle = use;
if(this.isRendered) {
this.renderer.reformat();
}
@ -3524,10 +3558,14 @@ EPUBJS.Chapter.prototype.cfiFromRange = function(_range) {
// Find Exact Range in original document
if(startContainer) {
range.setStart(startContainer, _range.startOffset);
if(!_range.collapsed && endContainer) {
range.setEnd(endContainer, _range.endOffset);
try {
range.setStart(startContainer, _range.startOffset);
if(!_range.collapsed && endContainer) {
range.setEnd(endContainer, _range.endOffset);
}
} catch (e) {
console.log("missed");
startContainer = false;
}
}
@ -4782,7 +4820,8 @@ EPUBJS.Layout.ReflowableSpreads.prototype.format = function(documentElement, _wi
documentElement.style[columnAxis] = "horizontal";
documentElement.style[columnGap] = gap+"px";
documentElement.style[columnWidth] = colWidth+"px";
this.colWidth = colWidth;
this.gap = gap;
return {
pageWidth : this.spreadWidth,
pageHeight : _height
@ -5668,6 +5707,7 @@ EPUBJS.Renderer.prototype.Events = [
"renderer:chapterUnloaded",
"renderer:chapterDisplayed",
"renderer:locationChanged",
"renderer:visibleLocationChanged",
"renderer:resized",
"renderer:spreads"
];
@ -5753,8 +5793,8 @@ EPUBJS.Renderer.prototype.load = function(url){
this.doc = this.render.document;
// Format the contents using the current layout method
formated = this.layout.format(contents, this.render.width, this.render.height);
this.render.setPageDimensions(formated.pageWidth, formated.pageHeight);
this.formated = this.layout.format(contents, this.render.width, this.render.height);
this.render.setPageDimensions(this.formated.pageWidth, this.formated.pageHeight);
if(!this.initWidth && !this.initHeight){
this.render.window.addEventListener("resize", this.resized, false);
@ -5771,10 +5811,13 @@ EPUBJS.Renderer.prototype.load = function(url){
this.updatePages(pages);
msg.cfi = this.currentLocationCfi = this.getPageCfi();
this.trigger("renderer:chapterDisplayed", msg);
this.visibleRangeCfi = this.getVisibleRangeCfi();
this.currentLocationCfi = this.visibleRangeCfi.start;
this.trigger("renderer:locationChanged", this.currentLocationCfi);
this.trigger("renderer:visibleRangeChanged", this.visibleRangeCfi);
msg.cfi = this.currentLocationCfi;
this.trigger("renderer:chapterDisplayed", msg);
this.visible(true);
@ -5877,8 +5920,11 @@ EPUBJS.Renderer.prototype.reformat = function(){
var formated, pages;
if(!this.contents) return;
formated = this.layout.format(this.contents, this.render.width, this.render.height);
this.render.setPageDimensions(formated.pageWidth, formated.pageHeight);
this.layoutMethod = this.determineLayout(this.layoutSettings);
this.layout = new EPUBJS.Layout[this.layoutMethod]();
this.formated = this.layout.format(this.contents, this.render.width, this.render.height);
this.render.setPageDimensions(this.formated.pageWidth, this.formated.pageHeight);
pages = renderer.layout.calculatePages();
renderer.updatePages(pages);
@ -5950,9 +5996,11 @@ EPUBJS.Renderer.prototype.page = function(pg){
this.chapterPos = pg;
this.render.page(pg);
this.currentLocationCfi = this.getPageCfi();
this.visibleRangeCfi = this.getVisibleRangeCfi();
this.currentLocationCfi = this.visibleRangeCfi.start;
this.trigger("renderer:locationChanged", this.currentLocationCfi);
this.trigger("renderer:visibleRangeChanged", this.visibleRangeCfi);
return true;
}
//-- Return false if page is greater than the total
@ -5960,6 +6008,7 @@ EPUBJS.Renderer.prototype.page = function(pg){
};
// Short cut to find next page's cfi starting at the last visible element
/*
EPUBJS.Renderer.prototype.nextPage = function(){
var pg = this.chapterPos + 1;
if(pg <= this.displayedPages){
@ -5975,6 +6024,10 @@ EPUBJS.Renderer.prototype.nextPage = function(){
//-- Return false if page is greater than the total
return false;
};
*/
EPUBJS.Renderer.prototype.nextPage = function(){
return this.page(this.chapterPos + 1);
};
EPUBJS.Renderer.prototype.prevPage = function(){
return this.page(this.chapterPos - 1);
@ -6069,8 +6122,25 @@ EPUBJS.Renderer.prototype.getPageCfi = function(prevEl){
var range = this.doc.createRange();
var position;
// TODO : this might need to take margin / padding into account?
var x = 0;
var y = 0;
var x = 1;//this.formated.pageWidth/2;
var y = 1;//;this.formated.pageHeight/2;
range = this.getRange(x, y);
// var test = this.doc.defaultView.getSelection();
// var r = this.doc.createRange();
// test.removeAllRanges();
// r.setStart(range.startContainer, range.startOffset);
// r.setEnd(range.startContainer, range.startOffset + 1);
// test.addRange(r);
return this.currentChapter.cfiFromRange(range);
};
EPUBJS.Renderer.prototype.getRange = function(x, y){
var range = this.doc.createRange();
var position;
if(typeof document.caretPositionFromPoint !== "undefined"){
position = this.doc.caretPositionFromPoint(x, y);
@ -6088,8 +6158,26 @@ EPUBJS.Renderer.prototype.getPageCfi = function(prevEl){
// r.setStart(range.startContainer, range.startOffset);
// r.setEnd(range.startContainer, range.startOffset + 1);
// test.addRange(r);
return range;
};
return this.currentChapter.cfiFromRange(range);
EPUBJS.Renderer.prototype.getVisibleRangeCfi = function(prevEl){
var startX = 1;
var startY = 1;
var endX = this.width-1;
var endY = this.height-1;
var startRange = this.getRange(startX, startY);
var endRange = this.getRange(endX, endY); //fix if carret not avail
var startCfi = this.currentChapter.cfiFromRange(startRange);
var endCfi;
if(endRange) {
endCfi = this.currentChapter.cfiFromRange(endRange);
}
return {
start: startCfi,
end: endCfi || false
};
};
// Goto a cfi position in the current chapter
@ -6238,7 +6326,7 @@ EPUBJS.Renderer.prototype.forceSingle = function(bool){
this.spreads = false;
} else {
this.isForcedSingle = false;
this.spreads = this.determineSpreads(width);
this.spreads = this.determineSpreads(this.minSpreadWidth);
}
};

File diff suppressed because one or more lines are too long

View file

@ -12,7 +12,7 @@
"grunt-contrib-concat": "~0.4.0",
"grunt-contrib-uglify": "~0.4.0",
"grunt-contrib-jshint": "~0.10.0",
"grunt": "~0.4.4",
"grunt-contrib-copy": "~0.5.0"
"grunt-contrib-copy": "~0.5.0",
"grunt-concat-sourcemap": "~0.4.1"
}
}

File diff suppressed because one or more lines are too long

142
reader/js/epub.min.js vendored
View file

@ -2574,6 +2574,9 @@ EPUBJS.Book.prototype.createHiddenRender = function(renderer, _width, _height) {
renderer.setMinSpreadWidth(this.settings.minSpreadWidth);
this._registerReplacements(renderer);
if(this.settings.forceSingle) {
renderer.forceSingle(true);
}
hiddenEl = document.createElement("div");
hiddenEl.style.visibility = "hidden";
@ -2627,12 +2630,30 @@ EPUBJS.Book.prototype.generatePageList = function(width, height){
deferred.resolve(pageList);
}.bind(this));
pager.on("renderer:locationChanged", function(cfi){
pager.on("renderer:visibleRangeChanged", function(range){
var endX, endY;
var endRange, endCfi;
currentPage += 1;
pageList.push({
"cfi" : cfi,
"cfi" : range.start,
"page" : currentPage
});
if (pager.layoutMethod == "ReflowableSpreads") {
endX = pager.layout.colWidth + pager.layout.gap + 1;
endY = 1;
endRange = pager.getRange(endX, endY);
if(endRange) {
endCfi = pager.currentChapter.cfiFromRange(endRange);
currentPage += 1;
pageList.push({
"cfi" : endCfi,
"page" : currentPage
});
}
}
});
@ -2643,16 +2664,18 @@ EPUBJS.Book.prototype.generatePageList = function(width, height){
// Width and Height are optional and will default to the current dimensions
EPUBJS.Book.prototype.generatePagination = function(width, height) {
var book = this;
var defered = new RSVP.defer();
this.ready.spine.promise.then(function(){
book.generatePageList(width, height).then(function(pageList){
book.pageList = book.contents.pageList = pageList;
book.pagination.process(pageList);
book.ready.pageList.resolve(book.pageList);
defered.resolve(book.pageList);
});
});
return this.pageListReady;
return defered.promise;
};
// Process the pagination from a JSON array containing the pagelist
@ -2706,15 +2729,25 @@ EPUBJS.Book.prototype.listenToRenderer = function(renderer){
});
});
renderer.on("renderer:visibleRangeChanged", function(range) {
var startPage, endPage, percent;
var pageRange = [];
renderer.on("renderer:locationChanged", function(cfi) {
var page, percent;
if(this.pageList.length > 0) {
page = this.pagination.pageFromCfi(cfi);
percent = this.pagination.percentageFromPage(page);
startPage = this.pagination.pageFromCfi(range.start);
percent = this.pagination.percentageFromPage(startPage);
pageRange.push(startPage);
if(range.end) {
endPage = this.pagination.pageFromCfi(range.end);
if(startPage != endPage) {
pageRange.push(endPage);
}
}
this.trigger("book:pageChanged", {
"page": page,
"percentage": percent
"anchorPage": startPage,
"percentage": percent,
"pageRange" : pageRange
});
// TODO: Add event for first and last page.
@ -3309,6 +3342,7 @@ EPUBJS.Book.prototype.useSpreads = function(use) {
EPUBJS.Book.prototype.forceSingle = function(use) {
this.renderer.forceSingle(use);
this.settings.forceSingle = use;
if(this.isRendered) {
this.renderer.reformat();
}
@ -3525,10 +3559,14 @@ EPUBJS.Chapter.prototype.cfiFromRange = function(_range) {
// Find Exact Range in original document
if(startContainer) {
range.setStart(startContainer, _range.startOffset);
if(!_range.collapsed && endContainer) {
range.setEnd(endContainer, _range.endOffset);
try {
range.setStart(startContainer, _range.startOffset);
if(!_range.collapsed && endContainer) {
range.setEnd(endContainer, _range.endOffset);
}
} catch (e) {
console.log("missed");
startContainer = false;
}
}
@ -4783,7 +4821,8 @@ EPUBJS.Layout.ReflowableSpreads.prototype.format = function(documentElement, _wi
documentElement.style[columnAxis] = "horizontal";
documentElement.style[columnGap] = gap+"px";
documentElement.style[columnWidth] = colWidth+"px";
this.colWidth = colWidth;
this.gap = gap;
return {
pageWidth : this.spreadWidth,
pageHeight : _height
@ -5669,6 +5708,7 @@ EPUBJS.Renderer.prototype.Events = [
"renderer:chapterUnloaded",
"renderer:chapterDisplayed",
"renderer:locationChanged",
"renderer:visibleLocationChanged",
"renderer:resized",
"renderer:spreads"
];
@ -5754,8 +5794,8 @@ EPUBJS.Renderer.prototype.load = function(url){
this.doc = this.render.document;
// Format the contents using the current layout method
formated = this.layout.format(contents, this.render.width, this.render.height);
this.render.setPageDimensions(formated.pageWidth, formated.pageHeight);
this.formated = this.layout.format(contents, this.render.width, this.render.height);
this.render.setPageDimensions(this.formated.pageWidth, this.formated.pageHeight);
if(!this.initWidth && !this.initHeight){
this.render.window.addEventListener("resize", this.resized, false);
@ -5772,10 +5812,13 @@ EPUBJS.Renderer.prototype.load = function(url){
this.updatePages(pages);
msg.cfi = this.currentLocationCfi = this.getPageCfi();
this.trigger("renderer:chapterDisplayed", msg);
this.visibleRangeCfi = this.getVisibleRangeCfi();
this.currentLocationCfi = this.visibleRangeCfi.start;
this.trigger("renderer:locationChanged", this.currentLocationCfi);
this.trigger("renderer:visibleRangeChanged", this.visibleRangeCfi);
msg.cfi = this.currentLocationCfi;
this.trigger("renderer:chapterDisplayed", msg);
this.visible(true);
@ -5878,8 +5921,11 @@ EPUBJS.Renderer.prototype.reformat = function(){
var formated, pages;
if(!this.contents) return;
formated = this.layout.format(this.contents, this.render.width, this.render.height);
this.render.setPageDimensions(formated.pageWidth, formated.pageHeight);
this.layoutMethod = this.determineLayout(this.layoutSettings);
this.layout = new EPUBJS.Layout[this.layoutMethod]();
this.formated = this.layout.format(this.contents, this.render.width, this.render.height);
this.render.setPageDimensions(this.formated.pageWidth, this.formated.pageHeight);
pages = renderer.layout.calculatePages();
renderer.updatePages(pages);
@ -5951,9 +5997,11 @@ EPUBJS.Renderer.prototype.page = function(pg){
this.chapterPos = pg;
this.render.page(pg);
this.currentLocationCfi = this.getPageCfi();
this.visibleRangeCfi = this.getVisibleRangeCfi();
this.currentLocationCfi = this.visibleRangeCfi.start;
this.trigger("renderer:locationChanged", this.currentLocationCfi);
this.trigger("renderer:visibleRangeChanged", this.visibleRangeCfi);
return true;
}
//-- Return false if page is greater than the total
@ -5961,6 +6009,7 @@ EPUBJS.Renderer.prototype.page = function(pg){
};
// Short cut to find next page's cfi starting at the last visible element
/*
EPUBJS.Renderer.prototype.nextPage = function(){
var pg = this.chapterPos + 1;
if(pg <= this.displayedPages){
@ -5976,6 +6025,10 @@ EPUBJS.Renderer.prototype.nextPage = function(){
//-- Return false if page is greater than the total
return false;
};
*/
EPUBJS.Renderer.prototype.nextPage = function(){
return this.page(this.chapterPos + 1);
};
EPUBJS.Renderer.prototype.prevPage = function(){
return this.page(this.chapterPos - 1);
@ -6070,8 +6123,25 @@ EPUBJS.Renderer.prototype.getPageCfi = function(prevEl){
var range = this.doc.createRange();
var position;
// TODO : this might need to take margin / padding into account?
var x = 0;
var y = 0;
var x = 1;//this.formated.pageWidth/2;
var y = 1;//;this.formated.pageHeight/2;
range = this.getRange(x, y);
// var test = this.doc.defaultView.getSelection();
// var r = this.doc.createRange();
// test.removeAllRanges();
// r.setStart(range.startContainer, range.startOffset);
// r.setEnd(range.startContainer, range.startOffset + 1);
// test.addRange(r);
return this.currentChapter.cfiFromRange(range);
};
EPUBJS.Renderer.prototype.getRange = function(x, y){
var range = this.doc.createRange();
var position;
if(typeof document.caretPositionFromPoint !== "undefined"){
position = this.doc.caretPositionFromPoint(x, y);
@ -6089,8 +6159,26 @@ EPUBJS.Renderer.prototype.getPageCfi = function(prevEl){
// r.setStart(range.startContainer, range.startOffset);
// r.setEnd(range.startContainer, range.startOffset + 1);
// test.addRange(r);
return range;
};
return this.currentChapter.cfiFromRange(range);
EPUBJS.Renderer.prototype.getVisibleRangeCfi = function(prevEl){
var startX = 1;
var startY = 1;
var endX = this.width-1;
var endY = this.height-1;
var startRange = this.getRange(startX, startY);
var endRange = this.getRange(endX, endY); //fix if carret not avail
var startCfi = this.currentChapter.cfiFromRange(startRange);
var endCfi;
if(endRange) {
endCfi = this.currentChapter.cfiFromRange(endRange);
}
return {
start: startCfi,
end: endCfi || false
};
};
// Goto a cfi position in the current chapter
@ -6239,7 +6327,7 @@ EPUBJS.Renderer.prototype.forceSingle = function(bool){
this.spreads = false;
} else {
this.isForcedSingle = false;
this.spreads = this.determineSpreads(width);
this.spreads = this.determineSpreads(this.minSpreadWidth);
}
};

View file

@ -324,6 +324,9 @@ EPUBJS.Book.prototype.createHiddenRender = function(renderer, _width, _height) {
renderer.setMinSpreadWidth(this.settings.minSpreadWidth);
this._registerReplacements(renderer);
if(this.settings.forceSingle) {
renderer.forceSingle(true);
}
hiddenEl = document.createElement("div");
hiddenEl.style.visibility = "hidden";
@ -377,12 +380,30 @@ EPUBJS.Book.prototype.generatePageList = function(width, height){
deferred.resolve(pageList);
}.bind(this));
pager.on("renderer:locationChanged", function(cfi){
pager.on("renderer:visibleRangeChanged", function(range){
var endX, endY;
var endRange, endCfi;
currentPage += 1;
pageList.push({
"cfi" : cfi,
"cfi" : range.start,
"page" : currentPage
});
if (pager.layoutMethod == "ReflowableSpreads") {
endX = pager.layout.colWidth + pager.layout.gap + 1;
endY = 1;
endRange = pager.getRange(endX, endY);
if(endRange) {
endCfi = pager.currentChapter.cfiFromRange(endRange);
currentPage += 1;
pageList.push({
"cfi" : endCfi,
"page" : currentPage
});
}
}
});
@ -393,16 +414,18 @@ EPUBJS.Book.prototype.generatePageList = function(width, height){
// Width and Height are optional and will default to the current dimensions
EPUBJS.Book.prototype.generatePagination = function(width, height) {
var book = this;
var defered = new RSVP.defer();
this.ready.spine.promise.then(function(){
book.generatePageList(width, height).then(function(pageList){
book.pageList = book.contents.pageList = pageList;
book.pagination.process(pageList);
book.ready.pageList.resolve(book.pageList);
defered.resolve(book.pageList);
});
});
return this.pageListReady;
return defered.promise;
};
// Process the pagination from a JSON array containing the pagelist
@ -456,15 +479,25 @@ EPUBJS.Book.prototype.listenToRenderer = function(renderer){
});
});
renderer.on("renderer:visibleRangeChanged", function(range) {
var startPage, endPage, percent;
var pageRange = [];
renderer.on("renderer:locationChanged", function(cfi) {
var page, percent;
if(this.pageList.length > 0) {
page = this.pagination.pageFromCfi(cfi);
percent = this.pagination.percentageFromPage(page);
startPage = this.pagination.pageFromCfi(range.start);
percent = this.pagination.percentageFromPage(startPage);
pageRange.push(startPage);
if(range.end) {
endPage = this.pagination.pageFromCfi(range.end);
if(startPage != endPage) {
pageRange.push(endPage);
}
}
this.trigger("book:pageChanged", {
"page": page,
"percentage": percent
"anchorPage": startPage,
"percentage": percent,
"pageRange" : pageRange
});
// TODO: Add event for first and last page.
@ -1059,6 +1092,7 @@ EPUBJS.Book.prototype.useSpreads = function(use) {
EPUBJS.Book.prototype.forceSingle = function(use) {
this.renderer.forceSingle(use);
this.settings.forceSingle = use;
if(this.isRendered) {
this.renderer.reformat();
}

View file

@ -91,10 +91,14 @@ EPUBJS.Chapter.prototype.cfiFromRange = function(_range) {
// Find Exact Range in original document
if(startContainer) {
range.setStart(startContainer, _range.startOffset);
if(!_range.collapsed && endContainer) {
range.setEnd(endContainer, _range.endOffset);
try {
range.setStart(startContainer, _range.startOffset);
if(!_range.collapsed && endContainer) {
range.setEnd(endContainer, _range.endOffset);
}
} catch (e) {
console.log("missed");
startContainer = false;
}
}

View file

@ -90,7 +90,8 @@ EPUBJS.Layout.ReflowableSpreads.prototype.format = function(documentElement, _wi
documentElement.style[columnAxis] = "horizontal";
documentElement.style[columnGap] = gap+"px";
documentElement.style[columnWidth] = colWidth+"px";
this.colWidth = colWidth;
this.gap = gap;
return {
pageWidth : this.spreadWidth,
pageHeight : _height

View file

@ -54,6 +54,7 @@ EPUBJS.Renderer.prototype.Events = [
"renderer:chapterUnloaded",
"renderer:chapterDisplayed",
"renderer:locationChanged",
"renderer:visibleLocationChanged",
"renderer:resized",
"renderer:spreads"
];
@ -139,8 +140,8 @@ EPUBJS.Renderer.prototype.load = function(url){
this.doc = this.render.document;
// Format the contents using the current layout method
formated = this.layout.format(contents, this.render.width, this.render.height);
this.render.setPageDimensions(formated.pageWidth, formated.pageHeight);
this.formated = this.layout.format(contents, this.render.width, this.render.height);
this.render.setPageDimensions(this.formated.pageWidth, this.formated.pageHeight);
if(!this.initWidth && !this.initHeight){
this.render.window.addEventListener("resize", this.resized, false);
@ -157,10 +158,13 @@ EPUBJS.Renderer.prototype.load = function(url){
this.updatePages(pages);
msg.cfi = this.currentLocationCfi = this.getPageCfi();
this.trigger("renderer:chapterDisplayed", msg);
this.visibleRangeCfi = this.getVisibleRangeCfi();
this.currentLocationCfi = this.visibleRangeCfi.start;
this.trigger("renderer:locationChanged", this.currentLocationCfi);
this.trigger("renderer:visibleRangeChanged", this.visibleRangeCfi);
msg.cfi = this.currentLocationCfi;
this.trigger("renderer:chapterDisplayed", msg);
this.visible(true);
@ -263,8 +267,11 @@ EPUBJS.Renderer.prototype.reformat = function(){
var formated, pages;
if(!this.contents) return;
formated = this.layout.format(this.contents, this.render.width, this.render.height);
this.render.setPageDimensions(formated.pageWidth, formated.pageHeight);
this.layoutMethod = this.determineLayout(this.layoutSettings);
this.layout = new EPUBJS.Layout[this.layoutMethod]();
this.formated = this.layout.format(this.contents, this.render.width, this.render.height);
this.render.setPageDimensions(this.formated.pageWidth, this.formated.pageHeight);
pages = renderer.layout.calculatePages();
renderer.updatePages(pages);
@ -336,9 +343,11 @@ EPUBJS.Renderer.prototype.page = function(pg){
this.chapterPos = pg;
this.render.page(pg);
this.currentLocationCfi = this.getPageCfi();
this.visibleRangeCfi = this.getVisibleRangeCfi();
this.currentLocationCfi = this.visibleRangeCfi.start;
this.trigger("renderer:locationChanged", this.currentLocationCfi);
this.trigger("renderer:visibleRangeChanged", this.visibleRangeCfi);
return true;
}
//-- Return false if page is greater than the total
@ -346,6 +355,7 @@ EPUBJS.Renderer.prototype.page = function(pg){
};
// Short cut to find next page's cfi starting at the last visible element
/*
EPUBJS.Renderer.prototype.nextPage = function(){
var pg = this.chapterPos + 1;
if(pg <= this.displayedPages){
@ -361,6 +371,10 @@ EPUBJS.Renderer.prototype.nextPage = function(){
//-- Return false if page is greater than the total
return false;
};
*/
EPUBJS.Renderer.prototype.nextPage = function(){
return this.page(this.chapterPos + 1);
};
EPUBJS.Renderer.prototype.prevPage = function(){
return this.page(this.chapterPos - 1);
@ -455,8 +469,25 @@ EPUBJS.Renderer.prototype.getPageCfi = function(prevEl){
var range = this.doc.createRange();
var position;
// TODO : this might need to take margin / padding into account?
var x = 0;
var y = 0;
var x = 1;//this.formated.pageWidth/2;
var y = 1;//;this.formated.pageHeight/2;
range = this.getRange(x, y);
// var test = this.doc.defaultView.getSelection();
// var r = this.doc.createRange();
// test.removeAllRanges();
// r.setStart(range.startContainer, range.startOffset);
// r.setEnd(range.startContainer, range.startOffset + 1);
// test.addRange(r);
return this.currentChapter.cfiFromRange(range);
};
EPUBJS.Renderer.prototype.getRange = function(x, y){
var range = this.doc.createRange();
var position;
if(typeof document.caretPositionFromPoint !== "undefined"){
position = this.doc.caretPositionFromPoint(x, y);
@ -474,8 +505,26 @@ EPUBJS.Renderer.prototype.getPageCfi = function(prevEl){
// r.setStart(range.startContainer, range.startOffset);
// r.setEnd(range.startContainer, range.startOffset + 1);
// test.addRange(r);
return range;
};
return this.currentChapter.cfiFromRange(range);
EPUBJS.Renderer.prototype.getVisibleRangeCfi = function(prevEl){
var startX = 1;
var startY = 1;
var endX = this.width-1;
var endY = this.height-1;
var startRange = this.getRange(startX, startY);
var endRange = this.getRange(endX, endY); //fix if carret not avail
var startCfi = this.currentChapter.cfiFromRange(startRange);
var endCfi;
if(endRange) {
endCfi = this.currentChapter.cfiFromRange(endRange);
}
return {
start: startCfi,
end: endCfi || false
};
};
// Goto a cfi position in the current chapter
@ -624,7 +673,7 @@ EPUBJS.Renderer.prototype.forceSingle = function(bool){
this.spreads = false;
} else {
this.isForcedSingle = false;
this.spreads = this.determineSpreads(width);
this.spreads = this.determineSpreads(this.minSpreadWidth);
}
};