Markdown文件转换为html(包括markdown-it、生成菜单、自定义id锚点)
const fs = require('fs');
const path = require('path');
const markdownIt = require('markdown-it');
const markdownItAnchor = require('markdown-it-anchor');
// 创建Markdown解析器实例
const md = markdownIt({
html: true,
linkify: true,
typographer: true
})
.use(markdownItAnchor, {
level: 2, // 添加锚点的标题级别
slugify: slugify, // 自定义slugify函数
permalink: true, // 启用永久链接
permalinkClass: 'header-anchor', // 永久链接的CSS类
permalinkSymbol: '🔗' // 永久链接的前缀符号
});
// 自定义slugify函数,确保id不会有空格
function slugify(str) {
return str.toLowerCase().replace(/\s+/g, '-');
}
// 读取Markdown文件内容
const markdownFilePath = path.join(__dirname, 'example.md');
const markdownContent = fs.readFileSync(markdownFilePath, 'utf-8');
// 解析Markdown内容为HTML
const htmlContent = md.render(markdownContent);
// 生成菜单
const toc = md.renderer.rules.heading_open;
const tocOutput = [];
md.renderer.renderToken = (tokens, idx, options) => {
if (tokens[idx].type === 'heading_open') {
const headingToken = tokens[idx + 1];
if (headingToken.type === 'inline') {
tocOutput.push(`<li><a href="#${headingToken.attrs[0][1]}">${headingToken.content}</a></li>`);
}
}
return oldRenderToken.call(md.renderer, tokens, idx, options);
};
// 输出HTML内容到文件
fs.writeFileSync(path.join(__dirname, 'output.html'), htmlContent);
// 输出菜单到文件
fs.writeFileSync(path.join(__dirname, 'toc.html'), `<ul>${tocOutput.join('')}</ul>`);
这段代码使用了markdown-it
库和markdown-it-anchor
插件来解析Markdown文件,并生成了相应的HTML和目录菜单。代码中的slugify
函数确保了id的唯一性,避免了由于标题中的空格而产生的问题。最后,生成的HTML和目录菜单被分别写入到文件中。
评论已关闭