🧮 feat: Improve LaTeX rendering consistency (#3763)

* refactor: simplify LaTeX pre-processing for more consistent rendering, disables `singleDollarTextMath`

* refactor: disable singleDollarTextMath in all markdown components

* wip: first pass

* refactor: preserve code blocks and convert rather than preserve LaTeX delimiters

* refactor: remove unused escapeDollarNumber function from latex.ts
This commit is contained in:
Danny Avila 2024-08-23 13:45:27 -04:00 committed by GitHub
parent 967e8a1e92
commit ea5140ff0f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 156 additions and 3 deletions

View file

@ -1,4 +1,5 @@
import { processLaTeX } from './latex';
/* eslint-disable no-useless-escape */
import { processLaTeX, preprocessLaTeX } from './latex';
describe('processLaTeX', () => {
test('returns the same string if no LaTeX patterns are found', () => {
@ -103,3 +104,92 @@ describe('processLaTeX', () => {
});
});
});
describe('preprocessLaTeX', () => {
test('returns the same string if no LaTeX patterns are found', () => {
const content = 'This is a test string without LaTeX';
expect(preprocessLaTeX(content)).toBe(content);
});
test('escapes dollar signs followed by digits', () => {
const content = 'Price is $50 and $100';
const expected = 'Price is \\$50 and \\$100';
expect(preprocessLaTeX(content)).toBe(expected);
});
test('does not escape dollar signs not followed by digits', () => {
const content = 'This $variable is not escaped';
expect(preprocessLaTeX(content)).toBe(content);
});
test('preserves existing LaTeX expressions', () => {
const content = 'Inline $x^2 + y^2 = z^2$ and block $$E = mc^2$$';
expect(preprocessLaTeX(content)).toBe(content);
});
test('handles mixed LaTeX and currency', () => {
const content = 'LaTeX $x^2$ and price $50';
const expected = 'LaTeX $x^2$ and price \\$50';
expect(preprocessLaTeX(content)).toBe(expected);
});
test('converts LaTeX delimiters', () => {
const content = 'Brackets \\[x^2\\] and parentheses \\(y^2\\)';
const expected = 'Brackets $$x^2$$ and parentheses $y^2$';
expect(preprocessLaTeX(content)).toBe(expected);
});
test('escapes mhchem commands', () => {
const content = '$\\ce{H2O}$ and $\\pu{123 J}$';
const expected = '$\\\\ce{H2O}$ and $\\\\pu{123 J}$';
expect(preprocessLaTeX(content)).toBe(expected);
});
test('handles complex mixed content', () => {
const content = `
LaTeX inline $x^2$ and block $$y^2$$
Currency $100 and $200
Chemical $\\ce{H2O}$
Brackets \\[z^2\\]
`;
const expected = `
LaTeX inline $x^2$ and block $$y^2$$
Currency \\$100 and \\$200
Chemical $\\\\ce{H2O}$
Brackets $$z^2$$
`;
expect(preprocessLaTeX(content)).toBe(expected);
});
test('handles empty string', () => {
expect(preprocessLaTeX('')).toBe('');
});
test('preserves code blocks', () => {
const content = '```\n$100\n```\nOutside $200';
const expected = '```\n$100\n```\nOutside \\$200';
expect(preprocessLaTeX(content)).toBe(expected);
});
test('handles multiple currency values in a sentence', () => {
const content = 'I have $50 in my wallet and $100 in the bank.';
const expected = 'I have \\$50 in my wallet and \\$100 in the bank.';
expect(preprocessLaTeX(content)).toBe(expected);
});
test('preserves LaTeX expressions with numbers', () => {
const content = 'The equation is $f(x) = 2x + 3$ where x is a variable.';
expect(preprocessLaTeX(content)).toBe(content);
});
test('handles currency values with commas', () => {
const content = 'The price is $1,000,000 for this item.';
const expected = 'The price is \\$1,000,000 for this item.';
expect(preprocessLaTeX(content)).toBe(expected);
});
test('preserves LaTeX expressions with special characters', () => {
const content = 'The set is defined as $\\{x | x > 0\\}$.';
expect(preprocessLaTeX(content)).toBe(content);
});
});