Passthrough render hooks
概述
Hugo 使用 Goldmark 將 Markdown 渲染為 HTML。Goldmark 支援自訂擴展以擴充其核心功能。Goldmark 的 傳遞擴展 會捕捉並保留被定界符包圍的原始 Markdown,包括定界符本身。這些被稱為傳遞元素。
根據您選擇的定界符,Hugo 將傳遞元素分類為區塊或內嵌。以下是一個範例:
This is a
\[block\]
passthrough element with opening and closing block delimiters.
This is an \(inline\) passthrough element with opening and closing inline delimiters.
更新您的網站配置以啟用傳遞擴展,並為每種類型(block
或 inline
)的傳遞元素定義開頭和結尾的定界符。例如:
markup:
goldmark:
extensions:
passthrough:
delimiters:
block:
- - \[
- \]
- - $$
- $$
inline:
- - \(
- \)
enable: true
[markup]
[markup.goldmark]
[markup.goldmark.extensions]
[markup.goldmark.extensions.passthrough]
enable = true
[markup.goldmark.extensions.passthrough.delimiters]
block = [['\[', '\]'], ['$$', '$$']]
inline = [['\(', '\)']]
{
"markup": {
"goldmark": {
"extensions": {
"passthrough": {
"delimiters": {
"block": [
[
"\\[",
"\\]"
],
[
"$$",
"$$"
]
],
"inline": [
[
"\\(",
"\\)"
]
]
},
"enable": true
}
}
}
}
}
在上述範例中,有兩組 block
的定界符。您可以在 Markdown 中使用任意一組。
Goldmark 傳遞擴展通常與 MathJax 或 KaTeX 顯示引擎結合使用,用於渲染以 LaTeX 或 Tex 撰寫的 數學表達式。
若要啟用傳遞元素的自訂渲染,請建立渲染 Hook。
上下文
傳遞渲染 Hook 模板會接收以下 上下文:
Attributes
(map
)Markdown 屬性,若您按以下配置網站則可用:
markup:
goldmark:
parser:
attribute:
block: true
[markup]
[markup.goldmark]
[markup.goldmark.parser]
[markup.goldmark.parser.attribute]
block = true
{
"markup": {
"goldmark": {
"parser": {
"attribute": {
"block": true
}
}
}
}
}
Hugo 會為區塊傳遞元素填充 Attributes
映射。Markdown 屬性不適用於內嵌元素。
Inner
(string
)傳遞元素的內部內容,不包括定界符。
Ordinal
(int
)傳遞元素在頁面上的零基序號。
Page
(page
)對當前頁面的引用。
PageInner
(page
)通過 RenderShortcodes
方法嵌套的頁面引用。查看詳細資訊。
Position
(string
)傳遞元素在頁面內容中的位置。
Type
(string
)傳遞元素的類型,為 block
或 inline
。
範例
除了使用 MathJax 或 KaTeX 顯示引擎渲染數學表達式外,您也可以建立一個傳遞渲染 Hook,調用 transform.ToMath
函數:
{{ if eq .Type "block" }}
{{ $opts := dict "displayMode" true }}
{{ transform.ToMath .Inner $opts }}
{{ else }}
{{ transform.ToMath .Inner }}
{{ end }}
雖然可以像上述範例那樣使用一個帶有條件邏輯的模板,但您也可以為每種傳遞元素的 Type
創建單獨的模板:
layouts/
└── _default/
└── _markup/
├── render-passthrough-block.html
└── render-passthrough-inline.html
PageInner 詳細資訊
New in v0.125.0PageInner
的主要用途是解析相對於包含的 Page
的連結和 頁面資源。例如,建立一個「include」掛載程式碼,從多個內容檔案組合成一個頁面,同時保留註腳和目錄的全域上下文:
{{ with site.GetPage (.Get 0) }}
{{ .RenderShortcodes }}
{{ end }}
然後在您的 Markdown 中呼叫此掛載程式碼:
{{% include "/posts/p2" %}}
在渲染 /posts/p2
時觸發的任何渲染掛載將獲得:
/posts/p1
當呼叫Page
/posts/p2
當呼叫PageInner
如果不相關,PageInner
將回退到 Page
的值,並始終返回一個值。
作為一個實際範例,Hugo 的內嵌連結和圖片渲染掛載使用 PageInner
方法解析 Markdown 中連結和圖片的目標位置。請參考以下來源程式碼: