summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/bg/js/backend.js4
-rw-r--r--ext/bg/js/mecab.js14
-rw-r--r--ext/bg/js/settings.js15
-rw-r--r--ext/bg/settings.html58
4 files changed, 61 insertions, 30 deletions
diff --git a/ext/bg/js/backend.js b/ext/bg/js/backend.js
index e97f32b5..027cc250 100644
--- a/ext/bg/js/backend.js
+++ b/ext/bg/js/backend.js
@@ -98,6 +98,10 @@ class Backend {
}
this.anki = options.anki.enable ? new AnkiConnect(options.anki.server) : new AnkiNull();
+
+ if (options.parsing.enableMecabParser) {
+ this.mecab.startListener();
+ }
}
async getFullOptions() {
diff --git a/ext/bg/js/mecab.js b/ext/bg/js/mecab.js
index fba9b2eb..4c62c2b0 100644
--- a/ext/bg/js/mecab.js
+++ b/ext/bg/js/mecab.js
@@ -19,16 +19,20 @@
class Mecab {
constructor() {
+ this.port = null;
this.listeners = {};
this.sequence = 0;
- this.startListener();
}
async parseText(text) {
+ if (this.port === null) {
+ return {};
+ }
return await this.invoke('parse_text', {text});
}
startListener() {
+ if (this.port !== null) { return; }
this.port = chrome.runtime.connectNative('yomichan_mecab');
this.port.onMessage.addListener((message) => {
const {sequence, data} = message;
@@ -41,6 +45,14 @@ class Mecab {
});
}
+ stopListener() {
+ if (this.port === null) { return; }
+ this.port.disconnect();
+ this.port = null;
+ this.listeners = {};
+ this.sequence = 0;
+ }
+
invoke(action, params) {
return new Promise((resolve, reject) => {
const sequence = this.sequence++;
diff --git a/ext/bg/js/settings.js b/ext/bg/js/settings.js
index f4fe032a..0013291a 100644
--- a/ext/bg/js/settings.js
+++ b/ext/bg/js/settings.js
@@ -154,6 +154,7 @@ async function formWrite(options) {
function formSetupEventListeners() {
$('input, select, textarea').not('.anki-model').not('.ignore-form-changes *').change(utilAsync(onFormOptionsChanged));
+ $('#parsing-mecab-enable').change(onParseMecabChanged);
$('.anki-model').change(utilAsync(onAnkiModelChanged));
}
@@ -441,6 +442,20 @@ function onMessage({action, params}, sender, callback) {
/*
+ * Text parsing
+ */
+
+function onParseMecabChanged(e) {
+ const mecab = utilBackend().mecab;
+ if (e.target.checked) {
+ mecab.startListener();
+ } else {
+ mecab.stopListener();
+ }
+}
+
+
+/*
* Anki
*/
diff --git a/ext/bg/settings.html b/ext/bg/settings.html
index 8505567b..08b9b6c1 100644
--- a/ext/bg/settings.html
+++ b/ext/bg/settings.html
@@ -410,6 +410,35 @@
</div>
</div>
+ <div id="text-parsing">
+ <h3>Text Parsing Options</h3>
+
+ <p class="help-block">
+ Yomichan can attempt to parse entire sentences or longer text blocks on the search page,
+ adding furigana above words and a small space between words.
+ </p>
+
+ <p class="help-block">
+ Two types of parsers are supported. The first one, enabled by default, works using the built-in
+ scanning functionality by automatically advancing in the sentence after a matching word.
+ </p>
+
+ <p class="help-block">
+ The second type is an external program called <a href="https://en.wikipedia.org/wiki/MeCab" target="_blank" rel="noopener">MeCab</a>
+ that uses its own dictionaries and a special parsing algorithm. To get it working, you must first
+ install it and <a href="https://github.com/siikamiika/yomichan-mecab-installer" target="_blank" rel="noopener">a native messaging component</a>
+ that acts as a bridge between the program and Yomichan.
+ </p>
+
+ <div class="checkbox">
+ <label><input type="checkbox" id="parsing-scan-enable"> Enable text parsing using installed dictionaries</label>
+ </div>
+
+ <div class="checkbox">
+ <label><input type="checkbox" id="parsing-mecab-enable"> Enable text parsing using MeCab</label>
+ </div>
+ </div>
+
<div class="ignore-form-changes">
<div>
<img src="/mixed/img/spinner.gif" class="pull-right" id="dict-spinner" alt>
@@ -587,35 +616,6 @@
</div></div>
</div>
- <div id="text-parsing">
- <h3>Text Parsing Options</h3>
-
- <p class="help-block">
- Yomichan can attempt to parse entire sentences or longer text blocks on the search page,
- adding furigana above words and a small space between words.
- </p>
-
- <p class="help-block">
- Two types of parsers are supported. The first one, enabled by default, works using the built-in
- scanning functionality by automatically advancing in the sentence after a matching word.
- </p>
-
- <p class="help-block">
- The second type is an external program called <a href="https://en.wikipedia.org/wiki/MeCab" target="_blank" rel="noopener">MeCab</a>
- that uses its own dictionaries and a special parsing algorithm. To get it working, you must first
- install it and <a href="https://github.com/siikamiika/yomichan-mecab-installer" target="_blank" rel="noopener">a native messaging component</a>
- that acts as a bridge between the program and Yomichan.
- </p>
-
- <div class="checkbox">
- <label><input type="checkbox" id="parsing-scan-enable"> Enable text parsing using installed dictionaries</label>
- </div>
-
- <div class="checkbox">
- <label><input type="checkbox" id="parsing-mecab-enable"> Enable text parsing using MeCab</label>
- </div>
- </div>
-
<div>
<div>
<img src="/mixed/img/spinner.gif" class="pull-right" id="anki-spinner" alt>