どんだけ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を使ってひな形を作成。
extraのsample_pluginを真似して上記プラグイン名にしたのだけど、これが元で後で痛い目に。「redmine_」が前置された結果、プラグインの名前が30文字を超えてしまいプラグイン設定の更新・参照に問題が発生。
% 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
※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につづく
>> Home