cvsa/packages/next/lib/mdx/footnoteHelper.tsx

64 lines
1.4 KiB
TypeScript

import { Root, FootnoteDefinition, Heading, List, ListItem } from "mdast";
import { Plugin } from "unified";
const remarkCollectFootnotes: Plugin<[], Root> = function () {
return function transformer(tree) {
const footnotes: FootnoteDefinition[] = [];
// 收集所有 footnoteDefinition 并从树中移除它们
tree.children = tree.children.filter((node) => {
if (node.type === "footnoteDefinition") {
footnotes.push(node as FootnoteDefinition);
return false;
}
return true;
});
if (footnotes.length === 0) return tree;
const heading: Heading = {
type: "heading",
depth: 2,
children: [{ type: "text", value: "脚注" }]
};
const list: List = {
type: "list",
ordered: true,
start: 1,
children: footnotes.map((def, i) => {
return {
type: "listItem",
children: [
...(def.children || []).flatMap((child) => {
return "value" in child ? { type: "text", value: child.value } : child;
}),
{
type: "link",
url: `#user-content-fnref-${i + 1}`,
children: [
{
type: "text",
value: " ↩"
}
]
}
],
data: {
hProperties: {
id: `user-content-fn-${i + 1}`,
className: "footnote-li"
}
}
} as ListItem;
})
};
// 添加到文档最后
tree.children.push(heading, list);
return tree;
};
};
export default remarkCollectFootnotes;