/** * Normalisiert deutsche Umlaute/scharfes S fuer die Produktsuche: "ü", "ö", * "ä" und "ß" werden auf ihre gaengige ASCII-Transliteration ("ue", "oe", * "ae", "ss") abgebildet. Ohne das liefert eine Suche nach "Bluete" keine * Treffer fuer "Blüte" und umgekehrt — viele Kundinnen und Kunden tippen aus * Gewohnheit oder auf einer nicht-deutschen Tastatur die ASCII-Schreibweise, * waehrend Produktnamen/-tags im Katalog durchgaengig echte Umlaute nutzen * (z.B. "Frühtracht", "kräftig", "Altenmünster"). */ export function normalizeSearchText(value: string): string { return value .toLowerCase() .replace(/ä/g, "ae") .replace(/ö/g, "oe") .replace(/ü/g, "ue") .replace(/ß/g, "ss"); } /** * Mehrwortige Teilstring-Suche: jedes Wort aus `query` muss irgendwo in * `haystack` vorkommen (Reihenfolge egal), umlaut-unabhaengig in beide * Richtungen (echter Umlaut <-> ASCII-Transliteration). */ export function matchesSearchQuery(haystack: string, query: string): boolean { const words = normalizeSearchText(query).split(/\s+/).filter(Boolean); if (words.length === 0) return true; const normalizedHaystack = normalizeSearchText(haystack); return words.every((word) => normalizedHaystack.includes(word)); }