diff options
Diffstat (limited to 'ext')
| -rw-r--r-- | ext/bg/background.html | 1 | ||||
| -rw-r--r-- | ext/bg/js/database.js | 8 | ||||
| -rw-r--r-- | ext/bg/js/options.js | 46 | ||||
| -rw-r--r-- | ext/bg/js/util.js | 91 | 
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   */ |