Создание плагинов для Octopress

плагин

Octopress идет с несколькими предустановленными плагинами. Которые охватывают практически все аспекты блоггерства, от категории до видео. Плагины можно легко создавать, расширяя базовый функционал Octopress. Создадим плагин который добавит новый тег для шаблонизатора Liquid.

В качестве примера, создадим новый тег, который позволит вставлять картинки размещенные на S3 Amazon.

Создадим файл s3_image_tag.rb.

  • Определим новый класс наследуемый от Liquid::Tag
1
2
3
4
5
module Jekyll
  class S3ImageTag < Liquid::Tag
    # здесь будет наш код
  end
end

Все теги шаблонизатора Liquid наследуютьса от класса Liquid::Tag. Liquid ожидает что класс имеет метод render который и реализует отрисовку тега.

  • Инициализация параметров
1
2
3
4
5
6
7
def initialize(tag_name, text, token)
  super
  @text = text.strip
  @text =~ /(\w+\.\w+)(\sbucket:)?(\w*)/i
  @file_name = $1
  @bucket_name = $3.empty? ? Jekyll.configuration({})['aws_bucket'] : $3
end

Обратите внимание, что Liquid вызовет наш метод инициализации с тремя параметрами: имя тега, текст в самом теге, и маркер.

Во первых, мы вызвали метод super, для инициализации родительского класса. Далее, мы очистили текст от начальных и конечных пробелов. С помощью регулярного выражения нашли необходимые значения для наших переменных. Для переменной @bucket_name, если она не найдена, берем значения из конфигфайла _config.yml.

  • Определим метод render
1
2
3
4
5
6
7
def render(context)
  if @file_name && @bucket_name
    "<img src='https://s3.amazonaws.com/#{@bucket_name}/#{@file_name}'>"
  else
    "Error processing input."
  end
end

Отдаем HTML тег для нужного изображения. Если один из параметров отсутствует, возвращаемся сообщением об ошибке.

  • Регистрируем новый тег
1
Liquid::Template.register_tag('s3_image', Jekyll::S3ImageTag)

Liquid::Template привязывает тег s3_image к нашему классу Jekyll::S3ImageTag, который и будет его обрабатывать.

  • Добавляем наш файл s3_image_tag.rb в папку plugins нашего блога. Octopress автоматически загружает все плагины из этой папки.

  • Зададим значение по умолчанию для переменой aws_bucket в конфиге _config.yml

1
2
3
4
5
6
# ----------------------- #
#   3rd Party Settings    #
# ----------------------- #

# Amazon S3 Images
aws_bucket: thoughts_on_rails
  • Пример использование нового тега в наших постах
1
Here is an image:   {% s3_image foo.jpeg bucket:bar %}

P.S. Оригинальный источник http://www.thoughtsonrails.com/creating-plugins-for-octopress/