date: 2024-11-05

关于我自己写静态网站生成器的事情

也是我博客的由来。

静态网站生成器的英文为static site generator, 简称SSG, 此文用SSG来表示静态网站生成器。

TL;DR: 有现成SSG框架就用框架除非有特殊需求,别为了装X自己写一个。

为什么自己写SSG

在自己实现SSG之前,我从来没认真学习网页开发的,所以我写一个来学习。

我是如何自己写SSG?

看个人需求,你可以不用SSG。像danluu.com或者,直接裸写HTML。

整体上,我SSG进行这些操作

  1. 收集文本和图片
  2. 解析markdown文本来得到 YAML (metadata) 和 HTML (内容)
  3. Apply template to the HTML
  4. 生成 sitemap
  5. 生成 RSS feed
  6. 准备发布; Commit and push to github pages

我用python实现我的SSG, 需要的部分如下:

  1. markdown parser (Markdown)
  2. YAML parser (pyyaml)
  3. HTML processor (lxml)
  4. 语法高亮 (highlightjs.org)
  5. 数学公式渲染 (mathjax.org)
  6. template 引擎
  7. http server (用来预览)

吐槽

Python Markdown库的拓展 meta 不把frontmatter当作YAML来解析,所以我额外写代码来解析frontmatter, 然后剩下才给markdown解析。 Python Markdown库本身的拓展不包括可以转换数学公式去HTML特别elements. 我建议用更好库。

多语网站巨坑,还不如写单语省心。多语网站,你需要想的事情就多:

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让他们订阅, 是免不了嘘寒问暖的。 结果,他们说最近交往了。 因此,我怒写了这周的博客,不管三七二十一。

拓展