#!/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;