Hugo 中的 Front Matter 解析是指从内容文件的头部部分提取、解释和应用元数据的过程。这些元数据控制着页面的渲染方式、它们的属性、与其他内容的关联等等。本页面将解释 Hugo 在页面创建流程中如何识别、处理和应用 Front Matter 数据。
有关 Front Matter 处理后内容转换的信息,请参阅 Markdown Processing。
Hugo 支持三种 Front Matter 格式:YAML、TOML 和 JSON。格式由分隔 Front Matter 和内容的分隔符来确定。
| 格式 | 开分隔符 | 闭分隔符 | 示例 |
|---|---|---|---|
| YAML | --- | --- | ---title: "My Page"date: 2023-01-01--- |
| TOML | +++ | +++ | +++title = "My Page"date = 2023-01-01+++ |
| JSON | { | } | {"title": "My Page","date": "2023-01-01"} |
解析器通过检查这些分隔符来检测格式,其具体实现位于 parser 包中。
来源: parser/frontmatter.go30-33 parser/frontmatter.go80-117
来源: hugolib/page__meta.go253-300 hugolib/page__new.go37-63 hugolib/page__common.go45-104
解析过程主要使用 pageMeta.setMetaPre() 和 pageState.setMetaPost() 方法来填充页面的元数据。
来源: hugolib/page__meta.go253-300 hugolib/page__meta.go302-375 hugolib/page__meta.go377-680
来源: hugolib/page__meta.go51-71 hugolib/page__meta.go95-96 resources/page/page.go188-257
Hugo 识别 Front Matter 中的这些常用字段
| 字段 | 类型 | 描述 | 访问方法 |
|---|---|---|---|
title | 字符串 | 页面标题 | .Title() |
date | 日期/时间 | 创建日期 | .Date() |
description | 字符串 | 页面描述 | .Description() |
draft | 布尔值 | 页面是否为草稿 | .Draft() |
weight | 整数 | 排序权重 | .Weight() |
slug | 字符串 | URL 路径段 | .Slug() |
aliases | 字符串数组 | 替代 URL | .Aliases() |
layout | 字符串 | 使用的模板 | .Layout() |
markup | 字符串 | 内容格式 | n/a |
类型 | 字符串 | Content type | .Type() |
keywords | 字符串数组 | SEO 关键字 | .Keywords() |
outputs | 字符串数组 | 输出格式 | n/a |
任何未识别的字段都会存储在 .Params 中,以便在模板中访问。
来源: hugolib/page__meta.go487-635 resources/page/page.go188-257
自定义参数可以直接在 Front Matter 中定义,或在专用的 params 部分下定义。
这两种方法都会将值存储在 .Params 中,但专用的 params 部分有助于避免与内置字段发生名称冲突。如果顶级参数与 params 部分的参数发生冲突,Hugo 会发出警告。
来源: hugolib/page__meta.go636-643
级联允许父页面将 Front Matter 值传递给子页面。级联功能有两个主要组件
级联定义:在父页面的 Front Matter 中
级联应用:在页面创建过程中,来自祖先页面的级联值应用于与目标条件匹配的页面。
来源: resources/page/page_matcher.go resources/page/page_matcher.go108-164 hugolib/page__meta.go302-375
Front Matter 解析是内容处理流程的早期步骤,并影响其他几个组件
type 和 layout 字段会影响使用的模板slug 等字段会影响页面的 URLmarkup 字段决定如何处理内容outputs 字段决定生成哪些输出格式tags 和 categories 等分类字段会将页面放入相应的分类中来源: hugolib/page__meta.go136-187 hugolib/page__meta.go836-837
params 部分来存放自定义参数,以避免冲突true 而不是字符串 "true")来源: hugolib/page__meta.go644-650 hugolib/cascade_test.go209-320
Front Matter 解析过程涉及几个关键文件和函数
初始解析:
pageMeta.parseFrontMatter() 提取并解码 Front Matter元数据填充:
pageMeta.setMetaPre() 初始化基本页面元数据pageState.setMetaPost() 应用级联并完成元数据pageState.setMetaPostParams() 处理特定字段级联处理:
DecodeCascade() 在 resources/page/page_matcher.goPageMatcher.Matches() 确定页面是否匹配级联条件存储:
pageConfig.Params map 中pageConfig 中的特定属性来源: hugolib/page__meta.go253-300 hugolib/page__meta.go302-375 hugolib/page__meta.go377-680 resources/page/page_matcher.go50-85
Front matter解析是页面创建过程中一个至关重要的早期步骤
Front matter数据通过这些对象流动,并在Hugo的渲染管线中贯穿始终,用于控制页面行为、模板选择和内容呈现。
来源: hugolib/page__new.go37-63 hugolib/page__meta.go253-300 hugolib/page__meta.go302-375
通过理解front matter解析过程,您可以有效地利用Hugo强大的页面元数据系统来定制站点的行为和内容呈现。