Gnuplot 플러그인
gnuplot 을 호출하여 그래프를 그리는 플러그인
- 필수 요구 사항:
- 선택 요구 사항:
- Digest::MD5 모듈이 설치되어 있으면 좋다.
- 사용법: 자세한 것은 gnuplot의 매뉴얼을 참조할 것
- gnuplot 명령어들의 리스트를 적어 준다.
{{{#!gnuplot
plot sin(x)
}}}
- 별도의 데이타 파일에 대한 그래프를 그리고 싶은 경우 - "##FILE:" 뒤에 파일명을 적어주면 그 파일명으로 데이타가 저장된다.
{{{#!gnuplot
plot "data1.dat" with linespoint, "data2.dat" with linespoint
##FILE:data1.dat
#x y
0.0123 5.21
0.168 6.02
0.184 6.08
0.190 6.51
0.226 6.75
0.259 6.81
0.304 7.15
##FILE:data2.dat
0.01 6.21
0.16 3.02
0.19 4.08
0.20 7.51
0.226 6.75
0.250 6.81
0.314 9.5
}}}
- 한 번 만들어진 그림은 upload 디렉토리 아래 gnuplot 디렉토리 아래에 저장되어 계속 사용된다.
plugin/gnuplot.pl 추가
sub plugin_gnuplot {
my ($content, @opt) = @_;
my $plt = $content;
my $log;
my $gnuplot = "gnuplot";
my $hash;
my $hasMD5 = eval "require Digest::MD5;";
if ($hasMD5) {
$hash = Digest::MD5::md5_base64($content);
} else {
$hash = crypt($content, $HashKey);
}
$hash =~ s/(\W)/uc sprintf "_%02x", ord($1)/eg;
my $hashimage = "$hash.png";
my $imgpath = "";
my $GnuplotDir = "$UploadDir/gnuplot";
my $GnuplotUrl = "$UploadUrl/gnuplot";
if (-f "$GnuplotDir/$hashimage" && not -z "$GnuplotDir/$hashimage") {
} else {
&CreateDir($UploadDir);
&CreateDir($GnuplotDir);
my $hashdir = "$TempDir/$hash";
if (not -d $hashdir) {
mkdir($hashdir, 0775) or return "[Unable to create $hash dir]";
}
my $pwd = `pwd`;
$pwd =~ s/(.*)(\n|\r)*/$1/;
my @blocks = split(/\n##FILE:/, $content);
$plt = shift @blocks;
foreach my $block (@blocks) {
if ($block =~ /^(\S+)\n((.|\n)*)$/) {
my ($filename, $filetext) = ($1, $2);
&WriteStringToFile("$hashdir/$filename", $filetext);
}
}
$plt = "\n".$plt."\n";
$plt =~ s/^\s*![^\n]+$//gim;
$plt =~ s/[ ]+/ /gi;
$plt =~ s/^\s*set?\s+(t|o).*$//gim;
my $input = << "EOT";
set size 0.5,0.6
set term png
set out '$hashimage'
$plt
EOT
&WriteStringToFile("$hashdir/gnuplot.dat", $input);
chdir ($hashdir);
open SAVEOUT, ">&STDOUT";
open SAVEERR, ">&STDERR";
open STDOUT, ">hash.log";
open STDERR, ">&STDOUT";
qx($gnuplot gnuplot.dat);
close STDOUT;
close STDERR;
open STDOUT, ">&SAVEOUT";
open STDERR, ">&SAVEERR";
chdir($pwd);
if (-f "$hashdir/$hashimage" && not -z "$hashdir/$hashimage") {
my $png = &ReadFile("$hashdir/$hashimage");
&WriteStringToFile("$GnuplotDir/$hashimage", $png);
} else {
$log = &ReadFile("$hashdir/hash.log");
$log = "[Error retrieving image from hashdir]\n$log";
}
unlink (glob("$hashdir/*")) or return "[unlink fail]";
rmdir ($hashdir) or return "[rmdir fail]";
}
if ($log ne '') {
$imgpath = "<pre>\n$log\n</pre>";
}
$imgpath .= "<img src='$GnuplotUrl/$hashimage' alt='gnuplot'>";
return $imgpath;
}
1;
추가 업데이트 내역
ext1.74d - png 파일명을 결정하는 부분 개선. 특수 문자를 삭제하지 않고 아스키코드로 표현하게 함
ext1.74e - 1.74d 에서, 특수문자를 "%16진수"의 형태로 만들었더니 문제가 있어서, "_16진수"의 형태로 만들도록 함
사용자 의견
위키위키분류