WIP
This commit is contained in:
parent
0ff41d5843
commit
b5cc47a9d1
@ -21,7 +21,6 @@ class Database {
|
||||
constructor() {
|
||||
this.db = null;
|
||||
this.dbVer = 6;
|
||||
this.entities = null;
|
||||
}
|
||||
|
||||
init() {
|
||||
@ -72,22 +71,24 @@ class Database {
|
||||
return this.db.meta.put({name: 'version', value: this.dbVer});
|
||||
}
|
||||
|
||||
findTerm(term) {
|
||||
findTerm(term, dictionaries) {
|
||||
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
|
||||
});
|
||||
if (dictionaries.includes(row.dictionary)) {
|
||||
results.push({
|
||||
expression: row.expression,
|
||||
reading: row.reading,
|
||||
tags: splitField(row.tags),
|
||||
glossary: row.glossary,
|
||||
id: row.id
|
||||
});
|
||||
}
|
||||
}).then(() => {
|
||||
return this.getEntities();
|
||||
return this.getEntities(dictionaries);
|
||||
}).then(entities => {
|
||||
for (const result of results) {
|
||||
result.entities = entities;
|
||||
@ -97,33 +98,39 @@ class Database {
|
||||
});
|
||||
}
|
||||
|
||||
findKanji(kanji) {
|
||||
findKanji(kanji, dictionaries) {
|
||||
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);
|
||||
if (dictionaries.includes(row.dictionary)) {
|
||||
results.push({
|
||||
character: row.character,
|
||||
onyomi: splitField(row.onyomi),
|
||||
kunyomi: splitField(row.kunyomi),
|
||||
tags: splitField(row.tags),
|
||||
glossary: row.meanings
|
||||
});
|
||||
}
|
||||
}).then(() => {
|
||||
return this.getEntities(dictionaries);
|
||||
}).then(entities => {
|
||||
for (const result of results) {
|
||||
result.entities = entities;
|
||||
}
|
||||
|
||||
return results;
|
||||
});
|
||||
}
|
||||
|
||||
getEntities(tags) {
|
||||
getEntities(dictionaries) {
|
||||
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 => {
|
||||
return this.db.entities.where('dictionary').anyOf(dictionaries).toArray(rows => {
|
||||
this.entities = {};
|
||||
for (const row of rows) {
|
||||
this.entities[row.name] = row.value;
|
||||
|
@ -140,7 +140,7 @@ function populateDictionaries(opts) {
|
||||
dictGroups.append($(html));
|
||||
});
|
||||
|
||||
$('.dict-enable-terms, .dict-enable.kanji').change(onOptionsChanged);
|
||||
$('.dict-enable-terms, .dict-enable-kanji').change(onOptionsChanged);
|
||||
}).catch(error => {
|
||||
dictError.show().find('span').text(error);
|
||||
}).then(() => {
|
||||
|
@ -77,39 +77,11 @@ class Translator {
|
||||
});
|
||||
}
|
||||
|
||||
findTermGroups(text) {
|
||||
const deinflectGroups = {};
|
||||
const deinflectPromises = [];
|
||||
|
||||
for (let i = text.length; i > 0; --i) {
|
||||
deinflectPromises.push(
|
||||
this.deinflector.deinflect(text.slice(0, i), term => {
|
||||
return this.database.findTerm(term).then(definitions => definitions.map(definition => definition.tags));
|
||||
}).then(deinflects => {
|
||||
const processPromises = [];
|
||||
for (const deinflect of deinflects) {
|
||||
processPromises.push(this.processTerm(
|
||||
deinflectGroups,
|
||||
deinflect.source,
|
||||
deinflect.tags,
|
||||
deinflect.rules,
|
||||
deinflect.root
|
||||
));
|
||||
}
|
||||
|
||||
return Promise.all(processPromises);
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
return Promise.all(deinflectPromises).then(() => deinflectGroups);
|
||||
}
|
||||
|
||||
findTerm(text, enableSoftKatakanaSearch) {
|
||||
return this.findTermGroups(text).then(groups => {
|
||||
findTerm(text, enableSoftKatakanaSearch, dictionaries) {
|
||||
return this.findTermGroups(text, dictionaries).then(groups => {
|
||||
const textHiragana = wanakana._katakanaToHiragana(text);
|
||||
if (text !== textHiragana && enableSoftKatakanaSearch) {
|
||||
return this.findTermGroups(textHiragana).then(groupsHiragana => {
|
||||
return this.findTermGroups(textHiragana, dictionaries).then(groupsHiragana => {
|
||||
for (const key in groupsHiragana) {
|
||||
groups[key] = groups[key] || groupsHiragana[key];
|
||||
}
|
||||
@ -137,13 +109,13 @@ class Translator {
|
||||
});
|
||||
}
|
||||
|
||||
findKanji(text) {
|
||||
findKanji(text, dictionaries) {
|
||||
const processed = {};
|
||||
const promises = [];
|
||||
|
||||
for (const c of text) {
|
||||
if (!processed[c]) {
|
||||
promises.push(this.database.findKanji(c).then((definitions) => definitions));
|
||||
promises.push(this.database.findKanji(c, dictionaries));
|
||||
processed[c] = true;
|
||||
}
|
||||
}
|
||||
@ -151,8 +123,37 @@ class Translator {
|
||||
return Promise.all(promises).then(sets => this.processKanji(sets.reduce((a, b) => a.concat(b), [])));
|
||||
}
|
||||
|
||||
processTerm(groups, source, tags, rules, root) {
|
||||
return this.database.findTerm(root).then(definitions => {
|
||||
findTermGroups(text, dictionaries) {
|
||||
const deinflectGroups = {};
|
||||
const deinflectPromises = [];
|
||||
|
||||
for (let i = text.length; i > 0; --i) {
|
||||
deinflectPromises.push(
|
||||
this.deinflector.deinflect(text.slice(0, i), term => {
|
||||
return this.database.findTerm(term, dictionaries).then(definitions => definitions.map(definition => definition.tags));
|
||||
}).then(deinflects => {
|
||||
const processPromises = [];
|
||||
for (const deinflect of deinflects) {
|
||||
processPromises.push(this.processTerm(
|
||||
deinflectGroups,
|
||||
deinflect.source,
|
||||
deinflect.tags,
|
||||
deinflect.rules,
|
||||
deinflect.root,
|
||||
dictionaries
|
||||
));
|
||||
}
|
||||
|
||||
return Promise.all(processPromises);
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
return Promise.all(deinflectPromises).then(() => deinflectGroups);
|
||||
}
|
||||
|
||||
processTerm(groups, source, tags, rules, root, dictionaries) {
|
||||
return this.database.findTerm(root, dictionaries).then(definitions => {
|
||||
for (const definition of definitions) {
|
||||
if (definition.id in groups) {
|
||||
continue;
|
||||
|
@ -39,6 +39,7 @@ function promiseCallback(promise, callback) {
|
||||
return promise.then(result => {
|
||||
callback({result});
|
||||
}).catch(error => {
|
||||
console.log(error);
|
||||
callback({error});
|
||||
});
|
||||
}
|
||||
|
@ -239,11 +239,31 @@ class Yomichan {
|
||||
}
|
||||
|
||||
api_findKanji({text, callback}) {
|
||||
promiseCallback(this.translator.findKanji(text), callback);
|
||||
const dictionaries = [];
|
||||
for (const title in this.options.dictionaries) {
|
||||
if (this.options.dictionaries[title].enableKanji) {
|
||||
dictionaries.push(title);
|
||||
}
|
||||
}
|
||||
|
||||
promiseCallback(
|
||||
this.translator.findKanji(text, dictionaries),
|
||||
callback
|
||||
);
|
||||
}
|
||||
|
||||
api_findTerm({text, callback}) {
|
||||
promiseCallback(this.translator.findTerm(text, this.options.enableSoftKatakanaSearch), callback);
|
||||
const dictionaries = [];
|
||||
for (const title in this.options.dictionaries) {
|
||||
if (this.options.dictionaries[title].enableTerms) {
|
||||
dictionaries.push(title);
|
||||
}
|
||||
}
|
||||
|
||||
promiseCallback(
|
||||
this.translator.findTerm(text, this.options.enableSoftKatakanaSearch, dictionaries),
|
||||
callback
|
||||
);
|
||||
}
|
||||
|
||||
api_renderText({template, data, callback}) {
|
||||
|
Loading…
Reference in New Issue
Block a user