aboutsummaryrefslogtreecommitdiff
path: root/ext/bg/js/util.js
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/js/util.js
parent98d22a92f33e50d6c75df08be70cf801610b4fb7 (diff)
support importing from zip files
Diffstat (limited to 'ext/bg/js/util.js')
-rw-r--r--ext/bg/js/util.js91
1 files changed, 54 insertions, 37 deletions
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
*/