diff options
author | Alex Yatskov <alex@foosoft.net> | 2016-12-22 18:50:58 -0800 |
---|---|---|
committer | Alex Yatskov <alex@foosoft.net> | 2016-12-22 18:50:58 -0800 |
commit | 39fa11f72bae62985ee5b27103e5959dab30316c (patch) | |
tree | e7fe89d18a2b0bfa892ede044d7e6dcc076bbf7b /ext/bg/js/dictionary.js | |
parent | 5710dc55a73491a0be2259fbd21874bddda54877 (diff) | |
parent | 9d21f8a456530c29c7c03db4896562a4902f6f8a (diff) |
Merge branch 'dev'
Diffstat (limited to 'ext/bg/js/dictionary.js')
-rw-r--r-- | ext/bg/js/dictionary.js | 217 |
1 files changed, 0 insertions, 217 deletions
diff --git a/ext/bg/js/dictionary.js b/ext/bg/js/dictionary.js deleted file mode 100644 index 1d54190e..00000000 --- a/ext/bg/js/dictionary.js +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (C) 2016 Alex Yatskov <alex@foosoft.net> - * Author: Alex Yatskov <alex@foosoft.net> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - - -class Dictionary { - constructor() { - this.db = null; - this.dbVer = 2; - this.entities = null; - } - - initDb() { - if (this.db !== null) { - return Promise.reject('database already initialized'); - } - - this.db = new Dexie('dict'); - this.db.version(1).stores({ - terms: '++id,expression,reading', - entities: '++,name', - kanji: '++,character', - meta: 'name,value', - }); - } - - prepareDb() { - this.initDb(); - - return this.db.meta.get('version').then(row => { - return row ? row.value : 0; - }).catch(() => { - return 0; - }).then(version => { - if (this.dbVer === version) { - return true; - } - - const db = this.db; - this.db.close(); - this.db = null; - - return db.delete().then(() => { - this.initDb(); - return false; - }); - }); - } - - sealDb() { - if (this.db === null) { - return Promise.reject('database not initialized'); - } - - return this.db.meta.put({name: 'version', value: this.dbVer}); - } - - findTerm(term) { - if (this.db === null) { - return Promise.reject('database not initialized'); - } - - const results = []; - return this.db.terms.where('expression').equals(term).or('reading').equals(term).each(row => { - results.push({ - expression: row.expression, - reading: row.reading, - tags: splitField(row.tags), - glossary: row.glossary, - id: row.id - }); - }).then(() => { - return this.getEntities(); - }).then(entities => { - for (const result of results) { - result.entities = entities; - } - - return results; - }); - } - - findKanji(kanji) { - if (this.db === null) { - return Promise.reject('database not initialized'); - } - - const results = []; - return this.db.kanji.where('character').equals(kanji).each(row => { - results.push({ - character: row.character, - onyomi: splitField(row.onyomi), - kunyomi: splitField(row.kunyomi), - tags: splitField(row.tags), - glossary: row.meanings - }); - }).then(() => results); - } - - getEntities(tags) { - if (this.db === null) { - return Promise.reject('database not initialized'); - } - - if (this.entities !== null) { - return Promise.resolve(this.entities); - } - - return this.db.entities.toArray(rows => { - this.entities = {}; - for (const row of rows) { - this.entities[row.name] = row.value; - } - - return this.entities; - }); - } - - importTermDict(indexUrl, callback) { - if (this.db === null) { - return Promise.reject('database not initialized'); - } - - const indexDir = indexUrl.slice(0, indexUrl.lastIndexOf('/')); - return loadJson(indexUrl).then(index => { - const entities = []; - for (const [name, value] of index.ents) { - entities.push({name, value}); - } - - return this.db.entities.bulkAdd(entities).then(() => { - if (this.entities === null) { - this.entities = {}; - } - - for (const entity of entities) { - this.entities[entity.name] = entity.value; - } - }).then(() => { - const loaders = []; - for (let i = 1; i <= index.banks; ++i) { - const bankUrl = `${indexDir}/bank_${i}.json`; - loaders.push(() => { - return loadJson(bankUrl).then(definitions => { - const rows = []; - for (const [expression, reading, tags, ...glossary] of definitions) { - rows.push({expression, reading, tags, glossary}); - } - - return this.db.terms.bulkAdd(rows).then(() => { - if (callback) { - callback(i, index.banks, indexUrl); - } - }); - }); - }); - } - - let chain = Promise.resolve(); - for (const loader of loaders) { - chain = chain.then(loader); - } - - return chain; - }); - }); - } - - importKanjiDict(indexUrl, callback) { - if (this.db === null) { - return Promise.reject('database not initialized'); - } - - const indexDir = indexUrl.slice(0, indexUrl.lastIndexOf('/')); - return loadJson(indexUrl).then(index => { - const loaders = []; - for (let i = 1; i <= index.banks; ++i) { - const bankUrl = `${indexDir}/bank_${i}.json`; - loaders.push(() => { - return loadJson(bankUrl).then(definitions => { - const rows = []; - for (const [character, onyomi, kunyomi, tags, ...meanings] of definitions) { - rows.push({character, onyomi, kunyomi, tags, meanings}); - } - - return this.db.kanji.bulkAdd(rows).then(() => { - if (callback) { - callback(i, index.banks, indexUrl); - } - }); - }); - }); - } - - let chain = Promise.resolve(); - for (const loader of loaders) { - chain = chain.then(loader); - } - - return chain; - }); - } -} |