// SRC-04: zerlegt einen von der Mail-Suche gelieferten Snippet-Text in // Textsegmente. Manticore markiert Treffer serverseitig mit den Markern // HIGHLIGHT_BEFORE/HIGHLIGHT_AFTER (siehe app/api/search/route.ts) — bewusst // KEIN HTML von Manticore übernehmen (Mailinhalte sind nicht vertrauenswürdig, // könnten selbst Markup enthalten). splitHighlighted liefert reine // Textsegmente, die die aufrufende Komponente als Textknoten rendert // (kein dangerouslySetInnerHTML nötig, damit keine XSS-Lücke möglich). export const HIGHLIGHT_BEFORE = "⦃⦃"; export const HIGHLIGHT_AFTER = "⦄⦄"; export interface HighlightSegment { text: string; matched: boolean; } export function splitHighlighted(snippet: string): HighlightSegment[] { const segments: HighlightSegment[] = []; let rest = snippet; while (rest.length > 0) { const startIdx = rest.indexOf(HIGHLIGHT_BEFORE); if (startIdx === -1) { segments.push({ text: rest, matched: false }); break; } if (startIdx > 0) { segments.push({ text: rest.slice(0, startIdx), matched: false }); } const afterStart = rest.slice(startIdx + HIGHLIGHT_BEFORE.length); const endIdx = afterStart.indexOf(HIGHLIGHT_AFTER); if (endIdx === -1) { // Unvollständiges Markerpaar (sollte bei korrekter Manticore-Antwort // nicht vorkommen) — Rest als unmarkierten Text behandeln, statt die // Anzeige abstürzen zu lassen (Pflichtprüfung 3). segments.push({ text: afterStart, matched: false }); break; } segments.push({ text: afterStart.slice(0, endIdx), matched: true }); rest = afterStart.slice(endIdx + HIGHLIGHT_AFTER.length); } return segments; }