mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

nanoc - 月別の記事一覧!

[ ブログ ] [ Ruby, nanoc ]

こんばんは。

nanoc で月別の記事一覧を表示させる方法についてです。

0. 前提条件

  • Linux Mint 14 Nadia (64bit) での作業を想定。
  • nanoc 3.4.3 を使用。
  • Ruby 1.9.3-p362 を使用。
  • nanoc 用ブログヘルパー(Blogging, Rendering, LinkTo, Tagging)のインクルード設定済み。
  • テンプレート機能は ERB を使用。

1. 月一覧取得メソッド作成

月の一覧を取得するメソッドを作成する。
当方は、lib/helpers.rb に以下を追加した。

lib/helpers.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def articles_by_month
  result = {}
  current_year = current_month = hash_of_year = items_of_the_month = nil
  sorted_articles.each do |article|
    d = Date.parse(article[:created_at])
    if current_year != d.year
      current_month = nil
      current_year = d.year
      hash_of_year = result[current_year] = {}
    end
    if current_month != d.month
      current_month = d.month
      items_of_the_month = hash_of_year[current_month] = []
    end
    items_of_the_month << article
  end
  result
end

def mm_str_month(month)
  sprintf("%02d", month)
end

2. 月別一覧作成メソッド作成

月別一覧ページを作成するメソッドを作成する。
当方は、lib/helpers.rb に以下を追加した。

lib/helpers.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
def create_monthly_archive_pages
  articles_by_month.each do |year, month_hash|
    month_hash.each do |month, articles|
      month_str = sprintf("%02d", month)
      items << ::Nanoc3::Item.new(
        "<%= render('_monthly_archives', :year => #{year}, :month => #{month}) %>",
        { :title => "Archives: #{year}/#{month_str}", :is_hidden => true },
        "/archives/#{year}/#{month_str}/",
        :binary => false
      )
    end
  end
end

3. 月一覧テンプレート作成

サイドバーに表示する月一覧のテンプレートを作成する。
以下は当方の例で、ファイル名は layouts/_month_list.html とした。

layouts/_month_list.html
1
2
3
4
5
6
7
8
9
10
11
<% articles_by_m = articles_by_month %>
<ul>
  <% articles_by_m.keys.sort_by{|e| -e}.each do |year| %>
  <% articles_by_m[year].keys.sort_by{|e| -e}.each do |month| %>
  <li>
    <%= link_to("#{year}年#{mm_str_month(month)}月", "/archives/#{year}/#{mm_str_month(month)}/") %>
    (<%= articles_by_m[year][month].size %>)
  </li>
  <% end %>
  <% end %>
</ul>

4. テンプレート埋め込み

月一覧テンプレートをサイドバーの表示させたい箇所に埋め込む。
以下は当方の例で、サイドバー用に作成しているテンプレートファイル内に埋め込んでいる。

layouts/_sidebar.html
1
2
<h2>Archives</h2>
<%= render('_month_list') %>

5. 月別一覧テンプレート作成

月別一覧ページのテンプレートを作成する。
以下は当方の例で、ファイル名は layouts/_monthly_archives.html とした。

layouts/_monthly_archives.html
1
2
3
4
5
6
7
8
9
10
<h1>Archive: <%= year %>年<%= mm_str_month(month) %>月</h1>
<ul>
  <% articles_by_month[year][month].each do |post| %>
  <li class="monthly-list">
    <%= link_to(post[:title], post.path) %><br />
    <%= Time.parse(post[:created_at]).strftime("%Y-%m-%d %H:%M") %>
    [ <%= tags_for(post, {:base_url => '/tags/', :separator => ', '}) %> ]
  </li>
  <% end %>
</ul>

6. Rules 編集

全データロード後で、かつ、コンパイル前に実行されるのが Rules ファイル内の preprocess というメソッドである。
この Rules ファイルを編集する。

Rules
1
2
3
preprocess do
  create_monthly_archive_pages
end

7. コンパイル

いつものようにコンパイルする。

Rules
1
$ nanoc compile

8. 確認

nanoc view 実行後、ブラウザで確認してみる。
(以下は現時点での(調整中段階の)一例)

NANOC_MONTHLY_ARCHIVES

また、output ディレクトリには archives ディレクトリが作成され、さらに年別ディレクトリ・月別ディレクリも作成されているはずである。

9. 参考サイト


これで、年月別に記事一覧が管理できるようになりました。

ちなみに、nanoc によるブログを Octopress によるメインのブログのクローンとして公開しています。

但し、mk-mode BLOG (by Octopress)の記事を機械的に変換しているため、人知の及ばない部分もあるかと思います。ご了承下さい。

以上。

Comments