[LON-CAPA-cvs] cvs: loncom /interface printout.pl

foxr lon-capa-cvs-allow@mail.lon-capa.org
Wed, 26 Mar 2008 09:50:22 -0000


This is a MIME encoded message

--foxr1206525022
Content-Type: text/plain

foxr		Wed Mar 26 05:50:22 2008 EDT

  Modified files:              
    /loncom/interface	printout.pl 
  Log:
  Factored the analysis of the logfile out of the main-line of printing.
  This drops out a ton of duplicate code that had been in the mainline.
  Appears to still work too!
  
  
--foxr1206525022
Content-Type: text/plain
Content-Disposition: attachment; filename="foxr-20080326055022.txt"

Index: loncom/interface/printout.pl
diff -u loncom/interface/printout.pl:1.134 loncom/interface/printout.pl:1.135
--- loncom/interface/printout.pl:1.134	Tue Mar 18 06:29:56 2008
+++ loncom/interface/printout.pl	Wed Mar 26 05:50:21 2008
@@ -1,7 +1,7 @@
 #!/usr/bin/perl
 # CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc.
 #
-# $Id: printout.pl,v 1.134 2008/03/18 10:29:56 foxr Exp $
+# $Id: printout.pl,v 1.135 2008/03/26 09:50:21 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -45,6 +45,11 @@
 
 my $busy_wait_timeout = 30; 
 
+sub debug {
+    my ($text) = @_;
+    print "$text <br />\n";
+}
+
 #   Determine if a user is operating as a student for this course/domain.
 #Parameters:
 #    none
@@ -234,35 +239,59 @@
 #     End of figure conversion section:
 #
 #--------------------------------------------------------------------------------------------
+#
+#  Figure out which Tex files we need to process.  If this is a large class e.g.
+#  the instructor may have asked that the printout be by section, one section per file
+#  in that case, the output tex fiels will be the base filename with 3 digit serial numbers
+#  just prior to the .tex file type.
+#  By the time this loop exits, @texfile is an array of the files to process.
+#
 
+my @texfile=($texfile);
+if ($number_of_files>1) {
+    @texfile=();
+    for (my $i=1;$i<=$number_of_files;$i++) {
+	my $new_texfile=$texfile;
+	$new_texfile=~s/\.tex//;
+	$new_texfile = sprintf("%s_%03d.tex", $new_texfile,$i);
+	push @texfile,$new_texfile;
+    } 
+}
 
-
-
-  #print "$texfile\n"; #name of the tex file for debugging only   
-  my @texfile=($texfile);
-  if ($number_of_files>1) {
-      @texfile=();
-      for (my $i=1;$i<=$number_of_files;$i++) {
-	  my $new_texfile=$texfile;
-	  $new_texfile=~s/\.tex//;
-	  $new_texfile = sprintf("%s_%03d.tex", $new_texfile,$i);
-	  push @texfile,$new_texfile;
-      } 
-  }
+#--------------------------------------------------------------------------------------------
 
 my $ind=-1;
+
 my %prog_state;
