--- loncom/interface/printout.pl 2006/12/18 11:34:55 1.117
+++ loncom/interface/printout.pl 2008/01/28 11:24:48 1.129
@@ -1,6 +1,7 @@
#!/usr/bin/perl
# CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc.
#
+# $Id: printout.pl,v 1.129 2008/01/28 11:24:48 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -38,6 +39,7 @@ use Apache::loncommon();
use Apache::lonlocal;
use Apache::lonmsg();
use LONCAPA::Enrollment;
+use LONCAPA::Configuration;
use strict;
@@ -127,8 +129,8 @@ sub send_error_mail {
foreach my $line (@$texfile) {
$message .= "$line\n";
}
- my (undef, %receivers) = &Apache::lonfeedback::decide_receiver(undef, 0,
- 1,1,1);
+ my (undef, %receivers) = &Apache::lonmsg::decide_receiver(undef, 0,
+ 1,1,1);
# print "
sending...section: $env{'request.course.sec'}";
foreach my $dest (keys %receivers) {
# print "
dest is $dest";
@@ -160,9 +162,11 @@ Your cookie information is incorrect.
END
return;
}
+
+my %perlvar=%{&LONCAPA::Configuration::read_conf('loncapa.conf')};
&Apache::lonlocal::get_language_handle();
&Apache::loncommon::content_type(undef,'text/html');
-
+$env{'request.noversionuri'} = '/cgi-bin/printout.pl';
print(&Apache::loncommon::start_page('Creating PDF'));
my $identifier = $ENV{'QUERY_STRING'};
@@ -183,13 +187,14 @@ END
if ($student_names=~/_END_/) {
@names_pack=split(/_ENDPERSON_/,$student_names);
}
-
-print "Return to last resource.
";
-
+ if ($backref) {
+ print('
'.&mt("[_1]Return[_2] to editing resource.",
+ "","").'
');
+ }
my $figfile = $texfile;
- $figfile =~ s/^([^\.]+printout)[^t]+\.tex/$1\.dat/;
+ $figfile =~ s/^(.*_printout)_\d+_\d+_\d+\.tex/$1\.dat/;
my $duefile = $texfile;
- $duefile =~ s/^([^\.]+printout)[^t]+\.tex/$1\.due/;
+ $duefile =~ s/^(.*_printout)_\d+_\d+_\d+\.tex/$1\.due/;
#do we have figures?
# print "Figure file: $figfile\n";
if (-e $figfile) {
@@ -213,13 +218,13 @@ print "ReturnReturn/dev/null 2>/dev/null",
"for $status_statement now LaTeXing file",
- \%prog_state,$dvi_file);
+ \%prog_state,$dvi_file, 10);
if ($tableofcontents eq 'yes') {
&busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
"for $status_statement First LaTeX of file for table of contents",
- \%prog_state,$dvi_file);
+ \%prog_state,$dvi_file, 10);
&busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
"for $status_statement Second LaTeX of file for table of contents",
- \%prog_state,$dvi_file);
+ \%prog_state,$dvi_file,10);
} #to create table of contents
my $idxname=$name_file;
$idxname=~s/\.tex$/\.idx/;
@@ -391,7 +396,7 @@ foreach $texfile (@texfile) {
\%prog_state,$idxname);
&busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
"for $status_statement now LaTeXing file for index section",
- \%prog_state,$dvi_file);
+ \%prog_state,$dvi_file,10);
} #to create index
#Do we have a latex error in the log file?
my $logfilename = $texfile; $logfilename =~ s/\.tex$/\.log/;
@@ -440,7 +445,7 @@ foreach $texfile (@texfile) {
print "\n";
# print "
Advanced role
";
print "The link to ";
- $logfilename=~s/\/home\/httpd//;
+ $logfilename=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
print "Your log file ";
print "\n";
#link tooriginal LaTeX file (included according Michael Hamlin desire)
@@ -453,7 +458,7 @@ foreach $texfile (@texfile) {
print $tex_temporary_file 'LOGFILE'.$body_tex_file.'
'."\n";
print "
";
print "The link to ";
- $texfile=~s/\/home\/httpd//;
+ $texfile=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
print "Your original LaTeX file ";
print "\n";
my $help_text = &Apache::loncommon::help_open_topic("Print_Resource", "Help on printing");
@@ -507,27 +512,27 @@ foreach $texfile (@texfile) {
#
&busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
"for $status_statement first latex to repaginate",
- \%prog_state, $name_file);
+ \%prog_state, $name_file,10);
if ($tableofcontents eq 'yes') {
&busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
"for $status_statement second latex to repaginate",
- \%prog_state, $name_file);
+ \%prog_state, $name_file,10);
&busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
"for $status_statement third latex to repaginate",
- \%prog_state, $name_file);
+ \%prog_state, $name_file,10);
}
if ($tableofindex eq 'yes') {
my $idxname = $latex_file;
$idxname =~ s/\.tex$/\.idx/;
- &busy_wait_command("makindex $idxname",
+ &busy_wait_command("makeindex $idxname",
"Re-creating index file",
\%prog_state, $idxname);
&busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
"for $status_statement now Recreting index (latex)",
- \%prog_state, $dvi_file);
+ \%prog_state, $dvi_file,10);
}
- &busy_wait_command("$comma $name_file 1>dev/null 2>/dev/null",
+ &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
"for $status_statement dvips to repaginate",
\%prog_state, $new_name_file);
#
@@ -558,9 +563,8 @@ foreach $texfile (@texfile) {
#print("
Missing fonts file is: $missfonts_file");
if (-e $missfonts_file) {
#print("
Missing fonts file exists\n");
- &create_missing_fonts($missfonts_file);
- unlink($missfonts_file, \%prog_state);
- &busy_wait_command("$comma $name_file 1>dev/null 2>/dev/null",
+ &create_missing_fonts($missfonts_file,\%prog_state);
+ &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
"for $status_statement dvips generated missing fonts",
\%prog_state, $new_name_file);
}
@@ -604,13 +608,15 @@ foreach $texfile (@texfile) {
$texps =~ s/\.tex/\.ps/;
my @garb = ($texaux,$texdvi,$texps);
# unlink @garb;
- unlink $duefile;
+ unlink($duefile);
print "Your PDF document";
+ unlink($missfonts_file);
+
}
if ($advanced_role) {
print "
";
print "The link to ";
- $logfilename=~s/\/home\/httpd//;
+ $logfilename=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
print "Your log file ";
print "\n";
#link tooriginal LaTeX file (included according Michael Hamlin desire)
@@ -623,10 +629,11 @@ foreach $texfile (@texfile) {
print $tex_temporary_file 'LOGFILE'.$body_tex_file.'
'."\n";
print "
";
print "The link to ";
- $texfile=~s/\/home\/httpd//;
+ $texfile=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
print "Your original LaTeX file ";
print "\n";
}
+
} else {
#LaTeX successfully parsed tex file
$name_file =~ s/\.tex/\.dvi/;
@@ -667,9 +674,8 @@ foreach $texfile (@texfile) {
#print("
Missing fonts file is: $missfonts_file");
if (-e $missfonts_file) {
#print("
Missing fonts file exists\n");
- &create_missing_fonts($missfonts_file);
- unlink($missfonts_file);
- &busy_wait_command("$comma $name_file 1>dev/null 2>/dev/null",
+ &create_missing_fonts($missfonts_file,\%prog_state);
+ &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
"for $status_statement dvips generated missing fonts",
\%prog_state, $new_name_file);
}
@@ -679,14 +685,14 @@ foreach $texfile (@texfile) {
&repaginate($new_name_file, $latex_file, $numberofcolumns);
&busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
"for $status_statement first latex to repaginate",
- \%prog_state, $name_file);
+ \%prog_state, $name_file,10);
if ($tableofcontents eq 'yes') {
&busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
"for $status_statement second latex to repaginate",
- \%prog_state, $name_file);
+ \%prog_state, $name_file,10);
&busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
"for $status_statement third latex to repaginate",
- \%prog_state, $name_file);
+ \%prog_state, $name_file,10);
}
if ($tableofindex eq 'yes') {
my $idxname = $latex_file;
@@ -696,7 +702,7 @@ foreach $texfile (@texfile) {
\%prog_state, $idxname);
&busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
"for $status_statement now Recreting index (latex)",
- \%prog_state, $dvi_file);
+ \%prog_state, $dvi_file,10);
}
&busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
"for $status_statement dvips to repaginate",
@@ -755,10 +761,12 @@ foreach $texfile (@texfile) {
$texps =~ s/\.tex/\.ps/;
my @garb = ($texlog,$texaux,$texdvi,$texps);
# unlink @garb;
- unlink $duefile;
+ unlink($duefile);
print "$link_text - click here to download pdf";
print "\n";
}
+ unlink($missfonts_file);
+
}
} else {
print "LaTeX file $texfile was not created successfully";
@@ -776,7 +784,7 @@ if ($number_of_files>1) {
print("Zip Output:\n");
system($statement);
print("
");
- $zipfile=~s/\/home\/httpd//;
+ $zipfile=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
print "
A ZIP file of all the PDFs.";
}
if ($advanced_role) { &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); }
@@ -786,9 +794,17 @@ my $done;
sub REAPER {
$done=1;
}
-
+#
+# Execute a command updating the status window as the command's
+# output file builds up (at intervals of a second).
+#
+# If the timeout argument defined, then if that many seconds
+# elapses without an increase in the size of the output file,
+# the command will be killed (this deals with the case when
+# latex crawls into an infinite loop).
+#
sub busy_wait_command {
- my ($command,$message,$progress_win,$output_file)=@_;
+ my ($command,$message,$progress_win,$output_file, $timeout)=@_;
$SIG{CHLD} = \&REAPER;
$done=0;
@@ -796,12 +812,23 @@ sub busy_wait_command {
if ($advanced_role) {
&Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,$message);
}
+ my $last_size = 0;
+ my $unchanged_time = 0;
while(!$done) {
sleep 1;
my $extra_msg;
if ($output_file) {
my $size=(stat($output_file))[7];
$extra_msg=", $size bytes generated";
+ if ($size == $last_size) {
+ $unchanged_time++;
+ if ($timeout && ($unchanged_time > $timeout)) {
+ kill(9, $pid); # Reaper will do the rest...I hope there's errors in the log.
+ }
+ } else {
+ $last_size = $size;
+ $unchanged_time = 0;
+ }
}
if ($advanced_role) {
&Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,
@@ -861,8 +888,8 @@ sub repaginate {
# bottom of the page, m the page number within the document.
#
- if ($line =~ /^%%Page:/) {
- my @pageinfo = split(/ /, $line);
+ if ($line =~ /^%%Page:\s+\d+\s+\d+/) {
+ my @pageinfo = split(/\s+/, $line);
if ($page_number < $pageinfo[1]) {
$page_number = $pageinfo[1];
} elsif ($pageinfo[2] ne 1) {
@@ -962,16 +989,19 @@ sub create_missing_fonts {
# Open and read in the font file..we'll read it into the array
# font_commands.
#
- my $font_handle = IO::File->new($fontfile);
+ open(my $font_handle, $fontfile);
my @font_commands = <$font_handle>;
-
+
+ # make the list contain each command only once
+ my %uniq;
+ @font_commands = map { $uniq{$_}++ == 0 ? $_ : () } @font_commands;
# Now process each command replacing the appropriate 8000's with
# 600's ensuring that font names with 8000's in them are not corrupted.
# and if the --mfmode is not ljfour we turn it into ljfour.
# Then we execute the command.
#
-
+
foreach my $command (@font_commands) {
#print("
Raw command: $command");
$command =~ s/ 8000/ 600/g; # dpi directives.
@@ -988,9 +1018,9 @@ sub create_missing_fonts {
$command = join(" ", (@cmdarray));
#print("
Creating fonts via command: $command");
- &busy_wait_command("$command 1>dev/null 2>/dev/null",
+ &busy_wait_command("$command 1>/dev/null 2>/dev/null",
"Creating missing font",
- $state, $command);
+ $state);
}