graphviz_macro.png
redmineのwikiでgraphvizが使いたい、と思ったのだった。

どんだけgraphviz好きなんだって感じだけど、まぁ好きだ。

実際は、別途webdot的なサービスを作って画像挿入のtextile記法、ってやり方で利用してはいたんだけどredmineプラグイン作成の習作も兼ねてやってみた。

wikiにdotを記述して、別のwikiページからgraphvizマクロで呼び出すとIMGに置き換わる、という流れ。

Wiki Graphviz macro プラグイン
例によって無保証です。
説明はその2の方に。

環境は以下のとおり
CentOS 5.2
  MySQL-server-5.0.51a-tritonn.1.0.10
  ruby-1.8.5-5.el5_2.6
    mongrel-1.1.5
    redmine-0.8.0_RC1


WikiControllerから地味に追いかけていったら元々マクロを拡張するI/Fを持っていて、lib/redmine/wiki_formatting/macros.rbに説明があった。
        #   Redmine::WikiFormatting::Macros.register do
        #     desc "This is my macro"
        #     macro :my_macro do |obj, args|
        #       "My macro output"
        #     end
        #   end
ということらしい。

次はどこでマクロ登録を行うか。
redmineのプラグイン機構に乗っかってプラグインの初期化時にやったらよさそう、ということでscript/generateを使ってひな形を作成。

% script/generate redmine_plugin wiki_graphviz_plugin
      create  vendor/plugins/redmine_wiki_graphviz_plugin/app/controllers
      create  vendor/plugins/redmine_wiki_graphviz_plugin/app/helpers
      create  vendor/plugins/redmine_wiki_graphviz_plugin/app/models
      create  vendor/plugins/redmine_wiki_graphviz_plugin/app/views
      create  vendor/plugins/redmine_wiki_graphviz_plugin/db/migrate
      create  vendor/plugins/redmine_wiki_graphviz_plugin/lib/tasks
      create  vendor/plugins/redmine_wiki_graphviz_plugin/assets/images
      create  vendor/plugins/redmine_wiki_graphviz_plugin/assets/javascripts
      create  vendor/plugins/redmine_wiki_graphviz_plugin/assets/stylesheets
      create  vendor/plugins/redmine_wiki_graphviz_plugin/lang
      create  vendor/plugins/redmine_wiki_graphviz_plugin/test
      create  vendor/plugins/redmine_wiki_graphviz_plugin/README.rdoc
      create  vendor/plugins/redmine_wiki_graphviz_plugin/init.rb
      create  vendor/plugins/redmine_wiki_graphviz_plugin/lang/en.yml
      create  vendor/plugins/redmine_wiki_graphviz_plugin/test/test_helper.rb
extraのsample_pluginを真似して上記プラグイン名にしたのだけど、これが元で後で痛い目に。「redmine_」が前置された結果、プラグインの名前が30文字を超えてしまいプラグイン設定の更新・参照に問題が発生。
※settingsテーブルのname属性がvarchar(30)なことが原因っぽい

なので、手作業で「wiki_graphviz_plugin」に変更した。
※今にしてみれば_pluginを削ったらよかったのか。。。。

拡張マクロの登録は、プラグインのinit.rbでプラグイン登録と同時にやってみた。これが正しいかはわからない。
require 'redmine'

RAILS_DEFAULT_LOGGER.info 'Starting wiki_graphviz_plugin for Redmine'

Redmine::Plugin.register :wiki_graphviz_plugin do
name 'Graphviz Wiki-macro Plugin'
author 'tckz'
description 'Wiki macro to render the graph using graphviz'
version '0.0.1'
settings :default => {'cache_seconds' => '0'}, :partial => 'wiki_graphviz/settings'

Redmine::WikiFormatting::Macros.register do

desc "Render the wiki page into graph image using graphviz.\n\n" +
" !{{graphviz(Foo)}}\n" +
" {{graphviz(format={png|jpg},Foo)}}\n" +
" {{graphviz(layout={dot|neato|fdp|twopi|circo},Foo)}}\n"
macro :graphviz do |obj, args|

end
end
end

こんな感じで登録しておくと、wikiページ(view)のレンダリング中に呼び出される。マクロ展開後のHTMLを返せばOK。

dotの構文に誤りがあったときはwikiマクロのエラーとして表示する形にしたいからIMG要素出力時点で一度画像をレンダリングする方向で。dot解釈時点で一旦レンダリングしたものをrailsのキャッシュに置いておいて実際の出力時はキャッシュから返す(ない場合は改めて生成)という感じ。

その2につづく