-if ($advanced_role) { %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Print Status','Class Print Status',$number_of_files,'inline','80'); }
+if ($advanced_role) { 
+    %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Print Status','Class Print Status',$number_of_files,'inline','80'); 
+}
 print "<br />";
-my $num_files = @texfile;
+my $num_files = @texfile;	# How does this differ from $number_of_files , can that be 0?
+
+
+
+
 foreach $texfile (@texfile) {
   my $status_statement='';
   my $link_text='download PDF';
   $ind++;
+
+  #---------------------------------------------------------------------------------------
+  #  This chunk of code 
+  #  determines the status message for the printout, and the download link text.
+  #  If the print is for one or more students, both will contain the range of students
+  #  covered by this file.
+  #  
+
   my @stud_info=split(/_END_/,$names_pack[$ind]);
-  my @tempo_array=split(/:/,$stud_info[0]);
+  my @tempo_array=split(/:/,$stud_info[0]);       # username:domain:section:full name:...
   my $name;
   my $name_range='';
+
+  # $name       -> Either user's full name or username@domain
+  # $name_range -> Either user's last name or usrname.
+
   if ($tempo_array[3]) {
       $name=$tempo_array[3];
       ($name_range) = split(/,/,$name, 2);
@@ -270,10 +299,20 @@
       $name=$tempo_array[0].'@'.$tempo_array[1];
       $name_range = $tempo_array[0];
   }
+
+  # If there truly is a name add it to the status text so we know which
+  # user is getting printed.
+  #
+
   if (($name ne "") && ($name ne '@') ) { # Could be printing codes...
       $link_text='<b>'.$name.'</b>';
       $status_statement.=$name;
   }
+
+  # Group of students being printed...
+  # $name_range -> first student's name - last student's name
+  #
+
   if ($#stud_info>0) {
       @tempo_array=split(/:/,$stud_info[-1]);
       if ($tempo_array[3]) {
@@ -290,286 +329,73 @@
   
       }
   }
-  if(($num_files > 1) && ($link_text eq 'download PDF')) { # Printing codes
+
+  # $name_range is the range of names in this file.
+  # $name is the first of the names in this file.
+  #
+  #-----------------------------------------------------------------------
+
+  #  If the number of files is > 1, but we don't have multiple
+  #  student names, we must be printing an exam from codes.
+  #  The download link becomes the filename (basename.tex
+  #  The status info has the basename appended to it.
+  #
+  if(($num_files > 1) && ($link_text eq 'download PDF')) {
       $link_text = '<b>'.basename($texfile,'.tex').'.pdf</b>';
       $status_statement .= basename($texfile);
   }
+
+
+  #------------------------------------------------------------------------
+
   $name_range =~ s/'//g;	# O'Neil -> ONeil e.g.
+
+
   print "<br/>";
-  if ($advanced_role) { &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,'Creating PDF for '.$status_statement); }
-  #  This little piece of dirt puts username ranges into the original tex
-  #  Tex filename from which they'll propagate into the other filenames as well.
-  #
-  if (-e $texfile) {
+  if ($advanced_role) { 
+      &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,'Creating PDF for '.$status_statement); 
+  }
+
+  if (-e $texfile) {		# Ensure the tex file exists:
+
+      #---------------------------------------------------------------------
+      #
+      #  Put username ranges into the original tex
+      #  Tex filename from which they'll propagate into the other filenames as well.
+      #
+
       if (($name_range ne '') && ($num_files > 1)) {
 	  my $newtexfile = $texfile;
 	  $newtexfile    =~ s/\.tex/$name_range\.tex/;
 	  rename($texfile, $newtexfile);
 	  $texfile       = $newtexfile;
       }
+
+      #---------------------------------------------------------------------
+
       $texfile =~ m/^(.*)\/([^\/]+)$/; 
       my $name_file = $2;
       my $path_file = $1.'/';
       chdir $path_file;
       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, $busy_wait_timeout);
-      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, $busy_wait_timeout);
-      &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,$busy_wait_timeout);
-      } #to create table of contents
-      my $idxname=$name_file;
-      $idxname=~s/\.tex$/\.idx/;
-      if ($tableofindex eq 'yes') {
-	  &busy_wait_command("makeindex $idxname",
-			     "making index file",
-			     \%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, $busy_wait_timeout);
-      } #to create index
-      #Do we have a latex error in the log file?
-      my $logfilename = $texfile; $logfilename =~ s/\.tex$/\.log/;
-      my $temporary_file=IO::File->new($logfilename) || die "Couldn't open log file $logfilename for reading: $!\n";
-      my @content_of_file = <$temporary_file>;
-      close $temporary_file; 
-      my $body_log_file = join(' ',@content_of_file);
-      $logfilename =~ s/\.log$/\.html/;
-      $temporary_file = IO::File->new('>'.$logfilename); 
-      print $temporary_file '<html><head><title>LOGFILE</title></head><body><pre>'.$body_log_file.'</pre></body></html>'."\n";
-      if ($body_log_file=~m/!\s+Emergency stop/) {
-	  my $whereitbegins = rindex $body_log_file,'STAMPOFPASSEDRESOURCESTART';
-	  my $whereitends = rindex $body_log_file,'STAMPOFPASSEDRESOURCEEND';
-	  my $badresource;
-	  my $badtext;
-	  if ($whereitbegins!=-1 and $whereitends!=-1) {
-	      $badtext = substr($body_log_file,$whereitbegins+26, $whereitends-$whereitbegins-26);
-	      $whereitbegins  = rindex $badtext,'located in';
-	      if ($whereitbegins != -1) {
-		  
-		  $badresource = substr($badtext, $whereitbegins+27, 
-					length($badtext) - $whereitbegins - 48);
-		  # print "<br />failing resourcename: $badresource<br />";
-	      }
-	  }
-	  
-          if ($advanced_role) {  
-	      #LaTeX failed to parse tex file 
-	      print "<h2>LaTeX could not successfully parse your tex file.</h2>";
-	      print "It probably has errors in it.<br />";
-	      print "With very high probability this error occured in ".$badtext."<br /><br />";
-	      print "Here are the error messages in the LaTeX log file<br /><pre>";
-
-	      my $sygnal = 0;
-	      for (my $i=0;$i<=$#content_of_file;$i++) {
-		  if ($content_of_file[$i]=~m/^Runaway argument?/ or $content_of_file[$i]=~m/^!/) {
-		      $sygnal = 1;
-		  } 
-		  if ($content_of_file[$i]=~m/Here is how much of/) {
-		      $sygnal = 0;
-		  } 
-		  if ($sygnal) {
-		      print "$content_of_file[$i]";
-		  }  
-	      }
-	      print "</pre>\n";
-	      # print "<br /> Advanced role <br />";
-              print "<b><big>The link to ";
-              $logfilename=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
-	      print "<a href=\"$logfilename\">Your log file </a></big></b>";
-	      print "\n";
-              #link to original LaTeX file
-	      my $tex_temporary_file=IO::File->new($texfile) || die "Couldn't open tex file $texfile for reading: $!\n";
-	      my @tex_content_of_file = <$tex_temporary_file>;
-	      close $tex_temporary_file; 
-	      my $body_tex_file = join(' ',@tex_content_of_file);
-	      $texfile =~ s/\.tex$/aaaaa\.html/;
-	      $tex_temporary_file = IO::File->new('>'.$texfile); 
-	      print $tex_temporary_file '<html><head><title>LOGFILE</title></head><body><pre>'.$body_tex_file.'</pre></body></html>'."\n";
-	      print "<br /><br />";
-	      print "<b><big>The link to ";
-              $texfile=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
-	      print "<a href=\"$texfile\">Your original LaTeX file </a></big></b>";
-	      print "\n";
-	      my $help_text = &Apache::loncommon::help_open_topic("Print_Resource", "Help on printing");
-	      print ("$help_text");
+      &make_dvi_file($name_file,
+		     $dvi_file,
+		     $tableofcontents,
+		     $tableofindex,
+		     $status_statement,
+		     \%prog_state,
+		     $busy_wait_timeout);
 
-	  } else {		# Student role...
-	      #  at this point:
-	      #    $body_log_file - contains the log file.
-              #    $name_file     - is the name of the LaTeX file.
-              #    $identifier    - is the unique LaTeX identifier.l
-
-	      print "<br />There are errors in $badtext";
-	      print "<br />These errors prevent this resource from printing correctly";
-	      my $tex_handle = IO::File->new($name_file);
-	      my @tex_contents = <$tex_handle>;
-	      &send_error_mail($identifier, $badresource, $body_log_file, \@tex_contents);
-	      print "<br />A message has been sent to the instructor describing this failure<br />";
-	      my $help_text = &Apache::loncommon::help_open_topic("Print_Resource", "Help on printing");
-	      print  ("$help_text");
 
-	  }
-
-      } elsif ($body_log_file=~m/<inserted text>/) {
-	  my $whereitbegins = index $body_log_file,'<inserted text>';
-	  print "You are running LaTeX in <b>batch mode</b>.";
-	  while ($whereitbegins != -1) {
-	      my $tempobegin=$whereitbegins;
-	      $whereitbegins = rindex $body_log_file,'STAMPOFPASSEDRESOURCESTART',$whereitbegins;
-	      my $whereitends = index $body_log_file,'STAMPOFPASSEDRESOURCEEND',$whereitbegins;
-	      print "<br />It has found an error in".substr($body_log_file,$whereitbegins+26,$whereitends-$whereitbegins-26)." <br /> and corrected it.\n";
-	      print "Usually this correction is valid but you probably need to check the indicated resource one more time and implement neccessary corrections by yourself.\n";
-	      $whereitbegins = index $body_log_file,'<inserted text>',$tempobegin+10;
-	  }
-	  $name_file =~ s/\.tex/\.dvi/;
-	  my $new_name_file = $name_file;
-	  $new_name_file =~ s/\.dvi/\.ps/;
-	  my $papera=$paper;
-	  if ($papera eq 'letter') {$papera='';}
-	  if ($papera ne '') {$papera='-t'.$papera;}
-	  my $comma = "dvips $papera -Ppdf -G0 -o $new_name_file";
-	  &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) {
-	      my $latex_file = $name_file;
-	      $latex_file    =~ s/\.dvi/\.tex/;
-	      &repaginate($new_name_file, $latex_file, $numberofcolumns);
-	      #
-	      #  Now have to re-latex, re dvips again to 
-	      #  get the repaginated postscript.
-	      #
-	      &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
-				 "for $status_statement first latex to repaginate",
-				 \%prog_state, $name_file,$busy_wait_timeout);
-	      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,$busy_wait_timeout);
-		  &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
-				     "for $status_statement third latex to repaginate",
-				     \%prog_state, $name_file,$busy_wait_timeout);
-	      }
-	      if ($tableofindex eq 'yes') {
-		  my $idxname = $latex_file;
-		  $idxname =~ s/\.tex$/\.idx/;
-		  &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,$busy_wait_timeout);
+      #Do we have a latex error in the log file?
 
