很早之前我就发现了我的大部分使用 Hugo 搭建的博客 RSS 都只有摘要部分,而不像其他的静态页面生成器支持生成全文 RSS。可以直接在 RSS 阅读器中阅读。
于是我在网络上搜索了 Hugo 的文档和其它人的解决方法,基本都提到了自定义 RSS 模板中 {{ .Summary }}
的部分。
--- 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 中对代码区进行的设置:
<pre><code>{{ .Inner }}</code></pre>
提示
Shortcode 也可以对 RSS 的输出进行重写。
比如这里在 RSS 中使用 <blockquote>
来代替页面中的 <div class="foo">
搭配 css。
另外,在 markdown 中使用相对路径引入的图片在输出 RSS 时需要修改为绝对路径,否则阅读器无法找到图片。需要一个简单的 Hook render-image.rss.xml
来转换链接。
{{- $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 -}}