Extract textSource text inside TextScanner (#500)

* extract text inside TextScanner

* clone textSource before text extraction
This commit is contained in:
siikamiika 2020-05-05 00:13:43 +03:00 committed by GitHub
parent 77b744e675
commit 7d7ff165ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 21 deletions

View File

@ -51,8 +51,7 @@ class QueryParser extends TextScanner {
async onSearchSource(textSource, cause) {
if (textSource === null) { return null; }
this.setTextSourceScanLength(textSource, this.options.scanning.length);
const searchText = textSource.text();
const searchText = this.getTextSourceContent(textSource, this.options.scanning.length);
if (searchText.length === 0) { return; }
const {definitions, length} = await apiTermsFind(searchText, {}, this.getOptionsContext());

View File

@ -239,9 +239,7 @@ class Frontend {
}
async findTerms(textSource, optionsContext) {
this._textScanner.setTextSourceScanLength(textSource, this._options.scanning.length);
const searchText = textSource.text();
const searchText = this._textScanner.getTextSourceContent(textSource, this._options.scanning.length);
if (searchText.length === 0) { return null; }
const {definitions, length} = await apiTermsFind(searchText, {}, optionsContext);
@ -253,9 +251,7 @@ class Frontend {
}
async findKanji(textSource, optionsContext) {
this._textScanner.setTextSourceScanLength(textSource, 1);
const searchText = textSource.text();
const searchText = this._textScanner.getTextSourceContent(textSource, 1);
if (searchText.length === 0) { return null; }
const definitions = await apiKanjiFind(searchText, optionsContext);

View File

@ -318,23 +318,26 @@ class TextScanner extends EventDispatcher {
}
}
setTextSourceScanLength(textSource, length) {
textSource.setEndOffset(length);
if (this.ignoreNodes === null || !textSource.range) {
return;
}
getTextSourceContent(textSource, length) {
const clonedTextSource = textSource.clone();
length = textSource.text().length;
while (textSource.range && length > 0) {
const nodes = TextSourceRange.getNodesInRange(textSource.range);
clonedTextSource.setEndOffset(length);
if (this.ignoreNodes !== null && clonedTextSource.range) {
length = clonedTextSource.text().length;
while (clonedTextSource.range && length > 0) {
const nodes = TextSourceRange.getNodesInRange(clonedTextSource.range);
if (!TextSourceRange.anyNodeMatchesSelector(nodes, this.ignoreNodes)) {
break;
}
--length;
textSource.setEndOffset(length);
clonedTextSource.setEndOffset(length);
}
}
return clonedTextSource.text();
}
clearSelection(passive) {
if (!this._canClearSelection) { return; }
if (this.textSourceCurrent !== null) {