Разработка расширений для 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. Я добавил в него поддержку различных библиотек для подсветки кода (в частности, тех, о которых писал в прошлый раз).
