생성기
생성기를 만들어 Jekyll 로 하여금 당신이 정한 규칙에 따라 부가적인 컨텐츠를 생성하도록 할 수 있습니다.
생성기는 Jekyll::Generator
의 하위 클래스로서,
Jekyll::Site
인스턴스를 전달받는 generate
메소드 가지고 있습니다. generate
메소드의
리턴값은 무시됩니다.
생성기는 Jekyll 이 컨텐츠 목록을 파악하고 난 후, 그리고 사이트가 생성되기 직전에
실행됩니다.
머리말을 가진 페이지들은
Jekyll::Page
인스턴스로 저장되어 site.pages
로 사용할 수 있습니다. 정적 파일들은
Jekyll::StaticFile
인스턴스가 되어 site.static_files
로 사용할 수 있습니다.
자세한 내용은 변수 페이지와
Jekyll::Site
를
살펴보세요.
예를 들어, 생성기는 빌드 시점에 계산된 값을 템플릿 변수에 주입할 수 있습니다.
다음 예제에서, 템플릿 reading.html
의 두 변수 ongoing
과 done
의 값을
생성기에서 채우게 됩니다:
module Reading
class Generator < Jekyll::Generator
def generate(site)
ongoing, done = Book.all.partition(&:ongoing?)
reading = site.pages.detect {|page| page.name == 'reading.html'}
reading.data['ongoing'] = ongoing
reading.data['done'] = done
end
end
end
다음 예제는 좀 더 복잡한 생성기로서, 새 페이지를 생성합니다. 이 예제에서, 생성기는 categories
안에 각 카테고리 별로 파일을 생성하고, category_index.html
레이아웃을 사용하여 각 카테고리 별 포스트 목록을 만듭니다.
module Jekyll
class CategoryPageGenerator < Generator
safe true
def generate(site)
if site.layouts.key? 'category_index'
dir = site.config['category_dir'] || 'categories'
site.categories.each_key do |category|
site.pages << CategoryPage.new(site, site.source, File.join(dir, category), category)
end
end
end
end
# A Page subclass used in the `CategoryPageGenerator`
class CategoryPage < Page
def initialize(site, base, dir, category)
@site = site
@base = base
@dir = dir
@name = 'index.html'
self.process(@name)
self.read_yaml(File.join(base, '_layouts'), 'category_index.html')
self.data['category'] = category
category_title_prefix = site.config['category_title_prefix'] || 'Category: '
self.data['title'] = "#{category_title_prefix}#{category}"
end
end
end
생성기가 필수로 구현해야 할 메소드는 딱 하나입니다:
메소드 | 설명 |
---|---|
|
컨텐츠를 생성한다. |
당신이 만든 생성기가 파일 하나로 구성되어 있다면, 이름은 원하는대로 지을 수 있지만 확장자는 반드시 .rb
이어야 합니다. 만약 파일 여러개로 구성된 생성기라면, 루비젬 패키지로 만들어 https://rubygems.org/ 에 게시되어 있어야 합니다. 이 경우, 하나 이상의 젬이 같은 이름을 가질 수 없기 때문에 이에 맞춰 젬 이름을 결정해야 합니다.
디폴트로, Jekyll 은 _plugins
디렉토리에서 생성기를 찾습니다. 하지만, 환경설정 파일의 plugins_dir
키에 원하는 디렉토리를 할당하여 디폴트 값을 변경할 수 있습니다.