The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
#
# Note: t/test.t searches for the next line.
# Annotation: Demonstrates calling circo instead of dot.

use strict;
use warnings;

use File::Spec;

use GraphViz2;

use IPC::Run3; # For run().

use Log::Handler;

# ------------

my($logger) = Log::Handler -> new;

$logger -> add
	(
	 screen =>
	 {
		 maxlevel       => 'debug',
		 message_layout => '%m',
		 minlevel       => 'error',
	 }
	);

# Generate the dot input.

my($graph) = GraphViz2 -> new
(
	edge   => {color => 'grey'},
	global => {directed => 1},
	graph  => {rankdir => 'TB'},
	logger => $logger,
	node   => {shape => 'oval'},
);

# Redundant.
#$graph -> add_node(name => 'Here');
#$graph -> add_node(name => 'There');
#$graph -> add_node(name => 'Everywhere');

$graph -> add_edge(from => 'Here', to => 'There');
$graph -> add_edge(from => 'There', to => 'Everywhere');
$graph -> add_edge(from => 'Everywhere', to => 'Here');

# Generate the dot output.

$graph -> run;

# Generate the circo output.

my($stdout, $stderr);

run3
	[
		'circo',
		'-Gpage=8.25,10.75',
		'-Grotate=90',
		'-Gmargin=0.125',
		'-Gsize=8.25,10.75'
	],
	\$graph -> dot_input,
	\$stdout,
	\$stderr;

die $stderr if ($stderr);

my($circo_output) = $stdout;

#print '-' x 50, "\n";
#print $circo_output;
#print '-' x 50, "\n";

# Generate the dot output.

my($format)      = shift || 'svg';
my($output_file) = shift || File::Spec -> catfile('html', "circo.$format");

run3
	[
		'dot',
		"-T$format",
	],
	\$circo_output,
	\$stdout,
	\$stderr;

die $stderr if ($stderr);

my($dot_output) = $stdout;

#print '-' x 50, "\n";
#print $dot_output;
#print '-' x 50, "\n";

open(OUT, '>', $output_file);
print OUT $dot_output;
close OUT;

print "Wrote $output_file. \n";