-	      }
-	      &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
-				 "for $status_statement dvips to repaginate",
-				 \%prog_state, $new_name_file);
-	      #
-	      #  One last little hinky kinky thing.
-	      #  It's just possible that some fonts could not be maded
-	      #  at the resolution of the pdf print driver.
-	      #  In that case a file called missfont.log will have been
-	      #  created that will contain the commands that were attempted
-	      # to create the missing fonts.  If we basically
-	      # take all the 8000 strings in that file, and
-	      # replace them with 600 (the ljfour resolution)
-	      # run the commands in that file and redvips,
-	      # we'll be able to print the missing glyphs at 600dpi.
-	      #
-	      # Supposedly it is possible to tune TeX/Metafont to do this
-	      # right but I failed to get that to work when following the
-	      # docs at the tug site, hence this rather kludgey fix.
-	      #
-	      #  We make the (I think) reasonable assumption that
-	      #  missing glyphs won't change the pagination and I think
-	      #  this is true because TeX/dvips will leave a space
-	      #  instead of these glyphs based on the font metrics
-	      #  (fancy way to say there will be a blank the size of the missing
-	      #  glyphs).
-	      #
-	      my $print_directory = dirname($name_file);
-	      my $missfonts_file  = $print_directory."/missfont.log";
-	      #print("<br /> Missing fonts file is: $missfonts_file");
-	      if (-e $missfonts_file) {
-		  #print("<br />Missing fonts file exists\n");
-		  &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);
-	      }
 
