JSON 形式で Feed を出力する

今回も小ネタ。

サイトの feed は RSS や Atom といった XML 形式を使うのが普通だが,他サイトの連携を考えるなら JSON 形式で出力できれば色々と便利そうである。 Hugo では JSON 形式のファイルも出力できる。

JSON 形式のファイルを出力するよう設定する。

まずは JSON 形式のファイルを出力できるよう設定ファイル(config.toml など)に以下の記述を追加する。

[outputs]
  home = ["HTML", "RSS", "JSON"]

これでサイトのルートディレクトリに index.html, index.xml, そして index.json ファイルを出力できるようになった。

JSON ファイルのテンプレートを作成する

テンプレートファイルを格納する layouts/ フォルダの直下または layouts/_default/ フォルダに index.json または home.json ファイルを作成する。 中身は例えばこんな感じ。

{
  "title": {{ .Site.Title | jsonify }},
  "url": {{ .Permalink | jsonify }},
  "feed": {{ .RSSLink | jsonify }},
  "entry": [{{ range $i, $v := first 3 .Data.Pages }}{{ if ne $i 0 }},{{ end }}{{ with $v }}
    {
      "title": {{ .Title | jsonify }},{{ with .Section }}
      "section": {{ . | jsonify }},{{ end }}{{ with .Description }}
      "description": {{ . | jsonify }},{{ end }}
      "url": {{ .Permalink | jsonify }},
      "published": {{ .Date.UTC.Format "2006-01-02T15:04:05-07:00" | jsonify }},
      "update": {{ .Lastmod.UTC.Format "2006-01-02T15:04:05-07:00" | jsonify }}
    }{{ end }}{{ end }}
  ]
}

これでコンパイルを行うと以下のような内容で index.json ファイルが出力される。

{
  "title": "text.Baldanders.info",
  "url": "https://text.baldanders.info/",
  "feed": "https://text.baldanders.info/index.xml",
  "entry": [
    {
      "title": "“Article 13” に関するブックマーク",
      "section": "remark",
      "description": "英語不得手の私としては難儀していたが,ようやく日本語の記事を見かけるようになった。",
      "url": "https://text.baldanders.info/remark/2019/02/bookmarks-for-article-13/",
      "published": "2019-02-19T13:04:51+00:00",
      "update": "2019-02-19T13:05:49+00:00"
    },
    {
      "title": "2019-02-17 のブックマーク",
      "section": "bookmarks",
      "description": "「火星ローバー「オポチュニティ」ミッション終了、15年の活動に幕」他",
      "url": "https://text.baldanders.info/bookmarks/2019/02/17-bookmarks/",
      "published": "2019-02-17T12:25:23+00:00",
      "update": "2019-02-17T12:25:48+00:00"
    },
    {
      "title": "Hugo で Git 情報を取得する",
      "section": "hugo",
      "description": "Hugo の環境を git で管理している場合はコミット情報等をテンプレートに組み込むことができる。",
      "author": "Spiegel",
      "license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "url": "https://text.baldanders.info/hugo/gitinfo/",
      "published": "2019-02-16T13:15:35+00:00",
      "update": "2019-02-16T13:20:26+00:00"
    }
  ]
}

Hugo では出力ファイルについてかなり細かく制御することが出来るが,今回はこのくらいにしておこう(笑) そのうち詳しい記事を書くこともあるかも知れない。

ブックマーク