summaryrefslogtreecommitdiff
path: root/ext/bg/js
diff options
context:
space:
mode:
Diffstat (limited to 'ext/bg/js')
-rw-r--r--ext/bg/js/database.js8
-rw-r--r--ext/bg/js/options.js43
-rw-r--r--ext/bg/js/templates.js4
-rw-r--r--ext/bg/js/util.js84
4 files changed, 64 insertions, 75 deletions
diff --git a/ext/bg/js/database.js b/ext/bg/js/database.js
index 51f639d9..70aeb0d7 100644
--- a/ext/bg/js/database.js
+++ b/ext/bg/js/database.js
@@ -155,7 +155,7 @@ class Database {
return this.db.dictionaries.toArray();
}
- importDictionary(indexUrl, callback) {
+ importDictionary(archive, callback) {
if (this.db === null) {
return Promise.reject('database not initialized');
}
@@ -204,7 +204,7 @@ class Database {
return this.db.terms.bulkAdd(rows).then(() => {
if (callback) {
- callback(total, current, indexUrl);
+ callback(total, current);
}
});
};
@@ -224,11 +224,11 @@ class Database {
return this.db.kanji.bulkAdd(rows).then(() => {
if (callback) {
- callback(total, current, indexUrl);
+ callback(total, current);
}
});
};
- return jsonLoadDb(indexUrl, indexLoaded, termsLoaded, kanjiLoaded).then(() => summary);
+ return zipLoadDb(archive, indexLoaded, termsLoaded, kanjiLoaded).then(() => summary);
}
}
diff --git a/ext/bg/js/options.js b/ext/bg/js/options.js
index c3321012..5aa18366 100644
--- a/ext/bg/js/options.js
+++ b/ext/bg/js/options.js
@@ -140,9 +140,7 @@ $(document).ready(() => {
$('#scan-modifier-key').val(options.scanning.modifier);
$('#dict-purge').click(onDictionaryPurge);
- $('#dict-importer a').click(onDictionarySetUrl);
- $('#dict-import').click(onDictionaryImport);
- $('#dict-url').on('input', onDictionaryUpdateUrl);
+ $('#dict-file').change(onDictionaryImport);
$('#anki-enable').prop('checked', options.anki.enable);
$('#card-tags').val(options.anki.tags.join(' '));
@@ -252,50 +250,31 @@ function onDictionaryPurge(e) {
});
}
-function onDictionaryImport() {
+function onDictionaryImport(e) {
dictionaryErrorShow(null);
dictionarySpinnerShow(true);
- const dictUrl = $('#dict-url');
+ const dictFile = $('#dict-file');
const dictImporter = $('#dict-importer').hide();
const dictProgress = $('#dict-import-progress').show();
const setProgress = percent => dictProgress.find('.progress-bar').css('width', `${percent}%`);
+ const updateProgress = (total, current) => setProgress(current / total * 100.0);
setProgress(0.0);
optionsLoad().then(options => {
- instDb().importDictionary(dictUrl.val(), (total, current) => setProgress(current / total * 100.0)).then(summary => {
+ return instDb().importDictionary(e.target.files[0], updateProgress).then(summary => {
options.dictionaries[summary.title] = {enabled: true, priority: 0};
return optionsSave(options);
- }).then(() => dictionaryGroupsPopulate(options)).catch(dictionaryErrorShow).then(() => {
- dictionarySpinnerShow(false);
- dictProgress.hide();
- dictImporter.show();
- dictUrl.val('');
- dictUrl.trigger('input');
- });
+ }).then(() => dictionaryGroupsPopulate(options));
+ }).catch(dictionaryErrorShow).then(() => {
+ dictFile.val('');
+ dictionarySpinnerShow(false);
+ dictProgress.hide();
+ dictImporter.show();
});
}
-function onDictionarySetUrl(e) {
- e.preventDefault();
-
- const dictUrl = $('#dict-url');
- const url = $(this).data('url');
- if (url.includes('/')) {
- dictUrl.val(url);
- } else {
- dictUrl.val(chrome.extension.getURL(`bg/lang/dict/${url}/index.json`));
- }
-
- dictUrl.trigger('input');
-}
-
-function onDictionaryUpdateUrl() {
- $('#dict-import').prop('disabled', $(this).val().length === 0);
-}
-
-
/*
* Anki
*/
diff --git a/ext/bg/js/templates.js b/ext/bg/js/templates.js
index d2e5435e..f10134ee 100644
--- a/ext/bg/js/templates.js
+++ b/ext/bg/js/templates.js
@@ -404,7 +404,7 @@ templates['kanji.html'] = template({"1":function(container,depth0,helpers,partia
},"23":function(container,depth0,helpers,partials,data) {
return "<hr>";
},"25":function(container,depth0,helpers,partials,data) {
- return "<p>No results found.</p>\n";
+ return "<p class=\"note\">No results found.</p>\n";
},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data,blockParams,depths) {
var stack1;
@@ -586,7 +586,7 @@ templates['terms.html'] = template({"1":function(container,depth0,helpers,partia
},"39":function(container,depth0,helpers,partials,data) {
return "<hr>";
},"41":function(container,depth0,helpers,partials,data) {
- return "<p>No results found.</p>\n";
+ return "<p class=\"note\">No results found.</p>\n";
},"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data,blockParams,depths) {
var stack1;
diff --git a/ext/bg/js/util.js b/ext/bg/js/util.js
index 75833871..cdd5ec31 100644
--- a/ext/bg/js/util.js
+++ b/ext/bg/js/util.js
@@ -451,14 +451,23 @@ function jsonLoadInt(url) {
return jsonLoad(chrome.extension.getURL(url));
}
-function jsonLoadDb(indexUrl, indexLoaded, termsLoaded, kanjiLoaded) {
- const indexDir = indexUrl.slice(0, indexUrl.lastIndexOf('/'));
- return jsonLoad(indexUrl).then(index => {
- if (!index.title || !index.version || !index.revision) {
- return Promise.reject('unrecognized dictionary format');
+/*
+ * Zip
+ */
+
+function zipLoadDb(archive, indexLoaded, termsLoaded, kanjiLoaded) {
+ return JSZip.loadAsync(archive).then(files => files.files).then(files => {
+ const indexFile = files['index.json'];
+ if (!indexFile) {
+ return Promise.reject('no dictionary index found in archive');
}
- if (indexLoaded !== null) {
+ return indexFile.async('string').then(indexJson => {
+ const index = JSON.parse(indexJson);
+ if (!index.title || !index.version || !index.revision) {
+ return Promise.reject('unrecognized dictionary format');
+ }
+
return indexLoaded(
index.title,
index.version,
@@ -467,44 +476,45 @@ function jsonLoadDb(indexUrl, indexLoaded, termsLoaded, kanjiLoaded) {
index.termBanks > 0,
index.kanjiBanks > 0
).then(() => index);
- }
+ }).then(index => {
+ const loaders = [];
+ const banksTotal = index.termBanks + index.kanjiBanks;
+ let banksLoaded = 0;
+
+ for (let i = 1; i <= index.termBanks; ++i) {
+ const bankFile = files[`term_bank_${i}.json`];
+ if (!bankFile) {
+ return Promise.reject('missing term bank file');
+ }
+
+ loaders.push(() => bankFile.async('string').then(bankJson => {
+ const bank = JSON.parse(bankJson);
+ return termsLoaded(index.title, bank, banksTotal, banksLoaded++);
+ }));
+ }
- return index;
- }).then(index => {
- const loaders = [];
- const banksTotal = index.termBanks + index.kanjiBanks;
- let banksLoaded = 0;
+ for (let i = 1; i <= index.kanjiBanks; ++i) {
+ const bankFile = files[`kanji_bank_${i}.json`];
+ if (!bankFile) {
+ return Promise.reject('missing kanji bank file');
+ }
- for (let i = 1; i <= index.termBanks; ++i) {
- const bankUrl = `${indexDir}/term_bank_${i}.json`;
- loaders.push(() => jsonLoad(bankUrl).then(entries => termsLoaded(
- index.title,
- entries,
- banksTotal,
- banksLoaded++
- )));
- }
-
- for (let i = 1; i <= index.kanjiBanks; ++i) {
- const bankUrl = `${indexDir}/kanji_bank_${i}.json`;
- loaders.push(() => jsonLoad(bankUrl).then(entries => kanjiLoaded(
- index.title,
- entries,
- banksTotal,
- banksLoaded++
- )));
- }
+ loaders.push(() => bankFile.async('string').then(bankJson => {
+ const bank = JSON.parse(bankJson);
+ return kanjiLoaded(index.title, bank, banksTotal, banksLoaded++);
+ }));
+ }
- let chain = Promise.resolve();
- for (const loader of loaders) {
- chain = chain.then(loader);
- }
+ let chain = Promise.resolve();
+ for (const loader of loaders) {
+ chain = chain.then(loader);
+ }
- return chain;
+ return chain;
+ });
});
}
-
/*
* Helpers
*/