博客系统编年史与未来计划

2025年4月26日
2022年4月1日

虽然对于一个博客而言,内容才是关键,但我还是花了很多时间在博客系统上。

手写 HTML

最初之时,因为我对技术的偏执,我没有选择常见的页面生成器,选择了手写 HTML 的方案。纯正的 HTML 和 CSS。能不用 JS 就不用的传统就此诞生。因为基本上都是些文本,手写 HTML 的负担并不大,而且对网页呈现效果有着 100% 的操控权。

简单脚本

其实从 2021 年年后开始我就打算对我的博客进行现代化改造,但是迟迟没有完成。直到 2021 年下半年,我才确定了现代化的方向:使用 markdown 文件生成页面,同时保证 markdown 的部分可读性。这也诞生第二条传统,保证 markdown 源文本在 Github 上的渲染结果一定程度上是可读的。并据此进行了简单的改造。因为先前的博文里存在交互性的内容,所以简单 markdown 并不能满足我的需求,所以利用 markdown 的一个 bug 或者说是 feature,[foo]: #(bar) 不会被渲染,配合 python 做预处理。同时将元数据塞进注释里来避免被显示出来。之后,我打算为系统添加 tex 代码渲染功能,用了 katex 做离线渲染。我发现我没有办法在 python 上用非常优雅的方式去调用 js。而且我发现现有使用简单预处理脚本的方式,对后续添加功能和维护不是很友好。所以规范我对 markdown 的定制和使用 js 重写的计划被提上了日程。

定制与造轮子

2022 年年后,我正式完成了 markdown 的定制草案,取名为 Puelloc Tailored Markdown,下称 PuellocMark。在 CommonMark 的基础上,我对削减了大部分不常见的语法,使 markdown 的解析工作可以尽可能的简单。并引入了 GFM 的表格扩展。对于 CommonMark 和 GFM 都没有的扩展,我都将其定义在 CommonMark 不可见的范围内。因为我希望原始的 markdown 文件在 Github 中打开也是可以阅读的。随后我大概花费了两到三周的时间完成了一份简单的解析器。然后就把网站的构建系统迁移到了 PuellocMark 上。因为 PuellocMark 的就是针对我这个博客设计开发的,所以之后 Bug 的发现修复或者新功能的添加都是随着博客构建系统的开发而进行。伴随着 PuellocMark 的引入,扩展功能可以与 markdown 的解析解耦,我可以更自由便捷地去添加新的扩展功能。

新功能与重构

使用 Shiki 做代码着色

原本使用的是经典的 highlight.js,通常来说基于语法的都大差不差。原本还想做一个像主流代码编辑器一样通过 LSP 的语义着色,但是还没到尾就烂了。之所以换呢主要是我有差不多长这样的 rust 的代码:

fn some(a: StructA) -> StructB { StructB {} }

highlight 它着不出函数参数里 StructA 那个色,在这个位置一眼就该知道是类型吧。于是就换了 Shiki 这个库,看作者应该是 Vue 的那群人做的。这个新世纪前端库,它是 style 直接写进返回的 html 里,没有弄一个 css 什么的。看了 Shiki 才知道原来 TypeScript 他们可以把代码提示一起带上去搞得就像在编辑器里一样的高级效果是用 TwoSlash 做出的。

使用 MathJax 代替 LaTex

最开始设计代码渲染功能的时候选择直接调用 LaTeX 程序的原因是可以使用像 TikZ 这样的包,但是这个代码功能做出了之后其实几乎都没有使用过,更不要说这个 TikZ 了。所以最后比较了一下 MathJax 和 KaTeX,选择了和 GitHub 一致的 MathJax。至于 TikZ,也有人用 WASM 搬上 js 了,虽然感觉我未来也没有这么复杂的需求。

多语种混排优化

最开始的时候只有一个标点挤压的宏,而且这个也不是默认开启的。后来我有一篇中日混写的需求,但是由于 CJK 的汉字同字不同形,为了指导浏览器能够显示正确字形,需要能够在生成的 HTML 标注上 lang 信息。这个需求我原本还想弄个什么 LLM 来做这种事情,但是想想也太复杂了,于是就直接选择手动用 span 包一下了就行了。此外还顺便加了中西文混排自动插空格间距的宏,之前一直都是手工加空格的,同时把标点挤压的宏也合并在一起了。不过目前还是有很多问题,一个目前宏只能对单个 node 处理,跨 node 间的中西文间距直接就还得靠手工,更好还是得是用 css 来提供间距而不是空白字符。

此外我发现 MacOS 它自己除了系统文本控件会自动处理中西文间距外,也会自动做标点挤压,而且看起来感觉是直接做在字体里的功能(还是 Apple 在 WebKit 开的后门,因为即使在 vscode 中标点挤压也是生效的。

计划

提供目录功能

提供一个固定屏幕位置的目录来快捷跳转章节。

markdown 删除后自动删除对于编译后文件

有时候源文件删了但是生成的文件还一直留着,要个功能能自动识别并删一下。