自己开发的静态网站框架,使用 Python + Pandoc + Jinja2。
满足本站需求即可,不必对标 Pelican、MkDocs 等成熟项目。
conda install -c conda-forge pandoc
npm install -g csso-cli
pip install -U pypinyin pandocfilters Pygments Jinja2 htmlmin
python make.py
python -m http.server -d output
为了满足一些个性化需求:
- 使用 Python,自己很熟悉
- 使用 Pandoc 解析 markdown,支持很多扩展格式(如定义列表)、支持自定义 filter(实现内嵌 tikz 等功能)
- 方便增加自定义功能,如中文转拼音,中英文间隔,标题自动编号,资源文件引用计数
- 检查文章格式合法性,例如相邻 header 不允许跨级,引用的目标文件必须存在
- 收集源文件
- 分析每个源文件,包括:
- 从源文件路径和文件名中获取分类、发表日期、链接地址三个信息
- 从源文件内容中分析 yaml 元数据,提取其他信息(标题、关键词、是否显示目录、是否隐藏)
- 解析 markdown,转换为 AST
- 对文章列表和每个文章进行修改:
- 筛选出不隐藏的文章(去掉 draft)
- 检查是否存在网址冲突,即两篇文章拥有相同的目标地址,如果有则添加数字编号
- 筛选每篇文章的 AST,设置 header.id,检查文章之间的引用,将对源文件的链接替换成对目标 url 的链接
- 每一篇文章渲染生成 html,先用 pandoc 生成 html 片段,再用 Jinja 生成完整 html 文件
- 生成 index.html,传入网站信息和所有文章的元数据
- 代码块换行重复(Windows),需要指定换行格式为 LF
- 表格样式错误
- 代码着色
- 分析文章是否包含数学公式,决定页面是否加入 MathJax 外部引用
- 分析正文,中英文之间添加空格,包括不同 inline 之间的空格
- 对输出的 HTML 进行压缩
- 开发新的基于 Item 的生成脚本
- 增加静态页面生成机制(about、projects)
- 修改代码块,增加行号开关,窄屏幕上可以折行
- 代码块增加“全部复制”按钮,增加header显示这段代码的标题、语言
- 开发目录显示列表,显示在侧边栏,
可收起 - 开发一套评论机制,显示在侧边栏,可收起
- 很多前端相关工具都是 Node.js 开发的,不同环境下运行方法有差异,寻找一种更好的交互调用方案