Files
Momento/memento-note/lib/text/math-preprocess.ts
Antigravity eff906d187
Some checks failed
CI / Deploy production (on server) (push) Has been cancelled
CI / Lint, Unit Tests & Build (push) Has been cancelled
fix: exercices dans menu GraduationCap + équations KaTeX + refresh liste
- Menu déroulant GraduationCap : Flashcards + Exercices réunis
- Fix: language non défini dans toolbar (useLanguage destructuring)
- Fix: équations 658071 → KaTeX dans exercices (preprocessMathInHtml partagé)
- lib/text/math-preprocess.ts : utilitaire partagé wizard + exercices
- Toast avec bouton 'Voir' pour rafraîchir après création exercices
- emitNoteChange pour rafraîchir la liste
- i18n FR/EN
2026-06-14 20:13:25 +00:00

37 lines
1.3 KiB
TypeScript

/**
* Convertit les délimiteurs LaTeX en nœuds TipTap pour le rendu KaTeX.
* À appliquer sur tout contenu HTML généré par l'IA avant stockage en DB.
*/
export function preprocessMathInHtml(html: string): string {
let result = html
// 1. \[...\] → block math
result = result.replace(/\\\[([\s\S]+?)\\\]/g, (_, latex) => {
const escaped = latex.trim().replace(/"/g, '"')
return `</p><div data-type="math-equation" data-latex="${escaped}"></div><p>`
})
// 2. $$...$$ → block math
result = result.replace(/\$\$([\s\S]+?)\$\$/g, (_, latex) => {
const escaped = latex.trim().replace(/"/g, '&quot;')
return `</p><div data-type="math-equation" data-latex="${escaped}"></div><p>`
})
// 3. \(...\) → inline math
result = result.replace(/\\\(([\s\S]+?)\\\)/g, (_, latex) => {
const escaped = latex.trim().replace(/"/g, '&quot;')
return `<span data-type="inline-math" data-latex="${escaped}">${escaped}</span>`
})
// 4. $...$ → inline math (only single $ not followed by another $)
result = result.replace(/(?<!\$)\$(?!\$)([^\n$]+?)\$(?!\$)/g, (_, latex) => {
const escaped = latex.trim().replace(/"/g, '&quot;')
return `<span data-type="inline-math" data-latex="${escaped}">${escaped}</span>`
})
// 5. Clean up empty <p></p> tags
result = result.replace(/<p>\s*<\/p>/g, '')
return result
}