From 2d526b7ecd365d1a3eb93326ceb04c13c78bb2a3 Mon Sep 17 00:00:00 2001 From: Alex Yatskov Date: Sun, 20 Mar 2016 17:52:14 -0700 Subject: [PATCH] Some work on deinflector --- ext/background.html | 1 + ext/jp/deinflector.js | 133 ++++++++++++++++++++++++++++++++++++++++++ ext/jp/translator.js | 5 +- 3 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 ext/jp/deinflector.js diff --git a/ext/background.html b/ext/background.html index f24cb31c..1cbeefe2 100644 --- a/ext/background.html +++ b/ext/background.html @@ -3,6 +3,7 @@ + diff --git a/ext/jp/deinflector.js b/ext/jp/deinflector.js new file mode 100644 index 00000000..e93da29e --- /dev/null +++ b/ext/jp/deinflector.js @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2016 Alex Yatskov + * Author: Alex Yatskov + * + * 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 . + */ + + +class Deinflection { + constructor(term, tags=[], rule='') { + this.children = []; + this.term = term; + this.tags = tags; + this.rule = rule; + this.success = false; + } + + validate(validator) { + for (const tags of validator(this.term)) { + if (this.tags.length === 0) { + return true; + } + + for (const tag in this.tags) { + if (this.searchTags(tag, tags)) { + return true; + } + } + } + + return false; + } + + deinflect(validator, rules) { + if (this.validate(validator)) { + const child = new Deinflection(this.term); + this.children.push(child); + } + + for (const [rule, variants] of rules) { + for (const variant of variants) { + const tagsIn = variant.tagsIn; + const tagsOut = variant.tagsOut; + const kanaIn = variant.kanaIn; + const kanaOut = variant.kanaOut; + + let allowed = this.tags.length === 0; + for (const tag in this.tags) { + if (this.searchTags(tag, tagsIn)) { + allowed = true; + break; + } + } + + // FIX + // if (!allowed || !this.term.endswith(kanaIn)) { + // continue; + // } + + // FIX + // const term = self.term[:-kanaIn.length] + kanaOut; + // const child = new Deinflection(term, tagsOut, rule); + // if (child.deinflect(validator, rules)) { + // this.children.append(child); + // } + } + } + + return this.children.length > 0; + } + + searchTags(tag, tags) { + for (const t of tags) { + // FIX + if (re.search(tag, t)) { + return true; + } + } + + return false; + } + + gather() { + if (this.children.length === 0) { + return [{root: this.term, rules: []}]; + } + + const paths = []; + for (const child of this.children) { + for (const path in child.gather()) { + if (this.rule.length > 0) { + path.rules.append(this.rule); + } + + path.source = this.term; + paths.push(path); + } + } + + return paths; + } +} + + +class Deinflector { + constructor() { + this.rules = {}; + } + + setRules(rules) { + this.rules = rules; + } + + deinflect(term, validator) { + const node = new Deinflection(term) + if (node.deinflect(validator, this.rules)) { + return node.gather(); + } + + return null; + } +} diff --git a/ext/jp/translator.js b/ext/jp/translator.js index 79f2b369..c69b6786 100644 --- a/ext/jp/translator.js +++ b/ext/jp/translator.js @@ -19,6 +19,7 @@ class Translator { constructor() { this.dictionary = new Dictionary(); + this.deinflector = new Deinflector(); this.initialized = false; } @@ -35,6 +36,8 @@ class Translator { } $.when.apply($, loaders).done((rules, edict, enamdict, kanjidic) => { + this.deinflector.setRules(rules); + this.dictionary.addTermDict(edict[0]); this.dictionary.addTermDict(enamdict[0]); this.dictionary.addKanjiDict(kanjidic[0]); @@ -56,6 +59,6 @@ trans.initialize({ enamdict: 'jp/data/enamdict.json', kanjidic: 'jp/data/kanjidic.json', }, function() { - // alert('Loaded'); + alert('Loaded'); // alert(trans.dictionary.findTerm('猫')); });