graphviz.inc.php†
サマリ | グラフ構造を表示するプラグイン |
リビジョン | 1.8 |
対応バージョン | 1.4.7 |
投稿者 | matsuda |
投稿日 | |
ダウンロード†
graphvizを使って、グラフ構造のイメージを表示します。
#graphviz(digraph {a -> b -> c;})
使用方法†
グラフの描画†
#graphviz([prog,] [size,] [transparency,] [align,] dotスクリプト)
&graphviz(同様);
- prog
どのプログラムで画像を生成するかを指定します。dot, neato, twopi, circo, fdpのいずれかを指定できます。省略時にはdotが使われます。
- size
グラフのサイズを指定します。tiny, small, normal, largeのいずれかを指定できます。省略時にはsmallが使われます。
- transparency
背景色を透明にするかの指定です。transp, notranspのいずれかを指定できます。transpを指定すると背景色が透明になります。notranspを指定すると背景色は不透明になります。省略時にはtranspが指定されます。
- align
画像の表示位置を指定します。left, center, rightのいずれかを指定できます。
(省略時には位置は指定されません)
- dotスクリプト
グラフの定義を記述します。「,」もそのまま記述できます。
マクロの定義†
#graphviz(define,ラベル名,dotスクリプト)
- 解説
描画されるスクリプトにマクロのラベル名が含まれると、定義されたdotスクリプトに置き換えられます。
dotスクリプトには「,」もそのまま記述できます。
dotスクリプトは別のマクロのラベル名を含むことができます。最大で10レベルまで展開されます。
マクロ機能はインライン形式では利用できません。
マクロの表示†
#graphviz(showmacro)
- 解説
定義されているマクロの内容を表示します。
マクロの一括定義†
#graphviz(include,ページへの参照[, ...])
- 解説
別のページに書いてあるマクロをまとめて取り込みます。マクロは整形済みテキストで行単位に記述します。
label = dotscript
ページは複数指定可能です。
マクロとは†
よく使う設定や共通のサブグラフなどをマクロとして定義することができます。
#graphviz(define, @UML:IsParentOf@, node [ shape = box ]; edge [ arrowhead = none, arrowtail = onormal ]; )
dotスクリプトにマクロのラベルを含めれると、定義された文字列に置き換えられます。
#graphviz(digraph { @UML:IsParentOf@ A -> B })
よく使う定義をまとめて記述しておくことができます。
たとえば:plugin/graphviz/UMLというページに以下のように整形済みテキストの形でマクロ定義を記述します。
@UML:IsParentOf@ = node [ shape = box ]; edge [ arrowhead = none, arrowtail = onormal ];
@UML:IsChildOf@ = node [ shape = box ]; edge [ arrowhead = onormal, arrowtail = none ];
次のようにしてマクロをインクルードします。
#graphviz(include, :plugin/graphviz/UML)
キャッシュの無効化†
?cmd=graphviz
graphvizプラグインは、Webブラウザからページがリクエストされた時点でグラフ画像を生成します。生成した画像はキャッシュに保存します。
ソフトウェアの更新などでキャッシュに保存された生成済の画像を削除したい場合には、コマンド形式でプラグインを実行します。
表示されたページで管理者パスワードを入力すると、キャッシュ内のgraphvizにより生成されたファイルが削除されます。
大きなグラフを書きたい†
dev:PukiWiki/1.4/ちょっと便利に/複数行のプラグイン引数を可能にのパッチを当てると、以下のように複数行の記述が出来るので、大きなグラフ構造の記述が便利になります。
#graphviz{{{
digraph {
a -> b;
b -> c;
c -> a;
}
}}}
画像生成の委譲†
別サーバに画像生成を依頼することができます。
graphvizが利用できない環境や、画像生成の負荷を別マシンに分散させたい場合に利用します。
まず、画像生成を受け持つPukiWikiサーバでは次のように、委譲の受け付けを許可します。
define('PLUGIN_GRAPHVIZ_ACCEPT_TRANSFER2', TRUE);
委譲を行いたいPukiWikiサーバでは次のように、委譲先PukiWikiサーバを指定します。
define('PLUGIN_GRAPHVIZ_TRANSFER_URL', 'http://somewhere.else/pukiwiki.php');
委譲のプロトコルを変えました(Rev 1.4)。以前のプロトコルはPLUGIN_GRAPHVIZ_ACCEPT_TRANSFERで許可することができます。
日本語対応†
dotスクリプトのUTF8化とフォントネームの指定により日本語も通るようです。
(Debian GNU/Linux)†
確認時点でのgraphvizのパッケージバージョンは2.2-2です。
graphviz.inc.phpの設定を行います。
プログラムの起動時にLANG環境変数を日本語ロケールに指定します:
define('PLUGIN_GRAPHVIZ_DOT' 'LANG=ja_JP.EUC-JP /usr/bin/dot');
#他のgraphvizのプログラムも同様。convertは変更の必要なし。
define('PLUGIN_GRAPHVIZ_MACRO_FONTNAME','"san serif"');
標準でUTF8化するようにしました(Rev1.4)。文字コードはPLUGIN_GRAPHVIZ_CHARSETで指定できます。
PLUGIN_GRAPHVIZ_OPT_*はマクロの導入に伴い廃止しました(Rev1.4)。
PLUGIN_GRAPHVIZ_MACRO_FONTNAMEによる指定に改めました(Rev1.7)。
Windows†
PukiWikiでの動作は未確認ですが、以下の設定で行けそうです。
DOTFONTPATH環境変数を設定します。コマンドプロンプトでこんな表示になるように:
>echo %DOTFONTPATH%
C:\WINNT\Fonts
graphviz.inc.phpの設定を行います。graphvizプログラムのパスにはexeファイルの絶対パスをショート形式(空白文字を含めない)で指定します:
define('PLUGIN_GRAPHVIZ_DOT' 'c:\Somewhere\dot.exe');
# 他のgraphvizプログラムも同様
define('PLUGIN_GRAPHVIZ_SIMPLE_EXEC', TRUE);
define('PLUGIN_GRAPHVIZ_MACRO_FONTNAME', '"MSGOTHIC.TTC"');
PLUGIN_GRAPHVIZ_MACRO_FONTNAMEによる指定に改めました。(Rev1.7)
MacOSX†
graphvizは本家サイトで紹介されているhttp://www.pixelglow.com/graphviz/ から入手しApplicationsにインストールします。以下の設定はconvertをFinkから入れた場合です。
graphviz.inc.phpの設定を行います:
define('PLUGIN_GRAPHVIZ_DOT' '/Applications/Graphviz.app/Contents/MacOS/dot');
# 他のgraphvizプログラムも同様
define('PLUGIN_GRAPHVIZ_TRANSP_CMD', '/sw/bin/convert -transparent white png:- png:-');
define('PLUGIN_GRAPHVIZ_MACRO_FONTNAME', '"HiraMaruPro-W4"');
PLUGIN_GRAPHVIZ_MACRO_FONTNAMEによる指定に改めました。(Rev1.7)
その他†
ご存知でしたら是非教えてください。
- 生成された画像はCACHE_DIRにキャッシングされます。scriptからmd5によりファイル名を生成しているため、異なるスクリプトで生成されたキャッシュファイルを表示してしまう可能性があります。
- 背景色を抜くために、convertを使用します。
TODO†
- 添付したdotファイルの表示
- md5の衝突の検出や回避
- ファイルサイズの制限
コメント†
- 複数行にわたるスクリプトを書きたいんですけど、PukiWikiはプラグインは1行にしか書けないんですね。convert_html.phpのBodyクラスのparseメソッドで、行末に\が合ったら行を連結する改造をしようとしているんですが、なんかうまくいってないです。 -- matsuda
- 編集フォームで添付ファイルを編集するスタイルが良いかも。 -- matsuda
- jpgraph用のを考えたときに思い付いたのですが、特定タグで囲った部分をデータとしてやって それを読み込んでから渡すようにしたらどうでしょう? -- merlin
- areaedit などが参考になるかな? データ部は全てコメントとしておくのがいいかな? -- merlin
- 例えばプラグインを呼んだ次の行以降の連続するコメントをスクリプトとみなすとか、そんな感じでしょうか。1ページ中に複数のgraphvizが置かれる場合もあるので「次の行」を特定するために、引数にAlt属性を追加して、Alt属性の文字列を手掛かりに「次の行」を探すと。んむ、ちょっと回りくどいけど一応実現は出来そうかな? (^^; -- にぶんのに
- 編集の容易さを考えると、プラグインに複数行の引数が自然に記述できるとうれしいんですけどね。
「\」で行を連結するのは、なぜか正規表現にマッチしなくてうまくいかなかったんですけど、その代わりヒアドキュメント形式に対応させてみました。
convert_html.php.diff -- matsuda
- 対応バージョン1.4.4サポートとありますが、CACHE_DIR/.htaccessの
Order allow,deny
Deny from all
によって画像が表示されないような気がするのですが勘違いでしょうか? -- よっちい
- graphviz.inc.php.2についてなのですが、Windowsサーバー環境で動かすことは可能でしょうか?実際に動かそうと試しているのですが、画像が吐き出されません。graphvizはWindows版バイナリをインストールし、それ単体で動作しています。また、graphviz.inc.php.2内の「使用するgraphvizプログラムのパス」には、exeへの絶対パスを通していますが、convertは無かったので通せませんでした。 -- きりん
- 今のやり方でWindows環境で動作させられるかはわかりません&worried; -- matsuda
- dotファイルを一旦吐き出して-oで$image_pathファイル出力をするとできますよ。 -- nepharp
- お~出来るのですね。でも具体的にどうするのかわからないです。;;とりあえずパスは上記のようにしててOKですか?convertには通さなくてもいいのでしょうか -- きりん
- convertは背景色を透明にするために使っているだけなので通さなくても良いですよ。 -- matsuda
- こんな感じでどうでしょうか(実際にためしてはいませんが)-- matsuda
if (file_exists($image_path)) {
touch($image_path);
} else {
graphviz_expire_cache();
$command = "(" . $cmds[$prog] . " " . $opts[$option];
$command .= " -o$image_path";
$command .= ") <<EOF\n" . join("\n", $args) . "\nEOF\n";
system($command, $retval);
if ($retval != 0) {
return "error";
}
}
- 「dotファイルを一旦吐き出して」って書いてありますから、上のやり方ではダメみたいですね。 -- matsuda
- アプリの呼び出し方法を変えてみました。これでWindowsでも動かないでしょうか。
graphviz.inc.php.3 -- matsuda
- 早速試してみました。ソースは前回同様「使用するgraphvizプログラムのパス」にexeへの絶対パスを通した事以外触らず、ページには「#graphviz(digraph {a -> b -> c;})」と記入。結果、「graphviz: internal error (stream_select returned FALSE)」と出力され、cacheディレクトリにも画像データはありませんでした。 -- きりん
- お手数かけて済みません。実行環境で場合分けして、Windows環境の場合は単純なコマンドにしておかないとだめかなぁ。 -- matsuda
- そうですね。私のやった方法もべたべたで単純化して、なんで。やっぱUnix系サーバーは柔軟でいいなあ。 -- neoharp
graphviz.inc.php.5をアップロードしました。
標準のコマンド呼び出しに失敗した場合により単純な方法を試すようにしました。これでWindows環境でも動くとよいのですが。また、画像生成を別のPukiWikiサーバに依頼できるようにしました。 -- matsuda
- バグ発見。別PukiWikiサーバに画像生成を依頼する場合に、一つのページに複数個のイメージがあるとイメージがランダムに表示されないことがあります。原因は今のところわかりません。 -- matsuda
graphviz.inc.php.6をアップロードしました。
画像生成を委譲した場合にイメージがランダムに表示されないバグを修正しました。 -- matsuda
- こんばんは。
Windows環境でGraphvizプラグインを動かす事が出来ましたので報告します。
1.270行と282行をコメントアウト("もっと単純なコマンドで試してみる"のコードを必ず動かすようにする)。
2.dotコマンドへのパスをショート形式(パス中に空白文字を含めない)にする。
で、動かす事が出来ました。 -- w
- 既知の問題として、PukiWiki 1.4.5で導入されたURL長の制限により、生成委譲機能が動作しない場合があります。現状はdotスクリプトをURLに埋め込むと言うありあえない実装なので、POSTメソッドを使う形に変更しようと勉強中です。 -- matsuda
graphviz.inc.php.7をアップロードしました。マクロ機能を実装しました。画像生成の委譲にHTTPのPOSTメソッドを使用するようにしました。
-- matsuda
- PLUGIN_GRAPHVIZ_OPT_*は廃止しました。代わりにPLUGIN_GRAPHVIZ_MACRO_*を導入しました。
- Windows環境用にシンプルなコマンド実行を行わせるPLUGIN_GRAPHVIZ_SIMPLE_EXECを定義しました。
- 文字コード変換をプラグインに組み込みました。デフォルトでUTF8に変換します。プログラム定義での変換は必要なくなりましたので、していた方は対応をお願いします。
graphviz.inc.php.8をアップロードしました。
インライン型プラグインが機能していなかったのと、PLUGIN_GRAPHVIZ_SIMPLE_EXECをTRUEにした場合にテスト用のメッセージが表示されてしまうバグを修正しました。
-- matsuda
graphviz.inc.php.9をアップロードしました。
-- matsuda
- 委譲時に意図しない文字コード変換が生じていたバグを修正しました。
- その他もろもろバグ修正。
- Pukiwikiとは直接関係ないのですが、Graphivizに日本語を出力させる方法がわかったので、カキコします。Graphvizのメーリングリスト graphviz-interest に Non-ASCII in node/edge labels? というスレッドがありました。アーカイブから https://mailman.research.att.com/pipermail/graphviz-interest/2004q2/001364.html
とこの前後を参照ねがいます。このスレによれば「dotファイルの文字エンコーディングをUTF-8にせよ。それからdotコマンドが適切なフォントを見つけられるように設定してやれ。それでOK。」とのことです。そうかじゃあやってみようと最近の開発版(graphviz- 2.3.20050305.0530.exe)で試してみました。まず下記のようなdotファイルをUTF-8で作成しファイルに保存します。
digraph G {
メイン [shape=box,fontname="MSMINCHO.TTC"];
}
わたしはWindows環境です。dotコマンドに日本語フォントのありかを教えるために環境変数 DOTFONTPATHを作って、フォントファイルを格納したディレクトリのパスを記述します。つまり
>echo %DOTFONTPAHT%
C:\WINNT\FONTS
とかいう具合になるようにする。このようにしたうえでdotコマンドを実行。するとこんなPNG画像ができました。
上記MLの記述によれば、最近に非ASCII対応をしたというわけではなくて、dotコマンドの昔のバージョンからなにも設計を変えてはいないらしい。昔から大丈夫だったのかもしれません。
fontname属性のなかに MSMINCHO.TTCというようにファイル名を指定しています。こうやったら動いた。ここでMSPゴシックとかのいわゆるfont- familyを指定したら「FONTファイルが見つかりません」とエラーがでたので、それならファイル名を書けばよかろう、とおもってやってみたら案の定でした。ドキュメントGraphviz Attributesの fontname属性の説明を読むと、どうもfontname属性の使い方は環境依存・実装依存であって、とくにfontconfig libraryに関連すると書いています。Fontconfig libraryをうまく使えばfontname属性にフォント・ファミリー名を指定することができるのかもしれませんがわたしはFontconfigをよく存じません。たぶんUNIXのはなしであってWindows環境では関係ないんだろうなあ。-- matsuhashi
- 詳細な情報ありがとうございました。早速コンテンツに加えさせていただきました。(作業中に一度誤ってコメントを消してしまいました。投稿時間が変わってしまいました。申し訳ないです。) -- matsuda
- MacOSX10.3.8で使えました。手順 1)http://www.pixelglow.com/graphviz/ からgraphvizをダウンロード。Applicationsにインストール。2)graphviz.inc.phpの「使用するgraphvizプログラムのパス」の「/usr/bin/dot」などを「/Applications/Graphviz.app/Contents/MacOS/dot」に変更。(fdpはありません)。convertはFinkから入れたものを使うなら「/usr/bin/convert」を「/sw/bin/convert」に変更。3)fontname="HiraMaruPro-W4"などと指定すると日本語も出ました。 -- yhi
- 一気に情報が集まりましたね⌣ありがとうございます。コンテンツに加えさせていただきました。 -- matsuda
- インライン形式ではマクロが展開されないのですが,これって仕様でしょうか? -- koni
- インライン形式はブロック形式よりも先に評価されてしまうようです。
なので、残念ながら仕様ということになります。 -- matsuda
- define, includeをインライン形式に対応させればOKですね。検討します。 -- matsuda
- マルチラインが使えるブロック形式の方で,アラインメント(left,center,rightの位置)を個別に指定・変更できるようにしたかったので,第4引数でアライメントを指定できるようにするパッチを作りました.拡張の方向として(順番に依存するオプションが増えてしまうので)どうかなぁと思いながら暫定的に使っています.このパッチはともかく,アラインメントを指定する何がしかの方法を追加して頂けないでしょうか. -- koni
- パッチを取り込ませて頂きました。Rev1.7として公開しました。ありがとうございました。 -- matsuda
- graphviz.inc.php.10をアップロードしました。 -- matsuda
- このリビジョンから、ファイルを自分のブログにアップロードするようにしました。
- koniさんのアラインメント指定パッチを取り込みました。
- キャッシュ無効化機能を追加しました。
- フォント名の指定を独立したマクロ(@fontname@)にしました。
- graphviz.inc.php.11をアップロードしました。 -- matsuda
- 委譲により他のpukiwikiサイトに画像生成を依頼する場合の通信プログラムにバグがあり、dotスクリプトがデコードされる際に破壊される場合がありました。
このバグは委譲機能を使用していない場合には影響ありません。
- ソースをSourceForge.jpに移しました。 -- matsuda
- OSDN.net の チケット ( https://osdn.net/ticket/browse.php?group_id=166&tid=12242 ) から添付ファイル (graphviz.inc.php.10, graphviz.inc.php.11)をコピーしました。OSDN.net側のチケットをCloseするためです。 -- umorigu