/
katex.ts
62 lines (54 loc) 路 1.67 KB
/
katex.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import { katex, KatexOptions } from "../deps/katex.ts";
import { merge } from "../core/utils.ts";
import { Exception } from "../core/errors.ts";
import type { Element } from "../deps/dom.ts";
import type { DeepPartial, Page, Site } from "../core.ts";
export interface Options {
extensions: string[];
cssSelector: string;
options: KatexOptions;
}
const defaultOptions: Options = {
extensions: [".html"],
cssSelector: ".language-math",
options: {
strict: true,
displayMode: true,
throwOnError: true,
},
};
export default function (userOptions?: DeepPartial<Options>) {
const options = merge(defaultOptions, userOptions);
return (site: Site) => {
site.process(options.extensions, (page: Page) => {
const { document } = page;
if (!document) {
return;
}
document.querySelectorAll(options.cssSelector)
.forEach((node) => {
const element = node as Element;
try {
const rendered = katex.renderToString(
element.textContent,
options.options,
);
const div = document.createElement("div");
div.innerHTML = rendered.trim();
// we've selected the <code> element, we want to also replace the parent <pre>
const parent = element.parentElement;
if (parent && parent.tagName === "PRE") {
parent.replaceWith(div.firstChild);
} else {
element.replaceWith(div.firstChild);
}
} catch (cause) {
throw new Exception("Katex failed to render", {
page,
cause,
});
}
});
});
};
}