内容管理

摘要

摘要的来源、模板用法,以及中文内容的长度统计。

摘要(summary)有三种来源:手动分隔、前置元数据、自动生成。三者的优先级依次降低——手动摘要优先于前置元数据摘要,前置元数据摘要优先于自动摘要。

手动摘要

在正文中插入 <!--more--> 分隔符,它之前的内容即为摘要,分隔符本身不会渲染出来:

+++
title = '示例'
date = 2024-05-26T09:10:33-07:00
+++

这是第一段。

<!--more-->

这是第二段。

分隔符必须独占一行,不能与其他内容写在同一行。下面是正确与错误的两种放置方式:

这是包含 **粗体文字** 的句子,后面还有一句话。

<!--more-->

这是另一段。
这是包含 **粗体文字** <!--more--> 的句子,后面还有一句话。

这是另一段。

使用 Emacs Org Mode 内容格式时,改用 # more 作为摘要分隔符。

前置元数据摘要

前置元数据中的 summary 字段可以让摘要与正文完全解耦:

+++
title = '示例'
date = 2024-05-26T09:10:33-07:00
summary = '这段摘要与正文内容无关。'
+++

这是第一段。

这是第二段。

自动摘要

既没有手动分隔符,也没有前置元数据摘要时,Hugo 依据项目配置中的 summaryLength 自动生成摘要,默认值为 70。自动摘要会在最接近该长度的段落边界处截断,同时至少给出 summaryLength 所要求的最少字词。

例如 summaryLength = 7 时,三段正文只会得到前两段:

<p>This is the first paragraph.</p>
<p>This is the second paragraph.</p>

三种摘要的对比

类型 优先级 渲染 Markdown 渲染短代码 为单行包裹 <p>
手动 1 是 是 是
前置元数据 2 是 否 否
自动 3 是 是 是

在模板中渲染摘要

在模板里对 Page 对象调用 Summary 方法即可输出摘要,用 Truncated 判断内容是否被截断,从而决定要不要补一个「继续阅读」链接:

{{ range site.RegularPages }}
  <h2><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
  <div class="summary">
    {{ .Summary }}
    {{ if .Truncated }}
      <a href="{{ .RelPermalink }}">继续阅读</a>
    {{ end }}
  </div>
{{ end }}

另一种做法

如果需要对长度做更精细的控制,可以不用 Summary 方法,改用 strings.Truncate 直接截断正文:

{{ range site.RegularPages }}
  <h2><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
  <div class="summary">
    {{ .Content | strings.Truncate 42 }}
  </div>
{{ end }}

中文内容的长度统计

中文不用空格分词,按「词」统计长度容易失真。在站点配置中开启 hasCJKLanguage = true 之后,Hugo 会按中日韩文字的字符数统计,自动摘要的截取与 .WordCount 才符合中文的语感:

hasCJKLanguage = true
summaryLength = 70

延伸阅读