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){
|
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
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){
|
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
|
@ -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
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){
|
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
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue