Basename 解析器
解析文件的 basename 以提取额外数据
当 Lume 扫描源文件夹时,它可以自动从文件(移除扩展名后的文件名)和文件夹的 basename 中提取一些信息。
例如,假设你想创建 order
变量来对菜单中的页面进行排序。一种显式声明此变量的方法是使用 [order].
前缀保存页面:
.
├── 1.welcome.md
├── 2.introduction.md
├── 3.the-basics.md
└── 4.advanced.md
在文件系统中显式声明此变量的一个优点是,你可以在文本编辑器中看到源文件以与站点中相同的方式排序。
在 Lume 中,默认情况下文件名用于生成最终 URL(更多信息),因此上面的页面文件会生成以下 URL:
/1.welcome/
/2.introduction/
/3.the-basics/
/4.advanced/
这可能可以工作,但我们真正想要的是删除 order 前缀并将其存储在页面数据中。为此,我们可以在 _config.ts
文件中使用 site.parseBasename
函数注册一个 basename 解析器:
site.parseBasename((basename) => {
// 用于检测 order 模式的正则表达式
const match = basename.match(/(\d+)\.(.+)/);
if (match) {
const [, order, basename] = match;
// 返回 order 值和不带前缀的新 basename
return {
order: parseInt(order),
basename,
};
}
});
正如你所看到的,该函数很简单:它接收 basename,如果 basename 与正则表达式匹配,则返回一个包含已解析值的对象。请注意,返回的对象包含 basename
键,其值为原始 basename,但不包含前缀,这将用于生成最终 URL。
如果 basename 与正则表达式不匹配,则不返回任何内容,因此不会发生任何更改。
Note
basename 解析器返回的对象稍后将与页面数据(也称为 front matter)合并。Front matter 可以覆盖在 basename 解析器中定义的变量。
parseBasename
函数不仅用于文件,还用于文件夹。这允许从文件夹名称中提取值并将其存储为共享数据,以便它们可用于内部的所有页面。
提取日期
Lume 默认配置了一个 basename 解析器,用于从文件名中提取日期。有关更多信息,请参阅页面日期。