53 lines
1.4 KiB
JavaScript
53 lines
1.4 KiB
JavaScript
import { visit } from 'unist-util-visit';
|
|
import { toString } from 'mdast-util-to-string';
|
|
|
|
import fs from 'node:fs';
|
|
|
|
// build table of contents and inject into frontmatter
|
|
export function localRemark() {
|
|
return (tree, vfile) => {
|
|
if (vfile.data.fm.toc === false) {
|
|
return;
|
|
}
|
|
|
|
let toc = [];
|
|
let description = null;
|
|
|
|
visit(tree, ['heading', 'paragraph'], node => {
|
|
// build table of contents and inject into frontmatter
|
|
if (node.type === 'heading') {
|
|
toc.push({
|
|
text: toString(node),
|
|
depth: node.depth,
|
|
});
|
|
}
|
|
|
|
// inject description (first 25 words of the first paragraph)
|
|
if (node.type === 'paragraph' && description === null) {
|
|
description = summarize(node);
|
|
}
|
|
});
|
|
|
|
vfile.data.fm.toc = toc;
|
|
vfile.data.fm.description = description;
|
|
}
|
|
}
|
|
|
|
|
|
// convert paragraph to single string after stripping everything between html tags
|
|
function summarize(par) {
|
|
let newChildren = [];
|
|
let push = true;
|
|
for (const child of par.children) {
|
|
if (child.type === 'html') {
|
|
push = !push;
|
|
continue;
|
|
}
|
|
if (push) {
|
|
newChildren.push(child);
|
|
}
|
|
}
|
|
|
|
return toString({type: 'paragraph', children: newChildren});
|
|
}
|