date: 2024-11-05
关于我自己写静态网站生成器的事情
也是我博客的由来。
静态网站生成器的英文为static site generator, 简称SSG, 此文用SSG来表示静态网站生成器。
TL;DR: 有现成SSG框架就用框架除非有特殊需求,别为了装X自己写一个。
为什么自己写SSG
在自己实现SSG之前,我从来没认真学习网页开发的,所以我写一个来学习。
我是如何自己写SSG?
看个人需求,你可以不用SSG。像danluu.com或者,直接裸写HTML。
整体上,我SSG进行这些操作
- 收集文本和图片
- 解析markdown文本来得到 YAML (metadata) 和 HTML (内容)
- Apply template to the HTML
- 生成 sitemap
- 生成 RSS feed
- 准备发布; Commit and push to github pages
我用python
实现我的SSG, 需要的部分如下:
- markdown parser (
Markdown
) - YAML parser (
pyyaml
) - HTML processor (
lxml
) - 语法高亮 (highlightjs.org)
- 数学公式渲染 (mathjax.org)
- template 引擎
- http server (用来预览)
吐槽
Python Markdown库的拓展 meta
不把frontmatter当作YAML来解析,所以我额外写代码来解析frontmatter, 然后剩下才给markdown解析。
Python Markdown库本身的拓展不包括可以转换数学公式去HTML特别elements.
我建议用更好库。
多语网站巨坑,还不如写单语省心。多语网站,你需要想的事情就多:
- 访者如何切换语言,然后浏览
- 展示内容,比如类别网页,需不需每一个语言都要有?
- 生成 sitemap
- 等等等
template engine, 我推荐用现成的比如jinja2。为了减少依赖,不值得。
我是自己写一个,不过模板是焊死在templatize
函数里面。
此外,我也写一个函数接收SXML
, 构造lxml
element。我用这个来实现templatize
和RSS feed。
前传:可为什么会想到自己写SSG
https://craftinginterpreters.com/
Crafting Interpreter很常被推荐给PLer新手入门学习。作者是用自己的类似SSG的东西来给书排版,他个人博客也是。 当然,我也观摩了一下,没什么特别事情发生。
直到有次,我在寻找模式匹配的教学实现,某谷搜索引擎的结果包括: https://blog.lrw04.online/syntax-rules.html
虽然内容我也没什么看懂,也没用上,这作者也用自己SSG来写博客。我才给自己立一个flag加在todo list。
后日谈
在我网站上线后,向我俩朋友炫耀,向他们普及RSS让他们订阅, 是免不了嘘寒问暖的。
结果,他们说最近交往了。
因此,我怒写了这周的博客,不管三七二十一。
拓展
- pattern matcher 教学实现
- https://okmij.org/ftp/Scheme/macros.html#match-case-simple
- https://srfi.schemers.org/srfi-200/srfi-200.html
- https://www.manjusaka.blog/posts/2018/12/31/i-have-girlfriend/
- https://blog.pesky.moe/posts/2023-11-04-custom-ssg/
- https://arne.me/blog/write-your-own-ssg
- https://www.gnu.org/software/guile/manual/html_node/SXML.html
- https://danluu.com/web-bloat/