Diff for /loncom/interface/lonprintout.pm between versions 1.130 and 1.133

version 1.130, 2003/04/21 17:53:10 version 1.133, 2003/04/30 16:35:09
Line 100  ENDMENUOUT1 Line 100  ENDMENUOUT1
 <input type="radio" name="choice" value="Standard LaTeX output for whole primary sequence">  Problem(s) plus page(s) or html/xml file(s) from <b>$title_for_sequence</b><br />  <input type="radio" name="choice" value="Standard LaTeX output for whole primary sequence">  Problem(s) plus page(s) or html/xml file(s) from <b>$title_for_sequence</b><br />
 ENDMENUOUT2  ENDMENUOUT2
     }      }
     if ($ENV{'request.role.adv'}) {  
  $r->print(<<ENDMENUOUT27);  
 <input type="radio" name="choice" value="Standard LaTeX output for the primary sequence with answers">  Problem(s) from <b>$title_for_sequence</b> with <font color="red"><b><i>answers</i></b></font><br />  
 ENDMENUOUT27  
     }  
     if (($ENV{'request.role'}=~m/^cc\./ or $ENV{'request.role'}=~m/^in\./ or $ENV{'request.role'}=~m/^ta\./) and ($ENV{'form.postdata'}=~/\/res\//)) {       if (($ENV{'request.role'}=~m/^cc\./ or $ENV{'request.role'}=~m/^in\./ or $ENV{'request.role'}=~m/^ta\./) and ($ENV{'form.postdata'}=~/\/res\//)) { 
  $r->print(<<ENDMENUOUT6);   $r->print(<<ENDMENUOUT6);
 <input type="radio" name="choice" value="Standard LaTeX output for the top level sequence">  All problems in this course (<b>warning:</b> this may be time consuming) <br />  <input type="radio" name="choice" value="Standard LaTeX output for the top level sequence">  All problems in this course (<b>warning:</b> this may be time consuming) <br />
Line 509  ENDPART Line 504  ENDPART
   $result.=' \end{document}'    $result.=' \end{document}'
       }        }
     } elsif ($choice eq 'Standard LaTeX output for the primary sequence' or       } elsif ($choice eq 'Standard LaTeX output for the primary sequence' or 
              $choice eq 'Standard LaTeX output for whole primary sequence' or                $choice eq 'Standard LaTeX output for whole primary sequence') {
              $choice eq 'Standard LaTeX output for the primary sequence with answers') {  
       #-- minimal sequence to which the current document belongs        #-- minimal sequence to which the current document belongs
         #-- where is the primary sequence containing file?          #-- where is the primary sequence containing file?
         my @master_seq = ();          my @master_seq = ();
Line 532  ENDPART Line 526  ENDPART
    my %moreenv;     my %moreenv;
    $moreenv{'form.grade_target'}='tex';     $moreenv{'form.grade_target'}='tex';
    $moreenv{'form.textwidth'}=$LaTeXwidth;     $moreenv{'form.textwidth'}=$LaTeXwidth;
    if ($choice eq 'Standard LaTeX output for the primary sequence with answers') {$moreenv{'form.texaward'}='SHOW_ANSWER';}  
    &Apache::lonnet::appenv(%moreenv);     &Apache::lonnet::appenv(%moreenv);
    #&Apache::lonnet::logthis("Trying to get $urlp with symb $symb");     #&Apache::lonnet::logthis("Trying to get $urlp with symb $symb");
    my $texversion=&Apache::lonnet::ssi($urlp,('symb'=>$symb));     my $texversion=&Apache::lonnet::ssi($urlp,('symb'=>$symb));
    &Apache::lonnet::delenv('form.grade_target','form.textwidth','form.texaward');     &Apache::lonnet::delenv('form.grade_target','form.textwidth');
    if ($urlp =~ m/\.page/) {     if ($urlp =~ m/\.page/) {
      ($texversion,my $number_of_columns_page) = &page_cleanup($texversion);       ($texversion,my $number_of_columns_page) = &page_cleanup($texversion);
      if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;}        if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} 
Line 917  sub character_chart { Line 910  sub character_chart {
     $result =~ s/&\#153;/\\texttrademark /g;      $result =~ s/&\#153;/\\texttrademark /g;
     $result =~ s/&\#156;/\\oe/g;      $result =~ s/&\#156;/\\oe/g;
     $result =~ s/&\#159;/\\\"Y/g;      $result =~ s/&\#159;/\\\"Y/g;
     $result =~ s/&(\#160|nbsp);?//g;      $result =~ s/&(\#160|nbsp);//g;
     $result =~ s/&(\#161|iexcl);/!\`/g;      $result =~ s/&(\#161|iexcl);/!\`/g;
     $result =~ s/&(\#162|cent);/\\textcent /g;      $result =~ s/&(\#162|cent);/\\textcent /g;
     $result =~ s/&(\#163|pound);/\\pounds /g;       $result =~ s/&(\#163|pound);/\\pounds /g; 
Line 1228  sub latex_corrections { Line 1221  sub latex_corrections {
 sub handler {  sub handler {
   
     my $r = shift;      my $r = shift;
       my $helper;
   
     # A hook for me to work without disturbing Alex.      # A hook for me to work without disturbing Alex.
     if ($ENV{'form.jeremy'}) {      if (!$ENV{'form.jeremy'}) {
  printWizard($r);          my $result = printHelper($r);
  return OK;          if (!ref($result)) {
               return $result;
           }
           $helper = $result;
     }      }
   
 #    my $loaderror=&Apache::lonnet::overloaderror($r);      my $loaderror=&Apache::lonnet::overloaderror($r);
 #    if ($loaderror) { return $loaderror; }      if ($loaderror) { return $loaderror; }
 #    $loaderror=      $loaderror=
 #       &Apache::lonnet::overloaderror($r,         &Apache::lonnet::overloaderror($r,
 #         $ENV{'course.'.$ENV{'request.course.id'}.'.home'});           $ENV{'course.'.$ENV{'request.course.id'}.'.home'});
 #    if ($loaderror) { return $loaderror; }      if ($loaderror) { return $loaderror; }
   
     $r->content_type('text/html');      $r->content_type('text/html');
     $r->send_http_header;      $r->send_http_header;
Line 1263  sub handler { Line 1260  sub handler {
      &sequence_content_menu(0,$r);       &sequence_content_menu(0,$r);
  } elsif($ENV{'form.choice'} eq 'Standard LaTeX output for the primary sequence') {   } elsif($ENV{'form.choice'} eq 'Standard LaTeX output for the primary sequence') {
      &sequence_content_menu(1,$r);       &sequence_content_menu(1,$r);
  } elsif($ENV{'form.choice'} eq 'Standard LaTeX output for the primary sequence with answers') {  
      &sequence_content_menu(1,$r);  
  } elsif($ENV{'form.choice'} eq 'All class print') {   } elsif($ENV{'form.choice'} eq 'All class print') {
      &additional_class_menu($r);       &additional_class_menu($r);
  } elsif($ENV{'form.choice'} eq 'Subdirectory print') {   } elsif($ENV{'form.choice'} eq 'Subdirectory print') {
Line 1290  sub handler { Line 1285  sub handler {
         
 }   } 
   
 sub new_output_data {  use Apache::lonhelper;
     my $r = shift;  
     $r->print(<<ENDPART);  
 <html>  
 <head>  
 <title>LON-CAPA output for printing</title>  
 </head>  
 <body bgcolor="FFFFFF">  
 <hr>  
 ENDPART  
   
     my $choice = $ENV{'form.PRINT_TYPE'};  sub printHelper {
     my $layout = $ENV{'form.FORMAT.layout'};  
     my $numberofcolumns = $ENV{'form.FORMAT.cols'};    
     my $papersize = $ENV{'form.FORMAT.paper'};            
     my $laystyle = 'book';  
     my $assignment =  $ENV{'form.assignment'};  
     if ($choice eq 'Subdirectory print') {  
  if ($ENV{'form.layout'} eq '') {$layout = 'CAPA';}  
  if ($ENV{'form.papersize'} eq '') {$papersize = 'Letter [8 1/2x11 in]';}  
  if ($ENV{'form.numberofcolumns'} eq '') {$numberofcolumns = 2;}  
     }  
     if (($choice eq 'current_document') && ($ENV{'form.url'}=~m|^/~|)) {  
  if ($ENV{'form.FORMAT.layout'} eq '') {$layout = 'CAPA';}  
  if ($ENV{'form.FORMAT.paper'} eq '') {$papersize = 'Letter [8 1/2x11 in]';}  
  if ($ENV{'form.FORMAT.cols'} eq '') {$numberofcolumns = 2;}  
     }  
     my $result = '';  
     my $number_of_columns = 1; #used only for pages to determine the width of the cell  
     my $selectionmade = '';  
     my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$layout,$numberofcolumns);  
     if ($numberofcolumns == 1) {  
  $textwidth=$ENV{'form.width'};  
  $textheight=$ENV{'form.height'};  
     }  
     my $LaTeXwidth;   
     if ($textwidth=~/(\d+\s*cm)/) {  
  $LaTeXwidth = $1*10;  
     } elsif ($textwidth=~/(\d+\s*mm)/) {  
  $LaTeXwidth = $1;  
     }  
     if ($choice eq 'current_document') {  
       #-- single document - problem, page, html, xml, ...    
       $selectionmade = 1;  
       if ($ENV{'form.url'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {  
         my %moreenv;  
         $moreenv{'form.grade_target'}='tex';  
         if (&Apache::lonnet::allowed('bre',$ENV{'form.url'})) {  
   $ENV{'form.url'}=~s/http:\/\/[^\/]+//;  
         }  
         $moreenv{'request.filename'}=$ENV{'form.url'};  
         $moreenv{'form.textwidth'}=$LaTeXwidth;  
         &Apache::lonnet::appenv(%moreenv);  
         my $texversion=&Apache::lonnet::ssi($ENV{'form.url'});  
         &Apache::lonnet::delenv('form.grade_target','form.textwidth','form.counter');  
         $result .= $texversion;  
         if ($ENV{'form.url'}=~m/\.page\s*$/) {  
   ($result,$number_of_columns) = &page_cleanup($result);  
         }  
       } else {  
   $result='\documentclass[letterpaper]{article}\usepackage{calc}\begin{document}Printout of this type of document is currently not supported: ';  
   if ($ENV{'form.url'}=~/\/(aboutme|syllabus|bulletinboard|smppg)$/) {  
       $result.=$1;  
   } else {  
       $result.=$ENV{'form.url'};  
   }  
   $result.=' \end{document}'  
       }  
     } elsif ($choice eq 'Standard LaTeX output for the primary sequence' or   
              $choice eq 'Standard LaTeX output for whole primary sequence') {  
       #-- minimal sequence to which the current document belongs  
         #-- where is the primary sequence containing file?  
         my @master_seq = ();  
  for (my $i=0; $i<$ENV{'form.numberoffiles'};$i++) {  
     if ($ENV{'form.whatfile'.$i}=~/\S/) {  
  push @master_seq,$ENV{'form.whatfile'.$i};  
     }  
  }  
         #-- produce an output string  
  my $flag_latex_header_remove = 'NO';  
  my $flag_page_in_sequence = 'NO';  
  for (my $i=0;$i<=$#master_seq;$i++) {  
            my ($urlp,$symb) = split /&&/, $master_seq[$i];  
     if ($choice eq 'Standard LaTeX output for the primary sequence') {  
               $selectionmade = 2;  
     } elsif ($choice eq 'Standard LaTeX output for whole primary sequence') {  
               $selectionmade = 3;  
     }  
    my %moreenv;  
    $moreenv{'form.grade_target'}='tex';  
    $moreenv{'form.textwidth'}=$LaTeXwidth;  
    &Apache::lonnet::appenv(%moreenv);  
    #&Apache::lonnet::logthis("Trying to get $urlp with symb $symb");  
    my $texversion=&Apache::lonnet::ssi($urlp,('symb'=>$symb));  
    &Apache::lonnet::delenv('form.grade_target','form.textwidth');  
    if ($urlp =~ m/\.page/) {  
      ($texversion,my $number_of_columns_page) = &page_cleanup($texversion);  
      if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;}   
      $texversion =~ s/\\end{document}\d*/\\end{document}/;  
      $flag_page_in_sequence = 'YES';  
    }   
    if ($flag_latex_header_remove ne 'NO') {  
      $texversion = &latex_header_footer_remove($texversion);  
    } else {  
      $texversion =~ s/\\end{document}//;  
    }  
    $result .= $texversion;           
    $flag_latex_header_remove = 'YES';     
  }  
  &Apache::lonnet::delenv('form.counter');  
  if ($flag_page_in_sequence eq 'YES') {$result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/;}  
  $result .= '\end{document}';  
     }  elsif ($choice eq 'Standard LaTeX output for the top level sequence') {  
         # where is the main sequence of the course?  
  $selectionmade = 4;  
  my $main_seq=&Apache::lonnet::clutter($ENV{'request.course.uri'});  
  my @file_seq = &coming_from_hash($main_seq);  
  for (my $i=0;$i<=$#file_seq;$i++) {  
     my ($path,$title,$symb) = split /&&/,$file_seq[$i];  
     $file_seq[$i] = $path.'&&'.$symb;  
  }  
  my $flag_latex_header_remove = 'NO';  
         #-- produce an output string  
  for (my $i=0;$i<=$#file_seq;$i++) {  
    if (not $file_seq[$i]=~/^&&/) {  
      my ($urlp,$symb) = split /&&/, $file_seq[$i];  
      $urlp=~s/\/home\/httpd\/html//;      
      if ($urlp=~m/\.(problem|exam|quiz|assess|survey|form|library)/) {  
  my %moreenv;  
  $moreenv{'form.grade_target'}='tex';  
  $moreenv{'form.textwidth'}=$LaTeXwidth;  
  &Apache::lonnet::appenv(%moreenv);  
  my $texversion=&Apache::lonnet::ssi($urlp,('symb'=>$symb));  
  &Apache::lonnet::delenv('form.grade_target','form.textwidth');      
  if ($flag_latex_header_remove ne 'NO') {  
     $texversion = &latex_header_footer_remove($texversion);  
  } else {  
     $texversion =~ s/\\end{document}//;  
  }  
  $result .= $texversion;    
  $flag_latex_header_remove = 'YES';  
      }  
    }  
  }      
  $result .= '\end{document}';  
     } elsif ($choice eq 'All class print') {   
     #-- prints assignments for whole class or for selected students    
  $selectionmade = 5;  
         my @students = ();  
  for (my $i=0; $i<$ENV{'form.numberofstudents'};$i++) {  
     if ($ENV{'form.whomtoprint'.$i}=~/:/) {  
  push @students,$ENV{'form.whomtoprint'.$i};  
     }  
  }  
  #where is the primary sequence containing current resource (the same for all students)?  
  my $symbolic = &Apache::lonnet::symbread($ENV{'form.url'});  
  my @sequence = split('___',$symbolic);  
  my $primary_sequence;  
   
  $primary_sequence=&Apache::lonnet::clutter($sequence[0]);  
  my @master_seq = &coming_from_hash($primary_sequence);   
  for (my $i=0;$i<=$#master_seq;$i++) {  
     my ($path,$title,$symb) = split /&&/,$master_seq[$i];  
     $master_seq[$i] = $path.'&&'.$symb;  
  }  
         #loop over students  
  my $flag_latex_header_remove = 'NO';   
  my %moreenv;  
  $moreenv{'form.textwidth'}=$LaTeXwidth;  
  &Apache::lonnet::appenv(%moreenv);  
  my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1);  
  foreach my $person (@students) {  
     my $current_output = '';   
     my ($usersection,$username,$userdomain) = split /:/,$person;  
     my $fullname = &get_name($username,$userdomain);  
             #goes through all resources, checks if they are available for current student, and produces output     
     foreach my $curresline (@master_seq)  {  
  my ($curres,$symb) = split /&&/, $curresline;  
                 if ($curres=~ m/\.(problem|exam|quiz|assess|survey|form|library)/) {  
     my ($map,$id,$res_url) = split(/___/,$symb);  
     if (&Apache::lonnet::allowed('bre',$res_url)) {  
  my $rendered = &Apache::loncommon::get_student_view($symb,$username,$userdomain,  
                                                                         $ENV{'request.course.id'},'tex');  
  if ($flag_latex_header_remove eq 'YES') {  
     $rendered = &latex_header_footer_remove($rendered);  
  } else {  
     $rendered =~ s/\\end{document}//;  
  }  
  $current_output .= $rendered;  
     }  
     $flag_latex_header_remove = 'YES';  
  }  
     }  
     my $courseidinfo = $ENV{'course.'.$ENV{'request.course.id'}.'.description'};  
     if ($current_output=~/\\documentclass/) {  
  $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm}\\usepackage{fancyhdr}\\pagestyle{fancy}\\rhead{}\\chead{} \\begin{document}\\noindent\\lhead{\\textit{\\textbf{$fullname}} - $courseidinfo \\hfill \\thepage \\\\ \\textit{$assignment}}\\vskip 3 mm /;  
     } else {  
  my $blanspages = '';  
  for (my $j=0;$j<$ENV{'form.addedpages'};$j++) {$blanspages.='\clearpage\strut\clearpage';}  
  $current_output = '\strut\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage \\vskip 3mm'.$blanspages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}} - '.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$assignment.'}}\hskip 1.4in } \vskip 5 mm '.$current_output;  
     }  
     $result .= $current_output;  
     &Apache::lonnet::delenv('form.counter');      
     &Apache::lonxml::init_counter();   
     &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,  
     'last student '.$fullname);  
  }  
  &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);  
  $result .= '\end{document}';  
  &Apache::lonnet::delenv('form.textwidth');  
     } elsif ($choice eq 'Subdirectory print') {        
     #prints selected problems from the subdirectory   
  $selectionmade = 6;  
         my @list_of_files = ();  
  for (my $i=0; $i<$ENV{'form.numberofproblems'};$i++) {  
     if ($ENV{'form.whattoprint'.$i}=~/^\//) {  
  push @list_of_files,$ENV{'form.whattoprint'.$i};  
     }  
  }  
  my $flag_latex_header_remove = 'NO';    
  for (my $i=0;$i<=$#list_of_files;$i++) {  
     my $urlp = $list_of_files[$i];  
     if ($urlp=~/\//) {  
  my %moreenv;  
  $moreenv{'form.grade_target'}='tex';  
  $moreenv{'form.textwidth'}=$LaTeXwidth;  
  &Apache::lonnet::appenv(%moreenv);  
  if ($urlp =~ m|/home/([^/]+)/public_html|) {  
     $urlp =~ s|/home/([^/]*)/public_html|/~$1|;  
  } else {  
     $urlp =~ s|^/home/httpd/html||;  
  }  
  my $texversion=&Apache::lonnet::ssi($urlp);  
  &Apache::lonnet::delenv('form.grade_target','form.textwidth');  
                 #this chunck is responsible for printing the path to problem  
  my $newurlp = '';  
  my $HowMany = length($urlp)*2;  
  if ($HowMany > $LaTeXwidth) {  
     my @temporrary = split '/',$urlp;  
     my $HowManyNew = 0;  
     for (my $ii=0;$ii<=$#temporrary;$ii++) {  
  if ($temporrary[$ii] ne '') {  
     $HowManyNew += length($temporrary[$ii])*2;  
     if ($HowManyNew < $LaTeXwidth ) {  
  $newurlp .=  '/'.$temporrary[$ii];  
     } else {  
  $HowManyNew = 0;  
  $newurlp .=  '|\vskip -1 mm \noindent \verb|';  
  $ii--;  
     }  
  }  
     }  
  }  
  $texversion =~ s/(\\begin{minipage}{\\textwidth})/$1 {\\small\\noindent\\verb|$newurlp\|\\vskip 0 mm}/;  
  if ($flag_latex_header_remove ne 'NO') {  
     $texversion = &latex_header_footer_remove($texversion);  
  } else {  
     $texversion =~ s/\\end{document}//;  
  }  
  $result .= $texversion;  
     }  
     $flag_latex_header_remove = 'YES';    
  }  
  $result .= '\end{document}';        
     }  
 #-------------------------------------------------------- corrections for the different page formats  
     $result = &page_format_transformation($papersize,$layout,$numberofcolumns,$choice,$result,$assignment);  
     if ($layout eq 'CBI') {  
         $laystyle = 'album';  
     }  
     $result = &latex_corrections($number_of_columns,$result);  
     #changes page's parameters for the one column output   
     if ($ENV{'form.numberofcolumns'} == 1) {  
  $result =~ s/\\textwidth= 9cm/\\textwidth= $ENV{'form.width'}/;  
  $result =~ s/\\textheight 25\.9cm/\\textheight $ENV{'form.height'}/;  
  $result =~ s/\\evensidemargin = -0\.57in/\\evensidemargin= $ENV{'form.leftmargin'}/;  
  $result =~ s/\\oddsidemargin = -0\.57in/\\oddsidemargin= $ENV{'form.leftmargin'}/;  
     }  
 #-- writing .tex file in prtspool   
     my $temp_file;  
     my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout_".time."_".rand(10000000).".tex";  
     unless ($temp_file = Apache::File->new('>'.$filename)) {  
  $r->log_error("Couldn't open $filename for output $!");  
  return SERVER_ERROR;   
     }   
     print $temp_file $result;  
 $r->print(<<FINALEND);  
 <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$filename&$laystyle&$numberofcolumns&$selectionmade">  
 </body>  
 </html>  
 FINALEND  
 }  
   
   
   
 ########################################################################################  
   
 use Apache::lonwizard;  
   
 sub printWizard {  
     my $r = shift;      my $r = shift;
   
     if ($ENV{'request.course.id'}) {      if ($ENV{'request.course.id'}) {
       my $fn=$ENV{'request.course.fn'};   my $fn=$ENV{'request.course.fn'};
       tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER(),0640);   tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER(),0640);
     }      }
   
     if ($r->header_only) {      if ($r->header_only) {
       if ($ENV{'browser.mathml'}) {          if ($ENV{'browser.mathml'}) {
         $r->content_type('text/xml');              $r->content_type('text/xml');
       } else {          } else {
         $r->content_type('text/html');              $r->content_type('text/html');
       }          }
       $r->send_http_header;          $r->send_http_header;
       return OK;          return OK;
     }      }
   
       # Send header, nocache
     if ($ENV{'browser.mathml'}) {      if ($ENV{'browser.mathml'}) {
       $r->content_type('text/xml');          $r->content_type('text/xml');
     } else {      } else {
       $r->content_type('text/html');          $r->content_type('text/html');
     }      }
     &Apache::loncommon::no_cache($r);      &Apache::loncommon::no_cache($r);
     $r->send_http_header;      $r->send_http_header;
     $r->rflush();      $r->rflush();
   
     my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu;      # Unfortunately, this helper is so complicated we have to
     #if the resource doesn't have a title, use the filename      # write it by hand
     if (!$resourceTitle) {  
       my $url = $ENV{'form.postdata'};  
       $resourceTitle = substr($url, rindex($url, '/') + 1);  
     }  
   
     my $wizard = Apache::lonwizard->new("Printing Wizard", $ENV{QUERY_STRING});     
   
     $wizard->declareVars(['PRINT_TYPE', 'FORMAT', 'url', 'symb', 'postdata' , 'RESOURCES', 'FILES', 'STUDENTS']);                   Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});
       
       my $helper = Apache::lonhelper::helper->new("Printing Wizard");
       
       # This will persistently load in the data we want from the
       # very first screen.
       if (defined($ENV{'form.symb'})) {
           $helper->{VARS}->{'symb'} = $ENV{'form.symb'};
       }
       if (defined($ENV{'form.postdata'})) {
           $helper->{VARS}->{'postdata'} = $ENV{'form.postdata'};
       }
       if (defined($ENV{'form.url'})) {
           $helper->{VARS}->{'url'} = $ENV{'form.url'};
       }
   
     $wizard->{VARS}->{'postdata'} = $ENV{'form.postdata'};       my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu;
     $wizard->{VARS}->{'url'} = $ENV{'form.postdata'};                                      if (!$resourceTitle) { # if the resource doesn't have a title, use the filename
     $wizard->{VARS}->{'symb'} = &Apache::lonnet::symbread($ENV{'form.postdata'});           my $url = $helper->{VARS}->{'postdata'};
           $resourceTitle = substr($url, rindex($url, '/') + 1);
       }
   
     my $subdir = &Apache::lonnet::filelocation("", $ENV{'form.postdata'});      Apache::lonhelper::registerHelperTags();
     $subdir =~ s|/[^/]+$||;  
   
     my $symb = $wizard->{VARS}->{'symb'};  # Extract map      # Extract map
       my $symb = $helper->{VARS}->{'symb'};
     my ($map, $id, $url) = split(/__/, $symb);      my ($map, $id, $url) = split(/__/, $symb);
   
       my $subdir = &Apache::lonnet::filelocation("", $helper->{VARS}->{'postdata'});
   
     # This really ought to be in some repository in loncommon or something where it can just be grabbed.      # "Delete everything after the last slash."
     my $problemFilter = sub {       $subdir =~ s|/[^/]+$||;
         my $name = shift;  
         return $name =~ m/^[^\.]+\.(problem|exam|quiz|assess|survey|form|library)$/;  
     };  
   
     # What can be printed is a very dynamic decision based on lots of factors. So we need to dynamically build this list.  
     # To prevent security leaks, states are only added to the wizard if they can be reached, which ensures manipulating the   
     # querystring won't allow anyone to reach states they shouldn't have permission to reach.  
   
     my $printChoices = [];   
   
       # What can be printed is a very dynamic decision based on
       # lots of factors. So we need to dynamically build this list.
       # To prevent security leaks, states are only added to the wizard
       # if they can be reached, which ensures manipulating the form input
       # won't allow anyone to reach states they shouldn't have permission
       # to reach.
   
       # printChoices is tracking the kind of printing the user can
       # do, and will be used in a choices construction later.
       # In the meantime we will be adding states and elements to
       # the helper by hand.
       my $printChoices = [];
       my $paramHash;
     # We can always print the current screen.      # We can always print the current screen.
     push @{$printChoices}, ['current_document', "Current resource \"<b>$resourceTitle</b>\" (prints what you just saw on the screen)", 'CHOOSE_FORMAT'];  
   
     if ($ENV{'form.postdata'}=~ /\/res\//) {      push @{$printChoices}, ["<b>$resourceTitle</b> (exactly what was on the screen)", 'current_document', 'FINAL'];
         # Allow problems from sequence  
         push @{$printChoices}, ['map_problems', "Problems from <b>$sequenceTitle</b>", 'CHOOSE_PROBLEMS'];  
         Apache::lonwizard::resource_multichoice->new($wizard, "CHOOSE_PROBLEMS", 'Select Problems', "Select problems to print from <b>$sequenceTitle</b>:", 'CHOOSE_FORMAT', 'RESOURCES', sub {my $res = shift; return $res->is_problem()}, undef, $map);  
   
       # If we're in a sequence...
       if ($helper->{VARS}->{'postdata'} =~ /\/res\//) {
           # Allow problems from sequence
           push @{$printChoices}, ["Problems from <b>$sequenceTitle</b>", 'map_problems', 'CHOOSE_PROBLEMS'];
         # Allow all resources from sequence          # Allow all resources from sequence
         push @{$printChoices}, ['map_problems_pages', "Problem(s) and page(s) or html/xml file(s) from \"<b>$sequenceTitle</b>\"", 'CHOOSE_PROBLEMS_HTML'];          push @{$printChoices}, ["Problems and pages from <b>$sequenceTitle</b>", 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML'];
         Apache::lonwizard::resource_multichoice->new($wizard, "CHOOSE_PROBLEMS_HTML", 'Select Resources', "Select resources to print from <b>$sequenceTitle</b>:", "CHOOSE_FORMAT", 'RESOURCES', sub {my $res = shift; return !$res->is_map()}, undef, $map);  
           my $isProblem = '$res->is_problem();';
           my $isProblemOrMap = '$res->is_problem() || $res->is_map()';
           my $isNotMap = '!$res->is_map();';
           my $symb = '$res->symb();';
           my $helperFragment = <<HELPERFRAGMENT;
     <state name="CHOOSE_PROBLEMS" title="Select Problems">
       <message>Select problems to print:</message>
       <resource variable="RESOURCES" multichoice="1">
         <nextstate>FINAL</nextstate>
         <filterfunc>return $isProblemOrMap</filterfunc>
         <choicefunc>return $isProblem</choicefunc>
         <mapurl>$map</mapurl>
         <valuefunc>return $symb</valuefunc>
         </resource>
       </state>
   
     <state name="CHOOSE_PROBLEMS_HTML" title="Select Resources">
       <message>Select resources to print:</message>
       <resource variable="RESOURCES" multichoice="1">
         <nextstate>FINAL</nextstate>
         <choicefunc>return $isNotMap;</choicefunc>
         <mapurl>$map</mapurl>
         <valuefunc>return $symb</valuefunc>
         </resource>
       </state>
   HELPERFRAGMENT
   
           &Apache::lonxml::xmlparse($r, 'helper', $helperFragment); 
     }      }
   
     # If the user is priviledged, allow them to print all       # If the user is priviledged, allow them to print all 
     # problems in the course, optionally for selected students      # problems in the course, optionally for selected students
     if (($ENV{'request.role'}=~m/^cc\./ or $ENV{'request.role'}=~m/^in\./ or $ENV{'request.role'}=~m/^ta\./) and ($ENV{'form.postdata'}=~/\/res\//)) {       if (($ENV{'request.role'}=~m/^cc\./ or $ENV{'request.role'}=~m/^in\./ or $ENV{'request.role'}=~m/^ta\./) and ($helper->{VARS}->{'postdata'}=~/\/res\//)) { 
         push @{$printChoices}, ['all_problems', 'All problems in this course (<b>warning:</b> this may be time consuming)', 'CHOOSE_FORMAT'];          push @{$printChoices}, ['<b>All problems</b> in course (may take a lot of time)', 'all_problems', 'ALL_PROBLEMS'];
         push @{$printChoices}, ['problems_for_students', "Problems from <b>$sequenceTitle</b> for selected students", 'CHOOSE_STUDENTS'];          push @{$printChoices}, ["Problems from <b>$sequenceTitle</b> for selected students", 'problems_for_students', 'CHOOSE_STUDENTS'];
         Apache::lonwizard::choose_student->new($wizard, "CHOOSE_STUDENTS", "Choose Students", "Select the students you wish to print the problems for:", 'CHOOSE_FORMAT', 'STUDENTS', 1);  
           my $isProblem = '$res->is_problem();';
           my $isProblemOrMap = '$res->is_problem() || $res->is_map()';
           my $symb = '$res->symb();';
           &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS);
     <state name="ALL_PROBLEMS" title="Select Problems">
       <message>Select problems to print:</message>
       <resource variable="RESOURCES" multichoice="1">
         <nextstate>FINAL</nextstate>
         <filterfunc>return $isProblemOrMap</filterfunc>
         <choicefunc>return $isProblem</choicefunc>
         <valuefunc>return $symb</valuefunc>
         </resource>
       </state>
   
     <state name="CHOOSE_STUDENTS" title="Choose Students">
       <message>Select the students you wish to print the problems for:</message>
       <student multichoice='1' variable="STUDENTS" nextstate="FINAL" />
       </state>
   CHOOSE_STUDENTS
     }      }
   
     # FIXME: That RE should come from a library somewhere.      # FIXME: That RE should come from a library somewhere.
     if ((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($ENV{'form.postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) {          if ((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) {    
         push @{$printChoices}, ['problems_from_directory', "Problems from current subdirectory <br /><b><small>$subdir</small></b>", 'CHOOSE_FROM_SUBDIR'];          push @{$printChoices}, ["Problems from <b>$subdir</b>", 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];
         Apache::lonwizard::choose_files->new($wizard, "CHOOSE_FROM_SUBDIR", "Select Files","Select problems you wish to print from <b>$subdir</b>:", 'CHOOSE_FORMAT', 'FILES', $subdir, $problemFilter);          
     }          my $f = '$filename';
           &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_FROM_SUBDIR);
     <state name="CHOOSE_FROM_SUBDIR" title="Select Files">
       <message>Select problems you wish to print from <b>$subdir</b></message>
       <files variable="FILES">
     # Despite the appearance of states before here, this is the first state.         <nextstate>FINAL</nextstate>
     Apache::lonwizard::switch_state->new($wizard, "START", "What do you want to print? Make a choice.", "PRINT_TYPE", $printChoices, "", "");        <filechoice>$subdir</filechoice>
          <filefilter>return $f =~ 
              m/^[^\.]+\.(problem|exam|quiz|assess|survey|form|library)$/;
         </filefilter>
       </state>
   CHOOSE_FROM_SUBDIR
       }
   
     Apache::lonprintout::page_format_state->new($wizard, "CHOOSE_FORMAT", "You can change page layout parameters here.", "FORMAT");         # Generate the first state, to select which resources get printed.
       Apache::lonhelper::state->new("START", "Selecting Resources to Print");
       $paramHash = Apache::lonhelper::getParamHash();
       $paramHash->{MESSAGE_TEXT} = "What do you want to print?";
       Apache::lonhelper::message->new();
     if ($ENV{'form.printWizDone'} ne 1) {      $paramHash = Apache::lonhelper::getParamHash();
       $r->print($wizard->display());      $paramHash->{'variable'} = 'PRINT_TYPE';
     } else {      $paramHash->{CHOICES} = $printChoices;
       &new_output_data($r);      Apache::lonhelper::choices->new();
     }      Apache::lonprintout::page_format_state->new("FORMAT");
   
       $helper->process();
   
       # MANUAL BAILOUT CONDITION:
       # If we're in the "final" state, bailout and return to handler
       if ($helper->{STATE} eq 'FINAL') {
           return $helper;
       }    
   
       $r->print($helper->display());
   
       Apache::lonhelper::unregisterHelperTags();
   
     untie %hash;      untie %hash;
   
   
     return OK;      return OK;
 }  }
   
Line 1717  package Apache::lonprintout::page_format Line 1485  package Apache::lonprintout::page_format
   
 =pod  =pod
   
 =head1 Wizard state: page_format_state  =head1 Helper element: page_format_state
   
   See lonhelper.pm documentation for discussion of the helper framework.
   
 See lonwizard.pm documentation for discussion of the wizard framework.  Apache::lonprintout::page_format_state is an element that gives the 
   user an opportunity to select the page layout they wish to print 
   with: Number of columns, portrait/landscape, and paper size. If you 
   want to change the paper size choices, change the @paperSize array 
   contents in this package.
   
 Apache::lonprintout::page_format_state is a state that gives the user an opportunity to select the page layout they wish to print with: Number of columns, portrait/landscape, and paper size. If you want to change the paper size choices, change the @paperSize array contents in this package.  page_format_state is always directly invoked in lonprintout.pm, so there
   is no tag interface. You actually pass parameters to the constructor.
   
 =over 4  =over 4
   
 =item * B<new>(parentLonWizReference, stateName, stateTitle, varName, nextState): varName is where the print information will be stored in the format FIXME. nextState is the state that follows this one.  =item * B<new>(varName): varName is where the print information will be stored in the format FIXME.
   
 =back  =back
   
 =cut  =cut
   
 use Apache::lonwizard;  use Apache::lonhelper;
   
 no strict;  no strict;
 @ISA = ("Apache::lonwizard::state");  @ISA = ("Apache::lonhelper::element");
 use strict;  use strict;
   
 my $maxColumns = 2;  my $maxColumns = 2;
Line 1747  my @paperSize = ("Letter [8 1/2x11 in]", Line 1522  my @paperSize = ("Letter [8 1/2x11 in]",
 #                   Paper type  #                   Paper type
   
 sub new {   sub new { 
     my $proto = shift;      my $self = Apache::lonhelper::element->new();
     my $class = ref($proto) || $proto;  
     my $self = bless $proto->SUPER::new(shift, shift, shift);  
   
     $self->{VAR_NAME} = shift;      $self->{'variable'} = shift;
     $self->{NEXT_STATE} = shift;      bless($self);
     return $self;      return $self;
 }  }
   
 sub render {  sub render {
     my $self = shift;      my $self = shift;
     my $wizard = $self->{WIZARD};      my $helper = Apache::lonhelper::getHelper();
     my $result = '';      my $result = '';
     my $var = $self->{VAR_NAME};      my $var = $self->{'variable'};
     my $curVal = $self->{WIZARD}->{VARS}->{$var};      my $curVal = $helper->{VARS}->{$var};
   
     my ($layout, $cols, $paper) = split(/\|/, $curVal);      my ($layout, $cols, $paper) = split(/\|/, $curVal);
   
     my $landscapeChecked = ($layout ne "L")? '' : 'checked ';  
     my $portraitChecked = $landscapeChecked ? '' : 'checked ';  
   
     $result .= <<STATEHTML;      $result .= <<STATEHTML;
   
 <p>How should the printing be formatted?</p>  <p>How should the printing be formatted?</p>
 <table cellpadding="3">  <table cellpadding="3">
   <tr>    <tr>
     <td align="center"><b>Orientation</b></td>      <td align="center"><b>Layout</b></td>
     <td align="center"><b>Number of Columns</b></td>      <td align="center"><b>Columns</b></td>
     <td align="center"><b>Paper size (<small>[width x height]</small>)</b></td>      <td align="center"><b>Paper type</b></td>
   </tr>    </tr>
   <tr>    <tr>
     <td>      <td>
       <input type="radio" name="${var}.layout" value="CBI" $landscapeChecked> Landscape<br />        <input type="radio" name="${var}.layout" value="L" checked='1' /> Landscape<br />
       <input type="radio" name="${var}.layout" value="CAPA" $portraitChecked> Portrait        <input type="radio" name="${var}.layout" value="P" /> Portrait
     </td>      </td>
     <td align="center">      <td>
       <select name="${var}.cols">        <select name="${var}.cols">
 STATEHTML  STATEHTML
   
     my $i;      my $i;
     $cols = 2;  
     for ($i = 1; $i <= $maxColumns; $i++) {      for ($i = 1; $i <= $maxColumns; $i++) {
         if ($i == $cols) {          if ($i == $cols) {
             $result .= "<option value='$i' selected>$i</option>\n";              $result .= "<option value='$i' selected>$i</option>\n";
Line 1802  STATEHTML Line 1571  STATEHTML
     $i = 0;      $i = 0;
     foreach (@paperSize) {      foreach (@paperSize) {
         if ($paper == $i) {          if ($paper == $i) {
             $result .= "<option selected value='$paperSize[$i]'>" . $paperSize[$i] . "</option>\n";              $result .= "<option selected value='$i'>" . $paperSize[$i] . "</option>\n";
         } else {          } else {
             $result .= "<option value='$paperSize[$i]'>" . $paperSize[$i] . "</option>\n";              $result .= "<option value='$i'>" . $paperSize[$i] . "</option>\n";
         }          }
         $i++;          $i++;
     }      }
   
     $result .= "</select></td></tr></table>";      $result .= "</select></td></tr></table>";
     $result .= '<input type="hidden" name="printWizDone" value="1" />';  
     return $result;      return $result;
 }  }
   

Removed from v.1.130  
changed lines
  Added in v.1.133


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