aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/bg/js/search.js47
-rw-r--r--ext/fg/float.html8
-rw-r--r--ext/mixed/js/display.js75
3 files changed, 78 insertions, 52 deletions
diff --git a/ext/bg/js/search.js b/ext/bg/js/search.js
index 49a93e47..fc857368 100644
--- a/ext/bg/js/search.js
+++ b/ext/bg/js/search.js
@@ -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) {
diff --git a/ext/fg/float.html b/ext/fg/float.html
index f5a85f8e..9d7fa4b4 100644
--- a/ext/fg/float.html
+++ b/ext/fg/float.html
@@ -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>
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;
+ }
}