From 5362ebc808d553d6e46df57882094cc4d12a2392 Mon Sep 17 00:00:00 2001 From: Steffen Diswal <11992328+spdiswal@users.noreply.github.com> Date: Sun, 3 May 2026 19:12:50 +0200 Subject: [PATCH 1/2] Move list of imperative verbs to a separate file --- .../LegacyV1ImperativeSubjectLines.tests.ts | 14 - .../LegacyV1ImperativeSubjectLines.ts | 4445 +---------------- src/legacy-v1/utilities/IterableUtilities.ts | 19 - src/utilities/Arrays.ts | 19 + src/utilities/Verbs.tests.ts | 12 + src/utilities/Verbs.ts | 4444 ++++++++++++++++ 6 files changed, 4476 insertions(+), 4477 deletions(-) delete mode 100644 src/legacy-v1/rules/ImperativeSubjectLines/LegacyV1ImperativeSubjectLines.tests.ts create mode 100644 src/utilities/Verbs.tests.ts create mode 100644 src/utilities/Verbs.ts diff --git a/src/legacy-v1/rules/ImperativeSubjectLines/LegacyV1ImperativeSubjectLines.tests.ts b/src/legacy-v1/rules/ImperativeSubjectLines/LegacyV1ImperativeSubjectLines.tests.ts deleted file mode 100644 index 456916b4..00000000 --- a/src/legacy-v1/rules/ImperativeSubjectLines/LegacyV1ImperativeSubjectLines.tests.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { describe, expect, it } from "vitest" -import { legacyV1SortedImperativeVerbs } from "#legacy-v1/rules/ImperativeSubjectLines/LegacyV1ImperativeSubjectLines.ts" -import { ALPHABETICALLY } from "#utilities/Arrays.ts" - -describe("the list of imperative verbs", () => { - it("is sorted alphabetically", () => { - const explicitlySortedVerbs = legacyV1SortedImperativeVerbs.toSorted(ALPHABETICALLY) - const unexpectedDifference = legacyV1SortedImperativeVerbs.find( - (value, index) => value !== explicitlySortedVerbs[index], - ) - - expect(unexpectedDifference).toBeUndefined() - }) -}) diff --git a/src/legacy-v1/rules/ImperativeSubjectLines/LegacyV1ImperativeSubjectLines.ts b/src/legacy-v1/rules/ImperativeSubjectLines/LegacyV1ImperativeSubjectLines.ts index b9343378..7de9bf3f 100644 --- a/src/legacy-v1/rules/ImperativeSubjectLines/LegacyV1ImperativeSubjectLines.ts +++ b/src/legacy-v1/rules/ImperativeSubjectLines/LegacyV1ImperativeSubjectLines.ts @@ -1,4446 +1,7 @@ import type { LegacyV1ImperativeSubjectLinesConfiguration } from "#legacy-v1/rules/ImperativeSubjectLines/LegacyV1ImperativeSubjectLinesConfiguration.ts" import type { LegacyV1Commits } from "#legacy-v1/rules/LegacyV1Commit.ts" import type { LegacyV1Rule } from "#legacy-v1/rules/LegacyV1Rule.ts" -import { indexOfFromBinarySearch } from "#legacy-v1/utilities/IterableUtilities.ts" - -export const legacyV1SortedImperativeVerbs: Array = [ - "abandon", - "abase", - "abate", - "abbreviate", - "abdicate", - "abduct", - "aberrate", - "abhor", - "abide", - "abjure", - "abnegate", - "abolish", - "abominate", - "abort", - "abound", - "abridge", - "abscond", - "absolve", - "absorb", - "abstain", - "abstract", - "abuse", - "accede", - "accelerate", - "accent", - "accentuate", - "accept", - "access", - "accessorise", - "accessorize", - "acclaim", - "acclimate", - "acclimatise", - "acclimatize", - "accommodate", - "accompany", - "accomplish", - "accord", - "accost", - "account", - "accredit", - "accrue", - "acculturate", - "accumulate", - "accuse", - "accustom", - "acerbate", - "ache", - "achieve", - "achromatise", - "achromatize", - "acidify", - "acidulate", - "acknowledge", - "acquaint", - "acquiesce", - "acquire", - "acquit", - "act", - "activate", - "actualise", - "actualize", - "actuate", - "adapt", - "add", - "address", - "adduce", - "adhere", - "adjoin", - "adjourn", - "adjudicate", - "adjust", - "administer", - "administrate", - "admire", - "admit", - "admonish", - "adopt", - "adore", - "adorn", - "adsorb", - "adulate", - "adulterate", - "advance", - "advertise", - "advise", - "advocate", - "aerate", - "affect", - "affiliate", - "affirm", - "affix", - "afflict", - "afford", - "afforest", - "affront", - "age", - "agglomerate", - "aggravate", - "aggregate", - "aggrieve", - "agitate", - "agonise", - "agonize", - "agree", - "aid", - "ail", - "aim", - "air", - "airbrush", - "airdrop", - "airlift", - "airmail", - "alarm", - "alert", - "alias", - "alienate", - "align", - "allege", - "allegorise", - "allegorize", - "alleviate", - "allocate", - "allot", - "allow", - "allude", - "allure", - "ally", - "alphabetise", - "alphabetize", - "alter", - "alternate", - "amalgamate", - "amass", - "amaze", - "amble", - "ambush", - "ameliorate", - "amend", - "amnesty", - "amortise", - "amortize", - "amount", - "amplify", - "amputate", - "amuse", - "analogise", - "analogize", - "analyse", - "analyze", - "anchor", - "anesthetise", - "anesthetize", - "anger", - "angle", - "anguish", - "animalise", - "animalize", - "animate", - "annex", - "annihilate", - "annotate", - "announce", - "annoy", - "annualise", - "annualize", - "annul", - "annunciate", - "anoint", - "answer", - "antagonise", - "antagonize", - "antedate", - "anticipate", - "antiquate", - "anycast", - "apologise", - "apologize", - "apostrophise", - "apostrophize", - "appal", - "appall", - "appeal", - "appear", - "appease", - "append", - "appertain", - "applaud", - "apply", - "appoint", - "appraise", - "appreciate", - "apprehend", - "apprentice", - "apprise", - "approach", - "appropriate", - "approve", - "approximate", - "arbitrage", - "arbitrate", - "arch", - "archive", - "argue", - "arise", - "arm", - "armor", - "armour", - "aromatise", - "aromatize", - "arraign", - "arrange", - "arrest", - "arrive", - "arrow", - "articulate", - "ascend", - "ascertain", - "ascribe", - "ask", - "asphalt", - "aspirate", - "aspire", - "assail", - "assassinate", - "assault", - "assay", - "assemble", - "assent", - "assert", - "assess", - "assign", - "assimilate", - "assist", - "associate", - "assort", - "assuage", - "assume", - "assure", - "astonish", - "astound", - "asynchronise", - "asynchronize", - "atomise", - "atomize", - "atone", - "atrophy", - "attach", - "attack", - "attain", - "attempt", - "attend", - "attenuate", - "attest", - "attract", - "attribute", - "attune", - "auction", - "audit", - "audition", - "augment", - "auscultate", - "authenticate", - "author", - "authorise", - "authorize", - "autocreate", - "autodelete", - "autofill", - "autofire", - "autofocus", - "autograph", - "autoindent", - "autojoin", - "automate", - "automerge", - "autoprefix", - "autorelease", - "avail", - "avalanche", - "avenge", - "average", - "avert", - "aviate", - "avoid", - "avow", - "await", - "awake", - "awaken", - "award", - "ax", - "babble", - "baby", - "back", - "backbite", - "backdate", - "backfire", - "backhand", - "backpack", - "backpedal", - "backslap", - "backslide", - "backspace", - "backtrack", - "backwash", - "badger", - "badmouth", - "baffle", - "bag", - "bail", - "bait", - "bake", - "balance", - "bale", - "balk", - "ballast", - "balloon", - "ballyhoo", - "bamboozle", - "ban", - "band", - "bandage", - "banish", - "bank", - "bankroll", - "bankrupt", - "banter", - "bar", - "barbarise", - "barbarize", - "barbecue", - "bare", - "bargain", - "barge", - "bark", - "barnstorm", - "barrage", - "barricade", - "barter", - "base", - "bash", - "bask", - "baste", - "bat", - "batch", - "bath", - "bathe", - "batter", - "battle", - "bawl", - "be", - "beach", - "beam", - "bear", - "beat", - "beautify", - "beckon", - "become", - "bedazzle", - "beep", - "befriend", - "befuddle", - "beg", - "begin", - "begrudge", - "beguile", - "behave", - "behold", - "behoove", - "bejewel", - "belabor", - "belabour", - "beleaguer", - "believe", - "belittle", - "bellow", - "belong", - "belt", - "bemoan", - "bemuse", - "bend", - "benefit", - "benumb", - "bequeath", - "berate", - "bereave", - "beseech", - "beset", - "besiege", - "bespangle", - "bestow", - "bet", - "betray", - "better", - "bevel", - "beware", - "bewilder", - "bewitch", - "bias", - "bid", - "bide", - "bill", - "billow", - "bind", - "bisect", - "bite", - "blab", - "blacken", - "blacklist", - "blackmail", - "blame", - "blank", - "blast", - "blaze", - "blazon", - "bleach", - "bleat", - "bleed", - "blemish", - "blend", - "bless", - "blight", - "blind", - "blindfold", - "blink", - "blister", - "bloat", - "block", - "bloody", - "bloom", - "blossom", - "blot", - "blow", - "blue", - "blunder", - "blur", - "blurt", - "blush", - "board", - "boast", - "boat", - "bob", - "boil", - "bolster", - "bolt", - "bomb", - "bombard", - "bond", - "boo", - "book", - "boom", - "boost", - "boot", - "border", - "bore", - "borrow", - "boss", - "botch", - "bother", - "bottle", - "bounce", - "bound", - "bow", - "bowl", - "box", - "boycott", - "brace", - "brag", - "braid", - "brainwash", - "brake", - "branch", - "brand", - "brave", - "brawl", - "breach", - "break", - "breakfast", - "breathe", - "breed", - "breeze", - "brew", - "bribe", - "bridge", - "brief", - "brighten", - "brim", - "bring", - "brisk", - "bristle", - "broach", - "broadcast", - "broaden", - "bronze", - "brood", - "brown", - "browse", - "bruise", - "brush", - "brutalise", - "brutalize", - "bubble", - "buck", - "buckle", - "bud", - "budge", - "budget", - "buff", - "buffer", - "bug", - "build", - "bulk", - "bully", - "bump", - "bunch", - "bundle", - "bungle", - "bunk", - "buoy", - "burden", - "burgeon", - "burgle", - "burn", - "burnish", - "burrow", - "burst", - "bury", - "bus", - "bust", - "bustle", - "busy", - "butcher", - "butter", - "button", - "buttress", - "buy", - "buzz", - "bypass", - "cable", - "cache", - "cackle", - "cage", - "cajole", - "cake", - "calcify", - "calculate", - "calibrate", - "call", - "calligraph", - "calm", - "camber", - "camouflage", - "camp", - "campaign", - "can", - "cancel", - "cane", - "cannonade", - "canonise", - "canonize", - "canvass", - "cap", - "caper", - "capitalise", - "capitalize", - "capitulate", - "capsize", - "captain", - "captivate", - "capture", - "carbonise", - "carbonize", - "card", - "care", - "careen", - "caress", - "caricature", - "carpet", - "carry", - "cart", - "carve", - "cascade", - "cash", - "cast", - "castigate", - "catalog", - "catapult", - "catch", - "categorise", - "categorize", - "cater", - "cause", - "cauterise", - "cauterize", - "caution", - "cave", - "caw", - "cease", - "ceil", - "celebrate", - "cement", - "censor", - "censure", - "center", - "centralise", - "centralize", - "centre", - "centuplicate", - "certify", - "chain", - "chair", - "chalk", - "challenge", - "chamfer", - "champion", - "chance", - "change", - "channel", - "chant", - "char", - "characterise", - "characterize", - "charge", - "charm", - "chart", - "charter", - "chase", - "chasten", - "chat", - "chatter", - "cheapen", - "cheat", - "check", - "cheer", - "cherish", - "chew", - "chide", - "chill", - "chime", - "chip", - "chirp", - "choke", - "choose", - "chop", - "choreograph", - "chronicle", - "chuck", - "chuckle", - "chum", - "churn", - "circle", - "circulate", - "circumscribe", - "circumvent", - "cite", - "civilise", - "civilize", - "claim", - "clamber", - "clamp", - "clap", - "clarify", - "clash", - "clasp", - "classify", - "clatter", - "claw", - "clean", - "cleanse", - "clear", - "clench", - "click", - "climb", - "clinch", - "cling", - "clip", - "cloak", - "clock", - "clog", - "clone", - "close", - "clothe", - "cloud", - "clown", - "club", - "cluster", - "clutch", - "clutter", - "co-author", - "co-locate", - "co-pilot", - "coach", - "coagulate", - "coarsen", - "coast", - "coat", - "coauthor", - "coax", - "cobble", - "code", - "codify", - "coerce", - "coexist", - "coffer", - "cogitate", - "cohabit", - "coil", - "coin", - "coincide", - "collab", - "collaborate", - "collapse", - "collar", - "collate", - "collect", - "collide", - "collocate", - "collude", - "colocate", - "colonise", - "colonize", - "color", - "colorise", - "colorize", - "colour", - "colourise", - "colourize", - "comb", - "combat", - "combine", - "come", - "comfort", - "command", - "commandeer", - "commemorate", - "commence", - "commend", - "comment", - "commission", - "commit", - "communicate", - "commute", - "compact", - "compare", - "compartmentalise", - "compartmentalize", - "compel", - "compensate", - "compete", - "compile", - "complain", - "complement", - "complete", - "complicate", - "compliment", - "comply", - "compose", - "composite", - "compound", - "comprehend", - "compress", - "comprise", - "compromise", - "compute", - "computerise", - "computerize", - "con", - "concatenate", - "conceal", - "concede", - "conceive", - "concentrate", - "conceptualise", - "conceptualize", - "concern", - "concert", - "conciliate", - "conclude", - "concoct", - "concur", - "condemn", - "condense", - "condescend", - "condition", - "condone", - "conduct", - "confer", - "confess", - "confide", - "configure", - "confine", - "confirm", - "confiscate", - "conflict", - "conform", - "confound", - "confront", - "confuse", - "congeal", - "congest", - "conglomerate", - "conglutinate", - "congratulate", - "congregate", - "conjecture", - "conjugate", - "conjure", - "connect", - "conquer", - "consecrate", - "consent", - "conserve", - "consider", - "consign", - "consist", - "console", - "consolidate", - "conspire", - "constitute", - "constrain", - "constrict", - "construct", - "construe", - "consult", - "consume", - "contact", - "contain", - "contaminate", - "contemplate", - "contend", - "content", - "contest", - "contextualise", - "contextualize", - "continue", - "contort", - "contract", - "contradict", - "contrast", - "contravene", - "contribute", - "contrive", - "control", - "convalesce", - "convene", - "converge", - "converse", - "convert", - "convey", - "convict", - "convince", - "convulse", - "cook", - "cool", - "coop", - "cooperate", - "coordinate", - "cope", - "copilot", - "copperplate", - "copy", - "copyright", - "cork", - "corner", - "correct", - "correlate", - "correspond", - "corroborate", - "corrode", - "corrupt", - "cost", - "cotton", - "couch", - "cough", - "counsel", - "count", - "counter", - "counteract", - "counterbalance", - "counterfeit", - "countermark", - "countersign", - "couple", - "court", - "cover", - "covet", - "cower", - "crack", - "crackle", - "cradle", - "craft", - "cram", - "cramp", - "crane", - "crank", - "crash", - "crave", - "crawl", - "creak", - "crease", - "create", - "credit", - "creep", - "cremate", - "crenelate", - "crest", - "crimp", - "cringe", - "crinkle", - "cripple", - "crisscross", - "criticise", - "criticize", - "critique", - "croak", - "crop", - "cross", - "cross-check", - "cross-examine", - "crosscheck", - "crossexamine", - "crouch", - "crow", - "crowd", - "crown", - "crucify", - "cruise", - "crumb", - "crumble", - "crumple", - "crunch", - "crush", - "cry", - "crystallise", - "crystallize", - "cube", - "cuddle", - "cudgel", - "cuff", - "cull", - "culminate", - "cultivate", - "cup", - "curb", - "curdle", - "cure", - "curl", - "curse", - "curtail", - "curve", - "cushion", - "customise", - "customize", - "cut", - "cycle", - "dab", - "dabble", - "dam", - "damage", - "dampen", - "dance", - "dandle", - "dangle", - "dare", - "darken", - "dart", - "dash", - "date", - "daunt", - "dawdle", - "dawn", - "daydream", - "daze", - "dazzle", - "deactivate", - "deaden", - "deadlock", - "deafen", - "deal", - "deallocate", - "deauthenticate", - "deauthorise", - "deauthorize", - "debase", - "debate", - "debit", - "debug", - "debunk", - "decamp", - "decay", - "deceive", - "decentralise", - "decentralize", - "decide", - "decimalise", - "decimalize", - "decimate", - "decipher", - "deck", - "declare", - "decline", - "decode", - "decommission", - "decompose", - "decompress", - "deconsolidate", - "decontextualise", - "decontextualize", - "decorate", - "decouple", - "decrease", - "decree", - "decry", - "dedent", - "dedicate", - "deduce", - "deduct", - "deduplicate", - "deed", - "deem", - "deepen", - "deface", - "defame", - "default", - "defeat", - "defect", - "defend", - "defer", - "define", - "deflagrate", - "deflate", - "deflect", - "deflower", - "defoliate", - "deforest", - "deform", - "defray", - "defreeze", - "defrost", - "defuse", - "defy", - "degenerate", - "degrade", - "dehumanise", - "dehumanize", - "dehydrate", - "deify", - "deign", - "delay", - "delegate", - "delete", - "deliberate", - "delight", - "delimit", - "delineate", - "deliver", - "delude", - "delve", - "demagnetise", - "demagnetize", - "demand", - "dematerialise", - "dematerialize", - "demobilise", - "demobilize", - "demolish", - "demonstrate", - "demoralise", - "demoralize", - "demote", - "demystify", - "denominate", - "denote", - "denounce", - "dent", - "deny", - "deorbit", - "deoxidise", - "deoxidize", - "depart", - "depend", - "depict", - "deplete", - "deplore", - "deploy", - "depopulate", - "deport", - "depose", - "deposit", - "deprave", - "deprecate", - "depreciate", - "depress", - "deprive", - "depute", - "dequeue", - "derail", - "derezz", - "deride", - "derive", - "derogate", - "descend", - "describe", - "deserialise", - "deserialize", - "desert", - "deserve", - "design", - "designate", - "desire", - "despair", - "despise", - "despond", - "destroy", - "destruct", - "destructure", - "detach", - "detail", - "detain", - "detect", - "deter", - "deteriorate", - "determine", - "detest", - "dethrone", - "detonate", - "detoxicate", - "detract", - "devalue", - "devastate", - "develop", - "deviate", - "devise", - "devitalise", - "devitalize", - "devolve", - "devote", - "devour", - "diagnose", - "dial", - "dice", - "dictate", - "die", - "diff", - "differ", - "differentiate", - "diffract", - "diffuse", - "dig", - "digest", - "digitalise", - "digitalize", - "digitise", - "digitize", - "dignify", - "dilapidate", - "dilate", - "dilute", - "dim", - "dimensionalise", - "dimensionalize", - "diminish", - "dine", - "dip", - "direct", - "dirty", - "disable", - "disabuse", - "disadvantage", - "disagree", - "disallow", - "disappear", - "disappoint", - "disapprove", - "disarm", - "disband", - "disburse", - "discard", - "discern", - "discharge", - "discipline", - "disclaim", - "disclose", - "discolor", - "discolour", - "discompose", - "disconcert", - "disconnect", - "discontinue", - "discount", - "discourage", - "discourse", - "discover", - "discredit", - "discriminate", - "discuss", - "disdain", - "disembark", - "disengage", - "disentangle", - "disfigure", - "disgrace", - "disgruntle", - "disguise", - "disgust", - "dish", - "dishevel", - "dishonor", - "dishonour", - "disillusion", - "disinfect", - "disinherit", - "disintegrate", - "disinterest", - "disjoint", - "dislike", - "dislocate", - "dislodge", - "dismantle", - "dismay", - "dismiss", - "dismount", - "disobey", - "disorder", - "disorganise", - "disorganize", - "disorient", - "disorientate", - "disown", - "dispatch", - "dispel", - "dispense", - "disperse", - "displace", - "display", - "displease", - "dispose", - "dispossess", - "disprove", - "dispute", - "disqualify", - "disregard", - "disrespect", - "disrupt", - "dissatisfy", - "dissect", - "disseminate", - "dissipate", - "dissociate", - "dissolve", - "dissuade", - "distain", - "distance", - "distil", - "distill", - "distinguish", - "distort", - "distract", - "distress", - "distribute", - "distrust", - "disturb", - "disunite", - "ditch", - "dive", - "diverge", - "diversify", - "divert", - "divest", - "divide", - "divorce", - "divulge", - "do", - "dock", - "dockerise", - "dockerize", - "doctor", - "document", - "dodge", - "dog", - "dole", - "domesticate", - "dominate", - "don", - "donate", - "doom", - "dope", - "dot", - "dote", - "double", - "doubt", - "douse", - "down", - "downgrade", - "download", - "downplay", - "doze", - "draft", - "drag", - "drain", - "dramatise", - "dramatize", - "drape", - "draw", - "drawl", - "dread", - "dream", - "dredge", - "drench", - "dress", - "dribble", - "drift", - "drill", - "drink", - "drip", - "drive", - "drizzle", - "drone", - "droop", - "drop", - "drown", - "drowse", - "drug", - "drum", - "dry", - "dub", - "duck", - "dulcify", - "dull", - "dump", - "dupe", - "duplicate", - "dust", - "dwarf", - "dwell", - "dwindle", - "dye", - "eager-load", - "eagerload", - "earn", - "ease", - "eat", - "eavesdrop", - "ebb", - "echo", - "eclipse", - "economise", - "economize", - "edge", - "edit", - "educate", - "efface", - "effect", - "egg", - "eject", - "eke", - "elaborate", - "elapse", - "elate", - "elbow", - "elect", - "electrify", - "electrocute", - "elevate", - "elicit", - "eliminate", - "elongate", - "elucidate", - "elude", - "emaciate", - "email", - "emanate", - "emancipate", - "embark", - "embarrass", - "embed", - "embellish", - "embitter", - "emblazon", - "embody", - "embolden", - "emboss", - "embrace", - "embroider", - "emend", - "emerge", - "emigrate", - "emit", - "emphasise", - "emphasize", - "employ", - "empower", - "empty", - "emulate", - "enable", - "enact", - "encapsulate", - "encase", - "enchant", - "encircle", - "enclose", - "encode", - "encompass", - "encounter", - "encourage", - "encroach", - "encrust", - "encrypt", - "encumber", - "end", - "endanger", - "endear", - "endeavor", - "endeavour", - "endorse", - "endow", - "endure", - "energise", - "energize", - "enervate", - "enfeeble", - "enfold", - "enforce", - "engage", - "engender", - "engineer", - "engrave", - "engross", - "engulf", - "enhance", - "enjoy", - "enlarge", - "enlighten", - "enlist", - "enliven", - "enmesh", - "ennoble", - "enqueue", - "enquire", - "enrage", - "enrapture", - "enrich", - "enrol", - "enroll", - "enshrine", - "ensnare", - "ensue", - "ensure", - "entail", - "entangle", - "enter", - "entertain", - "enthrone", - "enthuse", - "entice", - "entitle", - "entomb", - "entrap", - "entreat", - "entrench", - "entrust", - "entwine", - "enumerate", - "enunciate", - "envelop", - "environmentalise", - "environmentalize", - "envisage", - "envision", - "envy", - "epitomise", - "epitomize", - "equal", - "equalise", - "equalize", - "equate", - "equip", - "eradicate", - "erase", - "erect", - "erode", - "err", - "erupt", - "escalate", - "escape", - "eschew", - "escort", - "espouse", - "essentialise", - "essentialize", - "establish", - "esteem", - "estimate", - "estrange", - "etch", - "evacuate", - "evade", - "evaluate", - "evaporate", - "even", - "evict", - "evidence", - "evince", - "evoke", - "evolve", - "exacerbate", - "exact", - "exaggerate", - "exalt", - "examine", - "exasperate", - "excavate", - "exceed", - "excel", - "except", - "exchange", - "excise", - "excite", - "exclaim", - "exclude", - "excuse", - "execute", - "exemplify", - "exempt", - "exercise", - "exert", - "exfoliate", - "exhale", - "exhaust", - "exhibit", - "exhilarate", - "exhort", - "exhume", - "exile", - "exist", - "exit", - "exonerate", - "expand", - "expatriate", - "expect", - "expedite", - "expel", - "expend", - "experience", - "experiment", - "expire", - "explain", - "explode", - "exploit", - "explore", - "export", - "expose", - "expound", - "express", - "expropriate", - "expurgate", - "extend", - "exterminate", - "extinguish", - "extirpate", - "extol", - "extort", - "extract", - "extradite", - "extrapolate", - "extricate", - "exult", - "eye", - "fabricate", - "face", - "facilitate", - "factor", - "fade", - "fail", - "faint", - "fake", - "fall", - "falsify", - "falter", - "familiarise", - "familiarize", - "fan", - "fancy", - "fantasise", - "fantasize", - "fare", - "farm", - "fascinate", - "fashion", - "fasten", - "fate", - "fathom", - "fatigue", - "fatten", - "fault", - "favor", - "favour", - "fax", - "faze", - "fear", - "feast", - "feather", - "feature", - "federate", - "feed", - "feel", - "feign", - "fell", - "fence", - "fend", - "ferment", - "ferry", - "fertilise", - "fertilize", - "fetch", - "fiddle", - "fidget", - "field", - "fight", - "figure", - "filch", - "file", - "fill", - "film", - "filter", - "finalise", - "finalize", - "finance", - "find", - "fine", - "fine-tune", - "finetune", - "finger", - "finish", - "fire", - "firm", - "fish", - "fit", - "fix", - "fizz", - "fizzle", - "flabbergast", - "flag", - "flail", - "flake", - "flame", - "flank", - "flap", - "flare", - "flash", - "flatten", - "flatter", - "flaunt", - "flavor", - "flavour", - "flaw", - "fleck", - "flee", - "flesh", - "flex", - "flick", - "flicker", - "flinch", - "fling", - "flip", - "flirt", - "flit", - "float", - "flock", - "flog", - "flood", - "floor", - "flop", - "flounce", - "flounder", - "flourish", - "flout", - "flow", - "flower", - "fluctuate", - "flush", - "fluster", - "flute", - "flutter", - "fly", - "foam", - "focus", - "foil", - "foist", - "fold", - "foliate", - "follow", - "foment", - "fool", - "forbid", - "force", - "ford", - "forebode", - "forecast", - "foresee", - "foreshadow", - "forestall", - "foretell", - "forfeit", - "forge", - "forget", - "forgive", - "forgo", - "fork", - "form", - "formalise", - "formalize", - "format", - "formulate", - "forsake", - "fortify", - "forward", - "fossilise", - "fossilize", - "foster", - "foul", - "found", - "fracture", - "fragment", - "frame", - "frank", - "fray", - "free", - "freeze", - "frequent", - "freshen", - "fret", - "friend", - "frighten", - "frill", - "fringe", - "front", - "frost", - "frown", - "fructify", - "frustrate", - "fry", - "fuel", - "fulfil", - "fulfill", - "fulgurate", - "fulminate", - "fumble", - "fume", - "fumigate", - "function", - "fund", - "furbish", - "furl", - "furnish", - "furrow", - "further", - "fuss", - "future-proof", - "futureproof", - "gain", - "gallop", - "galvanise", - "galvanize", - "gamble", - "game", - "gang", - "garner", - "garnish", - "gasp", - "gather", - "gauge", - "gaze", - "gear", - "generalise", - "generalize", - "generate", - "generify", - "gesticulate", - "gesture", - "get", - "ghost", - "gift", - "giggle", - "gild", - "give", - "gladden", - "glamorise", - "glamorize", - "glamourise", - "glamourize", - "glance", - "glare", - "glaze", - "gleam", - "glean", - "glide", - "glimmer", - "glimpse", - "glisten", - "glitter", - "gloat", - "globalise", - "globalize", - "glorify", - "gloss", - "glow", - "glue", - "gnaw", - "go", - "goad", - "gobble", - "goldplate", - "gossip", - "gouge", - "govern", - "grab", - "grace", - "grade", - "graduate", - "graft", - "grant", - "granulate", - "grapple", - "grasp", - "grate", - "gratify", - "gravitate", - "graze", - "grease", - "green", - "greet", - "grieve", - "grill", - "grimace", - "grin", - "grind", - "grip", - "gripe", - "grit", - "groom", - "groove", - "grope", - "ground", - "group", - "grow", - "growl", - "grumble", - "grunt", - "guarantee", - "guard", - "guess", - "guide", - "gulp", - "gush", - "gut", - "gyrate", - "gzip", - "habilitate", - "habituate", - "hack", - "haggle", - "hail", - "hale", - "hallucinate", - "halt", - "halve", - "ham", - "hammer", - "hamper", - "hand", - "handcraft", - "handcuff", - "handicap", - "handle", - "handstamp", - "handwrite", - "hang", - "happen", - "harass", - "harbor", - "harbour", - "hard-code", - "hardcode", - "harden", - "harm", - "harmonise", - "harmonize", - "harness", - "harp", - "harvest", - "hash", - "hasp", - "hassle", - "hasten", - "hatch", - "hate", - "haul", - "haunt", - "have", - "haw", - "hawk", - "hazard", - "haze", - "head", - "headline", - "headquarter", - "heal", - "heap", - "hear", - "hearten", - "heat", - "heave", - "heckle", - "hedge", - "heed", - "heel", - "heft", - "heighten", - "heist", - "helm", - "help", - "hem", - "herald", - "herd", - "hesitate", - "heterodyne", - "hew", - "hex", - "hibernate", - "hiccough", - "hiccup", - "hide", - "highlight", - "hijack", - "hinder", - "hinge", - "hint", - "hire", - "hiss", - "hit", - "hitch", - "hitchhike", - "hoax", - "hobble", - "hog", - "hoist", - "hold", - "hole", - "hollow", - "home", - "homogenise", - "homogenize", - "hone", - "honeycomb", - "honor", - "honour", - "hood", - "hook", - "hoot", - "hoover", - "hop", - "hope", - "horrify", - "hose", - "hospitalise", - "hospitalize", - "host", - "hound", - "house", - "housekeep", - "hover", - "howl", - "huckster", - "huddle", - "hug", - "hulk", - "hull", - "hum", - "humanise", - "humanize", - "humble", - "humidify", - "humiliate", - "humor", - "humour", - "hunch", - "hunger", - "hunt", - "hurl", - "hurry", - "hurt", - "hurtle", - "hush", - "hustle", - "hybridise", - "hybridize", - "hydrate", - "hymn", - "hype", - "hyperbolise", - "hyperbolize", - "hyperventilate", - "hyphenate", - "hypnotise", - "hypnotize", - "hypothesise", - "hypothesize", - "ice", - "idealise", - "idealize", - "identify", - "idle", - "idolise", - "idolize", - "ignite", - "ignore", - "illegalise", - "illegalize", - "illuminate", - "illustrate", - "imagine", - "imbricate", - "imitate", - "immaterialise", - "immaterialize", - "immerse", - "immigrate", - "immobilise", - "immobilize", - "immortalise", - "immortalize", - "immunise", - "immunize", - "impair", - "impale", - "impart", - "impeach", - "impede", - "impel", - "imperil", - "impersonate", - "impinge", - "implant", - "implement", - "implicate", - "implode", - "implore", - "imply", - "import", - "impose", - "impound", - "impoverish", - "impress", - "imprint", - "imprison", - "improve", - "improvise", - "impute", - "inactivate", - "inaugurate", - "incapacitate", - "incarcerate", - "incense", - "inch", - "incinerate", - "incise", - "incite", - "incline", - "include", - "incommode", - "incorporate", - "increase", - "incriminate", - "incubate", - "inculcate", - "inculpate", - "incur", - "indebt", - "indent", - "index", - "indicate", - "indict", - "indispose", - "indite", - "individualise", - "individualize", - "induce", - "indulge", - "indurate", - "industrialise", - "industrialize", - "infect", - "infer", - "infest", - "infiltrate", - "infix", - "inflame", - "inflate", - "inflict", - "influence", - "inform", - "infract", - "infringe", - "infuriate", - "infuscate", - "infuse", - "ingest", - "ingrain", - "inhabit", - "inhale", - "inhere", - "inherit", - "inhibit", - "initial", - "initialise", - "initialize", - "initiate", - "inject", - "injure", - "ink", - "inlay", - "inline", - "innovate", - "input", - "inquire", - "inscribe", - "insert", - "insinuate", - "insist", - "insolate", - "inspect", - "inspire", - "install", - "instantiate", - "instigate", - "instil", - "instill", - "institute", - "institutionalise", - "institutionalize", - "instruct", - "instrument", - "insulate", - "insult", - "insure", - "integrate", - "intend", - "intensify", - "interact", - "intercept", - "interchange", - "interconnect", - "interest", - "interface", - "interfere", - "interiorise", - "interiorize", - "interject", - "interlace", - "interleave", - "interlink", - "interlock", - "intermediate", - "intermix", - "intern", - "internalise", - "internalize", - "internationalise", - "internationalize", - "interpolate", - "interpose", - "interpret", - "interrelate", - "interrogate", - "interrupt", - "intersect", - "intersperse", - "intertwine", - "intervene", - "interview", - "interweave", - "intimidate", - "intonate", - "intone", - "intoxicate", - "intrigue", - "introduce", - "intromit", - "introspect", - "introvert", - "intrude", - "intuit", - "inundate", - "inure", - "invade", - "invalidate", - "invent", - "inventory", - "invert", - "invest", - "investigate", - "invigilate", - "invigorate", - "invite", - "invoice", - "invoke", - "involve", - "ionise", - "ionize", - "irk", - "iron", - "irradiate", - "irrigate", - "irritate", - "isolate", - "issue", - "italicise", - "italicize", - "itch", - "itemise", - "itemize", - "iterate", - "jab", - "jail", - "jailbreak", - "jam", - "jar", - "jeer", - "jellify", - "jelly", - "jeopardise", - "jeopardize", - "jest", - "jet", - "jettison", - "jetty", - "jib", - "jig", - "jingle", - "jinx", - "jive", - "jog", - "join", - "joke", - "jolly", - "jolt", - "jostle", - "jot", - "journal", - "journey", - "jubilate", - "judge", - "juggle", - "jumble", - "jump", - "jump-start", - "jumpstart", - "justify", - "juxtapose", - "kamikaze", - "keep", - "kerb", - "kern", - "kick", - "kickstart", - "kid", - "kidnap", - "kill", - "kindle", - "kinescope", - "kiss", - "kite", - "kneel", - "knight", - "knit", - "knock", - "knockdown", - "knot", - "know", - "knuckle", - "kudos", - "label", - "labor", - "labour", - "lace", - "lack", - "ladder", - "lag", - "lament", - "laminate", - "land", - "landscape", - "language", - "lantern", - "lap", - "lapse", - "lash", - "lasso", - "last", - "latch", - "lateralise", - "lateralize", - "lattice", - "laud", - "laugh", - "launch", - "launder", - "lavish", - "lay", - "layer", - "lazy-load", - "lazyload", - "leach", - "lead", - "leak", - "lean", - "leap", - "leapfrog", - "learn", - "lease", - "leash", - "leave", - "lecture", - "leech", - "leer", - "left-align", - "legalise", - "legalize", - "legislate", - "legitimatise", - "legitimatize", - "legitimise", - "legitimize", - "lend", - "lengthen", - "lessen", - "let", - "level", - "lever", - "leverage", - "levitate", - "levy", - "lexicalise", - "lexicalize", - "liberate", - "license", - "lie", - "lift", - "light", - "lighten", - "like", - "liken", - "limit", - "limp", - "line", - "linearise", - "linearize", - "linger", - "link", - "liquefy", - "liquidate", - "liquify", - "lisp", - "list", - "listen", - "lithograph", - "litigate", - "litter", - "live", - "load", - "loan", - "loathe", - "lob", - "lobby", - "localise", - "localize", - "locate", - "lock", - "lodge", - "log", - "loiter", - "long", - "look", - "loom", - "loop", - "loosen", - "loot", - "lose", - "louden", - "lounge", - "love", - "lower", - "lull", - "lullaby", - "lumber", - "luminate", - "luminesce", - "lump", - "lunge", - "lurch", - "lurk", - "lynch", - "magnetise", - "magnetize", - "magnify", - "mail", - "maim", - "maintain", - "make", - "man", - "manage", - "maneuver", - "mangle", - "manicure", - "manifest", - "manipulate", - "mantle", - "manufacture", - "map", - "march", - "marginalise", - "marginalize", - "marinate", - "mark", - "market", - "maroon", - "marry", - "marshal", - "marvel", - "mash", - "mask", - "masquerade", - "mass", - "massacre", - "massage", - "master", - "mastermind", - "match", - "materialise", - "materialize", - "matter", - "mature", - "maul", - "maximise", - "maximize", - "mean", - "meander", - "measure", - "meddle", - "mediate", - "meet", - "mellow", - "melt", - "memoise", - "memoize", - "memorise", - "memorize", - "mend", - "mention", - "mentor", - "merge", - "merit", - "mesmerise", - "mesmerize", - "mess", - "migrate", - "milk", - "mill", - "mimic", - "mince", - "mind", - "mine", - "mingle", - "minify", - "minimise", - "minimize", - "mint", - "mirror", - "misdirect", - "misinterpret", - "misjudge", - "mislay", - "mislead", - "mislexicalise", - "mislexicalize", - "misparse", - "misplace", - "misrepresent", - "miss", - "misspeak", - "misspell", - "mistake", - "mistokenise", - "mistokenize", - "mistreat", - "mistrust", - "misunderstand", - "misuse", - "mitigate", - "mix", - "mob", - "mobilise", - "mobilize", - "mock", - "model", - "moderate", - "modernise", - "modernize", - "modify", - "modularise", - "modularize", - "modulate", - "moisten", - "mold", - "monetise", - "monetize", - "monitor", - "monkey", - "monopolise", - "monopolize", - "moor", - "mop", - "mope", - "moralise", - "moralize", - "mortgage", - "mortify", - "motion", - "motivate", - "motorise", - "motorize", - "mount", - "mourn", - "mouth", - "move", - "mow", - "muddle", - "muffle", - "mug", - "multicast", - "multiply", - "mumble", - "murder", - "murmur", - "muscle", - "muse", - "muster", - "mutate", - "mute", - "mutilate", - "mutter", - "muzzle", - "mystify", - "nab", - "nag", - "nail", - "name", - "namedrop", - "namespace", - "nap", - "narrate", - "narrow", - "navigate", - "near", - "neaten", - "necessitate", - "need", - "needle", - "negate", - "neglect", - "negotiate", - "nerf", - "nest", - "nestle", - "net", - "network", - "neuralise", - "neuralize", - "neutralise", - "neutralize", - "nibble", - "nicen", - "nick", - "nickname", - "ninja", - "nip", - "nitpick", - "nix", - "nod", - "noiseproof", - "nomenclate", - "nominalise", - "nominalize", - "nominate", - "nondimensionalise", - "nondimensionalize", - "nonlinearise", - "nonlinearize", - "normalise", - "normalize", - "nose", - "nosedive", - "notch", - "note", - "notice", - "notify", - "nourish", - "novelise", - "novelize", - "nuance", - "nudge", - "nuke", - "nullify", - "numb", - "number", - "numerate", - "numericalise", - "numericalize", - "numericise", - "numericize", - "nurse", - "nurture", - "nuzzle", - "obey", - "obfuscate", - "object", - "objectify", - "obligate", - "oblige", - "obliterate", - "obscure", - "observe", - "obsess", - "obstruct", - "obtain", - "obtrude", - "obtund", - "obturate", - "obviate", - "occasion", - "occlude", - "occult", - "occupy", - "occur", - "offend", - "offer", - "officiate", - "offload", - "offset", - "oil", - "omit", - "ooze", - "opacify", - "open", - "operate", - "oppose", - "oppress", - "opt", - "optimise", - "optimize", - "orange", - "orbit", - "orchestrate", - "ordain", - "order", - "ordinate", - "organise", - "organize", - "orient", - "orientate", - "originate", - "ornament", - "orphan", - "oscillate", - "oust", - "outclass", - "outdent", - "outfigure", - "outgrow", - "outguess", - "outlaw", - "outline", - "outlive", - "outmatch", - "outnumber", - "outperform", - "output", - "outrage", - "outrank", - "outrival", - "outrun", - "outscore", - "outsell", - "outshine", - "outsmart", - "outsource", - "outstretch", - "outthink", - "outweigh", - "overachieve", - "overact", - "overbid", - "overburden", - "overcharge", - "overclock", - "overcome", - "overcompensate", - "overcrowd", - "overdo", - "overdose", - "overdrive", - "overeat", - "overemphasise", - "overemphasize", - "overestimate", - "overexert", - "overflow", - "overgeneralise", - "overgeneralize", - "overgrow", - "overhaul", - "overhear", - "overheat", - "overindulge", - "overlap", - "overlay", - "overload", - "overlook", - "overplay", - "overpower", - "overproduce", - "overprotect", - "overrate", - "overreach", - "overreact", - "overrefine", - "override", - "overrule", - "overrun", - "oversaturate", - "oversee", - "overshadow", - "overshoot", - "oversimplify", - "oversleep", - "overspecialise", - "overspecialize", - "overspend", - "overstate", - "overstock", - "oversupply", - "overtake", - "overthrow", - "overturn", - "overuse", - "overvalue", - "overwhelm", - "overwrite", - "owe", - "own", - "oxidate", - "oxidise", - "oxidize", - "pace", - "pacify", - "pack", - "package", - "pad", - "paddle", - "padlock", - "page", - "paint", - "pair", - "palliate", - "palm", - "pamper", - "pan", - "panel", - "panic", - "pant", - "paper", - "parachute", - "parade", - "paragon", - "parallelise", - "parallelize", - "paralyse", - "paralyze", - "parameterise", - "parameterize", - "parametrise", - "parametrize", - "paraphrase", - "pardon", - "pare", - "park", - "parley", - "parody", - "parrot", - "parse", - "part", - "participate", - "partition", - "partner", - "pass", - "paste", - "pasteurise", - "pasteurize", - "pasture", - "pat", - "patch", - "patent", - "patrol", - "patronise", - "patronize", - "pattern", - "patternise", - "patternize", - "pause", - "pave", - "paw", - "pay", - "peak", - "peck", - "pedal", - "peek", - "peel", - "peep", - "peer", - "peg", - "pelt", - "penalise", - "penalize", - "pencil", - "penetrate", - "pension", - "pep", - "pepper", - "perceive", - "perch", - "perfect", - "perform", - "perfume", - "perish", - "permeate", - "permit", - "permutate", - "perpetrate", - "perpetuate", - "perplex", - "persecute", - "persevere", - "persist", - "personalise", - "personalize", - "personify", - "persuade", - "pertain", - "perturb", - "peruse", - "pervade", - "pester", - "pet", - "petition", - "petrify", - "phase", - "phone", - "photocopy", - "photograph", - "phrase", - "pick", - "pickle", - "picture", - "pierce", - "pile", - "pillage", - "pilot", - "pin", - "pinch", - "pine", - "pinpoint", - "pioneer", - "pipe", - "pirate", - "pit", - "pitch", - "pity", - "pivot", - "pixelate", - "placate", - "place", - "plagiarise", - "plagiarize", - "plague", - "plan", - "plant", - "plaster", - "plate", - "play", - "plead", - "please", - "pledge", - "plod", - "plot", - "plow", - "pluck", - "plug", - "plummet", - "plump", - "plunder", - "plunge", - "ply", - "poach", - "pocket", - "point", - "poise", - "poison", - "poke", - "polarise", - "polarize", - "police", - "polish", - "poll", - "pollute", - "polymerise", - "polymerize", - "ponder", - "pool", - "pop", - "popularise", - "popularize", - "populate", - "portray", - "pose", - "position", - "possess", - "post", - "postdate", - "postfix", - "postpone", - "postulate", - "pot", - "pounce", - "pound", - "pour", - "pout", - "powder", - "power", - "practice", - "praise", - "prattle", - "pray", - "pre-enact", - "pre-release", - "pre-render", - "preach", - "precede", - "precipitate", - "preclude", - "predetermine", - "predicate", - "predict", - "predispose", - "predominate", - "preen", - "preenact", - "prefer", - "prefigure", - "prefill", - "prefix", - "prejudice", - "prelude", - "premeditate", - "preoccupy", - "prepare", - "prerelease", - "prerender", - "presage", - "prescribe", - "present", - "preserve", - "preside", - "press", - "pressure", - "pressurise", - "pressurize", - "presume", - "presuppose", - "pretend", - "prettify", - "pretty", - "prevail", - "prevaricate", - "prevent", - "preview", - "prey", - "price", - "prick", - "pride", - "prime", - "primp", - "print", - "prise", - "privatise", - "privatize", - "prize", - "probe", - "proceed", - "process", - "proclaim", - "procrastinate", - "procure", - "prod", - "produce", - "profess", - "professionalise", - "professionalize", - "profile", - "profit", - "program", - "progress", - "prohibit", - "project", - "proliferate", - "prolong", - "promise", - "promote", - "prompt", - "promulgate", - "pronounce", - "proofread", - "prop", - "propagate", - "propel", - "proportion", - "propose", - "propulse", - "proscribe", - "prosecute", - "prospect", - "prosper", - "protect", - "protest", - "protract", - "protrude", - "prove", - "provide", - "provoke", - "prowl", - "proxy", - "prune", - "pry", - "publicise", - "publicize", - "publish", - "pucker", - "puff", - "puke", - "pull", - "pulp", - "pulverise", - "pulverize", - "pummel", - "pump", - "punch", - "punctuate", - "puncture", - "punish", - "purchase", - "purge", - "purify", - "purple", - "purport", - "purpose", - "purr", - "purse", - "pursue", - "push", - "put", - "puzzle", - "quack", - "quadruple", - "quake", - "qualify", - "quantify", - "quantise", - "quantize", - "quarantine", - "quarrel", - "quarter", - "quash", - "quave", - "quaver", - "quelch", - "quell", - "quench", - "query", - "question", - "queue", - "quick", - "quick-freeze", - "quicken", - "quickfreeze", - "quiet", - "quieten", - "quip", - "quirk", - "quirl", - "quit", - "quiver", - "quiz", - "quote", - "qwikify", - "race", - "rack", - "radiate", - "rage", - "raid", - "rail", - "rain", - "raise", - "rake", - "rally", - "ram", - "ramble", - "ramify", - "ramp", - "range", - "rank", - "ransack", - "rant", - "rap", - "rarefy", - "rasp", - "rat", - "rate", - "ratify", - "ration", - "rationalise", - "rationalize", - "rattle", - "ravage", - "rave", - "raze", - "re-check", - "re-embark", - "re-emerge", - "re-enable", - "re-enact", - "re-engage", - "re-enlist", - "re-enter", - "re-establish", - "re-evaluate", - "re-examine", - "re-read", - "re-release", - "reabsorb", - "reach", - "react", - "read", - "readjust", - "readmit", - "reaffirm", - "realign", - "realise", - "realize", - "reallocate", - "reanimate", - "reap", - "reappear", - "reapply", - "rear", - "rearrange", - "reascend", - "reason", - "reassemble", - "reassert", - "reassess", - "reassign", - "reassume", - "reassure", - "rebase", - "rebel", - "reboot", - "rebound", - "rebuff", - "rebuild", - "rebuke", - "recall", - "recap", - "recapitulate", - "recapture", - "recast", - "recede", - "receive", - "recess", - "recharge", - "recheck", - "reciprocate", - "recite", - "reckon", - "reclaim", - "recline", - "recognise", - "recognize", - "recoil", - "recollapse", - "recollect", - "recommence", - "recommend", - "recommission", - "recommit", - "recompose", - "reconcile", - "recondition", - "reconfigure", - "reconfirm", - "reconquer", - "reconsider", - "reconsolidate", - "reconstitute", - "reconstruct", - "reconvene", - "reconvert", - "record", - "recount", - "recoup", - "recouple", - "recover", - "recreate", - "recriminate", - "recross", - "recruit", - "rectify", - "recuperate", - "recur", - "recut", - "recycle", - "redden", - "redeem", - "redefine", - "redeploy", - "redesign", - "redevelop", - "redirect", - "rediscover", - "redistribute", - "redo", - "redouble", - "redound", - "redraw", - "reduce", - "reel", - "reembark", - "reemerge", - "reenable", - "reenact", - "reengage", - "reenlist", - "reenter", - "reestablish", - "reevaluate", - "reexamine", - "refactor", - "refer", - "reference", - "refill", - "refine", - "refit", - "reflect", - "reform", - "reformat", - "refract", - "refrain", - "refresh", - "refrigerate", - "refund", - "refurbish", - "refuse", - "refute", - "regain", - "regard", - "regenerate", - "register", - "regress", - "regret", - "regrind", - "regroup", - "regularise", - "regularize", - "regulate", - "regurgitate", - "rehabilitate", - "rehearse", - "reheat", - "reify", - "reign", - "reimburse", - "reimplement", - "reimpose", - "rein", - "reincorporate", - "reinforce", - "reinsert", - "reinstall", - "reinstate", - "reinsure", - "reintegrate", - "reinterpret", - "reintroduce", - "reinvest", - "reissue", - "reiterate", - "reject", - "rejoice", - "rejoin", - "rejuvenate", - "rekindle", - "relapse", - "relate", - "relax", - "relay", - "relearn", - "release", - "relegate", - "relent", - "relieve", - "relinquish", - "relish", - "reload", - "relocate", - "rely", - "remain", - "remand", - "remark", - "remarry", - "remarshal", - "remedy", - "remember", - "remerge", - "remind", - "remit", - "remix", - "remodel", - "remount", - "remove", - "remunerate", - "rename", - "render", - "renege", - "renegotiate", - "renew", - "renounce", - "renovate", - "rent", - "reoccupy", - "reopen", - "reorder", - "reorganise", - "reorganize", - "repack", - "repaint", - "repair", - "repay", - "repeal", - "repeat", - "repel", - "rephrase", - "replace", - "replant", - "replenish", - "replicate", - "reply", - "repolish", - "report", - "repossess", - "represent", - "repress", - "reprieve", - "reprimand", - "reprint", - "reproach", - "reprobate", - "reproduce", - "reprogram", - "republish", - "repudiate", - "repulse", - "repute", - "request", - "requeue", - "require", - "requisition", - "reread", - "rerelease", - "reroute", - "reschedule", - "rescind", - "rescue", - "research", - "reseat", - "resell", - "resemble", - "resent", - "reserve", - "reset", - "reshape", - "reshuffle", - "reside", - "resign", - "resist", - "resize", - "resolve", - "resort", - "resound", - "resow", - "respect", - "respond", - "rest", - "restart", - "restate", - "restore", - "restrain", - "restrict", - "restructure", - "result", - "resume", - "resupply", - "resurface", - "resurrect", - "resuscitate", - "retain", - "retake", - "retaliate", - "reteach", - "retell", - "rethink", - "retire", - "retort", - "retouch", - "retrace", - "retract", - "retranslate", - "retrap", - "retread", - "retreat", - "retrieve", - "retrograde", - "retry", - "return", - "reunite", - "reuse", - "rev", - "revalidate", - "revamp", - "reveal", - "revel", - "reverberate", - "revere", - "reverse", - "revert", - "review", - "revile", - "revise", - "revisit", - "revitalise", - "revitalize", - "revive", - "revoke", - "revolt", - "revolutionise", - "revolutionize", - "revolve", - "reward", - "rework", - "rewrite", - "rhyme", - "rib", - "rid", - "riddle", - "ride", - "ridge", - "ridicule", - "rig", - "right", - "right-align", - "ring", - "rinse", - "riot", - "rip", - "ripple", - "rise", - "risk", - "rival", - "rivet", - "roam", - "roar", - "roast", - "rob", - "robustify", - "rock", - "rocket", - "roll", - "rollback", - "romanise", - "romanize", - "romp", - "root", - "rope", - "rot", - "rotate", - "round", - "rouse", - "route", - "row", - "rub", - "ruffle", - "ruin", - "rule", - "rumble", - "rummage", - "rumple", - "run", - "rupture", - "rush", - "rust", - "rustle", - "sabotage", - "sack", - "sacrifice", - "sadden", - "saddle", - "safeguard", - "sag", - "sail", - "salt", - "salute", - "salvage", - "sample", - "sanction", - "sandwich", - "sanitise", - "sanitize", - "sap", - "sass", - "satisfy", - "saturate", - "saunter", - "save", - "savor", - "savour", - "savvy", - "saw", - "say", - "scaffold", - "scald", - "scale", - "scamper", - "scan", - "scandalise", - "scandalize", - "scar", - "scare", - "scatter", - "scavenge", - "scent", - "schedule", - "school", - "scoff", - "scold", - "scoop", - "scorch", - "score", - "scorn", - "scour", - "scowl", - "scramble", - "scrap", - "scrape", - "scratch", - "scrawl", - "scream", - "screech", - "screen", - "screw", - "scribble", - "scroll", - "scrub", - "scrutinise", - "scrutinize", - "sculpt", - "scurry", - "scuttle", - "seal", - "search", - "season", - "seat", - "seclude", - "secrete", - "secure", - "seduce", - "see", - "seed", - "seek", - "seem", - "seep", - "seethe", - "segment", - "segregate", - "seize", - "select", - "sell", - "send", - "sense", - "sensitise", - "sensitize", - "sentence", - "sentinel", - "separate", - "sequence", - "serialise", - "serialize", - "serve", - "service", - "set", - "settle", - "sever", - "sew", - "shade", - "shadow", - "shake", - "shame", - "shape", - "share", - "sharpen", - "shatter", - "shave", - "shear", - "sheath", - "shed", - "shell", - "shelter", - "shelve", - "shepherd", - "shield", - "shift", - "shimmer", - "shine", - "ship", - "shiver", - "shock", - "shoot", - "shop", - "short-circuit", - "shortcircuit", - "shorten", - "shoulder", - "shout", - "shove", - "show", - "shower", - "shred", - "shriek", - "shrink", - "shrivel", - "shroud", - "shrug", - "shudder", - "shuffle", - "shun", - "shunt", - "shut", - "shutter", - "sicken", - "side", - "sideline", - "sidle", - "sift", - "sigh", - "sight", - "sign", - "signal", - "signify", - "silence", - "silhouette", - "simplify", - "simulate", - "sing", - "singe", - "single", - "sink", - "sip", - "sire", - "sit", - "situate", - "size", - "sizzle", - "skate", - "sketch", - "skew", - "ski", - "skid", - "skim", - "skin", - "skip", - "skirt", - "slacken", - "slam", - "slant", - "slap", - "slash", - "slate", - "slaughter", - "slay", - "sleep", - "slice", - "slide", - "sling", - "slink", - "slip", - "slit", - "slither", - "slope", - "slouch", - "slow", - "slug", - "slump", - "slur", - "smack", - "smash", - "smear", - "smell", - "smile", - "smirk", - "smoke", - "smooth", - "smoothen", - "smother", - "smudge", - "smuggle", - "snake", - "snap", - "snare", - "snarl", - "snatch", - "sneak", - "sneer", - "sneeze", - "snicker", - "sniff", - "snoop", - "snore", - "snort", - "snow", - "snub", - "snuff", - "snug", - "snuggle", - "soak", - "soar", - "sob", - "socialise", - "socialize", - "soften", - "soil", - "solicit", - "solve", - "sooth", - "sophisticate", - "sort", - "sound", - "sour", - "sow", - "space", - "span", - "spare", - "spark", - "sparkle", - "spatialise", - "spatialize", - "spatter", - "spawn", - "speak", - "spear", - "spearhead", - "specialise", - "specialize", - "specify", - "speckle", - "speculate", - "speed", - "spell", - "spend", - "spice", - "spike", - "spill", - "spin", - "spiral", - "spirit", - "spit", - "spite", - "splash", - "splatter", - "splice", - "splinter", - "split", - "splutter", - "spoil", - "sponsor", - "spoon", - "sport", - "spot", - "sprawl", - "spray", - "spread", - "spring", - "sprinkle", - "sprint", - "sprout", - "spur", - "spurn", - "spurt", - "spy", - "squander", - "square", - "squash", - "squat", - "squeak", - "squeal", - "squeeze", - "squint", - "squirm", - "squirt", - "stab", - "stabilise", - "stabilize", - "stable", - "stack", - "staff", - "stage", - "stagger", - "stain", - "stake", - "stalk", - "stall", - "stammer", - "stamp", - "stand", - "standardise", - "standardize", - "stare", - "start", - "startle", - "starve", - "stash", - "state", - "station", - "stave", - "stay", - "steady", - "steal", - "steam", - "steer", - "stem", - "step", - "stereotype", - "sterilise", - "sterilize", - "stick", - "stiffen", - "stifle", - "stigmatise", - "stigmatize", - "stimulate", - "sting", - "stink", - "stipulate", - "stir", - "stitch", - "stock", - "stomp", - "stone", - "stoop", - "stop", - "store", - "storm", - "stow", - "straddle", - "straighten", - "strain", - "strand", - "strangle", - "strap", - "strategise", - "strategize", - "stratify", - "stray", - "streak", - "stream", - "streamline", - "strengthen", - "stress", - "stretch", - "stride", - "strike", - "string", - "stringify", - "strip", - "strive", - "stroke", - "structure", - "struggle", - "strut", - "stub", - "study", - "stuff", - "stumble", - "stump", - "stun", - "stunt", - "stutter", - "style", - "stylise", - "stylize", - "subdivide", - "subdue", - "subject", - "sublet", - "submerge", - "submit", - "subordinate", - "subscribe", - "subset", - "subside", - "subsidise", - "subsidize", - "substantiate", - "substitute", - "subsume", - "subtract", - "subvert", - "succeed", - "succumb", - "sue", - "suffer", - "suffice", - "suffix", - "suffocate", - "suggest", - "suit", - "summarise", - "summarize", - "summon", - "sunset", - "superimpose", - "supersede", - "supervise", - "supplant", - "supplement", - "supply", - "support", - "suppose", - "suppress", - "surface", - "surge", - "surmise", - "surmount", - "surpass", - "surprise", - "surrender", - "surround", - "survey", - "survive", - "suspect", - "suspend", - "sustain", - "swagger", - "swallow", - "swamp", - "swap", - "swarm", - "sway", - "swear", - "sweat", - "sweep", - "sweeten", - "swell", - "swerve", - "swim", - "swing", - "swirl", - "switch", - "swivel", - "swoop", - "symbolise", - "symbolize", - "symlink", - "sympathise", - "sympathize", - "synchronise", - "synchronize", - "synthesise", - "synthesize", - "systematise", - "systematize", - "systemise", - "systemize", - "table", - "tabulate", - "tack", - "tackle", - "tag", - "tail", - "tailor", - "taint", - "take", - "talk", - "tally", - "tame", - "tamper", - "tan", - "tangle", - "tap", - "tape", - "taper", - "tar", - "target", - "tarnish", - "taste", - "tatter", - "tattoo", - "taunt", - "tax", - "taxi", - "teach", - "team", - "tear", - "tease", - "telephone", - "televise", - "tell", - "tempt", - "tend", - "tender", - "tense", - "term", - "terminate", - "terrify", - "terrorise", - "terrorize", - "test", - "testify", - "tether", - "text", - "texture", - "thank", - "thatch", - "thaw", - "theorise", - "theorize", - "thicken", - "thin", - "think", - "thrash", - "thread", - "threaten", - "thrill", - "thrive", - "throb", - "throttle", - "throw", - "thrust", - "thud", - "thumb", - "thump", - "thunder", - "thwart", - "tick", - "tickle", - "tidy", - "tie", - "tighten", - "tile", - "till", - "tilt", - "time", - "tinge", - "tingle", - "tint", - "tip", - "tiptoe", - "tire", - "title", - "toast", - "toggle", - "toil", - "tokenise", - "tokenize", - "tolerate", - "toll", - "tone", - "top", - "topple", - "torment", - "torture", - "toss", - "total", - "totter", - "touch", - "toughen", - "tour", - "tout", - "tow", - "tower", - "toy", - "trace", - "track", - "trade", - "trail", - "train", - "tramp", - "trample", - "transact", - "transcend", - "transcribe", - "transfer", - "transfigure", - "transfix", - "transform", - "transfuse", - "translate", - "transmit", - "transmute", - "transpire", - "transplant", - "transport", - "transpose", - "trap", - "travel", - "traverse", - "tread", - "treasure", - "treat", - "tremble", - "trench", - "trespass", - "triangulate", - "trick", - "trickle", - "trigger", - "trim", - "trip", - "triple", - "triumph", - "trot", - "trouble", - "troubleshoot", - "trudge", - "trump", - "truncate", - "truss", - "trust", - "try", - "tuck", - "tug", - "tumble", - "tune", - "turn", - "tutor", - "tweak", - "twinkle", - "twirl", - "twist", - "twitch", - "type", - "typify", - "tyrannise", - "tyrannize", - "unarm", - "unassign", - "unauthorise", - "unauthorize", - "unbalance", - "unbind", - "unblur", - "unbox", - "unbuckle", - "unbump", - "unbutton", - "uncheck", - "unclog", - "uncollapse", - "uncommit", - "unconsolidate", - "uncouple", - "uncover", - "undeploy", - "underbid", - "undercut", - "underestimate", - "undergo", - "underline", - "undermine", - "underrate", - "underscore", - "undersell", - "understand", - "understate", - "undertake", - "undervalue", - "undo", - "undress", - "unearth", - "unfasten", - "unfocus", - "unfold", - "unfreeze", - "unfurl", - "ungroup", - "unhinge", - "unhitch", - "unhook", - "unicast", - "unify", - "unindent", - "uninstall", - "unite", - "universalise", - "universalize", - "unjoin", - "unknot", - "unlearn", - "unleash", - "unload", - "unlock", - "unmarshal", - "unmask", - "unmerge", - "unpack", - "unpair", - "unpick", - "unplug", - "unravel", - "unrelease", - "unresolve", - "unroll", - "unsaddle", - "unscrew", - "unseal", - "unselect", - "unserialise", - "unserialize", - "unset", - "unsettle", - "unsquash", - "unsubscribe", - "untangle", - "untick", - "untie", - "untrap", - "unveil", - "unwind", - "unwrap", - "unzip", - "unzoom", - "up", - "update", - "upend", - "upgrade", - "uphold", - "upholster", - "uplift", - "upload", - "uproot", - "upsert", - "upset", - "upstage", - "urge", - "use", - "usher", - "usurp", - "utilise", - "utilize", - "utter", - "vacate", - "vaccinate", - "vacuum", - "validate", - "valuate", - "value", - "vandalise", - "vandalize", - "vanish", - "vaporise", - "vaporize", - "vapourise", - "vapourize", - "varnish", - "vary", - "vault", - "veer", - "vegetate", - "venerate", - "vent", - "ventilate", - "venture", - "verbalise", - "verbalize", - "verify", - "vest", - "vet", - "veto", - "vibrate", - "victimise", - "victimize", - "view", - "vindicate", - "violate", - "visit", - "visualise", - "visualize", - "vitalise", - "vitalize", - "vivify", - "voice", - "void", - "volunteer", - "vomit", - "vote", - "vow", - "wad", - "waddle", - "wade", - "wag", - "wage", - "wail", - "wait", - "waive", - "wake", - "waken", - "walk", - "wall", - "wander", - "wane", - "want", - "warm", - "warn", - "warp", - "warrant", - "wash", - "waste", - "watch", - "water", - "waterlog", - "waterproof", - "wave", - "waver", - "wax", - "weaken", - "wean", - "wear", - "weather", - "weave", - "wed", - "wedge", - "weed", - "weep", - "weigh", - "welcome", - "weld", - "whack", - "wheel", - "whimper", - "whine", - "whip", - "whirl", - "whisk", - "whisper", - "whistle", - "whitelist", - "whiten", - "whitewash", - "whittle", - "widen", - "wield", - "wiggle", - "will", - "win", - "wince", - "wind", - "wink", - "wipe", - "wire", - "wish", - "withdraw", - "wither", - "withhold", - "withstand", - "witness", - "wobble", - "wonder", - "woo", - "word", - "work", - "worry", - "worsen", - "worship", - "wound", - "wrap", - "wreck", - "wrench", - "wrestle", - "wriggle", - "wring", - "wrinkle", - "write", - "writhe", - "x-ray", - "xray", - "yak", - "yank", - "yawn", - "yearn", - "yell", - "yellow", - "yelp", - "yield", - "youthen", - "zap", - "zero", - "zigzag", - "zip", - "zone", - "zoom", -] +import { isImperativeVerb } from "#utilities/Verbs.ts" export function legacyV1ImperativeSubjectLines({ whitelist, @@ -4466,7 +27,3 @@ export function legacyV1ImperativeSubjectLines({ function getLeadingWord(refinedSubjectLine: string): string { return refinedSubjectLine.split(" ")[0]?.trim().toLowerCase() ?? "" } - -function isImperativeVerb(word: string): boolean { - return indexOfFromBinarySearch(legacyV1SortedImperativeVerbs, word) !== -1 -} diff --git a/src/legacy-v1/utilities/IterableUtilities.ts b/src/legacy-v1/utilities/IterableUtilities.ts index 894b96d1..a16c22c5 100644 --- a/src/legacy-v1/utilities/IterableUtilities.ts +++ b/src/legacy-v1/utilities/IterableUtilities.ts @@ -1,22 +1,3 @@ -export function indexOfFromBinarySearch(sortedValues: Array, target: string): number { - function binarySearch(inclusiveStartIndex: number, inclusiveEndIndex: number): number { - const middleIndex = Math.floor((inclusiveStartIndex + inclusiveEndIndex) / 2) - const comparison = target.localeCompare(sortedValues[middleIndex] ?? "", "en") - - if (comparison === 0) { - return middleIndex - } - if (inclusiveStartIndex >= inclusiveEndIndex) { - return -1 - } - return comparison < 0 - ? binarySearch(inclusiveStartIndex, middleIndex - 1) - : binarySearch(middleIndex + 1, inclusiveEndIndex) - } - - return binarySearch(0, sortedValues.length - 1) -} - export function countOccurrences(value: string, characterToCount: string): number { return value.split(characterToCount).length - 1 } diff --git a/src/utilities/Arrays.ts b/src/utilities/Arrays.ts index 78f5ccdd..104f1d69 100644 --- a/src/utilities/Arrays.ts +++ b/src/utilities/Arrays.ts @@ -57,3 +57,22 @@ export function findMax(items: NonEmptyArray, comparator: Comparator return maxSoFar } + +export function binarySearchIndexOf(sortedValues: Array, target: string): number { + function binarySearch(inclusiveStartIndex: number, inclusiveEndIndex: number): number { + const middleIndex = Math.floor((inclusiveStartIndex + inclusiveEndIndex) / 2) + const comparison = target.localeCompare(sortedValues[middleIndex] ?? "", "en") + + if (comparison === 0) { + return middleIndex + } + if (inclusiveStartIndex >= inclusiveEndIndex) { + return -1 + } + return comparison < 0 + ? binarySearch(inclusiveStartIndex, middleIndex - 1) + : binarySearch(middleIndex + 1, inclusiveEndIndex) + } + + return binarySearch(0, sortedValues.length - 1) +} diff --git a/src/utilities/Verbs.tests.ts b/src/utilities/Verbs.tests.ts new file mode 100644 index 00000000..bc2957b9 --- /dev/null +++ b/src/utilities/Verbs.tests.ts @@ -0,0 +1,12 @@ +import { expect, it } from "vitest" +import { ALPHABETICALLY } from "#utilities/Arrays.ts" +import { SORTED_IMPERATIVE_VERBS } from "#utilities/Verbs.ts" + +it("has a sorted list of imperative verbs", () => { + const explicitlySortedVerbs = SORTED_IMPERATIVE_VERBS.toSorted(ALPHABETICALLY) + const unexpectedDifference = SORTED_IMPERATIVE_VERBS.find( + (value, index) => value !== explicitlySortedVerbs[index], + ) + + expect(unexpectedDifference).toBeUndefined() +}) diff --git a/src/utilities/Verbs.ts b/src/utilities/Verbs.ts new file mode 100644 index 00000000..0b798dec --- /dev/null +++ b/src/utilities/Verbs.ts @@ -0,0 +1,4444 @@ +import { binarySearchIndexOf } from "#utilities/Arrays.ts" + +export const SORTED_IMPERATIVE_VERBS: Array = [ + "abandon", + "abase", + "abate", + "abbreviate", + "abdicate", + "abduct", + "aberrate", + "abhor", + "abide", + "abjure", + "abnegate", + "abolish", + "abominate", + "abort", + "abound", + "abridge", + "abscond", + "absolve", + "absorb", + "abstain", + "abstract", + "abuse", + "accede", + "accelerate", + "accent", + "accentuate", + "accept", + "access", + "accessorise", + "accessorize", + "acclaim", + "acclimate", + "acclimatise", + "acclimatize", + "accommodate", + "accompany", + "accomplish", + "accord", + "accost", + "account", + "accredit", + "accrue", + "acculturate", + "accumulate", + "accuse", + "accustom", + "acerbate", + "ache", + "achieve", + "achromatise", + "achromatize", + "acidify", + "acidulate", + "acknowledge", + "acquaint", + "acquiesce", + "acquire", + "acquit", + "act", + "activate", + "actualise", + "actualize", + "actuate", + "adapt", + "add", + "address", + "adduce", + "adhere", + "adjoin", + "adjourn", + "adjudicate", + "adjust", + "administer", + "administrate", + "admire", + "admit", + "admonish", + "adopt", + "adore", + "adorn", + "adsorb", + "adulate", + "adulterate", + "advance", + "advertise", + "advise", + "advocate", + "aerate", + "affect", + "affiliate", + "affirm", + "affix", + "afflict", + "afford", + "afforest", + "affront", + "age", + "agglomerate", + "aggravate", + "aggregate", + "aggrieve", + "agitate", + "agonise", + "agonize", + "agree", + "aid", + "ail", + "aim", + "air", + "airbrush", + "airdrop", + "airlift", + "airmail", + "alarm", + "alert", + "alias", + "alienate", + "align", + "allege", + "allegorise", + "allegorize", + "alleviate", + "allocate", + "allot", + "allow", + "allude", + "allure", + "ally", + "alphabetise", + "alphabetize", + "alter", + "alternate", + "amalgamate", + "amass", + "amaze", + "amble", + "ambush", + "ameliorate", + "amend", + "amnesty", + "amortise", + "amortize", + "amount", + "amplify", + "amputate", + "amuse", + "analogise", + "analogize", + "analyse", + "analyze", + "anchor", + "anesthetise", + "anesthetize", + "anger", + "angle", + "anguish", + "animalise", + "animalize", + "animate", + "annex", + "annihilate", + "annotate", + "announce", + "annoy", + "annualise", + "annualize", + "annul", + "annunciate", + "anoint", + "answer", + "antagonise", + "antagonize", + "antedate", + "anticipate", + "antiquate", + "anycast", + "apologise", + "apologize", + "apostrophise", + "apostrophize", + "appal", + "appall", + "appeal", + "appear", + "appease", + "append", + "appertain", + "applaud", + "apply", + "appoint", + "appraise", + "appreciate", + "apprehend", + "apprentice", + "apprise", + "approach", + "appropriate", + "approve", + "approximate", + "arbitrage", + "arbitrate", + "arch", + "archive", + "argue", + "arise", + "arm", + "armor", + "armour", + "aromatise", + "aromatize", + "arraign", + "arrange", + "arrest", + "arrive", + "arrow", + "articulate", + "ascend", + "ascertain", + "ascribe", + "ask", + "asphalt", + "aspirate", + "aspire", + "assail", + "assassinate", + "assault", + "assay", + "assemble", + "assent", + "assert", + "assess", + "assign", + "assimilate", + "assist", + "associate", + "assort", + "assuage", + "assume", + "assure", + "astonish", + "astound", + "asynchronise", + "asynchronize", + "atomise", + "atomize", + "atone", + "atrophy", + "attach", + "attack", + "attain", + "attempt", + "attend", + "attenuate", + "attest", + "attract", + "attribute", + "attune", + "auction", + "audit", + "audition", + "augment", + "auscultate", + "authenticate", + "author", + "authorise", + "authorize", + "autocreate", + "autodelete", + "autofill", + "autofire", + "autofocus", + "autograph", + "autoindent", + "autojoin", + "automate", + "automerge", + "autoprefix", + "autorelease", + "avail", + "avalanche", + "avenge", + "average", + "avert", + "aviate", + "avoid", + "avow", + "await", + "awake", + "awaken", + "award", + "ax", + "babble", + "baby", + "back", + "backbite", + "backdate", + "backfire", + "backhand", + "backpack", + "backpedal", + "backslap", + "backslide", + "backspace", + "backtrack", + "backwash", + "badger", + "badmouth", + "baffle", + "bag", + "bail", + "bait", + "bake", + "balance", + "bale", + "balk", + "ballast", + "balloon", + "ballyhoo", + "bamboozle", + "ban", + "band", + "bandage", + "banish", + "bank", + "bankroll", + "bankrupt", + "banter", + "bar", + "barbarise", + "barbarize", + "barbecue", + "bare", + "bargain", + "barge", + "bark", + "barnstorm", + "barrage", + "barricade", + "barter", + "base", + "bash", + "bask", + "baste", + "bat", + "batch", + "bath", + "bathe", + "batter", + "battle", + "bawl", + "be", + "beach", + "beam", + "bear", + "beat", + "beautify", + "beckon", + "become", + "bedazzle", + "beep", + "befriend", + "befuddle", + "beg", + "begin", + "begrudge", + "beguile", + "behave", + "behold", + "behoove", + "bejewel", + "belabor", + "belabour", + "beleaguer", + "believe", + "belittle", + "bellow", + "belong", + "belt", + "bemoan", + "bemuse", + "bend", + "benefit", + "benumb", + "bequeath", + "berate", + "bereave", + "beseech", + "beset", + "besiege", + "bespangle", + "bestow", + "bet", + "betray", + "better", + "bevel", + "beware", + "bewilder", + "bewitch", + "bias", + "bid", + "bide", + "bill", + "billow", + "bind", + "bisect", + "bite", + "blab", + "blacken", + "blacklist", + "blackmail", + "blame", + "blank", + "blast", + "blaze", + "blazon", + "bleach", + "bleat", + "bleed", + "blemish", + "blend", + "bless", + "blight", + "blind", + "blindfold", + "blink", + "blister", + "bloat", + "block", + "bloody", + "bloom", + "blossom", + "blot", + "blow", + "blue", + "blunder", + "blur", + "blurt", + "blush", + "board", + "boast", + "boat", + "bob", + "boil", + "bolster", + "bolt", + "bomb", + "bombard", + "bond", + "boo", + "book", + "boom", + "boost", + "boot", + "border", + "bore", + "borrow", + "boss", + "botch", + "bother", + "bottle", + "bounce", + "bound", + "bow", + "bowl", + "box", + "boycott", + "brace", + "brag", + "braid", + "brainwash", + "brake", + "branch", + "brand", + "brave", + "brawl", + "breach", + "break", + "breakfast", + "breathe", + "breed", + "breeze", + "brew", + "bribe", + "bridge", + "brief", + "brighten", + "brim", + "bring", + "brisk", + "bristle", + "broach", + "broadcast", + "broaden", + "bronze", + "brood", + "brown", + "browse", + "bruise", + "brush", + "brutalise", + "brutalize", + "bubble", + "buck", + "buckle", + "bud", + "budge", + "budget", + "buff", + "buffer", + "bug", + "build", + "bulk", + "bully", + "bump", + "bunch", + "bundle", + "bungle", + "bunk", + "buoy", + "burden", + "burgeon", + "burgle", + "burn", + "burnish", + "burrow", + "burst", + "bury", + "bus", + "bust", + "bustle", + "busy", + "butcher", + "butter", + "button", + "buttress", + "buy", + "buzz", + "bypass", + "cable", + "cache", + "cackle", + "cage", + "cajole", + "cake", + "calcify", + "calculate", + "calibrate", + "call", + "calligraph", + "calm", + "camber", + "camouflage", + "camp", + "campaign", + "can", + "cancel", + "cane", + "cannonade", + "canonise", + "canonize", + "canvass", + "cap", + "caper", + "capitalise", + "capitalize", + "capitulate", + "capsize", + "captain", + "captivate", + "capture", + "carbonise", + "carbonize", + "card", + "care", + "careen", + "caress", + "caricature", + "carpet", + "carry", + "cart", + "carve", + "cascade", + "cash", + "cast", + "castigate", + "catalog", + "catapult", + "catch", + "categorise", + "categorize", + "cater", + "cause", + "cauterise", + "cauterize", + "caution", + "cave", + "caw", + "cease", + "ceil", + "celebrate", + "cement", + "censor", + "censure", + "center", + "centralise", + "centralize", + "centre", + "centuplicate", + "certify", + "chain", + "chair", + "chalk", + "challenge", + "chamfer", + "champion", + "chance", + "change", + "channel", + "chant", + "char", + "characterise", + "characterize", + "charge", + "charm", + "chart", + "charter", + "chase", + "chasten", + "chat", + "chatter", + "cheapen", + "cheat", + "check", + "cheer", + "cherish", + "chew", + "chide", + "chill", + "chime", + "chip", + "chirp", + "choke", + "choose", + "chop", + "choreograph", + "chronicle", + "chuck", + "chuckle", + "chum", + "churn", + "circle", + "circulate", + "circumscribe", + "circumvent", + "cite", + "civilise", + "civilize", + "claim", + "clamber", + "clamp", + "clap", + "clarify", + "clash", + "clasp", + "classify", + "clatter", + "claw", + "clean", + "cleanse", + "clear", + "clench", + "click", + "climb", + "clinch", + "cling", + "clip", + "cloak", + "clock", + "clog", + "clone", + "close", + "clothe", + "cloud", + "clown", + "club", + "cluster", + "clutch", + "clutter", + "co-author", + "co-locate", + "co-pilot", + "coach", + "coagulate", + "coarsen", + "coast", + "coat", + "coauthor", + "coax", + "cobble", + "code", + "codify", + "coerce", + "coexist", + "coffer", + "cogitate", + "cohabit", + "coil", + "coin", + "coincide", + "collab", + "collaborate", + "collapse", + "collar", + "collate", + "collect", + "collide", + "collocate", + "collude", + "colocate", + "colonise", + "colonize", + "color", + "colorise", + "colorize", + "colour", + "colourise", + "colourize", + "comb", + "combat", + "combine", + "come", + "comfort", + "command", + "commandeer", + "commemorate", + "commence", + "commend", + "comment", + "commission", + "commit", + "communicate", + "commute", + "compact", + "compare", + "compartmentalise", + "compartmentalize", + "compel", + "compensate", + "compete", + "compile", + "complain", + "complement", + "complete", + "complicate", + "compliment", + "comply", + "compose", + "composite", + "compound", + "comprehend", + "compress", + "comprise", + "compromise", + "compute", + "computerise", + "computerize", + "con", + "concatenate", + "conceal", + "concede", + "conceive", + "concentrate", + "conceptualise", + "conceptualize", + "concern", + "concert", + "conciliate", + "conclude", + "concoct", + "concur", + "condemn", + "condense", + "condescend", + "condition", + "condone", + "conduct", + "confer", + "confess", + "confide", + "configure", + "confine", + "confirm", + "confiscate", + "conflict", + "conform", + "confound", + "confront", + "confuse", + "congeal", + "congest", + "conglomerate", + "conglutinate", + "congratulate", + "congregate", + "conjecture", + "conjugate", + "conjure", + "connect", + "conquer", + "consecrate", + "consent", + "conserve", + "consider", + "consign", + "consist", + "console", + "consolidate", + "conspire", + "constitute", + "constrain", + "constrict", + "construct", + "construe", + "consult", + "consume", + "contact", + "contain", + "contaminate", + "contemplate", + "contend", + "content", + "contest", + "contextualise", + "contextualize", + "continue", + "contort", + "contract", + "contradict", + "contrast", + "contravene", + "contribute", + "contrive", + "control", + "convalesce", + "convene", + "converge", + "converse", + "convert", + "convey", + "convict", + "convince", + "convulse", + "cook", + "cool", + "coop", + "cooperate", + "coordinate", + "cope", + "copilot", + "copperplate", + "copy", + "copyright", + "cork", + "corner", + "correct", + "correlate", + "correspond", + "corroborate", + "corrode", + "corrupt", + "cost", + "cotton", + "couch", + "cough", + "counsel", + "count", + "counter", + "counteract", + "counterbalance", + "counterfeit", + "countermark", + "countersign", + "couple", + "court", + "cover", + "covet", + "cower", + "crack", + "crackle", + "cradle", + "craft", + "cram", + "cramp", + "crane", + "crank", + "crash", + "crave", + "crawl", + "creak", + "crease", + "create", + "credit", + "creep", + "cremate", + "crenelate", + "crest", + "crimp", + "cringe", + "crinkle", + "cripple", + "crisscross", + "criticise", + "criticize", + "critique", + "croak", + "crop", + "cross", + "cross-check", + "cross-examine", + "crosscheck", + "crossexamine", + "crouch", + "crow", + "crowd", + "crown", + "crucify", + "cruise", + "crumb", + "crumble", + "crumple", + "crunch", + "crush", + "cry", + "crystallise", + "crystallize", + "cube", + "cuddle", + "cudgel", + "cuff", + "cull", + "culminate", + "cultivate", + "cup", + "curb", + "curdle", + "cure", + "curl", + "curse", + "curtail", + "curve", + "cushion", + "customise", + "customize", + "cut", + "cycle", + "dab", + "dabble", + "dam", + "damage", + "dampen", + "dance", + "dandle", + "dangle", + "dare", + "darken", + "dart", + "dash", + "date", + "daunt", + "dawdle", + "dawn", + "daydream", + "daze", + "dazzle", + "deactivate", + "deaden", + "deadlock", + "deafen", + "deal", + "deallocate", + "deauthenticate", + "deauthorise", + "deauthorize", + "debase", + "debate", + "debit", + "debug", + "debunk", + "decamp", + "decay", + "deceive", + "decentralise", + "decentralize", + "decide", + "decimalise", + "decimalize", + "decimate", + "decipher", + "deck", + "declare", + "decline", + "decode", + "decommission", + "decompose", + "decompress", + "deconsolidate", + "decontextualise", + "decontextualize", + "decorate", + "decouple", + "decrease", + "decree", + "decry", + "dedent", + "dedicate", + "deduce", + "deduct", + "deduplicate", + "deed", + "deem", + "deepen", + "deface", + "defame", + "default", + "defeat", + "defect", + "defend", + "defer", + "define", + "deflagrate", + "deflate", + "deflect", + "deflower", + "defoliate", + "deforest", + "deform", + "defray", + "defreeze", + "defrost", + "defuse", + "defy", + "degenerate", + "degrade", + "dehumanise", + "dehumanize", + "dehydrate", + "deify", + "deign", + "delay", + "delegate", + "delete", + "deliberate", + "delight", + "delimit", + "delineate", + "deliver", + "delude", + "delve", + "demagnetise", + "demagnetize", + "demand", + "dematerialise", + "dematerialize", + "demobilise", + "demobilize", + "demolish", + "demonstrate", + "demoralise", + "demoralize", + "demote", + "demystify", + "denominate", + "denote", + "denounce", + "dent", + "deny", + "deorbit", + "deoxidise", + "deoxidize", + "depart", + "depend", + "depict", + "deplete", + "deplore", + "deploy", + "depopulate", + "deport", + "depose", + "deposit", + "deprave", + "deprecate", + "depreciate", + "depress", + "deprive", + "depute", + "dequeue", + "derail", + "derezz", + "deride", + "derive", + "derogate", + "descend", + "describe", + "deserialise", + "deserialize", + "desert", + "deserve", + "design", + "designate", + "desire", + "despair", + "despise", + "despond", + "destroy", + "destruct", + "destructure", + "detach", + "detail", + "detain", + "detect", + "deter", + "deteriorate", + "determine", + "detest", + "dethrone", + "detonate", + "detoxicate", + "detract", + "devalue", + "devastate", + "develop", + "deviate", + "devise", + "devitalise", + "devitalize", + "devolve", + "devote", + "devour", + "diagnose", + "dial", + "dice", + "dictate", + "die", + "diff", + "differ", + "differentiate", + "diffract", + "diffuse", + "dig", + "digest", + "digitalise", + "digitalize", + "digitise", + "digitize", + "dignify", + "dilapidate", + "dilate", + "dilute", + "dim", + "dimensionalise", + "dimensionalize", + "diminish", + "dine", + "dip", + "direct", + "dirty", + "disable", + "disabuse", + "disadvantage", + "disagree", + "disallow", + "disappear", + "disappoint", + "disapprove", + "disarm", + "disband", + "disburse", + "discard", + "discern", + "discharge", + "discipline", + "disclaim", + "disclose", + "discolor", + "discolour", + "discompose", + "disconcert", + "disconnect", + "discontinue", + "discount", + "discourage", + "discourse", + "discover", + "discredit", + "discriminate", + "discuss", + "disdain", + "disembark", + "disengage", + "disentangle", + "disfigure", + "disgrace", + "disgruntle", + "disguise", + "disgust", + "dish", + "dishevel", + "dishonor", + "dishonour", + "disillusion", + "disinfect", + "disinherit", + "disintegrate", + "disinterest", + "disjoint", + "dislike", + "dislocate", + "dislodge", + "dismantle", + "dismay", + "dismiss", + "dismount", + "disobey", + "disorder", + "disorganise", + "disorganize", + "disorient", + "disorientate", + "disown", + "dispatch", + "dispel", + "dispense", + "disperse", + "displace", + "display", + "displease", + "dispose", + "dispossess", + "disprove", + "dispute", + "disqualify", + "disregard", + "disrespect", + "disrupt", + "dissatisfy", + "dissect", + "disseminate", + "dissipate", + "dissociate", + "dissolve", + "dissuade", + "distain", + "distance", + "distil", + "distill", + "distinguish", + "distort", + "distract", + "distress", + "distribute", + "distrust", + "disturb", + "disunite", + "ditch", + "dive", + "diverge", + "diversify", + "divert", + "divest", + "divide", + "divorce", + "divulge", + "do", + "dock", + "dockerise", + "dockerize", + "doctor", + "document", + "dodge", + "dog", + "dole", + "domesticate", + "dominate", + "don", + "donate", + "doom", + "dope", + "dot", + "dote", + "double", + "doubt", + "douse", + "down", + "downgrade", + "download", + "downplay", + "doze", + "draft", + "drag", + "drain", + "dramatise", + "dramatize", + "drape", + "draw", + "drawl", + "dread", + "dream", + "dredge", + "drench", + "dress", + "dribble", + "drift", + "drill", + "drink", + "drip", + "drive", + "drizzle", + "drone", + "droop", + "drop", + "drown", + "drowse", + "drug", + "drum", + "dry", + "dub", + "duck", + "dulcify", + "dull", + "dump", + "dupe", + "duplicate", + "dust", + "dwarf", + "dwell", + "dwindle", + "dye", + "eager-load", + "eagerload", + "earn", + "ease", + "eat", + "eavesdrop", + "ebb", + "echo", + "eclipse", + "economise", + "economize", + "edge", + "edit", + "educate", + "efface", + "effect", + "egg", + "eject", + "eke", + "elaborate", + "elapse", + "elate", + "elbow", + "elect", + "electrify", + "electrocute", + "elevate", + "elicit", + "eliminate", + "elongate", + "elucidate", + "elude", + "emaciate", + "email", + "emanate", + "emancipate", + "embark", + "embarrass", + "embed", + "embellish", + "embitter", + "emblazon", + "embody", + "embolden", + "emboss", + "embrace", + "embroider", + "emend", + "emerge", + "emigrate", + "emit", + "emphasise", + "emphasize", + "employ", + "empower", + "empty", + "emulate", + "enable", + "enact", + "encapsulate", + "encase", + "enchant", + "encircle", + "enclose", + "encode", + "encompass", + "encounter", + "encourage", + "encroach", + "encrust", + "encrypt", + "encumber", + "end", + "endanger", + "endear", + "endeavor", + "endeavour", + "endorse", + "endow", + "endure", + "energise", + "energize", + "enervate", + "enfeeble", + "enfold", + "enforce", + "engage", + "engender", + "engineer", + "engrave", + "engross", + "engulf", + "enhance", + "enjoy", + "enlarge", + "enlighten", + "enlist", + "enliven", + "enmesh", + "ennoble", + "enqueue", + "enquire", + "enrage", + "enrapture", + "enrich", + "enrol", + "enroll", + "enshrine", + "ensnare", + "ensue", + "ensure", + "entail", + "entangle", + "enter", + "entertain", + "enthrone", + "enthuse", + "entice", + "entitle", + "entomb", + "entrap", + "entreat", + "entrench", + "entrust", + "entwine", + "enumerate", + "enunciate", + "envelop", + "environmentalise", + "environmentalize", + "envisage", + "envision", + "envy", + "epitomise", + "epitomize", + "equal", + "equalise", + "equalize", + "equate", + "equip", + "eradicate", + "erase", + "erect", + "erode", + "err", + "erupt", + "escalate", + "escape", + "eschew", + "escort", + "espouse", + "essentialise", + "essentialize", + "establish", + "esteem", + "estimate", + "estrange", + "etch", + "evacuate", + "evade", + "evaluate", + "evaporate", + "even", + "evict", + "evidence", + "evince", + "evoke", + "evolve", + "exacerbate", + "exact", + "exaggerate", + "exalt", + "examine", + "exasperate", + "excavate", + "exceed", + "excel", + "except", + "exchange", + "excise", + "excite", + "exclaim", + "exclude", + "excuse", + "execute", + "exemplify", + "exempt", + "exercise", + "exert", + "exfoliate", + "exhale", + "exhaust", + "exhibit", + "exhilarate", + "exhort", + "exhume", + "exile", + "exist", + "exit", + "exonerate", + "expand", + "expatriate", + "expect", + "expedite", + "expel", + "expend", + "experience", + "experiment", + "expire", + "explain", + "explode", + "exploit", + "explore", + "export", + "expose", + "expound", + "express", + "expropriate", + "expurgate", + "extend", + "exterminate", + "extinguish", + "extirpate", + "extol", + "extort", + "extract", + "extradite", + "extrapolate", + "extricate", + "exult", + "eye", + "fabricate", + "face", + "facilitate", + "factor", + "fade", + "fail", + "faint", + "fake", + "fall", + "falsify", + "falter", + "familiarise", + "familiarize", + "fan", + "fancy", + "fantasise", + "fantasize", + "fare", + "farm", + "fascinate", + "fashion", + "fasten", + "fate", + "fathom", + "fatigue", + "fatten", + "fault", + "favor", + "favour", + "fax", + "faze", + "fear", + "feast", + "feather", + "feature", + "federate", + "feed", + "feel", + "feign", + "fell", + "fence", + "fend", + "ferment", + "ferry", + "fertilise", + "fertilize", + "fetch", + "fiddle", + "fidget", + "field", + "fight", + "figure", + "filch", + "file", + "fill", + "film", + "filter", + "finalise", + "finalize", + "finance", + "find", + "fine", + "fine-tune", + "finetune", + "finger", + "finish", + "fire", + "firm", + "fish", + "fit", + "fix", + "fizz", + "fizzle", + "flabbergast", + "flag", + "flail", + "flake", + "flame", + "flank", + "flap", + "flare", + "flash", + "flatten", + "flatter", + "flaunt", + "flavor", + "flavour", + "flaw", + "fleck", + "flee", + "flesh", + "flex", + "flick", + "flicker", + "flinch", + "fling", + "flip", + "flirt", + "flit", + "float", + "flock", + "flog", + "flood", + "floor", + "flop", + "flounce", + "flounder", + "flourish", + "flout", + "flow", + "flower", + "fluctuate", + "flush", + "fluster", + "flute", + "flutter", + "fly", + "foam", + "focus", + "foil", + "foist", + "fold", + "foliate", + "follow", + "foment", + "fool", + "forbid", + "force", + "ford", + "forebode", + "forecast", + "foresee", + "foreshadow", + "forestall", + "foretell", + "forfeit", + "forge", + "forget", + "forgive", + "forgo", + "fork", + "form", + "formalise", + "formalize", + "format", + "formulate", + "forsake", + "fortify", + "forward", + "fossilise", + "fossilize", + "foster", + "foul", + "found", + "fracture", + "fragment", + "frame", + "frank", + "fray", + "free", + "freeze", + "frequent", + "freshen", + "fret", + "friend", + "frighten", + "frill", + "fringe", + "front", + "frost", + "frown", + "fructify", + "frustrate", + "fry", + "fuel", + "fulfil", + "fulfill", + "fulgurate", + "fulminate", + "fumble", + "fume", + "fumigate", + "function", + "fund", + "furbish", + "furl", + "furnish", + "furrow", + "further", + "fuss", + "future-proof", + "futureproof", + "gain", + "gallop", + "galvanise", + "galvanize", + "gamble", + "game", + "gang", + "garner", + "garnish", + "gasp", + "gather", + "gauge", + "gaze", + "gear", + "generalise", + "generalize", + "generate", + "generify", + "gesticulate", + "gesture", + "get", + "ghost", + "gift", + "giggle", + "gild", + "give", + "gladden", + "glamorise", + "glamorize", + "glamourise", + "glamourize", + "glance", + "glare", + "glaze", + "gleam", + "glean", + "glide", + "glimmer", + "glimpse", + "glisten", + "glitter", + "gloat", + "globalise", + "globalize", + "glorify", + "gloss", + "glow", + "glue", + "gnaw", + "go", + "goad", + "gobble", + "goldplate", + "gossip", + "gouge", + "govern", + "grab", + "grace", + "grade", + "graduate", + "graft", + "grant", + "granulate", + "grapple", + "grasp", + "grate", + "gratify", + "gravitate", + "graze", + "grease", + "green", + "greet", + "grieve", + "grill", + "grimace", + "grin", + "grind", + "grip", + "gripe", + "grit", + "groom", + "groove", + "grope", + "ground", + "group", + "grow", + "growl", + "grumble", + "grunt", + "guarantee", + "guard", + "guess", + "guide", + "gulp", + "gush", + "gut", + "gyrate", + "gzip", + "habilitate", + "habituate", + "hack", + "haggle", + "hail", + "hale", + "hallucinate", + "halt", + "halve", + "ham", + "hammer", + "hamper", + "hand", + "handcraft", + "handcuff", + "handicap", + "handle", + "handstamp", + "handwrite", + "hang", + "happen", + "harass", + "harbor", + "harbour", + "hard-code", + "hardcode", + "harden", + "harm", + "harmonise", + "harmonize", + "harness", + "harp", + "harvest", + "hash", + "hasp", + "hassle", + "hasten", + "hatch", + "hate", + "haul", + "haunt", + "have", + "haw", + "hawk", + "hazard", + "haze", + "head", + "headline", + "headquarter", + "heal", + "heap", + "hear", + "hearten", + "heat", + "heave", + "heckle", + "hedge", + "heed", + "heel", + "heft", + "heighten", + "heist", + "helm", + "help", + "hem", + "herald", + "herd", + "hesitate", + "heterodyne", + "hew", + "hex", + "hibernate", + "hiccough", + "hiccup", + "hide", + "highlight", + "hijack", + "hinder", + "hinge", + "hint", + "hire", + "hiss", + "hit", + "hitch", + "hitchhike", + "hoax", + "hobble", + "hog", + "hoist", + "hold", + "hole", + "hollow", + "home", + "homogenise", + "homogenize", + "hone", + "honeycomb", + "honor", + "honour", + "hood", + "hook", + "hoot", + "hoover", + "hop", + "hope", + "horrify", + "hose", + "hospitalise", + "hospitalize", + "host", + "hound", + "house", + "housekeep", + "hover", + "howl", + "huckster", + "huddle", + "hug", + "hulk", + "hull", + "hum", + "humanise", + "humanize", + "humble", + "humidify", + "humiliate", + "humor", + "humour", + "hunch", + "hunger", + "hunt", + "hurl", + "hurry", + "hurt", + "hurtle", + "hush", + "hustle", + "hybridise", + "hybridize", + "hydrate", + "hymn", + "hype", + "hyperbolise", + "hyperbolize", + "hyperventilate", + "hyphenate", + "hypnotise", + "hypnotize", + "hypothesise", + "hypothesize", + "ice", + "idealise", + "idealize", + "identify", + "idle", + "idolise", + "idolize", + "ignite", + "ignore", + "illegalise", + "illegalize", + "illuminate", + "illustrate", + "imagine", + "imbricate", + "imitate", + "immaterialise", + "immaterialize", + "immerse", + "immigrate", + "immobilise", + "immobilize", + "immortalise", + "immortalize", + "immunise", + "immunize", + "impair", + "impale", + "impart", + "impeach", + "impede", + "impel", + "imperil", + "impersonate", + "impinge", + "implant", + "implement", + "implicate", + "implode", + "implore", + "imply", + "import", + "impose", + "impound", + "impoverish", + "impress", + "imprint", + "imprison", + "improve", + "improvise", + "impute", + "inactivate", + "inaugurate", + "incapacitate", + "incarcerate", + "incense", + "inch", + "incinerate", + "incise", + "incite", + "incline", + "include", + "incommode", + "incorporate", + "increase", + "incriminate", + "incubate", + "inculcate", + "inculpate", + "incur", + "indebt", + "indent", + "index", + "indicate", + "indict", + "indispose", + "indite", + "individualise", + "individualize", + "induce", + "indulge", + "indurate", + "industrialise", + "industrialize", + "infect", + "infer", + "infest", + "infiltrate", + "infix", + "inflame", + "inflate", + "inflict", + "influence", + "inform", + "infract", + "infringe", + "infuriate", + "infuscate", + "infuse", + "ingest", + "ingrain", + "inhabit", + "inhale", + "inhere", + "inherit", + "inhibit", + "initial", + "initialise", + "initialize", + "initiate", + "inject", + "injure", + "ink", + "inlay", + "inline", + "innovate", + "input", + "inquire", + "inscribe", + "insert", + "insinuate", + "insist", + "insolate", + "inspect", + "inspire", + "install", + "instantiate", + "instigate", + "instil", + "instill", + "institute", + "institutionalise", + "institutionalize", + "instruct", + "instrument", + "insulate", + "insult", + "insure", + "integrate", + "intend", + "intensify", + "interact", + "intercept", + "interchange", + "interconnect", + "interest", + "interface", + "interfere", + "interiorise", + "interiorize", + "interject", + "interlace", + "interleave", + "interlink", + "interlock", + "intermediate", + "intermix", + "intern", + "internalise", + "internalize", + "internationalise", + "internationalize", + "interpolate", + "interpose", + "interpret", + "interrelate", + "interrogate", + "interrupt", + "intersect", + "intersperse", + "intertwine", + "intervene", + "interview", + "interweave", + "intimidate", + "intonate", + "intone", + "intoxicate", + "intrigue", + "introduce", + "intromit", + "introspect", + "introvert", + "intrude", + "intuit", + "inundate", + "inure", + "invade", + "invalidate", + "invent", + "inventory", + "invert", + "invest", + "investigate", + "invigilate", + "invigorate", + "invite", + "invoice", + "invoke", + "involve", + "ionise", + "ionize", + "irk", + "iron", + "irradiate", + "irrigate", + "irritate", + "isolate", + "issue", + "italicise", + "italicize", + "itch", + "itemise", + "itemize", + "iterate", + "jab", + "jail", + "jailbreak", + "jam", + "jar", + "jeer", + "jellify", + "jelly", + "jeopardise", + "jeopardize", + "jest", + "jet", + "jettison", + "jetty", + "jib", + "jig", + "jingle", + "jinx", + "jive", + "jog", + "join", + "joke", + "jolly", + "jolt", + "jostle", + "jot", + "journal", + "journey", + "jubilate", + "judge", + "juggle", + "jumble", + "jump", + "jump-start", + "jumpstart", + "justify", + "juxtapose", + "kamikaze", + "keep", + "kerb", + "kern", + "kick", + "kickstart", + "kid", + "kidnap", + "kill", + "kindle", + "kinescope", + "kiss", + "kite", + "kneel", + "knight", + "knit", + "knock", + "knockdown", + "knot", + "know", + "knuckle", + "kudos", + "label", + "labor", + "labour", + "lace", + "lack", + "ladder", + "lag", + "lament", + "laminate", + "land", + "landscape", + "language", + "lantern", + "lap", + "lapse", + "lash", + "lasso", + "last", + "latch", + "lateralise", + "lateralize", + "lattice", + "laud", + "laugh", + "launch", + "launder", + "lavish", + "lay", + "layer", + "lazy-load", + "lazyload", + "leach", + "lead", + "leak", + "lean", + "leap", + "leapfrog", + "learn", + "lease", + "leash", + "leave", + "lecture", + "leech", + "leer", + "left-align", + "legalise", + "legalize", + "legislate", + "legitimatise", + "legitimatize", + "legitimise", + "legitimize", + "lend", + "lengthen", + "lessen", + "let", + "level", + "lever", + "leverage", + "levitate", + "levy", + "lexicalise", + "lexicalize", + "liberate", + "license", + "lie", + "lift", + "light", + "lighten", + "like", + "liken", + "limit", + "limp", + "line", + "linearise", + "linearize", + "linger", + "link", + "liquefy", + "liquidate", + "liquify", + "lisp", + "list", + "listen", + "lithograph", + "litigate", + "litter", + "live", + "load", + "loan", + "loathe", + "lob", + "lobby", + "localise", + "localize", + "locate", + "lock", + "lodge", + "log", + "loiter", + "long", + "look", + "loom", + "loop", + "loosen", + "loot", + "lose", + "louden", + "lounge", + "love", + "lower", + "lull", + "lullaby", + "lumber", + "luminate", + "luminesce", + "lump", + "lunge", + "lurch", + "lurk", + "lynch", + "magnetise", + "magnetize", + "magnify", + "mail", + "maim", + "maintain", + "make", + "man", + "manage", + "maneuver", + "mangle", + "manicure", + "manifest", + "manipulate", + "mantle", + "manufacture", + "map", + "march", + "marginalise", + "marginalize", + "marinate", + "mark", + "market", + "maroon", + "marry", + "marshal", + "marvel", + "mash", + "mask", + "masquerade", + "mass", + "massacre", + "massage", + "master", + "mastermind", + "match", + "materialise", + "materialize", + "matter", + "mature", + "maul", + "maximise", + "maximize", + "mean", + "meander", + "measure", + "meddle", + "mediate", + "meet", + "mellow", + "melt", + "memoise", + "memoize", + "memorise", + "memorize", + "mend", + "mention", + "mentor", + "merge", + "merit", + "mesmerise", + "mesmerize", + "mess", + "migrate", + "milk", + "mill", + "mimic", + "mince", + "mind", + "mine", + "mingle", + "minify", + "minimise", + "minimize", + "mint", + "mirror", + "misdirect", + "misinterpret", + "misjudge", + "mislay", + "mislead", + "mislexicalise", + "mislexicalize", + "misparse", + "misplace", + "misrepresent", + "miss", + "misspeak", + "misspell", + "mistake", + "mistokenise", + "mistokenize", + "mistreat", + "mistrust", + "misunderstand", + "misuse", + "mitigate", + "mix", + "mob", + "mobilise", + "mobilize", + "mock", + "model", + "moderate", + "modernise", + "modernize", + "modify", + "modularise", + "modularize", + "modulate", + "moisten", + "mold", + "monetise", + "monetize", + "monitor", + "monkey", + "monopolise", + "monopolize", + "moor", + "mop", + "mope", + "moralise", + "moralize", + "mortgage", + "mortify", + "motion", + "motivate", + "motorise", + "motorize", + "mount", + "mourn", + "mouth", + "move", + "mow", + "muddle", + "muffle", + "mug", + "multicast", + "multiply", + "mumble", + "murder", + "murmur", + "muscle", + "muse", + "muster", + "mutate", + "mute", + "mutilate", + "mutter", + "muzzle", + "mystify", + "nab", + "nag", + "nail", + "name", + "namedrop", + "namespace", + "nap", + "narrate", + "narrow", + "navigate", + "near", + "neaten", + "necessitate", + "need", + "needle", + "negate", + "neglect", + "negotiate", + "nerf", + "nest", + "nestle", + "net", + "network", + "neuralise", + "neuralize", + "neutralise", + "neutralize", + "nibble", + "nicen", + "nick", + "nickname", + "ninja", + "nip", + "nitpick", + "nix", + "nod", + "noiseproof", + "nomenclate", + "nominalise", + "nominalize", + "nominate", + "nondimensionalise", + "nondimensionalize", + "nonlinearise", + "nonlinearize", + "normalise", + "normalize", + "nose", + "nosedive", + "notch", + "note", + "notice", + "notify", + "nourish", + "novelise", + "novelize", + "nuance", + "nudge", + "nuke", + "nullify", + "numb", + "number", + "numerate", + "numericalise", + "numericalize", + "numericise", + "numericize", + "nurse", + "nurture", + "nuzzle", + "obey", + "obfuscate", + "object", + "objectify", + "obligate", + "oblige", + "obliterate", + "obscure", + "observe", + "obsess", + "obstruct", + "obtain", + "obtrude", + "obtund", + "obturate", + "obviate", + "occasion", + "occlude", + "occult", + "occupy", + "occur", + "offend", + "offer", + "officiate", + "offload", + "offset", + "oil", + "omit", + "ooze", + "opacify", + "open", + "operate", + "oppose", + "oppress", + "opt", + "optimise", + "optimize", + "orange", + "orbit", + "orchestrate", + "ordain", + "order", + "ordinate", + "organise", + "organize", + "orient", + "orientate", + "originate", + "ornament", + "orphan", + "oscillate", + "oust", + "outclass", + "outdent", + "outfigure", + "outgrow", + "outguess", + "outlaw", + "outline", + "outlive", + "outmatch", + "outnumber", + "outperform", + "output", + "outrage", + "outrank", + "outrival", + "outrun", + "outscore", + "outsell", + "outshine", + "outsmart", + "outsource", + "outstretch", + "outthink", + "outweigh", + "overachieve", + "overact", + "overbid", + "overburden", + "overcharge", + "overclock", + "overcome", + "overcompensate", + "overcrowd", + "overdo", + "overdose", + "overdrive", + "overeat", + "overemphasise", + "overemphasize", + "overestimate", + "overexert", + "overflow", + "overgeneralise", + "overgeneralize", + "overgrow", + "overhaul", + "overhear", + "overheat", + "overindulge", + "overlap", + "overlay", + "overload", + "overlook", + "overplay", + "overpower", + "overproduce", + "overprotect", + "overrate", + "overreach", + "overreact", + "overrefine", + "override", + "overrule", + "overrun", + "oversaturate", + "oversee", + "overshadow", + "overshoot", + "oversimplify", + "oversleep", + "overspecialise", + "overspecialize", + "overspend", + "overstate", + "overstock", + "oversupply", + "overtake", + "overthrow", + "overturn", + "overuse", + "overvalue", + "overwhelm", + "overwrite", + "owe", + "own", + "oxidate", + "oxidise", + "oxidize", + "pace", + "pacify", + "pack", + "package", + "pad", + "paddle", + "padlock", + "page", + "paint", + "pair", + "palliate", + "palm", + "pamper", + "pan", + "panel", + "panic", + "pant", + "paper", + "parachute", + "parade", + "paragon", + "parallelise", + "parallelize", + "paralyse", + "paralyze", + "parameterise", + "parameterize", + "parametrise", + "parametrize", + "paraphrase", + "pardon", + "pare", + "park", + "parley", + "parody", + "parrot", + "parse", + "part", + "participate", + "partition", + "partner", + "pass", + "paste", + "pasteurise", + "pasteurize", + "pasture", + "pat", + "patch", + "patent", + "patrol", + "patronise", + "patronize", + "pattern", + "patternise", + "patternize", + "pause", + "pave", + "paw", + "pay", + "peak", + "peck", + "pedal", + "peek", + "peel", + "peep", + "peer", + "peg", + "pelt", + "penalise", + "penalize", + "pencil", + "penetrate", + "pension", + "pep", + "pepper", + "perceive", + "perch", + "perfect", + "perform", + "perfume", + "perish", + "permeate", + "permit", + "permutate", + "perpetrate", + "perpetuate", + "perplex", + "persecute", + "persevere", + "persist", + "personalise", + "personalize", + "personify", + "persuade", + "pertain", + "perturb", + "peruse", + "pervade", + "pester", + "pet", + "petition", + "petrify", + "phase", + "phone", + "photocopy", + "photograph", + "phrase", + "pick", + "pickle", + "picture", + "pierce", + "pile", + "pillage", + "pilot", + "pin", + "pinch", + "pine", + "pinpoint", + "pioneer", + "pipe", + "pirate", + "pit", + "pitch", + "pity", + "pivot", + "pixelate", + "placate", + "place", + "plagiarise", + "plagiarize", + "plague", + "plan", + "plant", + "plaster", + "plate", + "play", + "plead", + "please", + "pledge", + "plod", + "plot", + "plow", + "pluck", + "plug", + "plummet", + "plump", + "plunder", + "plunge", + "ply", + "poach", + "pocket", + "point", + "poise", + "poison", + "poke", + "polarise", + "polarize", + "police", + "polish", + "poll", + "pollute", + "polymerise", + "polymerize", + "ponder", + "pool", + "pop", + "popularise", + "popularize", + "populate", + "portray", + "pose", + "position", + "possess", + "post", + "postdate", + "postfix", + "postpone", + "postulate", + "pot", + "pounce", + "pound", + "pour", + "pout", + "powder", + "power", + "practice", + "praise", + "prattle", + "pray", + "pre-enact", + "pre-release", + "pre-render", + "preach", + "precede", + "precipitate", + "preclude", + "predetermine", + "predicate", + "predict", + "predispose", + "predominate", + "preen", + "preenact", + "prefer", + "prefigure", + "prefill", + "prefix", + "prejudice", + "prelude", + "premeditate", + "preoccupy", + "prepare", + "prerelease", + "prerender", + "presage", + "prescribe", + "present", + "preserve", + "preside", + "press", + "pressure", + "pressurise", + "pressurize", + "presume", + "presuppose", + "pretend", + "prettify", + "pretty", + "prevail", + "prevaricate", + "prevent", + "preview", + "prey", + "price", + "prick", + "pride", + "prime", + "primp", + "print", + "prise", + "privatise", + "privatize", + "prize", + "probe", + "proceed", + "process", + "proclaim", + "procrastinate", + "procure", + "prod", + "produce", + "profess", + "professionalise", + "professionalize", + "profile", + "profit", + "program", + "progress", + "prohibit", + "project", + "proliferate", + "prolong", + "promise", + "promote", + "prompt", + "promulgate", + "pronounce", + "proofread", + "prop", + "propagate", + "propel", + "proportion", + "propose", + "propulse", + "proscribe", + "prosecute", + "prospect", + "prosper", + "protect", + "protest", + "protract", + "protrude", + "prove", + "provide", + "provoke", + "prowl", + "proxy", + "prune", + "pry", + "publicise", + "publicize", + "publish", + "pucker", + "puff", + "puke", + "pull", + "pulp", + "pulverise", + "pulverize", + "pummel", + "pump", + "punch", + "punctuate", + "puncture", + "punish", + "purchase", + "purge", + "purify", + "purple", + "purport", + "purpose", + "purr", + "purse", + "pursue", + "push", + "put", + "puzzle", + "quack", + "quadruple", + "quake", + "qualify", + "quantify", + "quantise", + "quantize", + "quarantine", + "quarrel", + "quarter", + "quash", + "quave", + "quaver", + "quelch", + "quell", + "quench", + "query", + "question", + "queue", + "quick", + "quick-freeze", + "quicken", + "quickfreeze", + "quiet", + "quieten", + "quip", + "quirk", + "quirl", + "quit", + "quiver", + "quiz", + "quote", + "qwikify", + "race", + "rack", + "radiate", + "rage", + "raid", + "rail", + "rain", + "raise", + "rake", + "rally", + "ram", + "ramble", + "ramify", + "ramp", + "range", + "rank", + "ransack", + "rant", + "rap", + "rarefy", + "rasp", + "rat", + "rate", + "ratify", + "ration", + "rationalise", + "rationalize", + "rattle", + "ravage", + "rave", + "raze", + "re-check", + "re-embark", + "re-emerge", + "re-enable", + "re-enact", + "re-engage", + "re-enlist", + "re-enter", + "re-establish", + "re-evaluate", + "re-examine", + "re-read", + "re-release", + "reabsorb", + "reach", + "react", + "read", + "readjust", + "readmit", + "reaffirm", + "realign", + "realise", + "realize", + "reallocate", + "reanimate", + "reap", + "reappear", + "reapply", + "rear", + "rearrange", + "reascend", + "reason", + "reassemble", + "reassert", + "reassess", + "reassign", + "reassume", + "reassure", + "rebase", + "rebel", + "reboot", + "rebound", + "rebuff", + "rebuild", + "rebuke", + "recall", + "recap", + "recapitulate", + "recapture", + "recast", + "recede", + "receive", + "recess", + "recharge", + "recheck", + "reciprocate", + "recite", + "reckon", + "reclaim", + "recline", + "recognise", + "recognize", + "recoil", + "recollapse", + "recollect", + "recommence", + "recommend", + "recommission", + "recommit", + "recompose", + "reconcile", + "recondition", + "reconfigure", + "reconfirm", + "reconquer", + "reconsider", + "reconsolidate", + "reconstitute", + "reconstruct", + "reconvene", + "reconvert", + "record", + "recount", + "recoup", + "recouple", + "recover", + "recreate", + "recriminate", + "recross", + "recruit", + "rectify", + "recuperate", + "recur", + "recut", + "recycle", + "redden", + "redeem", + "redefine", + "redeploy", + "redesign", + "redevelop", + "redirect", + "rediscover", + "redistribute", + "redo", + "redouble", + "redound", + "redraw", + "reduce", + "reel", + "reembark", + "reemerge", + "reenable", + "reenact", + "reengage", + "reenlist", + "reenter", + "reestablish", + "reevaluate", + "reexamine", + "refactor", + "refer", + "reference", + "refill", + "refine", + "refit", + "reflect", + "reform", + "reformat", + "refract", + "refrain", + "refresh", + "refrigerate", + "refund", + "refurbish", + "refuse", + "refute", + "regain", + "regard", + "regenerate", + "register", + "regress", + "regret", + "regrind", + "regroup", + "regularise", + "regularize", + "regulate", + "regurgitate", + "rehabilitate", + "rehearse", + "reheat", + "reify", + "reign", + "reimburse", + "reimplement", + "reimpose", + "rein", + "reincorporate", + "reinforce", + "reinsert", + "reinstall", + "reinstate", + "reinsure", + "reintegrate", + "reinterpret", + "reintroduce", + "reinvest", + "reissue", + "reiterate", + "reject", + "rejoice", + "rejoin", + "rejuvenate", + "rekindle", + "relapse", + "relate", + "relax", + "relay", + "relearn", + "release", + "relegate", + "relent", + "relieve", + "relinquish", + "relish", + "reload", + "relocate", + "rely", + "remain", + "remand", + "remark", + "remarry", + "remarshal", + "remedy", + "remember", + "remerge", + "remind", + "remit", + "remix", + "remodel", + "remount", + "remove", + "remunerate", + "rename", + "render", + "renege", + "renegotiate", + "renew", + "renounce", + "renovate", + "rent", + "reoccupy", + "reopen", + "reorder", + "reorganise", + "reorganize", + "repack", + "repaint", + "repair", + "repay", + "repeal", + "repeat", + "repel", + "rephrase", + "replace", + "replant", + "replenish", + "replicate", + "reply", + "repolish", + "report", + "repossess", + "represent", + "repress", + "reprieve", + "reprimand", + "reprint", + "reproach", + "reprobate", + "reproduce", + "reprogram", + "republish", + "repudiate", + "repulse", + "repute", + "request", + "requeue", + "require", + "requisition", + "reread", + "rerelease", + "reroute", + "reschedule", + "rescind", + "rescue", + "research", + "reseat", + "resell", + "resemble", + "resent", + "reserve", + "reset", + "reshape", + "reshuffle", + "reside", + "resign", + "resist", + "resize", + "resolve", + "resort", + "resound", + "resow", + "respect", + "respond", + "rest", + "restart", + "restate", + "restore", + "restrain", + "restrict", + "restructure", + "result", + "resume", + "resupply", + "resurface", + "resurrect", + "resuscitate", + "retain", + "retake", + "retaliate", + "reteach", + "retell", + "rethink", + "retire", + "retort", + "retouch", + "retrace", + "retract", + "retranslate", + "retrap", + "retread", + "retreat", + "retrieve", + "retrograde", + "retry", + "return", + "reunite", + "reuse", + "rev", + "revalidate", + "revamp", + "reveal", + "revel", + "reverberate", + "revere", + "reverse", + "revert", + "review", + "revile", + "revise", + "revisit", + "revitalise", + "revitalize", + "revive", + "revoke", + "revolt", + "revolutionise", + "revolutionize", + "revolve", + "reward", + "rework", + "rewrite", + "rhyme", + "rib", + "rid", + "riddle", + "ride", + "ridge", + "ridicule", + "rig", + "right", + "right-align", + "ring", + "rinse", + "riot", + "rip", + "ripple", + "rise", + "risk", + "rival", + "rivet", + "roam", + "roar", + "roast", + "rob", + "robustify", + "rock", + "rocket", + "roll", + "rollback", + "romanise", + "romanize", + "romp", + "root", + "rope", + "rot", + "rotate", + "round", + "rouse", + "route", + "row", + "rub", + "ruffle", + "ruin", + "rule", + "rumble", + "rummage", + "rumple", + "run", + "rupture", + "rush", + "rust", + "rustle", + "sabotage", + "sack", + "sacrifice", + "sadden", + "saddle", + "safeguard", + "sag", + "sail", + "salt", + "salute", + "salvage", + "sample", + "sanction", + "sandwich", + "sanitise", + "sanitize", + "sap", + "sass", + "satisfy", + "saturate", + "saunter", + "save", + "savor", + "savour", + "savvy", + "saw", + "say", + "scaffold", + "scald", + "scale", + "scamper", + "scan", + "scandalise", + "scandalize", + "scar", + "scare", + "scatter", + "scavenge", + "scent", + "schedule", + "school", + "scoff", + "scold", + "scoop", + "scorch", + "score", + "scorn", + "scour", + "scowl", + "scramble", + "scrap", + "scrape", + "scratch", + "scrawl", + "scream", + "screech", + "screen", + "screw", + "scribble", + "scroll", + "scrub", + "scrutinise", + "scrutinize", + "sculpt", + "scurry", + "scuttle", + "seal", + "search", + "season", + "seat", + "seclude", + "secrete", + "secure", + "seduce", + "see", + "seed", + "seek", + "seem", + "seep", + "seethe", + "segment", + "segregate", + "seize", + "select", + "sell", + "send", + "sense", + "sensitise", + "sensitize", + "sentence", + "sentinel", + "separate", + "sequence", + "serialise", + "serialize", + "serve", + "service", + "set", + "settle", + "sever", + "sew", + "shade", + "shadow", + "shake", + "shame", + "shape", + "share", + "sharpen", + "shatter", + "shave", + "shear", + "sheath", + "shed", + "shell", + "shelter", + "shelve", + "shepherd", + "shield", + "shift", + "shimmer", + "shine", + "ship", + "shiver", + "shock", + "shoot", + "shop", + "short-circuit", + "shortcircuit", + "shorten", + "shoulder", + "shout", + "shove", + "show", + "shower", + "shred", + "shriek", + "shrink", + "shrivel", + "shroud", + "shrug", + "shudder", + "shuffle", + "shun", + "shunt", + "shut", + "shutter", + "sicken", + "side", + "sideline", + "sidle", + "sift", + "sigh", + "sight", + "sign", + "signal", + "signify", + "silence", + "silhouette", + "simplify", + "simulate", + "sing", + "singe", + "single", + "sink", + "sip", + "sire", + "sit", + "situate", + "size", + "sizzle", + "skate", + "sketch", + "skew", + "ski", + "skid", + "skim", + "skin", + "skip", + "skirt", + "slacken", + "slam", + "slant", + "slap", + "slash", + "slate", + "slaughter", + "slay", + "sleep", + "slice", + "slide", + "sling", + "slink", + "slip", + "slit", + "slither", + "slope", + "slouch", + "slow", + "slug", + "slump", + "slur", + "smack", + "smash", + "smear", + "smell", + "smile", + "smirk", + "smoke", + "smooth", + "smoothen", + "smother", + "smudge", + "smuggle", + "snake", + "snap", + "snare", + "snarl", + "snatch", + "sneak", + "sneer", + "sneeze", + "snicker", + "sniff", + "snoop", + "snore", + "snort", + "snow", + "snub", + "snuff", + "snug", + "snuggle", + "soak", + "soar", + "sob", + "socialise", + "socialize", + "soften", + "soil", + "solicit", + "solve", + "sooth", + "sophisticate", + "sort", + "sound", + "sour", + "sow", + "space", + "span", + "spare", + "spark", + "sparkle", + "spatialise", + "spatialize", + "spatter", + "spawn", + "speak", + "spear", + "spearhead", + "specialise", + "specialize", + "specify", + "speckle", + "speculate", + "speed", + "spell", + "spend", + "spice", + "spike", + "spill", + "spin", + "spiral", + "spirit", + "spit", + "spite", + "splash", + "splatter", + "splice", + "splinter", + "split", + "splutter", + "spoil", + "sponsor", + "spoon", + "sport", + "spot", + "sprawl", + "spray", + "spread", + "spring", + "sprinkle", + "sprint", + "sprout", + "spur", + "spurn", + "spurt", + "spy", + "squander", + "square", + "squash", + "squat", + "squeak", + "squeal", + "squeeze", + "squint", + "squirm", + "squirt", + "stab", + "stabilise", + "stabilize", + "stable", + "stack", + "staff", + "stage", + "stagger", + "stain", + "stake", + "stalk", + "stall", + "stammer", + "stamp", + "stand", + "standardise", + "standardize", + "stare", + "start", + "startle", + "starve", + "stash", + "state", + "station", + "stave", + "stay", + "steady", + "steal", + "steam", + "steer", + "stem", + "step", + "stereotype", + "sterilise", + "sterilize", + "stick", + "stiffen", + "stifle", + "stigmatise", + "stigmatize", + "stimulate", + "sting", + "stink", + "stipulate", + "stir", + "stitch", + "stock", + "stomp", + "stone", + "stoop", + "stop", + "store", + "storm", + "stow", + "straddle", + "straighten", + "strain", + "strand", + "strangle", + "strap", + "strategise", + "strategize", + "stratify", + "stray", + "streak", + "stream", + "streamline", + "strengthen", + "stress", + "stretch", + "stride", + "strike", + "string", + "stringify", + "strip", + "strive", + "stroke", + "structure", + "struggle", + "strut", + "stub", + "study", + "stuff", + "stumble", + "stump", + "stun", + "stunt", + "stutter", + "style", + "stylise", + "stylize", + "subdivide", + "subdue", + "subject", + "sublet", + "submerge", + "submit", + "subordinate", + "subscribe", + "subset", + "subside", + "subsidise", + "subsidize", + "substantiate", + "substitute", + "subsume", + "subtract", + "subvert", + "succeed", + "succumb", + "sue", + "suffer", + "suffice", + "suffix", + "suffocate", + "suggest", + "suit", + "summarise", + "summarize", + "summon", + "sunset", + "superimpose", + "supersede", + "supervise", + "supplant", + "supplement", + "supply", + "support", + "suppose", + "suppress", + "surface", + "surge", + "surmise", + "surmount", + "surpass", + "surprise", + "surrender", + "surround", + "survey", + "survive", + "suspect", + "suspend", + "sustain", + "swagger", + "swallow", + "swamp", + "swap", + "swarm", + "sway", + "swear", + "sweat", + "sweep", + "sweeten", + "swell", + "swerve", + "swim", + "swing", + "swirl", + "switch", + "swivel", + "swoop", + "symbolise", + "symbolize", + "symlink", + "sympathise", + "sympathize", + "synchronise", + "synchronize", + "synthesise", + "synthesize", + "systematise", + "systematize", + "systemise", + "systemize", + "table", + "tabulate", + "tack", + "tackle", + "tag", + "tail", + "tailor", + "taint", + "take", + "talk", + "tally", + "tame", + "tamper", + "tan", + "tangle", + "tap", + "tape", + "taper", + "tar", + "target", + "tarnish", + "taste", + "tatter", + "tattoo", + "taunt", + "tax", + "taxi", + "teach", + "team", + "tear", + "tease", + "telephone", + "televise", + "tell", + "tempt", + "tend", + "tender", + "tense", + "term", + "terminate", + "terrify", + "terrorise", + "terrorize", + "test", + "testify", + "tether", + "text", + "texture", + "thank", + "thatch", + "thaw", + "theorise", + "theorize", + "thicken", + "thin", + "think", + "thrash", + "thread", + "threaten", + "thrill", + "thrive", + "throb", + "throttle", + "throw", + "thrust", + "thud", + "thumb", + "thump", + "thunder", + "thwart", + "tick", + "tickle", + "tidy", + "tie", + "tighten", + "tile", + "till", + "tilt", + "time", + "tinge", + "tingle", + "tint", + "tip", + "tiptoe", + "tire", + "title", + "toast", + "toggle", + "toil", + "tokenise", + "tokenize", + "tolerate", + "toll", + "tone", + "top", + "topple", + "torment", + "torture", + "toss", + "total", + "totter", + "touch", + "toughen", + "tour", + "tout", + "tow", + "tower", + "toy", + "trace", + "track", + "trade", + "trail", + "train", + "tramp", + "trample", + "transact", + "transcend", + "transcribe", + "transfer", + "transfigure", + "transfix", + "transform", + "transfuse", + "translate", + "transmit", + "transmute", + "transpire", + "transplant", + "transport", + "transpose", + "trap", + "travel", + "traverse", + "tread", + "treasure", + "treat", + "tremble", + "trench", + "trespass", + "triangulate", + "trick", + "trickle", + "trigger", + "trim", + "trip", + "triple", + "triumph", + "trot", + "trouble", + "troubleshoot", + "trudge", + "trump", + "truncate", + "truss", + "trust", + "try", + "tuck", + "tug", + "tumble", + "tune", + "turn", + "tutor", + "tweak", + "twinkle", + "twirl", + "twist", + "twitch", + "type", + "typify", + "tyrannise", + "tyrannize", + "unarm", + "unassign", + "unauthorise", + "unauthorize", + "unbalance", + "unbind", + "unblur", + "unbox", + "unbuckle", + "unbump", + "unbutton", + "uncheck", + "unclog", + "uncollapse", + "uncommit", + "unconsolidate", + "uncouple", + "uncover", + "undeploy", + "underbid", + "undercut", + "underestimate", + "undergo", + "underline", + "undermine", + "underrate", + "underscore", + "undersell", + "understand", + "understate", + "undertake", + "undervalue", + "undo", + "undress", + "unearth", + "unfasten", + "unfocus", + "unfold", + "unfreeze", + "unfurl", + "ungroup", + "unhinge", + "unhitch", + "unhook", + "unicast", + "unify", + "unindent", + "uninstall", + "unite", + "universalise", + "universalize", + "unjoin", + "unknot", + "unlearn", + "unleash", + "unload", + "unlock", + "unmarshal", + "unmask", + "unmerge", + "unpack", + "unpair", + "unpick", + "unplug", + "unravel", + "unrelease", + "unresolve", + "unroll", + "unsaddle", + "unscrew", + "unseal", + "unselect", + "unserialise", + "unserialize", + "unset", + "unsettle", + "unsquash", + "unsubscribe", + "untangle", + "untick", + "untie", + "untrap", + "unveil", + "unwind", + "unwrap", + "unzip", + "unzoom", + "up", + "update", + "upend", + "upgrade", + "uphold", + "upholster", + "uplift", + "upload", + "uproot", + "upsert", + "upset", + "upstage", + "urge", + "use", + "usher", + "usurp", + "utilise", + "utilize", + "utter", + "vacate", + "vaccinate", + "vacuum", + "validate", + "valuate", + "value", + "vandalise", + "vandalize", + "vanish", + "vaporise", + "vaporize", + "vapourise", + "vapourize", + "varnish", + "vary", + "vault", + "veer", + "vegetate", + "venerate", + "vent", + "ventilate", + "venture", + "verbalise", + "verbalize", + "verify", + "vest", + "vet", + "veto", + "vibrate", + "victimise", + "victimize", + "view", + "vindicate", + "violate", + "visit", + "visualise", + "visualize", + "vitalise", + "vitalize", + "vivify", + "voice", + "void", + "volunteer", + "vomit", + "vote", + "vow", + "wad", + "waddle", + "wade", + "wag", + "wage", + "wail", + "wait", + "waive", + "wake", + "waken", + "walk", + "wall", + "wander", + "wane", + "want", + "warm", + "warn", + "warp", + "warrant", + "wash", + "waste", + "watch", + "water", + "waterlog", + "waterproof", + "wave", + "waver", + "wax", + "weaken", + "wean", + "wear", + "weather", + "weave", + "wed", + "wedge", + "weed", + "weep", + "weigh", + "welcome", + "weld", + "whack", + "wheel", + "whimper", + "whine", + "whip", + "whirl", + "whisk", + "whisper", + "whistle", + "whitelist", + "whiten", + "whitewash", + "whittle", + "widen", + "wield", + "wiggle", + "will", + "win", + "wince", + "wind", + "wink", + "wipe", + "wire", + "wish", + "withdraw", + "wither", + "withhold", + "withstand", + "witness", + "wobble", + "wonder", + "woo", + "word", + "work", + "worry", + "worsen", + "worship", + "wound", + "wrap", + "wreck", + "wrench", + "wrestle", + "wriggle", + "wring", + "wrinkle", + "write", + "writhe", + "x-ray", + "xray", + "yak", + "yank", + "yawn", + "yearn", + "yell", + "yellow", + "yelp", + "yield", + "youthen", + "zap", + "zero", + "zigzag", + "zip", + "zone", + "zoom", +] + +export function isImperativeVerb(word: string): boolean { + return binarySearchIndexOf(SORTED_IMPERATIVE_VERBS, word) !== -1 +} From 4d01a50ed1e69ba8e2d9e86eec8a3e3dc79a1fa1 Mon Sep 17 00:00:00 2001 From: Steffen Diswal <11992328+spdiswal@users.noreply.github.com> Date: Mon, 4 May 2026 22:58:41 +0200 Subject: [PATCH 2/2] Implement `useImperativeSubjectLines` --- .../configurations/Configuration.fixtures.ts | 2 +- .../configurations/GetConfiguration.tests.ts | 4 +- .../configurations/GetDefaultConfiguration.ts | 4 +- .../rules/UseImperativeSubjectLines.tests.ts | 310 ++++++++++++++++++ .../rules/UseImperativeSubjectLines.ts | 55 +++- .../rules/reports/CommitwiseReport.tests.ts | 46 +++ src/domains/rules/reports/CommitwiseReport.ts | 2 +- 7 files changed, 412 insertions(+), 11 deletions(-) create mode 100644 src/domains/rules/UseImperativeSubjectLines.tests.ts diff --git a/src/domains/configurations/Configuration.fixtures.ts b/src/domains/configurations/Configuration.fixtures.ts index a80f11c8..2e6e865f 100644 --- a/src/domains/configurations/Configuration.fixtures.ts +++ b/src/domains/configurations/Configuration.fixtures.ts @@ -34,7 +34,7 @@ export function fakeConfiguration(overrides: ConfigurationTemplate = {}): Config useCommitterNamePatterns: {}, useConciseSubjectLines: { maxLength: 50 }, useEmptyLineBeforeBodyLines: {}, - useImperativeSubjectLines: {}, + useImperativeSubjectLines: { whitelist: new Set() }, useIssueLinks: { position: "anywhere" }, useLineWrapping: {}, useSignedCommits: {}, diff --git a/src/domains/configurations/GetConfiguration.tests.ts b/src/domains/configurations/GetConfiguration.tests.ts index bc9888f2..893d8fff 100644 --- a/src/domains/configurations/GetConfiguration.tests.ts +++ b/src/domains/configurations/GetConfiguration.tests.ts @@ -28,7 +28,7 @@ describe("the default configuration in the command-line", () => { ${"useCapitalisedSubjectLines"} | ${{}} ${"useConciseSubjectLines"} | ${{ maxLength: 50 }} ${"useEmptyLineBeforeBodyLines"} | ${{}} - ${"useImperativeSubjectLines"} | ${{}} + ${"useImperativeSubjectLines"} | ${{ whitelist: new Set() }} ${"useLineWrapping"} | ${{}} ${"useSignedCommits"} | ${{}} `( @@ -82,7 +82,7 @@ describe("the default configuration in GitHub Actions", () => { ${"useCapitalisedSubjectLines"} | ${{}} ${"useConciseSubjectLines"} | ${{ maxLength: 50 }} ${"useEmptyLineBeforeBodyLines"} | ${{}} - ${"useImperativeSubjectLines"} | ${{}} + ${"useImperativeSubjectLines"} | ${{ whitelist: new Set() }} ${"useLineWrapping"} | ${{}} ${"useSignedCommits"} | ${{}} `( diff --git a/src/domains/configurations/GetDefaultConfiguration.ts b/src/domains/configurations/GetDefaultConfiguration.ts index ad836e7d..17438d2e 100644 --- a/src/domains/configurations/GetDefaultConfiguration.ts +++ b/src/domains/configurations/GetDefaultConfiguration.ts @@ -38,7 +38,7 @@ function getDefaultCliConfiguration(): Configuration { useCommitterNamePatterns: null, useConciseSubjectLines: { maxLength: 50 }, useEmptyLineBeforeBodyLines: {}, - useImperativeSubjectLines: {}, + useImperativeSubjectLines: { whitelist: new Set() }, useIssueLinks: null, useLineWrapping: {}, useSignedCommits: {}, @@ -67,7 +67,7 @@ function getDefaultGhaConfiguration(): Configuration { useCommitterNamePatterns: null, useConciseSubjectLines: { maxLength: 50 }, useEmptyLineBeforeBodyLines: {}, - useImperativeSubjectLines: {}, + useImperativeSubjectLines: { whitelist: new Set() }, useIssueLinks: null, useLineWrapping: {}, useSignedCommits: {}, diff --git a/src/domains/rules/UseImperativeSubjectLines.tests.ts b/src/domains/rules/UseImperativeSubjectLines.tests.ts new file mode 100644 index 00000000..976f7376 --- /dev/null +++ b/src/domains/rules/UseImperativeSubjectLines.tests.ts @@ -0,0 +1,310 @@ +import { describe, expect, it } from "vitest" +import { fakeCommitFactory } from "#commits/Commit.fixtures.ts" +import type { Commit } from "#commits/Commit.ts" +import { fakeConfiguration } from "#configurations/Configuration.fixtures.ts" +import type { Concerns } from "#rules/concerns/Concern.ts" +import { subjectLineConcern } from "#rules/concerns/SubjectLineConcern.ts" +import type { RuleKey, RuleOptions } from "#rules/Rule.ts" +import { useImperativeSubjectLines } from "#rules/UseImperativeSubjectLines.ts" +import type { CharacterRange } from "#types/CharacterRange.ts" +import type { Vector } from "#types/Vector.ts" + +const rule = "useImperativeSubjectLines" satisfies RuleKey + +const enabled: RuleOptions = { whitelist: new Set() } +const enabledWhitelist: RuleOptions = { whitelist: new Set(["chatify", "deckenize"]) } + +const fakeCommit = fakeCommitFactory(fakeConfiguration()) + +describe.each` + subjectLine | expectedRange + ${"WIP"} | ${[0, 3]} + ${"init"} | ${[0, 4]} + ${"Bugfix"} | ${[0, 6]} + ${"some refactoring"} | ${[0, 4]} + ${"Added a new feature"} | ${[0, 5]} + ${"Updated some dependencies"} | ${[0, 7]} + ${" never give up!!"} | ${[1, 6]} + ${"finally..."} | ${[0, 10]} + ${"Formatting."} | ${[0, 11]} + ${" It works"} | ${[2, 4]} + ${"always validate"} | ${[0, 6]} + ${"`Fix` it"} | ${[0, 5]} + ${"`Service`"} | ${[0, 9]} + ${"squash! Added some extra love to the code"} | ${[9, 14]} + ${"fixup! Solved the problem"} | ${[7, 13]} + ${"GH-12 organised the calendar"} | ${[6, 15]} + ${"amend! GH-55: made the console less dramatic"} | ${[14, 18]} + ${"upgraded react to 19.2.5"} | ${[0, 8]} + ${"I'd rather not!"} | ${[0, 3]} + ${"99 hot air balloons"} | ${[0, 2]} + ${"fixup! squash! #987 1 2 3 this is a test"} | ${[20, 21]} +`( + "when the subject line of $subjectLine does not start with an imperative verb", + (props: { subjectLine: string; expectedRange: CharacterRange }) => { + const commit = fakeCommit({ message: props.subjectLine }) + + describe("and the rule is enabled", () => { + const actualConcerns = useImperativeSubjectLines([commit], enabled) + + it("raises a concern about the first word", () => { + expect(actualConcerns).toEqual([ + subjectLineConcern(rule, commit.sha, { range: props.expectedRange }), + ]) + }) + }) + + describe("and the rule is enabled with a custom whitelist", () => { + const actualConcerns = useImperativeSubjectLines([commit], enabledWhitelist) + + it("raises a concern about the first word", () => { + expect(actualConcerns).toEqual([ + subjectLineConcern(rule, commit.sha, { range: props.expectedRange }), + ]) + }) + }) + + describe("and the rule is disabled", () => { + const actualConcerns = useImperativeSubjectLines([commit], null) + + it("does not raise any concerns", () => { + expect(actualConcerns).toEqual([]) + }) + }) + }, +) + +describe.each` + subjectLine + ${"fix"} + ${"test"} + ${"Add a new feature"} + ${" Format the code"} + ${"make it work"} + ${"Do the validation every time"} + ${" squash! Unsubscribe from the service"} + ${"Merge branch 'main' into feature/office-overhaul"} + ${"GH-12 Organise the bookshelf"} + ${"fixup! Resolve a bug that thought it was a feature"} + ${" Let `SoftIceMachineAdapter` produce the goods that we need"} + ${"amend!Apply strawberry jam to make the code sweeter"} + ${"Throw a tantrum;"} + ${"Bump vite from 4.1.1 to 4.3.2"} +`( + "when the subject line of $subjectLine starts with an imperative verb", + (props: { subjectLine: string }) => { + const commit = fakeCommit({ message: props.subjectLine }) + + describe("and the rule is enabled", () => { + const actualConcerns = useImperativeSubjectLines([commit], enabled) + + it("does not raise any concerns", () => { + expect(actualConcerns).toEqual([]) + }) + }) + + describe("and the rule is enabled with a custom whitelist", () => { + const actualConcerns = useImperativeSubjectLines([commit], enabledWhitelist) + + it("does not raise any concerns", () => { + expect(actualConcerns).toEqual([]) + }) + }) + + describe("and the rule is disabled", () => { + const actualConcerns = useImperativeSubjectLines([commit], null) + + it("does not raise any concerns", () => { + expect(actualConcerns).toEqual([]) + }) + }) + }, +) + +describe.each` + subjectLine | expectedRange + ${"Chatify the release notes"} | ${[0, 7]} + ${"GL-11 chatify the release notes into a little radio ad"} | ${[6, 13]} + ${"fixup! Deckenize the module"} | ${[7, 16]} + ${"dEcKeNiZe eVeRyThInG"} | ${[0, 9]} +`( + "when the subject line of $subjectLine starts with a custom whitelisted word", + (props: { subjectLine: string; expectedRange: CharacterRange }) => { + const commit = fakeCommit({ message: props.subjectLine }) + + describe("and the rule is enabled without a custom whitelist", () => { + const actualConcerns = useImperativeSubjectLines([commit], enabled) + + it("raises a concern about the first word", () => { + expect(actualConcerns).toEqual([ + subjectLineConcern(rule, commit.sha, { range: props.expectedRange }), + ]) + }) + }) + + describe("and the rule is enabled with a custom whitelist", () => { + const actualConcerns = useImperativeSubjectLines([commit], enabledWhitelist) + + it("does not raise any concerns", () => { + expect(actualConcerns).toEqual([]) + }) + }) + + describe("and the rule is disabled", () => { + const actualConcerns = useImperativeSubjectLines([commit], null) + + it("does not raise any concerns", () => { + expect(actualConcerns).toEqual([]) + }) + }) + }, +) + +describe.each` + subjectLine + ${'revert ""'} + ${'Revert "dadada"'} + ${'revert "made the console less dramatic"'} + ${'Revert "Revert "release""'} + ${'amend! Revert " formatted the code with a tiny hammer"'} + ${'squash!fixup! revert " revert " GH-67 cleanup"'} +`( + "when the subject line of $subjectLine contains a revert marker", + (props: { subjectLine: string }) => { + const commit = fakeCommit({ message: props.subjectLine }) + + describe("and the rule is enabled", () => { + const actualConcerns = useImperativeSubjectLines([commit], enabled) + + it("does not raise any concerns", () => { + expect(actualConcerns).toEqual([]) + }) + }) + + describe("and the rule is disabled", () => { + const actualConcerns = useImperativeSubjectLines([commit], null) + + it("does not raise any concerns", () => { + expect(actualConcerns).toEqual([]) + }) + }) + }, +) + +describe.each` + subjectLine + ${""} + ${" "} + ${"\t\t"} + ${"fixup! "} + ${"#12"} +`( + "when the subject line of $subjectLine contains no significant words", + (props: { subjectLine: string }) => { + const commit = fakeCommit({ message: props.subjectLine }) + + describe("and the rule is enabled", () => { + const actualConcerns = useImperativeSubjectLines([commit], enabled) + + it("does not raise any concerns", () => { + expect(actualConcerns).toEqual([]) + }) + }) + + describe("and the rule is enabled with a custom whitelist", () => { + const actualConcerns = useImperativeSubjectLines([commit], enabledWhitelist) + + it("does not raise any concerns", () => { + expect(actualConcerns).toEqual([]) + }) + }) + + describe("and the rule is disabled", () => { + const actualConcerns = useImperativeSubjectLines([commit], null) + + it("does not raise any concerns", () => { + expect(actualConcerns).toEqual([]) + }) + }) + }, +) + +describe("when verifying a set of multiple commits and some commits do not start with an imperative verb", () => { + const commits: Vector = [ + fakeCommit({ message: "Add a new feature" }), + fakeCommit({ message: "formatting" }), + fakeCommit({ message: "fixup! resolve the confusing test fixture" }), + fakeCommit({ message: "Always validate before release" }), + fakeCommit({ message: 'Revert "Added a noisy experiment"' }), + fakeCommit({ message: "amend! GH-55: made the console less dramatic" }), + fakeCommit({ message: "GL-11 chatify the release notes into a little radio ad" }), + ] + + describe("and the rule is enabled", () => { + const actualConcerns = useImperativeSubjectLines(commits, enabled) + + it("raises concerns about the commits with non-imperative subject lines", () => { + expect(actualConcerns).toEqual([ + subjectLineConcern(rule, commits[1].sha, { range: [0, 10] }), + subjectLineConcern(rule, commits[3].sha, { range: [0, 6] }), + subjectLineConcern(rule, commits[5].sha, { range: [14, 18] }), + subjectLineConcern(rule, commits[6].sha, { range: [6, 13] }), + ]) + }) + }) + + describe("and the rule is enabled with a custom whitelist", () => { + const actualConcerns = useImperativeSubjectLines(commits, enabledWhitelist) + + it("raises concerns about the commits with non-imperative and non-whitelisted subject lines", () => { + expect(actualConcerns).toEqual([ + subjectLineConcern(rule, commits[1].sha, { range: [0, 10] }), + subjectLineConcern(rule, commits[3].sha, { range: [0, 6] }), + subjectLineConcern(rule, commits[5].sha, { range: [14, 18] }), + ]) + }) + }) + + describe("and the rule is disabled", () => { + const actualConcerns = useImperativeSubjectLines(commits, null) + + it("does not raise any concerns", () => { + expect(actualConcerns).toEqual([]) + }) + }) +}) + +describe("when verifying a set of multiple commits and all commits start with an imperative verb", () => { + const commits: Vector = [ + fakeCommit({ message: "Establish the repository" }), + fakeCommit({ message: "Enable the coffee machine integration tests" }), + fakeCommit({ message: 'Revert "Add a second rubber duck to the debugging kit"' }), + fakeCommit({ message: "fixup! Paint the eggs with suspicious enthusiasm" }), + fakeCommit({ message: " Drop the legacy spaghetti tower module" }), + fakeCommit({ message: "Help fix the annoying bug" }), + ] + + describe("and the rule is enabled", () => { + const actualConcerns = useImperativeSubjectLines(commits, enabled) + + it("does not raise any concerns", () => { + expect(actualConcerns).toEqual([]) + }) + }) + + describe("and the rule is enabled with a custom whitelist", () => { + const actualConcerns = useImperativeSubjectLines(commits, enabledWhitelist) + + it("does not raise any concerns", () => { + expect(actualConcerns).toEqual([]) + }) + }) + + describe("and the rule is disabled", () => { + const actualConcerns = useImperativeSubjectLines(commits, null) + + it("does not raise any concerns", () => { + expect(actualConcerns).toEqual([]) + }) + }) +}) diff --git a/src/domains/rules/UseImperativeSubjectLines.ts b/src/domains/rules/UseImperativeSubjectLines.ts index 98ac74b0..70908e76 100644 --- a/src/domains/rules/UseImperativeSubjectLines.ts +++ b/src/domains/rules/UseImperativeSubjectLines.ts @@ -1,20 +1,65 @@ import type { Commit, Commits } from "#commits/Commit.ts" +import { text } from "#commits/tokens/TextToken.ts" +import { type Token, trimmedTokenRange } from "#commits/tokens/Token.ts" import type { Concern, Concerns } from "#rules/concerns/Concern.ts" +import { subjectLineConcern } from "#rules/concerns/SubjectLineConcern.ts" import type { RuleKey, RuleOptions } from "#rules/Rule.ts" -import type { EmptyObject } from "#types/EmptyObject.ts" import { notNullish } from "#utilities/Arrays.ts" +import { isImperativeVerb } from "#utilities/Verbs.ts" -const _rule = "useImperativeSubjectLines" satisfies RuleKey +const rule = "useImperativeSubjectLines" satisfies RuleKey /** + * Verifies that the subject line starts with a verb in the imperative mood. + * + * Standardising the commit message format helps to preserve the readability of the commit history. + * * It ignores revert commits. + * It disregards issue links and squash markers. */ -export function useImperativeSubjectLines(commits: Commits, options: EmptyObject | null): Concerns { +export function useImperativeSubjectLines( + commits: Commits, + options: { whitelist: Set } | null, +): Concerns { return options !== null ? commits.map((commit) => verifyCommit(commit, options)).filter(notNullish) : [] } -function verifyCommit(_commit: Commit, _options: RuleOptions): Concern | null { - throw new Error("The `useImperativeSubjectLines` rule has not been implemented yet") // TODO: To be implemented. +function verifyCommit(commit: Commit, options: RuleOptions): Concern | null { + let firstWordToken: Token | null = null + + for (const token of commit.subjectLine) { + if (token.type === "revert-marker") { + return null + } + if (firstWordToken === null && token.type !== "issue-link" && token.type !== "squash-marker") { + firstWordToken = getFirstWordToken(token) + } + } + + if (firstWordToken === null) { + return null + } + + const firstWord = firstWordToken.value.toLowerCase() + + if (options.whitelist.has(firstWord) || isImperativeVerb(firstWord)) { + return null + } + + return subjectLineConcern(rule, commit.sha, { range: trimmedTokenRange(firstWordToken) }) +} + +const firstWordRegex = /\S+/u + +function getFirstWordToken(token: Token): Token | null { + const firstWord = firstWordRegex.exec(token.value)?.[0] ?? null + + if (firstWord === null) { + return null + } + + const firstWordStartIndex = token.range[0] + token.value.indexOf(firstWord) + return text(firstWord, [firstWordStartIndex, firstWordStartIndex + firstWord.length]) } diff --git a/src/domains/rules/reports/CommitwiseReport.tests.ts b/src/domains/rules/reports/CommitwiseReport.tests.ts index b692cc19..46dac363 100644 --- a/src/domains/rules/reports/CommitwiseReport.tests.ts +++ b/src/domains/rules/reports/CommitwiseReport.tests.ts @@ -299,6 +299,52 @@ describe("when 'useCapitalisedSubjectLines' has a concern about characters 7-8 o }) }) +describe("when 'useImperativeSubjectLines' has a concern about characters 0-5 of the subject line", () => { + const configuration = fakeConfiguration() + const fakeCommit = fakeCommitFactory(configuration) + + const commit = fakeCommit({ + sha: "9e45e097a594deaf39b360fb285be38b5b68a2", + message: "Added a feature that should have stayed on the whiteboard", + }) + const concern = subjectLineConcern("useImperativeSubjectLines", commit.sha, { range: [0, 5] }) + + it("describes the rule violation in the subject line", () => { + const actualOutput = commitwiseReport([concern], [commit], configuration) + expect(actualOutput).toBe( + ` +9e45e09 Added a feature that should have stayed on the whiteboard + ──┬── + ╰─ Subject lines must start with a verb in the imperative mood. + (useImperativeSubjectLines) +`.trim(), + ) + }) +}) + +describe("when 'useImperativeSubjectLines' has a concern about characters 14-18 of the subject line", () => { + const configuration = fakeConfiguration() + const fakeCommit = fakeCommitFactory(configuration) + + const commit = fakeCommit({ + sha: "339b6fcb8aedbe7b19443e39be24f615287a7", + message: "amend! GH-55: made the console less dramatic", + }) + const concern = subjectLineConcern("useImperativeSubjectLines", commit.sha, { range: [14, 18] }) + + it("describes the rule violation in the subject line", () => { + const actualOutput = commitwiseReport([concern], [commit], configuration) + expect(actualOutput).toBe( + ` +339b6fc amend! GH-55: made the console less dramatic + ─┬── + ╰─ Subject lines must start with a verb in the imperative mood. + (useImperativeSubjectLines) +`.trim(), + ) + }) +}) + describe("when 'useConciseSubjectLines' has a concern about characters 20-25 of the subject line", () => { const configuration = fakeConfiguration({ rules: { useConciseSubjectLines: { maxLength: 20 } }, diff --git a/src/domains/rules/reports/CommitwiseReport.ts b/src/domains/rules/reports/CommitwiseReport.ts index 9a961cdf..9932b000 100644 --- a/src/domains/rules/reports/CommitwiseReport.ts +++ b/src/domains/rules/reports/CommitwiseReport.ts @@ -165,7 +165,7 @@ function ruleMessage( throw new Error(`Not implemented yet: ${rule}`) } case "useImperativeSubjectLines": { - throw new Error(`Not implemented yet: ${rule}`) + return ["Subject lines must start with a verb in the imperative mood."] } case "useIssueLinks": { const options = getRuleOptions(rule, configuration)