// KaTeX-Parse-Gate: prüft Formeln mit DEMSELBEN Renderer wie das Frontend. // stdin: JSON [{tex, display}] → stdout: JSON [fehlermeldung, …] // Ersetzt die Regex-Jagd auf einzelne Befehle: was hier durchgeht, rendert auch. import { createRequire } from 'node:module' import { readFileSync } from 'node:fs' let katex try { katex = createRequire(import.meta.url)('katex') // Container: backend/node_modules } catch { const basis = process.env.KATEX_BASE // Dev: frontend/node_modules katex = createRequire(basis.endsWith('/') ? basis : basis + '/')('katex') } // gleiche Makros wie frontend/src/markdown.js — das Gate darf nicht strenger // sein als der Renderer const macros = { '\\textsc': '\\text{#1}' } const formeln = JSON.parse(readFileSync(0, 'utf8')) const fehler = [] for (const f of formeln) { try { katex.renderToString(f.tex, { displayMode: !!f.display, macros: { ...macros } }) } catch (e) { fehler.push(`$${f.tex.slice(0, 60)}$ → ${String(e.message || e).slice(0, 120)}`) } } process.stdout.write(JSON.stringify(fehler))