| | |
| | | import remarkMath from "remark-math" |
| | | import rehypeKatex from "rehype-katex" |
| | | import rehypeMathjax from "rehype-mathjax/svg.js" |
| | | import rehypeMathjax from "rehype-mathjax/svg" |
| | | //@ts-ignore |
| | | import rehypeTypst from "@myriaddreamin/rehype-typst" |
| | | import { QuartzTransformerPlugin } from "../types" |
| | | import { KatexOptions } from "katex" |
| | | import { Options as MathjaxOptions } from "rehype-mathjax/svg" |
| | | //@ts-ignore |
| | | import { Options as TypstOptions } from "@myriaddreamin/rehype-typst" |
| | | |
| | | interface Options { |
| | | renderEngine: "katex" | "mathjax" |
| | | renderEngine: "katex" | "mathjax" | "typst" |
| | | customMacros: MacroType |
| | | katexOptions: Omit<KatexOptions, "macros" | "output"> |
| | | mathJaxOptions: Omit<MathjaxOptions, "macros"> |
| | | typstOptions: TypstOptions |
| | | } |
| | | |
| | | export const Latex: QuartzTransformerPlugin<Options> = (opts?: Options) => { |
| | | interface MacroType { |
| | | [key: string]: string |
| | | } |
| | | |
| | | export const Latex: QuartzTransformerPlugin<Partial<Options>> = (opts) => { |
| | | const engine = opts?.renderEngine ?? "katex" |
| | | const macros = opts?.customMacros ?? {} |
| | | return { |
| | | name: "Latex", |
| | | markdownPlugins() { |
| | | return [remarkMath] |
| | | }, |
| | | htmlPlugins() { |
| | | if (engine === "katex") { |
| | | return [[rehypeKatex, { output: "html" }]] |
| | | } else { |
| | | return [rehypeMathjax] |
| | | switch (engine) { |
| | | case "katex": { |
| | | return [[rehypeKatex, { output: "html", macros, ...(opts?.katexOptions ?? {}) }]] |
| | | } |
| | | case "typst": { |
| | | return [[rehypeTypst, opts?.typstOptions ?? {}]] |
| | | } |
| | | case "mathjax": { |
| | | return [[rehypeMathjax, { macros, ...(opts?.mathJaxOptions ?? {}) }]] |
| | | } |
| | | default: { |
| | | return [[rehypeMathjax, { macros, ...(opts?.mathJaxOptions ?? {}) }]] |
| | | } |
| | | } |
| | | }, |
| | | externalResources() { |
| | | if (engine === "katex") { |
| | | return { |
| | | css: [ |
| | | // base css |
| | | "https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css", |
| | | ], |
| | | js: [ |
| | | { |
| | | // fix copy behaviour: https://github.com/KaTeX/KaTeX/blob/main/contrib/copy-tex/README.md |
| | | src: "https://cdn.jsdelivr.net/npm/katex@0.16.7/dist/contrib/copy-tex.min.js", |
| | | loadTime: "afterDOMReady", |
| | | contentType: "external", |
| | | }, |
| | | ], |
| | | } |
| | | } else { |
| | | return {} |
| | | switch (engine) { |
| | | case "katex": |
| | | return { |
| | | css: [{ content: "https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.css" }], |
| | | js: [ |
| | | { |
| | | // fix copy behaviour: https://github.com/KaTeX/KaTeX/blob/main/contrib/copy-tex/README.md |
| | | src: "https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/contrib/copy-tex.min.js", |
| | | loadTime: "afterDOMReady", |
| | | contentType: "external", |
| | | }, |
| | | ], |
| | | } |
| | | default: |
| | | return { css: [], js: [] } |
| | | } |
| | | }, |
| | | } |