지킬 사이트 문서에서 카테고리 플러그인 예제를 제공하긴 하는데, 이 예제는 카테고리 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 을 누른 게 결과물. 하고 싶을 때마다 조금씩 더 개선해 보자.