{"version":3,"file":"SpanishProcessor.cjs","sources":["../../../../src/languages/spanish/SpanishProcessor.ts"],"sourcesContent":["import { BaseLanguageProcessor } from \"../base/LanguageProcessor.js\";\nimport type { FuzzyFeature } from \"../../core/types.js\";\n\n/**\n * Spanish language processor with specialized features:\n * - Accent normalization (á, é, í, ó, ú, ñ)\n * - Spanish phonetic patterns\n * - Common Spanish word endings\n * - Spanish synonym support\n */\nexport class SpanishProcessor extends BaseLanguageProcessor {\n  readonly language = \"spanish\";\n  readonly displayName = \"Español\";\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   * Spanish 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, \"n\")\n        .replace(/ü/g, \"u\")\n    );\n  }\n\n  /**\n   * Spanish 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      let digit = \"\";\n\n      switch (char) {\n        case \"a\":\n        case \"e\":\n        case \"i\":\n        case \"o\":\n        case \"u\":\n          digit = \"0\";\n          break;\n        case \"b\":\n        case \"v\": // B and V sound similar in Spanish\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 === \"u\" && i + 2 < normalized.length && (normalized[i + 2] === \"e\" || normalized[i + 2] === \"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 silent in Spanish\n          continue;\n        case \"j\":\n          digit = \"6\";\n          break;\n        case \"k\":\n          digit = \"4\";\n          break;\n        case \"l\":\n          if (next === \"l\") {\n            digit = \"7\"; // LL sound\n          } else {\n            digit = \"5\";\n          }\n          break;\n        case \"m\":\n          digit = \"6\";\n          break;\n        case \"n\":\n          if (next === \"n\") {\n            digit = \"7\"; // NN sound (rare)\n          } else {\n            digit = \"6\";\n          }\n          break;\n        case \"ñ\":\n          digit = \"7\"; // Ñ sound\n          break;\n        case \"p\":\n          digit = \"1\";\n          break;\n        case \"q\":\n          digit = \"4\";\n          break;\n        case \"r\":\n          if (next === \"r\" || i === 0) {\n            digit = \"8\"; // RR or initial R\n          } else {\n            digit = \"7\";\n          }\n          break;\n        case \"s\":\n          digit = \"8\";\n          break;\n        case \"t\":\n          digit = \"3\";\n          break;\n        case \"w\":\n          digit = \"1\"; // Rare in Spanish\n          break;\n        case \"x\":\n          digit = \"48\";\n          break;\n        case \"y\":\n          digit = \"7\";\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   * Spanish word endings\n   */\n  protected getCommonEndings(): string[] {\n    return [\n      //\n      \"o\",\n      \"a\",\n      \"os\",\n      \"as\",\n      \"e\",\n      \"es\",\n      \"ar\",\n      \"er\",\n      \"ir\",\n      \"ado\",\n      \"ada\",\n      \"idos\",\n      \"idas\",\n      \"ando\",\n      \"endo\",\n      \"iendo\",\n      \"cion\",\n      \"sion\",\n      \"dad\",\n      \"tad\",\n      \"mente\",\n      \"oso\",\n      \"osa\",\n      \"ito\",\n      \"ita\",\n      \"illo\",\n      \"illa\",\n    ];\n  }\n\n  /**\n   * Spanish synonyms\n   */\n  getSynonyms(word: string): string[] {\n    const synonymMap: Record<string, string[]> = {\n      medico: [\n        //\n        \"doctor\",\n        \"facultativo\",\n      ],\n      hospital: [\n        //\n        \"clinica\",\n        \"sanatorio\",\n      ],\n      escuela: [\n        //\n        \"colegio\",\n        \"instituto\",\n      ],\n      coche: [\n        //\n        \"auto\",\n        \"automovil\",\n        \"vehiculo\",\n      ],\n      casa: [\n        //\n        \"hogar\",\n        \"vivienda\",\n        \"domicilio\",\n      ],\n      calle: [\n        //\n        \"via\",\n        \"avenida\",\n        \"carretera\",\n      ],\n      ciudad: [\n        //\n        \"urbe\",\n        \"poblacion\",\n        \"municipio\",\n      ],\n      trabajo: [\n        //\n        \"empleo\",\n        \"ocupacion\",\n        \"labor\",\n      ],\n      dinero: [\n        //\n        \"plata\",\n        \"efectivo\",\n        \"capital\",\n      ],\n      tiempo: [\n        //\n        \"momento\",\n        \"periodo\",\n        \"duracion\",\n      ],\n      grande: [\n        //\n        \"enorme\",\n        \"gigante\",\n        \"inmenso\",\n      ],\n      pequeno: [\n        //\n        \"chico\",\n        \"diminuto\",\n        \"minusculo\",\n      ],\n      rapido: [\n        //\n        \"veloz\",\n        \"ligero\",\n        \"acelerado\",\n      ],\n      lento: [\n        //\n        \"despacio\",\n        \"pausado\",\n      ],\n      bueno: [\n        //\n        \"excelente\",\n        \"magnifico\",\n        \"estupendo\",\n      ],\n      malo: [\n        //\n        \"pesimo\",\n        \"terrible\",\n        \"horrible\",\n      ],\n    };\n\n    const normalized = this.normalize(word);\n    return synonymMap[normalized] || [];\n  }\n}\n"],"names":["BaseLanguageProcessor"],"mappings":"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"}