13

是否可以在 Hugo 的帖子内容中使用模板参数?例如,如果我有以下参数:

[params.company]
name = "My Company"

然后我可以在帖子的内容中做这样的事情吗?

This site, {{ .Site.BaseURL }} is operated by {{ params.company.name }}

我已经尝试过了,但它实际上是在打印上面的内容,而不是对变量进行插值。

4

3 回答 3

13

1.前事方式

据我所知,不可能*将变量放在markdown文件的内容中,因为 MD 解析器会剥离它们,但可以在每个.md内容文件的开头使用自定义变量来做到这一点。Hugo 引擎可以针对你在前面设置的任何字段。Front matter 字段也可以是唯一的。

在您的情况下,被调用以显示渲染的 .MD 文件的模板可以访问前端参数,您可以更改模板的行为(例如添加额外<div>的类),甚至可以直接从参数中提取内容。

例如,在我的.md文件中,我有:

---
title: "Post about the front matter"
<more key pairs>
nointro: false
---

关键nointro: true是让我的第一段变成正常大小。否则,如果 key 不存在或false,第一段将以较大的字体显示。从技术上讲,它是在<div>.

在模板中,我以nointro这种方式利用自定义参数:

显示您的降价文件的父模板,该文件具有前端参数:

<div class="article-body {{ if .Params.nointro }} no_intro {{ end }}">
{{ .Content }}
</div><!-- .article-body -->

请注意,我不能将变量放在 内{{ .Content }},但我可以放在外。

对于后代,这是文件中的hugo/themes/highlighter/layouts/partials/blog-single-content.html一部分内容,它是单个帖子内容的一部分。你可以按照你喜欢的任何方式安排你的部分。

显然,这是布尔参数标志,但同样可以是您可以直接使用的内容:

MD文件的顶部:

---
title: "One of our clients"
<more key pairs>
companyname: "Code and Send Ltd"
---

Text content is put here.

然后,像这样引用它(使用 对空白值进行额外保险IF):

Hugo 模板文件中的任何地方:

{{ if .Params.companyname }}{{ .Params.companyname }}{{ end }}

2.使用config.(toml/yaml/json)

现在,看看您的示例,“此站点由以下机构运营”几乎可以保证在更全球的位置使用自定义字段,例如hugo/config.toml. 如果我想将 a 添加companyname到我的config中,我会这样做:

hugo/config.toml

BaseURL = "_%%WWWPATH%%_"
languageCode = "en-uk"
title = "Code and Send"
pygmentsUseClasses = true
author = "Roy Reveltas"
theme = "Highlighter"
[params]
  companyname = ""

然后我会在任何地方通过{{ .Site.Params.headercommentblock }}.

我想如果您希望您的客户页面是静态页面,那么单一位置可能不是最好的,您可能希望利用前端。否则,如果它是网站的页脚,这种方式会更好。或者,您甚至可以将这些数据放在数据文件中。


3. 使用自定义占位符并通过 Gulp/npm 脚本替换

我说不可能*,但这是可能的,尽管非常规且风险更大。

当我的网站需要两个版本时,我就有了这样的设置:1)Prod和 2) DevProdURL 来自两个地方:CDN 和我的服务器。Dev必须来自静态文件夹中的一个位置,因为我想查看图像并且经常在火车上离线工作。

为了解决这个问题,我在所有模板(包括降价内容)中使用了两个自定义变量:_%%WWWPATH%%__%%CDNPATH%%_. 顺便说一句,我自己想出了这个独特的模式,随意适应它。然后,我也把它放在hugo/config.toml

hugo/config.toml

BaseURL = "_%%WWWPATH%%_"

在 Hugo 愉快地使用这些占位符生成网站后,我使用 Grunt 任务完成了 HTML:

咕噜声文件:

replace: {
  dev: {
    options: {
      patterns: [{
        match: /_%%CDNPATH%%_+/g,
        replacement: function () {
          return 'http://127.0.0.1:1313/'
        }
      }, {
        match: /_%%WWWPATH%%_+/g,
        replacement: function () {
          return 'http://127.0.0.1:1313/'
        }
      }...

对于后代,我推荐 Gulp 和/或 npm 脚本,我会避免使用 Grunt。这是我上面的旧代码示例,当时 Grunt 是最好的。

如果你走这条路,它比 Hugo 风险更大,params因为当你的占位符值丢失或发生任何其他错误并且占位符可能会溢出到生产代码中时,Hugo 不会出错。

走这条路,您应该添加多层捕获网,从简单的 Gulp/Grunt/npm 脚本步骤(搜索占位符模式)到通过Husky在 npm 脚本上运行的预提交钩子,以防止提交任何具有特定内容的代码模式(例如,%%_)。例如,在一个非常基本的级别上,您会指示Husky在允许以这种方式提交之前搜索任何内容:

package.json你的回购

"scripts": {
  "no-spilled-placeholders": "echo \"\n\\033[0;93m* Checking for spilled placeholders:\\033[0m\"; grep -q -r \"%%_\" dist/ && echo \"Placeholders found! Stopping.\n\" && exit 1 || echo \"All OK.\n\"",
  "precommit": "npm run no-spilled-placeholders"
},

基本上,如果找到grep模式%%_并退出错误代码。不要忘记转义代码,因为它是 JSON。我在生产中使用类似(更高级)的设置,没有任何问题。在正确的设置中,您应该创造性地查找任何错误输入的内容,包括:%_、、、等等。_%%____%

于 2017-02-04T09:33:57.653 回答
7

降价文件不支持普通 Go 模板,但简码为:

{{< param "company.name" >}}

要访问任意其他 Go 模板值,请为其创建一个自定义短代码并从您的降价文件中调用它。

对于您的示例,您需要站点的 baseUrl,因此将其另存为layouts/shortcodes/base_url.html

{{ .Site.BaseURL }}

并将其写入您的降价文件中:

+++
[company]
name = "My Company"
+++

This site, {{< base_url >}} is operated by {{< param "company.name" >}}
于 2020-06-17T08:59:40.700 回答
4

还有短代码参数: {{< param "companyName" >}}: https://gohugo.io/content-management/shortcodes/#param

于 2020-04-11T12:29:13.807 回答