29 lines
1.0 KiB
JavaScript
29 lines
1.0 KiB
JavaScript
// 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))
|