diff options
Diffstat (limited to 'ext/js/language/text-scanner.js')
-rw-r--r-- | ext/js/language/text-scanner.js | 93 |
1 files changed, 40 insertions, 53 deletions
diff --git a/ext/js/language/text-scanner.js b/ext/js/language/text-scanner.js index d78c4c74..5b125063 100644 --- a/ext/js/language/text-scanner.js +++ b/ext/js/language/text-scanner.js @@ -395,11 +395,10 @@ export class TextScanner extends EventDispatcher { /** * @param {import('text-source').TextSource} textSource * @param {import('text-scanner').InputInfoDetail} [inputDetail] - * @returns {Promise<?import('text-scanner').SearchedEventDetails>} */ async search(textSource, inputDetail) { const inputInfo = this._createInputInfo(null, 'script', 'script', true, [], [], inputDetail); - return await this._search(textSource, this._searchTerms, this._searchKanji, inputInfo); + await this._search(textSource, this._searchTerms, this._searchKanji, inputInfo); } // Private @@ -422,23 +421,8 @@ export class TextScanner extends EventDispatcher { * @param {boolean} searchTerms * @param {boolean} searchKanji * @param {import('text-scanner').InputInfo} inputInfo - * @returns {Promise<?import('text-scanner').SearchedEventDetails>} */ async _search(textSource, searchTerms, searchKanji, inputInfo) { - /** @type {?import('dictionary').DictionaryEntry[]} */ - let dictionaryEntries = null; - /** @type {?import('display').HistoryStateSentence} */ - let sentence = null; - /** @type {?import('display').PageType} */ - let type = null; - /** @type {?Error} */ - let error = null; - let searched = false; - /** @type {?import('settings').OptionsContext} */ - let optionsContext = null; - /** @type {?import('text-scanner').SearchResultDetail} */ - let detail = null; - try { const inputInfoDetail = inputInfo.detail; const selectionRestoreInfo = ( @@ -448,56 +432,59 @@ export class TextScanner extends EventDispatcher { ); if (this._textSourceCurrent !== null && this._textSourceCurrent.hasSameStart(textSource)) { - return null; + return; } const getSearchContextPromise = this._getSearchContext(); const getSearchContextResult = getSearchContextPromise instanceof Promise ? await getSearchContextPromise : getSearchContextPromise; - const {detail: detail2} = getSearchContextResult; - if (typeof detail2 !== 'undefined') { detail = detail2; } - optionsContext = this._createOptionsContextForInput(getSearchContextResult.optionsContext, inputInfo); - - searched = true; - - let valid = false; + const {detail} = getSearchContextResult; + const optionsContext = this._createOptionsContextForInput(getSearchContextResult.optionsContext, inputInfo); + + /** @type {?import('dictionary').DictionaryEntry[]} */ + let dictionaryEntries = null; + /** @type {?import('display').HistoryStateSentence} */ + let sentence = null; + /** @type {'terms'|'kanji'} */ + let type = 'terms'; const result = await this._findDictionaryEntries(textSource, searchTerms, searchKanji, optionsContext); if (result !== null) { ({dictionaryEntries, sentence, type} = result); - valid = true; } else if (textSource !== null && textSource instanceof TextSourceElement && await this._hasJapanese(textSource.fullContent)) { dictionaryEntries = []; sentence = {text: '', offset: 0}; - type = 'terms'; - valid = true; } - if (valid) { + if (dictionaryEntries !== null && sentence !== null) { this._inputInfoCurrent = inputInfo; this.setCurrentTextSource(textSource); - if (typeof selectionRestoreInfo !== 'undefined') { - this._selectionRestoreInfo = selectionRestoreInfo; - } + this._selectionRestoreInfo = selectionRestoreInfo; + + this.trigger('searchSuccess', { + type, + dictionaryEntries, + sentence, + inputInfo, + textSource, + optionsContext, + detail + }); + } else { + this._triggerSearchEmpty(inputInfo); } - } catch (e) { - error = e instanceof Error ? e : new Error(`A search error occurred: ${e}`); + } catch (error) { + this.trigger('searchError', { + error: error instanceof Error ? error : new Error(`A search error occurred: ${error}`), + textSource, + inputInfo + }); } + } - if (!searched) { return null; } - - /** @type {import('text-scanner').SearchedEventDetails} */ - const results = { - textScanner: this, - type, - dictionaryEntries, - sentence, - inputInfo, - textSource, - optionsContext, - detail, - error - }; - this.trigger('searched', results); - return results; + /** + * @param {import('text-scanner').InputInfo} inputInfo + */ + _triggerSearchEmpty(inputInfo) { + this.trigger('searchEmpty', {inputInfo}); } /** */ @@ -1287,10 +1274,10 @@ export class TextScanner extends EventDispatcher { try { await this._search(textSource, searchTerms, searchKanji, inputInfo); } finally { - if (textSource !== null) { - textSource.cleanup(); - } + textSource.cleanup(); } + } else { + this._triggerSearchEmpty(inputInfo); } } catch (e) { log.error(e); |