Query parser fix (#695)
* Standardize setContent calls * Rename _queryText to _fullQuery * Move query parser into Display and update float.html * Generalize params * Add "full" parameter to maintain the original full query
This commit is contained in:
parent
0512258c8e
commit
313476aa92
@ -19,7 +19,6 @@
|
||||
* ClipboardMonitor
|
||||
* DOM
|
||||
* Display
|
||||
* QueryParser
|
||||
* api
|
||||
* wanakana
|
||||
*/
|
||||
@ -33,16 +32,11 @@ class DisplaySearch extends Display {
|
||||
this._intro = document.querySelector('#intro');
|
||||
this._clipboardMonitorEnable = document.querySelector('#clipboard-monitor-enable');
|
||||
this._wanakanaEnable = document.querySelector('#wanakana-enable');
|
||||
this._queryText = '';
|
||||
this._introVisible = true;
|
||||
this._introAnimationTimer = null;
|
||||
this._clipboardMonitor = new ClipboardMonitor({
|
||||
getClipboard: api.clipboardGet.bind(api)
|
||||
});
|
||||
this._queryParser = new QueryParser({
|
||||
getOptionsContext: this.getOptionsContext.bind(this),
|
||||
setSpinnerVisible: this.setSpinnerVisible.bind(this)
|
||||
});
|
||||
this._onKeyDownIgnoreKeys = new Map([
|
||||
['ANY_MOD', new Set([
|
||||
'Tab', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'PageDown', 'PageUp', 'Home', 'End',
|
||||
@ -66,9 +60,7 @@ class DisplaySearch extends Display {
|
||||
await super.prepare();
|
||||
await this.updateOptions();
|
||||
yomichan.on('optionsUpdated', () => this.updateOptions());
|
||||
await this._queryParser.prepare();
|
||||
|
||||
this._queryParser.on('searched', this._onQueryParserSearch.bind(this));
|
||||
this.on('contentUpdating', this._onContentUpdating.bind(this));
|
||||
|
||||
this.setHistorySettings({useBrowserHistory: true});
|
||||
@ -152,8 +144,6 @@ class DisplaySearch extends Display {
|
||||
|
||||
async updateOptions() {
|
||||
await super.updateOptions();
|
||||
const options = this.getOptions();
|
||||
this._queryParser.setOptions(options);
|
||||
if (!this._isPrepared) { return; }
|
||||
const query = this._query.value;
|
||||
if (query) {
|
||||
@ -164,7 +154,7 @@ class DisplaySearch extends Display {
|
||||
|
||||
// Private
|
||||
|
||||
_onContentUpdating({type, source, content}) {
|
||||
_onContentUpdating({type, source, content, urlSearchParams}) {
|
||||
let animate = false;
|
||||
let valid = false;
|
||||
switch (type) {
|
||||
@ -180,33 +170,19 @@ class DisplaySearch extends Display {
|
||||
source = '';
|
||||
break;
|
||||
}
|
||||
|
||||
if (typeof source !== 'string') { source = ''; }
|
||||
|
||||
let full = urlSearchParams.get('full');
|
||||
if (full === null) { full = source; }
|
||||
|
||||
this._closePopups();
|
||||
this._setQuery(source);
|
||||
this._setQuery(full);
|
||||
this._setIntroVisible(!valid, animate);
|
||||
this._setTitleText(source);
|
||||
this._updateSearchButton();
|
||||
}
|
||||
|
||||
_onQueryParserSearch({type, definitions, sentence, cause, textSource}) {
|
||||
this.setContent({
|
||||
focus: false,
|
||||
history: cause !== 'mouse',
|
||||
params: {
|
||||
type,
|
||||
query: textSource.text(),
|
||||
wildcards: 'off'
|
||||
},
|
||||
state: {
|
||||
sentence,
|
||||
url: window.location.href
|
||||
},
|
||||
content: {
|
||||
definitions
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
_onSearchInput() {
|
||||
this._updateSearchButton();
|
||||
|
||||
@ -243,7 +219,7 @@ class DisplaySearch extends Display {
|
||||
}
|
||||
|
||||
_onSearchQueryUpdated(query, animate) {
|
||||
this.setContent({
|
||||
const details = {
|
||||
focus: false,
|
||||
history: false,
|
||||
params: {
|
||||
@ -258,7 +234,8 @@ class DisplaySearch extends Display {
|
||||
definitions: null,
|
||||
animate
|
||||
}
|
||||
});
|
||||
};
|
||||
this.setContent(details);
|
||||
}
|
||||
|
||||
_onWanakanaEnableChange(e) {
|
||||
@ -321,10 +298,8 @@ class DisplaySearch extends Display {
|
||||
// NOP
|
||||
}
|
||||
}
|
||||
if (this._queryText === interpretedQuery) { return; }
|
||||
this._queryText = interpretedQuery;
|
||||
this._query.value = interpretedQuery;
|
||||
this._queryParser.setText(interpretedQuery);
|
||||
this.setQueryParserText(interpretedQuery);
|
||||
}
|
||||
|
||||
_setIntroVisible(visible, animate) {
|
||||
|
@ -21,6 +21,11 @@
|
||||
<button class="action-button action-next" data-icon="source-term" title="Next term (Alt + F)"></button>
|
||||
</div></div><div class="navigation-header-spacer"></div>
|
||||
|
||||
<div class="scan-disable" hidden>
|
||||
<div id="query-parser-select-container" class="input-group"></div>
|
||||
<div id="query-parser-content"></div>
|
||||
</div>
|
||||
|
||||
<div id="definitions"></div>
|
||||
|
||||
<div id="no-results" hidden>
|
||||
@ -57,8 +62,11 @@
|
||||
<script src="/mixed/js/frame-endpoint.js"></script>
|
||||
<script src="/mixed/js/media-loader.js"></script>
|
||||
<script src="/mixed/js/scroll.js"></script>
|
||||
<script src="/mixed/js/text-scanner.js"></script>
|
||||
<script src="/mixed/js/template-handler.js"></script>
|
||||
|
||||
<script src="/bg/js/query-parser-generator.js"></script>
|
||||
<script src="/bg/js/query-parser.js"></script>
|
||||
<script src="/fg/js/float.js"></script>
|
||||
|
||||
<script src="/fg/js/float-main.js"></script>
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user