• タグページを自動生成するようにしました
  • jekyll + github-pagesでも動作します

今まで,このブログのタグのページを開くとNotfoundが出ていたのですが,タグのページを作成しました.例: 日記

このブログは,jekyll + github-pages で動いていますが,タグページを作成するのに難儀したので,メモをしておきます.

jekyllによるタグページ

jekyllのデフォルトではタグページが自動生成されないので,自分で生成する必要があります.

jekyll-taggingなどのプラグインによって自動生成するのは可能ですが,github-pagesを利用してブログを公開する際には,github側で公式にサポートしているプラグインしか使えません.
参照:github-pages-Dependency

このリストの中には,タグやカテゴリに関するプラグインはないので,なんとか自前でページを作成する必要があります.

タグページの設定

このページを参考に,設定を付与します.
まず,/tag 以下にタグページを配信するために,_config.ymlに設定を追記します.

/_config.yml

collections:
  my_tags:
    output: true
    permalink: /tag/:name/
    filepath: /tag
    layout: tag_index

/_layouts/tag_index.html


---
layout: page
---
<div class="page-content wc-container">
  <div class="post">
    <h2 class="post_title"><a href="{{ page.url | relative_url }}">{{ page.tag }}</a>のタグがついている投稿</h2>
    <ul>
      {% assign posts =  site.posts | where_exp:"post", "post.tags contains page.tag" %}
      {% for post in posts %}
        <li class="archive_list">
          <time>{{ post.date | date_to_string }}</time>
          <a class="archive_list_article_link" href='{{ post.url | relative_url }}'>{{post.title}}</a>
          <p>{{post.description}}</p>
        </li>
      {% endfor %}
    </ul>
  </div>
</div>

これで,以下のように /tag/ 以下にファイルを配置することで,ページを配信することができます.

/tag/日記.md

---
layout: tag_index
tag: 日記
---

タグページの自動生成

あとは,/tag/以下にファイルを自動配置するスクリプトを書きます.

jekyll公式ページを参考に,更新時のhookを利用してタグページのファイルを生成します.
_plugins/ext.rb に書くことでローカルで動作させた時に,hookが動作します.

_plugins/ext.rb

def tag_file_body(tag, layout)
  return <<~TEXT
  ---
  layout: #{layout}
  tag: #{tag}
  ---
  TEXT
end

def tag_files(site)
  config = site.config
  site.tags.keys.each do |tag|
    source = File.expand_path(config["source"])
    path = config["collections"]["my_tags"]["filepath"]
    file = File.join(source, path, "#{tag}.md")

    yield tag, file
  end
end

Jekyll::Hooks.register :site, :post_write do |site|
  config = site.config
  site.tags.keys.each do |tag|
    source = File.expand_path(config["source"])
    path = config["collections"]["my_tags"]["filepath"]
    file = File.join(source, path, "#{tag}.md")

    next if File.exists?(file)

    layout = config["collections"]["my_tags"]["layout"]
    File.write(file, tag_file_body(tag, layout))
    p "Generate: #{file}"
  end
end

これによって生成されたタグページのファイルもコミットしてpushしましょう.

このままだと,タグページのファイルの更新や削除ができないのですが,それは今後の課題ということにします.

参考

jekyll-tagging
github-page-Dependency

http://www.minddust.com/post/alternative-tags-and-categories-on-github-pages/
jekyll公式ページ