Diff for /loncom/interface/printout.pl between versions 1.119 and 1.129

version 1.119, 2006/12/19 10:39:28 version 1.129, 2008/01/28 11:24:48
Line 1 Line 1
 #!/usr/bin/perl  #!/usr/bin/perl
 # CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc.  # CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc.
 #  #
   # $Id$
 #  #
 # Copyright Michigan State University Board of Trustees  # Copyright Michigan State University Board of Trustees
 #  #
Line 38  use Apache::loncommon(); Line 39  use Apache::loncommon();
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonmsg();  use Apache::lonmsg();
 use LONCAPA::Enrollment;  use LONCAPA::Enrollment;
   use LONCAPA::Configuration;
   
 use strict;  use strict;
   
Line 127  sub send_error_mail { Line 129  sub send_error_mail {
     foreach my $line (@$texfile) {      foreach my $line (@$texfile) {
  $message .= "$line\n";   $message .= "$line\n";
     }      }
     my (undef, %receivers) = &Apache::lonfeedback::decide_receiver(undef, 0,      my (undef, %receivers) = &Apache::lonmsg::decide_receiver(undef, 0,
   1,1,1);        1,1,1);
     # print "<br /> sending...section:  $env{'request.course.sec'}";      # print "<br /> sending...section:  $env{'request.course.sec'}";
     foreach my $dest (keys %receivers) {      foreach my $dest (keys %receivers) {
  # print "<br /> dest is $dest";   # print "<br /> dest is $dest";
Line 160  Your cookie information is incorrect. Line 162  Your cookie information is incorrect.
 END  END
     return;      return;
 }  }
   
   my %perlvar=%{&LONCAPA::Configuration::read_conf('loncapa.conf')};
  &Apache::lonlocal::get_language_handle();   &Apache::lonlocal::get_language_handle();
  &Apache::loncommon::content_type(undef,'text/html');   &Apache::loncommon::content_type(undef,'text/html');
   $env{'request.noversionuri'} = '/cgi-bin/printout.pl';
   print(&Apache::loncommon::start_page('Creating PDF'));    print(&Apache::loncommon::start_page('Creating PDF'));
   
   my $identifier = $ENV{'QUERY_STRING'};    my $identifier = $ENV{'QUERY_STRING'};
Line 183  END Line 187  END
   if ($student_names=~/_END_/) {      if ($student_names=~/_END_/) {  
       @names_pack=split(/_ENDPERSON_/,$student_names);        @names_pack=split(/_ENDPERSON_/,$student_names);
   }    }
     if ($backref) {
 print "<a href=\"$backref\"><b>Return</b></a> to last resource.<br /><br />";        print('<p>'.&mt("[_1]Return[_2] to editing resource.",
         "<a href=\"$backref\"><b>","</b></a>").'</p>');
     }
   my $figfile = $texfile;    my $figfile = $texfile;
   $figfile =~ s/^([^\.]+printout)[^t]+\.tex/$1\.dat/;    $figfile =~ s/^(.*_printout)_\d+_\d+_\d+\.tex/$1\.dat/;
   my $duefile = $texfile;    my $duefile = $texfile;
   $duefile =~ s/^([^\.]+printout)[^t]+\.tex/$1\.due/;    $duefile =~ s/^(.*_printout)_\d+_\d+_\d+\.tex/$1\.due/;
   #do we have figures?    #do we have figures?
   # print "Figure file: $figfile\n";    # print "Figure file: $figfile\n";
   if (-e $figfile) {    if (-e $figfile) {
Line 213  print "<a href=\"$backref\"><b>Return</b Line 218  print "<a href=\"$backref\"><b>Return</b
       # $eps_f =~ s/\.[^.]*$/\.eps/i;        # $eps_f =~ s/\.[^.]*$/\.eps/i;
       if ($eps_f=~/\/home\/([^\/]+)\/public_html\//) {        if ($eps_f=~/\/home\/([^\/]+)\/public_html\//) {
                   $eps_f=~s/\/home\/([^\/]+)\/public_html/$1/;                    $eps_f=~s/\/home\/([^\/]+)\/public_html/$1/;
   $eps_f = '/home/httpd/prtspool/'.$eps_f;    $eps_f = $perlvar{'lonPrtDir'}.'/'.$eps_f;
       } elsif ($eps_f=~/$Apache::lonnet::perlvar{'lonDocRoot'}\/res\//) {        } elsif ($eps_f=~/$perlvar{'lonDocRoot'}\/res\//) {
   $eps_f=~m/$Apache::lonnet::perlvar{'lonDocRoot'}\/res\/(.+)/;    $eps_f=~m/$perlvar{'lonDocRoot'}\/res\/(.+)/;
   $eps_f = '/home/httpd/prtspool/'.$1;    $eps_f = $perlvar{'lonPrtDir'}.'/'.$1;
       } elsif ($eps_f=~/$Apache::lonnet::perlvar{'lonUsersDir'}\//) {        } elsif ($eps_f=~/$perlvar{'lonUsersDir'}\//) {
   $eps_f=~/$Apache::lonnet::perlvar{'lonUsersDir'}\/([^\/]+)\/\w\/\w\/\w\/(.+)/;    $eps_f=~/$perlvar{'lonUsersDir'}\/([^\/]+)\/\w\/\w\/\w\/(.+)/;
   $eps_f = '/home/httpd/prtspool/'.$1.'/'.$2;    $eps_f = $perlvar{'lonPrtDir'}.'/'.$1.'/'.$2;
       }        }
       $eps_f  =~ s/ /\_/g; # Spaces are problematic for system commands and LaTeX.        $eps_f  =~ s/ /\_/g; # Spaces are problematic for system commands and LaTeX.
       #         # 
Line 252  print "<a href=\"$backref\"><b>Return</b Line 257  print "<a href=\"$backref\"><b>Return</b
   if ($advanced_role) {    if ($advanced_role) {
       my $prettyname=$not_eps;        my $prettyname=$not_eps;
       $prettyname=~s|/home/([^/]+)/public_html|/priv/$1|;        $prettyname=~s|/home/([^/]+)/public_html|/priv/$1|;
       $prettyname=~s|$Apache::lonnet::perlvar{'lonDocRoot'}/|/|;        $prettyname=~s|$perlvar{'lonDocRoot'}/|/|;
       &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,        &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,
     'Converting to EPS '.$prettyname);      'Converting to EPS '.$prettyname);
   }    }
Line 374  foreach $texfile (@texfile) { Line 379  foreach $texfile (@texfile) {
       my $dvi_file= $name_file; $dvi_file =~ s/\.tex/$name_range\.dvi/;        my $dvi_file= $name_file; $dvi_file =~ s/\.tex/$name_range\.dvi/;
       &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",        &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
  "for $status_statement now LaTeXing file",   "for $status_statement now LaTeXing file",
  \%prog_state,$dvi_file);   \%prog_state,$dvi_file, 10);
       if ($tableofcontents eq 'yes') {        if ($tableofcontents eq 'yes') {
       &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",        &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
  "for $status_statement First LaTeX of file for table of contents",   "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",        &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
  "for $status_statement Second LaTeX of file for table of contents",   "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        } #to create table of contents
       my $idxname=$name_file;        my $idxname=$name_file;
       $idxname=~s/\.tex$/\.idx/;        $idxname=~s/\.tex$/\.idx/;
Line 391  foreach $texfile (@texfile) { Line 396  foreach $texfile (@texfile) {
      \%prog_state,$idxname);       \%prog_state,$idxname);
   &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",    &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
      "for $status_statement now LaTeXing file for index section",       "for $status_statement now LaTeXing file for index section",
      \%prog_state,$dvi_file);       \%prog_state,$dvi_file,10);
       } #to create index        } #to create index
       #Do we have a latex error in the log file?        #Do we have a latex error in the log file?
       my $logfilename = $texfile; $logfilename =~ s/\.tex$/\.log/;        my $logfilename = $texfile; $logfilename =~ s/\.tex$/\.log/;