-	      #
-	      print "\n<h1>PDF output file (see link below)</h1>\n";
-	      $new_name_file =~ m/^(.*)\./;
-	      my $ps_file = my $tempo_file = $1.'temporar.ps';
-	      my $pdf_file = $1.'.pdf';
-	      if ($laystyle eq 'album' and $numberofcolumns eq '2') {
-		  my $papera=$paper;
-                  if ($papera eq 'letter') {$papera='';}
-		  if ($papera ne '') {$papera='-p'.$papera;}
-		  $comma = "psnup $papera -2 -s1.0 $new_name_file";
-		  &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') {
-		  my $papera=$paper;
-                  if ($papera eq 'letter') {$papera='';}
-		  if ($papera ne '') {$papera='-p'.$papera;}
-		  $comma = 'pstops '.$papera.' "2:0+1(0.48w,0)"';
-		  &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 {
-		  $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 $logfilename = $texfile; $logfilename =~ s/\.tex$/\.log/;
 
-	      my $texlog = $texfile;
-	      my $texaux = $texfile;
-	      my $texdvi = $texfile;
-	      my $texps = $texfile;
-	      $texlog =~ s/\.tex/\.log/;
-	      $texaux =~ s/\.tex/\.aux/;
-	      $texdvi =~ s/\.tex/\.dvi/;
-	      $texps =~ s/\.tex/\.ps/;
-	      my @garb = ($texaux,$texdvi,$texps);
-#	  unlink @garb;
-	      unlink($duefile);
-	      print "<a href=\"/prtspool/$pdf_file\">Your PDF document</a>";
-	      unlink($missfonts_file);
 
-	  }
-	  if ($advanced_role) {  
-	      print "<br /><br />";
-	      print "<b><big>The link to ";
-              $logfilename=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
-	      print "<a href=\"$logfilename\">Your log file </a></big></b>";
-	      print "\n";
-	      #link to original LaTeX file
-	      my $tex_temporary_file=IO::File->new($texfile) || die "Couldn't open tex file $texfile for reading: $!\n";
-	      my @tex_content_of_file = <$tex_temporary_file>;
-	      close $tex_temporary_file; 
-	      my $body_tex_file = join(' ',@tex_content_of_file);
-	      $texfile =~ s/\.tex$/aaaaa\.html/;
-	      $tex_temporary_file = IO::File->new('>'.$texfile); 
-	      print $tex_temporary_file '<html><head><title>LOGFILE</title></head><body><pre>'.$body_tex_file.'</pre></body></html>'."\n";
-	      print "<br /><br />";
-	      print "<b><big>The link to ";
-              $texfile=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
-	      print "<a href=\"$texfile\">Your original LaTeX file </a></big></b>";
-	      print "\n";
-	  }
+      if (&analyze_logfile($logfilename, $texfile, $advanced_role)) {
+	  
 
-      } else {
 	  #LaTeX successfully parsed tex file 
 	  $name_file =~ s/\.tex/\.dvi/;
 	  my $new_name_file = $name_file;
@@ -597,13 +423,7 @@
 	  # right but I failed to get that to work when following the
 	  # docs at the tug site, hence this rather kludgey fix.
 	  #
-	  #  We make the (I think) reasonable assumption that
-	  #  missing glyphs won't change the pagination and I think
-	  #  this is true because TeX/dvips will leave a space
-	  #  instead of these glyphs based on the font metrics
-	  #  (fancy way to say there will be a blank the size of the missing
-	  #  glyphs).
-	  #
+
 	  my $print_directory = dirname($name_file);
 	  my $missfonts_file  = $print_directory."/missfont.log";
 	  #print("<br /> Missing fonts file is: $missfonts_file");
@@ -618,27 +438,16 @@
 	      my $latex_file = $name_file;
 	      $latex_file =~ s/\.dvi/\.tex/;
 	      &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, $busy_wait_timeout);
-	      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,  $busy_wait_timeout);
-		  &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
-				     "for $status_statement third latex to repaginate",
-				     \%prog_state, $name_file, $busy_wait_timeout);
-	      }
-	      if ($tableofindex eq 'yes') {
-		  my $idxname = $latex_file;
-		  $idxname    =~ s/\.tex$/\.idx/;
-		  &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, $busy_wait_timeout);
-	      }
+
+	      &make_dvi_file($latex_file,
+			     $name_file,
+			     $tableofcontents,
+			     $tableofindex,
+			     $status_statement,
+			     \%prog_state,
+			     $busy_wait_timeout);
+
+
 	      &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
 				 "for $status_statement dvips to repaginate",
 				 \%prog_state, $new_name_file);
