anz blog

Zolaでフィードをカスタマイズする

2021-05-27 #Zola #Rust #SSG

Zola に移行して2つ記事を書いて問題なく運用できそうだという感触は得ていたのですが、
ふとフィードを見たときに記事全文が記載されて配信されているのが目に付きました。
悪いとかではなく、以前のPublishでは要約の状態で配信していたので、ここカスタマイズできるのかな?
と、疑問に思ったので調べてみました。

カスタマイズするには専用テンプレートを配置する

しらべてみると…というかドキュメントのテンプレートの部分に記載があったので、ごにょごにょ調べる必要はなかったのですが(笑)

…based upon the atom.xml file in the templates directory…

templates の atom.xml に基づいて生成されるということです。

zola init した状態では templates 配下には atom.xml というものは存在しないため、イチから生成するのか...めんどくさいなーと思ってしまいそうですが、templates 配下にないのに今はどうやってるの?という話になります。
ドキュメントにも記載がありますが、built-in として用意されているものがあるとのことなので、
それをコピーしてきてローカルの templates 配下に atom.xml としてファイルを用意して、いじりたいとこだけいじるということをしたほうが楽でよいかと思います。

今回でいうと、記事全文配信ではなくて、要約にできるのかな??というのが発端ですのでこういう感じです。

<entry xml:lang="{{ page.lang }}">
    <title>{{ page.title }}</title>
    <published>{{ page.date | date(format="%+") }}</published>
    <updated>{{ page.updated | default(value=page.date) | date(format="%+") }}</updated>
    <link href="{{ page.permalink | safe }}" type="text/html"/>
    <id>{{ page.permalink | safe }}</id>
    <content>{{ page.description }}</content>
</entry>

(一部抜粋です)

<content>{{ page.description }}</content> が該当部分です。修正前はこうです。 <content type="html">{{ page.content }}</content>

ただ、フィードとして記事全文を配信するのが悪いとは思っていないので最終的には以下のようにしました。

<entry xml:lang="{{ page.lang }}">
    <title>{{ page.title }}</title>
    <published>{{ page.date | date(format="%+") }}</published>
    <updated>{{ page.updated | default(value=page.date) | date(format="%+") }}</updated>
    <link href="{{ page.permalink | safe }}" type="text/html"/>
    <id>{{ page.permalink | safe }}</id>
    {%- if page.description %}
    <summary>{{ page.description }}</summary>
    {%- endif %}
    <content type="html">{{ page.content }}</content>
</entry>

こちらのほうがフィードの仕様的にも充足されてよいかな?と。
記事にはかならず Front matter で description を設定しているので、if によるチェックはいらないのですが、なんとなく(笑)

一部抜粋ではなく atom.xml 全文を載せておきます。

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="{{ lang }}">
	<title>{{ config.title }}
		{%- if term %} - {{ term.name }}
		{%- elif section.title %} - {{ section.title }}
		{%- endif -%}
	</title>
	{%- if config.description %}
	<subtitle>{{ config.description }}</subtitle>
	{%- endif %}
	<link href="{{ feed_url | safe }}" rel="self" type="application/atom+xml"/>
	<link href="
		  {%- if section -%}
				{{ section.permalink | escape_xml | safe }}
		  {%- else -%}
				{{ config.base_url | escape_xml | safe }}
		  {%- endif -%}
		"/>
	<generator uri="https://www.getzola.org/">Zola</generator>
	<updated>{{ last_updated | date(format="%+") }}</updated>
	<id>{{ feed_url | safe }}</id>
	{%- for page in pages %}
	<entry xml:lang="{{ page.lang }}">
		<title>{{ page.title }}</title>
		<published>{{ page.date | date(format="%+") }}</published>
		<updated>{{ page.updated | default(value=page.date) | date(format="%+") }}</updated>
		<link href="{{ page.permalink | safe }}" type="text/html"/>
		<id>{{ page.permalink | safe }}</id>
		{%- if page.description %}
		<summary>{{ page.description }}</summary>
		{%- endif %}
		<content type="html">{{ page.content }}</content>
	</entry>
	{%- endfor %}
</feed>

ATOMではなくてRSS派なのですけど

デフォルトの状態だと、ATOM でフィードが配信されるのですが、RSS でやりたい!という場合は、
Zola は built-in で RSS もサポートしているので、config.toml をいじるだけで切り替えることができると、ドキュメントの Configuration の部分に記載がされています。

generate_feed = false
feed_filename = "rss.xml" # これでRSS配信になります

ATOM と同じで中身を編集したい場合は、templates 配下に rss.xml とファイルを作ってあげるとよいです。
更にいうと、feed.xml というファイル名で配信したい場合は、

generate_feed = false
feed_filename = "feed.xml"

と feed_filename を指定して、さらに、tmeplates 配下に feed.xml をおいてあげると良いです。
feed.xml という名前は built-in でサポートされていないので、必ず templates 配下に自分で用意する必要があるのでそこは注意してください。

ながながと書きましたが、いずれもドキュメントに記載されていることですので、まよったら読みましょう!(笑)

参考