import marked, { Renderer } from "marked";
import hljs from "highlight.js";
import markedKatex from "marked-katex-extension";
marked.use(markedKatex({
throwOnError: false,
output: `html`
}));
class WxRenderer {
constructor(opts) {
this.opts = opts;
let footnotes = [];
let footnoteIndex = 0;
let styleMapping = new Map();
let merge = (base, extend) => Object.assign({}, base, extend);
this.buildTheme = (themeTpl) => {
let mapping = {};
let base = merge(themeTpl.BASE, {
"font-family": this.opts.fonts,
"font-size": this.opts.size,
});
for (let ele in themeTpl.inline) {
if (themeTpl.inline.hasOwnProperty(ele)) {
let style = themeTpl.inline[ele];
mapping[ele] = merge(themeTpl.BASE, style);
}
}
let base_block = merge(base, {});
for (let ele in themeTpl.block) {
if (themeTpl.block.hasOwnProperty(ele)) {
let style = themeTpl.block[ele];
mapping[ele] = merge(base_block, style);
}
}
return mapping;
};
let getStyles = (tokenName, addition) => {
let arr = [];
let dict = styleMapping[tokenName];
if (!dict) return "";
for (const key in dict) {
arr.push(key + ":" + dict[key]);
}
return `style="${arr.join(";") + (addition || "")}"`;
};
let addFootnote = (title, link) => {
footnotes.push([++footnoteIndex, title, link]);
return footnoteIndex;
};
this.buildFootnotes = () => {
let footnoteArray = footnotes.map((x) => {
if (x[1] === x[2]) {
return `[${x[0]}]
: ${x[1]}
`;
}
return `[${x[0]}]
${x[1]}: ${x[2]}
`;
});
if (!footnoteArray.length) {
return "";
}
return `
${footnoteArray.join("\n")}
`; }; this.buildAddition = () => { return ` `; }; this.setOptions = (newOpts) => { this.opts = merge(this.opts, newOpts); }; this.hasFootnotes = () => footnotes.length !== 0; this.getRenderer = (status) => { footnotes = []; footnoteIndex = 0; styleMapping = this.buildTheme(this.opts.theme); let renderer = new Renderer(); renderer.heading = (text, level) => { switch (level) { case 1: return ``); return `
${text}`; }; renderer.code = (text, lang = "") => { if (lang.startsWith("mermaid")) { setTimeout(() => { window.mermaid?.run(); }, 0); return `
${text}
${text}
`;
};
renderer.codespan = (text, lang) =>
`${text}
`;
renderer.listitem = (text) =>
`