jekyll 블로그에 카테고리 기능 달기
jekyll blog ruby plugin지킬 사이트 문서에서 카테고리 플러그인 예제를 제공하긴 하는데, 이 예제는 카테고리 depth 가 하나만 가능한 것 같다. 내가 원하는 건 대분류-소분류 정도의 2 depth 로 된 카테고리가 있고 이 기준으로 포스팅을 올리고 싶었다. 그래서 카테고리 플러그인을 만들었다.
module Jekyll
class CategoryPage < Page
def initialize( site, base, dir, name)
puts( "CategoryPage :: initialize()")
@site = site
@base = base
@dir = dir
@name = 'index.html'
self.process(@name)
self.read_yaml(File.join(base, '_layouts'), 'category.html')
# set generated category page's title
category_title_prefix = site.config['category_title_prefix']
self.data['title'] = "#{category_title_prefix}#{name}"
# set page variables used in _layouts/category.html
# 'categories' of front-matter must be a 'Maincategory/Subcategory' or 'Maincategory'
@cregex = /(\w+)\/(.+)/
@list = Hash.new()
site.categories.each_key do |c|
@m = @cregex.match( c) # m[1]=MainCategory, m[2]=SubCategory
if @m
if @list.has_key?( @m[1])
#if !(@list[ @m[1]].include? @m[2])
if !(@list[ @m[1]].has_key?( @m[2]))
@list[ @m[1]][ @m[2]] = []
end
else
@list[ @m[1]] = {}
@list[ @m[1]][ @m[2]] = []
end
else # c = MainCategory
if !(@list.has_key?( c))
@list[ c] = []
end
end
end
site.posts.each{ |p|
p.categories.each{ |c|
@m = @cregex.match(c)
if @m
@postinfo = {}
@postinfo[ "url"] = p.url()
@postinfo[ "title"] = p.title()
@list[ @m[1]][ @m[2]].push( @postinfo)
#puts( @postinfo)
else
#@list[ c].push( p.url())
end
}
}
puts( @list)
self.data[ 'category_list'] = @list
end
end
class CategoryPageGenerator < Generator
safe true
def generate(site)
puts( "CategoryPageGenerator::generate()!")
if site.layouts.key? 'category'
dir = site.config['category_dir'] || 'category'
site.pages << CategoryPage.new( site, site.source, File.join(dir, 'category'), 'category')
end
end
end
end
위와 같은 플러그인을 통해, 이제 지킬 전역변수 page
에서 category_list
변수로 카테고리 구조화 시킨 포스팅 목록을 가져올 수 있다. _layouts/category.html
에서 category_list
를 다루는 코드를 만들었다.
이렇게 대충 뼈대를 갖추었다. 블로그 상단의 category 을 누른 게 결과물. 하고 싶을 때마다 조금씩 더 개선해 보자.