File Coverage

blib/lib/Map/Tube/GraphViz/Utils.pm
Criterion Covered Total %
statement 10 12 83.3
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 14 16 87.5


line stmt bran cond sub pod time code
1             package Map::Tube::GraphViz::Utils;
2              
3             # Pragmas.
4 3     3   24384 use base qw(Exporter);
  3         6  
  3         343  
5 3     3   17 use strict;
  3         6  
  3         110  
6 3     3   14 use warnings;
  3         8  
  3         166  
7              
8             # Modules.
9 3     3   1959 use Error::Pure qw(err);
  0            
  0            
10             use Readonly;
11              
12             # Constants.
13             Readonly::Array our @EXPORT_OK => qw(node_color node_color_without_label
14             color_line);
15             Readonly::Array our @COLORS => qw(red green yellow cyan magenta blue grey
16             orange brown white greenyellow red4 violet tomato cadetblue aquamarine
17             lawngreen indigo deeppink darkslategrey khaki thistle peru darkgreen
18             );
19              
20             # Version.
21             our $VERSION = 0.04;
22              
23             # Create GraphViz color node.
24             sub node_color {
25             my ($obj, $node) = @_;
26             my %params = _node_color_params($obj, $node);
27             $obj->{'g'}->add_node(
28             'label' => $node->name,
29             'name' => $node->id,
30             %params,
31             );
32             return;
33             }
34              
35             # Create GraphViz color node without label.
36             sub node_color_without_label {
37             my ($obj, $node) = @_;
38             my %params = _node_color_params($obj, $node);
39             $obj->{'g'}->add_node(
40             'label' => '',
41             'name' => $node->id,
42             %params,
43             );
44             return;
45             }
46              
47             # Get line color.
48             sub color_line {
49             my ($obj, $line) = @_;
50             my $line_name = $line->id || $line->name;
51             if (! exists $obj->{'_color_line'}->{$line_name}) {
52             if ($line->color) {
53             $obj->{'_color_line'}->{$line_name} = $line->color;
54             } else {
55             if (! exists $obj->{'_color_index'}) {
56             $obj->{'_color_index'} = 0;
57             } else {
58             $obj->{'_color_index'}++;
59             if ($obj->{'_color_index'} > $#COLORS) {
60             err "No color for line '$line'.";
61             }
62             }
63             my $rand_color = $COLORS[$obj->{'_color_index'}];
64             $obj->{'_color_line'}->{$line_name} = $rand_color;
65             }
66             }
67             return $obj->{'_color_line'}->{$line_name};
68             }
69              
70             # Get color node parameters.
71             sub _node_color_params {
72             my ($obj, $node) = @_;
73             my @node_lines = @{$node->line};
74             my %params;
75             if (@node_lines == 1) {
76             %params = (
77             'style' => 'filled',
78             'fillcolor' => color_line($obj, $node_lines[0]),
79             );
80             } else {
81             %params = (
82             'style' => 'wedged',
83             'fillcolor' => (join ':', map {
84             color_line($obj, $_);
85             } @node_lines),
86             );
87             }
88             return %params;
89             }
90              
91             1;
92              
93             __END__