homepage
cluster
fun
开花!
2019/12/18
一篇 helloworld-like 的博客。

开头

经过一段时间的摸鱼开发,总算是把博客的生成器写完了,总算是满足了自己不使用烂大街框架搭建 Blog 的心愿吧 (有毒),接下来总算有一个空间可以让我安心的写一些文章了。

我的博客生成器 Blogen

写文章是我的刚需。逛了一圈别人的博客,发现他们都做得挺好,就是缺了个性,而这正是我最看重的。

  1. 一个网页的个性从不一样的思想或不一样的UI中来,前者我不确定是否有,那就先从后者着手开始做。
  2. 不一样的界面意味着不一样的交互逻辑或者元素排列方式,这意味着要手写 HTML。
  3. 真的手写HTML是不现实的,我需要一个框架在实现博客页面的自动化生成的同时也能加入个性化的元素。
  4. 于是就写了Blogen。

Blogen 是我自己的 Blog 的脚手架。提供文章的 markdown 文件和页面的模板 html 以及一些元数据,它能自动的生成博客的一系列网页。用 Rust 写只是考虑到它的 String 原生支持 UTF-8 😀,拿来做字符串处理没有太多顾虑。因为总共也没多少行代码,没有什么细讲的必要,我只分享一些在开发过程中觉得好玩的东西。

经常的,我们使用文法来进行模式匹配,但是实际上我发现它反过来也是一种很方便的串生成的工具。

网页生成最重要的就是 HTML 片段的提供。如果我们把一些 HTML 的碎片按照特定的顺序塞在一个文本文件,以供程序使用,这会让这些文件难以维护和滚动更新。如果使用文法辅助提供这些 HTML 片段可以让我更方便的进行维护。以上的说法可能不够直观,这里给一个例子。假设说我想要自动生成类似下面的一段话:

(Donough Liu) will go hiking with [Alice] [Bob] in <2020>.

其中 Donough Liu 是作者的名字, AliceBob 是和作者 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 ,我给它设计的生成模板语法更特殊更好玩一点,但原理大体相似,这里就不多介绍了。

博客基调

Cool | Fun

我会写我掌握的酷的技术,好的作品 (估计大部分是代码作品),好玩的想法。同时和部分人相反,我对于生活其实不太关心,感觉通常是迟钝的,记录生活没有什么意义,所以我不会写有关于生活的东西。
除了接下来新写的文章,然后我也会把之前的文章整理润色一下放上来,就这样开始吧。

Rust
Programming
Computer Science