Плагины
Плагины позволяют добавить дополнительное поведение в сам процесс генерации сайта. Процесс написания плагинов здесь не описывается.
Существует три способа добавить плагин:
- Добавить его в директорию
_plugins
как файл на Ruby - Добавить его в
_config.yml
по ключуplugins
- Добавить его в
Gemfile
в группуjekyll_plugins
и установить черезbundler install
group :jekyll_plugins do
gem "jekyll-gist"
gem "jekyll-coffeescript"
gem "jekyll-assets"
gem "another-jekyll-plugin"
end
Все эти способы можно использовать одновременно. Существует пять типов плагинов:
- Генераторы
- Конверторы
- Команды
- Теги
- Приемы
Генераторы
Используются когда необходимо создать дополнительный контент по некоторым правилам. Все генераторы являются наследниками класса Jekyll::Generator
, который имеет метод generate(Jekyll::Site site)
. Метод ничего не возвращает. Пример генератора:
module Jekyll
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
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
end
Конверторы
Используются для новых языков разметки. Пример конвертера
module Jekyll
class UpcaseConverter < Converter
safe true
priority :low
def matches(ext)
ext =~ /^\.upcase$/i
end
def output_ext(ext)
".html"
end
def convert(content)
content.upcase
end
end
end
Команды
Используется при запуске Jekyll из командной строки. Пример:
class MyNewCommand < Jekyll::Command
class << self
def init_with_program(prog)
prog.command(:new) do |c|
c.syntax "new [options]"
c.description 'Create a new Jekyll site.'
c.option 'dest', '-d DEST', 'Where the site should go.'
c.action do |args, options|
Jekyll::Site.new_site_at(options['dest'])
end
end
end
end
end
Теги
Используется для создания пользовательских liquid-тегов, или пометки плагинов.
Как теги:
module Jekyll
class RenderTimeTag < Liquid::Tag
def initialize(tag_name, text, tokens)
super
@text = text
end
def render(context)
"#{@text} #{Time.now}"
end
end
end
Liquid::Template.register_tag('render_time', Jekyll::RenderTimeTag)
<p>{% render_time page rendered at: %}</p>
# => Станет
<p>page rendered at: Tue June 22 23:38:47 –0500 2010</p>
Как фильтр:
module Jekyll
module AssetFilter
def asset_url(input)
"http://www.example.com/#{input}?#{Time.now.to_i}"
end
end
end
Liquid::Template.register_filter(Jekyll::AssetFilter)
Как флаги:
module Jekyll
class UpcaseConverter < Converter
safe true # --safe использует плагин
priority :low # будет загружен в конце :lowest, :low, :normal, :high, и :highest
end
end
Приемы
Используются при возникновении событий
Jekyll::Hooks.register :posts, :post_render do |post|
# code to call after Jekyll renders a post
end
Список событий
:site, :after_init
:site, :after_reset
:site, :post_read
:site, :pre_render
:site, :post_render
:site, :post_write
:pages, :post_init
:pages, :pre_render
:pages, :post_render
:pages, :post_write
:posts, :post_init
:posts, :pre_render
:posts, :post_render
:posts, :post_write
:documents, :post_init
:documents, :pre_render
:documents, :post_render
:documents, :post_write
*_init
- вызывается в самом начале, *_pre_render
- перед тем как отобразить, *_post_render
- сразу после отображение, *_post_write
- в самом конце.