- 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
37 lines
1.3 KiB
TypeScript
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, '"')
|
|
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, '"')
|
|
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, '"')
|
|
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
|
|
}
|