{"version":3,"file":"EnglishProcessor.cjs","sources":["../../../../src/languages/english/EnglishProcessor.ts"],"sourcesContent":["import { BaseLanguageProcessor } from \"../base/LanguageProcessor.js\";\nimport type { FuzzyFeature } from \"../../core/types.js\";\n\n/**\n * English language processor with specialized features:\n * - Metaphone phonetic algorithm\n * - Common English contractions\n * - English-specific word endings\n * - Comprehensive synonym support\n */\nexport class EnglishProcessor extends BaseLanguageProcessor {\n  readonly language = \"english\";\n  readonly displayName = \"English\";\n  readonly supportedFeatures: FuzzyFeature[] = [\n    //\n    \"phonetic\",\n    \"synonyms\",\n    \"keyboard-neighbors\",\n    \"partial-words\",\n    \"missing-letters\",\n    \"extra-letters\",\n    \"transpositions\",\n  ];\n\n  /**\n   * English text normalization with contraction handling\n   */\n  normalize(text: string): string {\n    return (\n      text\n        .toLowerCase()\n        .trim()\n        .replace(/\\s+/g, \" \")\n        // Handle common contractions\n        .replace(/won't/g, \"will not\")\n        .replace(/can't/g, \"cannot\")\n        .replace(/n't/g, \" not\")\n        .replace(/'re/g, \" are\")\n        .replace(/'ve/g, \" have\")\n        .replace(/'ll/g, \" will\")\n        .replace(/'d/g, \" would\")\n        .replace(/'m/g, \" am\")\n        .replace(/'/g, \"\")\n    ); // Remove remaining apostrophes\n  }\n\n  /**\n   * Simplified Metaphone algorithm for English phonetic matching\n   */\n  getPhoneticCode(word: string): string {\n    const normalized = this.normalize(word).replace(/[^a-z]/g, \"\");\n    if (normalized.length === 0) return \"\";\n\n    let metaphone = \"\";\n    let current = 0;\n    const length = normalized.length;\n\n    // Handle initial letters\n    if (normalized.startsWith(\"gn\") || normalized.startsWith(\"kn\") || normalized.startsWith(\"pn\") || normalized.startsWith(\"wr\")) {\n      current = 1;\n    }\n\n    while (current < length && metaphone.length < 4) {\n      const char = normalized[current];\n      const next = current + 1 < length ? normalized[current + 1] : \"\";\n      const prev = current > 0 ? normalized[current - 1] : \"\";\n\n      switch (char) {\n        case \"a\":\n        case \"e\":\n        case \"i\":\n        case \"o\":\n        case \"u\":\n          if (current === 0) metaphone += char.toUpperCase();\n          break;\n        case \"b\":\n          if (current === length - 1 && prev === \"m\") {\n            // Silent B at end after M\n          } else {\n            metaphone += \"B\";\n          }\n          break;\n        case \"c\":\n          if (next === \"h\") {\n            metaphone += \"X\";\n            current++;\n          } else if (next === \"i\" || next === \"e\" || next === \"y\") {\n            metaphone += \"S\";\n          } else {\n            metaphone += \"K\";\n          }\n          break;\n        case \"d\":\n          if (next === \"g\") {\n            metaphone += \"J\";\n            current++;\n          } else {\n            metaphone += \"T\";\n          }\n          break;\n        case \"f\":\n          metaphone += \"F\";\n          break;\n        case \"g\":\n          if (next === \"h\" && current !== 0) {\n            // Silent GH\n          } else if (next === \"n\") {\n            metaphone += \"N\";\n            current++;\n          } else if (next === \"i\" || next === \"e\" || next === \"y\") {\n            metaphone += \"J\";\n          } else {\n            metaphone += \"K\";\n          }\n          break;\n        case \"h\":\n          if (current === 0 || \"aeiou\".includes(prev) || \"aeiou\".includes(next)) {\n            metaphone += \"H\";\n          }\n          break;\n        case \"j\":\n          metaphone += \"J\";\n          break;\n        case \"k\":\n          if (prev !== \"c\") {\n            metaphone += \"K\";\n          }\n          break;\n        case \"l\":\n          metaphone += \"L\";\n          break;\n        case \"m\":\n          metaphone += \"M\";\n          break;\n        case \"n\":\n          metaphone += \"N\";\n          break;\n        case \"p\":\n          if (next === \"h\") {\n            metaphone += \"F\";\n            current++;\n          } else {\n            metaphone += \"P\";\n          }\n          break;\n        case \"q\":\n          metaphone += \"K\";\n          break;\n        case \"r\":\n          metaphone += \"R\";\n          break;\n        case \"s\":\n          if (next === \"h\") {\n            metaphone += \"X\";\n            current++;\n          } else {\n            metaphone += \"S\";\n          }\n          break;\n        case \"t\":\n          if (next === \"h\") {\n            metaphone += \"0\";\n            current++;\n          } else if (next === \"i\" && current + 2 < length && (normalized[current + 2] === \"a\" || normalized[current + 2] === \"o\")) {\n            metaphone += \"X\";\n          } else {\n            metaphone += \"T\";\n          }\n          break;\n        case \"v\":\n          metaphone += \"F\";\n          break;\n        case \"w\":\n          if (\"aeiou\".includes(next)) {\n            metaphone += \"W\";\n          }\n          break;\n        case \"x\":\n          metaphone += \"KS\";\n          break;\n        case \"y\":\n          if (\"aeiou\".includes(next)) {\n            metaphone += \"Y\";\n          }\n          break;\n        case \"z\":\n          metaphone += \"S\";\n          break;\n      }\n      current++;\n    }\n\n    return metaphone || \"A\";\n  }\n\n  /**\n   * English word variants\n   * Uses optimized base implementation with English-specific additions\n   */\n  getWordVariants(word: string, performanceMode?: string): string[] {\n    // Use optimized base implementation\n    const variants = new Set(super.getWordVariants(word, performanceMode));\n    \n    const normalized = this.normalize(word);\n\n    // Add English-specific morphological variants\n    // Add plural/singular variants\n    if (normalized.endsWith(\"s\") && normalized.length > 3) {\n      variants.add(normalized.slice(0, -1));\n    }\n    if (!normalized.endsWith(\"s\")) {\n      variants.add(normalized + \"s\");\n    }\n\n    // Add -ing/-ed variants\n    if (normalized.endsWith(\"ing\") && normalized.length > 5) {\n      const base = normalized.slice(0, -3);\n      variants.add(base);\n      variants.add(base + \"e\"); // handle dropped 'e'\n    }\n    if (normalized.endsWith(\"ed\") && normalized.length > 4) {\n      const base = normalized.slice(0, -2);\n      variants.add(base);\n      variants.add(base + \"e\"); // handle dropped 'e'\n    }\n\n    return Array.from(variants);\n  }\n\n  /**\n   * English word endings\n   */\n  protected getCommonEndings(): string[] {\n    return [\n      //\n      \"s\",\n      \"es\",\n      \"ed\",\n      \"ing\",\n      \"er\",\n      \"est\",\n      \"ly\",\n      \"tion\",\n      \"sion\",\n      \"ness\",\n      \"ment\",\n      \"able\",\n      \"ible\",\n      \"ful\",\n      \"less\",\n      \"ous\",\n      \"ious\",\n      \"al\",\n      \"ial\",\n      \"ic\",\n      \"ive\",\n      \"ary\",\n      \"ery\",\n      \"ory\",\n    ];\n  }\n\n  /**\n   * English synonyms for common words\n   */\n  getSynonyms(word: string): string[] {\n    const synonymMap: Record<string, string[]> = {\n      doctor: [\n        //\n        \"physician\",\n        \"medic\",\n        \"doc\",\n        \"md\",\n      ],\n      hospital: [\n        //\n        \"clinic\",\n        \"medical center\",\n        \"infirmary\",\n      ],\n      school: [\n        //\n        \"academy\",\n        \"institution\",\n        \"college\",\n        \"university\",\n      ],\n      car: [\n        //\n        \"vehicle\",\n        \"automobile\",\n        \"auto\",\n      ],\n      house: [\n        //\n        \"home\",\n        \"residence\",\n        \"dwelling\",\n        \"building\",\n      ],\n      street: [\n        //\n        \"road\",\n        \"avenue\",\n        \"lane\",\n        \"boulevard\",\n      ],\n      city: [\n        //\n        \"town\",\n        \"municipality\",\n        \"urban area\",\n      ],\n      work: [\n        //\n        \"job\",\n        \"employment\",\n        \"occupation\",\n        \"career\",\n      ],\n      money: [\n        //\n        \"cash\",\n        \"currency\",\n        \"funds\",\n        \"capital\",\n      ],\n      time: [\n        //\n        \"duration\",\n        \"period\",\n        \"moment\",\n        \"hour\",\n      ],\n      big: [\n        //\n        \"large\",\n        \"huge\",\n        \"enormous\",\n        \"massive\",\n        \"giant\",\n      ],\n      small: [\n        //\n        \"little\",\n        \"tiny\",\n        \"miniature\",\n        \"petite\",\n      ],\n      fast: [\n        //\n        \"quick\",\n        \"rapid\",\n        \"speedy\",\n        \"swift\",\n      ],\n      slow: [\n        //\n        \"sluggish\",\n        \"gradual\",\n        \"leisurely\",\n      ],\n      good: [\n        //\n        \"excellent\",\n        \"great\",\n        \"wonderful\",\n        \"fine\",\n      ],\n      bad: [\n        //\n        \"poor\",\n        \"terrible\",\n        \"awful\",\n        \"horrible\",\n      ],\n      happy: [\n        //\n        \"joyful\",\n        \"cheerful\",\n        \"glad\",\n        \"pleased\",\n      ],\n      sad: [\n        //\n        \"unhappy\",\n        \"depressed\",\n        \"melancholy\",\n        \"sorrowful\",\n      ],\n    };\n\n    const normalized = this.normalize(word);\n    return synonymMap[normalized] || [];\n  }\n}\n"],"names":["BaseLanguageProcessor"],"mappings":"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"}