RadiantCMSのextensionsでカスタムタグを実装

Adding Custom Radius Tags · radiant/radiant Wiki · GitHubを参考にして、extensionsでカスタムタグを実装してみます。


まずはRadiantアプリを作成します。

$ radiant -d sqlite3 mycms
$ cd mycms/
$ rake db:bootstrap


custom_tagsという名前でextensionsを作成します。

$ ./script/generate extension custom_tags


テストファーストで先にカスタムタグのSpecを実装します。
RAILS_ROOT/vendor/extensions/custom_tags/spec/lib/custom_tags_spec.rb

require File.dirname(__FILE__) + '/../spec_helper'

describe 'CustomTags' do
  dataset :pages

  describe '<r:hello>' do
    it 'should render the correct HTML' do
      # Hello <名前>を出力するタグを作成します。
      # <名前>は属性で渡せるようにします。
      tag = '<r:hello name="t-taira" />'

      expected = "Hello t-taira"

      pages(:home).should render(tag).as(expected)
    end
  end
end


カスタムタグを実装します。
RAILS_ROOT/vendor/extensions/custom_tags/lib/custom_tags.rb

module CustomTags
  include Radiant::Taggable

  desc "Puts hello."
  tag "hello" do |tag|
    %{Hello #{tag.attr['name']}}
  end
end


実装したカスタムタグを有効にします。
RAILS_ROOT/custom_tags_extension.rb

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

class CustomTagsExtension < Radiant::Extension
  version "1.0"
  description "Describe your extension here"
  url "http://yourwebsite.com/custom_tags"
  
  #  define_routes do |map|
  #    map.namespace :admin, :member => { :remove => :get } do |admin|
  #      admin.resources :custom_tags
  #    end
  #  end
  
  def activate
    # この1行を追加するだけ
    Page.send :include, CustomTags
    #admin.tabs.add "Custom Tags", "/admin/custom_tags", :after => "Layouts", :visibility => [:all]
  end
  
  def deactivate
    #admin.tabs.remove "Custom Tags"
  end
end


Specがパスすることを確認できたら、実際にadminサイトでカスタムタグを書いてみます。
homeという名前でページを新規作成して、その中に実装したr:helloタグを書きます。
f:id:t-taira:20100601012121p:image:w250:h280

http:/localhost:3000/homeにアクセスすると、表示できました!
f:id:t-taira:20100601012122p:image:w250:h280

リファレンスもちゃんと表示されています。
f:id:t-taira:20100601012119p:image:w670:h380