1
0
Fork 0
mirror of https://github.com/futurepress/epub.js.git synced 2025-10-05 15:32:55 +02:00

Merge pull request #169 from bielskij/master

Fixed issue with buggy working getBoundingClientRect() function
This commit is contained in:
Fred Chasen 2014-12-04 19:53:25 -05:00
commit cda26e73c0
12 changed files with 196 additions and 28 deletions

View file

@ -6608,13 +6608,35 @@ EPUBJS.Renderer.prototype.mapPage = function(){
}; };
EPUBJS.Renderer.prototype.indexOfBreakableChar = function (text, startPosition) {
var whiteCharacters = "\x2D\x20\t\r\n\b\f";
// '-' \x2D
// ' ' \x20
if (! startPosition) {
startPosition = 0;
}
for (var i = startPosition; i < text.length; i++) {
if (whiteCharacters.indexOf(text.charAt(i)) != -1) {
return i;
}
}
return -1;
};
EPUBJS.Renderer.prototype.splitTextNodeIntoWordsRanges = function(node){ EPUBJS.Renderer.prototype.splitTextNodeIntoWordsRanges = function(node){
var ranges = []; var ranges = [];
var text = node.textContent.trim(); var text = node.textContent.trim();
var range; var range;
var rect; var rect;
var list; var list;
pos = text.indexOf(" "); // jaroslaw.bielski@7bulls.com
// Usage of indexOf() function for space character as word delimiter
// is not sufficient in case of other breakable characters like \r\n- etc
pos = this.indexOfBreakableChar(text);
if(pos === -1) { if(pos === -1) {
range = this.doc.createRange(); range = this.doc.createRange();
@ -6626,11 +6648,15 @@ EPUBJS.Renderer.prototype.splitTextNodeIntoWordsRanges = function(node){
range.setStart(node, 0); range.setStart(node, 0);
range.setEnd(node, pos); range.setEnd(node, pos);
ranges.push(range); ranges.push(range);
range = false;
// jaroslaw.bielski@7bulls.com
// there was a word miss in case of one letter words
range = this.doc.createRange();
range.setStart(node, pos+1);
while ( pos != -1 ) { while ( pos != -1 ) {
pos = text.indexOf(" ", pos + 1); pos = this.indexOfBreakableChar(text, pos + 1);
if(pos > 0) { if(pos > 0) {
if(range) { if(range) {
@ -6864,7 +6890,20 @@ EPUBJS.Renderer.prototype.gotoCfi = function(cfi){
} else { } else {
range = this.epubcfi.generateRangeFromCfi(cfi, this.doc); range = this.epubcfi.generateRangeFromCfi(cfi, this.doc);
if(range) { if(range) {
pg = this.render.getPageNumberByRect(range.getBoundingClientRect()); // jaroslaw.bielski@7bulls.com
// It seems that sometimes getBoundingClientRect() returns null for first page CFI in chapter.
// It is always reproductible if few consecutive chapters have only one page.
// NOTE: This is only workaround and the issue needs an deeper investigation.
// NOTE: Observed on Android 4.2.1 using WebView widget as HTML renderer (Asus TF300T).
var rect = range.getBoundingClientRect();
if (rect) {
pg = this.render.getPageNumberByRect(rect);
} else {
// Goto first page in chapter
pg = 1;
}
this.page(pg); this.page(pg);
// Reset the current location cfi to requested cfi // Reset the current location cfi to requested cfi
@ -6877,7 +6916,10 @@ EPUBJS.Renderer.prototype.gotoCfi = function(cfi){
EPUBJS.Renderer.prototype.findFirstVisible = function(startEl){ EPUBJS.Renderer.prototype.findFirstVisible = function(startEl){
var el = startEl || this.render.getBaseElement(); var el = startEl || this.render.getBaseElement();
var found; var found;
found = this.walk(el); // kgolunski@7bulls.com
// Looks like an old API usage
// Set x and y as 0 to fullfill walk method API.
found = this.walk(el, 0, 0);
if(found) { if(found) {
return found; return found;

File diff suppressed because one or more lines are too long

2
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

@ -6607,13 +6607,35 @@ EPUBJS.Renderer.prototype.mapPage = function(){
}; };
EPUBJS.Renderer.prototype.indexOfBreakableChar = function (text, startPosition) {
var whiteCharacters = "\x2D\x20\t\r\n\b\f";
// '-' \x2D
// ' ' \x20
if (! startPosition) {
startPosition = 0;
}
for (var i = startPosition; i < text.length; i++) {
if (whiteCharacters.indexOf(text.charAt(i)) != -1) {
return i;
}
}
return -1;
};
EPUBJS.Renderer.prototype.splitTextNodeIntoWordsRanges = function(node){ EPUBJS.Renderer.prototype.splitTextNodeIntoWordsRanges = function(node){
var ranges = []; var ranges = [];
var text = node.textContent.trim(); var text = node.textContent.trim();
var range; var range;
var rect; var rect;
var list; var list;
pos = text.indexOf(" "); // jaroslaw.bielski@7bulls.com
// Usage of indexOf() function for space character as word delimiter
// is not sufficient in case of other breakable characters like \r\n- etc
pos = this.indexOfBreakableChar(text);
if(pos === -1) { if(pos === -1) {
range = this.doc.createRange(); range = this.doc.createRange();
@ -6625,11 +6647,15 @@ EPUBJS.Renderer.prototype.splitTextNodeIntoWordsRanges = function(node){
range.setStart(node, 0); range.setStart(node, 0);
range.setEnd(node, pos); range.setEnd(node, pos);
ranges.push(range); ranges.push(range);
range = false;
// jaroslaw.bielski@7bulls.com
// there was a word miss in case of one letter words
range = this.doc.createRange();
range.setStart(node, pos+1);
while ( pos != -1 ) { while ( pos != -1 ) {
pos = text.indexOf(" ", pos + 1); pos = this.indexOfBreakableChar(text, pos + 1);
if(pos > 0) { if(pos > 0) {
if(range) { if(range) {
@ -6863,7 +6889,20 @@ EPUBJS.Renderer.prototype.gotoCfi = function(cfi){
} else { } else {
range = this.epubcfi.generateRangeFromCfi(cfi, this.doc); range = this.epubcfi.generateRangeFromCfi(cfi, this.doc);
if(range) { if(range) {
pg = this.render.getPageNumberByRect(range.getBoundingClientRect()); // jaroslaw.bielski@7bulls.com
// It seems that sometimes getBoundingClientRect() returns null for first page CFI in chapter.
// It is always reproductible if few consecutive chapters have only one page.
// NOTE: This is only workaround and the issue needs an deeper investigation.
// NOTE: Observed on Android 4.2.1 using WebView widget as HTML renderer (Asus TF300T).
var rect = range.getBoundingClientRect();
if (rect) {
pg = this.render.getPageNumberByRect(rect);
} else {
// Goto first page in chapter
pg = 1;
}
this.page(pg); this.page(pg);
// Reset the current location cfi to requested cfi // Reset the current location cfi to requested cfi
@ -6876,7 +6915,10 @@ EPUBJS.Renderer.prototype.gotoCfi = function(cfi){
EPUBJS.Renderer.prototype.findFirstVisible = function(startEl){ EPUBJS.Renderer.prototype.findFirstVisible = function(startEl){
var el = startEl || this.render.getBaseElement(); var el = startEl || this.render.getBaseElement();
var found; var found;
found = this.walk(el); // kgolunski@7bulls.com
// Looks like an old API usage
// Set x and y as 0 to fullfill walk method API.
found = this.walk(el, 0, 0);
if(found) { if(found) {
return found; return found;

File diff suppressed because one or more lines are too long

View file

@ -8,5 +8,5 @@
"hooks/default/transculsions.js" "hooks/default/transculsions.js"
], ],
"names": [], "names": [],
"mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA" "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A"
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

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

@ -6608,13 +6608,35 @@ EPUBJS.Renderer.prototype.mapPage = function(){
}; };
EPUBJS.Renderer.prototype.indexOfBreakableChar = function (text, startPosition) {
var whiteCharacters = "\x2D\x20\t\r\n\b\f";
// '-' \x2D
// ' ' \x20
if (! startPosition) {
startPosition = 0;
}
for (var i = startPosition; i < text.length; i++) {
if (whiteCharacters.indexOf(text.charAt(i)) != -1) {
return i;
}
}
return -1;
};
EPUBJS.Renderer.prototype.splitTextNodeIntoWordsRanges = function(node){ EPUBJS.Renderer.prototype.splitTextNodeIntoWordsRanges = function(node){
var ranges = []; var ranges = [];
var text = node.textContent.trim(); var text = node.textContent.trim();
var range; var range;
var rect; var rect;
var list; var list;
pos = text.indexOf(" "); // jaroslaw.bielski@7bulls.com
// Usage of indexOf() function for space character as word delimiter
// is not sufficient in case of other breakable characters like \r\n- etc
pos = this.indexOfBreakableChar(text);
if(pos === -1) { if(pos === -1) {
range = this.doc.createRange(); range = this.doc.createRange();
@ -6626,11 +6648,15 @@ EPUBJS.Renderer.prototype.splitTextNodeIntoWordsRanges = function(node){
range.setStart(node, 0); range.setStart(node, 0);
range.setEnd(node, pos); range.setEnd(node, pos);
ranges.push(range); ranges.push(range);
range = false;
// jaroslaw.bielski@7bulls.com
// there was a word miss in case of one letter words
range = this.doc.createRange();
range.setStart(node, pos+1);
while ( pos != -1 ) { while ( pos != -1 ) {
pos = text.indexOf(" ", pos + 1); pos = this.indexOfBreakableChar(text, pos + 1);
if(pos > 0) { if(pos > 0) {
if(range) { if(range) {
@ -6864,7 +6890,20 @@ EPUBJS.Renderer.prototype.gotoCfi = function(cfi){
} else { } else {
range = this.epubcfi.generateRangeFromCfi(cfi, this.doc); range = this.epubcfi.generateRangeFromCfi(cfi, this.doc);
if(range) { if(range) {
pg = this.render.getPageNumberByRect(range.getBoundingClientRect()); // jaroslaw.bielski@7bulls.com
// It seems that sometimes getBoundingClientRect() returns null for first page CFI in chapter.
// It is always reproductible if few consecutive chapters have only one page.
// NOTE: This is only workaround and the issue needs an deeper investigation.
// NOTE: Observed on Android 4.2.1 using WebView widget as HTML renderer (Asus TF300T).
var rect = range.getBoundingClientRect();
if (rect) {
pg = this.render.getPageNumberByRect(rect);
} else {
// Goto first page in chapter
pg = 1;
}
this.page(pg); this.page(pg);
// Reset the current location cfi to requested cfi // Reset the current location cfi to requested cfi
@ -6877,7 +6916,10 @@ EPUBJS.Renderer.prototype.gotoCfi = function(cfi){
EPUBJS.Renderer.prototype.findFirstVisible = function(startEl){ EPUBJS.Renderer.prototype.findFirstVisible = function(startEl){
var el = startEl || this.render.getBaseElement(); var el = startEl || this.render.getBaseElement();
var found; var found;
found = this.walk(el); // kgolunski@7bulls.com
// Looks like an old API usage
// Set x and y as 0 to fullfill walk method API.
found = this.walk(el, 0, 0);
if(found) { if(found) {
return found; return found;

File diff suppressed because one or more lines are too long

View file

@ -687,13 +687,35 @@ EPUBJS.Renderer.prototype.mapPage = function(){
}; };
EPUBJS.Renderer.prototype.indexOfBreakableChar = function (text, startPosition) {
var whiteCharacters = "\x2D\x20\t\r\n\b\f";
// '-' \x2D
// ' ' \x20
if (! startPosition) {
startPosition = 0;
}
for (var i = startPosition; i < text.length; i++) {
if (whiteCharacters.indexOf(text.charAt(i)) != -1) {
return i;
}
}
return -1;
};
EPUBJS.Renderer.prototype.splitTextNodeIntoWordsRanges = function(node){ EPUBJS.Renderer.prototype.splitTextNodeIntoWordsRanges = function(node){
var ranges = []; var ranges = [];
var text = node.textContent.trim(); var text = node.textContent.trim();
var range; var range;
var rect; var rect;
var list; var list;
pos = text.indexOf(" "); // jaroslaw.bielski@7bulls.com
// Usage of indexOf() function for space character as word delimiter
// is not sufficient in case of other breakable characters like \r\n- etc
pos = this.indexOfBreakableChar(text);
if(pos === -1) { if(pos === -1) {
range = this.doc.createRange(); range = this.doc.createRange();
@ -705,11 +727,15 @@ EPUBJS.Renderer.prototype.splitTextNodeIntoWordsRanges = function(node){
range.setStart(node, 0); range.setStart(node, 0);
range.setEnd(node, pos); range.setEnd(node, pos);
ranges.push(range); ranges.push(range);
range = false;
// jaroslaw.bielski@7bulls.com
// there was a word miss in case of one letter words
range = this.doc.createRange();
range.setStart(node, pos+1);
while ( pos != -1 ) { while ( pos != -1 ) {
pos = text.indexOf(" ", pos + 1); pos = this.indexOfBreakableChar(text, pos + 1);
if(pos > 0) { if(pos > 0) {
if(range) { if(range) {
@ -943,7 +969,20 @@ EPUBJS.Renderer.prototype.gotoCfi = function(cfi){
} else { } else {
range = this.epubcfi.generateRangeFromCfi(cfi, this.doc); range = this.epubcfi.generateRangeFromCfi(cfi, this.doc);
if(range) { if(range) {
pg = this.render.getPageNumberByRect(range.getBoundingClientRect()); // jaroslaw.bielski@7bulls.com
// It seems that sometimes getBoundingClientRect() returns null for first page CFI in chapter.
// It is always reproductible if few consecutive chapters have only one page.
// NOTE: This is only workaround and the issue needs an deeper investigation.
// NOTE: Observed on Android 4.2.1 using WebView widget as HTML renderer (Asus TF300T).
var rect = range.getBoundingClientRect();
if (rect) {
pg = this.render.getPageNumberByRect(rect);
} else {
// Goto first page in chapter
pg = 1;
}
this.page(pg); this.page(pg);
// Reset the current location cfi to requested cfi // Reset the current location cfi to requested cfi
@ -956,7 +995,10 @@ EPUBJS.Renderer.prototype.gotoCfi = function(cfi){
EPUBJS.Renderer.prototype.findFirstVisible = function(startEl){ EPUBJS.Renderer.prototype.findFirstVisible = function(startEl){
var el = startEl || this.render.getBaseElement(); var el = startEl || this.render.getBaseElement();
var found; var found;
found = this.walk(el); // kgolunski@7bulls.com
// Looks like an old API usage
// Set x and y as 0 to fullfill walk method API.
found = this.walk(el, 0, 0);
if(found) { if(found) {
return found; return found;