diff options
| -rw-r--r-- | ext/bg/js/templates.js | 98 | ||||
| -rw-r--r-- | ext/bg/js/translator.js | 16 | ||||
| -rw-r--r-- | ext/bg/js/yomichan.js | 67 | ||||
| -rw-r--r-- | ext/fg/js/api.js | 8 | ||||
| -rw-r--r-- | ext/fg/js/client.js | 55 | ||||
| -rw-r--r-- | ext/fg/js/frame.js | 18 | ||||
| -rw-r--r-- | ext/fg/js/popup.js | 6 | ||||
| -rw-r--r-- | util/tmpl/kanji.html | 6 | ||||
| -rw-r--r-- | util/tmpl/term.html | 6 | 
9 files changed, 110 insertions, 170 deletions
| diff --git a/ext/bg/js/templates.js b/ext/bg/js/templates.js index b2fc0651..54033197 100644 --- a/ext/bg/js/templates.js +++ b/ext/bg/js/templates.js @@ -21,49 +21,39 @@ templates['kanji.html'] = template({"1":function(container,depth0,helpers,partia    return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.enableAnkiConnect : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "");  },"2":function(container,depth0,helpers,partials,data,blockParams,depths) { -    var stack1; - -  return "    <div class=\"action-bar\">\n" -    + ((stack1 = helpers["with"].call(depth0 != null ? depth0 : {},(depths[1] != null ? depths[1].addable : depths[1]),{"name":"with","hash":{},"fn":container.program(3, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "    </div>\n"; -},"3":function(container,depth0,helpers,partials,data,blockParams,depths) { -    var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=container.escapeExpression; +    var helper, alias1=container.escapeExpression; -  return "        <a href=\"#\" title=\"Add Kanji\" class=\"action-link " -    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.kanji : depth0),{"name":"unless","hash":{},"fn":container.program(4, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "\" data-mode=\"kanji\" data-index=\"" -    + alias2(((helper = (helper = helpers.index || (data && data.index)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(alias1,{"name":"index","hash":{},"data":data}) : helper))) +  return "    <a href=\"#\" title=\"Add Kanji\" class=\"action-link disabled\" data-mode=\"kanji\" data-index=\"" +    + alias1(((helper = (helper = helpers.index || (data && data.index)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : {},{"name":"index","hash":{},"data":data}) : helper)))      + "\"><img src=\"" -    + alias2(container.lambda((depths[2] != null ? depths[2].root : depths[2]), depth0)) +    + alias1(container.lambda((depths[1] != null ? depths[1].root : depths[1]), depth0))      + "/add_kanji.png\"></a>\n";  },"4":function(container,depth0,helpers,partials,data) { -    return "disabled"; -},"6":function(container,depth0,helpers,partials,data) {      var stack1;    return "            <dt>Meanings</dt>\n            <dd>\n" -    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.glossary : depth0),{"name":"each","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") +    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.glossary : depth0),{"name":"each","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + "            </dd>\n"; -},"7":function(container,depth0,helpers,partials,data) { +},"5":function(container,depth0,helpers,partials,data) {      var stack1;    return "                "      + container.escapeExpression(container.lambda(depth0, depth0)) -    + ((stack1 = helpers.unless.call(depth0 != null ? depth0 : {},(data && data.last),{"name":"unless","hash":{},"fn":container.program(8, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") +    + ((stack1 = helpers.unless.call(depth0 != null ? depth0 : {},(data && data.last),{"name":"unless","hash":{},"fn":container.program(6, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + "\n"; -},"8":function(container,depth0,helpers,partials,data) { +},"6":function(container,depth0,helpers,partials,data) {      return ", "; -},"10":function(container,depth0,helpers,partials,data) { +},"8":function(container,depth0,helpers,partials,data) {      var stack1;    return "            <dt>Kunyomi</dt>\n            <dd>\n" -    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.kunyomi : depth0),{"name":"each","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") +    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.kunyomi : depth0),{"name":"each","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + "            </dd>\n"; -},"12":function(container,depth0,helpers,partials,data) { +},"10":function(container,depth0,helpers,partials,data) {      var stack1;    return "            <dt>Onyomi</dt>\n            <dd>\n" -    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.onyomi : depth0),{"name":"each","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") +    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.onyomi : depth0),{"name":"each","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + "            </dd>\n";  },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data,blockParams,depths) {      var stack1, helper, alias1=depth0 != null ? depth0 : {}; @@ -73,11 +63,11 @@ templates['kanji.html'] = template({"1":function(container,depth0,helpers,partia      + "\n    <div class=\"kanji-glyph\">"      + container.escapeExpression(((helper = (helper = helpers.character || (depth0 != null ? depth0.character : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(alias1,{"name":"character","hash":{},"data":data}) : helper)))      + "</div>\n\n    <div class=\"kanji-info\">\n        <dl>\n" -    + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.glossary : depth0),{"name":"if","hash":{},"fn":container.program(6, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") +    + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.glossary : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + "\n" -    + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.kunyomi : depth0),{"name":"if","hash":{},"fn":container.program(10, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") +    + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.kunyomi : depth0),{"name":"if","hash":{},"fn":container.program(8, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + "\n" -    + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.onyomi : depth0),{"name":"if","hash":{},"fn":container.program(12, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") +    + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.onyomi : depth0),{"name":"if","hash":{},"fn":container.program(10, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + "        </dl>\n    </div>\n</div>\n</div>\n";  },"useData":true,"useDepths":true});  templates['kanji-link.html'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { @@ -103,72 +93,60 @@ templates['term.html'] = template({"1":function(container,depth0,helpers,partial    return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.enableAnkiConnect : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "");  },"2":function(container,depth0,helpers,partials,data,blockParams,depths) { -    var stack1; - -  return "    <div class=\"action-bar\">\n" -    + ((stack1 = helpers["with"].call(depth0 != null ? depth0 : {},(depths[1] != null ? depths[1].addable : depths[1]),{"name":"with","hash":{},"fn":container.program(3, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "    </div>\n"; -},"3":function(container,depth0,helpers,partials,data,blockParams,depths) { -    var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; +    var helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; -  return "        <a href=\"#\" title=\"Add as expression\" class=\"action-link " -    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.vocabExp : depth0),{"name":"unless","hash":{},"fn":container.program(4, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "\" data-mode=\"vocabExp\" data-index=\"" +  return "    <div class=\"action-bar\">\n        <a href=\"#\" title=\"Add as expression\" class=\"action-link disabled\" data-mode=\"vocabExp\" data-index=\""      + alias4(((helper = (helper = helpers.index || (data && data.index)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"index","hash":{},"data":data}) : helper)))      + "\"><img src=\"" -    + alias4(alias5((depths[2] != null ? depths[2].root : depths[2]), depth0)) -    + "/img/add_expression.png\"></a>\n        <a href=\"#\" title=\"Add as reading\" class=\"action-link " -    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.vocabExp : depth0),{"name":"unless","hash":{},"fn":container.program(4, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "\" data-mode=\"vocabReading\" data-index=\"" +    + alias4(alias5((depths[1] != null ? depths[1].root : depths[1]), depth0)) +    + "/img/add_expression.png\"></a>\n        <a href=\"#\" title=\"Add as reading\" class=\"action-link disabled\" data-mode=\"vocabReading\" data-index=\""      + alias4(((helper = (helper = helpers.index || (data && data.index)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"index","hash":{},"data":data}) : helper)))      + "\"><img src=\"" -    + alias4(alias5((depths[2] != null ? depths[2].root : depths[2]), depth0)) -    + "/img/add_reading.png\"></a>\n"; +    + alias4(alias5((depths[1] != null ? depths[1].root : depths[1]), depth0)) +    + "/img/add_reading.png\"></a>\n    </div>\n";  },"4":function(container,depth0,helpers,partials,data) { -    return "disabled"; -},"6":function(container,depth0,helpers,partials,data) {      var stack1, helper, options, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3="function", buffer =     "    <div class=\"term-expression\"><ruby>"; -  stack1 = ((helper = (helper = helpers.kanjiLinks || (depth0 != null ? depth0.kanjiLinks : depth0)) != null ? helper : alias2),(options={"name":"kanjiLinks","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data}),(typeof helper === alias3 ? helper.call(alias1,options) : helper)); +  stack1 = ((helper = (helper = helpers.kanjiLinks || (depth0 != null ? depth0.kanjiLinks : depth0)) != null ? helper : alias2),(options={"name":"kanjiLinks","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data}),(typeof helper === alias3 ? helper.call(alias1,options) : helper));    if (!helpers.kanjiLinks) { stack1 = helpers.blockHelperMissing.call(depth0,stack1,options)}    if (stack1 != null) { buffer += stack1; }    return buffer + "<rt>"      + container.escapeExpression(((helper = (helper = helpers.reading || (depth0 != null ? depth0.reading : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"reading","hash":{},"data":data}) : helper)))      + "</rt></ruby></div>\n"; -},"7":function(container,depth0,helpers,partials,data) { +},"5":function(container,depth0,helpers,partials,data) {      var helper;    return container.escapeExpression(((helper = (helper = helpers.expression || (depth0 != null ? depth0.expression : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : {},{"name":"expression","hash":{},"data":data}) : helper))); -},"9":function(container,depth0,helpers,partials,data) { +},"7":function(container,depth0,helpers,partials,data) {      var stack1, helper, options, buffer =     "    <div class=\"term-expression\">"; -  stack1 = ((helper = (helper = helpers.kanjiLinks || (depth0 != null ? depth0.kanjiLinks : depth0)) != null ? helper : helpers.helperMissing),(options={"name":"kanjiLinks","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data}),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : {},options) : helper)); +  stack1 = ((helper = (helper = helpers.kanjiLinks || (depth0 != null ? depth0.kanjiLinks : depth0)) != null ? helper : helpers.helperMissing),(options={"name":"kanjiLinks","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data}),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : {},options) : helper));    if (!helpers.kanjiLinks) { stack1 = helpers.blockHelperMissing.call(depth0,stack1,options)}    if (stack1 != null) { buffer += stack1; }    return buffer + "</div>\n"; -},"11":function(container,depth0,helpers,partials,data) { +},"9":function(container,depth0,helpers,partials,data) {      var stack1;    return "    <div class=\"term-rules\">\n" -    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.rules : depth0),{"name":"each","hash":{},"fn":container.program(12, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") +    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.rules : depth0),{"name":"each","hash":{},"fn":container.program(10, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + "    </div>\n"; -},"12":function(container,depth0,helpers,partials,data) { +},"10":function(container,depth0,helpers,partials,data) {      var stack1;    return "        <span class=\"rule\">"      + container.escapeExpression(container.lambda(depth0, depth0))      + "</span> " -    + ((stack1 = helpers.unless.call(depth0 != null ? depth0 : {},(data && data.last),{"name":"unless","hash":{},"fn":container.program(13, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") +    + ((stack1 = helpers.unless.call(depth0 != null ? depth0 : {},(data && data.last),{"name":"unless","hash":{},"fn":container.program(11, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + "\n"; -},"13":function(container,depth0,helpers,partials,data) { +},"11":function(container,depth0,helpers,partials,data) {      return "«"; -},"15":function(container,depth0,helpers,partials,data) { +},"13":function(container,depth0,helpers,partials,data) {      var stack1;    return "    <div class=\"term-tags\">\n" -    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.tags : depth0),{"name":"each","hash":{},"fn":container.program(16, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") +    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.tags : depth0),{"name":"each","hash":{},"fn":container.program(14, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + "    </div>\n"; -},"16":function(container,depth0,helpers,partials,data) { +},"14":function(container,depth0,helpers,partials,data) {      var helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression;    return "        <span class=\"tag tag-" @@ -178,7 +156,7 @@ templates['term.html'] = template({"1":function(container,depth0,helpers,partial      + "\">"      + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data}) : helper)))      + "</span>\n"; -},"18":function(container,depth0,helpers,partials,data) { +},"16":function(container,depth0,helpers,partials,data) {      return "            <li><span>"      + container.escapeExpression(container.lambda(depth0, depth0))      + "</span></li>\n"; @@ -188,13 +166,13 @@ templates['term.html'] = template({"1":function(container,depth0,helpers,partial    return "<div class=\"term-definition\">\n"      + ((stack1 = helpers["with"].call(alias1,(depth0 != null ? depth0.options : depth0),{"name":"with","hash":{},"fn":container.program(1, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + "\n" -    + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.reading : depth0),{"name":"if","hash":{},"fn":container.program(6, data, 0, blockParams, depths),"inverse":container.program(9, data, 0, blockParams, depths),"data":data})) != null ? stack1 : "") +    + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.reading : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0, blockParams, depths),"inverse":container.program(7, data, 0, blockParams, depths),"data":data})) != null ? stack1 : "")      + "\n" -    + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.rules : depth0),{"name":"if","hash":{},"fn":container.program(11, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") +    + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.rules : depth0),{"name":"if","hash":{},"fn":container.program(9, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + "\n" -    + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.tags : depth0),{"name":"if","hash":{},"fn":container.program(15, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") +    + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.tags : depth0),{"name":"if","hash":{},"fn":container.program(13, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + "\n    <div class=\"term-glossary\">\n        <ol>\n" -    + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.glossary : depth0),{"name":"each","hash":{},"fn":container.program(18, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") +    + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.glossary : depth0),{"name":"each","hash":{},"fn":container.program(16, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + "        </ol>\n    </div>\n</div>\n";  },"useData":true,"useDepths":true});  templates['term-list.html'] = template({"1":function(container,depth0,helpers,partials,data,blockParams,depths) { diff --git a/ext/bg/js/translator.js b/ext/bg/js/translator.js index 606f6ec5..1a7b9bb4 100644 --- a/ext/bg/js/translator.js +++ b/ext/bg/js/translator.js @@ -89,12 +89,12 @@ class Translator {              }          } -        let results = []; +        let definitions = [];          for (const key in groups) { -            results.push(groups[key]); +            definitions.push(groups[key]);          } -        results = results.sort((v1, v2) => { +        definitions = definitions.sort((v1, v2) => {              const sl1 = v1.source.length;              const sl2 = v2.source.length;              if (sl1 > sl2) { @@ -123,25 +123,25 @@ class Translator {          });          let length = 0; -        for (const result of results) { +        for (const result of definitions) {              length = Math.max(length, result.source.length);          } -        return {results: results, length: length}; +        return {definitions: definitions, length: length};      }      findKanji(text) { -        let results     = []; +        let definitions     = [];          const processed = {};          for (const c of text) {              if (!processed[c]) { -                results = results.concat(this.dictionary.findKanji(c)); +                definitions = definitions.concat(this.dictionary.findKanji(c));                  processed[c] = true;              }          } -        return results; +        return definitions;      }      processTerm(groups, source, tags, rules=[], root='') { diff --git a/ext/bg/js/yomichan.js b/ext/bg/js/yomichan.js index 887bab2e..e7e674ac 100644 --- a/ext/bg/js/yomichan.js +++ b/ext/bg/js/yomichan.js @@ -34,8 +34,6 @@ class Yomichan {          });          this.translator = new Translator(); -        this.xhr        = null; -          this.setState('disabled');          loadOptions((opts) => { @@ -52,11 +50,12 @@ class Yomichan {      onMessage(request, sender, callback) {          const {action, params} = request, handlers = { -            findKanji:  ({text}) => this.actionFindKanji(text, callback), -            findTerm:   ({text}) => this.actionFindTerm(text, callback), -            getOptions: () => callback(this.options), -            getState:   () => callback(this.state), -            renderText: ({data, template}) => callback(Handlebars.templates[template](data)) +            canAddNotes: ({definitions}) => this.ankiInvoke('canAddNotes', definitions, callback), +            findKanji:   ({text}) => callback(this.translator.findKanji(text)), +            findTerm:    ({text}) => callback(this.translator.findTerm(text)), +            getOptions:  () => callback(this.options), +            getState:    () => callback(this.state), +            renderText:  ({data, template}) => callback(Handlebars.templates[template](data))          };          handlers[action].call(this, params); @@ -102,49 +101,21 @@ class Yomichan {          Yomichan.notifyChange('options', this.options);      } -    actionFindTerm(text, callback) { -        const results = this.translator.findTerm(text); -        this.callAnkiApi('canAddNotes', results.results, (definitions) => { -            if (definitions !== null) { -                results.results = definitions; -            } - -            callback(results); -        }); -    } - -    actionFindKanji(text, callback) { -        const results = this.translator.findKanji(text); -        this.callAnkiApi('cannAddNotes', results.results, (definitions) => { -            if (definitions !== null) { -                results.results = definitions; -            } - -            callback(results); -        }); -    } - -    callAnkiApi(action, params, callback) { -        if (!this.options.enableAnkiConnect) { +    ankiInvoke(action, params, callback) { +        if (this.options.enableAnkiConnect) { +            const xhr = new XMLHttpRequest(); +            xhr.addEventListener('loadend', () => { +                const resp = xhr.responseText; +                callback(resp ? JSON.parse(resp) : null); +            }); + +            xhr.open('POST', 'http://127.0.0.1:8888'); +            xhr.withCredentials = true; +            xhr.setRequestHeader('Content-Type', 'text/json'); +            xhr.send(JSON.stringify({action: action, params: params})); +        } else {              callback(null); -            return; -        } - -        if (this.xhr !== null) { -            this.xhr.abort();          } - -        this.xhr = new XMLHttpRequest(); -        this.xhr.addEventListener('loadend', () => { -            const resp = this.xhr.responseText; -            callback(resp ? JSON.parse(resp) : null); -            this.xhr = null; -        }); - -        this.xhr.open('POST', 'http://127.0.0.1:8888'); -        this.xhr.withCredentials = true; -        this.xhr.setRequestHeader('Content-Type', 'text/json'); -        this.xhr.send(JSON.stringify({action: action, params: params}));      }      static notifyChange(name, value) { diff --git a/ext/fg/js/api.js b/ext/fg/js/api.js index 97c14640..da5f6d5a 100644 --- a/ext/fg/js/api.js +++ b/ext/fg/js/api.js @@ -17,6 +17,10 @@   */ +// +// Background APIs +// +  function sendMessage(action, params, callback) {      chrome.runtime.sendMessage({action: action, params: params}, callback);  } @@ -40,3 +44,7 @@ function getOptions(callback) {  function getState(callback) {      sendMessage('getState', null, callback);  } + +function canAddNotes(definitions, callback) { +    sendMessage('canAddNotes', {definitions: definitions}, callback); +} diff --git a/ext/fg/js/client.js b/ext/fg/js/client.js index 12b04066..aea2d607 100644 --- a/ext/fg/js/client.js +++ b/ext/fg/js/client.js @@ -26,8 +26,7 @@ class Client {          this.activateBtn  = 2;          this.enabled      = false;          this.options      = {}; -        this.results      = null; -        this.xhr          = null; +        this.definitions  = null;          this.fgRoot       = chrome.extension.getURL('fg');          chrome.runtime.onMessage.addListener(this.onBgMessage.bind(this)); @@ -102,17 +101,18 @@ class Client {          }          range.setLength(this.options.scanLength); -        findTerm(range.text(), ({results, length}) => { +        findTerm(range.text(), ({definitions, length}) => {              if (length === 0) {                  this.hidePopup();              } else {                  range.setLength(length);                  renderText( -                    {defs: results, root: this.fgRoot, options: this.options}, +                    {defs: definitions, root: this.fgRoot, options: this.options},                      'term-list.html',                      (content) => { -                        this.results = results; -                        this.showPopup(range, content, results); +                        this.definitions = definitions; +                        this.showPopup(range, content); +                        canAddNotes(definitions, (states) => this.popup.sendMessage('setActionStates', states));                      }                  );              } @@ -120,23 +120,17 @@ class Client {      }      actionAddNote(mode, index, callback) { -        callback({ -            action: 'disableAction', -            params: { -                mode: mode, -                index: index -            } -        }); +      }      actionDisplayKanji(kanji) { -        findKanji(kanji, (results) => { +        findKanji(kanji, (definitions) => {              renderText( -                {defs: results, root: this.fgRoot, options: this.options}, +                {defs: definitions, root: this.fgRoot, options: this.options},                  'kanji-list.html',                  (content) => { -                    this.results = results; -                    this.popup.setContent(content, results); +                    this.definitions = definitions; +                    this.popup.setContent(content, definitions);                  }              );          }); @@ -159,8 +153,8 @@ class Client {              this.lastRange.deselect();          } -        this.lastRange = null; -        this.results   = null; +        this.lastRange   = null; +        this.definitions = null;      }      setEnabled(enabled) { @@ -172,29 +166,6 @@ class Client {      setOptions(opts) {          this.options = opts;      } - -    callAnkiApi(action, params, callback) { -        if (!this.options.enableAnkiConnect) { -            callback(null); -            return; -        } - -        if (this.xhr !== null) { -            this.xhr.abort(); -        } - -        this.xhr = new XMLHttpRequest(); -        this.xhr.addEventListener('loadend', () => { -            const resp = this.xhr.responseText; -            callback(resp ? JSON.parse(resp) : null); -            this.xhr = null; -        }); - -        this.xhr.open('POST', 'http://127.0.0.1:8888'); -        this.xhr.withCredentials = true; -        this.xhr.setRequestHeader('Content-Type', 'text/json'); -        this.xhr.send(JSON.stringify({action: action, params: params})); -    }  }  window.yomiClient = new Client(); diff --git a/ext/fg/js/frame.js b/ext/fg/js/frame.js index 80fa099a..5a910dfc 100644 --- a/ext/fg/js/frame.js +++ b/ext/fg/js/frame.js @@ -43,9 +43,21 @@ function onDomContentLoaded() {  function onMessage(e) {      const {action, params} = e.data, handlers = { -        disableAction: ({mode, index}) => { -            const matches = document.querySelectorAll(`.action-link[data-index="${index}"][data-mode="${mode}"]`); -            matches[0].classList.add('disabled'); +        setActionStates: (states) => { +            for (let i = 0, count = states.length; i < count; ++i) { +                const state = states[i]; +                for (const mode in state) { +                    const matches = document.querySelectorAll(`.action-link[data-index="${i}"][data-mode="${mode}"]`); +                    if (matches.length > 0) { +                        const classes = matches[0].classList; +                        if (state[mode]) { +                            classes.remove('disabled'); +                        } else { +                            classes.add('disabled'); +                        } +                    } +                } +            }          }      }; diff --git a/ext/fg/js/popup.js b/ext/fg/js/popup.js index 16a62b1c..53359cf3 100644 --- a/ext/fg/js/popup.js +++ b/ext/fg/js/popup.js @@ -68,6 +68,12 @@ class Popup {          doc.close();      } +    sendMessage(action, params, callback) { +        if (this.popup !== null) { +            this.popup.contentWindow.postMessage({action: action, params: params}, '*'); +        } +    } +      inject() {          if (this.popup !== null) {              return; diff --git a/util/tmpl/kanji.html b/util/tmpl/kanji.html index 4851826f..119fead6 100644 --- a/util/tmpl/kanji.html +++ b/util/tmpl/kanji.html @@ -1,11 +1,7 @@  <div class="kanji-definition">      {{#with options}}      {{#if enableAnkiConnect}} -    <div class="action-bar"> -        {{#with ../addable}} -        <a href="#" title="Add Kanji" class="action-link {{#unless kanji}}disabled{{/unless}}" data-mode="kanji" data-index="{{@index}}"><img src="{{../../root}}/add_kanji.png"></a> -        {{/with}} -    </div> +    <a href="#" title="Add Kanji" class="action-link disabled" data-mode="kanji" data-index="{{@index}}"><img src="{{../root}}/add_kanji.png"></a>      {{/if}}      {{/with}} diff --git a/util/tmpl/term.html b/util/tmpl/term.html index 465a9388..da29271c 100644 --- a/util/tmpl/term.html +++ b/util/tmpl/term.html @@ -2,10 +2,8 @@      {{#with options}}      {{#if enableAnkiConnect}}      <div class="action-bar"> -        {{#with ../addable}} -        <a href="#" title="Add as expression" class="action-link {{#unless vocabExp}}disabled{{/unless}}" data-mode="vocabExp" data-index="{{@index}}"><img src="{{../../root}}/img/add_expression.png"></a> -        <a href="#" title="Add as reading" class="action-link {{#unless vocabExp}}disabled{{/unless}}" data-mode="vocabReading" data-index="{{@index}}"><img src="{{../../root}}/img/add_reading.png"></a> -        {{/with}} +        <a href="#" title="Add as expression" class="action-link disabled" data-mode="vocabExp" data-index="{{@index}}"><img src="{{../root}}/img/add_expression.png"></a> +        <a href="#" title="Add as reading" class="action-link disabled" data-mode="vocabReading" data-index="{{@index}}"><img src="{{../root}}/img/add_reading.png"></a>      </div>      {{/if}}      {{/with}} |