Line 440  foreach $texfile (@texfile) { Line 445  foreach $texfile (@texfile) {
       print "</pre>\n";        print "</pre>\n";
       # print "<br /> Advanced role <br />";        # print "<br /> Advanced role <br />";
               print "<b><big>The link to ";                print "<b><big>The link to ";
               $logfilename=~s/\/home\/httpd//;                $logfilename=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
       print "<a href=\"$logfilename\">Your log file </a></big></b>";        print "<a href=\"$logfilename\">Your log file </a></big></b>";
       print "\n";        print "\n";
               #link tooriginal LaTeX file (included according Michael Hamlin desire)                #link tooriginal LaTeX file (included according Michael Hamlin desire)
Line 453  foreach $texfile (@texfile) { Line 458  foreach $texfile (@texfile) {
       print $tex_temporary_file '<html><head><title>LOGFILE</title></head><body><pre>'.$body_tex_file.'</pre></body></html>'."\n";        print $tex_temporary_file '<html><head><title>LOGFILE</title></head><body><pre>'.$body_tex_file.'</pre></body></html>'."\n";
       print "<br /><br />";        print "<br /><br />";
       print "<b><big>The link to ";        print "<b><big>The link to ";
       $texfile=~s/\/home\/httpd//;                $texfile=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
       print "<a href=\"$texfile\">Your original LaTeX file </a></big></b>";        print "<a href=\"$texfile\">Your original LaTeX file </a></big></b>";
       print "\n";        print "\n";
       my $help_text = &Apache::loncommon::help_open_topic("Print_Resource", "Help on printing");        my $help_text = &Apache::loncommon::help_open_topic("Print_Resource", "Help on printing");
Line 507  foreach $texfile (@texfile) { Line 512  foreach $texfile (@texfile) {
       #        #
       &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",        &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
  "for $status_statement first latex to repaginate",   "for $status_statement first latex to repaginate",
  \%prog_state, $name_file);   \%prog_state, $name_file,10);
       if ($tableofcontents eq 'yes') {        if ($tableofcontents eq 'yes') {
   &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",    &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
      "for $status_statement second latex to repaginate",       "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",    &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
      "for $status_statement third latex to repaginate",       "for $status_statement third latex to repaginate",
      \%prog_state, $name_file);       \%prog_state, $name_file,10);
       }        }
       if ($tableofindex eq 'yes') {        if ($tableofindex eq 'yes') {
   my $idxname = $latex_file;    my $idxname = $latex_file;
   $idxname =~ s/\.tex$/\.idx/;    $idxname =~ s/\.tex$/\.idx/;
   &busy_wait_command("makindex $idxname",    &busy_wait_command("makeindex $idxname",
      "Re-creating index file",       "Re-creating index file",
      \%prog_state, $idxname);       \%prog_state, $idxname);
   &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",    &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
      "for $status_statement now Recreting index (latex)",       "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",
Line 558  foreach $texfile (@texfile) { Line 563  foreach $texfile (@texfile) {
       #print("<br /> Missing fonts file is: $missfonts_file");        #print("<br /> Missing fonts file is: $missfonts_file");
       if (-e $missfonts_file) {        if (-e $missfonts_file) {
   #print("<br />Missing fonts file exists\n");    #print("<br />Missing fonts file exists\n");
   &create_missing_fonts($missfonts_file);    &create_missing_fonts($missfonts_file,\%prog_state);
   &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 generated missing fonts",       "for $status_statement dvips generated missing fonts",
      \%prog_state, $new_name_file);       \%prog_state, $new_name_file);
Line 603  foreach $texfile (@texfile) { Line 608  foreach $texfile (@texfile) {
       $texps =~ s/\.tex/\.ps/;        $texps =~ s/\.tex/\.ps/;
       my @garb = ($texaux,$texdvi,$texps);        my @garb = ($texaux,$texdvi,$texps);
 #  unlink @garb;  #  unlink @garb;
       unlink $duefile;        unlink($duefile);
       print "<a href=\"/prtspool/$pdf_file\">Your PDF document</a>";        print "<a href=\"/prtspool/$pdf_file\">Your PDF document</a>";
       unlink $missfonts_file;        unlink($missfonts_file);
   
   }    }
   if ($advanced_role) {      if ($advanced_role) {  
       print "<br /><br />";        print "<br /><br />";
       print "<b><big>The link to ";        print "<b><big>The link to ";
       $logfilename=~s/\/home\/httpd//;                $logfilename=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
       print "<a href=\"$logfilename\">Your log file </a></big></b>";        print "<a href=\"$logfilename\">Your log file </a></big></b>";
       print "\n";        print "\n";
       #link tooriginal LaTeX file (included according Michael Hamlin desire)        #link tooriginal LaTeX file (included according Michael Hamlin desire)
Line 624  foreach $texfile (@texfile) { Line 629  foreach $texfile (@texfile) {
       print $tex_temporary_file '<html><head><title>LOGFILE</title></head><body><pre>'.$body_tex_file.'</pre></body></html>'."\n";        print $tex_temporary_file '<html><head><title>LOGFILE</title></head><body><pre>'.$body_tex_file.'</pre></body></html>'."\n";
       print "<br /><br />";        print "<br /><br />";
       print "<b><big>The link to ";        print "<b><big>The link to ";
       $texfile=~s/\/home\/httpd//;                $texfile=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
       print "<a href=\"$texfile\">Your original LaTeX file </a></big></b>";        print "<a href=\"$texfile\">Your original LaTeX file </a></big></b>";
       print "\n";        print "\n";
   }    }
Line 669  foreach $texfile (@texfile) { Line 674  foreach $texfile (@texfile) {
   #print("<br /> Missing fonts file is: $missfonts_file");    #print("<br /> Missing fonts file is: $missfonts_file");
   if (-e $missfonts_file) {    if (-e $missfonts_file) {
       #print("<br />Missing fonts file exists\n");        #print("<br />Missing fonts file exists\n");
       &create_missing_fonts($missfonts_file);        &create_missing_fonts($missfonts_file,\%prog_state);
       &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 generated missing fonts",   "for $status_statement dvips generated missing fonts",
  \%prog_state, $new_name_file);   \%prog_state, $new_name_file);
Line 680  foreach $texfile (@texfile) { Line 685  foreach $texfile (@texfile) {
       &repaginate($new_name_file, $latex_file,  $numberofcolumns);        &repaginate($new_name_file, $latex_file,  $numberofcolumns);
       &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",        &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
  "for $status_statement first latex to repaginate",   "for $status_statement first latex to repaginate",
  \%prog_state, $name_file);   \%prog_state, $name_file,10);
       if ($tableofcontents eq 'yes') {        if ($tableofcontents eq 'yes') {
   &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",    &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
      "for $status_statement second latex to repaginate",       "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",    &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
      "for $status_statement third latex to repaginate",       "for $status_statement third latex to repaginate",
      \%prog_state, $name_file);       \%prog_state, $name_file,10);
       }        }
       if ($tableofindex eq 'yes') {        if ($tableofindex eq 'yes') {
   my $idxname = $latex_file;    my $idxname = $latex_file;
Line 697  foreach $texfile (@texfile) { Line 702  foreach $texfile (@texfile) {
      \%prog_state, $idxname);       \%prog_state, $idxname);
   &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",    &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
      "for $status_statement now Recreting index (latex)",       "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",   "for $status_statement dvips to repaginate",
Line 756  foreach $texfile (@texfile) { Line 761  foreach $texfile (@texfile) {
       $texps =~ s/\.tex/\.ps/;        $texps =~ s/\.tex/\.ps/;
       my @garb = ($texlog,$texaux,$texdvi,$texps);        my @garb = ($texlog,$texaux,$texdvi,$texps);
 #  unlink @garb;  #  unlink @garb;
       unlink $duefile;        unlink($duefile);
       print "<a href=\"/prtspool/$pdf_file\">$link_text - click here to download pdf</a>";        print "<a href=\"/prtspool/$pdf_file\">$link_text - click here to download pdf</a>";
       print "\n";        print "\n";
   }    }
   unlink $missfonts_file;    unlink($missfonts_file);
   
       }          }  
   } else {    } else {
Line 779  if ($number_of_files>1) { Line 784  if ($number_of_files>1) {
     print("<pre>Zip Output:\n");      print("<pre>Zip Output:\n");
     system($statement);      system($statement);
     print("</pre>");      print("</pre>");
     $zipfile=~s/\/home\/httpd//;      $zipfile=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
     print "<br /> A <a href=\"$zipfile\">ZIP file</a> of all the PDFs.";      print "<br /> A <a href=\"$zipfile\">ZIP file</a> of all the PDFs.";
 }  }
 if ($advanced_role) { &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); }  if ($advanced_role) { &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); }
Line 789  my $done; Line 794  my $done;
 sub REAPER {  sub REAPER {
     $done=1;      $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 {  sub busy_wait_command {
     my ($command,$message,$progress_win,$output_file)=@_;      my ($command,$message,$progress_win,$output_file, $timeout)=@_;
           
     $SIG{CHLD} = \&REAPER;      $SIG{CHLD} = \&REAPER;
     $done=0;      $done=0;
Line 799  sub busy_wait_command { Line 812  sub busy_wait_command {
     if ($advanced_role) {      if ($advanced_role) {
  &Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,$message);   &Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,$message);
     }      }
       my $last_size      = 0;
       my $unchanged_time = 0;
     while(!$done) {      while(!$done) {
  sleep 1;   sleep 1;
  my $extra_msg;   my $extra_msg;
  if ($output_file) {   if ($output_file) {
     my $size=(stat($output_file))[7];      my $size=(stat($output_file))[7];
     $extra_msg=", $size bytes generated";      $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) {   if ($advanced_role) {
     &Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,      &Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,
Line 864  sub repaginate { Line 888  sub repaginate {
  #  bottom of the page, m the page number within the document.   #  bottom of the page, m the page number within the document.
  #   #
   
  if ($line =~ /^%%Page:/) {   if ($line =~ /^%%Page:\s+\d+\s+\d+/) {
     my @pageinfo = split(/ /, $line);      my @pageinfo = split(/\s+/, $line);
     if ($page_number < $pageinfo[1]) {      if ($page_number < $pageinfo[1]) {
  $page_number = $pageinfo[1];   $page_number = $pageinfo[1];
     } elsif ($pageinfo[2] ne 1) {      } elsif ($pageinfo[2] ne 1) {
Line 996  sub create_missing_fonts { Line 1020  sub create_missing_fonts {
  #print("<br />Creating fonts via command: $command");   #print("<br />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",     "Creating missing font",
    $state, $command);     $state);
         
     }      }
   

Removed from v.1.119  
changed lines
  Added in v.1.129


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>