wiki のツールボタンを追加する

前節 でマクロの作り方を説明しました。マクロで wiki を拡張できるのはいいのですが、ちょっとマクロは書きづらいです。そこで wiki 編集のツールボタン(テキストボックスの上についているの)があると簡単に使えるようになります。これがあれば、ユーザも使ってくれるようになるでしょう。このボタンの追加方法を紹介します。

ただし、この Tips は Rails の「設定より規約」というやつで、上手くいくときは結構簡単にできるのですが、ちょっと間違っているとどこが悪いのかわからなくて結構ハマるので、名前の付け方には注意をしてください。

サンプルコード

アイコンと CSS ファイルの作成

サンプルは前の wikipedia のマクロのプラグインをツールボタンを追加するように改造したものです。
このプラグインではツールボタン用のアイコンを必要とするので、その画像ファイルと css ファイルを用意します。この辺りの詳しくは プラグイン独自のアイコンを使用する の Tips を見てみてください。

css の定義は public/stylesheets/jstoolbar.css を参考にして定義します。

1.jstb_wikipedia_link {
2  background-image: url('../images/wikipedialink.png');
3}

クラス名はツールボタンはみんな jstb_ で始まっているので、それにあわせます。おそらく JavaScriptToolButton を意味しているのでしょう。
名前は wikipedia_link にしています。

AssetTagHelper のパッチ

ツールバーを追加するには AssetTagHelper のパッチを使います。
このパッチは以下のファイルを作って init.rb で require します。
lib/wikipedia_link_asset_tag_helper_patch.rb
ファイルを require しているだけなので、 init.rb に直接記述してもよさそうな気がするのですが、直接 init.rb に書くとなぜか Redmine が立ち上がらなくなってしまいます。

パッチの中身を見てみましょう。

 1module ActionView
 2  module Helpers
 3    module AssetTagHelper
 4      def javascript_include_tag_with_wikipedia_link(*sources)
 5        out = javascript_include_tag_without_wikipedia_link(*sources)
 6        if sources.is_a?(Array) and sources[0] == 'jstoolbar/textile'
 7          out += javascript_tag <<-javascript_tag
 8jsToolBar.prototype.elements.wikipedia_link = {
 9    type: 'button',
10    title: 'Link to Wikipedia',
11    fn: {
12        wiki: function() { this.encloseSelection("{{wikipedia(", ")}}") }
13    }
14}
15javascript_tag
16          out += stylesheet_link_tag 'wikipedialink', :plugin => 'redmine_wikipedia_link'
17        end
18        out
19      end
20      alias_method_chain :javascript_include_tag, :wikipedia_link
21    end
22  end
23end

このファイルでは ActionView::Helpers::AssetTagHelper のモジュールに javascript_include_tag_with_wikipedia_link メソッドを追加しています。

基本的にツールバーを追加のプラグインを作りたい場合、このファイルの wikipedia_link の部分を適当な名前に変えれば OK です。
それ以外の修正点を次に上げておきます。

10 行目の title はマウスを持ってきたときのツールチップとして使われます。実際のプラグインを作る場合は国際化して説明を書いた方がいいでしょう。

12 行目は JavaScript の部分となります。 encloseSelection() メソッドは 画像wiki へのリンク などの 2 つの文字列で挟むタイプのツールバーのときに使用するもので、前後の文字列を引数として渡します。

16 行目は css ファイルの指定です。ここも詳しくはオリジナルアイコンの使用の Tips を見てください。

これでツールバーボタンの追加は完成です。
ちなみに javascript_include_tag_without_wikipedia_link のメソッドはプラグイン中のどこにも定義していませんが、 ruby のメタプログラミングを上手く使って処理してくれているみたいで、定義する必要はありません。

jstoolbutton.png (2 kB) Mitsuyoshi Yoshida, 05/26/2011 01:45 am

Jstoolbutton