support importing from zip files

This commit is contained in:
Alex Yatskov 2017-06-25 15:36:28 -07:00
parent 98d22a92f3
commit d3c342071f
4 changed files with 76 additions and 62 deletions

View File

@ -7,6 +7,7 @@
<script src="/mixed/lib/handlebars.min.js"></script> <script src="/mixed/lib/handlebars.min.js"></script>
<script src="/mixed/lib/dexie.min.js"></script> <script src="/mixed/lib/dexie.min.js"></script>
<script src="/mixed/lib/wanakana.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="/mixed/js/util.js"></script>
<script src="/bg/js/templates.js"></script> <script src="/bg/js/templates.js"></script>
<script src="/bg/js/util.js"></script> <script src="/bg/js/util.js"></script>

View File

@ -155,7 +155,7 @@ class Database {
return this.db.dictionaries.toArray(); return this.db.dictionaries.toArray();
} }
importDictionary(indexUrl, callback) { importDictionary(archive, callback) {
if (this.db === null) { if (this.db === null) {
return Promise.reject('database not initialized'); return Promise.reject('database not initialized');
} }
@ -204,7 +204,7 @@ class Database {
return this.db.terms.bulkAdd(rows).then(() => { return this.db.terms.bulkAdd(rows).then(() => {
if (callback) { if (callback) {
callback(total, current, indexUrl); callback(total, current);
} }
}); });
}; };
@ -224,11 +224,11 @@ class Database {
return this.db.kanji.bulkAdd(rows).then(() => { return this.db.kanji.bulkAdd(rows).then(() => {
if (callback) { 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);
} }
} }

View File

@ -250,31 +250,27 @@ function onDictionaryPurge(e) {
}); });
} }
function onDictionaryImport() { function onDictionaryImport(e) {
alert('import'); dictionaryErrorShow(null);
dictionarySpinnerShow(true);
// dictionaryErrorShow(null); const dictUrl = $('#dict-url');
// dictionarySpinnerShow(true); const dictImporter = $('#dict-importer').hide();
const dictProgress = $('#dict-import-progress').show();
const setProgress = percent => dictProgress.find('.progress-bar').css('width', `${percent}%`);
// const dictUrl = $('#dict-url'); setProgress(0.0);
// 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 => {
// optionsLoad().then(options => { options.dictionaries[summary.title] = {enabled: true, priority: 0};
// instDb().importDictionary(dictUrl.val(), (total, current) => setProgress(current / total * 100.0)).then(summary => { return optionsSave(options);
// options.dictionaries[summary.title] = {enabled: true, priority: 0}; }).then(() => dictionaryGroupsPopulate(options));
// return optionsSave(options); }).catch(dictionaryErrorShow).then(() => {
// }).then(() => dictionaryGroupsPopulate(options)).catch(dictionaryErrorShow).then(() => { dictionarySpinnerShow(false);
// dictionarySpinnerShow(false); dictProgress.hide();
// dictProgress.hide(); dictImporter.show();
// dictImporter.show(); });
// dictUrl.val('');
// dictUrl.trigger('input');
// });
// });
} }
/* /*

View File

@ -451,14 +451,30 @@ function jsonLoadInt(url) {
return jsonLoad(chrome.extension.getURL(url)); return jsonLoad(chrome.extension.getURL(url));
} }
function jsonLoadDb(indexUrl, indexLoaded, termsLoaded, kanjiLoaded) { /*
const indexDir = indexUrl.slice(0, indexUrl.lastIndexOf('/')); * Zip
return jsonLoad(indexUrl).then(index => { */
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');
}
return indexFile.async('string').then(indexJson => {
const index = JSON.parse(indexJson);
if (!index.title || !index.version || !index.revision) { if (!index.title || !index.version || !index.revision) {
return Promise.reject('unrecognized dictionary format'); return Promise.reject('unrecognized dictionary format');
} }
if (indexLoaded !== null) {
return indexLoaded( return indexLoaded(
index.title, index.title,
index.version, index.version,
@ -467,32 +483,33 @@ function jsonLoadDb(indexUrl, indexLoaded, termsLoaded, kanjiLoaded) {
index.termBanks > 0, index.termBanks > 0,
index.kanjiBanks > 0 index.kanjiBanks > 0
).then(() => index); ).then(() => index);
}
return index;
}).then(index => { }).then(index => {
const loaders = []; const loaders = [];
const banksTotal = index.termBanks + index.kanjiBanks; const banksTotal = index.termBanks + index.kanjiBanks;
let banksLoaded = 0; let banksLoaded = 0;
for (let i = 1; i <= index.termBanks; ++i) { for (let i = 1; i <= index.termBanks; ++i) {
const bankUrl = `${indexDir}/term_bank_${i}.json`; const bankFile = files[`term_bank_${i}.json`];
loaders.push(() => jsonLoad(bankUrl).then(entries => termsLoaded( if (!bankFile) {
index.title, return Promise.reject('missing term bank file');
entries, }
banksTotal,
banksLoaded++ loaders.push(() => bankFile.async('string').then(bankJson => {
))); const bank = JSON.parse(bankJson);
return termsLoaded(index.title, bank, banksTotal, banksLoaded++);
}));
} }
for (let i = 1; i <= index.kanjiBanks; ++i) { for (let i = 1; i <= index.kanjiBanks; ++i) {
const bankUrl = `${indexDir}/kanji_bank_${i}.json`; const bankFile = files[`kanji_bank_${i}.json`];
loaders.push(() => jsonLoad(bankUrl).then(entries => kanjiLoaded( if (!bankFile) {
index.title, return Promise.reject('missing kanji bank file');
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(); let chain = Promise.resolve();
@ -502,9 +519,9 @@ function jsonLoadDb(indexUrl, indexLoaded, termsLoaded, kanjiLoaded) {
return chain; return chain;
}); });
});
} }
/* /*
* Helpers * Helpers
*/ */