/** * Erzeugt aus einem Titel einen URL-tauglichen Bezeichner. * * Deutsche Umlaute werden umschrieben, alles Übrige auf Kleinbuchstaben, * Ziffern und Bindestriche reduziert. Gleiche Regel wie in den Importskripten, * damit Dateinamen unter `data/policies/` und URLs übereinstimmen. */ export function slugify(value: string): string { return value // Zusammengesetzte Zeichen vereinheitlichen: Aus PDFs kommt "ä" oft als // "a" plus Trema-Zeichen, das die Ersetzungen unten sonst nicht treffen. .normalize("NFC") .toLowerCase() .replace(/ä/g, "ae") .replace(/ö/g, "oe") .replace(/ü/g, "ue") .replace(/ß/g, "ss") .replace(/[^a-z0-9]+/g, "-") .replace(/^-|-$/g, "") .slice(0, 60) } /** * Macht einen Bezeichner eindeutig, indem bei Kollision `-2`, `-3`, … angehängt * wird. `vergeben` enthält die bereits belegten Bezeichner. */ export function uniqueSlug(value: string, vergeben: Set): string { const basis = slugify(value) || "erklaerung" if (!vergeben.has(basis)) return basis let zaehler = 2 while (vergeben.has(`${basis}-${zaehler}`)) zaehler++ return `${basis}-${zaehler}` }