nanoc - 記事でタグを使用!
Updated:
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行を追加する。
File: lib/default.rb
1
include Nanoc3::Helpers::Tagging
2. 個別ページ編集
各記事にタグを表示するようにする。
以下は当方の例の抜粋で、記事作成日時の後ろに表示させるようにしている。
File: layouts/article.html
1
2
3
4
5
<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
に以下を追加した。
File: 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
に以下を追加した。
File: 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
とした。
File: layouts/_tag_list.html
1
2
3
4
5
6
7
8
9
10
11
<% 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. テンプレート埋め込み
タグ一覧を表示させたい場所にテンプレートを埋め込む。
以下は当方の例で、サイドバー用に作成しているテンプレートファイル内に埋め込んでいる。
File: layouts/_sidebar.html
1
2
<h2>Tags</h2>
<%= render('_tag_list') %>
7. タグ別一覧テンプレート作成
タグ別一覧ページのテンプレートを作成する。
以下は当方の例で、ファイル名は layouts/_tag_page.html
とした。
File: 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
メソッドが無ければ作成する)
File: Rules
1
2
3
preprocess do
create_tag_pages
end
9. タグ設定
各記事にタグを設定するには、メタデータ部分でタグを以下のように設定する。
File: 2013-01-17-test-tag.md
1
2
3
4
5
6
7
---
title: TEST [ Tag ]
created_at: 2013/01/17 00:20:00
kind: article
tags: [nanoc, ruby]
---
もしくは以下のように設定する。
File: 2013-01-17-test-tag.md
1
2
3
4
5
6
7
8
9
---
title: TEST [ Tag ]
created_at: 2013/01/17 00:20:00
kind: article
tags:
- nanoc
- ruby
---
10. コンパイル
いつものようにコンパイルする。
File: Rules
1
$ nanoc compile
11. 確認
nanoc view
実行後、ブラウザで確認してみる。
(以下は現時点での(調整中段階の)一例)
また、output
ディレクトリには tags
ディレクトリが作成され、さらにタグ別ディレクリも作成されているはずである。
12. 参考サイト
- Module: Nanoc::Helpers::Tagging — Documentation by YARD 0.8.3
- Design Recipe 別館 Blog - Nanoc のカスタマイズ - タグを管理する
これで、タグ管理ができるようになりました。
当方、実はこのタグ管理を流用してカテゴリ管理もするようにしました。(一部 nanoc の gem からメソッドも流用して)
ちなみに、nanoc によるブログを Octopress によるメインのブログのクローンとして公開しています。
但し、mk-mode BLOG (by Octopress)の記事を機械的に変換しているため、人知の及ばない部分もあるかと思います。ご了承下さい。
以上。
Comments