[첫화면으로]UseModWiki소스수정/Gnuplot플러그인

마지막으로 [b]

Gnuplot 플러그인

gnuplot 을 호출하여 그래프를 그리는 플러그인

 {{{#!gnuplot
 plot sin(x)
 }}}
gnuplot
 {{{#!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
 }}}
gnuplot

plugin/gnuplot.pl 추가

# usage :
# {{{#!gnuplot
# plot sin(x)
# }}}
#
# {{{#!gnuplot
# plot "data1.dat"
# ##FILE:data1.dat
# 1    2
# 2    3
# 3    3.5
# }}}

sub plugin_gnuplot {
    my ($content, @opt) = @_;
    my $plt = $content;
    my $log;

    my $gnuplot = "gnuplot";     # PATH of gnuplot - 필요에 따라 /usr/local/bin/gnuplot 등으로 적절히 지정해 준다.
                                 # 또는 config 파일의 ENV{PATH} 항목에 /usr/local/bin 등을 추가해 준다.

# 그림 파일의 이름 결정
    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);
            }
        }

# for security (code from MoniWiki)
        $plt = "\n".$plt."\n";
        $plt =~ s/^\s*![^\n]+$//gim;    # strip shell commands
        $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 파일명을 결정하는 부분 개선. 특수 문자를 삭제하지 않고 아스키코드로 표현하게 함
-- Raymundo 2005-2-12 2:56 pm

ext1.74e - 1.74d 에서, 특수문자를 "%16진수"의 형태로 만들었더니 문제가 있어서, "_16진수"의 형태로 만들도록 함
-- Raymundo 2005-2-14 11:10 am

사용자 의견

이름:  
Homepage:
내용:
 

위키위키분류

마지막 편집일: 2007-1-8 12:19 pm (변경사항 [d])
1013 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기