【问题标题】:Hugo: do not escape HTML in a page .Title when generating <title> tag in the header.html partialHugo:在 header.html 部分生成 <title> 标记时,不要在页面 .Title 中转义 HTML
【发布时间】:2020-10-02 02:04:35
【问题描述】:

在我基于 Hugo 的网站中,我经常在帖子标题中使用 &lt;span&gt; 标签。我遇到了一个问题,这个 HTML 总是在一个特定的上下文中转义。以一个帖子为例,在 Markdown 文件的头部给出的标题如下:

title: 'This is a title with Spanish: <span lang="es">Hola!</span>'

在我的 Hugo 主题的 single.html 部分中,&lt;h2 class="posttitle"&gt;{{ .Title | markdownify }}&lt;/h2&gt; 工作正常,它将This is a title with Spanish: &lt;span lang="es"&gt;Hola!&lt;/span&gt; 传递给页面的最终 HTML。

但是,在我的 Hugo 主题的 header.html 部分中,&lt;title&gt;{{ .Title | markdownify }}&lt;/title&gt; 工作。相反,Hugo 将转义字符串传递给页面的最终 HTML:&lt;title&gt;This is title with Spanish: &amp;lt;span lang=&amp;#34;es&amp;#34;&amp;gt;Hola!&amp;lt;/span&amp;gt;&lt;/title&gt;

如何在 header.html 中实现与在 single.html 中相同的行为?

编辑:我的主题非常简单,hugo-xmin 主题的改动很小。我的主题的 header.html 部分如下:

<!DOCTYPE html>
<html lang="{{ .Site.LanguageCode }}">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>{{ .Title | markdownify }} &#124; {{ .Site.Title }}</title>
    <link rel="stylesheet" media="screen" href="{{ "/css/style.css" | relURL }}" />
    <link rel="stylesheet" media="screen" href="{{ "/css/screen.css" | relURL }}" />
    {{ partial "head_custom.html" . }}
  </head>
  <body>
    <h1 id="sitetitle">.Site.Title</h1>
    <p id="sitedescription">{{ $.Site.Params.description }}</p>
    <nav>
    <ul class="menu">
      {{ range .Site.Menus.main }}
      <li><a href="{{ .URL | relURL }}">{{ .Name }}</a></li>
      {{ end }}
    </ul>
    <hr/>
    </nav>

而我的主题的single.html文件如下:

{{ partial "header.html" . }}
<main>
<div class="article-meta">
<h2 class="posttitle">{{ .Title | markdownify }}</h2>
Published on <a href="{{ .RelPermalink }}"><time>{{ .Date.Format "2006-01-02" }}</time></a>
</div>
{{ .Content }}
</main>

{{ partial "footer.html" . }}

【问题讨论】:

    标签: hugo hugo-shortcode


    【解决方案1】:

    如果你想避免转义,你应该使用safeHTML函数。

    {{ .Title | safeHTML }}

    这不是一个有效的解决方案。即使将此函数放入 header.html 部分,HTML 仍会继续被转义。

    这可能是旧版 Hugo 的问题,我在 v0.74.3 上,它似乎按预期工作。如果您不是最新版本,您可能需要upgrade,如果您无法升级,请查看discourse

    【讨论】:

    • 这不是一个有效的解决方案。即使将此函数放入 header.html 部分,HTML 仍会继续被转义。
    • @ChristopherC。请在您导入部分的地方包含您的代码,这里还有其他事情,因为safeHTML 应该完全按照您的要求进行 - 我们缺少您的项目中可能导致问题的元素
    • 还要注意 header 部分本身的标记 - 似乎您正试图将 span 标记放在 head 元素中,这很奇怪,但由于没有来源,所以没有告诉方式
    • 我已经编辑了我的帖子以显示两个相关文件的内容。但是请注意,正如我所说,将 header.html 中的 markdownify 函数替换为 safeHTML 无效。 span 中的 span 标记不是无效的 HTML(W3C 的验证器既不显示错误也不显示警告),实际上它经常用于为页面标题的元素提供语言标记,以供屏幕阅读器等使用。
    • 我已经上传了一个最小的例子到Github。我应该注意我使用的是 Debian (bullseye) 打包的 Hugo 0.75.1-1。
    【解决方案2】:

    我下载了您的非工作博客最小示例,并且能够通过做两件事来解决您的问题:

    1. 将以下内容放在config.toml 的底部:
    [outputFormats]
      [outputFormats.html]
        isPlainText = true
    
    1. 注释掉layouts/_default/list.html 中的第 34 行,所以它现在看起来像这样:
    {{/*
    {{ template "_internal/pagination.html" . }}
    */}}
    

    我做了#2,因为它产生了一个我现在没有时间研究的错误,但解决您的问题的关键是outputFormats,在https://gohugo.io/templates/output-formats/ 上进行了讨论,尤其是这个:

    isPlainText
    对模板使用 Go 的纯文本模板解析器。 默认值: false。

    如果有人知道如何解决第 34 行问题,我很想了解。

    顺便说一句,我在 Infinite Ink 网站上使用isPlainText = true 已经一年多了,到目前为止还没有遇到任何问题(但我没有使用任何{{ template … }} 电话)。

    【讨论】:

    • 感谢您的帮助,但我不能接受这是对我的查询的回答,因为您提出的解决方案会破坏我网站上的分页。
    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多