--- loncom/interface/printout.pl 2004/02/17 00:26:20 1.49 +++ loncom/interface/printout.pl 2004/07/28 22:00:14 1.59 @@ -1,7 +1,7 @@ #!/usr/bin/perl # CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc. # -# $Id: printout.pl,v 1.49 2004/02/17 00:26:20 albertel Exp $ +# $Id: printout.pl,v 1.59 2004/07/28 22:00:14 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,13 +27,15 @@ # use lib '/home/httpd/lib/perl'; -use Time::Local; use LONCAPA::loncgi(); use File::Path; use IO::File; use Image::Magick; use Apache::lonhtmlcommon; +use Apache::loncommon; +use Apache::lonlocal; +use strict; $|=1; my %origENV=%ENV; if (! &LONCAPA::loncgi::check_cookie_and_load_env()) { @@ -49,9 +51,10 @@ Your cookie information is incorrect. END return; } - - print "Content-type: text/html\n\n"; - print "\n"; + &Apache::lonlocal::get_language_handle(); + &Apache::loncommon::content_type(undef,'text/html'); + my $bodytag=&Apache::loncommon::bodytag('Creating PDF','',''); + print $bodytag; my $identifier = $ENV{'QUERY_STRING'}; my $texfile = $ENV{'cgi.'.$identifier.'.file'}; @@ -61,7 +64,6 @@ END my $tableofcontents = $ENV{'cgi.'.$identifier.'tableofcontents'}; my $tableofindex = $ENV{'cgi.'.$identifier.'tableofindex'}; my $advans_role = $ENV{'cgi.'.$identifier.'role'}; - my $back_ref = $ENV{'cgi.'.$identifier.'backref'}; my $number_of_files = $ENV{'cgi.'.$identifier.'numberoffiles'}+1; my $student_names = $ENV{'cgi.'.$identifier.'studentnames'}; my $backref = $ENV{'cgi.'.$identifier.'backref'}; @@ -87,8 +89,8 @@ END close $temporary_file; my $noteps; my %prog_state; - if ($adv) { %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Coverting Images to EPS','Picture Conversion Status',$#content_of_file); } - foreach $not_eps (@content_of_file) { + if ($adv) { %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Coverting Images to EPS','Picture Conversion Status',$#content_of_file,'inline','80'); } + foreach my $not_eps (@content_of_file) { chomp($not_eps); if ($not_eps ne '') { my $status_statement='EPS picture for '.$not_eps; @@ -98,9 +100,12 @@ END if ($eps_f=~/\/home\/([^\/]+)\/public_html\//) { $eps_f=~s/\/home\/([^\/]+)\/public_html/$1/; $eps_f = '/home/httpd/prtspool/'.$eps_f; - } else { - $eps_f=~m/\/home\/httpd\/html\/res\/(.+)/; + } elsif ($eps_f=~/$Apache::lonnet::perlvar{'lonDocRoot'}\/res\//) { + $eps_f=~m/$Apache::lonnet::perlvar{'lonDocRoot'}\/res\/(.+)/; $eps_f = '/home/httpd/prtspool/'.$1; + } elsif ($eps_f=~/$Apache::lonnet::perlvar{'lonUsersDir'}\//) { + $eps_f=~/$Apache::lonnet::perlvar{'lonUsersDir'}\/([^\/]+)\/\w\/\w\/\w\/(.+)/; + $eps_f = '/home/httpd/prtspool/'.$1.'/'.$2; } my $path=$eps_f; $path=~s/\/([^\/]+)\.eps$//; @@ -114,10 +119,10 @@ END if ($adv) { my $prettyname=$not_eps; $prettyname=~s|/home/([^/]+)/public_html|/priv/$1|; - $prettyname=~s|/home/httpd/html/|/|; + $prettyname=~s|$Apache::lonnet::perlvar{'lonDocRoot'}/|/|; &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,'Converting to EPS '.$prettyname); } $done_conversion{$not_eps}=1; - $status = $image->Read($not_eps); + my $status = $image->Read($not_eps); if ($status) {print " $status ";} $image->Set(page => '+100+200'); $status = $image->Write($eps_f); @@ -134,6 +139,7 @@ END } } if ($adv) { &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); } + unlink($figfile); } #print "$texfile\n"; #name of the tex file for debugging only my @texfile=($texfile); @@ -148,8 +154,8 @@ END my $ind=-1; my %prog_state; -if ($adv) { %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Print Status','Class Print Status',$number_of_files); } -my $final_statement="Return to last resource.

Generated PDF File for:
"; +if ($adv) { %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Print Status','Class Print Status',$number_of_files,'inline','80'); } +my $final_statement="
Return to last resource.

Generated PDF File for:
"; foreach $texfile (@texfile) { my $status_statement=''; my $link_text='download PDF'; @@ -180,7 +186,10 @@ foreach $texfile (@texfile) { my $name_file = $2; my $path_file = $1.'/'; chdir $path_file; - system("latex $name_file 1>/dev/null 2>/dev/null"); + my $dvi_file= $name_file; $dvi_file =~ s/\.tex/\.dvi/; + &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null", + "for $status_statement now LaTeXing file", + \%prog_state,$dvi_file); if ($tableofcontents eq 'yes') { system("latex $name_file 1>/dev/null 2>/dev/null"); } #to create table of contents @@ -244,7 +253,7 @@ foreach $texfile (@texfile) { } elsif ($body_log_file=~m//) { my $whereitbegins = index $body_log_file,''; - print "You are running LaTeX in the batch mode."; + print "You are running LaTeX in batch mode."; while ($whereitbegins != -1) { my $tempobegin=$whereitbegins; $whereitbegins = rindex $body_log_file,'STAMPOFPASSEDRESOURCESTART',$whereitbegins; @@ -257,23 +266,31 @@ foreach $texfile (@texfile) { my $new_name_file = $name_file; $new_name_file =~ s/\.dvi/\.ps/; my $comma = "dvips -Ppdf -G0 -o $new_name_file"; - system("$comma $name_file 1>/dev/null 2>/dev/null"); + &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null", + "for $status_statement now Converting to PS", + \%prog_state,$new_name_file); if (-e $new_name_file) { print "

