aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsiikamiika <siikamiika@users.noreply.github.com>2020-03-14 02:51:39 +0200
committersiikamiika <siikamiika@users.noreply.github.com>2020-03-21 22:13:07 +0200
commit46c6ad98f33ea1536452beb7e41f78f9a1895997 (patch)
tree80580ce3f32ae84ed146cc8cf43edac3bf4d2adc
parent962c2a381f3dace4d97fd0625504ec841e378354 (diff)
use dependency injection in QueryParser
Also fix an issue with settings update triggering a lookup on unprepared QueryParser.
-rw-r--r--ext/bg/js/search-query-parser.js43
-rw-r--r--ext/bg/js/search.js11
2 files changed, 39 insertions, 15 deletions
diff --git a/ext/bg/js/search-query-parser.js b/ext/bg/js/search-query-parser.js
index 6e18073b..4a4fcdde 100644
--- a/ext/bg/js/search-query-parser.js
+++ b/ext/bg/js/search-query-parser.js
@@ -27,9 +27,12 @@
*/
class QueryParser extends TextScanner {
- constructor(search) {
+ constructor({getOptionsContext, setContent, setSpinnerVisible}) {
super(document.querySelector('#query-parser-content'), [], []);
- this.search = search;
+
+ this.getOptionsContext = getOptionsContext;
+ this.setContent = setContent;
+ this.setSpinnerVisible = setSpinnerVisible;
this.parseResults = [];
@@ -55,18 +58,18 @@ class QueryParser extends TextScanner {
async onSearchSource(textSource, cause) {
if (textSource === null) { return null; }
- this.setTextSourceScanLength(textSource, this.search.options.scanning.length);
+ this.setTextSourceScanLength(textSource, this.options.scanning.length);
const searchText = textSource.text();
if (searchText.length === 0) { return; }
- const {definitions, length} = await apiTermsFind(searchText, {}, this.search.getOptionsContext());
+ const {definitions, length} = await apiTermsFind(searchText, {}, this.getOptionsContext());
if (definitions.length === 0) { return null; }
- const sentence = docSentenceExtract(textSource, this.search.options.anki.sentenceExt);
+ const sentence = docSentenceExtract(textSource, this.options.anki.sentenceExt);
textSource.setEndOffset(length);
- this.search.setContent('terms', {definitions, context: {
+ this.setContent('terms', {definitions, context: {
focus: false,
disableHistory: cause === 'mouse',
sentence,
@@ -78,7 +81,7 @@ class QueryParser extends TextScanner {
onParserChange(e) {
const selectedParser = e.target.value;
- apiOptionsSet({parsing: {selectedParser}}, this.search.getOptionsContext());
+ apiOptionsSet({parsing: {selectedParser}}, this.getOptionsContext());
}
getMouseEventListeners() {
@@ -107,11 +110,23 @@ class QueryParser extends TextScanner {
this.queryParser.dataset.termSpacing = `${options.parsing.termSpacing}`;
}
+ getOptionsContext() {
+ throw new Error('Override me');
+ }
+
+ setContent(_type, _details) {
+ throw new Error('Override me');
+ }
+
+ setSpinnerVisible(_visible) {
+ throw new Error('Override me');
+ }
+
refreshSelectedParser() {
if (this.parseResults.length > 0) {
if (!this.getParseResult()) {
const selectedParser = this.parseResults[0].id;
- apiOptionsSet({parsing: {selectedParser}}, this.search.getOptionsContext());
+ apiOptionsSet({parsing: {selectedParser}}, this.getOptionsContext());
}
}
}
@@ -122,7 +137,7 @@ class QueryParser extends TextScanner {
}
async setText(text) {
- this.search.setSpinnerVisible(true);
+ this.setSpinnerVisible(true);
this.setPreview(text);
@@ -132,20 +147,20 @@ class QueryParser extends TextScanner {
this.renderParserSelect();
this.renderParseResult();
- this.search.setSpinnerVisible(false);
+ this.setSpinnerVisible(false);
}
async parseText(text) {
const results = [];
- if (this.search.options.parsing.enableScanningParser) {
+ if (this.options.parsing.enableScanningParser) {
results.push({
name: 'Scanning parser',
id: 'scan',
- parsedText: await apiTextParse(text, this.search.getOptionsContext())
+ parsedText: await apiTextParse(text, this.getOptionsContext())
});
}
- if (this.search.options.parsing.enableMecabParser) {
- const mecabResults = await apiTextParseMecab(text, this.search.getOptionsContext());
+ if (this.options.parsing.enableMecabParser) {
+ const mecabResults = await apiTextParseMecab(text, this.getOptionsContext());
for (const [mecabDictName, mecabDictResults] of mecabResults) {
results.push({
name: `MeCab: ${mecabDictName}`,
diff --git a/ext/bg/js/search.js b/ext/bg/js/search.js
index 8b8ee55e..9250fdde 100644
--- a/ext/bg/js/search.js
+++ b/ext/bg/js/search.js
@@ -29,12 +29,18 @@ class DisplaySearch extends Display {
constructor() {
super(document.querySelector('#spinner'), document.querySelector('#content'));
+ this._isPrepared = false;
+
this.optionsContext = {
depth: 0,
url: window.location.href
};
- this.queryParser = new QueryParser(this);
+ this.queryParser = new QueryParser({
+ getOptionsContext: this.getOptionsContext.bind(this),
+ setContent: this.setContent.bind(this),
+ setSpinnerVisible: this.setSpinnerVisible.bind(this)
+ });
this.search = document.querySelector('#search');
this.query = document.querySelector('#query');
@@ -112,6 +118,8 @@ class DisplaySearch extends Display {
this.clipboardMonitor.on('change', this.onExternalSearchUpdate.bind(this));
this.updateSearchButton();
+
+ this._isPrepared = true;
} catch (e) {
this.onError(e);
}
@@ -278,6 +286,7 @@ class DisplaySearch extends Display {
async updateOptions() {
await super.updateOptions();
this.queryParser.setOptions(this.options);
+ if (!this._isPrepared) { return; }
const query = this.query.value;
if (query) {
this.setQuery(query);