diff options
Diffstat (limited to 'ext/bg')
| -rw-r--r-- | ext/bg/background.html | 1 | ||||
| -rw-r--r-- | ext/bg/guide.html | 13 | ||||
| -rw-r--r-- | ext/bg/js/deinflector.js | 2 | ||||
| -rw-r--r-- | ext/bg/js/display-window.js | 13 | ||||
| -rw-r--r-- | ext/bg/js/popup.js | 11 | ||||
| -rw-r--r-- | ext/bg/js/templates.js | 12 | ||||
| -rw-r--r-- | ext/bg/js/util.js | 9 | ||||
| -rw-r--r-- | ext/bg/js/yomichan.js | 69 | ||||
| -rw-r--r-- | ext/bg/popup.html | 6 | ||||
| -rw-r--r-- | ext/bg/search.html | 3 | 
10 files changed, 97 insertions, 42 deletions
| diff --git a/ext/bg/background.html b/ext/bg/background.html index 8fb41a38..b5ae147b 100644 --- a/ext/bg/background.html +++ b/ext/bg/background.html @@ -7,6 +7,7 @@          <script src="/mixed/lib/handlebars.min.js"></script>          <script src="/mixed/lib/dexie.min.js"></script>          <script src="/mixed/lib/wanakana.min.js"></script> +        <script src="/mixed/js/util.js"></script>          <script src="/bg/js/templates.js"></script>          <script src="/bg/js/util.js"></script>          <script src="/bg/js/anki-connect.js"></script> diff --git a/ext/bg/guide.html b/ext/bg/guide.html index 130d6d68..3b3dcab7 100644 --- a/ext/bg/guide.html +++ b/ext/bg/guide.html @@ -7,7 +7,7 @@          <link rel="stylesheet" type="text/css" href="/mixed/lib/bootstrap-3.3.7-dist/css/bootstrap-theme.min.css">      </head>      <body> -        <div class="container-fluid"> +        <div class="container">              <div class="page-header">                  <h1>Welcome to Yomichan!</h1>              </div> @@ -23,11 +23,12 @@                  </p>                  <ol> -                    <li>Click on the <img src="/mixed/img/icon16.png" alt> icon in the browser toolbar to open the Yomichan options page.</li> -                    <li>Import the dictionaries (bundled or custom) you wish to use for term and Kanji searches.</li> -                    <li>Hold down <kbd>Shift</kbd> (or the middle mouse button) as you hover over text to see term definitions.</li> -                    <li>Click on the <img src="/mixed/img/play-audio.png" alt> icon to hear the term pronounced by a native speaker (if audio is available).</li> -                    <li>Click on Kanji in the definition window to view additional information about that character.</li> +                    <li>Click on the <img src="/mixed/img/icon16.png" alt> icon in the browser toolbar to open the Yomichan actions dialog.</li> +                    <li>Click on the <em>monkey wrench</em> icon in the middle to open the options page.</li> +                    <li>Import the dictionaries you wish to use for term and Kanji searches.</li> +                    <li>Hold down <kbd>Shift</kbd> key or the middle mouse button as you move your mouse over text to display definitions.</li> +                    <li>Click on the <img src="/mixed/img/play-audio.png" alt> icon to hear the term pronounced by a native speaker.</li> +                    <li>Click on individual Kanji in the term definition results to view additional information about those characters.</li>                  </ol>              </div>          </div> diff --git a/ext/bg/js/deinflector.js b/ext/bg/js/deinflector.js index 6e480068..6484f953 100644 --- a/ext/bg/js/deinflector.js +++ b/ext/bg/js/deinflector.js @@ -90,7 +90,7 @@ class Deinflection {                  source: this.term,                  rules: this.rules,                  definitions: this.definitions, -                reasons: [this.reason] +                reasons: this.reason.length > 0 ? [this.reason] : []              }];          } diff --git a/ext/bg/js/display-window.js b/ext/bg/js/display-window.js index ad193c5b..ae97cd36 100644 --- a/ext/bg/js/display-window.js +++ b/ext/bg/js/display-window.js @@ -20,8 +20,13 @@  window.displayWindow = new class extends Display {      constructor() {          super($('#spinner'), $('#content')); -        $('#search').click(this.onSearch.bind(this)); -        window.wanakana.bind($('#query').get(0)); + +        const search = $('#search'); +        search.click(this.onSearch.bind(this)); + +        const query = $('#query'); +        query.on('input', () => search.prop('disabled', query.val().length === 0)); +        window.wanakana.bind(query.get(0));      }      definitionAdd(definition, mode) { @@ -44,6 +49,10 @@ window.displayWindow = new class extends Display {          window.alert(`Error: ${error}`);      } +    clearSearch() { +        $('#query').focus().select(); +    } +      onSearch(e) {          e.preventDefault();          $('#intro').slideUp(); diff --git a/ext/bg/js/popup.js b/ext/bg/js/popup.js index 9f2567df..8577dd96 100644 --- a/ext/bg/js/popup.js +++ b/ext/bg/js/popup.js @@ -18,17 +18,14 @@  $(document).ready(() => { -    $('#open-search').click(() => window.open(chrome.extension.getURL('/bg/search.html'))); -    $('#open-options').click(() => chrome.runtime.openOptionsPage()); -    $('#open-help').click(() => window.open('http://foosoft.net/projects/yomichan')); +    $('#open-search').click(() => commandExec('search')); +    $('#open-options').click(() => commandExec('options')); +    $('#open-help').click(() => commandExec('help'));      optionsLoad().then(options => {          const toggle = $('#enable-search');          toggle.prop('checked', options.general.enable).change();          toggle.bootstrapToggle(); -        toggle.change(() => { -            options.general.enable = toggle.prop('checked'); -            optionsSave(options).then(() => instYomi().optionsSet(options)); -        }); +        toggle.change(() => commandExec('toggle'));      });  }); diff --git a/ext/bg/js/templates.js b/ext/bg/js/templates.js index 91518e84..0346e4c7 100644 --- a/ext/bg/js/templates.js +++ b/ext/bg/js/templates.js @@ -284,7 +284,7 @@ templates['fields.html'] = template({"1":function(container,depth0,helpers,parti  templates['kanji.html'] = template({"1":function(container,depth0,helpers,partials,data) {      var stack1, helper, alias1=depth0 != null ? depth0 : {}; -  return "<div class=\"entry\">\n    <div class=\"actions\">\n" +  return "<div class=\"entry\" data-type=\"kanji\">\n    <div class=\"actions\">\n        <img src=\"/mixed/img/entry-current.png\" class=\"current\" title=\"Current entry (Alt + Up/Down/Home/End/PgUp/PgDn)\" alt>\n"      + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.addable : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.source : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + "    </div>\n\n    <div class=\"glyph\">" @@ -299,9 +299,9 @@ templates['kanji.html'] = template({"1":function(container,depth0,helpers,partia      + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.glossary : depth0)) != null ? stack1["1"] : stack1),{"name":"if","hash":{},"fn":container.program(11, data, 0),"inverse":container.program(15, data, 0),"data":data})) != null ? stack1 : "")      + "    </div>\n</div>\n";  },"2":function(container,depth0,helpers,partials,data) { -    return "        <a href=\"#\" title=\"Add Kanji\" class=\"action-add-note pending disabled\" data-mode=\"kanji\"><img src=\"/mixed/img/add-kanji.png\" alt></a>\n"; +    return "        <a href=\"#\" class=\"action-add-note pending disabled\" data-mode=\"kanji\"><img src=\"/mixed/img/add-kanji.png\" title=\"Add Kanji (Alt + K)\" alt></a>\n";  },"4":function(container,depth0,helpers,partials,data) { -    return "        <a href=\"#\" title=\"Source term\" class=\"source-term\"><img src=\"/mixed/img/source-term.png\" alt></a>\n"; +    return "        <a href=\"#\" class=\"source-term\"><img src=\"/mixed/img/source-term.png\" title=\"Source term (Alt + B)\" alt></a>\n";  },"6":function(container,depth0,helpers,partials,data) {      var stack1; @@ -442,7 +442,7 @@ templates['terms.html'] = template({"1":function(container,depth0,helpers,partia  },"12":function(container,depth0,helpers,partials,data) {      var stack1, alias1=depth0 != null ? depth0 : {}; -  return "<div class=\"entry\">\n    <div class=\"actions\">\n" +  return "<div class=\"entry\" data-type=\"term\">\n    <div class=\"actions\">\n        <img src=\"/mixed/img/entry-current.png\" class=\"current\" title=\"Current entry (Alt + Up/Down/Home/End/PgUp/PgDn)\" alt>\n"      + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.addable : depth0),{"name":"if","hash":{},"fn":container.program(13, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.playback : depth0),{"name":"if","hash":{},"fn":container.program(15, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + "    </div>\n\n" @@ -453,9 +453,9 @@ templates['terms.html'] = template({"1":function(container,depth0,helpers,partia      + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.grouped : depth0),{"name":"if","hash":{},"fn":container.program(26, data, 0),"inverse":container.program(32, data, 0),"data":data})) != null ? stack1 : "")      + "    </div>\n</div>\n";  },"13":function(container,depth0,helpers,partials,data) { -    return "        <a href=\"#\" title=\"Add expression\" class=\"action-add-note pending disabled\" data-mode=\"term-kanji\"><img src=\"/mixed/img/add-term-kanji.png\" alt></a>\n        <a href=\"#\" title=\"Add reading\" class=\"action-add-note pending disabled\" data-mode=\"term-kana\"><img src=\"/mixed/img/add-term-kana.png\" alt></a>\n"; +    return "        <a href=\"#\" class=\"action-add-note pending disabled\" data-mode=\"term-kanji\"><img src=\"/mixed/img/add-term-kanji.png\" title=\"Add expression (Alt + E)\" alt></a>\n        <a href=\"#\" class=\"action-add-note pending disabled\" data-mode=\"term-kana\"><img src=\"/mixed/img/add-term-kana.png\" title=\"Add reading (Alt + R)\" alt></a>\n";  },"15":function(container,depth0,helpers,partials,data) { -    return "        <a href=\"#\" title=\"Play audio\" class=\"action-play-audio\"><img src=\"/mixed/img/play-audio.png\" alt></a>\n"; +    return "        <a href=\"#\" class=\"action-play-audio\"><img src=\"/mixed/img/play-audio.png\" title=\"Play audio (Alt + P)\" alt></a>\n";  },"17":function(container,depth0,helpers,partials,data) {      var stack1, helper, options, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3="function", buffer =     "    <div class=\"expression\"><ruby>"; diff --git a/ext/bg/js/util.js b/ext/bg/js/util.js index 59eb9269..6999cae3 100644 --- a/ext/bg/js/util.js +++ b/ext/bg/js/util.js @@ -34,6 +34,15 @@ function promiseCallback(promise, callback) {  /* + * Commands + */ + +function commandExec(command) { +    instYomi().onCommand(command); +} + + +/*   * Instance   */ diff --git a/ext/bg/js/yomichan.js b/ext/bg/js/yomichan.js index a61be8be..39105c54 100644 --- a/ext/bg/js/yomichan.js +++ b/ext/bg/js/yomichan.js @@ -25,12 +25,13 @@ window.yomichan = new class {          this.anki = new AnkiNull();          this.options = null; -        chrome.runtime.onMessage.addListener(this.onMessage.bind(this)); -        if (chrome.runtime.onInstalled) { -            chrome.runtime.onInstalled.addListener(this.onInstalled.bind(this)); -        } - -        this.translator.prepare().then(optionsLoad).then(this.optionsSet.bind(this)); +        this.translator.prepare().then(optionsLoad).then(this.optionsSet.bind(this)).then(() => { +            chrome.commands.onCommand.addListener(this.onCommand.bind(this)); +            chrome.runtime.onMessage.addListener(this.onMessage.bind(this)); +            if (chrome.runtime.onInstalled) { +                chrome.runtime.onInstalled.addListener(this.onInstalled.bind(this)); +            } +        });      }      optionsSet(options) { @@ -55,7 +56,10 @@ window.yomichan = new class {      }      noteFormat(definition, mode) { -        const note = {fields: {}, tags: this.options.anki.tags}; +        const note = { +            fields: {}, +            tags: this.options.anki.tags +        };          let fields = [];          if (mode === 'kanji') { @@ -116,8 +120,15 @@ window.yomichan = new class {      }      definitionAdd(definition, mode) { -        const note = this.noteFormat(definition, mode); -        return this.anki.addNote(note); +        let promise = Promise.resolve(); +        if (mode !== 'kanji') { +            promise = audioInject(definition, this.options.anki.terms.fields); +        } + +        return promise.then(() => { +            const note = this.noteFormat(definition, mode); +            return this.anki.addNote(note); +        });      }      definitionsAddable(definitions, modes) { @@ -153,34 +164,60 @@ window.yomichan = new class {          }      } +    onCommand(command) { +        const handlers = { +            search: () => { +                chrome.tabs.create({url: chrome.extension.getURL('/bg/search.html')}); +            }, + +            help: () => { +                chrome.tabs.create({url: 'https://foosoft.net/projects/yomichan/'}); +            }, + +            options: () => { +                chrome.runtime.openOptionsPage(); +            }, + +            toggle: () => { +                this.options.general.enable = !this.options.general.enable; +                optionsSave(this.options).then(() => this.optionsSet(this.options)); +            } +        }; + +        const handler = handlers[command]; +        if (handler) { +            handler(); +        } +    } +      onMessage(request, sender, callback) {          const handlers = new class { -            api_optionsGet({callback}) { +            optionsGet({callback}) {                  promiseCallback(optionsLoad(), callback);              } -            api_kanjiFind({text, callback}) { +            kanjiFind({text, callback}) {                  promiseCallback(this.kanjiFind(text), callback);              } -            api_termsFind({text, callback}) { +            termsFind({text, callback}) {                  promiseCallback(this.termsFind(text), callback);              } -            api_templateRender({template, data, callback}) { +            templateRender({template, data, callback}) {                  promiseCallback(this.templateRender(template, data), callback);              } -            api_definitionAdd({definition, mode, callback}) { +            definitionAdd({definition, mode, callback}) {                  promiseCallback(this.definitionAdd(definition, mode), callback);              } -            api_definitionsAddable({definitions, modes, callback}) { +            definitionsAddable({definitions, modes, callback}) {                  promiseCallback(this.definitionsAddable(definitions, modes), callback);              }          }; -        const {action, params} = request, method = handlers[`api_${action}`]; +        const {action, params} = request, method = handlers[action];          if (typeof(method) === 'function') {              params.callback = callback;              method.call(this, params); diff --git a/ext/bg/popup.html b/ext/bg/popup.html index 22fc0d40..e223e241 100644 --- a/ext/bg/popup.html +++ b/ext/bg/popup.html @@ -18,12 +18,12 @@      </head>      <body>          <p> -            <input type="checkbox" id="enable-search"> +            <input type="checkbox" id="enable-search" title="Toggle (Alt + Delete)">          </p>          <p>              <div class="btn-group" style="white-space: nowrap"> -                <button type="button" id="open-search" title="Search" class="btn btn-default btn-xs glyphicon glyphicon-search"></button> -                <button type="button" id="open-options" title="Options" class="btn btn-default btn-xs glyphicon glyphicon-wrench"></button> +                <button type="button" id="open-search" title="Search (Alt + Insert)" class="btn btn-default btn-xs glyphicon glyphicon-search"></button> +                <button type="button" id="open-options" title="Options (Alt + End)" class="btn btn-default btn-xs glyphicon glyphicon-wrench"></button>                  <button type="button" id="open-help" title="Help" class="btn btn-default btn-xs glyphicon glyphicon-question-sign"></button>              </div>          </p> diff --git a/ext/bg/search.html b/ext/bg/search.html index e9c25e15..b8ab21b0 100644 --- a/ext/bg/search.html +++ b/ext/bg/search.html @@ -20,7 +20,7 @@                  <form class="input-group">                      <input type="text" class="form-control" placeholder="Search for..." id="query" autofocus>                      <span class="input-group-btn"> -                        <input type="submit" class="btn btn-default form-control" id="search" value="Search"> +                        <input type="submit" class="btn btn-default form-control" id="search" value="Search" disabled>                      </span>                  </form>              </p> @@ -34,6 +34,7 @@          <script src="/mixed/lib/jquery-3.1.1.min.js"></script>          <script src="/bg/js/util.js"></script> +        <script src="/mixed/js/util.js"></script>          <script src="/mixed/js/display.js"></script>          <script src="/mixed/lib/wanakana.min.js"></script>          <script src="/bg/js/display-window.js"></script> |