PDF output file (see link below)

\n"; $new_name_file =~ m/^(.*)\./; - my $tempo_file = $1.'temporar.ps'; - my $name_file = $1.'.pdf'; + my $ps_file = my $tempo_file = $1.'temporar.ps'; + my $pdf_file = $1.'.pdf'; if ($laystyle eq 'album' and $numberofcolumns eq '2') { $comma = "psnup -2 -s1.0 $new_name_file"; - system("$comma $tempo_file 1>/dev/null 2>/dev/null"); - system("ps2pdf $tempo_file $name_file 1>/dev/null 2>/dev/null"); + &busy_wait_command("$comma $tempo_file 1>/dev/null 2>/dev/null", + "for $status_statement now Modifying PS layout", + \%prog_state,$tempo_file); } elsif ($laystyle eq 'book' and $numberofcolumns eq '2') { $comma = 'pstops -pletter "2:0+1(0.48w,0)"'; - system("$comma $new_name_file $tempo_file 1>/dev/null 2>/dev/null"); - system("ps2pdf $tempo_file $name_file 1>/dev/null 2>/dev/null"); + &busy_wait_command("$comma $new_name_file $tempo_file 1>/dev/null 2>/dev/null", + "for $status_statement now Modifying PS layout", + \%prog_state,$tempo_file); } else { - system("ps2pdf $new_name_file $name_file 1>/dev/null 2>/dev/null"); + $ps_file=$new_name_file; } + &busy_wait_command("ps2pdf $ps_file $pdf_file 1>/dev/null 2>/dev/null", + "for $status_statement now Converting PS to PDF", + \%prog_state, $pdf_file); + my $texlog = $texfile; my $texaux = $texfile; my $texdvi = $texfile; @@ -285,7 +302,7 @@ foreach $texfile (@texfile) { my @garb = ($texaux,$texdvi,$texps); # unlink @garb; unlink $duefile; - print "Your PDF document"; + print "Your PDF document"; if ($advans_role) { print "

"; print "The link to "; @@ -313,24 +330,32 @@ foreach $texfile (@texfile) { my $new_name_file = $name_file; $new_name_file =~ s/\.dvi/\.ps/; my $comma = "dvips -Ppdf -G0 -o $new_name_file"; - system("$comma $name_file 1>/dev/null 2>/dev/null"); + &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null", + "for $status_statement now Converting to PS", + \%prog_state,$new_name_file); if (-e $new_name_file) { print "
$final_statement "; $final_statement=''; $new_name_file =~ m/^(.*)\./; - my $tempo_file = $1.'temporar.ps'; - my $name_file = $1.'.pdf'; + my $ps_file = my $tempo_file = $1.'temporar.ps'; + my $pdf_file = $1.'.pdf'; if ($laystyle eq 'album' and $numberofcolumns eq '2') { $comma = "psnup -2 -s1.0 $new_name_file"; - system("$comma $tempo_file 1>/dev/null 2>/dev/null"); - system("ps2pdf $tempo_file $name_file 1>/dev/null 2>/dev/null"); + &busy_wait_command("$comma $tempo_file 1>/dev/null 2>/dev/null", + "for $status_statement now Modifying PS layout", + \%prog_state,$tempo_file); } elsif ($laystyle eq 'book' and $numberofcolumns eq '2') { $comma = 'pstops -pletter "2:0+1(0.48w,0)"'; - system("$comma $new_name_file $tempo_file 1>/dev/null 2>/dev/null"); - system("ps2pdf $tempo_file $name_file 1>/dev/null 2>/dev/null"); + &busy_wait_command("$comma $new_name_file $tempo_file 1>/dev/null 2>/dev/null", + "for $status_statement now Modifying PS layout", + \%prog_state,$tempo_file); } else { - system("ps2pdf $new_name_file $name_file 1>/dev/null 2>/dev/null"); - } + $ps_file=$new_name_file; + } + &busy_wait_command("ps2pdf $ps_file $pdf_file 1>/dev/null 2>/dev/null", + "for $status_statement now Converting PS to PDF", + \%prog_state,$pdf_file); + my $texlog = $texfile; my $texaux = $texfile; my $texdvi = $texfile; @@ -342,7 +367,7 @@ foreach $texfile (@texfile) { my @garb = ($texlog,$texaux,$texdvi,$texps); # unlink @garb; unlink $duefile; - print "$link_text"; + print "$link_text"; print "\n"; } } @@ -367,6 +392,31 @@ if ($number_of_files>1) { } if ($adv) { &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); } +my $done; +sub REAPER { + $done=1; +} + +sub busy_wait_command { + my ($command,$message,$progress_win,$output_file)=@_; + + $SIG{CHLD} = \&REAPER; + $done=0; + my $pid=open(CMD,"$command |"); + &Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,$message); + while(!$done) { + sleep 1; + my $extra_msg; + if ($output_file) { + my $size=(stat($output_file))[7]; + $extra_msg=", $size bytes generated"; + } + &Apache::lonhtmlcommon::Update_PrgWin('',$progress_win, + $message.$extra_msg); + } + $SIG{CHLD}='IGNORE'; + close(CMD); +}