diff options
Diffstat (limited to 'ext/mixed')
-rw-r--r-- | ext/mixed/js/display.js | 75 |
1 files changed, 59 insertions, 16 deletions
diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index 017f6b60..f9a9225f 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -23,6 +23,7 @@ * Frontend * MediaLoader * PopupFactory + * QueryParser * WindowScroll * api * docRangeFromPoint @@ -68,6 +69,11 @@ class Display extends EventDispatcher { this._historyChangeIgnore = false; this._historyHasChanged = false; this._navigationHeader = document.querySelector('#navigation-header'); + this._fullQuery = ''; + this._queryParser = new QueryParser({ + getOptionsContext: this.getOptionsContext.bind(this), + setSpinnerVisible: this.setSpinnerVisible.bind(this) + }); this.registerActions([ ['close', () => { this.onEscape(); }], @@ -120,8 +126,10 @@ class Display extends EventDispatcher { async prepare() { this._setInteractive(true); await this._displayGenerator.prepare(); + await this._queryParser.prepare(); this._history.prepare(); this._history.on('stateChanged', this._onStateChanged.bind(this)); + this._queryParser.on('searched', this._onQueryParserSearch.bind(this)); yomichan.on('extensionUnloaded', this._onExtensionUnloaded.bind(this)); api.crossFrame.registerHandlers([ ['popupMessage', {async: 'dynamic', handler: this._onMessage.bind(this)}] @@ -188,6 +196,7 @@ class Display extends EventDispatcher { this._updateDocumentOptions(this._options); this._updateTheme(this._options.general.popupTheme); this.setCustomCss(this._options.general.customPopupCss); + this._queryParser.setOptions(this._options); } addMultipleEventListeners(selector, type, listener, options) { @@ -313,6 +322,12 @@ class Display extends EventDispatcher { return data; } + setQueryParserText(text) { + if (this._fullQuery === text) { return; } + this._fullQuery = text; + this._queryParser.setText(text); + } + // Message handlers _onMessage(data) { @@ -427,14 +442,32 @@ class Display extends EventDispatcher { } } + _onQueryParserSearch({type, definitions, sentence, cause, textSource}) { + const query = textSource.text(); + const details = { + focus: false, + history: cause !== 'mouse', + params: this._createSearchParams(type, query, false), + state: { + sentence, + url: window.location.href + }, + content: { + definitions + } + }; + this.setContent(details); + } + _onExtensionUnloaded() { - this.setContent({ + const details = { focus: false, history: false, params: {type: 'unloaded'}, state: {}, content: {} - }); + }; + this.setContent(details); } _onSourceTermView(e) { @@ -462,14 +495,10 @@ class Display extends EventDispatcher { const query = link.textContent; const definitions = await api.kanjiFind(query, this.getOptionsContext()); - this.setContent({ + const details = { focus: false, history: true, - params: { - type: 'kanji', - query, - wildcards: 'off' - }, + params: this._createSearchParams('kanji', query, false), state: { focusEntry: 0, sentence: state.sentence, @@ -478,7 +507,8 @@ class Display extends EventDispatcher { content: { definitions } - }); + }; + this.setContent(details); } catch (error) { this.onError(error); } @@ -520,14 +550,11 @@ class Display extends EventDispatcher { state.scrollY = this._windowScroll.y; this._historyStateUpdate(state); - this.setContent({ + const query = textSource.text(); + const details = { focus: false, history: true, - params: { - type: 'terms', - query: textSource.text(), - wildcards: 'off' - }, + params: this._createSearchParams('terms', query, false), state: { focusEntry: 0, sentence, @@ -536,7 +563,8 @@ class Display extends EventDispatcher { content: { definitions } - }); + }; + this.setContent(details); } catch (error) { this.onError(error); } @@ -1136,4 +1164,19 @@ class Display extends EventDispatcher { this._historyChangeIgnore = historyChangeIgnorePre; } } + + _createSearchParams(type, query, wildcards) { + const params = {}; + if (query.length < this._fullQuery.length) { + params.full = this._fullQuery; + } + params.query = query; + if (typeof type === 'string') { + params.type = type; + } + if (!wildcards) { + params.wildcards = 'off'; + } + return params; + } } |