@@ -781,6 +590,66 @@
     close(CMD);
 }
 
+# Make the dvi file (or rather try to), from the latex file and the
+# various bits and pieces that control how the latex file is processed:
+# LaTeX is run as many times a needed to make this all happen... this may
+# result in several runs of LaTeX that just are errors if the LaTeX is
+# bad, butthe printing subsystem is _supposed_ to not do that.
+#
+# Parameters:
+#   name_file        - Name of the LaTeX file to process.
+#   dvi_file         - Name of resulting dvi file.
+#   tableofcontents  - "yes" if we are supposed to make a table of contents.
+#   tableofindex     - "yes" if we are suposed to make an index.
+#   status_statement - Part of the status statement for ths status window.
+#   prog_state       - Reference to the program state hash.
+#   busy_wait_timeout- Seconds without any progress that imply a problem.
+#
+#
+sub make_dvi_file {
+    my ($name_file,
+	$dvi_file,
+	$tableofcontents,
+	$tableofindex,
+	$status_statement,
+	$prog_state,
+	$busy_wait_timeout) = @_;
+    
+    
+    &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
+		       "for $status_statement now LaTeXing file",
+		       $prog_state,$dvi_file, $busy_wait_timeout);
+
+    # If the tableof contents was requested, we need to run 
+    # LaTex a couple more times to get all the references sorted out.
+
+    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, $busy_wait_timeout);
+	&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,$busy_wait_timeout);
+    } 
+
+    # And makeindex and another run of LaTeX to incorporate it if the index
+    # is enabled.
+
+
+    if ($tableofindex eq 'yes') {
+	my $idxname=$name_file;
+	$idxname=~s/\.tex$/\.idx/;
+	&busy_wait_command("makeindex $idxname",
+			   "making index file",
+			   $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, $busy_wait_timeout);
+    } 
+    
+}    
+
+
 #  Repagninate
 #  What we need to do:
 #   - Count the number of pages in each student.
