Featured image of post 在 Hugo 中使用全文 RSS

在 Hugo 中使用全文 RSS

TL;DR: 使用 *.rss.xml 改写 Render Hook 和 Shortcode 在生成 RSS 时的行为。

很早之前我就发现了我的大部分使用 Hugo 搭建的博客 RSS 都只有摘要部分,而不像其他的静态页面生成器支持生成全文 RSS。可以直接在 RSS 阅读器中阅读。
于是我在网络上搜索了 Hugo 的文档和其它人的解决方法,基本都提到了自定义 RSS 模板中 {{ .Summary }} 的部分。

patch
--- a/rss.xml
+++ b/rss.xml
@@ -32,7 +32,7 @@
       <pubDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
       {{ with .Site.Author.email }}<author>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</author>{{end}}
       <guid>{{ .Permalink }}</guid>
-      <description>{{ .Summary | html }}</description>
+      <description>{{ .Content | html }}</description>
     </item>
     {{ end }}
   </channel>

同时有些主题则十分“友好”,直接提供了 rssFullContent 的配置参数,并在主题内的模板中重写了一个支持全文输出的模板。我现在使用的主题就提供了这样的功能。

不过这仍然有一个问题,稍微尝试一下或者翻阅一下 Hugo 的 issue 1 就会发现,直接使用 {{ .Content }} 得到的全文简直是依托答辩

简单地使用 {{ .Content }} 则会像生成 HTML 页面一样将内容输出给 RSS,这就会导致有大量在 RSS 中多余的内容。最显而易见的就是代码区的行号,在一些 RSS 阅读器和 telegrah 中的表现非常糟糕。

这其中的主要一部分原因,是因为用到了 Render Hook Shortcode 在 HTML 生成时生成了大量只对 HTML 友好的元素。在 RSS 的输出中,应该使用其它对阅读器友好的格式。

例如:对于代码,使用一个 Hook render-codeblock.rss.xml 无视所有在 HTML 中对代码区进行的设置:

html
<pre><code>{{ .Inner }}</code></pre>

提示

Shortcode 也可以对 RSS 的输出进行重写。
比如这里在 RSS 中使用 <blockquote> 来代替页面中的 <div class="foo"> 搭配 css。

另外,在 markdown 中使用相对路径引入的图片在输出 RSS 时需要修改为绝对路径,否则阅读器无法找到图片。需要一个简单的 Hook render-image.rss.xml 来转换链接。

html
{{- $url := urls.Parse .Destination -}}
{{- if not (or (eq $url.Scheme "http") (eq $url.Scheme "https")) -}}
    {{- $result := .Page.Resources.GetMatch (printf "%s" (.Destination | safeURL)) -}}
    {{- with $result -}}
        <img src="{{ .RelPermalink | absURL }}" alt="{{ $.Text }}" {{ with $.Title}} title="{{ . }}"{{ end }} />
    {{- end -}}
{{- end -}}
Licensed under CC BY-NC-SA 4.0
最后更新于 2023 年 2 月 9 日 15:59 CST