{"version":3,"file":"GermanProcessor.cjs","sources":["../../../../src/languages/german/GermanProcessor.ts"],"sourcesContent":["import { BaseLanguageProcessor } from \"../base/LanguageProcessor.js\";\nimport type { FuzzyFeature } from \"../../core/types.js\";\n\n/**\n * German language processor with specialized features:\n * - Umlaut normalization (ä, ö, ü, ß)\n * - Compound word splitting\n * - German-specific phonetic matching (Kölner Phonetik)\n * - Common German word endings\n */\nexport class GermanProcessor extends BaseLanguageProcessor {\n  readonly language = \"german\";\n  readonly displayName = \"Deutsch\";\n  readonly supportedFeatures: FuzzyFeature[] = [\"phonetic\", \"compound\", \"synonyms\", \"keyboard-neighbors\", \"partial-words\", \"missing-letters\", \"extra-letters\"];\n\n  /**\n   * German text normalization with umlaut handling\n   */\n  normalize(text: string): string {\n    return (\n      text\n        .toLowerCase()\n        .trim()\n        .replace(/\\s+/g, \" \")\n        // Normalize umlauts\n        .replace(/ä/g, \"ae\")\n        .replace(/ö/g, \"oe\")\n        .replace(/ü/g, \"ue\")\n        .replace(/ß/g, \"ss\")\n    );\n  }\n\n  /**\n   * Kölner Phonetik algorithm for German 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 \"j\":\n        case \"o\":\n        case \"u\":\n        case \"y\":\n          digit = \"0\";\n          break;\n        case \"h\":\n          // H is ignored\n          continue;\n        case \"b\":\n        case \"p\":\n          digit = \"1\";\n          break;\n        case \"d\":\n        case \"t\":\n          if (next === \"c\" || next === \"s\" || next === \"z\") {\n            digit = \"8\";\n          } else {\n            digit = \"2\";\n          }\n          break;\n        case \"f\":\n        case \"v\":\n        case \"w\":\n          digit = \"3\";\n          break;\n        case \"g\":\n        case \"k\":\n        case \"q\":\n          digit = \"4\";\n          break;\n        case \"c\":\n          if (i === 0) {\n            if (next === \"a\" || next === \"h\" || next === \"k\" || next === \"l\" || next === \"o\" || next === \"q\" || next === \"r\" || next === \"u\" || next === \"x\") {\n              digit = \"4\";\n            } else {\n              digit = \"8\";\n            }\n          } else {\n            if (prev === \"s\" || prev === \"z\") {\n              digit = \"8\";\n            } else if (next === \"h\") {\n              digit = \"4\";\n            } else if (next === \"k\" || next === \"q\") {\n              digit = \"4\";\n            } else {\n              digit = \"8\";\n            }\n          }\n          break;\n        case \"x\":\n          if (prev === \"c\" || prev === \"k\" || prev === \"q\") {\n            digit = \"8\";\n          } else {\n            digit = \"48\";\n          }\n          break;\n        case \"l\":\n          digit = \"5\";\n          break;\n        case \"m\":\n        case \"n\":\n          digit = \"6\";\n          break;\n        case \"r\":\n          digit = \"7\";\n          break;\n        case \"s\":\n        case \"z\":\n          digit = \"8\";\n          break;\n        default:\n          continue;\n      }\n\n      // Don't add consecutive identical digits\n      if (digit && digit !== prev) {\n        code += digit;\n      }\n      prev = digit;\n    }\n\n    return code || \"0\";\n  }\n\n  /**\n   * German compound word splitting\n   * Uses common German compound patterns and a dictionary approach\n   */\n  splitCompoundWords(word: string): string[] {\n    const normalized = this.normalize(word);\n    if (normalized.length < 6) return [word]; // Too short to be compound\n\n    const parts: string[] = [];\n    const commonPrefixes = this.getCommonPrefixes();\n    const commonSuffixes = this.getCommonSuffixes();\n    const commonWords = this.getCommonWords();\n\n    // Try to find known prefixes\n    for (const prefix of commonPrefixes) {\n      if (normalized.startsWith(prefix) && normalized.length > prefix.length + 3) {\n        const remainder = normalized.slice(prefix.length);\n        parts.push(prefix);\n        parts.push(...this.splitCompoundWords(remainder));\n        break;\n      }\n    }\n\n    if (parts.length === 0) {\n      // Try to find known suffixes\n      for (const suffix of commonSuffixes) {\n        if (normalized.endsWith(suffix) && normalized.length > suffix.length + 3) {\n          const remainder = normalized.slice(0, -suffix.length);\n          parts.push(...this.splitCompoundWords(remainder));\n          parts.push(suffix);\n          break;\n        }\n      }\n    }\n\n    if (parts.length === 0) {\n      // Try to find known words within the compound\n      for (let i = 3; i <= normalized.length - 3; i++) {\n        const leftPart = normalized.slice(0, i);\n        const rightPart = normalized.slice(i);\n\n        if (commonWords.has(leftPart) && rightPart.length >= 3) {\n          parts.push(leftPart);\n          parts.push(...this.splitCompoundWords(rightPart));\n          break;\n        }\n      }\n    }\n\n    return parts.length > 0 ? parts : [word];\n  }\n\n  /**\n   * German word variants including common endings\n   * Uses optimized base implementation with German-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    // Add German-specific compound word parts\n    const compoundParts = this.splitCompoundWords(word);\n    if (compoundParts.length > 1) {\n      compoundParts.forEach((part) => {\n        if (part.length >= 3) {\n          variants.add(this.normalize(part));\n        }\n      });\n    }\n\n    return Array.from(variants);\n  }\n\n  /**\n   * German word endings\n   */\n  protected getCommonEndings(): string[] {\n    return [\n      //\n      \"en\",\n      \"e\",\n      \"er\",\n      \"n\",\n      \"r\",\n      \"s\",\n      \"es\",\n      \"t\",\n      \"ung\",\n      \"heit\",\n      \"keit\",\n      \"schaft\",\n      \"chen\",\n      \"lein\",\n      \"lich\",\n      \"ig\",\n      \"isch\",\n      \"bar\",\n      \"los\",\n      \"voll\",\n    ];\n  }\n\n  /**\n   * German synonyms for common words\n   */\n  getSynonyms(word: string): string[] {\n    const synonymMap: Record<string, string[]> = {\n      arzt: [\n        //\n        \"doktor\",\n        \"mediziner\",\n        \"doc\",\n      ],\n      krankenhaus: [\n        //\n        \"spital\",\n        \"klinik\",\n        \"hospital\",\n      ],\n      schule: [\n        //\n        \"bildungseinrichtung\",\n        \"lehranstalt\",\n      ],\n      auto: [\n        //\n        \"wagen\",\n        \"fahrzeug\",\n        \"pkw\",\n      ],\n      haus: [\n        //\n        \"gebaeude\",\n        \"heim\",\n        \"wohnhaus\",\n      ],\n      strasse: [\n        //\n        \"weg\",\n        \"gasse\",\n        \"allee\",\n      ],\n      stadt: [\n        //\n        \"ort\",\n        \"gemeinde\",\n        \"ortschaft\",\n      ],\n      arbeit: [\n        //\n        \"job\",\n        \"beruf\",\n        \"taetigkeit\",\n      ],\n      geld: [\n        //\n        \"waehrung\",\n        \"kapital\",\n        \"finanzen\",\n      ],\n      zeit: [\n        //\n        \"dauer\",\n        \"periode\",\n        \"zeitraum\",\n      ],\n    };\n\n    const normalized = this.normalize(word);\n    return synonymMap[normalized] || [];\n  }\n\n  /**\n   * German keyboard layout (QWERTZ)\n   */\n  protected getKeyboardNeighbors(): Record<string, string[]> {\n    return {\n      q: [\n        //\n        \"w\",\n        \"a\",\n        \"s\",\n      ],\n      w: [\n        //\n        \"q\",\n        \"e\",\n        \"a\",\n        \"s\",\n        \"d\",\n      ],\n      e: [\n        //\n        \"w\",\n        \"r\",\n        \"s\",\n        \"d\",\n        \"f\",\n      ],\n      r: [\n        //\n        \"e\",\n        \"t\",\n        \"d\",\n        \"f\",\n        \"g\",\n      ],\n      t: [\n        //\n        \"r\",\n        \"z\",\n        \"f\",\n        \"g\",\n        \"h\",\n      ],\n      z: [\n        //\n        \"t\",\n        \"u\",\n        \"g\",\n        \"h\",\n        \"j\",\n      ], // QWERTZ difference\n      u: [\n        //\n        \"z\",\n        \"i\",\n        \"h\",\n        \"j\",\n        \"k\",\n      ],\n      i: [\n        //\n        \"u\",\n        \"o\",\n        \"j\",\n        \"k\",\n        \"l\",\n      ],\n      o: [\n        //\n        \"i\",\n        \"p\",\n        \"k\",\n        \"l\",\n        \"oe\",\n      ],\n      p: [\n        //\n        \"o\",\n        \"ue\",\n        \"l\",\n        \"oe\",\n      ],\n      ue: [\n        //\n        \"p\",\n        \"ae\",\n      ], // German umlaut\n      a: [\n        //\n        \"q\",\n        \"w\",\n        \"s\",\n        \"y\",\n        \"x\",\n      ],\n      s: [\n        //\n        \"q\",\n        \"w\",\n        \"e\",\n        \"a\",\n        \"d\",\n        \"y\",\n        \"x\",\n        \"c\",\n      ],\n      d: [\n        //\n        \"w\",\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        \"z\",\n        \"f\",\n        \"h\",\n        \"v\",\n        \"b\",\n        \"n\",\n      ],\n      h: [\n        //\n        \"t\",\n        \"z\",\n        \"u\",\n        \"g\",\n        \"j\",\n        \"b\",\n        \"n\",\n        \"m\",\n      ],\n      j: [\n        //\n        \"z\",\n        \"u\",\n        \"i\",\n        \"h\",\n        \"k\",\n        \"n\",\n        \"m\",\n      ],\n      k: [\n        //\n        \"u\",\n        \"i\",\n        \"o\",\n        \"j\",\n        \"l\",\n        \"m\",\n      ],\n      l: [\n        //\n        \"i\",\n        \"o\",\n        \"p\",\n        \"k\",\n        \"oe\",\n      ],\n      oe: [\n        //\n        \"o\",\n        \"p\",\n        \"ue\",\n        \"l\",\n        \"ae\",\n      ], // German umlaut\n      ae: [\n        //\n        \"ue\",\n        \"oe\",\n      ], // German umlaut\n      y: [\n        //\n        \"a\",\n        \"s\",\n        \"x\",\n      ], // QWERTZ difference\n      x: [\n        //\n        \"a\",\n        \"s\",\n        \"d\",\n        \"y\",\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        \"m\",\n      ],\n      m: [\n        //\n        \"h\",\n        \"j\",\n        \"k\",\n        \"n\",\n      ],\n    };\n  }\n\n  /**\n   * Common German prefixes for compound word splitting\n   */\n  private getCommonPrefixes(): string[] {\n    return [\"un\", \"vor\", \"nach\", \"bei\", \"mit\", \"ab\", \"an\", \"auf\", \"aus\", \"ein\", \"gegen\", \"hinter\", \"neben\", \"ueber\", \"unter\", \"zwischen\", \"selbst\"];\n  }\n\n  /**\n   * Common German suffixes for compound word splitting\n   */\n  private getCommonSuffixes(): string[] {\n    return [\"haus\", \"platz\", \"strasse\", \"weg\", \"hof\", \"berg\", \"tal\", \"feld\", \"stadt\", \"dorf\", \"heim\", \"werk\", \"bau\", \"anlage\", \"zentrum\"];\n  }\n\n  /**\n   * Common German words for compound splitting\n   */\n  private getCommonWords(): Set<string> {\n    return new Set([\"kranken\", \"kinder\", \"frauen\", \"maenner\", \"alt\", \"neu\", \"gross\", \"klein\", \"hoch\", \"tief\", \"lang\", \"kurz\", \"breit\", \"schmal\", \"dick\", \"duenn\", \"stark\", \"schwach\", \"schnell\", \"langsam\", \"heiss\", \"kalt\", \"warm\", \"auto\", \"bahn\", \"bus\", \"zug\", \"flug\", \"schiff\", \"rad\", \"motor\", \"wasser\", \"feuer\", \"erde\", \"luft\", \"licht\", \"schatten\", \"sonne\", \"mond\", \"tag\", \"nacht\", \"morgen\", \"abend\", \"mittag\", \"zeit\", \"jahr\", \"monat\"]);\n  }\n}\n"],"names":["BaseLanguageProcessor"],"mappings":"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AAA;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,MAEF,IAAI;AAAA;AAAA,QAEF;AAAA,QACA;AAAA,MAAA;AAAA;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,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,IAAI;AAAA;AAAA,QAEF;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA;AAAA,MAEF,IAAI;AAAA;AAAA,QAEF;AAAA,QACA;AAAA,MAAA;AAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA;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,QACA;AAAA,MAAA;AAAA,MAEF,GAAG;AAAA;AAAA,QAED;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAA8B;AACpC,WAAO,CAAC,MAAM,OAAO,QAAQ,OAAO,OAAO,MAAM,MAAM,OAAO,OAAO,OAAO,SAAS,UAAU,SAAS,SAAS,SAAS,YAAY,QAAQ;AAAA,EAChJ;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAA8B;AACpC,WAAO,CAAC,QAAQ,SAAS,WAAW,OAAO,OAAO,QAAQ,OAAO,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,OAAO,UAAU,SAAS;AAAA,EACtI;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAA8B;AACpC,WAAO,oBAAI,IAAI,CAAC,WAAW,UAAU,UAAU,WAAW,OAAO,OAAO,SAAS,SAAS,QAAQ,QAAQ,QAAQ,QAAQ,SAAS,UAAU,QAAQ,SAAS,SAAS,WAAW,WAAW,WAAW,SAAS,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,OAAO,QAAQ,UAAU,OAAO,SAAS,UAAU,SAAS,QAAQ,QAAQ,SAAS,YAAY,SAAS,QAAQ,OAAO,SAAS,UAAU,SAAS,UAAU,QAAQ,QAAQ,OAAO,CAAC;AAAA,EACjb;AACF;;"}