diff options
Diffstat (limited to 'ext')
| -rw-r--r-- | ext/bg/js/database.js | 48 | ||||
| -rw-r--r-- | ext/bg/js/util.js | 64 | 
2 files changed, 47 insertions, 65 deletions
| diff --git a/ext/bg/js/database.js b/ext/bg/js/database.js index 9eed8ea3..45ba3d08 100644 --- a/ext/bg/js/database.js +++ b/ext/bg/js/database.js @@ -224,7 +224,53 @@ class Database {              await this.db.kanji.bulkAdd(rows);          }; -        await zipLoadDb(archive, indexLoaded, termsLoaded, kanjiLoaded); +        await Database.importDictionaryZip(archive, indexLoaded, termsLoaded, kanjiLoaded);          return summary;      } + +    static async importDictionaryZip(archive, indexLoaded, termsLoaded, kanjiLoaded) { +        const files = (await JSZip.loadAsync(archive)).files; + +        const indexFile = files['index.json']; +        if (!indexFile) { +            throw 'no dictionary index found in archive'; +        } + +        const index = JSON.parse(await indexFile.async('string')); +        if (!index.title || !index.version || !index.revision) { +            throw 'unrecognized dictionary format'; +        } + +        await indexLoaded( +            index.title, +            index.version, +            index.revision, +            index.tagMeta || {}, +            index.termBanks > 0, +            index.kanjiBanks > 0 +        ); + +        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) { +                const bank = JSON.parse(await bankFile.async('string')); +                await termsLoaded(index.title, bank, banksTotal, banksLoaded++); +            } else { +                throw 'missing term bank file'; +            } +        } + +        for (let i = 1; i <= index.kanjiBanks; ++i) { +            const bankFile = files[`kanji_bank_${i}.json`]; +            if (bankFile) { +                const bank = JSON.parse(await bankFile.async('string')); +                await kanjiLoaded(index.title, bank, banksTotal, banksLoaded++); +            } else { +                throw 'missing kanji bank file'; +            } +        } +    }  } diff --git a/ext/bg/js/util.js b/ext/bg/js/util.js index b39b4b2f..1954e83b 100644 --- a/ext/bg/js/util.js +++ b/ext/bg/js/util.js @@ -456,70 +456,6 @@ function jsonLoadInt(url) {  }  /* - * 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'); -        } - -        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, -                index.revision, -                index.tagMeta || {}, -                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++); -                })); -            } - -            for (let i = 1; i <= index.kanjiBanks; ++i) { -                const bankFile = files[`kanji_bank_${i}.json`]; -                if (!bankFile) { -                    return Promise.reject('missing kanji bank file'); -                } - -                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); -            } - -            return chain; -        }); -    }); -} - -/*   * Helpers   */ |