aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/bg/data/deinflect.json8
-rw-r--r--ext/bg/js/deinflector.js66
-rw-r--r--ext/bg/js/translator.js2
3 files changed, 31 insertions, 45 deletions
diff --git a/ext/bg/data/deinflect.json b/ext/bg/data/deinflect.json
index 256633e0..532f8e62 100644
--- a/ext/bg/data/deinflect.json
+++ b/ext/bg/data/deinflect.json
@@ -2011,14 +2011,6 @@
},
{
"kanaIn": "った",
- "kanaOut": "く",
- "rulesIn": [],
- "rulesOut": [
- "v5"
- ]
- },
- {
- "kanaIn": "った",
"kanaOut": "つ",
"rulesIn": [],
"rulesOut": [
diff --git a/ext/bg/js/deinflector.js b/ext/bg/js/deinflector.js
index 5ed191cd..6e480068 100644
--- a/ext/bg/js/deinflector.js
+++ b/ext/bg/js/deinflector.js
@@ -18,18 +18,18 @@
class Deinflection {
- constructor(term, rules=[], reason='') {
- this.children = [];
+ constructor(term, {rules=[], definitions=[], reason=''} = {}) {
this.term = term;
this.rules = rules;
+ this.definitions = definitions;
this.reason = reason;
- this.definitions = [];
+ this.children = [];
}
- deinflect(definer, reasons, entry=false) {
- const validate = () => {
+ deinflect(definer, reasons) {
+ const define = () => {
return definer(this.term).then(definitions => {
- if (entry) {
+ if (this.rules.length === 0) {
this.definitions = definitions;
} else {
for (const rule of this.rules) {
@@ -45,26 +45,20 @@ class Deinflection {
});
};
- const promises = [
- validate().then(valid => {
- const child = new Deinflection(this.term, this.rules);
- this.children.push(child);
- })
- ];
-
+ const promises = [];
for (const reason in reasons) {
for (const variant of reasons[reason]) {
- let allowed = entry;
- if (!allowed) {
+ let accept = this.rules.length === 0;
+ if (!accept) {
for (const rule of this.rules) {
if (variant.rulesIn.includes(rule)) {
- allowed = true;
+ accept = true;
break;
}
}
}
- if (!allowed || !this.term.endsWith(variant.kanaIn)) {
+ if (!accept || !this.term.endsWith(variant.kanaIn)) {
continue;
}
@@ -73,46 +67,46 @@ class Deinflection {
continue;
}
- const child = new Deinflection(term, variant.rulesOut, reason);
+ const child = new Deinflection(term, {reason, rules: variant.rulesOut});
promises.push(
- child.deinflect(definer, reasons).then(valid => {
- if (valid) {
- this.children.push(child);
- }
- }
- ));
+ child.deinflect(definer, reasons).then(valid => valid && this.children.push(child))
+ );
}
}
- return Promise.all(promises).then(() => {
- return this.children.length > 0;
+ return Promise.all(promises).then(define).then(valid => {
+ if (valid && this.children.length > 0) {
+ const child = new Deinflection(this.term, {rules: this.rules, definitions: this.definitions});
+ this.children.push(child);
+ }
+
+ return valid || this.children.length > 0;
});
}
gather() {
if (this.children.length === 0) {
return [{
- root: this.term,
+ source: this.term,
rules: this.rules,
definitions: this.definitions,
- reasons: []
+ reasons: [this.reason]
}];
}
- const paths = [];
+ const results = [];
for (const child of this.children) {
- for (const path of child.gather()) {
- path.definitions = path.definitions.concat(this.definitions);
+ for (const result of child.gather()) {
if (this.reason.length > 0) {
- path.reasons.push(this.reason);
+ result.reasons.push(this.reason);
}
- path.source = this.term;
- paths.push(path);
+ result.source = this.term;
+ results.push(result);
}
}
- return paths;
+ return results;
}
}
@@ -128,6 +122,6 @@ class Deinflector {
deinflect(term, definer) {
const node = new Deinflection(term);
- return node.deinflect(definer, this.reasons, true).then(success => success ? node.gather() : []);
+ return node.deinflect(definer, this.reasons).then(success => success ? node.gather() : []);
}
}
diff --git a/ext/bg/js/translator.js b/ext/bg/js/translator.js
index 472211e0..0b6b7c2d 100644
--- a/ext/bg/js/translator.js
+++ b/ext/bg/js/translator.js
@@ -105,7 +105,7 @@ class Translator {
return Promise.all(promises).then(() => groups);
}
- processDeinflection(groups, {source, rules, reasons, root, definitions}, dictionaries) {
+ processDeinflection(groups, {source, rules, reasons, definitions}, dictionaries) {
for (const definition of definitions) {
if (definition.id in groups) {
continue;