27 lines
825 B
JavaScript
27 lines
825 B
JavaScript
import grayMatter from 'gray-matter';
|
|
|
|
const frontmatterPlugin = (md, { grayMatterOptions, renderExcerpt = true } = {}) => {
|
|
const render = md.render.bind(md);
|
|
md.render = (src, env = {}) => {
|
|
const { data, content, excerpt = "" } = grayMatter(src, grayMatterOptions);
|
|
env.content = content;
|
|
env.frontmatter = {
|
|
// allow providing default value
|
|
...env.frontmatter,
|
|
...data
|
|
};
|
|
env.excerpt = renderExcerpt && excerpt ? (
|
|
// render the excerpt with original markdown-it render method.
|
|
// here we spread `env` to avoid mutating the original object.
|
|
// using deep clone might be a safer choice.
|
|
render(excerpt, { ...env })
|
|
) : (
|
|
// use the raw excerpt directly
|
|
excerpt
|
|
);
|
|
return render(content, env);
|
|
};
|
|
};
|
|
|
|
export { frontmatterPlugin };
|