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)のインクルード設定済み。
  • テンプレート機能は ERB を使用。
  • タグ別ページの URL は tags/hoge のようにする。

1. タグ管理用ヘルパーのインクルード

コンパイル時にタグ管理用のヘルパー Tagging Helper をインクルードするよう、 lib/default.rb に次の1行を追加する。

lib/default.rb
1
include Nanoc3::Helpers::Tagging

2. 個別ページ編集

各記事にタグを表示するようにする。
以下は当方の例の抜粋で、記事作成日時の後ろに表示させるようにしている。

layouts/article.html
1
2
3
4
<p class="meta">
  <%= Time.parse(@item[:created_at]).strftime("%Y-%m-%d %H:%M") %>
  [ <%= tags_for(item, {:base_url => '/tags/', :separator => ', '}) %> ]
</p>

場合により、個別ページ以外(トップページ等)も編集する。

3. 件数カウントメソッド作成

タグ一覧表示に使用するタグ付されている件数をカウントするメソッドを作成する。
当方は、lib/helpers.rb に以下を追加した。

lib/helpers.rb
1
2
3
4
5
6
7
8
9
10
11
12
def count_by_tag(items = nil)
  items = @items if items.nil?
  count_by_tag = Hash.new(0)
  items.each do |item|
    if item[:tags]
      item[:tags].each do |tag|
        count_by_tag[tag] += 1
      end
    end
  end
  count_by_tag
end

4. タグ別一覧作成メソッド作成

タグ別一覧ページを作成するメソッドを作成する。
当方は、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
def create_tag_pages
  tag_set(items).each do |tag|
    items << ::Nanoc3::Item.new(
    "<%= render('_tag_page', :tag => '#{tag}') %>",
      {:title => "Tags: #{tag}", :is_hidden => true},
      "/tags/#{tag}/",
      :binary => false
    )
  end
end

def tag_set(items = nil)
  require 'set'
  items = @items if items.nil?
  tags = Set.new
  items.each do |item|
    next if item[:tags].nil?
    item[:tags].each { |tag| tags << tag }
  end
  tags.to_a
end

5. タグ一覧テンプレート作成

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

layouts/_tag_list.html
1
2
3
4
5
6
7
8
9
10
<% tags = count_by_tag(@items) %>
<% if tags %>
<ul>
  <% tags.sort_by{|e| e[0]}.each do |k, v| %>
  <li><%= link_for_tag(k, "/tags/") %> (<%= v %>)</li>
  <% end %>
</ul>
<% else %>
<p>(none)</p>
<% end %>

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

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

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

7. タグ別一覧テンプレート作成

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

layouts/_tag_page.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<h1>Tags: <%= tag %></h1>
<% if taged_items = items_with_tag(tag) %>
<ul>
  <% taged_items.sort_by{|e| e[:created_at]}.reverse.each do |post| %>
  <li>
    <%= link_to(post[:title], post.path) %><br />
    <p class="meta">
      <%= Time.parse(post[:created_at]).strftime("%Y-%m-%d %H:%M") %>
      [ <%= tags_for(post, {:base_url => '/tags/', :separator => ', '}) %> ]
    </p>
  </li>
  <% end %>
</ul>
<% else %>
<p>none</p>
<% end %>

8. Rules 編集

全データロード後で、かつ、コンパイル前に実行されるのが Rules ファイル内の preprocess というメソッドである。
タグ別一覧ページを作成するには、この Rules ファイルを以下のように編集する。(preprocess メソッドが無ければ作成する)

Rules
1
2
3
preprocess do
  create_tag_pages
end

9. タグ設定

各記事にタグを設定するには、メタデータ部分でタグを以下のように設定する。

2013-01-17-test-tag.md
1
2
3
4
5
6
---
title: TEST [ Tag ]
created_at: 2013/01/17 00:20:00
kind: article
tags: [nanoc, ruby]
---

もしくは以下のように設定する。

2013-01-17-test-tag.md
1
2
3
4
5
6
7
8
---
title: TEST [ Tag ]
created_at: 2013/01/17 00:20:00
kind: article
tags:
- nanoc
- ruby
---

10. コンパイル

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

Rules
1
$ nanoc compile

11. 確認

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

NANOC_TAG_1

NANOC_TAG_2

また、output ディレクトリには tags ディレクトリが作成され、さらにタグ別ディレクリも作成されているはずである。

12. 参考サイト


これで、タグ管理ができるようになりました。
当方、実はこのタグ管理を流用してカテゴリ管理もするようにしました。(一部 nanoc の gem からメソッドも流用して)

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

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

以上。

Comments