介绍

当前博客使用的 Hugo + Even 主题默认 RSS 中只输出摘要,但是想要修改为输出全文,方便订阅阅读。

环境

  • Hugo v0.84.0
  • Even v4.1.0

查找模板

even 主题没有自带 RSS 模板,使用的是 Hugo 默认模板。

通过官方文档可以得知默认 RSS 模板路径是 https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/_default/rss.xml

但是实际需要的是 Hugo v0.84.0 版本的模板,因此需要前往 Releases 页面拿到 v0.84.0 的提交,然后拼接出最后的地址:https://github.com/gohugoio/hugo/blob/2c4689f7b8d3c1296111aa21bd07f6a66d677b44/tpl/tplimpl/embedded/templates/_default/rss.xml

这样可以保证拿到的版本与当前 Hugo 版本完全兼容。

修改模板

将默认模板保存到 themes/even/layouts/index.rss.xml 文件中,然后将 description 属性中的 Summary 修改为 Content 就可以了,只需要改这一处。

1
2
3
4
5
6
7
8
9
@@ -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>

调试修正

修正方法

  1. 使用 hugo 命令将整个网站输出到 public 目录中。
  2. 使用 Chrome 打开 public/index.xml 文件,文件加载完成后会报错。
  3. 使用 VSCode 打开 public/index.xml 文件,定位到报错的行号和列号。
  4. 使用 VSCode 全局文本查找提示报错位置的字符,然后将其替换为空。
  5. 重复 1 - 4 步,修复遇到的所有错误。

遇到的错误

1
2
3
This page contains the following errors:
error on line 29753 at column 28: PCDATA invalid Char value 8
Below is a rendering of the page up to the first error.

这里出现的是一个 BackSpace 不可见字符,可以通过使用正则表达式搜索 \u0008 并替换为空删除掉。

1
2
3
This page contains the following errors:
error on line 28479 at column 117: PCDATA invalid Char value 27
Below is a rendering of the page up to the first error.

这里出现的并不是 \u0027而是 \u001b ,因为报错信息使用的是十进制,而 \u 中使用的是十六进制。通过查表可以知道这是 ESC 字符,可以在 VSCode 中选中并搜索替换。

输出策略

如果设置为输出全文,那么 200+ 篇文章的 index.xml 总大小在 2MB+,实在是太大了。

参考另一篇博客的方法,指定最新 10 篇文章,修改遍历的 range 范围:

1
2
3
4
5
6
7
8
9
@@ -25,7 +25,7 @@
     {{- with .OutputFormats.Get "RSS" -}}
     {{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
     {{- end -}}
-    {{ range $pages }}
+    {{ range first 10 $pages }}
     <item>
       <title>{{ .Title }}</title>
       <link>{{ .Permalink }}</link>

修改为只输出最后 10 篇文章后,index.xml 大小可以降到 50KB 左右。

总结

通过 RSS 修改输出为全文,居然发现原有文章内存在着不少无用的不可见字符。Hugo 在输出 RSS 时未检查这些不可见字符是否合法,后续为了保证 RSS 可以正常使用,发布完文章后必须再手动检查一下 index.xml 是否存在解析错误。