那些年我大战 Hugo & Doks 的曾经

简单地说...
Netlify 背书?Hugo 生态?成熟稳定开箱即用?认真你就输了。

就在打下这篇文章的标题的时候,我又遇到了 Hugo 给我的当头一棒:时间设置到未来原来真的直接未来才会显示啊。我只是偷个懒不想仔细调而已…唉,规格严格。

就在我敲下这一行字的瞬间,我意识到一个问题:我精心编写的 description、summary 似乎只能在搜索中短暂地露面。为什么在文章开头没有这些东西呢?还有修改时间之类的东西都在哪里呢?
有了前车之鉴,我怀疑是 i18n 没设置,于是去 node_modules 中又翻找了一番,真有一种在垃圾桶里找东西的既视感呐。可惜一无所获,于是我大概确信是主题还没有写了。

即刻造轮子,这何尝不是一种锻炼(

本文包含:

  • 官方文档消失术
  • 手写 HTML
  • 大战 Hugo 模板引擎
  • 大战 Hugo 模板类型(以失败告终)
  • i18n 查缺补漏(是的,你需要从源码去找要补哪些)
  • 自己缝轮子

添加前置 metadata 展示

又又又又又要覆写主题的一个 Layout,我怀疑这样自定义下去,主题更新的时候我这就没法用了。

Doks 用的是 Bootstrap 这套 CSS 方案,所以我们可以很容易地写出一个还算漂亮的样式:

<div class="callout callout-note d-flex flex-row mt-4 mb-4 pt-2 pe-4 pb-2 ps-3">
    <div class="callout-content">
        <div class="callout-title">
          <div class="m-1 display-6">简单地说...</div>
        </div>
      <div class="callout-body">
          <div class="m-2 lead">{{.Summary}}</div>
      </div>
    </div>
</div>

把这段代码封装好,塞到它应该在的地方就可以了。还是很轻松愉快的。

就是说…为什么非得我来干这个活呢?

排序

默认排序的算法是——是——是——按标题排序!天才的设计!

当我看到源码中那 ByTitle 的字样,不由眼前一黑。更抽象的是,即使是按标题排序,主题开发者也没有从一而终、不忘初心、方得始终,而是在有的地方记得加上、有的地方又漏掉了。

困惑的我只得再次大战 Hugo,覆写了侧边栏、文章目录、底部导航(就是那个上一篇下一篇的玩意)的布局,与糟糕的 Hugo 模板引擎斗智斗勇,在奇奇怪怪的报错中艰苦手搓。

我至今仍然不知道为什么 Hugo 获取的 Section 是最上层的 Section,而 CurrentSection 才是直系父亲 Section,也不知道为什么我往 slice 这个看起来像数组的东西里面加东西之后,它却告诉我这个 slice 它的类型是 []interface{} 而无法进行任何有意义的操作。或许这就是 Golang 的魅力吧,多么安全的类型,可是你告诉我,要如何在 Hugo 的模板引擎里创建一个带类型的空数组再一个个往里面加元素呢?

一番搏斗之后,我终于找到了官方支持的函数:NextInSection,但是它不支持自定义排序,只能按默认的内置算法排序。好吧,我忍了,至少内置算法和我的需求差不多一致。它告诉我 PAGE 类型的对象可以调用这个函数,但——为什么我的 PAGE 不行呢?经过了一番云里雾里的搏斗,最后直接用 . 来指代当前 Page,成功了。你们理当是同一种类型,但却拥有不同的函数,在此时,Hugo 又散发出一股动态语言的迷人的魅力。