summaryrefslogtreecommitdiff
path: root/ext/bg
diff options
context:
space:
mode:
authorAlex Yatskov <alex@foosoft.net>2017-06-25 15:36:28 -0700
committerAlex Yatskov <alex@foosoft.net>2017-06-25 15:36:28 -0700
commitd3c342071f1397a59f94d89ca617e6294c50f861 (patch)
tree1a5b0f563e69f3c512741c40a8f09d97616f456f /ext/bg
parent98d22a92f33e50d6c75df08be70cf801610b4fb7 (diff)
support importing from zip files
Diffstat (limited to 'ext/bg')
-rw-r--r--ext/bg/background.html1
-rw-r--r--ext/bg/js/database.js8
-rw-r--r--ext/bg/js/options.js46
-rw-r--r--ext/bg/js/util.js91
4 files changed, 80 insertions, 66 deletions
diff --git a/ext/bg/background.html b/ext/bg/background.html
index b5ae147b..4410c249 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/lib/jszip.min.js"></script>
<script src="/mixed/js/util.js"></script>
<script src="/bg/js/templates.js"></script>
<script src="/bg/js/util.js"></script>
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 0b8b7ac3..cde1fc3f 100644
--- a/ext/bg/js/options.js
+++ b/ext/bg/js/options.js
@@ -250,31 +250,27 @@ function onDictionaryPurge(e) {
});
}
-function onDictionaryImport() {
- alert('import');
-
- // dictionaryErrorShow(null);
- // dictionarySpinnerShow(true);
-
- // const dictUrl = $('#dict-url');
- // const dictImporter = $('#dict-importer').hide();
- // const dictProgress = $('#dict-import-progress').show();
- // const setProgress = percent => dictProgress.find('.progress-bar').css('width', `${percent}%`);
-
- // setProgress(0.0);
-
- // optionsLoad().then(options => {
- // instDb().importDictionary(dictUrl.val(), (total, current) => setProgress(current / total * 100.0)).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');
- // });
- // });
+function onDictionaryImport(e) {
+ dictionaryErrorShow(null);
+ dictionarySpinnerShow(true);
+
+ const dictUrl = $('#dict-url');
+ const dictImporter = $('#dict-importer').hide();
+ const dictProgress = $('#dict-import-progress').show();
+ const setProgress = percent => dictProgress.find('.progress-bar').css('width', `${percent}%`);
+
+ setProgress(0.0);
+
+ optionsLoad().then(options => {
+ return instDb().importDictionary(e.target.files[0], (total, current) => setProgress(current / total * 100.0)).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();
+ });
}
/*
diff --git a/ext/bg/js/util.js b/ext/bg/js/util.js
index 75833871..ea307b6b 100644
--- a/ext/bg/js/util.js
+++ b/ext/bg/js/util.js
@@ -451,14 +451,30 @@ 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 => {
+ const fileMap = {};
+ files.forEach((path, file) => {
+ fileMap[path] = file;
+ });
+
+ return fileMap;
+ }).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 +483,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
*/