经过一段时间的摸鱼开发,总算是把博客的生成器写完了,总算是满足了自己不使用烂大街框架搭建 Blog 的心愿吧 (有毒),接下来总算有一个空间可以让我安心的写一些文章了。
写文章是我的刚需。逛了一圈别人的博客,发现他们都做得挺好,就是缺了个性,而这正是我最看重的。
Blogen 是我自己的 Blog 的脚手架。提供文章的 markdown 文件和页面的模板 html 以及一些元数据,它能自动的生成博客的一系列网页。用 Rust 写只是考虑到它的 String 原生支持 UTF-8 😀,拿来做字符串处理没有太多顾虑。因为总共也没多少行代码,没有什么细讲的必要,我只分享一些在开发过程中觉得好玩的东西。
经常的,我们使用文法来进行模式匹配,但是实际上我发现它反过来也是一种很方便的串生成的工具。
网页生成最重要的就是 HTML 片段的提供。如果我们把一些 HTML 的碎片按照特定的顺序塞在一个文本文件,以供程序使用,这会让这些文件难以维护和滚动更新。如果使用文法辅助提供这些 HTML 片段可以让我更方便的进行维护。以上的说法可能不够直观,这里给一个例子。假设说我想要自动生成类似下面的一段话:
(Donough Liu) will go hiking with [Alice] [Bob] in <2020>.
其中 Donough Liu
是作者的名字, Alice
和 Bob
是和作者 go hiking 的朋友的名字(朋友的名字有若干个,可能不止两个), 2020
是 go hiking 的时间。这时会想要使用一种方式来提供约束这段话的生成的模板,我肯定不会想要这样的形式的模板:
{
"snippet0" : "(",
"slot0" : "author_name",
"snippet1" : ") will go hiking with [",
"slot1_reptitive" : "partner",
"snippet2" : "] [",
"snippet3" : "] in <",
"slot2" : "time",
"snippet4" : ">."
}
它过于丑陋,没有可读性且难以维护。这时候如果使用文法辅助的话,我们的片段提供可以带有更多语义信息 (这里为了解释以 EBNF 形式提供):
main = "(", author_name, ") will go hiking with ", { partners }, " in ", time, ".";
partners = "[", partner_name, "]";
extern author_name
extern parter_name
extern time
其中这里我们定义了一个不在 EBNF 标准里的关键词 extern
,它的意思就是由其它模块来提供此部分的信息,这对应的博客网页生成中的就是类似于文章标题,文章时间,文章内容等等。使用文法的形式构造模板来提供代码片段有很好的可读性,很方便维护。而由于 Blogen 生成的都是 HTML ,我给它设计的生成模板语法更特殊更好玩一点,但原理大体相似,这里就不多介绍了。
我会写我掌握的酷的技术,好的作品 (估计大部分是代码作品),好玩的想法。同时和部分人相反,我对于生活其实不太关心,感觉通常是迟钝的,记录生活没有什么意义,所以我不会写有关于生活的东西。
除了接下来新写的文章,然后我也会把之前的文章整理润色一下放上来,就这样开始吧。