Make the imposter element tracked using TextSourceRange

This commit is contained in:
toasted-nutbread 2019-08-31 14:57:24 -04:00
parent e47e041217
commit ad0dca7bb1
4 changed files with 41 additions and 24 deletions

View File

@ -70,12 +70,6 @@ function docImposterCreate(element) {
return imposter;
}
function docImposterDestroy() {
for (const element of document.getElementsByClassName('yomichan-imposter')) {
element.parentNode.removeChild(element);
}
}
function docRangeFromPoint(point) {
const element = document.elementFromPoint(point.x, point.y);
let imposter = null;
@ -92,12 +86,18 @@ function docRangeFromPoint(point) {
}
const range = document.caretRangeFromPoint(point.x, point.y);
if (range !== null && isPointInRange(point, range)) {
if (imposter !== null) {
imposter.style.zIndex = -2147483646;
imposter.style.pointerEvents = 'none';
}
return range !== null && isPointInRange(point, range) ? new TextSourceRange(range) : null;
return new TextSourceRange(range, '', imposter);
} else {
if (imposter !== null) {
imposter.parentNode.removeChild(imposter);
}
return null;
}
}
function docSentenceExtract(source, extent) {

View File

@ -307,10 +307,11 @@ class Frontend {
this.onError(e);
}
} finally {
if (textSource !== null) {
textSource.cleanup();
}
if (hideResults && this.options.scanning.autoHideResults) {
this.searchClear();
} else {
docImposterDestroy();
}
this.pendingLookup = false;
@ -371,7 +372,6 @@ class Frontend {
}
searchClear() {
docImposterDestroy();
this.popup.hide();
this.popup.clearAutoPlayTimer();

View File

@ -25,13 +25,20 @@ const IGNORE_TEXT_PATTERN = /\u200c/;
*/
class TextSourceRange {
constructor(range, content='') {
constructor(range, content, imposter) {
this.range = range;
this.content = content;
this.imposter = imposter;
}
clone() {
return new TextSourceRange(this.range.cloneRange(), this.content);
return new TextSourceRange(this.range.cloneRange(), this.content, this.imposter);
}
cleanup() {
if (this.imposter !== null && this.imposter.parentNode !== null) {
this.imposter.parentNode.removeChild(this.imposter);
}
}
text() {
@ -221,6 +228,10 @@ class TextSourceElement {
return new TextSourceElement(this.element, this.content);
}
cleanup() {
// NOP
}
text() {
return this.content;
}

View File

@ -84,16 +84,22 @@ class Display {
if (textSource === null) {
return false;
}
let definitions, length, sentence;
try {
textSource.setEndOffset(this.options.scanning.length);
const {definitions, length} = await apiTermsFind(textSource.text());
({definitions, length} = await apiTermsFind(textSource.text()));
if (definitions.length === 0) {
return false;
}
textSource.setEndOffset(length);
const sentence = docSentenceExtract(textSource, this.options.anki.sentenceExt);
sentence = docSentenceExtract(textSource, this.options.anki.sentenceExt);
} finally {
textSource.cleanup();
}
const context = {
source: {