メインコンテンツへスキップ

HugoのRSS FeedをFull-textにする

blog hugo rss

このサイトのRSS FeedをFull-textにしたのでメモ.

背景
#

ふと自分のブログをRSSリーダーに登録してみたら記事の本文が最初だけしか表示されていなかった.

調べてみると,どうやらHugoの default RSS templateでは<description>{{ .Summary | html }}</description>のみで.Contentが定義されていない模様.

解決策
#

関連記事を漁っているとdescription.Summary.Contentに変更する方法がいくつか見つかった. ただdescriptionは短めの要約を定義するのが推奨っぽいのでcontent:encodedを追加する方式にした.

rss.xmlを用意
#

layouts/_default/rss.xmlを配置してデフォルトのtemplateを上書きする. default RSS templateに記載されている Githubのリンクからダウンロードする.

curl "https://raw.githubusercontent.com/gohugoio/hugo/master/tpl/tplimpl/embedded/templates/_default/rss.xml" > layouts/_default/rss.xml

rss.xmlを修正
#

以下で元のrss.xmlと変更を加えたlayouts/_default/rss.xmlのdiffを取る.

diff --label default --label custom <(curl "https://raw.githubusercontent.com/gohugoio/hugo/master/tpl/tplimpl/embedded/templates/_default/rss.xml") <(cat layouts/_default/rss.xml)
--- default
+++ custom
@@ -11,7 +11,7 @@
 {{- $pages = $pages | first $limit -}}
 {{- end -}}
 {{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
-<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
   <channel>
     <title>{{ if eq  .Title  .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }}{{ end }}</title>
     <link>{{ .Permalink }}</link>
@@ -33,6 +33,11 @@
       {{ with .Site.Author.email }}<author>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</author>{{end}}
       <guid>{{ .Permalink }}</guid>
       <description>{{ .Summary | html }}</description>
+      <content:encoded>
+              {{ `<![CDATA[` | safeHTML }}
+              {{ .Content  }}
+              {{ `]]>` | safeHTML  }}
+      </content:encoded>
     </item>
     {{ end }}
   </channel>
  • <rss>xmlns:content="http://purl.org/rss/1.0/modules/content/"を追加
    • これが無いとNamespace prefix content on encoded is not definedでエラーになる
  • <content:encoded>を追加
    • <content:encoded>{{ .Content | html }}でも良さそう

ひとまずこれでFeedlyではうまく表示出来てそう.Inoreader側ではキャッシュが保持されて過去記事には適用され無さそうなのでしばらくこれで運用してみて様子をみる.

参考
#


著者
suy0n9
Software Engineer

Related

Hugoのundraftコマンドを再現する
blog hugo
MediumからHugoに移行した
blog hugo
ブログはじめました
blog