'use strict';
const irregular_verbs = require('../../../data/irregular_verbs');
let known_verbs = Object.keys(irregular_verbs).reduce(function(h, k) {
Object.keys(irregular_verbs[k]).forEach(function(k2) {
h[irregular_verbs[k][k2]] = k;
});
return h;
}, {});
let rules = {
participle: [
{
reg: /own$/i,
to: 'ow'
},
{
reg: /(.)un([g|k])$/i,
to: '$1in$2'
},
{
reg: /(..)en$/i,
to: '$1e'
},
],
actor: [
{
reg: /(er)er$/i,
to: '$1'
}
],
present: [
{
reg: /(ies)$/i,
to: 'y'
}, {
reg: /(tch|sh)es$/i,
to: '$1'
}, {
reg: /(ss)es$/i,
to: '$1'
}, {
reg: /([tzlshicgrvdnkmu])es$/i,
to: '$1e'
}, {
reg: /(n[dtk]|c[kt]|[eo]n|i[nl]|er|a[ytrl])s$/i,
to: '$1'
}, {
reg: /(ow)s$/i,
to: '$1'
}, {
reg: /(op)s$/i,
to: '$1'
}, {
reg: /([eirs])ts$/i,
to: '$1t'
}, {
reg: /(ll)s$/i,
to: '$1'
}, {
reg: /(el)s$/i,
to: '$1'
}, {
reg: /(ip)es$/i,
to: '$1e'
}, {
reg: /ss$/i,
to: 'ss'
}, {
reg: /s$/i,
to: ''
}],
gerund: [
{
reg: /pping$/i,
to: 'p'
}, {
reg: /lling$/i,
to: 'll'
}, {
reg: /tting$/i,
to: 't'
}, {
reg: /ssing$/i,
to: 'ss'
}, {
reg: /gging$/i,
to: 'g'
}, {
reg: /([^aeiou])ying$/i,
to: '$1y'
}, {
reg: /(i.)ing$/i,
to: '$1e'
}, {
reg: /(u[rtcb]|[bdtpkg]l|n[cg]|a[gdkvtc]|[ua]s|[dr]g|yz|o[rlsp]|cre)ing$/i,
to: '$1e'
}, {
reg: /(ch|sh)ing$/i,
to: '$1'
}, {
reg: /(..)ing$/i,
to: '$1'
}],
past: [
{
reg: /(ued)$/i,
to: 'ue'
}, {
reg: /(e|i)lled$/i,
to: '$1ll'
}, {
reg: /(sh|ch)ed$/i,
to: '$1'
}, {
reg: /(tl|gl)ed$/i,
to: '$1e'
}, {
reg: /(ss)ed$/i,
to: '$1'
}, {
reg: /pped$/i,
to: 'p'
}, {
reg: /tted$/i,
to: 't'
}, {
reg: /gged$/i,
to: 'g'
}, {
reg: /(h|ion|n[dt]|ai.|[cs]t|pp|all|ss|tt|int|ail|ld|en|oo.|er|k|pp|w|ou.|rt|ght|rm)ed$/i,
to: '$1'
}, {
reg: /(..[^aeiou])ed$/i,
to: '$1e'
}, {
reg: /ied$/i,
to: 'y'
}, {
reg: /(.o)ed$/i,
to: '$1o'
}, {
reg: /(.i)ed$/i,
to: '$1'
}, {
reg: /([rl])ew$/i,
to: '$1ow'
}, {
reg: /([pl])t$/i,
to: '$1t'
}]
};
const to_infinitive = function (str, from_tense) {
if (known_verbs[str]) {
return known_verbs[str];
}
if (from_tense === 'infinitive') {
return str;
}
let regs = rules[from_tense] || [];
for(let i = 0; i < regs.length; i++) {
if (str.match(regs[i].reg)) {
return str.replace(regs[i].reg, regs[i].to);
}
}
return str;
};