blog

初めての Middleman シリーズ初めてのMiddleman:Middleman-blogにカテゴリやシリーズなどのカスタムコレクションを追加する方法

    • Ryuichi Nonaka
    この記事は書かれてから1年以上経過しており、内容が古い場合があります。

    はじめに

    今回はMiddleman-blogにカテゴリやシリーズなどのカスタムコレクションを作ってみます。カスタムコレクションを作る機能はMiddleman-blogに用意されています。

    コレクション設定

    まずはカスタムコレクションページを作るための設定をconfig.rbに追記します。

    activate :blog do |config|
      #...
      # Enable collection
      config.custom_collections = {
        category: {
          link: '/categories/{category}/index.html',
          template: 'category.html'
        },
        series: {
          link: '/series/{series}/index.html',
          template: 'series.html'
        }
      }
    end
    

    YAML FrontMatter

    YAML FrontMatterで指定するカスタムコレクションは複数指定できますが、値は1つだけです。

    ---
    category: <categoryName>
    series: <seriesName>
    ---
    

    カスタムコレクションテンプレート

    カスタムコレクションテンプレートはその他のテンプレート同様にpage_articlesを使って一覧を取得できます。Middleman-blog v3.5.3ではカスタムコレクションページのページングができません。v3.6.0で使えるようになるようです。

    とりあえず一覧を表示するテンプレートにしておきます。

    category.html.erb

    <h1><%= category %></h1>
    
    <% page_articles.each_with_index do |article, i| %>
    <div>
      <h2><%= link_to article.title, article %></h2>
      <p><%= strip_tags article.summary(100) %></p>
      <p><time date="<%= article.date.strftime('%Y-%m-%d') %>"><%= article.date.strftime('%Y-%m-%d') %></time></p>
    </div>
    <% end %>
    

    series.html.erb

    <h1><%= series %></h1>
    
    <% page_articles.each_with_index do |article, i| %>
    <div>
      <h2><%= link_to article.title, article %></h2>
      <p><%= strip_tags article.summary(100) %></p>
      <p><time date="<%= article.date.strftime('%Y-%m-%d') %>"><%= article.date.strftime('%Y-%m-%d') %></time></p>
    </div>
    <% end %>
    

    リストを取得するヘルパーの作成

    カテゴリやシリーズの一覧を取得するヘルパーを作ります。このヘルパーはすべてのコレクションで共用できます。

    helpers do
    def get_taxonomies(slug = 'category')
        list = []
        blog.articles.select{ |i| i.data[slug].present? }.each do |article|
          list = list.push article.data[slug]
        end
    
        return list.inject(Hash.new(0)){|hash, a| hash[a] += 1; hash}
      end
    end
    

    第一引数にコレクション名を指定することで全記事に指定されているカテゴリと記事数を持ったハッシュを取得できます。

    <h2>カテゴリ</h2>
    <% get_taxonomies('category').each do |category, count| %>
      <li class="list-item">
        <% link_to category_path(category) do %>
        <%= category %> (<%= count %>)
        <% end %>
      </li>
    <% end %>
    
    <h2>シリーズ</h2>
    <% get_taxonomies('series').each do |series, count| %>
      <li class="list-item">
        <% link_to series_path(series) do %>
        <%= series %> (<%= count %>)
        <% end %>
      </li>
    <% end %>
    

    これでシンプルではありますがカスタムコレクションを作ることができました。

    参考

    シリーズ

    1. 初めてのMiddleman:rbenv, bundler 環境でMiddlemanを使ったHello World
    2. 初めてのMiddleman:レイアウト機能でレイアウトとコンテンツを分離する
    3. 初めてのMiddleman:パーシャルを使ったコンテンツのモジュール化
    4. 初めてのMiddleman:SCSSのコンパイルとテンプレートの基礎
    5. 初めてのMiddleman:Sass MixinライブラリのBourbon, Neatを導入してみる
    6. 初めてのMiddleman:データファイルとデータファイルを使った動的ページ生成
    7. 初めてのMiddleman:サイトにブログ機能を追加する
    8. 初めてのMiddleman:Amazon S3にビルドされたファイルを同期する
    9. 初めてのMiddleman:HTML/CSS/JS/画像をビルド時に圧縮する
    10. 初めてのMiddleman:設定について
    11. 初めてのMiddleman:静的サイトのキャッシュとasset_hash拡張を使ったキャッシュのパージ
    12. 初めてのMiddleman:Middleman::S3Syncで使うAWS IAMユーザーのアクセスキー管理方法について
    13. 初めてのMiddleman:Helperを使ってGravatarのアイコンを表示する
    14. 初めてのMiddleman:アセットパイプラインを使った外部アセットファイルの読み込みと結合
    15. 初めてのMiddleman:Bowerを使ってjQueryなどのライブラリをロードする
    16. 初めてのMiddleman:スケルトンを自作する方法
    17. 初めてのMiddleman:Middleman Blogの記事データを使いやすく管理する方法
    18. 初めてのMiddleman:Middleman-blogのシングルブログを前提としたSkeletonを作った
    19. 初めてのMiddleman:Middleman-blogでマルチブログを試してSkeletonを作った
    20. 初めてのMiddleman:Markdown EngineをkramdownからRedcarpetに切り替える
    21. 初めてのMiddleman:RedcarpetとMiddleman::Rougeを使ったシンタックスハイライト
    22. 初めてのMiddleman:Middleman-Syntaxを使ったシンタックスハイライト
    23. 初めてのMiddleman:Middleman-Blogで記事毎に画像を管理する方法
    24. 初めてのMiddleman:Gulpを使ってサムネイル画像を生成する
    25. 初めてのMiddleman:Middleman-OGPのOGP画像指定を相対パスで設定する
    26. 初めてのMiddleman:Middleman-OGPでMiddleman-BLogにOGPを設定する
    27. 初めてのMiddleman:Middleman-Titleでタイトルタグを手軽に設定する
    28. 初めてのMiddleman:多言語化 - 言語ファイルの作成とヘルパーの埋め込み
    29. 初めてのMiddleman:Middleman-blogにカテゴリやシリーズなどのカスタムコレクションを追加する方法
    30. 初めてのMiddleman:Bowerで管理されているフォントファイルをインポートする

    コメント・フィードバック