Разработка расширений для Radiant

Продолжая тему перевода блога на Radiant CMS и подсветки кода, сегодня я расскажу о создании расширений для него на примере простейшего, которое добавляет специальный тэг для подсветки кода.

Подсветка будет осуществляться с помощью CodeRay, о котором я уже писал в прошлой заметке.

Итак, создание простейшего расширения для Radiant CMS:

Создание скелета расширения

Для того, чтобы создать скелет расширения необходимо вызвать скрипт script/generate extension в директории приложения. Например, для создания расширения с именем code:

script/generate extension code
В результате, в директории vendor/extensions/code будут созданы файлы расширения, основным из которых является code_extension.rb. Его содержимое:

# Uncomment this if you reference any of your controllers in activate
# require_dependency 'application'

class CodeExtension < Radiant::Extension
  version "1.0"
  description "Describe your extension here"
  url "http://yourwebsite.com/code"
  
  # define_routes do |map|
  #   map.namespace :admin, :member => { :remove => :get } do |admin|
  #     admin.resources :code
  #   end
  # end
  
  def activate
    # admin.tabs.add "Code", "/admin/code", :after => "Layouts", :visibility => [:all]
  end
  
  def deactivate
    # admin.tabs.remove "Code"
  end
  
end
По сути, сейчас мы уже имеем расширение, которое, правда, ничего не делает. Это необходимо исправить.

Простейшее расширение

В расширение мы добавим один тэг <r:code>, который позволяет подсветить код с использованием библиотеки CodeRay. Для этого необходимо создать новый модуль, содержащий тэг. Например, code_tags.rb в директории lib расширения. Чтобы в модуле можно было объявлять тэги, в него необходимо включить Radiant::Taggable:


module CodeTags
  include Radiant::Taggable
end
Теперь в модуль необходимо добавить тэг. Делается это следующим образом:

module CodeTags
  include Radiant::Taggable

  desc %{
    Some tag description here...
  }
  tag 'code' do |tag|
    tag.expand
  end

end
Метод desc используется для задания описания для тэга (оно будет отображаться в списке тэгов при редактировании страницы). Метод tag объявляет тэг.

Теперь, чтобы подкчлють модуль с тэгами в файле code_extension.rb в метод activate необходимо добавить подключение нашего модуля к классу Page:

Page.send :include, CodeTags

Таким образом, мы создали тэг r:code, который ничего не делает. Точнее, он просто выводит свое содержимое: tag.extend возвращает содержимое тэга. Теперь вспомним, как использовался CodeRay для подсветки кода:

CodeRay.scan( text, lang ).div( :line_numbers => :table, :css => :style, :style => :cycnus )
В тэге code вместо tag.expand вставим аналогичный код. Исходный код будет выглядеть следующим образом:

  tag 'code' do |tag|
    CodeRay.scan( tag.expand, 'ruby' ).div( :line_numbers => :table, :css => :style, :style => :cycnus )
  end
А в начало файла code_tags.rb необходимо добавить строку для загрузки CodeRay:
require 'coderay'
Теперь, в страницах можно использовать конструкции вида <r:code>...</r:code>. Однако, хотелось бы иметь возможность указывать конкретный язык в аттрибутах тэга. Для доступа к аттрибутам из кода обработчика используется хэш tag.attr:

  tag 'code' do |tag|
    CodeRay.scan( tag.expand, tag.attr['lang'] || 'ruby' ).div( :line_numbers => :table, :css => :style, :style => :cycnus )
  end
Все!

Простейшее расширение для подсветки кода в Radiant готово и его можно использовать в своем блоге. Более продвинутый вариант такого расширения можно найти у меня на GitHub. Я добавил в него поддержку различных библиотек для подсветки кода (в частности, тех, о которых писал в прошлый раз).

Ссылки

 Подписаться на RSS

 #  #  #  #  #  #  #  #  #  #

Добавить комментарий