本文档解释了 Hugo 如何根据其 MIME(多用途互联网邮件扩展)类型,也称为媒体类型,来识别、处理和管理不同类型的内容。媒体类型处理是 Hugo 的核心子系统,它能够正确识别和处理各种文件格式,如 HTML、CSS、JavaScript、图像等。这些知识构成了 Hugo 管道中资源转换、输出格式选择和内容协商的基础。
有关更广泛的资源管理系统的相关信息,请参阅 资源管理 和 资源管道。
Hugo 媒体类型系统的核心是 `media` 包中定义的 `Type` 结构体。
来源: media/mediaType.go35-58 media/mediaType.go60-67
`Type` 结构体代表一个媒体类型,包含以下关键组件:
| 字段 | 描述 |
|---|---|
类型 | 完整的 MIME 类型字符串(例如,“application/rss+xml”) |
MainType | 顶级类型名称(例如,“application”) |
SubType | 子类型名称(例如,“rss”) |
Delimiter | 后缀之前的分隔符,通常是“.” |
FirstSuffix | 有关此 MediaType 定义的第一个后缀的信息 |
mimeSuffix | MIME 类型中“+”后面的可选后缀(例如,“application/rss+xml”中的“xml”) |
SuffixesCSV | 逗号分隔的文件扩展名列表(例如,“jpg,jpeg”) |
`SuffixInfo` 结构体包含媒体类型后缀的信息
| 字段 | 描述 |
|---|---|
Suffix | 不带分隔符的后缀(例如,“xml”) |
FullSuffix | 带分隔符的后缀(例如,“.xml”) |
来源: media/mediaType.go35-58 media/mediaType.go60-67
Hugo 通过 `Types` 切片维护媒体类型集合,该切片提供通过各种标准查找媒体类型的方法。
这些查找方法可以方便地找到合适的媒体类型。
GetByType:按完整的 MIME 类型字符串查找媒体类型BySuffix / GetFirstBySuffix / GetBySuffix:按文件扩展名查找媒体类型GetByMainSubType:按主类型和子类型查找媒体类型GetBySubType:仅按子类型查找媒体类型Hugo 在 `Builtin` 变量中提供了一组内置媒体类型。这些涵盖了 Hugo 处理的常见文件格式。以下是重要的内置类型示例:
| 媒体类型 | MIME 类型 | 文件扩展名 |
|---|---|---|
| HTMLType | text/html | .html, .htm |
| CSSType | text/css | .css |
| JavascriptType | application/javascript | .js |
| JSONType | application/json | .json |
| XMLType | application/xml | .xml |
| RSSType | application/rss+xml | .rss, .xml |
| CSVType | text/csv | .csv |
| CalendarType | text/calendar | .ics |
| MarkdownType | text/markdown | .md, .markdown |
| TextType | text/plain | .txt |
| ImageType (各种) | image/* | .jpg, .png, .gif 等 |
这些内置类型在 Hugo 中被用来正确识别和处理文件。
来源: media/mediaType.go220-227 output/outputFormat.go86-220
Hugo 拥有复杂的机制来检测文件或内容的媒体类型。此检测通过 `media` 包中的 `FromContent` 函数进行。
检测过程遵循以下步骤:
http.DetectContentType 来获取初始内容类型这使得 Hugo 即使在文件扩展名与其实际内容不匹配时也能正确处理文件。
媒体类型与 Hugo 的输出格式系统紧密集成。每个输出格式都有一个关联的媒体类型,该媒体类型决定了该格式的特性。
来源: output/outputFormat.go26-82 output/outputFormat.go86-220 output/outputFormat.go223-240 hugolib/site_output.go25-55
Hugo 定义了一组常用的默认输出格式:
| 输出格式 | 媒体类型 | 描述 |
|---|---|---|
| HTMLFormat | text/html | 标准的 HTML 输出 |
| RSSFormat | application/rss+xml | RSS feed 输出 |
| AMPFormat | text/html (Path="amp") | 加速移动页面 |
| JSONFormat | application/json | JSON 数据输出 |
| CSSFormat | text/css | CSS 样式表 |
| CalendarFormat | text/calendar | 日历输出(iCalendar) |
| SitemapFormat | application/xml | XML 站点地图 |
输出格式决定了内容的渲染方式以及输出使用的媒体类型和相关属性。
来源: output/outputFormat.go86-220 hugolib/site_output.go25-55
媒体类型在 Hugo 的资源处理系统中起着至关重要的作用。资源的识别和处理均基于其媒体类型。
来源: resources/resource_factories/create/create.go124-152 resources/resource_factories/create/remote.go166-308 tpl/resources/resources.go183-205
资源中媒体类型处理流程:
Hugo 拥有一个复杂的系统来检测远程资源的媒体类型。
来源: resources/resource_factories/create/remote.go241-286
对于远程资源,Hugo:
这种方法确保 Hugo 能够正确识别和处理远程资源,即使 HTTP 标头不正确或不完整。
Hugo 允许站点作者在其配置文件中定义自定义媒体类型。这对于处理专门的文件格式或覆盖 Hugo 的内置媒体类型非常有用。
自定义媒体类型定义包括:
一旦定义,自定义媒体类型就能与 Hugo 的资源处理系统无缝集成。
来源: media/mediaType.go120-162 media/mediaType.go216-227
媒体类型处理影响 Hugo 的许多方面:
理解媒体类型处理对于高级 Hugo 用途至关重要,尤其是在处理自定义资源类型或输出格式时。
来源: hugolib/resource_chain_test.go374-392 tpl/resources/resources.go290-303
Hugo 提供了一些处理媒体类型的实用函数:
| 功能 | 目的 |
|---|---|
FromString | 从 MIME 类型字符串创建 Type |
FromStringAndExt | 从 MIME 字符串和扩展名创建 Type |
FromContent | 通过检查内容和提示来创建 Type |
InitMediaType | 初始化媒体类型的内部结构 |
IsText | 确定媒体类型是否表示文本内容 |
IsHTML | 检查媒体类型是否为 HTML |
IsMarkdown | 检查媒体类型是否为 Markdown |
这些实用工具简化了 Hugo 代码库中处理媒体类型的工作。
来源: media/mediaType.go69-118 media/mediaType.go119-162 media/mediaType.go178-201