ブラウザから Graphviz が使えると便利かと

そもそも,まだ使ったことないのですが,とりあえず Graphviz を利用するための CGI プログラムを作成してみました.Vista では動かないという話を聞いたのが理由です.確認していませんけど….

以下,メモ代わりです.

#! /usr/bin/perl

use strict;
use warnings;

use CGI;
use IO::File;

## Gets a DOT script.
my $dot = GetDot();

if ($dot)
{
	if (ExecuteGraphviz($dot))
	{
		exit;
	}
}
ShowHtmlPage();

## Parses an html request and gets a DOT script.
sub GetDot
{
	my $cgi = CGI->new;
	my $dot = $cgi->param("dot");
	if ($dot)
	{
		## A DOT script from a textarea form.
		return $dot;
	}

	## A DOT script file.
	my $dotfile = $cgi->param("dotfile");
	if ($dotfile)
	{
		$dot = join('', <$dotfile>);
		close($dotfile);
	}

	return $dot;
}

## Creates a graph from a DOT script.
sub ExecuteGraphviz
{
	my $dot = $_[0];

	print "Content-Type: image/png\n\n";

	open(DOT, "| dot -Tpng");
	print(DOT $dot);
	close(DOT);

	if ($?)
	{
		## Returns undef if failed.
		return;
	}
	return "ok";
}

## Shows an html page.
sub ShowHtmlPage
{
print << "END_OF_RESPONSE";
Content-Type: text/html

<html lang="ja">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<title>Graphviz version 2.16</title>
	</head>
	<body>
		<h2>Graphviz version 2.16</h2>
		<p>
			DOT 言語によりグラフ(PNG)を生成します.
		</p>
		<hr>
		<p>
			下記のフォームに DOT 言語を直接入力してください.
		</p>
		<form method="post" action="/cgi-bin/graphviz.cgi">
			<textarea name="dot" cols="40" rows="10">digraph sample
{
  alpha -> beta;
  alpha -> gamma;
  node [fontname="Sazanami Gothic"];
  beta -> デルタ;
}
</textarea><br>
			<input type="submit" value="submit" />
		</form>
		<hr>
		<p>
			DOT 言語で記述されたファイルをアップロードしてください.
		</p>
		<form method="post" action="/cgi-bin/graphviz.cgi"
			enctype="multipart/form-data">
			<input type="file" name="dotfile" />
			<input type="submit" value="submit" />
		</form>
		<hr>
	</body>
</html>
END_OF_RESPONSE
}

追記(2009-06-04):ファイルとして保存するのに不便だということで,修正したものを以下の場所においておきました.