読者です 読者をやめる 読者になる 読者になる

Gvizを Perlに移植しました

perl graphviz

Yet Another Ruby Graphviz Interfaceを作ったからみんなで大量のグラフを作って遊ぼうよ!


DSLで DOTファイルが生成できるのがいいなぁと思ったのと、
Rubyの勉強を兼ねて移植してみました。

リポジトリ

Graph-Gvizじゃ目的がわからないという意見をいただいたので
モジュール名を変更しました。
https://github.com/syohex/p5-Graph-Gviz
syohex/p5-Graphviz-DSL · GitHub


CPANにアップするかどうかは類似モジュールの調査後に
します。少し調べた限りは DSLで書けるのがなさそうだったし、
依存モジュールがひたすら多そうなのばっかりなので、
アップする意義はあるかもと思っています。

サンプルコード

#!perl
use strict;
use warnings;

use Graph::Gviz;

my $graph = graph {
    route main => [qw/init parse cleanup printf/];
    route init => 'make', parse => 'execute';
    route execute => [qw/make compare printf /];
};

print "$graph";
# $graph->save(path => 'sample', type => 'png', encoding => 'utf-8');

これで以下のような DOTファイルが生成されます。

digraph G {
  main;
  init;
  parse;
  cleanup;
  printf;
  make;
  execute;
  compare;
  main -> init;
  main -> parse;
  main -> cleanup;
  main -> printf;
  init -> make;
  parse -> execute;
  execute -> make;
  execute -> compare;
  execute -> printf;
}

オリジナルとの比較

オリジナルで上記と同じことをすると以下のようになります。

require "gviz"

gv = Gviz.new
gv.graph do
  route :main => [:init, :parse, :cleanup, :printf]
  route :init => :make, :parse => :execute
  route :execute => [:make, :compare, :printf]
end

gv.save(:sample1, :png)

Perlだとシンボルの部分がすべて文字列になってしまうので見苦しい
部分もありますが、結構近いんじゃないかなと思います。

実例

#!perl
use strict;
use warnings;

use utf8;
use Graph::Gviz;

my %attr_heart = (label => ' ♥ ', fontcolor => 'red');
my $kimashi = graph {
    global bgcolor => 'powderblue';

    nodes fillcolor => 'white', style => 'filled', fontsize => '16px';

    route ['赤座あかり', '歳納京子', '吉川ちなつ', '船見結衣'];
    route ['池田千歳', '杉浦綾乃', '大室櫻子', '古谷向日葵'];

    edges fontsize => '24px';

    route '吉川ちなつ' => '船見結衣';
    route '歳納京子' => '吉川ちなつ';
    edge '吉川ちなつ_船見結衣', %attr_heart;

    route '歳納京子' => '船見結衣';
    edge '歳納京子_船見結衣', dir => 'both', label => ' ??? ';

    route '杉浦綾乃' => '歳納京子';
    edge '杉浦綾乃_歳納京子', %attr_heart;

    route '池田千歳' => '杉浦綾乃';
    edge '池田千歳_杉浦綾乃', dir => 'both', label => ' ??? ';

    route '大室櫻子' => '古谷向日葵';
    edge '大室櫻子_古谷向日葵', dir => 'both', %attr_heart;
};

$kimashi->save(path => 'yuruyuri', type => 'png', encoding => 'utf-8');
実行結果

おわりに

Gvizの Perlへの移植について紹介しました。
DSLがあまりなんなのかわかっていないんですけど、PerlDSL
実装するのはいろいろ面倒くさいと思いました。DSLの実装は
Web::Scraperをかなり参考にしました。Perlの prototypeは
やっぱりよくわからないと思いました。


Graphvizの知識がないのでもう少し勉強して、Ruby版での
実例を作ってみたいと思います。


問題があれば githubの方までお願いします。