{"version":3,"file":"FrenchProcessor.cjs","sources":["../../../../src/languages/french/FrenchProcessor.ts"],"sourcesContent":["import { BaseLanguageProcessor } from \"../base/LanguageProcessor.js\";\nimport type { FuzzyFeature } from \"../../core/types.js\";\n\n/**\n * French language processor with specialized features:\n * - Accent normalization (à, é, è, ê, ç, etc.)\n * - French phonetic patterns\n * - Common French word endings\n * - French synonym support\n */\nexport class FrenchProcessor extends BaseLanguageProcessor {\n  readonly language = \"french\";\n  readonly displayName = \"Français\";\n  readonly supportedFeatures: FuzzyFeature[] = [\n    //\n    \"phonetic\",\n    \"synonyms\",\n    \"keyboard-neighbors\",\n    \"partial-words\",\n    \"missing-letters\",\n    \"extra-letters\",\n  ];\n\n  /**\n   * French text normalization with accent handling\n   */\n  normalize(text: string): string {\n    return (\n      text\n        .toLowerCase()\n        .trim()\n        .replace(/\\s+/g, \" \")\n        // Normalize accented characters\n        .replace(/[àáâãä]/g, \"a\")\n        .replace(/[èéêë]/g, \"e\")\n        .replace(/[ìíîï]/g, \"i\")\n        .replace(/[òóôõö]/g, \"o\")\n        .replace(/[ùúûü]/g, \"u\")\n        .replace(/ç/g, \"c\")\n        .replace(/ñ/g, \"n\")\n        .replace(/ÿ/g, \"y\")\n    );\n  }\n\n  /**\n   * French phonetic matching\n   */\n  getPhoneticCode(word: string): string {\n    const normalized = this.normalize(word);\n    if (normalized.length === 0) return \"\";\n\n    let code = \"\";\n    let prev = \"\";\n\n    for (let i = 0; i < normalized.length; i++) {\n      const char = normalized[i];\n      const next = i < normalized.length - 1 ? normalized[i + 1] : \"\";\n      const next2 = i < normalized.length - 2 ? normalized[i + 2] : \"\";\n      let digit = \"\";\n\n      switch (char) {\n        case \"a\":\n        case \"e\":\n        case \"i\":\n        case \"o\":\n        case \"u\":\n        case \"y\":\n          digit = \"0\";\n          break;\n        case \"b\":\n          digit = \"1\";\n          break;\n        case \"c\":\n          if (next === \"h\") {\n            digit = \"2\"; // CH sound\n          } else if (next === \"e\" || next === \"i\") {\n            digit = \"8\"; // CE, CI sounds like S\n          } else {\n            digit = \"4\";\n          }\n          break;\n        case \"d\":\n          digit = \"3\";\n          break;\n        case \"f\":\n          digit = \"5\";\n          break;\n        case \"g\":\n          if (next === \"n\") {\n            digit = \"6\"; // GN sound\n          } else if (next === \"u\" && (next2 === \"e\" || next2 === \"i\")) {\n            digit = \"4\"; // GUE, GUI\n          } else if (next === \"e\" || next === \"i\") {\n            digit = \"6\"; // GE, GI sound like J\n          } else {\n            digit = \"4\";\n          }\n          break;\n        case \"h\":\n          // H is often silent in French\n          if (i === 0) {\n            digit = \"0\"; // Initial H\n          }\n          break;\n        case \"j\":\n          digit = \"6\";\n          break;\n        case \"k\":\n          digit = \"4\";\n          break;\n        case \"l\":\n          digit = \"5\";\n          break;\n        case \"m\":\n          digit = \"6\";\n          break;\n        case \"n\":\n          digit = \"6\";\n          break;\n        case \"p\":\n          if (next === \"h\") {\n            digit = \"5\"; // PH sounds like F\n          } else {\n            digit = \"1\";\n          }\n          break;\n        case \"q\":\n          digit = \"4\";\n          break;\n        case \"r\":\n          digit = \"7\";\n          break;\n        case \"s\":\n          digit = \"8\";\n          break;\n        case \"t\":\n          if (next === \"h\") {\n            digit = \"3\"; // TH sound\n          } else {\n            digit = \"3\";\n          }\n          break;\n        case \"v\":\n          digit = \"5\";\n          break;\n        case \"w\":\n          digit = \"5\"; // Rare in French\n          break;\n        case \"x\":\n          digit = \"48\";\n          break;\n        case \"z\":\n          digit = \"8\";\n          break;\n        default:\n          continue;\n      }\n\n      if (digit && digit !== prev) {\n        code += digit;\n      }\n      prev = digit;\n    }\n\n    return code || \"0\";\n  }\n\n  /**\n   * French word endings\n   */\n  protected getCommonEndings(): string[] {\n    return [\"e\", \"es\", \"s\", \"x\", \"ent\", \"ant\", \"ment\", \"tion\", \"sion\", \"eur\", \"euse\", \"teur\", \"trice\", \"able\", \"ible\", \"ique\", \"aire\", \"oire\", \"ette\", \"elle\", \"esse\", \"asse\", \"isse\", \"age\", \"isme\", \"iste\", \"ite\", \"ude\", \"ade\"];\n  }\n\n  /**\n   * French synonyms\n   */\n  getSynonyms(word: string): string[] {\n    const synonymMap: Record<string, string[]> = {\n      medecin: [\n        //\n        \"docteur\",\n        \"praticien\",\n      ],\n      hopital: [\n        //\n        \"clinique\",\n        \"centre medical\",\n      ],\n      ecole: [\n        //\n        \"etablissement\",\n        \"institution\",\n      ],\n      voiture: [\n        //\n        \"automobile\",\n        \"vehicule\",\n        \"auto\",\n      ],\n      maison: [\n        //\n        \"domicile\",\n        \"residence\",\n        \"habitation\",\n      ],\n      rue: [\n        //\n        \"avenue\",\n        \"boulevard\",\n        \"voie\",\n      ],\n      ville: [\n        //\n        \"cite\",\n        \"commune\",\n        \"agglomeration\",\n      ],\n      travail: [\n        //\n        \"emploi\",\n        \"occupation\",\n        \"metier\",\n      ],\n      argent: [\n        //\n        \"monnaie\",\n        \"especes\",\n        \"capital\",\n      ],\n      temps: [\n        //\n        \"duree\",\n        \"periode\",\n        \"moment\",\n      ],\n      grand: [\n        //\n        \"enorme\",\n        \"immense\",\n        \"gigantesque\",\n      ],\n      petit: [\n        //\n        \"minuscule\",\n        \"minime\",\n        \"reduit\",\n      ],\n      rapide: [\n        //\n        \"vite\",\n        \"accelere\",\n        \"prompt\",\n      ],\n      lent: [\n        //\n        \"lentement\",\n        \"doucement\",\n      ],\n      bon: [\n        //\n        \"excellent\",\n        \"parfait\",\n        \"formidable\",\n      ],\n      mauvais: [\n        //\n        \"terrible\",\n        \"affreux\",\n        \"horrible\",\n      ],\n      heureux: [\n        //\n        \"joyeux\",\n        \"content\",\n        \"ravi\",\n      ],\n      triste: [\n        //\n        \"malheureux\",\n        \"chagrine\",\n        \"melancolique\",\n      ],\n    };\n\n    const normalized = this.normalize(word);\n    return synonymMap[normalized] || [];\n  }\n\n  /**\n   * French keyboard layout (AZERTY)\n   */\n  protected getKeyboardNeighbors(): Record<string, string[]> {\n    return {\n      a: [\n        //\n        \"z\",\n        \"e\",\n        \"r\",\n        \"q\",\n        \"s\",\n      ],\n      z: [\n        //\n        \"a\",\n        \"e\",\n        \"r\",\n        \"q\",\n        \"s\",\n        \"d\",\n      ],\n      e: [\n        //\n        \"z\",\n        \"r\",\n        \"t\",\n        \"s\",\n        \"d\",\n        \"f\",\n      ],\n      r: [\n        //\n        \"e\",\n        \"t\",\n        \"y\",\n        \"d\",\n        \"f\",\n        \"g\",\n      ],\n      t: [\n        //\n        \"r\",\n        \"y\",\n        \"u\",\n        \"f\",\n        \"g\",\n        \"h\",\n      ],\n      y: [\n        //\n        \"t\",\n        \"u\",\n        \"i\",\n        \"g\",\n        \"h\",\n        \"j\",\n      ],\n      u: [\n        //\n        \"y\",\n        \"i\",\n        \"o\",\n        \"h\",\n        \"j\",\n        \"k\",\n      ],\n      i: [\n        //\n        \"u\",\n        \"o\",\n        \"p\",\n        \"j\",\n        \"k\",\n        \"l\",\n      ],\n      o: [\n        //\n        \"i\",\n        \"p\",\n        \"k\",\n        \"l\",\n        \"m\",\n      ],\n      p: [\n        //\n        \"o\",\n        \"l\",\n        \"m\",\n      ],\n      q: [\n        //\n        \"a\",\n        \"z\",\n        \"s\",\n        \"w\",\n        \"x\",\n      ],\n      s: [\n        //\n        \"a\",\n        \"z\",\n        \"e\",\n        \"q\",\n        \"d\",\n        \"w\",\n        \"x\",\n        \"c\",\n      ],\n      d: [\n        //\n        \"z\",\n        \"e\",\n        \"r\",\n        \"s\",\n        \"f\",\n        \"x\",\n        \"c\",\n        \"v\",\n      ],\n      f: [\n        //\n        \"e\",\n        \"r\",\n        \"t\",\n        \"d\",\n        \"g\",\n        \"c\",\n        \"v\",\n        \"b\",\n      ],\n      g: [\n        //\n        \"r\",\n        \"t\",\n        \"y\",\n        \"f\",\n        \"h\",\n        \"v\",\n        \"b\",\n        \"n\",\n      ],\n      h: [\n        //\n        \"t\",\n        \"y\",\n        \"u\",\n        \"g\",\n        \"j\",\n        \"b\",\n        \"n\",\n      ],\n      j: [\n        //\n        \"y\",\n        \"u\",\n        \"i\",\n        \"h\",\n        \"k\",\n        \"n\",\n      ],\n      k: [\n        //\n        \"u\",\n        \"i\",\n        \"o\",\n        \"j\",\n        \"l\",\n      ],\n      l: [\n        //\n        \"i\",\n        \"o\",\n        \"p\",\n        \"k\",\n        \"m\",\n      ],\n      m: [\n        //\n        \"o\",\n        \"p\",\n        \"l\",\n      ],\n      w: [\n        //\n        \"q\",\n        \"s\",\n        \"x\",\n      ],\n      x: [\n        //\n        \"q\",\n        \"s\",\n        \"d\",\n        \"w\",\n        \"c\",\n      ],\n      c: [\n        //\n        \"s\",\n        \"d\",\n        \"f\",\n        \"x\",\n        \"v\",\n      ],\n      v: [\n        //\n        \"d\",\n        \"f\",\n        \"g\",\n        \"c\",\n        \"b\",\n      ],\n      b: [\n        //\n        \"f\",\n        \"g\",\n        \"h\",\n        \"v\",\n        \"n\",\n      ],\n      n: [\n        //\n        \"g\",\n        \"h\",\n        \"j\",\n        \"b\",\n      ],\n    };\n  }\n}\n"],"names":["BaseLanguageProcessor"],"mappings":"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,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ;AACF;;"}