#!/usr/bin/perl
$ENV{PATH} = '/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin';
use CGI qw/:standard/;
print header(-charset=>'Big5');
print start_html(-title=>'線上 TeX 編譯', -background=>'bg.jpg');
# 標題
print '
線上 TeX 編譯
', "\n";
# 分隔線
print hr;
# 程式一開始即進入 tmp 目錄
chdir('tmp');
# 檢查目錄名是否合法
if( param('dir') ) {
my $dir = param('dir');
if( $dir =~ /[^0-9-]/ ) {
print "\n";
print end_html;
exit;
}
}
# 刪除暫存檔
if(param('delete') =~ 'true' ) {
my $dir = param('dir');
my $msg = "";
# 檢查目錄是否存在
if ( not -e "$dir" ) {
print "\n";
print end_html;
exit;
}
# 刪除檔案
foreach(`ls $dir`) {
chomp;
if ( unlink("$dir/$_") ) {
$msg = $msg . "成功\\\刪除 $_\\n";
} else {
$msg = $msg . "刪除 $_ 失敗\\n";
}
}
# 刪除 chitex/chilatex 暫存檔
if ( -e "$dir/.tmp00" ) {
`rm -rf $dir/.tmp00`;
$msg = $msg . "成功\\\刪除 chitex/chilatex 暫存檔\\n";
}
# 刪除目錄
if ( rmdir("$dir") ) {
print "您已經成功\刪除暫存檔", br, "\n";
} else {
print "刪除暫存檔失敗!", br, "\n";
}
# 檢查是否有檔案被刪除
if ( length($msg) == 0 ) {
$msg = "未刪除任何檔案";
}
# 顯示刪除狀況並關閉視窗
print "\n";
print end_html;
exit;
}
# 若第一次進入, 則新建一暫存目錄
if(!param('dir')) {
$dir = time() . '-' . $$;
mkdir($dir, 0755 );
} else {
$dir = param('dir');
}
# 若進入目錄失敗, 則關閉視窗並結束程式
if( !chdir($dir) ) {
print "\n";
print end_html;
exit;
}
# 處理檔案上傳
if(param('uploaded_file')) {
$oldname = param('uploaded_file');
$oldname =~ m/([^\/\\]+)$/;
$filename = lc($1);
open (OUTFILE, ">$filename");
while ($bytesread = read($oldname,$buffer,1024)) {
print OUTFILE $buffer;
}
}
# 已選擇檔案及編譯器, 進行編譯工作
if(param('texfile') and param('compiler')) {
# 取得欲編譯的檔名
$base = param('texfile');
$base =~ s/(.*)\..*/$1/;
chomp $base;
# 取得欲使用的 compiler
$compiler = param('compiler');
chomp $compiler;
# 使用恰當的編譯器編譯
if( $compiler =~ /^tex$/ ) {
qx/tex -interaction=nonstopmode $base.tex/;
} elsif ( $compiler =~ /^latex$/ ) {
qx/latex -interaction=nonstopmode $base.tex/;
} elsif ( $compiler =~ /^chitex$/ ) {
qx/chitex -batch $base.tex/;
} elsif ( $compiler =~ /^chilatex$/ ) {
qx/chilatex -batch $base.tex/;
}
# 若 dvi 檔存在, 則再轉成 ps 及 pdf 檔
if ( -e "$base.dvi") {
# 轉成 ps 檔
qx/dvips -o $base.ps $base.dvi/;
# 轉成 pdf 檔
qx/dvipdfm $base.dvi/;
}
}
# 選擇檔案及編譯器用的表單
if(param('dir')) {
# 列出可供下載的檔案
print "檔案列表, 可按右鍵存檔, 或直接點選開啟檔案:", br, "\n";
foreach(`ls`) {
chomp;
print a({href=> 'tmp/' . param('dir') . "/$_"}, $_), br, "\n";
}
print br, hr, "\n";
# 表單開始
print start_form(), "\n";
# 傳遞目前的目錄名
print hidden('dir', param('dir')), "\n";
# 選擇 tex 檔
print "Step 1. 請選擇您想編譯的 tex 檔", br, "\n";
@texlist = `ls *.tex`;
print radio_group( -name=>'texfile',
-values=>\@texlist,
-default=>'tex',
-linebreak=>'true', "\n");
print br, "\n";
# 選擇 tex compiler
print "Step 2. 請選擇您想用的編譯器", br, "\n";
# @compilerlist = ('tex', 'latex', 'chitex', 'chilatex');
@compilerlist = ('tex', 'latex');
print radio_group( -name=>'compiler',
-values=>\@compilerlist, "\n");
print br, br, "\n";
# 編譯按鈕
print "Step 3. 按下編譯鈕", br, "\n";
print submit(-value=>'編譯'), reset(-value=>'重設'), br, "\n";
# 表單結束
print end_form, "\n";
# 分隔線
print hr, "\n";
}
# 刪除用的表單
if(param('dir')) {
my $dir = param('dir');
print "如果您已經下載完您需要的檔案, 可以按刪除鈕, 把所有在 Server 上暫時儲存的資料刪除!\n";
# 表單開始
print start_form(), "\n";
# 傳遞目前的目錄名
print hidden('dir', $dir), "\n";
# 刪除
print hidden('delete', 'true'), "\n";
# 編譯按鈕
print submit(-value=>'刪除'), br, "\n";
# 表單結束
print end_form, "\n";
# 分隔線
print hr, "\n";
}
# 上傳用的表單
if ( 1 ) {
# 開始表單
print start_form(-enctype=>"multipart/form-data"), "\n";
# 選擇上傳檔案
print "您可以在這裡上傳需要 compile 的 tex 及 ps 檔", br, "\n";
print "檔案: ", filefield(-name=>'uploaded_file'), br, "\n";
# 傳遞目前目錄名
if (!param('dir')) {
print hidden('dir', $dir), br, "\n";
} else {
print hidden('dir', param('dir')), br, "\n";
}
# 上傳與重設按鈕
print submit(-value=>'上傳'), reset(-value=>'重設'), br, "\n";
# 結束表單
print end_form, "\n";
}
print end_html;