Đỗ Hải Nam
feat(frontend): interactive chat UI with math rendering
471f166
/**
* Preprocess LaTeX content to ensure proper rendering
* Convert \[...\] to $$...$$ and \(...\) to $...$
*/
export const preprocessLaTeX = (content) => {
if (!content) return ''
let processed = content
// Convert \[...\] to $$...$$ (display math)
processed = processed.replace(/\\\[([\s\S]*?)\\\]/g, (match, math) => `$$${math}$$`)
// Convert \(...\) to $...$ (inline math)
processed = processed.replace(/\\\(([\s\S]*?)\\\)/g, (match, math) => `$${math}$`)
return processed
}
/**
* Parse message content - handles both legacy JSON blocks and new plain markdown
*/
export const parseMessageContent = (content) => {
if (!content) return ''
if (content.trim().startsWith('{') && content.includes('"blocks"')) {
try {
const parsed = JSON.parse(content)
if (parsed.blocks && Array.isArray(parsed.blocks)) {
return parsed.blocks.map(block => {
if (block.type === 'text') return block.content || ''
else if (block.type === 'math') {
const latex = block.latex || block.content || ''
const display = block.display === 'inline' ? '$' : '$$'
return `${display}${latex}${display}`
} else if (block.type === 'list') {
const items = block.items || []
return items.map((item, i) => `${block.ordered ? `${i + 1}.` : '-'} ${item}`).join('\n')
}
return ''
}).join('\n\n')
}
} catch { /* Not valid JSON */ }
}
return content.replace(/\\n/g, '\n')
}