// Markdown-Renderer fuer Chat-Messages. // Kompakter Wrapper um marked + Custom Code-Block-Renderer. // Wird aus Message.svelte (Phase 8) und ChatPanel (legacy) verwendet. import { marked, type Tokens } from 'marked'; const renderer = new marked.Renderer(); renderer.code = function ({ text, lang }: Tokens.Code): string { const language = lang || ''; const escapedCode = text .replace(/&/g, '&') .replace(//g, '>'); return `
${escapedCode}
`; }; marked.setOptions({ breaks: true, gfm: true, renderer }); /** * Erkennt "Denk-Bloecke" im Text und zeigt sie als kompakte Inline-Elemente. * Zwei Quellen: * 1. SDK Extended-Thinking (kommt als
aus der Bridge) * 2. Text-basierte Patterns (Lass mich analysieren..., Ich schaue mir...) */ function collapseThinkingBlocks(text: string): string { if (text.includes('
')) return text; if (text.includes('
')) { return text.replace( /
.*?
([\s\S]*?)<\/div><\/details>/g, (_m, content) => `
\u{1F4AD}${content}
` ); } const thinkingPatterns = [ /^((?:(?:Lass mich|Let me|Ich (?:schaue|prüfe|analysiere|untersuche|überleg|werde)|OK,? (?:lass|ich)|Gut,? (?:lass|ich)|Hmm|Also,? |Zunächst|Zuerst|Schauen wir|Jetzt (?:schaue|prüfe|check)).*?\n(?:.*\n)*?))((?:\n(?:#{1,3} |(?:\*\*|Die |Das |Hier |Zusammen|Fertig|Erledigt|Done|✅|---)).*[\s\S]*))/m, ]; for (const pattern of thinkingPatterns) { const match = text.match(pattern); if (match && match[1] && match[1].split('\n').length > 5) { const thinkingPart = match[1].trim().replace(/&/g, '&').replace(//g, '>'); const answerPart = match[2].trim(); return `
\u{1F4AD}${thinkingPart}
\n\n${answerPart}`; } } return text; } export function renderMarkdown(text: string): string { try { return marked.parse(collapseThinkingBlocks(text)) as string; } catch { return text; } }