diff options
Diffstat (limited to 'ext/bg')
-rw-r--r-- | ext/bg/js/options-form.js | 32 | ||||
-rw-r--r-- | ext/bg/js/options.js | 12 | ||||
-rw-r--r-- | ext/bg/js/popup.js | 11 | ||||
-rw-r--r-- | ext/bg/js/util.js | 38 | ||||
-rw-r--r-- | ext/bg/js/yomichan.js | 10 | ||||
-rw-r--r-- | ext/bg/options.html | 5 | ||||
-rw-r--r-- | ext/bg/popup.html | 10 |
7 files changed, 62 insertions, 56 deletions
diff --git a/ext/bg/js/options-form.js b/ext/bg/js/options-form.js index ae0491a2..c53c0c5e 100644 --- a/ext/bg/js/options-form.js +++ b/ext/bg/js/options-form.js @@ -20,15 +20,10 @@ // General // -function yomichan() { - return chrome.extension.getBackgroundPage().yomichan; -} - function getFormData() { return optionsLoad().then(optionsOld => { const optionsNew = $.extend(true, {}, optionsOld); - optionsNew.general.enable = $('#enable-search').prop('checked'); optionsNew.general.audioPlayback = $('#audio-playback-buttons').prop('checked'); optionsNew.general.groupResults = $('#group-terms-results').prop('checked'); optionsNew.general.softKatakana = $('#soft-katakana-search').prop('checked'); @@ -87,7 +82,6 @@ $(document).ready(() => { Handlebars.partials = Handlebars.templates; optionsLoad().then(options => { - $('#enable-search').prop('checked', options.general.enable); $('#audio-playback-buttons').prop('checked', options.general.audioPlayback); $('#group-terms-results').prop('checked', options.general.groupResults); $('#soft-katakana-search').prop('checked', options.general.softKatakana); @@ -123,10 +117,6 @@ $(document).ready(() => { // Dictionary // -function database() { - return yomichan().translator.database; -} - function showDictionaryError(error) { const dialog = $('#dict-error'); if (error) { @@ -153,7 +143,7 @@ function populateDictionaries(options) { const dictWarning = $('#dict-warning').hide(); let dictCount = 0; - return database().getDictionaries().then(rows => { + return getDatabase().getDictionaries().then(rows => { rows.forEach(row => { const dictOptions = options.dictionaries[row.title] || {enableTerms: false, enableKanji: false, priority: 0}; const html = Handlebars.templates['dictionary.html']({ @@ -188,7 +178,7 @@ function onDictionaryPurge(e) { const dictControls = $('#dict-importer, #dict-groups').hide(); const dictProgress = $('#dict-purge-progress').show(); - return database().purge().catch(showDictionaryError).then(() => { + return getDatabase().purge().catch(showDictionaryError).then(() => { showDictionarySpinner(false); dictControls.show(); dictProgress.hide(); @@ -197,7 +187,7 @@ function onDictionaryPurge(e) { options.dictionaries = {}; return optionsSave(options).then(() => { populateDictionaries(options); - yomichan().setOptions(options); + getYomichan().setOptions(options); }); }); } @@ -214,9 +204,9 @@ function onDictionaryImport() { setProgress(0.0); optionsLoad().then(options => { - database().importDictionary(dictUrl.val(), (total, current) => setProgress(current / total * 100.0)).then(summary => { + getDatabase().importDictionary(dictUrl.val(), (total, current) => setProgress(current / total * 100.0)).then(summary => { options.dictionaries[summary.title] = {enabled: true, priority: 0}; - return optionsSave(options).then(() => yomichan().setOptions(options)); + return optionsSave(options).then(() => getYomichan().setOptions(options)); }).then(() => populateDictionaries(options)).catch(showDictionaryError).then(() => { showDictionarySpinner(false); dictProgress.hide(); @@ -249,10 +239,6 @@ function onDictionaryUpdateUrl() { // Anki // -function anki() { - return yomichan().anki; -} - function showAnkiSpinner(show) { const spinner = $('#anki-spinner'); if (show) { @@ -286,7 +272,7 @@ function populateAnkiDeckAndModel(options) { showAnkiSpinner(true); const ankiFormat = $('#anki-format').hide(); - return Promise.all([anki().getDeckNames(), anki().getModelNames()]).then(([deckNames, modelNames]) => { + return Promise.all([getAnki().getDeckNames(), getAnki().getModelNames()]).then(([deckNames, modelNames]) => { const ankiDeck = $('.anki-deck'); ankiDeck.find('option').remove(); deckNames.sort().forEach(name => ankiDeck.append($('<option/>', {value: name, text: name}))); @@ -320,7 +306,7 @@ function populateAnkiFields(element, options) { 'kanji': ['character', 'dictionary', 'glossary', 'kunyomi', 'onyomi', 'sentence', 'tags', 'url'] }[tabId] || {}; - return anki().getModelFieldNames(modelName).then(names => { + return getAnki().getModelFieldNames(modelName).then(names => { names.forEach(name => { const value = options.anki[tabId].fields[name] || ''; const html = Handlebars.templates['model.html']({name, markers, value}); @@ -351,7 +337,7 @@ function onAnkiModelChanged(e) { optionsNew.anki[tabId].fields = {}; populateAnkiFields(element, optionsNew).then(() => { - optionsSave(optionsNew).then(() => yomichan().setOptions(optionsNew)); + optionsSave(optionsNew).then(() => getYomichan().setOptions(optionsNew)); }).catch(showAnkiError).then(() => showAnkiSpinner(false)); }); } @@ -363,7 +349,7 @@ function onOptionsChanged(e) { getFormData().then(({optionsNew, optionsOld}) => { return optionsSave(optionsNew).then(() => { - yomichan().setOptions(optionsNew); + getYomichan().setOptions(optionsNew); updateVisibility(optionsNew); const ankiUpdated = diff --git a/ext/bg/js/options.js b/ext/bg/js/options.js index 7a47c702..198deb6d 100644 --- a/ext/bg/js/options.js +++ b/ext/bg/js/options.js @@ -145,3 +145,15 @@ function optionsSave(options) { chrome.storage.sync.set(options, resolve); }); } + +function optionsEnabledDicts(options) { + const dictionaries = {}; + for (const title in options.dictionaries) { + const dictionary = options.dictionaries[title]; + if (dictionary.enabled) { + dictionaries[title] = dictionary; + } + } + + return dictionaries; +} diff --git a/ext/bg/js/popup.js b/ext/bg/js/popup.js index a666b580..4f6942f0 100644 --- a/ext/bg/js/popup.js +++ b/ext/bg/js/popup.js @@ -20,5 +20,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')); -}); + 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(() => getYomichan().setOptions(options)); + }); + }); +}); diff --git a/ext/bg/js/util.js b/ext/bg/js/util.js index ec562f9f..852dfac7 100644 --- a/ext/bg/js/util.js +++ b/ext/bg/js/util.js @@ -17,7 +17,12 @@ */ -function kanjiLinks(options) { +function helperKanjiLinks(options) { + const isKanji = c => { + const code = c.charCodeAt(0); + return code >= 0x4e00 && code < 0x9fb0 || code >= 0x3400 && code < 0x4dc0; + }; + let result = ''; for (const c of options.fn(this)) { if (isKanji(c)) { @@ -30,27 +35,10 @@ function kanjiLinks(options) { return result; } -function multiLine(options) { +function helperMultiLine(options) { return options.fn(this).split('\n').join('<br>'); } -function isKanji(c) { - const code = c.charCodeAt(0); - return code >= 0x4e00 && code < 0x9fb0 || code >= 0x3400 && code < 0x4dc0; -} - -function enabledDicts(options) { - const dictionaries = {}; - for (const title in options.dictionaries) { - const dictionary = options.dictionaries[title]; - if (dictionary.enabled) { - dictionaries[title] = dictionary; - } - } - - return dictionaries; -} - function promiseCallback(promise, callback) { return promise.then(result => { callback({result}); @@ -62,6 +50,18 @@ function promiseCallback(promise, callback) { }); } +function getYomichan() { + return chrome.extension.getBackgroundPage().yomichan; +} + +function getDatabase() { + return getYomichan().translator.database; +} + +function getAnki() { + return getYomichan().anki; +} + function sortTermDefs(definitions, dictionaries=null) { return definitions.sort((v1, v2) => { const sl1 = v1.source.length; diff --git a/ext/bg/js/yomichan.js b/ext/bg/js/yomichan.js index d7d2317f..a544d0ad 100644 --- a/ext/bg/js/yomichan.js +++ b/ext/bg/js/yomichan.js @@ -20,8 +20,8 @@ class Yomichan { constructor() { Handlebars.partials = Handlebars.templates; - Handlebars.registerHelper('kanjiLinks', kanjiLinks); - Handlebars.registerHelper('multiLine', multiLine); + Handlebars.registerHelper('kanjiLinks', helperKanjiLinks); + Handlebars.registerHelper('multiLine', helperMultiLine); this.translator = new Translator(); this.anki = new AnkiNull(); @@ -132,7 +132,7 @@ class Yomichan { api_findKanji({text, callback}) { promiseCallback( - this.translator.findKanji(text, enabledDicts(this.options)).then(definitions => { + this.translator.findKanji(text, optionsEnabledDicts(this.options)).then(definitions => { return definitions.slice(0, this.options.general.maxResults); }), callback @@ -141,7 +141,7 @@ class Yomichan { api_findTerms({text, callback}) { promiseCallback( - this.translator.findTerms(text, enabledDicts(this.options), this.options.general.softKatakana).then(({definitions, length}) => { + this.translator.findTerms(text, optionsEnabledDicts(this.options), this.options.general.softKatakana).then(({definitions, length}) => { return {length, definitions: definitions.slice(0, this.options.general.maxResults)}; }), callback @@ -150,7 +150,7 @@ class Yomichan { api_findTermsGrouped({text, callback}) { promiseCallback( - this.translator.findTermsGrouped(text, enabledDicts(this.options), this.options.general.softKatakana).then(({definitions, length}) => { + this.translator.findTermsGrouped(text, optionsEnabledDicts(this.options), this.options.general.softKatakana).then(({definitions, length}) => { return {length, definitions: definitions.slice(0, this.options.general.maxResults)}; }), callback diff --git a/ext/bg/options.html b/ext/bg/options.html index 49f225c5..8bf773b0 100644 --- a/ext/bg/options.html +++ b/ext/bg/options.html @@ -26,10 +26,6 @@ <h3>General Options</h3> <div class="checkbox"> - <label><input type="checkbox" id="enable-search"> Enable search</label> - </div> - - <div class="checkbox"> <label><input type="checkbox" id="audio-playback-buttons"> Audio playback buttons</label> </div> @@ -242,6 +238,7 @@ <script src="../lib/handlebars.min.js"></script> <script src="js/templates.js"></script> <script src="js/gecko.js"></script> + <script src="js/util.js"></script> <script src="js/options.js"></script> <script src="js/options-form.js"></script> </body> diff --git a/ext/bg/popup.html b/ext/bg/popup.html index 5a90327a..35782b87 100644 --- a/ext/bg/popup.html +++ b/ext/bg/popup.html @@ -18,18 +18,20 @@ </head> <body> <p> - <input type="checkbox" data-toggle="toggle"> + <input type="checkbox" id="enable-search"> </p> <p> <div class="btn-group" style="white-space: nowrap"> - <button type="button" id="open-search" class="btn btn-default btn-xs glyphicon glyphicon-search"></button> - <button type="button" id="open-options" class="btn btn-default btn-xs glyphicon glyphicon-cog"></button> - <button type="button" id="open-help" class="btn btn-default btn-xs glyphicon glyphicon-question-sign"></button> + <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-help" title="Help" class="btn btn-default btn-xs glyphicon glyphicon-question-sign"></button> </div> </p> <script src="../lib/jquery-3.1.1.min.js"></script> <script src="../lib/bootstrap-toggle/bootstrap-toggle.min.js"></script> <script src="js/gecko.js"></script> + <script src="js/util.js"></script> + <script src="js/options.js"></script> <script src="js/popup.js"></script> </body> </html> |