@@ -1053,3 +922,159 @@
     }
     
 }
+#
+#   Analyze a LaTeX logfile producing appropriate  output on error and 
+#   returning a boolean to let the caller know if, in our opinion, it's
+#   worth continuing on to produce the PDF file.
+#
+# Parameters:
+#   logfilename   - Name of the logfile.
+#   texfile       - Name of the LaTeX file that was being processed.
+#   advanced_role - True if the user is privileged with respect to the printout
+#                   (e.g. is the course coordinator or some such thing).
+# Returns:
+#    1            - Caller is advised to continue to create the PDF.
+#    0            - Caller need not bother creating the PDF.
+# Side Effects:
+#   Messages are printed to describe any errors that have been encountered.
+# NOTE:
+#    The current policy is to assume that if LaTeX decided to insert some text
+#    it has salvaged the resource and the resource can be printed.. in that case
+#    a message is emitted from this sub.
+#
+sub analyze_logfile {
+    my ($logfilename, $texfile, $advanced_role) = @_;
+
+    my $temporary_file=IO::File->new($logfilename) || die "Couldn't open log file $logfilename for reading: $!\n";
+    my @content_of_file = <$temporary_file>;
+    close $temporary_file; 
+    my $body_log_file = join(' ',@content_of_file);
+    $logfilename =~ s/\.log$/\.html/;
+    $temporary_file = IO::File->new('>'.$logfilename); 
+    print $temporary_file '<html><head><title>LOGFILE</title></head><body><pre>'.$body_log_file.'</pre></body></html>'."\n";
+    if ($body_log_file=~m/!\s+Emergency stop/) {
+	my $whereitbegins = rindex $body_log_file,'STAMPOFPASSEDRESOURCESTART';
+	my $whereitends = rindex $body_log_file,'STAMPOFPASSEDRESOURCEEND';
+	my $badresource;
+	my $badtext;
+	if ($whereitbegins!=-1 and $whereitends!=-1) {
+	    $badtext = substr($body_log_file,$whereitbegins+26, $whereitends-$whereitbegins-26);
+	    $whereitbegins  = rindex $badtext,'located in';
+	    if ($whereitbegins != -1) {
+		
+		$badresource = substr($badtext, $whereitbegins+27, 
+				      length($badtext) - $whereitbegins - 48);
+		# print "<br />failing resourcename: $badresource<br />";
+	    }
+	}
+
+	# Guys with privileged roles get a more detailed error output:
+
+	if ($advanced_role) {  
+	    #LaTeX failed to parse tex file 
+	    print "<h2>LaTeX could not successfully parse your tex file.</h2>";
+	    print "It probably has errors in it.<br />";
+	    print "With very high probability this error occured in ".$badtext."<br /><br />";
+	    print "Here are the error messages in the LaTeX log file<br /><pre>";
+	    
+	    my $sygnal = 0;
+	    for (my $i=0;$i<=$#content_of_file;$i++) {
+		if ($content_of_file[$i]=~m/^Runaway argument?/ or $content_of_file[$i]=~m/^!/) {
+		    $sygnal = 1;
+		} 
+		if ($content_of_file[$i]=~m/Here is how much of/) {
+		    $sygnal = 0;
+		} 
+		if ($sygnal) {
+		    print "$content_of_file[$i]";
+		}  
+	    }
+	    print "</pre>\n";
+	    # print "<br /> Advanced role <br />";
+	    print "<b><big>The link to ";
+	    $logfilename=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
+	    print "<a href=\"$logfilename\">Your log file </a></big></b>";
+	    print "\n";
+	    #link to original LaTeX file
+	    my $tex_temporary_file=IO::File->new($texfile) || die "Couldn't open tex file $texfile for reading: $!\n";
+	    my @tex_content_of_file = <$tex_temporary_file>;
+	    close $tex_temporary_file; 
+	    my $body_tex_file = join(' ',@tex_content_of_file);
+	    $texfile =~ s/\.tex$/aaaaa\.html/;
+	    $tex_temporary_file = IO::File->new('>'.$texfile); 
+	    print $tex_temporary_file '<html><head><title>LOGFILE</title></head><body><pre>'.$body_tex_file.'</pre></body></html>'."\n";
+	    print "<br /><br />";
+	    print "<b><big>The link to ";
+	    $texfile=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
+	    print "<a href=\"$texfile\">Your original LaTeX file </a></big></b>";
+	    print "\n";
+	    my $help_text = &Apache::loncommon::help_open_topic("Print_Resource", "Help on printing");
+	    print ("$help_text");
+
+	    # Students on the other hand get a minimal error message, since they won't
+	    # be able to correct the error message. A message is sent to the 
+	    # instructor:
+
+	} else {		# Student role...
+	    #  at this point:
+	    #    $body_log_file - contains the log file.
+	    #    $name_file     - is the name of the LaTeX file.
+	    #    $identifier    - is the unique LaTeX identifier.l
+	    
+	    print "<br />There are errors in $badtext";
+	    print "<br />These errors prevent this resource from printing correctly";
+	    my $tex_handle = IO::File->new($texfile);
+	    my @tex_contents = <$tex_handle>;
+	    &send_error_mail($identifier, $badresource, $body_log_file, \@tex_contents);
+	    print "<br />A message has been sent to the instructor describing this failure<br />";
+	    my $help_text = &Apache::loncommon::help_open_topic("Print_Resource", "Help on printing");
+	    print  ("$help_text");
+	    
+	  }
+
+	# Either way, an emergency stop does not allow us to continue so:
+
+	return 0;
+	
+	# The branch of code below is taken if it appears that 
+	# there was no emergency stop but LaTeX had to correct the
+	# input file to run.
+	# In that case we need to provide error feedback, as the correction >may< not be
+	# sufficient, we can let the game continue as there's a dvi file to process.
+
+    } elsif ($body_log_file=~m/<inserted text>/) {
+	my $whereitbegins = index $body_log_file,'<inserted text>';
+	print "You are running LaTeX in <b>batch mode</b>.";
+	while ($whereitbegins != -1) {
+	    my $tempobegin=$whereitbegins;
+	    $whereitbegins = rindex $body_log_file,'STAMPOFPASSEDRESOURCESTART',$whereitbegins;
+	    my $whereitends = index $body_log_file,'STAMPOFPASSEDRESOURCEEND',$whereitbegins;
+	    print "<br />It has found an error in".substr($body_log_file,$whereitbegins+26,$whereitends-$whereitbegins-26)." <br /> and corrected it.\n";
+	    print "Usually this correction is valid but you probably need to check the indicated resource one more time and implement neccessary corrections by yourself.\n";
+	    $whereitbegins = index $body_log_file,'<inserted text>',$tempobegin+10;
+	}
+
+	if ($advanced_role) {  
+	    print "<br /><br />";
+	    print "<b><big>The link to ";
+	    $logfilename=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
+	    print "<a href=\"$logfilename\">Your log file </a></big></b>";
+	    print "\n";
+	    #link to original LaTeX file
+	    my $tex_temporary_file=IO::File->new($texfile) || die "Couldn't open tex file $texfile for reading: $!\n";
+	    my @tex_content_of_file = <$tex_temporary_file>;
+	    close $tex_temporary_file; 
+	    my $body_tex_file = join(' ',@tex_content_of_file);
+	    $texfile =~ s/\.tex$/aaaaa\.html/;
+	    $tex_temporary_file = IO::File->new('>'.$texfile); 
+	    print $tex_temporary_file '<html><head><title>LOGFILE</title></head><body><pre>'.$body_tex_file.'</pre></body></html>'."\n";
+	    print "<br /><br />";
+	    print "<b><big>The link to ";
+	    $texfile=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
+	    print "<a href=\"$texfile\">Your original LaTeX file </a></big></b>";
+	    print "\n";
+	}
+	return 1;
+    }
+    return 1;			# NO log file issues at all.
+}

--foxr1206525022--