summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/bg/js/search-query-parser.js44
-rw-r--r--ext/bg/js/search.js24
-rw-r--r--ext/bg/search.html3
-rw-r--r--ext/mixed/css/display.css9
-rw-r--r--ext/mixed/js/display.js2
5 files changed, 74 insertions, 8 deletions
diff --git a/ext/bg/js/search-query-parser.js b/ext/bg/js/search-query-parser.js
new file mode 100644
index 00000000..debe53b4
--- /dev/null
+++ b/ext/bg/js/search-query-parser.js
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2019 Alex Yatskov <alex@foosoft.net>
+ * Author: Alex Yatskov <alex@foosoft.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+class QueryParser {
+ constructor(search) {
+ this.search = search;
+
+ this.queryParser = document.querySelector('#query-parser');
+
+ // TODO also enable for mouseover scanning
+ this.queryParser.addEventListener('click', (e) => this.onTermLookup(e));
+ }
+
+ onError(error) {
+ logError(error, false);
+ }
+
+ async onTermLookup(e) {
+ const {textSource} = await this.search.onTermLookup(e, {isQueryParser: true});
+ if (textSource) {
+ textSource.select();
+ }
+ }
+
+ setText(text) {
+ this.queryParser.innerText = text;
+ }
+}
diff --git a/ext/bg/js/search.js b/ext/bg/js/search.js
index 56316217..20d0c58c 100644
--- a/ext/bg/js/search.js
+++ b/ext/bg/js/search.js
@@ -32,6 +32,8 @@ class DisplaySearch extends Display {
url: window.location.href
};
+ this.queryParser = new QueryParser(this);
+
this.search = document.querySelector('#search');
this.query = document.querySelector('#query');
this.intro = document.querySelector('#intro');
@@ -72,11 +74,11 @@ class DisplaySearch extends Display {
const query = DisplaySearch.getSearchQueryFromLocation(window.location.href) || '';
if (e.target.checked) {
window.wanakana.bind(this.query);
- this.query.value = window.wanakana.toKana(query);
+ this.setQuery(window.wanakana.toKana(query));
apiOptionsSet({general: {enableWanakana: true}}, this.getOptionsContext());
} else {
window.wanakana.unbind(this.query);
- this.query.value = query;
+ this.setQuery(query);
apiOptionsSet({general: {enableWanakana: false}}, this.getOptionsContext());
}
this.onSearchQueryUpdated(this.query.value, false);
@@ -86,9 +88,9 @@ class DisplaySearch extends Display {
const query = DisplaySearch.getSearchQueryFromLocation(window.location.href);
if (query !== null) {
if (this.isWanakanaEnabled()) {
- this.query.value = window.wanakana.toKana(query);
+ this.setQuery(window.wanakana.toKana(query));
} else {
- this.query.value = query;
+ this.setQuery(query);
}
this.onSearchQueryUpdated(this.query.value, false);
}
@@ -159,6 +161,7 @@ class DisplaySearch extends Display {
e.preventDefault();
const query = this.query.value;
+ this.queryParser.setText(query);
const queryString = query.length > 0 ? `?query=${encodeURIComponent(query)}` : '';
window.history.pushState(null, '', `${window.location.pathname}${queryString}`);
this.onSearchQueryUpdated(query, true);
@@ -168,9 +171,9 @@ class DisplaySearch extends Display {
const query = DisplaySearch.getSearchQueryFromLocation(window.location.href) || '';
if (this.query !== null) {
if (this.isWanakanaEnabled()) {
- this.query.value = window.wanakana.toKana(query);
+ this.setQuery(window.wanakana.toKana(query));
} else {
- this.query.value = query;
+ this.setQuery(query);
}
}
@@ -258,9 +261,9 @@ class DisplaySearch extends Display {
}
if (curText && (curText !== this.clipboardPrevText) && jpIsJapaneseText(curText)) {
if (this.isWanakanaEnabled()) {
- this.query.value = window.wanakana.toKana(curText);
+ this.setQuery(window.wanakana.toKana(curText));
} else {
- this.query.value = curText;
+ this.setQuery(curText);
}
const queryString = curText.length > 0 ? `?query=${encodeURIComponent(curText)}` : '';
@@ -287,6 +290,11 @@ class DisplaySearch extends Display {
return this.optionsContext;
}
+ setQuery(query) {
+ this.query.value = query;
+ this.queryParser.setText(query);
+ }
+
setIntroVisible(visible, animate) {
if (this.introVisible === visible) {
return;
diff --git a/ext/bg/search.html b/ext/bg/search.html
index 54c5fb6c..48e7dbf5 100644
--- a/ext/bg/search.html
+++ b/ext/bg/search.html
@@ -47,6 +47,8 @@
<img src="/mixed/img/spinner.gif">
</div>
+ <div id="query-parser" class="scan-disable"></div>
+
<div id="content"></div>
</div>
@@ -67,6 +69,7 @@
<script src="/mixed/js/japanese.js"></script>
<script src="/mixed/js/scroll.js"></script>
+ <script src="/bg/js/search-query-parser.js"></script>
<script src="/bg/js/search.js"></script>
<script src="/bg/js/search-frontend.js"></script>
</body>
diff --git a/ext/mixed/css/display.css b/ext/mixed/css/display.css
index 7ee6f5ac..5e5213ff 100644
--- a/ext/mixed/css/display.css
+++ b/ext/mixed/css/display.css
@@ -88,6 +88,15 @@ ol, ul {
user-select: none;
}
+#query-parser {
+ margin-top: 10px;
+ font-size: 24px;
+}
+
+.highlight {
+ background-color: lightblue;
+}
+
/*
* Entries
diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js
index 8ad3ee1b..07a851f5 100644
--- a/ext/mixed/js/display.js
+++ b/ext/mixed/js/display.js
@@ -140,6 +140,8 @@ class Display {
}
this.setContentTerms(definitions, context);
+
+ return {textSource};
} catch (error) {
this.onError(error);
}