diff options
| -rw-r--r-- | ext/bg/js/backend.js | 4 | ||||
| -rw-r--r-- | ext/bg/js/mecab.js | 14 | ||||
| -rw-r--r-- | ext/bg/js/settings.js | 15 | ||||
| -rw-r--r-- | ext/bg/settings.html | 58 | 
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> |