• Jump To … +
    abbreviations.js adjectives.js convertables.js dates.js demonyms.js firstnames.js honourifics.js irregular_nouns.js irregular_verbs.js misc.js multiples.js numbers.js organisations.js phrasal_verbs.js places.js uncountables.js verbs.js fns.js index.js lexicon.js negate.js passive_voice.js contractions.js fancy_lumping.js grammar_rules.js parts_of_speech.js phrasal_verbs.js tagger.js word_rules.js question.js sentence.js statement.js tense.js adjective.js to_adverb.js to_comparative.js to_noun.js to_superlative.js adverb.js to_adjective.js is_acronym.js article.js date.js date_rules.js is_date.js parse_date.js is_plural.js is_uncountable.js noun.js is_organisation.js organisation.js gender.js is_person.js parse_name.js person.js is_place.js place.js pluralize.js pronoun.js singularize.js is_value.js numbers.js to_number.js units.js value.js term.js conjugate.js from_infinitive.js predict_form.js suffix_rules.js to_actor.js to_infinitive.js negate.js verb.js sentence_parser.js text.js
  • to_infinitive.js

  • ¶
    '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;
    };
  • ¶

    console.log(to_infinitive(‘underwent’, ‘past’));

    module.exports = to_infinitive;