Spec-Zone.ru › Jekyll 4

Генераторы

Вы можете создать генератор, если хотите, чтобы Jekyll создавал дополнительное содержимое по вашим собственным правилам.

Генератор — это подкласс Jekyll::Generator, в котором определён метод generate, получающий экземпляр Jekyll::Site. Возвращаемое значение generate игнорируется.

Генераторы запускаются после того, как Jekyll составит опись существующего содержимого, и до генерации сайта. Страницы с front matter сохраняются как экземпляры Jekyll::Page и доступны через site.pages. Статические файлы становятся экземплярами Jekyll::StaticFile и доступны через site.static_files. Подробности см. на странице документации по переменным и в Jekyll::Site.

В следующем примере генератор добавляет значения, вычисляемые во время сборки, для переменных шаблона. Шаблон с именем reading.html содержит две неопределённые переменные ongoing и done, которым будет задано значение при запуске генератора:

module Reading
  class Generator < Jekyll::Generator
    def generate(site)
      book_data = site.data['books']
      ongoing = book_data.select { |book| book['status'] == 'ongoing' }
      done = book_data.select { |book| book['status'] == 'finished' }

      # get template
      reading = site.pages.find { |page| page.name == 'reading.html'}

      # inject data into template
      reading.data['ongoing'] = ongoing
      reading.data['done'] = done
    end
  end
end

В следующем примере показан более сложный генератор, создающий новые страницы.

В этом примере задача генератора — создать страницу для каждой категории, зарегистрированной в site. Страницы создаются во время выполнения, поэтому их содержимое, front matter и другие атрибуты должен задавать сам плагин.

  • Предполагается, что на этих страницах будет отображаться список всех документов в заданной категории. Поэтому для сгенерированного файла лучше использовать базовое имя index.html.
  • Возможность настраивать страницы с помощью значений front matter по умолчанию была бы очень полезна! Поэтому этим страницам стоит назначить определённый type.
module SamplePlugin
  class CategoryPageGenerator < Jekyll::Generator
    safe true

    def generate(site)
      site.categories.each do |category, posts|
        site.pages << CategoryPage.new(site, category, posts)
      end
    end
  end

  # Subclass of `Jekyll::Page` with custom method definitions.
  class CategoryPage < Jekyll::Page
    def initialize(site, category, posts)
      @site = site             # the current site instance.
      @base = site.source      # path to the source directory.
      @dir  = category         # the directory the page will reside in.

      # All pages have the same filename, so define attributes straight away.
      @basename = 'index'      # filename without the extension.
      @ext      = '.html'      # the extension.
      @name     = 'index.html' # basically @basename + @ext.

      # Initialize data hash with a key pointing to all posts under current category.
      # This allows accessing the list in a template via `page.linked_docs`.
      @data = {
        'linked_docs' => posts
      }

      # Look up front matter defaults scoped to type `categories`, if given key
      # doesn't exist in the `data` hash.
      data.default_proc = proc do |_, key|
        site.frontmatter_defaults.find(relative_path, :categories, key)
      end
    end

    # Placeholders that are used in constructing page URL.
    def url_placeholders
      {
        :path       => @dir,
        :category   => @dir,
        :basename   => basename,
        :output_ext => output_ext,
      }
    end
  end
end

Теперь для сгенерированных страниц можно задать определённый макет или путь вывода в целевом каталоге — всё это с помощью файла конфигурации и значений front matter по умолчанию. Например:

# _config.yml

defaults:
  - scope:
      type: categories  # select all category pages
    values:
      layout: category_page
      permalink: categories/:category/

Технические аспекты

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

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

generate

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

Если генератор содержится в одном файле, его можно назвать как угодно, но у него должно быть расширение .rb. Если генератор состоит из нескольких файлов, его следует упаковать в Rubygem и опубликовать на https://rubygems.org/. В этом случае имя гем-пакета зависит от того, доступно ли оно на этом сайте, поскольку два гема не могут иметь одинаковое имя.

По умолчанию Jekyll ищет генераторы в каталоге _plugins. Однако вы можете изменить каталог по умолчанию, присвоив желаемое имя ключу plugins_dir в файле конфигурации.

© 2025 Jekyll Core Team and contributors
Licensed under the MIT license.
https://jekyllrb.com/docs/plugins/generators/

Spec-Zone.ru

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