內部

這段內容:

content/services.md
{{< card title="Product Design" >}}
我們設計世界上**最棒**的小工具。
{{< /card >}}

使用此短碼:

layouts/shortcodes/card.html
<div class="card">
  {{ with .Get "title" }}
    <div class="card-title">{{ . }}</div>
  {{ end }}
  <div class="card-content">
    {{ .Inner | strings.TrimSpace }}
  </div>
</div>

渲染為:

<div class="card">
  <div class="card-title">Product Design</div>
  <div class="card-content">
    我們設計世界上**最棒**的小工具。
  </div>
</div>

使用 RenderString

讓我們修改上述範例,將 Inner 回傳的值傳遞給 Page 物件的 RenderString 方法:

layouts/shortcodes/card.html
<div class="card">
  {{ with .Get "title" }}
    <div class="card-title">{{ . }}</div>
  {{ end }}
  <div class="card-content">
    {{ .Inner | strings.TrimSpace | .Page.RenderString }}
  </div>
</div>

Hugo 渲染為:

<div class="card">
  <div class="card-title">Product design</div>
  <div class="card-content">
    我們生產世界上最棒的小工具。
  </div>
</div>

你可以使用 markdownify 函式來替代 RenderString 方法,但後者更具彈性。請參閱詳細資訊

替代標註法

不使用 {{< >}} 標註來呼叫短碼,而是使用 {{% %}} 標註:

content/services.md
{{% card title="Product Design" %}}
我們設計世界上**最棒**的小工具。
{{% /card %}}

當使用 {{% %}} 標註時,Hugo 會將整個短碼渲染為 Markdown,需要進行以下更動。

首先,配置渲染器以允許在 Markdown 中使用原始 HTML:

hugo.
     
markup:
  goldmark:
    renderer:
      unsafe: true
[markup]
  [markup.goldmark]
    [markup.goldmark.renderer]
      unsafe = true
{
   "markup": {
      "goldmark": {
         "renderer": {
            "unsafe": true
         }
      }
   }
}

如果是 控制的內容,這個配置並不危險。閱讀更多關於 Hugo 安全模型的資料。

接著,因為我們正在將整個短碼渲染為 Markdown,我們必須遵守 縮排原始 HTML 區塊 的規範,這些規範由 CommonMark 規範提供。

layouts/shortcodes/card.html
<div class="card">
  {{ with .Get "title" }}
  <div class="card-title">{{ . }}</div>
  {{ end }}
  <div class="card-content">

  {{ .Inner | strings.TrimSpace }}
  </div>
</div>

這與前面範例的差異是細微的,但必要的。注意縮排的改變,增加了一個空行,並移除了 RenderString 方法。

--- layouts/shortcodes/a.html
+++ layouts/shortcodes/b.html
@@ -1,8 +1,9 @@
 <div class="card">
   {{ with .Get "title" }}
-    <div class="card-title">{{ . }}</div>
+  <div class="card-title">{{ . }}</div>
   {{ end }}
   <div class="card-content">
-    {{ .Inner | strings.TrimSpace | .Page.RenderString }}
+
+  {{ .Inner | strings.TrimSpace }}
   </div>
 </div>