Spec-Zone.ru › Jekyll 4

Генераторы

Вы можете создать генератор, когда вам нужно, чтобы 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

Генераторы должны реализовывать только один метод:

Метод Описание

generate

Генерирует содержимое как побочный эффект.

Если ваш генератор находится в одном файле, он может называться как угодно, но должен иметь расширение .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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API