2026-02-24 12:30:06 +08:00
|
|
|
import { preprocessLaTeX } from '../chat';
|
|
|
|
|
|
|
|
|
|
describe('preprocessLaTeX', () => {
|
|
|
|
|
it('converts block \\[ \\] to $$ $$', () => {
|
|
|
|
|
expect(preprocessLaTeX('\\[ x + y \\]')).toBe('$$x + y$$');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('converts inline \\( \\) to $ $', () => {
|
|
|
|
|
expect(preprocessLaTeX('\\( a \\)')).toBe('$a$');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('does not cut block math at \\right] (Closes #13134)', () => {
|
Feature rtl support (#13118)
### What problem does this PR solve?
This PR adds comprehensive **Right-to-Left (RTL) language support**,
primarily targeting Arabic and other RTL scripts (Hebrew, Persian, Urdu,
etc.).
Previously, RTL content had multiple rendering issues:
- Incorrect sentence splitting for Arabic punctuation in citation logic
- Misaligned text in chat messages and markdown components
- Improper positioning of blockquotes and “think” sections
- Incorrect table alignment
- Citation placement ambiguity in RTL prompts
- UI layout inconsistencies when mixing LTR and RTL text
This PR introduces backend and frontend improvements to properly detect,
render, and style RTL content while preserving existing LTR behavior.
#### Backend
- Updated sentence boundary regex in `rag/nlp/search.py` to include
Arabic punctuation:
- `،` (comma)
- `؛` (semicolon)
- `؟` (question mark)
- `۔` (Arabic full stop)
- Ensures citation insertion works correctly in RTL sentences.
- Updated citation prompt instructions to clarify citation placement
rules for RTL languages.
#### Frontend
- Introduced a new utility: `text-direction.ts`
- Detects text direction based on Unicode ranges.
- Supports Arabic, Hebrew, Syriac, Thaana, and related scripts.
- Provides `getDirAttribute()` for automatic `dir` assignment.
- Applied dynamic `dir` attributes across:
- Markdown rendering
- Chat messages
- Search results
- Tables
- Hover cards and reference popovers
- Added proper RTL styling in LESS:
- Text alignment adjustments
- Blockquote border flipping
- Section indentation correction
- Table direction switching
- Use of `<bdi>` for figure labels to prevent bidirectional conflicts
#### DevOps / Environment
- Added Windows backend launch script with retry handling.
- Updated dependency metadata.
- Adjusted development-only React debugging behavior.
---
### Type of change
- [x] Bug Fix (non-breaking change which fixes RTL rendering and
citation issues)
- [x] New Feature (non-breaking change which adds RTL detection and
dynamic direction handling)
---------
Co-authored-by: 6ba3i <isbaaoui09@gmail.com>
Co-authored-by: Ahmad Intisar <ahmadintisar@Ahmads-MacBook-M4-Pro.local>
Co-authored-by: Ahmad Intisar <168020872+ahmadintisar@users.noreply.github.com>
Co-authored-by: Liu An <asiro@qq.com>
2026-03-02 08:03:44 +03:00
|
|
|
const content =
|
|
|
|
|
'\\[ C_{seq}(y|x) = \\frac{1}{|y|} \\sum_{t=1}^{|y|} \\right] \\]';
|
2026-02-24 12:30:06 +08:00
|
|
|
const result = preprocessLaTeX(content);
|
|
|
|
|
expect(result).toContain('\\right]');
|
|
|
|
|
expect(result).toContain('\\frac{1}{|y|}');
|
|
|
|
|
expect(result).toBe(
|
|
|
|
|
'$$ C_{seq}(y|x) = \\frac{1}{|y|} \\sum_{t=1}^{|y|} \\right] $$',
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('does not cut inline math at \\big) or nested parens', () => {
|
|
|
|
|
const content = '\\( f(x) + \\big) \\)';
|
|
|
|
|
const result = preprocessLaTeX(content);
|
|
|
|
|
expect(result).toContain('\\big)');
|
|
|
|
|
expect(result).toBe('$ f(x) + \\big) $');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('handles multiple block equations', () => {
|
|
|
|
|
const content = 'First \\[ a \\] then \\[ b \\right] c \\]';
|
|
|
|
|
const result = preprocessLaTeX(content);
|
|
|
|
|
expect(result).toBe('First $$a$$ then $$ b \\right] c $$');
|
|
|
|
|
});
|
|
|
|
|
});
|