feat(chat): render LaTeX math formulas in assistant messages (#886)
Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Haze <hazeone@users.noreply.github.com>
This commit is contained in:
@@ -30,3 +30,52 @@ describe('ChatMessage attachment dedupe', () => {
|
||||
expect(screen.getByAltText('artifact.png')).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
|
||||
describe('ChatMessage LaTeX rendering', () => {
|
||||
it('renders inline `$...$` math with KaTeX', () => {
|
||||
const message: RawMessage = {
|
||||
role: 'assistant',
|
||||
content: 'Mass-energy equivalence: $E=mc^2$ is famous.',
|
||||
};
|
||||
const { container } = render(<ChatMessage message={message} />);
|
||||
expect(container.querySelector('.katex')).not.toBeNull();
|
||||
});
|
||||
|
||||
it('renders display `$$...$$` math as a block', () => {
|
||||
const message: RawMessage = {
|
||||
role: 'assistant',
|
||||
content: 'Definite integral:\n\n$$\n\\int_0^1 x\\,dx = \\frac{1}{2}\n$$\n',
|
||||
};
|
||||
const { container } = render(<ChatMessage message={message} />);
|
||||
expect(container.querySelector('.katex-display')).not.toBeNull();
|
||||
});
|
||||
|
||||
it('renders `\\(...\\)` inline math (OpenAI-style escaping)', () => {
|
||||
const message: RawMessage = {
|
||||
role: 'assistant',
|
||||
content: 'Quadratic formula: \\(x = \\frac{-b \\pm \\sqrt{b^2-4ac}}{2a}\\).',
|
||||
};
|
||||
const { container } = render(<ChatMessage message={message} />);
|
||||
expect(container.querySelector('.katex')).not.toBeNull();
|
||||
expect(container.querySelector('.katex-display')).toBeNull();
|
||||
});
|
||||
|
||||
it('renders `\\[...\\]` block math (OpenAI-style escaping)', () => {
|
||||
const message: RawMessage = {
|
||||
role: 'assistant',
|
||||
content: 'Sum formula:\n\n\\[\\sum_{i=1}^n i = \\frac{n(n+1)}{2}\\]',
|
||||
};
|
||||
const { container } = render(<ChatMessage message={message} />);
|
||||
expect(container.querySelector('.katex-display')).not.toBeNull();
|
||||
});
|
||||
|
||||
it('does not rewrite `\\(` inside code fences', () => {
|
||||
const message: RawMessage = {
|
||||
role: 'assistant',
|
||||
content: 'Code sample:\n\n```\nprintf("\\(hello\\)")\n```\n',
|
||||
};
|
||||
const { container } = render(<ChatMessage message={message} />);
|
||||
expect(container.textContent).toContain('\\(hello\\)');
|
||||
expect(container.querySelector('.katex')).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user