Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled
63 lines
2.3 KiB
TypeScript
63 lines
2.3 KiB
TypeScript
import test from "node:test";
|
||
import assert from "node:assert/strict";
|
||
|
||
import {
|
||
normalizeNoteMathSource,
|
||
NOTE_MATH_KATEX_OPTIONS,
|
||
renderNoteMathFormula,
|
||
} from "./noteMathRenderer.ts";
|
||
|
||
test("note math renderer uses accessible, untrusted KaTeX output", () => {
|
||
assert.equal(NOTE_MATH_KATEX_OPTIONS.displayMode, true);
|
||
assert.equal(NOTE_MATH_KATEX_OPTIONS.output, "htmlAndMathml");
|
||
assert.equal(NOTE_MATH_KATEX_OPTIONS.throwOnError, false);
|
||
assert.equal(NOTE_MATH_KATEX_OPTIONS.trust, false);
|
||
|
||
const html = renderNoteMathFormula(String.raw`E = mc^2`);
|
||
assert.match(html, /class="katex-display"/);
|
||
assert.match(html, /class="katex-mathml"/);
|
||
assert.match(html, /<msup>/);
|
||
});
|
||
|
||
test("note math renderer handles prime shorthand and matrices", () => {
|
||
const primes = renderNoteMathFormula(String.raw`f'(x) + x''`);
|
||
assert.match(primes, /<msup>/);
|
||
assert.match(primes, /′/);
|
||
|
||
const matrix = renderNoteMathFormula(String.raw`\begin{pmatrix} a & b \\ c & d \end{pmatrix}^{-1}`);
|
||
assert.match(matrix, /<mtable(?:\s|>)/);
|
||
assert.match(matrix, /<msup>/);
|
||
});
|
||
|
||
test("note math renderer supports common LaTeX constructs without custom parsing", () => {
|
||
const html = renderNoteMathFormula(
|
||
String.raw`\sum_{i=1}^n \frac{\alpha_i}{\sqrt[3]{x_i}} \times \left\lVert v \right\rVert`,
|
||
);
|
||
assert.match(html, /∑/);
|
||
assert.match(html, /<mfrac>/);
|
||
assert.match(html, /<mroot>/);
|
||
assert.match(html, /α/);
|
||
assert.match(html, /∥/);
|
||
});
|
||
|
||
test("note math renderer accepts balanced outer display delimiters only", () => {
|
||
assert.equal(normalizeNoteMathSource(" $$ x^2 $$ "), "x^2");
|
||
assert.equal(normalizeNoteMathSource(String.raw`\[ x^2 \]`), "x^2");
|
||
assert.equal(normalizeNoteMathSource("$$ x^2"), "$$ x^2");
|
||
assert.equal(normalizeNoteMathSource("x^2 $$"), "x^2 $$");
|
||
});
|
||
|
||
test("note math renderer shows invalid input without throwing", () => {
|
||
const html = renderNoteMathFormula(String.raw`\frac{`);
|
||
assert.match(html, /class="katex-error"/);
|
||
assert.match(html, /\\frac/);
|
||
});
|
||
|
||
test("note math renderer blocks untrusted links and external images", () => {
|
||
const link = renderNoteMathFormula(String.raw`\href{javascript:alert(1)}{click}`);
|
||
assert.doesNotMatch(link, /href=/i);
|
||
|
||
const image = renderNoteMathFormula(String.raw`\includegraphics{https://example.com/x.png}`);
|
||
assert.doesNotMatch(image, /<img/i);
|
||
});
|