생성기

생성기를 만들어 Jekyll 로 하여금 당신이 정한 규칙에 따라 부가적인 컨텐츠를 생성하도록 할 수 있습니다.

생성기는 Jekyll::Generator 의 하위 클래스로서, Jekyll::Site 인스턴스를 전달받는 generate 메소드 가지고 있습니다. generate 메소드의 리턴값은 무시됩니다.

생성기는 Jekyll 이 컨텐츠 목록을 파악하고 난 후, 그리고 사이트가 생성되기 직전에 실행됩니다. 머리말을 가진 페이지들은 Jekyll::Page 인스턴스로 저장되어 site.pages 로 사용할 수 있습니다. 정적 파일들은 Jekyll::StaticFile 인스턴스가 되어 site.static_files 로 사용할 수 있습니다. 자세한 내용은 변수 페이지Jekyll::Site 를 살펴보세요.

예를 들어, 생성기는 빌드 시점에 계산된 값을 템플릿 변수에 주입할 수 있습니다. 다음 예제에서, 템플릿 reading.html 의 두 변수 ongoingdone 의 값을 생성기에서 채우게 됩니다:

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

생성기가 필수로 구현해야 할 메소드는 딱 하나입니다:

메소드 설명

generate

컨텐츠를 생성한다.

당신이 만든 생성기가 파일 하나로 구성되어 있다면, 이름은 원하는대로 지을 수 있지만 확장자는 반드시 .rb 이어야 합니다. 만약 파일 여러개로 구성된 생성기라면, 루비젬 패키지로 만들어 https://rubygems.org/ 에 게시되어 있어야 합니다. 이 경우, 하나 이상의 젬이 같은 이름을 가질 수 없기 때문에 이에 맞춰 젬 이름을 결정해야 합니다.

디폴트로, Jekyll 은 _plugins 디렉토리에서 생성기를 찾습니다. 하지만, 환경설정 파일의 plugins_dir 키에 원하는 디렉토리를 할당하여 디폴트 값을 변경할 수 있습니다.