diff options
author | Alex Yatskov <alex@foosoft.net> | 2016-12-17 18:45:19 -0800 |
---|---|---|
committer | Alex Yatskov <alex@foosoft.net> | 2016-12-17 18:45:19 -0800 |
commit | d98f4566bc856e04f2f6a7d9a7bf49e30867551e (patch) | |
tree | 121da470c382bbd5c3ee58ae3879e49735d82c2d | |
parent | 5c94923264475b08c5b6b3bf37829dec146dd7de (diff) |
WIP
-rw-r--r-- | ext/bg/data/deinflect.json (renamed from ext/bg/data/rules.json) | 0 | ||||
-rw-r--r-- | ext/bg/js/database.js | 18 | ||||
-rw-r--r-- | ext/bg/js/deinflector.js | 46 | ||||
-rw-r--r-- | ext/bg/js/templates.js | 12 | ||||
-rw-r--r-- | ext/bg/js/translator.js | 68 | ||||
-rw-r--r-- | ext/bg/js/util.js | 4 | ||||
-rw-r--r-- | tmpl/kanji.html | 2 | ||||
-rw-r--r-- | tmpl/term.html | 2 |
8 files changed, 74 insertions, 78 deletions
diff --git a/ext/bg/data/rules.json b/ext/bg/data/deinflect.json index 3fd45771..3fd45771 100644 --- a/ext/bg/data/rules.json +++ b/ext/bg/data/deinflect.json diff --git a/ext/bg/js/database.js b/ext/bg/js/database.js index 561da7d8..c8820f4e 100644 --- a/ext/bg/js/database.js +++ b/ext/bg/js/database.js @@ -117,15 +117,15 @@ class Database { } const tagMeta = this.tagMetaCache[dictionary] = {}; - const promise = this.db.tagMeta.where('dictionary').equals(dictionary).each(row => { - tagMeta[row.tag] = { - category: row.category, - notes: row.notes, - order: row.order - }; - }); - - promises.push(promise); + promises.push( + this.db.tagMeta.where('dictionary').equals(dictionary).each(row => { + tagMeta[row.tag] = { + category: row.category, + notes: row.notes, + order: row.order + }; + }) + ); } return Promise.all(promises).then(() => this.tagMetaCache); diff --git a/ext/bg/js/deinflector.js b/ext/bg/js/deinflector.js index 1474e56d..b8646e73 100644 --- a/ext/bg/js/deinflector.js +++ b/ext/bg/js/deinflector.js @@ -18,22 +18,22 @@ class Deinflection { - constructor(term, tags=[], rule='') { + constructor(term, rules=[], reason='') { this.children = []; this.term = term; - this.tags = tags; - this.rule = rule; + this.rules = rules; + this.reason = reason; } validate(validator) { return validator(this.term).then(sets => { - for (const tags of sets) { - if (this.tags.length === 0) { + for (const rules of sets) { + if (this.rules.length === 0) { return true; } - for (const tag of this.tags) { - if (tags.includes(tag)) { + for (const rule of this.rules) { + if (rules.includes(rule)) { return true; } } @@ -43,19 +43,19 @@ class Deinflection { }); } - deinflect(validator, rules) { + deinflect(validator, reasons) { const promises = [ this.validate(validator).then(valid => { - const child = new Deinflection(this.term, this.tags); + const child = new Deinflection(this.term, this.rules); this.children.push(child); }) ]; - for (const rule in rules) { - for (const variant of rules[rule]) { - let allowed = this.tags.length === 0; - for (const tag of this.tags) { - if (variant.tagsIn.includes(tag)) { + for (const reason in reasons) { + for (const variant of reasons[reason]) { + let allowed = this.rules.length === 0; + for (const rule of this.rules) { + if (variant.rulesIn.includes(rule)) { allowed = true; break; } @@ -70,9 +70,9 @@ class Deinflection { continue; } - const child = new Deinflection(term, variant.tagsOut, rule); + const child = new Deinflection(term, variant.rulesOut, reason); promises.push( - child.deinflect(validator, rules).then(valid => { + child.deinflect(validator, reasons).then(valid => { if (valid) { this.children.push(child); } @@ -88,14 +88,14 @@ class Deinflection { gather() { if (this.children.length === 0) { - return [{root: this.term, tags: this.tags, rules: []}]; + return [{root: this.term, rules: this.rules, reasons: []}]; } const paths = []; for (const child of this.children) { for (const path of child.gather()) { - if (this.rule.length > 0) { - path.rules.push(this.rule); + if (this.reason.length > 0) { + path.reasons.push(this.reason); } path.source = this.term; @@ -110,15 +110,15 @@ class Deinflection { class Deinflector { constructor() { - this.rules = {}; + this.reasons = {}; } - setRules(rules) { - this.rules = rules; + setReasons(reasons) { + this.reasons = reasons; } deinflect(term, validator) { const node = new Deinflection(term); - return node.deinflect(validator, this.rules).then(success => success ? node.gather() : []); + return node.deinflect(validator, this.reasons).then(success => success ? node.gather() : []); } } diff --git a/ext/bg/js/templates.js b/ext/bg/js/templates.js index 598d8641..2070f276 100644 --- a/ext/bg/js/templates.js +++ b/ext/bg/js/templates.js @@ -66,11 +66,11 @@ templates['kanji.html'] = template({"1":function(container,depth0,helpers,partia var helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return " <span class=\"tag tag-" - + alias4(((helper = (helper = helpers["class"] || (depth0 != null ? depth0["class"] : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"class","hash":{},"data":data}) : helper))) + + alias4(((helper = (helper = helpers.category || (depth0 != null ? depth0.category : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"category","hash":{},"data":data}) : helper))) + "\" title=\"" - + alias4(((helper = (helper = helpers.desc || (depth0 != null ? depth0.desc : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"desc","hash":{},"data":data}) : helper))) + + alias4(((helper = (helper = helpers.notes || (depth0 != null ? depth0.notes : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"notes","hash":{},"data":data}) : helper))) + "\">" - + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data}) : helper))) + + alias4(((helper = (helper = helpers.tag || (depth0 != null ? depth0.tag : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"tag","hash":{},"data":data}) : helper))) + "</span>\n"; },"8":function(container,depth0,helpers,partials,data) { return " <li><span>" @@ -190,11 +190,11 @@ templates['term.html'] = template({"1":function(container,depth0,helpers,partial var helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return " <span class=\"tag tag-" - + alias4(((helper = (helper = helpers["class"] || (depth0 != null ? depth0["class"] : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"class","hash":{},"data":data}) : helper))) + + alias4(((helper = (helper = helpers.category || (depth0 != null ? depth0.category : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"category","hash":{},"data":data}) : helper))) + "\" title=\"" - + alias4(((helper = (helper = helpers.desc || (depth0 != null ? depth0.desc : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"desc","hash":{},"data":data}) : helper))) + + alias4(((helper = (helper = helpers.notes || (depth0 != null ? depth0.notes : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"notes","hash":{},"data":data}) : helper))) + "\">" - + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data}) : helper))) + + alias4(((helper = (helper = helpers.tag || (depth0 != null ? depth0.tag : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"tag","hash":{},"data":data}) : helper))) + "</span>\n"; },"15":function(container,depth0,helpers,partials,data) { return " <li><span>" diff --git a/ext/bg/js/translator.js b/ext/bg/js/translator.js index e7a739b3..50f9f510 100644 --- a/ext/bg/js/translator.js +++ b/ext/bg/js/translator.js @@ -20,7 +20,7 @@ class Translator { constructor() { this.loaded = false; - this.tagMeta = null; + this.ruleMeta = null; this.database = new Database(); this.deinflector = new Deinflector(); } @@ -31,21 +31,21 @@ class Translator { } const promises = [ - loadJsonInt('bg/data/rules.json'), + loadJsonInt('bg/data/reasons.json'), this.database.prepare() ]; - return Promise.all(promises).then(([rules]) => { - this.deinflector.setRules(rules); + return Promise.all(promises).then(([reasons]) => { + this.deinflector.setReasons(reasons); this.loaded = true; }); } findTerm(text, dictionaries, enableSoftKatakanaSearch) { - return this.findTermGroups(text, dictionaries).then(groups => { + return this.findDeinflectGroups(text, dictionaries).then(groups => { const textHiragana = wanakana._katakanaToHiragana(text); if (text !== textHiragana && enableSoftKatakanaSearch) { - return this.findTermGroups(textHiragana, dictionaries).then(groupsHiragana => { + return this.findDeinflectGroups(textHiragana, dictionaries).then(groupsHiragana => { for (const key in groupsHiragana) { groups[key] = groups[key] || groupsHiragana[key]; } @@ -87,25 +87,27 @@ class Translator { return Promise.all(promises).then(sets => this.processKanji(sets.reduce((a, b) => a.concat(b), []))); } - findTermGroups(text, dictionaries) { + findDeinflectGroups(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)); + return this.database.findTerm(term, dictionaries).then(definitions => definitions.map(definition => definition.rules)); }).then(deinflects => { const processPromises = []; for (const deinflect of deinflects) { - processPromises.push(this.processTerm( - deinflectGroups, - deinflect.source, - deinflect.tags, - deinflect.rules, - deinflect.root, - dictionaries - )); + processPromises.push( + this.processDeinflection( + deinflectGroups, + deinflect.source, + deinflect.rules, + deinflect.reasons, + deinflect.root, + dictionaries + ) + ); } return Promise.all(processPromises); @@ -116,16 +118,16 @@ class Translator { return Promise.all(deinflectPromises).then(() => deinflectGroups); } - processTerm(groups, source, tags, rules, root, dictionaries) { + processDeinflection(groups, source, rules, reasons, root, dictionaries) { return this.database.findTerm(root, dictionaries).then(definitions => { for (const definition of definitions) { if (definition.id in groups) { continue; } - let matched = tags.length === 0; - for (const tag of tags) { - if (definition.tags.includes(tag)) { + let matched = rules.length === 0; + for (const rule of rules) { + if (definition.rules.includes(rule)) { matched = true; break; } @@ -138,26 +140,20 @@ class Translator { const tagItems = []; for (const tag of definition.tags) { const tagItem = { - name: tag, - class: 'default', + tag, + category: 'default', order: Number.MAX_SAFE_INTEGER, - score: 0, - desc: definition.entities[tag] || '', + notes: '' }; - applyTagMeta(tagItem, this.tagMeta); + applyTagMeta(tagItem, definition.tagMeta); tagItems.push(tagItem); } - let score = 0; - for (const tagItem of tagItems) { - score += tagItem.score; - } - groups[definition.id] = { - score, source, - rules, + reasons, + score: definition.score, expression: definition.expression, reading: definition.reading, glossary: definition.glossary, @@ -172,13 +168,13 @@ class Translator { const tagItems = []; for (const tag of definition.tags) { const tagItem = { - name: tag, - class: 'default', + tag, + category: 'default', order: Number.MAX_SAFE_INTEGER, - desc: '', + notes: '' }; - applyTagMeta(tagItem, this.tagMeta); + applyTagMeta(tagItem, definition.tagMeta); tagItems.push(tagItem); } diff --git a/ext/bg/js/util.js b/ext/bg/js/util.js index 3ec80350..dc606a73 100644 --- a/ext/bg/js/util.js +++ b/ext/bg/js/util.js @@ -84,8 +84,8 @@ function sortTermDefs(definitions) { return 1; } - const rl1 = v1.rules.length; - const rl2 = v2.rules.length; + const rl1 = v1.reasons.length; + const rl2 = v2.reasons.length; if (rl1 < rl2) { return -1; } else if (rl1 > rl2) { diff --git a/tmpl/kanji.html b/tmpl/kanji.html index daa825be..c40bb3bc 100644 --- a/tmpl/kanji.html +++ b/tmpl/kanji.html @@ -30,7 +30,7 @@ <div class="kanji-tags"> {{#each tags}} - <span class="tag tag-{{class}}" title="{{desc}}">{{name}}</span> + <span class="tag tag-{{category}}" title="{{notes}}">{{tag}}</span> {{/each}} </div> diff --git a/tmpl/term.html b/tmpl/term.html index 7d60e42a..fb50e7d7 100644 --- a/tmpl/term.html +++ b/tmpl/term.html @@ -23,7 +23,7 @@ <div class="term-tags"> {{#each tags}} - <span class="tag tag-{{class}}" title="{{desc}}">{{name}}</span> + <span class="tag tag-{{category}}" title="{{notes}}">{{tag}}</span> {{/each}} </div> |