Hugo에서 RSS 템플릿을 지정하는 방법

2021-08-16

개요

지난주에 커뮤니티에서 친분이 있는 분이 이 블로그의 RSS 링크에서 포스트의 태그가 확인되지 않는다고 제보해 주셨다. 확인 결과 rss 링크 “https://findstar.pe.kr/index.xml" 에서 포스트에 등록한 태그가 노출되지 않고 있었다. 그래서 RSS 스펙을 확인하여 hugo 템플릿을 수정해서 해결하였다.

템플릿 파일 생성하기

매뉴얼 을 확인하면 먼저 RSS 템플릿의 파일 매칭 순서를 확인할 수 있다. 내가 사용하는 테마파일에서는 별도의 RSS 템플릿을 지정하지 않았기 때문에 내장된 기본값이 사용된다. 기본값은 링크에서 내용을 확인할 수 있다.

내장된 기본값은 다음과 같다.

{{- $pctx := . -}}
{{- if .IsHome -}}{{ $pctx = .Site }}{{- end -}}
{{- $pages := slice -}}
{{- if or $.IsHome $.IsSection -}}
{{- $pages = $pctx.RegularPages -}}
{{- else -}}
{{- $pages = $pctx.Pages -}}
{{- end -}}
{{- $limit := .Site.Config.Services.RSS.Limit -}}
{{- if ge $limit 1 -}}
{{- $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">
  <channel>
    <title>{{ if eq  .Title  .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }}{{ end }}</title>
    <link>{{ .Permalink }}</link>
    <description>Recent content {{ if ne  .Title  .Site.Title }}{{ with .Title }}in {{.}} {{ end }}{{ end }}on {{ .Site.Title }}</description>
    <generator>Hugo -- gohugo.io</generator>{{ with .Site.LanguageCode }}
    <language>{{.}}</language>{{end}}{{ with .Site.Author.email }}
    <managingEditor>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</managingEditor>{{end}}{{ with .Site.Author.email }}
    <webMaster>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</webMaster>{{end}}{{ with .Site.Copyright }}
    <copyright>{{.}}</copyright>{{end}}{{ if not .Date.IsZero }}
    <lastBuildDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
    {{- with .OutputFormats.Get "RSS" -}}
    {{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
    {{- end -}}
    {{ range $pages }}
    <item>
      <title>{{ .Title }}</title>
      <link>{{ .Permalink }}</link>
      <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>
    </item>
    {{ end }}
  </channel>
</rss>

이제 나의 고유한 RSS 템플릿 파일을 작성해보자. 위의 내장된 기본값을 바탕으로 약간의 수정된 내용을 추가하면 된다. 나의 경우에는 layouts/_default/index.xml 파일을 생성하였다. 만약 값이 적용이 안된다면 매뉴얼에서 매칭 순서를 다시 확인해보자. 우선순위가 높은 파일이 이미 존재할 수도 있다.

생성한 파일은 다음과 같이 <category> 태그를 추가하였다. 포스트에서는 TAG 이지만, 이를 표한혀는 RSS 스펙Category 이기 때문이다. 이를 Taxonomy 라고 한다.

{{- $pctx := . -}}
{{- if .IsHome -}}{{ $pctx = .Site }}{{- end -}}
{{- $pages := slice -}}
{{- if or $.IsHome $.IsSection -}}
{{- $pages = $pctx.RegularPages -}}
{{- else -}}
{{- $pages = $pctx.Pages -}}
{{- end -}}
{{- $limit := .Site.Config.Services.RSS.Limit -}}
{{- if ge $limit 1 -}}
{{- $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">
    <channel>
        <title>{{ if eq  .Title  .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }}{{ end }}</title>
        <link>{{ .Permalink }}</link>
        <description>Recent content {{ if ne  .Title  .Site.Title }}{{ with .Title }}in {{.}} {{ end }}{{ end }}on {{ .Site.Title }}</description>
        <generator>Hugo -- gohugo.io</generator>{{ with .Site.LanguageCode }}
        <language>{{.}}</language>{{end}}{{ with .Site.Author.email }}
        <managingEditor>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</managingEditor>{{end}}{{ with .Site.Author.email }}
        <webMaster>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</webMaster>{{end}}{{ with .Site.Copyright }}
        <copyright>{{.}}</copyright>{{end}}{{ if not .Date.IsZero }}
        <lastBuildDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
        {{- with .OutputFormats.Get "RSS" -}}
        {{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
        {{- end -}}
        {{ range $pages }}
        <item>
            <title>{{ .Title }}</title>
            <link>{{ .Permalink }}</link>
            <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>
            {{ range .Params.tags }}
            <category>{{ . }}</category>
            {{ end }}
        </item>
        {{ end }}
    </channel>
</rss>

실제 기본 템플릿 내용에서 추가한 부분은 다음과 같다.

<item>
    ..생략..
    {{ range .Params.tags }}
    <category>{{ . }}</category>
    {{ end }}
</item>

템플릿 파일에서는 .Params 값을 사용할 수 있다. 템플릿에서 사용할 수 있는 값들은 매뉴얼을 참고하자. 추가한 내용을 해석하면 포스트의 tags 라는 값을 확인해서 category 라는 RSS 태그를 추가한 것이다. 따라서 category 는 여러개가 될 수 있다. 물론 위의 RSS 태그가 표시되려면 개별 포스트는 tags 라는 속성값이 존재해야한다.

...
tags: ["hugo", "rss template"]
...

결과 확인

이제 rss 결과를 확인하자.

<item>
<title>Spring 프로젝트 Maven을 사용할 때 도커라이즈 캐싱방법</title>
<link>https://findstar.pe.kr/2021/08/06/dockerize-maven-project/</link>
<pubDate>Fri, 06 Aug 2021 20:08:09 +0900</pubDate>
<guid>https://findstar.pe.kr/2021/08/06/dockerize-maven-project/</guid>
<description>spring 프로젝트에서 maven 을 사용할 때 도커라이즈에서 레이어를 캐싱하여 빌드 속도를 향상시키는 방법을 살펴보았다.</description>
<category>dockerize</category>
<category>spring boot</category>
<category>maven</category>
</item>

참고


comments powered by Disqus