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

Graphviz::DSL 0.02をリリースしました

perl graphviz

Graphviz-DSL-0.02 - Graphviz Perl interface with DSL - metacpan.org


Graphviz::DSL 0.02をリリースしましたので、非互換修正、新機能に
ついて紹介します。

非互換な修正

edgeメソッドの第一引数が Stringから ArrayRefへなりました。
従来の方法だと使えない文字列がでてきたりしたので変更しました。
Perlだと fat commaが使えるので視覚的にも良いかと思います。

# 従来
edge 'a_b'; # aから bの edge

# 0.02
edge ['a' => 'b'] # 同上
以降は新機能の紹介です。

subgraphへの edgeの対応

dotの仕様では edgeの始点・終点に subgraphが指定できるとあったので
対応しました。subgraphへエッジを引くとその中のノードにすべてエッジが
引かれるようです。

サンプルコード
#!/usr/bin/env perl
use strict;
use warnings;

use Graphviz::DSL;

my $graph = graph {
    subgraph {
        name 'cluster_1';
        route a0 => 'a1';
    };

    subgraph {
        name 'cluster_2';
        route b0 => 'b1';
    };

    route 'cluster_1' => 'cluster_2';
};

$graph->save(path => 'subgraph', type => 'png');
結果

compassの対応

dotにはノードのどの位置からエッジを出すか指定できる compassという
ものがあるのでそれに対応しました。compassには n, e, s, wの他に
neのような中間の方向も指定できます。

サンプルコード
#!/usr/bin/env perl
use strict;
use warnings;

use Graphviz::DSL;

my $graph = graph {
    route 'a:n' => 'b:s';
    route 'a:w' => 'b:w';
    route 'a:s' => 'b:n';
    route 'a:e' => 'b:e';
};

$graph->save(path => 'compass', type => 'png');
結果

無向グラフの対応

有向グラフしか対応していませんでしたが、無向グラフに対応しました。
デフォルトは有向グラフです。graphブロックの中で 'type "graph"'と
呼べば無向グラフに設定できます。

サンプルコード
#!/usr/bin/env perl
use strict;
use warnings;

use Graphviz::DSL;

my $graph = graph {
    type "graph";

    route 'a:n' => 'b:s';
    route 'a:w' => 'b:w';
    route 'a:se' => 'b:nw';
};

$graph->save(path => 'undirected', type => 'png');
結果

'node', 'edge'メソッド正規表現指定

node, edgeに id以外に正規表現が指定できるようになりました。
特定の node, edgeの属性の更新が行えるようになりました。

サンプルコード
#!/usr/bin/env perl
use strict;
use warnings;

use Graphviz::DSL;

my $graph = graph {
    route 'Ruby on Rails(Ruby)' => 'Catalyst(Perl)';
    route 'Sinatra(Ruby)' => 'Mojolicious-Lite(Perl)';

    node qr/perl/i, color => 'cyan';
    node qr/ruby/i, color => 'red';

    edge [qr/tra/ => qr/Lite/], label => 'Inspired';
};

$graph->save(path => 'match_node', type => 'png');
結果

multi_routeメソッドの追加

複雑な構成のグラフを書くとき既存のメソッドでは何度もしていないと
いけないという問題があったので、ハッシュリファレンスをグラフとして
とらえて node, edgeを追加するメソッドを追加しました。

サンプルコード
#!/usr/bin/env perl
use strict;
use warnings;

use Graphviz::DSL;
use utf8;

my $graph = graph {
    multi_route +{
        'J大K' => {
            '2中P' => {
                '2中P' => '2大K',
                '2大P' => {
                    '小竜巻旋風脚' => '中昇竜拳',
                },
            },
            '2大P' => [qw/波動拳 昇竜拳/],
            '2中K' => {
                '中昇竜' => {
                    'セービングキャンセル' => '滅波動拳',
                }
            },
        },
    };
};

$graph->save(path => 'multiroute', type => 'png');
結果

おわりに

問題があれば githubまでお知らせください