hugo/docs/content/en/render-hooks/passthrough.md
2024-11-13 11:07:57 +01:00

4 KiB
Executable file

title linkTitle description categories keywords menu weight toc
Passthrough render hooks Passthrough Create a passthrough render hook to override the rendering of text snippets captured by the Goldmark passthrough extension.
render hooks
docs
parent weight
render-hooks 80
80 true

{{< new-in 0.132.0 >}}

Overview

Hugo uses Goldmark to render Markdown to HTML. Goldmark supports custom extensions to extend its core functionality. The Goldmark passthrough extension captures and preserves raw Markdown within delimited snippets of text, including the delimiters themselves. These are known as passthrough elements.

Depending on your choice of delimiters, Hugo will classify a passthrough element as either block or inline. Consider this contrived example:

{{< code file=content/sample.md >}} This is a

block

passthrough element with opening and closing block delimiters.

This is an inline passthrough element with opening and closing inline delimiters. {{< /code >}}

Update your site configuration to enable the passthrough extension and define opening and closing delimiters for each passthrough element type, either block or inline. For example:

{{< code-toggle file=hugo >}} [markup.goldmark.extensions.passthrough] enable = true [markup.goldmark.extensions.passthrough.delimiters] block = '[', ']'], ['$$', '$$' inline = '(', ')' {{< /code-toggle >}}

In the example above there are two sets of block delimiters. You may use either one in your Markdown.

The Goldmark passthrough extension is often used in conjunction with the MathJax or KaTeX display engine to render mathematical expressions written in LaTeX or Tex.

To enable custom rendering of passthrough elements, create a render hook.

Context

Passthrough render hook templates receive the following context:

Attributes

(map) The Markdown attributes, available if you configure your site as follows:

{{< code-toggle file=hugo >}} [markup.goldmark.parser.attribute] block = true {{< /code-toggle >}}

Hugo populates the Attributes map for block passthrough elements. Markdown attributes are not applicable to inline elements.

Inner

(string) The inner content of the passthrough element, excluding the delimiters.

Ordinal

(int) The zero-based ordinal of the passthrough element on the page.

Page

(page) A reference to the current page.

PageInner

(page) A reference to a page nested via the RenderShortcodes method. See details.

Position

(string) The position of the passthrough element within the page content.

Type

(string) The passthrough element type, either block or inline.

Example

As an alternative to rendering mathematical expressions with the MathJax or KaTeX display engine, create a passthrough render hook which calls the transform.ToMath function:

{{< code file=layouts/_default/_markup/render-passthrough.html copy=true >}} {{ if eq .Type "block" }} {{ $opts := dict "displayMode" true }} {{ transform.ToMath .Inner $opts }} {{ else }} {{ transform.ToMath .Inner }} {{ end }} {{< /code >}}

Although you can use one template with conditional logic as shown above, you can also create separate templates for each Type of passthrough element:

layouts/
└── _default/
    └── _markup/
        ├── render-passthrough-block.html
        └── render-passthrough-inline.html

{{% include "/render-hooks/_common/pageinner.md" %}}