Генераторы
Вы можете создать генератор, когда вам нужно, чтобы Jekyll создавал дополнительное содержимое на основе собственных правил.
Генератор — это подкласс Jekyll::Generator, который определяет метод generate, который получает экземпляр Jekyll::Site. Значение, возвращаемое 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. Если ваш генератор разделен на несколько файлов, его следует упаковать как Rubygem для публикации на https://rubygems.org/. В этом случае имя драгоценности зависит от доступности имени на этом сайте, так как две драгоценности не могут иметь одинаковое имя.
По умолчанию Jekyll ищет генераторы в каталоге _plugins. Однако вы можете изменить каталог по умолчанию, присвоив желаемое имя ключу plugins_dir в файле конфигурации.
© 2020 Jekyll Core Team and contributors
Licensed under the MIT license.
https://jekyllrb.com/docs/plugins/generators/