Diff for /loncom/interface/lonprintout.pm between versions 1.12 and 1.35

version 1.12, 2002/01/11 17:06:56 version 1.35, 2002/07/01 15:02:54
Line 43  use strict; Line 43  use strict;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
 use Apache::lonxml;  use Apache::lonxml;
 use Apache::lonnet;  use Apache::lonnet;
   use Apache::inputtags;
   use Apache::edit;
 use Apache::File();  use Apache::File();
   use POSIX qw(strftime);
   
   
 sub headerform {  sub headerform {
Line 56  sub headerform { Line 58  sub headerform {
 </head>  </head>
 <body bgcolor="FFFFFF">  <body bgcolor="FFFFFF">
 <form method="post" enctype="multipart/form-data" action="/adm/printout" name="printform">  <form method="post" enctype="multipart/form-data" action="/adm/printout" name="printform">
 <h1>Printout:</h1><br></br>  <h1>What do you want to print? Make a choice.</h1><br />
 ENDHEADER  ENDHEADER
 }  }
   
   
 sub menu_for_output {  sub menu_for_output {
     my $r = shift;      my $r = shift;
     $r->print(<<ENDMENUOUT);      $r->print(<<ENDMENUOUT1);
 <input type="hidden" name="phase" value="two">  <input type="hidden" name="phase" value="two">
 <input type="hidden" name="url" value="$ENV{'form.postdata'}">  <input type="hidden" name="url" value="$ENV{'form.postdata'}">
 <input type="radio" name="choice" value="Standard LaTeX output for current document">  Standard LaTeX output for current document<br />  <input type="radio" name="choice" value="Standard LaTeX output for current document" checked>  Current document
 <input type="radio" name="choice" value="Standard LaTeX output for the primary sequence">  Standard LaTeX output for the primary sequence<br />  (you will print what you see on the screen)<br />
 <input type="radio" name="choice" value="Standard LaTeX output for the top level sequence">  Standard LaTeX output for the top level sequence<br />  <input type="radio" name="choice" value="Standard LaTeX output for the primary sequence">  All problems from the primary sequence<br />
 <input type="submit" value="Please make a choice">  <input type="radio" name="choice" value="Standard LaTeX output for whole primary sequence">  The whole primary sequence (problems plus all html and xml files)<br />
   <input type="radio" name="choice" value="Standard LaTeX output for the top level sequence">  All problems from the top level sequence<br />
   <br />
   ENDMENUOUT1
       my $subdirtoprint = &Apache::lonnet::filelocation("",$ENV{'form.url'});
       $subdirtoprint =~ s/\/[^\/]+$//;
       if (&Apache::lonnet::allowed('bre',$subdirtoprint) eq 'F') {
    $r->print(<<ENDMENUOUT2);
   <input type="radio" name="choice" value="Subdirectory print">  All problems from current subdirectory (where this particular problem is)<br />
   ENDMENUOUT2
   }
       $r->print(<<ENDMENUOUT3);
   <br /><hr /><br />
   <h1>And what page format do you prefer?</h1>
   <input type="radio" name="layout" value="CBI"> Two columns landscape <br />
   <input type="radio" name="layout" value="CAPA" checked>  Two columns portrait <br />
   <input type="submit" value="Submit your choice">
 </form>  </form>
 </body>  </body>
 </html>  </html>
 ENDMENUOUT  ENDMENUOUT3
 }  }
   
   
   
   
 sub output_data {  sub output_data {
     my $r = shift;      my $r = shift;
     $r->print(<<ENDPART);      $r->print(<<ENDPART);
Line 89  sub output_data { Line 109  sub output_data {
 ENDPART  ENDPART
   
     my $choice = $ENV{'form.choice'};      my $choice = $ENV{'form.choice'};
       my $layout = $ENV{'form.layout'};
       my $laystyle = 'book';
     my $result = '';      my $result = '';
     my %mystyle;      my $number_of_columns = 1;
     my $filename;  
   
     if ($choice eq 'Standard LaTeX output for current document') {      if ($choice eq 'Standard LaTeX output for current document') {
         my $access=&Apache::lonnet::allowed('bre',$ENV{'form.url'});        my %moreenv;
  if (($access ne '2') && ($access ne 'F')) {        $moreenv{'form.grade_target'}='tex';
   $ENV{'user.error.msg'}="$ENV{'form.url'}:bre:1:1:Access Denied";        $moreenv{'request.filename'}=$ENV{'form.url'};
   return HTTP_NOT_ACCEPTABLE;        &Apache::lonnet::appenv(%moreenv);
  }        my $texversion=&Apache::lonnet::ssi($ENV{'form.url'});
  my $file=&Apache::lonnet::filelocation("",$ENV{'form.url'});        &Apache::lonnet::delenv('form.grade_target');
  my $filecontents=&Apache::lonnet::getfile($file);        $result .= $texversion;
         $_ = $file;        $result = &additional_cleanup($result);
         if (/\.problem/) {        if ($ENV{'form.url'}=~m/\.page\s*$/) {($result,$number_of_columns) = &page_cleanup($result);}
     my $default=&Apache::lonnet::getfile('/home/httpd/html/res/adm/includes/default_homework.lcpm');      } elsif ($choice eq 'Standard LaTeX output for the primary sequence' or $choice eq 'Standard LaTeX output for whole primary sequence') {
     if ($default == -1) {  #-- where is the primary sequence containing file?
  &Apache::lonxml::error("<b>Unable to find <i>default_homework.lcpm</i></b>");   my %moreenv;
  $default='';   my $symbolic = &Apache::lonnet::symbread($ENV{'form.url'});
    $_ = $symbolic;
    m/([^_]+)_/;
    my $primary_sequence = '/res/'.$1;
   #-- open and analyses the primary sequence
    my $sequence_file=&Apache::lonnet::filelocation("",$primary_sequence);
    my $sequencefilecontents=&Apache::lonnet::getfile($sequence_file);
    my @master_seq = &content_map($sequencefilecontents);
   #-- produce an output string
    for (my $i=0;$i<=$#master_seq;$i++) {
       $_ = $master_seq[$i];
       m/\"(.*)\"/;
               $_ = $1;
               my $urlp = $1;
       if ($choice eq 'Standard LaTeX output for the primary sequence') {
    if (/\.(problem|exam|quiz|assess|survey|form|library)/) {
       my %moreenv;
       $moreenv{'form.grade_target'}='tex';
       &Apache::lonnet::appenv(%moreenv);
       my $texversion=&Apache::lonnet::ssi($urlp);
       &Apache::lonnet::delenv('form.grade_target');
       $result .= $texversion;        
    }
       } else {
    $moreenv{'form.grade_target'}='tex';
    &Apache::lonnet::appenv(%moreenv);
    my $texversion=&Apache::lonnet::ssi($urlp);
    &Apache::lonnet::delenv('form.grade_target');
    $result .= $texversion;    
     }      }
     $result = &Apache::lonxml::xmlparse('tex', $filecontents,$default.&Apache::lonhomework::setup_vars('tex'),%mystyle);   }
             $result = &additional_cleanup($result);
       }  elsif ($choice eq 'Standard LaTeX output for the top level sequence') {
  } else {   
     $result = &Apache::lonxml::xmlparse('tex',$filecontents,'',%mystyle);  
  }   
   
   
   
   
   
         
 #    my $ere;  
 #    foreach $ere (%ENV) {  
 # $result .= ' SS '.$ere.' => '.$ENV{$ere}.' FF '."\n\n";  
 #    }  
     } elsif ($choice eq 'Standard LaTeX output for the primary sequence') {  
  my @master_seq = ();   my @master_seq = ();
  my $keyword = 0;   my @add_file_seq = ();
  my $output_seq = '';  #-- where is the main sequence of the course?
  my $current_file = '/res/'.$ENV{'request.ambiguous'};   my $main_seq = '/res/'.$ENV{'request.course.uri'};
         $current_file =~ s/(\/res\/physnet\/physnet)(\/m\d+)\/(.*)/$1$2$2\.sequence/;   my $file=&Apache::lonnet::filelocation("",$main_seq);
  while ($current_file ne '') {   my $filecontents=&Apache::lonnet::getfile($file);
     my $file=&Apache::lonnet::filelocation("",$current_file);   my @file_seq = &content_map($filecontents);
     my $filecontents=&Apache::lonnet::getfile($file);  #-- do we have any other sequence inside?
     my @file_seq = &content_map($filecontents);   my $i=0;
     if (defined @file_seq) {   while ($i<=$#file_seq) {
 #-- adding an additional array to the master one      $_ = $file_seq[$i];
  if (defined @master_seq) {      if (/\.sequence$/) {
                     my $old_value = $#master_seq;   $file = &Apache::lonnet::filelocation("",$file_seq[$i]);
     my $total_value = $#master_seq + $#file_seq +2;   $filecontents=&Apache::lonnet::getfile($file);
                     for (my $j=0; $j<=$old_value-$keyword+1; $j++) {   @add_file_seq = &content_map($filecontents);
  $master_seq[$total_value-$j] = $master_seq[$old_value-$j];   splice(@file_seq,$i,1,@add_file_seq);
     }   @add_file_seq = ();
                     for (my $j=0; $j<=$#file_seq; $j++){   $i = -1;
  $master_seq[$keyword+$j] = $file_seq[$j];      }
     }      $i++;
     @file_seq = ();  
     $keyword = 0;  
  } else {  
     @master_seq = @file_seq;  
                     @file_seq = ();  
  }  
     }   
 #-- checking wether .sequence file is among the set of files  
     $current_file = '';  
     for (my $i=0; $i<=$#file_seq; $i++) {  
  $_ = $file_seq[$i];  
  if (m/(.*)\.sequence/) {  
     $current_file = $_;  
     $keyword = $i;  
     last;  
  }  
     }          
  }   }
    @master_seq = @file_seq;
 #-- produce an output string  #-- produce an output string
  for (my $i=0;$i<=$#master_seq;$i++) {   for (my $i=0;$i<=$#master_seq;$i++) {
     $_ = $master_seq[$i];      $_ = $master_seq[$i];
     m/\"(.*)\"/;      m/\"(.*)\"/;
     if (index($1,'-tc.xml',0)==-1) {              $_ = $1;
  my $file=&Apache::lonnet::filelocation("",$1);              my $urlp = $1;
  my $filecontents=&Apache::lonnet::getfile($file);              if (/\.(problem|exam|quiz|assess|survey|form|library)/) {
  $output_seq .= $filecontents;   my %moreenv;
    $moreenv{'form.grade_target'}='tex';
    &Apache::lonnet::appenv(%moreenv);
    my $texversion=&Apache::lonnet::ssi($urlp);
    &Apache::lonnet::delenv('form.grade_target');
    $result .= $texversion;        
     }      }
    }    
    $result = &additional_cleanup($result);
       } elsif ($choice eq 'Subdirectory print') {      
    my $subdirtoprint = &Apache::lonnet::filelocation("",$ENV{'form.url'});
    $subdirtoprint =~ s/\/[^\/]+$//;
    my @list_of_files = ();
    my $localdirectory = $subdirtoprint;
    $localdirectory =~ s/.*(\/res\/)/$1/;
    my @content_directory = &Apache::lonnet::dirlist($localdirectory);
    for (my $iy=0;$iy<=$#content_directory;$iy++) {
       my @tempo_array = split(/&/,$content_directory[$iy]);
       $content_directory[$iy] = $tempo_array[0];
       if ($content_directory[$iy] =~ m/^[^\.]+\.problem$/) {
    push @list_of_files,$content_directory[$iy];
       }
    }
    $localdirectory =~ s/\/$//;
    for (my $i=0;$i<=$#list_of_files;$i++) {
       my $urlp = $localdirectory.'/'.$list_of_files[$i];     
       my %moreenv;
       $moreenv{'form.grade_target'}='tex';
       &Apache::lonnet::appenv(%moreenv);
       my $texversion=&Apache::lonnet::ssi($urlp);
       &Apache::lonnet::delenv('form.grade_target');
       $texversion =~ s/(\\begin{document})/$1 {\\tiny\\begin{verbatim}$urlp\\end{verbatim}}/;
       $result .= $texversion;   
  }   }
 #-- cleanup of output string (temporary cbi-specific)   $result = &additional_cleanup($result);
  $output_seq =~ s/<physnet>//g;  
  $output_seq =~ s/<\/physnet>//g;  
  $output_seq = '<physnet>'.$output_seq.' </physnet>';  
 #-- final accord  
  $result = &Apache::lonxml::xmlparse('tex',$output_seq,'',%mystyle);  
   
       }
   #-- corrections for the different page formats
       if ($layout eq 'CBI') {
    $result =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{-40pt}\\setlength{\\evensidemargin}{-60pt}\\setlength{\\topmargin}{200pt}\\setlength{\\textwidth}{4\.4in}\\setlength{\\textheight}{6\.8in}\\setlength{\\parindent}{20pt}\\setlength{\\marginparwidth}{90pt}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt} \\begin{document}/;
           $laystyle = 'album';
       } elsif ($layout eq 'CAPA') {
           my $courseidinfo = $ENV{'request.role'};
           $_ = $courseidinfo;
           m/.*\/(.*)/;
           $courseidinfo = $ENV{'course.physnet_'.$1.'.description'};
   # $result =~ s/\\documentclass\[letterpaper\]{article}/\\documentclass\[twocolumn\]{article}/;
    $result =~ s/\\documentclass\[letterpaper\]{article}/\\documentclass{article}/;
    $result =~ s/\\begin{document}/\\textheight 25\.9cm\\oddsidemargin = -0\.57in\\evensidemargin = -0\.57in\\textwidth= 9cm\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\begin{document}\\voffset=-1\.8cm\\setcounter{page}{1}\\parbox{\\minipagewidth}{\\noindent\\fbox{\\textbf{$ENV{'environment.firstname'} $ENV{'environment.lastname'}}}\\hskip 1\.4in $courseidinfo} \\vskip 5 mm /;
    $result =~ s/\\includegraphics{/\\includegraphics\[width=9\.0 cm\]{/g;
    $result =~ s/(\\end{document})/\\newline\\noindent\\makebox\[9.0cm\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Dept\. of Physics and Astronomy, MSU\\makebox\[1.5cm\]\[b\]{\\hfill}LON-CAPA\\copyright MSU GNU\/GPL $1/;
           $result =~ s/(\\end{longtable}\s*)(\\newline\\noindent\\makebox\[9\.0cm\]\[b\]{\\hrulefill})/$2$1/g;
           $result =~ s/(\\end{longtable}\s*)\\newline/$1/g;
       }
   #-- LaTeX corrections     
       my $first_comment = index($result,'<!--',0);
       while ($first_comment != -1) {
    my $end_comment = index($result,'-->',$first_comment);
    substr($result,$first_comment,$end_comment-$first_comment+3) = '';
    $first_comment = index($result,'<!--',$first_comment);
     }      }
       $result =~ s/^\s+$//gm; #remove empty lines
       $result =~ s/%/\\%/g;   #corrects %
       $result =~ s/(\s)+/$1/g; #removes more than one empty space
       $result =~ s/\\\\\s*\\vskip/\\vskip/gm;
       $result =~ s/ (<|>|) / \$$1\$ /g; #corrects < or >
       $result =~ s/\\\\\s*\\noindent\s*(\\\\)+/\\\\\\noindent /g;
       $result =~ s/{\\par }\s*\\\\/\\\\/gm;
    $result =~ s/\\\\\s+\[/ \[/g;
       $result =~ s/&#952;/\$\\theta\$/g; #converts theta from html into tex
       $result =~ s/\b_+\b/\\makebox\[1 cm\]\[b\]{\\hrulefill}/g;
 #-- writing .tex file in prtspool   #-- writing .tex file in prtspool 
  {      my $temp_file;
     my $temp_file;      my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout_".time."_".rand(10000000).".tex";
     $filename = "/home/httpd/prtspool/$ENV{'environment.firstname'}$ENV{'environment.lastname'}temp$ENV{'user.login.time'}.tex";      unless ($temp_file = Apache::File->new('>'.$filename)) {
     unless ($temp_file = Apache::File->new('>'.$filename)) {   $r->log_error("Couldn't open $filename for output $!");
  $r->log_error("Couldn't open $filename for output $!");   return SERVER_ERROR; 
  return SERVER_ERROR;       } 
     }       print $temp_file $result;
  print $temp_file $result;  
  }  
 $r->print(<<FINALEND);  $r->print(<<FINALEND);
 <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$filename">  <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$filename&$laystyle">
 </body>  </body>
 </html>  </html>
 FINALEND  FINALEND
 }  }
   
   sub additional_cleanup {
       my $result = shift;
       my $first_app = index($result,'\documentclass',0);
       $first_app = index($result,'\documentclass',$first_app+5);
       while ($first_app != -1) {
    my $second_app = index($result,'begin{document}',$first_app);
    $first_app = rindex($result,'\end{document}',$first_app);
    substr($result,$first_app,$second_app-$first_app+15) = '\vskip 3 mm';
    $first_app = index($result,'\documentclass',$first_app+5);
       }
       return $result;
   }
   sub page_cleanup {
       my $result = shift;
       $_ = $result;
       m/\\end{document}(\d*)$/;
       my $number_of_columns = $1;
       my $insert = '{';
       for (my $id=1;$id<=$number_of_columns;$id++) { $insert .='l'; }
       $insert .= '}';
       $result =~ s/(\\begin{longtable})INSERTTHEHEADOFLONGTABLE/$1$insert/g;
       $result =~ s/&\s*REMOVETHEHEADOFLONGTABLE\\\\/\\\\/g;
       $result =~ s/(\\vskip\s*\d+\s*mm)/}\\\\\\parbox{\\minipagewidth}{/g;
       $result =~ s/\\parbox{\\minipagewidth}{}\s*\\\\\s*(\\parbox{\\minipagewidth})/$1/g;
       return $result,$number_of_columns;
   }
   
 sub content_map {  sub content_map {
 #-- find a list of files to print  #-- find a list of files to print
Line 218  sub content_map { Line 325  sub content_map {
  $_ = $chunk;   $_ = $chunk;
         m/to=\"(\d+)\"/;          m/to=\"(\d+)\"/;
  push @number_seq,$1;   push @number_seq,$1;
  $startlink = index($map_string,'<link from="'.$1.'"',$startlink);   $startlink = index($map_string,'from="'.$1.'"',$startlink);
    $startlink = rindex($map_string,'<link ',$startlink);
     }      }
     my $stalink = index($map_string,' to="'.$number_seq[0].'"',$startlink);      my $stalink = index($map_string,' to="'.$number_seq[0].'"',$startlink);
     while ($stalink != -1) {      while ($stalink != -1) {
Line 233  sub content_map { Line 341  sub content_map {
     }      }
     for (my $i=0;$i<=$#number_seq;$i++) {      for (my $i=0;$i<=$#number_seq;$i++) {
  $stalink = index($map_string,' id="'.$number_seq[$i].'"',0);   $stalink = index($map_string,' id="'.$number_seq[$i].'"',0);
  $startlink = index($map_string,'src="',$stalink);          {    
       my $ahed1 = index($map_string,'src="',$stalink);
       my $ahed2 = index($map_string,'</resource>',$stalink);
       if ($ahed1 != -1) {
    if ($ahed1 < $ahed2) {
       $startlink = $ahed1;
    } else {
       $startlink = rindex($map_string,'src="',$stalink);
    }
       } else {
    $startlink = rindex($map_string,'src="',$stalink);
       }
   
    }
  $startlink = index($map_string,'"',$startlink);   $startlink = index($map_string,'"',$startlink);
  $endlink = index($map_string,'"',$startlink+1);   $endlink = index($map_string,'"',$startlink+1);
  $chunk = substr($map_string,$startlink,$endlink-$startlink+1);   $chunk = substr($map_string,$startlink,$endlink-$startlink+1);
Line 253  sub handler { Line 374  sub handler {
 #-- start form  #-- start form
     &headerform($r);      &headerform($r);
 #-- menu for output  #-- menu for output
     unless ($ENV{'form.phase'}) {      unless  ($ENV{'form.phase'}) {
  &menu_for_output($r);   &menu_for_output($r);
     }      }
 #-- core part   #-- core part 
     if ($ENV{'form.phase'} eq 'two') {      if ($ENV{'form.phase'} eq 'two') {
  &output_data($r);   &output_data($r);
   
     }      }
     return OK;      return OK;
   
Line 269  sub handler { Line 389  sub handler {
 __END__  __END__
   
   
   
   
   #### Test block
 #    my $ere;  #    my $ere;
 #    foreach $ere (%ENV) {  #    foreach $ere (%ENV) {
 # $r->print(' SS '.$ere.' => '.$ENV{$ere}.' FF '."\n\n");  # $result .= ' SS '.$ere.' => '.$ENV{$ere}.' FF '."\n\n";
 #    }  #    }
   ####

Removed from v.1.12  
changed lines
  Added in v.1.35


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.