综上三点,我自己动手写了一个生成器,并给这个项目起名叫 Beex。
通用型生成器的问题:
Beex 主要针对上述问题探索解决之道,和其他笔记软件的对比可以参考:
Beex 是我在笔记实践中的产物,所以在设计上它并不是以实现通用接口优先,而是以方便人类使用优先。在下面的每一条里,你都将看到这一思路的体现。
Beex 将保持“尽量小巧”、“可增量构建”、“支持多个源目录”三个特性。
相较于单纯地将 Markdown 转为 HTML 并展示列表,它更侧重文档管理(比如实现每篇文章可以带着自己的附件任意移动又不影响其他文章的引用)。
Beex 的列表页没有分页,当某分类文章过多的时候,你应当考虑增加分类或标签。分类的作用类似文件夹,Windows 的资源管理器有翻页功能吗?如果有,你真的愿意点很多次翻页按钮去找资料吗?
有时候可能有一些内容在发布后又需要隐藏,为了达到完全同步全部链接和附件的目的,通用型引擎会重置整个目标目录,这有三个连锁缺点:
所以我在增量构建和私人文档保护之间找了一个平衡:
hidden
字段,当其值被设置为 1
时,这篇文章会在 target
目录中被删除。target
目录中的附件,请手动删除。hidden: 1
的文档),附件也不会输出到 target
目录中,所以不用管它们。其实 Beex 是可以做到同步删除已发布的附件的,只是这样生成速度会变慢,不划算。
几种需求:
如果不支持多站点,就要在每一个源目录中复制一份生成器的可执行文件,或者在命令行中来回切换目录。Beex 从一开始就为支持多站点而设计。
解耦了 .md
文件的路径、文件名、标题和 target
(目标路径)。当你的源文件越来越多需要重新整理文件夹时,你可以放心地移动源文件,而不用担心影响输出的位置。
只要一个文件夹内只有一个 .md
文件,本文件夹的其他文件就可以保持与 .md
的相对位置,随时可查看、编辑附件。如果将所有附件放在一个特定的文件夹里统一发布,素材多了以后完全无法维护。
另外,一个目录内有多个 .md
文件时,也可以将所有附件复制到每一个 .md
的 target
目录中,但这个策略很浪费空间,所以不采纳。
以 _
或 .
开头的文件和文件夹会被跳过,这样一些不想渲染的文章,或者想要同时保留多个版本,或者作为存档的原始文件,甚至整个文件夹,都不需要单独存放到其他目录中来避免生成,只要复制一份并在文件(夹)名前面加个下划线就可以了。
我不希望在写笔记时,为了输入一些元信息而敲击很多引号、换行、缩进等等,所以 BeexMeta
不仅没有使用 YMAL 或 TOML 等语法,甚至是不区分数据类型的,全部是以 :
分隔的字符串键值对。
categories
和 tags
以中英文两种逗号切割列表。作为一个主要使用中文输入法的人,为了输入一个标签列表而频繁切换输入法也是麻烦的,尤其是这两个是元信息里被手工编辑得最多的字段。
逻辑值的 True
和 False
用 1
和 0
代替,同样是为了减少要输入的字符。
为了让任意 Markdown 引擎都能直接渲染源文件,采用了 HTML 注释语法(<!--
-->
)包裹 BeexMeta
。
short
类似常见的 ID,是一个自增整数,不过全局只有一个序列。这样设计的理由是 Beex 支持多站点,但实际上我们的文档并不是像网站系统一样保存在相互隔离的数据库中,有时我们需要将一些文件从一个文件夹移动到另一个文件夹。
如果在 BeexMeta.target 中使用 short
作为唯一性标识,那么在多个站点的源目录之间迁移文档时,就不用担心构建时 target
冲突。比如我使用 short
来生成文章、分类、标签的 target
。
如果你对这种不连续的 ID 感到不舒服,只要不在各个 format
里使用,你就可以当它不存在。
target
目录中,它们会互相覆盖列表页和首页:#9015
有时候可能会修改标签,或在新文章用新的写法,这时候我不希望影响以前的固定链接,比如 sql
变为 SQL
时,比如 collections
改为中文 收集
时。
这需要对标签的名称和 slug(生成 URL 时使用的名字)进行某种映射。(在本站我使用的是 short
。)
设置方式参考 Beex 配置。
参考这篇两文章: