Markdown渲染钩子
注意,这仅在Goldmark渲染器中受支持。
您可以通过创建以render-{kind}
为基础名的模板在layouts/_default/_markup
中来覆盖默认的Markdown渲染为HTML的某些部分。
您还可以在layouts/[type/section]/_markup
中创建特定类型/部分的钩子,例如:layouts/blog/_markup
。
目前支持以下钩子种类:
image
link
heading
codeblock
如果需要,您可以定义输出格式和语言特定的模板。您的layouts
文件夹可能如下所示:
layouts/
└── _default/
└── _markup/
├── render-codeblock-bash.html
├── render-codeblock.html
├── render-heading.html
├── render-image.html
├── render-image.rss.xml
└── render-link.html
上述用例:
- 使用
.GetPage
解析链接引用。这将使链接可移植,例如您可以将./my-post.md
(以及在GitHub上起作用的类似结构)翻译为/blog/2019/01/01/my-post/
等。 - 在外部链接上添加
target=_blank
。 - 解析并处理图片。
- 添加头部链接。
标题、链接和图片的渲染钩子
render-link
和render-image
中的上下文传递
render-link
和render-image
模板将接收以下上下文:
- Page
- 正在渲染的Page。
- Destination
- URL。
- Title
- 标题属性。
- Text
- 渲染后(HTML格式)的链接文本。
- PlainText
- 上文的纯文本。
render-heading
中的上下文传递
render-heading
模板将接收以下上下文:
- Page
- 正在渲染的Page。
- Level
- 标题级别(1-6)
- Anchor
- 页面内唯一的自动生成的HTML id。
- Text
- 渲染后(HTML格式)的文本。
- PlainText
- 上文的纯文本。
- Attributes(映射)
- 属性的映射(例如
id
、class
)。注意,对于链接,这通常为空。
render-image
模板还将接收以下上下文:
- IsBlock
- 如果这是一个独立的图片且配置选项markup.goldmark.parser.wrapStandAloneImageWithinParagraph已禁用,则返回true。
- Ordinal
- 当前文档中所有图片的从零开始的顺序。
具有标题的链接Markdown示例
[文本](https://www.gohugo.io "标题")
以下是render-link.html
模板的代码示例:
layouts/_default/_markup/render-link.html
<a href="{{ .Destination | safeURL }}"{{ with .Title }} title="{{ . }}"{{ end }}{{ if strings.HasPrefix .Destination "http" }} target="_blank" rel="noopener"{{ end }}>{{ .Text | safeHTML }}</a>
图片的Markdown示例
![文本](https://gohugo.io/images/hugo-logo-wide.svg "标题")
以下是render-image.html
模板的代码示例:
layouts/_default/_markup/render-image.html
<p class="md__image">
<img src="{{ .Destination | safeURL }}" alt="{{ .Text }}" {{ with .Title }} title="{{ . }}"{{ end }} />
</p>
标题链接示例
给定以下模板文件
layouts/_default/_markup/render-heading.html
<h{{ .Level }} id="{{ .Anchor | safeURL }}">{{ .Text | safeHTML }} <a href="#{{ .Anchor | safeURL }}">¶</a></h{{ .Level }}>
以及以下Markdown
### 第一节
则渲染结果为
<h3 id="first-section">第一节 <a href="#first-section">¶</a></h3>
代码块的渲染钩子
您可以为所有代码块或特定类型/语言(下面示例中为bash
)添加钩子模板:
这些代码块的默认行为是进行代码高亮,但由于可以向这些代码块传递属性,因此它们几乎可以用于任何用途。一个示例是内置的GoAT Diagrams或此Mermaid Diagram Code Block Hook。
在代码块的模板中,您将接收到这个上下文(.
):
- Type(字符串)
- 代码块的类型。这将是编程语言,例如
bash
,用于代码高亮。 - Attributes(映射)
- 从Markdown中传递的属性,例如
{ attrName1=attrValue1 attrName2="attr Value 2" }
。 - Options(映射)
- Chroma高亮处理选项。仅当
Type
是已知的Chroma词法解析器时,才会填充此选项。 - Inner(字符串)
- 代码标记之间的文本。
- Ordinal(整数)
- 当前文档中所有代码块的从零开始的顺序。
- Page
- 拥有的
Page
。 - Position
- 在错误日志中非常有用,因为它打印文件名和位置(行号、列号),例如
{{ errorf "error in code block: %s" .Position }}
。