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:
commit
cda26e73c0
12 changed files with 196 additions and 28 deletions
|
@ -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){
|
||||
var ranges = [];
|
||||
var text = node.textContent.trim();
|
||||
var range;
|
||||
var rect;
|
||||
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) {
|
||||
range = this.doc.createRange();
|
||||
|
@ -6626,11 +6648,15 @@ EPUBJS.Renderer.prototype.splitTextNodeIntoWordsRanges = function(node){
|
|||
range.setStart(node, 0);
|
||||
range.setEnd(node, pos);
|
||||
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 ) {
|
||||
|
||||
pos = text.indexOf(" ", pos + 1);
|
||||
pos = this.indexOfBreakableChar(text, pos + 1);
|
||||
if(pos > 0) {
|
||||
|
||||
if(range) {
|
||||
|
@ -6864,7 +6890,20 @@ EPUBJS.Renderer.prototype.gotoCfi = function(cfi){
|
|||
} else {
|
||||
range = this.epubcfi.generateRangeFromCfi(cfi, this.doc);
|
||||
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);
|
||||
|
||||
// Reset the current location cfi to requested cfi
|
||||
|
@ -6877,7 +6916,10 @@ EPUBJS.Renderer.prototype.gotoCfi = function(cfi){
|
|||
EPUBJS.Renderer.prototype.findFirstVisible = function(startEl){
|
||||
var el = startEl || this.render.getBaseElement();
|
||||
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) {
|
||||
return found;
|
||||
|
|
File diff suppressed because one or more lines are too long
2
build/epub.min.js
vendored
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
|
@ -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){
|
||||
var ranges = [];
|
||||
var text = node.textContent.trim();
|
||||
var range;
|
||||
var rect;
|
||||
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) {
|
||||
range = this.doc.createRange();
|
||||
|
@ -6625,11 +6647,15 @@ EPUBJS.Renderer.prototype.splitTextNodeIntoWordsRanges = function(node){
|
|||
range.setStart(node, 0);
|
||||
range.setEnd(node, pos);
|
||||
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 ) {
|
||||
|
||||
pos = text.indexOf(" ", pos + 1);
|
||||
pos = this.indexOfBreakableChar(text, pos + 1);
|
||||
if(pos > 0) {
|
||||
|
||||
if(range) {
|
||||
|
@ -6863,7 +6889,20 @@ EPUBJS.Renderer.prototype.gotoCfi = function(cfi){
|
|||
} else {
|
||||
range = this.epubcfi.generateRangeFromCfi(cfi, this.doc);
|
||||
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);
|
||||
|
||||
// Reset the current location cfi to requested cfi
|
||||
|
@ -6876,7 +6915,10 @@ EPUBJS.Renderer.prototype.gotoCfi = function(cfi){
|
|||
EPUBJS.Renderer.prototype.findFirstVisible = function(startEl){
|
||||
var el = startEl || this.render.getBaseElement();
|
||||
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) {
|
||||
return found;
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -8,5 +8,5 @@
|
|||
"hooks/default/transculsions.js"
|
||||
],
|
||||
"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
52
reader/js/epub.min.js
vendored
|
@ -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){
|
||||
var ranges = [];
|
||||
var text = node.textContent.trim();
|
||||
var range;
|
||||
var rect;
|
||||
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) {
|
||||
range = this.doc.createRange();
|
||||
|
@ -6626,11 +6648,15 @@ EPUBJS.Renderer.prototype.splitTextNodeIntoWordsRanges = function(node){
|
|||
range.setStart(node, 0);
|
||||
range.setEnd(node, pos);
|
||||
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 ) {
|
||||
|
||||
pos = text.indexOf(" ", pos + 1);
|
||||
pos = this.indexOfBreakableChar(text, pos + 1);
|
||||
if(pos > 0) {
|
||||
|
||||
if(range) {
|
||||
|
@ -6864,7 +6890,20 @@ EPUBJS.Renderer.prototype.gotoCfi = function(cfi){
|
|||
} else {
|
||||
range = this.epubcfi.generateRangeFromCfi(cfi, this.doc);
|
||||
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);
|
||||
|
||||
// Reset the current location cfi to requested cfi
|
||||
|
@ -6877,7 +6916,10 @@ EPUBJS.Renderer.prototype.gotoCfi = function(cfi){
|
|||
EPUBJS.Renderer.prototype.findFirstVisible = function(startEl){
|
||||
var el = startEl || this.render.getBaseElement();
|
||||
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) {
|
||||
return found;
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -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){
|
||||
var ranges = [];
|
||||
var text = node.textContent.trim();
|
||||
var range;
|
||||
var rect;
|
||||
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) {
|
||||
range = this.doc.createRange();
|
||||
|
@ -705,11 +727,15 @@ EPUBJS.Renderer.prototype.splitTextNodeIntoWordsRanges = function(node){
|
|||
range.setStart(node, 0);
|
||||
range.setEnd(node, pos);
|
||||
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 ) {
|
||||
|
||||
pos = text.indexOf(" ", pos + 1);
|
||||
pos = this.indexOfBreakableChar(text, pos + 1);
|
||||
if(pos > 0) {
|
||||
|
||||
if(range) {
|
||||
|
@ -943,7 +969,20 @@ EPUBJS.Renderer.prototype.gotoCfi = function(cfi){
|
|||
} else {
|
||||
range = this.epubcfi.generateRangeFromCfi(cfi, this.doc);
|
||||
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);
|
||||
|
||||
// Reset the current location cfi to requested cfi
|
||||
|
@ -956,7 +995,10 @@ EPUBJS.Renderer.prototype.gotoCfi = function(cfi){
|
|||
EPUBJS.Renderer.prototype.findFirstVisible = function(startEl){
|
||||
var el = startEl || this.render.getBaseElement();
|
||||
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) {
|
||||
return found;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue