Diff for /loncom/interface/lonprintout.pm between versions 1.513 and 1.545.2.3

version 1.513, 2008/01/28 11:40:42 version 1.545.2.3, 2008/12/22 22:28:18
Line 38  use Apache::edit; Line 38  use Apache::edit;
 use Apache::File();  use Apache::File();
 use Apache::lonnavmaps;  use Apache::lonnavmaps;
 use Apache::admannotations;  use Apache::admannotations;
   use Apache::lonenc;
   use Apache::entities;
   
   use HTTP::Response;
   
 use LONCAPA::map();  use LONCAPA::map();
 use POSIX qw(strftime);  use POSIX qw(strftime);
Line 49  my %perm; Line 53  my %perm;
 my %parmhash;  my %parmhash;
 my $resources_printed;  my $resources_printed;
   
   # Global variables that describe errors in ssi calls detected  by ssi_with_retries.
   #
   
   my $ssi_error; # True if there was an ssi error.
   my $ssi_last_error_resource; # The resource URI that could not be fetched.
   my $ssi_last_error; # The error text from the server. (e.g. 500 Server timed out).
   
   #
   #  Our ssi max retry count.
   #
   
   my $ssi_retry_count = 5; # Some arbitrary value.
   
   
   
 # Fetch the contents of a resource, uninterpreted.  # Fetch the contents of a resource, uninterpreted.
 # This is used here to fetch a latex file to be included  # This is used here to fetch a latex file to be included
 # verbatim into the printout<  # verbatim into the printout<
Line 92  sub annotate { Line 111  sub annotate {
     return $result;      return $result;
 }  }
   
   
   #
   #   ssi_with_retries - Does the server side include of a resource.
   #                      if the ssi call returns an error we'll retry it up to
   #                      the number of times requested by the caller.
   #                      If we still have a proble, no text is appended to the
   #                      output and we set some global variables.
   #                      to indicate to the caller an SSI error occurred.  
   #                      All of this is supposed to deal with the issues described
   #                      in LonCAPA BZ 5631 see:
   #                      http://bugs.lon-capa.org/show_bug.cgi?id=5631
   #                      by informing the user that this happened.
   #
   # Parameters:
   #   resource   - The resource to include.  This is passed directly, without
   #                interpretation to lonnet::ssi.
   #   form       - The form hash parameters that guide the interpretation of the resource
   #                
   #   retries    - Number of retries allowed before giving up completely.
   # Returns:
   #   On success, returns the rendered resource identified by the resource parameter.
   # Side Effects:
   #   The following global variables can be set:
   #    ssi_error                - If an unrecoverable error occurred this becomes true.
   #                               It is up to the caller to initialize this to false
   #                               if desired.
   #    ssi_last_error_resource  - If an unrecoverable error occurred, this is the value
   #                               of the resource that could not be rendered by the ssi
   #                               call.
   #    ssi_last_error           - The error string fetched from the ssi response
   #                               in the event of an error.
   #
   sub ssi_with_retries {
       my ($resource, $retries, %form) = @_;
   
   
       my ($content, $response) = &Apache::loncommon::ssi_with_retries($resource, $retries, %form);
       if (!$response->is_success) {
    $ssi_error               = 1;
    $ssi_last_error_resource = $resource;
    $ssi_last_error          = $response->code . " " . $response->message;
           $content='\section*{!!! An error occurred !!!}';
    &Apache::lonnet::logthis("Error in SSI resource: $resource Error: $ssi_last_error");
       }
   
       return $content;
   
   }
   
   sub get_student_view_with_retries {
       my ($curresline,$retries,$username,$userdomain,$courseid,$target,$moreenv)=@_;
   
       my ($content, $response) = &Apache::loncommon::get_student_view_with_retries($curresline,$retries,$username,$userdomain,$courseid,$target,$moreenv);
       if (!$response->is_success) {
           $ssi_error               = 1;
           $ssi_last_error_resource = $curresline.' for user '.$username.':'.$userdomain;
           $ssi_last_error          = $response->code . " " . $response->message;
           $content='\section*{!!! An error occurred !!!}';
           &Apache::lonnet::logthis("Error in SSI (student view) resource: $curresline Error: $ssi_last_error User: $username:$userdomain");
       }
       return $content;
   
   }
   
 #  #
 #   printf_style_subst  item format_string repl  #   printf_style_subst  item format_string repl
 #    #  
Line 165  sub format_page_header { Line 248  sub format_page_header {
  # - Allow the assignment to be 2 lines (wrapped).   # - Allow the assignment to be 2 lines (wrapped).
  #   #
  my $chars_per_line = $width/2; # Character/textline.   my $chars_per_line = $width/2; # Character/textline.
   
   
  my $firstline = "$student $course";  
  if (length($firstline) > $chars_per_line) {  
     my $lastchar = $chars_per_line - length($student) - 1;  
     if ($lastchar > 0) {  
  $course = substr($course, 0, $lastchar);  
     } else { # Nothing left of course:  
  $course = '';  
     }  
  }  
  if (length($assignment) > $chars_per_line) {  
     $assignment = substr($assignment, 0, $chars_per_line);  
  }  
   
  $format =  "\\textbf{$student} $course \\hfill \\thepage \\\\ \\textit{$assignment}";  
   
     } else {          my $firstline = "$student $course";
  # An open question is how to handle long user formatted page headers...          if (length($firstline) > $chars_per_line) {
  # A possible future is to support e.g. %na so that the user can control              my $lastchar = $chars_per_line - length($student) - 1;
  # the truncation of the elements that can appear in the header.              if ($lastchar > 0) {
  #                  $course = substr($course, 0, $lastchar);
  $format =  &printf_style_subst("a", $format, $assignment);              } else {            # Nothing left of course:
  $format =  &printf_style_subst("c", $format, $course);                  $course = '';
  $format =  &printf_style_subst("n", $format, $student);              }
           }
  # If the user put %'s in the format string, they  must be escaped          if (length($assignment) > $chars_per_line) {
  # to \% else LaTeX will think they are comments and terminate              $assignment = substr($assignment, 0, $chars_per_line);
  # the line.. which is bad!!!          }
   
           $format =  "\\textbf{$student} $course \\hfill \\thepage \\\\ \\textit{$assignment}";
   
       } else {
           # An open question is how to handle long user formatted page headers...
           # A possible future is to support e.g. %na so that the user can control
           # the truncation of the elements that can appear in the header.
           #
           $format =  &printf_style_subst("a", $format, $assignment);
           $format =  &printf_style_subst("c", $format, $course);
           $format =  &printf_style_subst("n", $format, $student);
   
           # If the user put %'s in the format string, they  must be escaped
           # to \% else LaTeX will think they are comments and terminate
           # the line.. which is bad!!!
       }
       
       # If the user has role author, $course and $assignment are empty so
       # there is '\\ \\ ' in the page header. That's cause a error in LaTeX
       if($format =~ /\\\\\s\\\\\s/) {
           #TODO find sensible caption for page header
           my $testPrintout = '\\\\'.&mt('Construction Space').' \\\\'.&mt('Test-Printout ');
           $format =~ s/\\\\\s\\\\\s/$testPrintout/;
     }      }
           
   
Line 302  sub is_valid_alpha_code { Line 390  sub is_valid_alpha_code {
 sub is_code_valid {  sub is_code_valid {
     my ($code_value, $code_option) = @_;      my ($code_value, $code_option) = @_;
     my ($code_type, $code_length) = ('letter', 6); # defaults.      my ($code_type, $code_length) = ('letter', 6); # defaults.
     open(FG, $Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');      my @lines = &Apache::grades::get_scantronformat_file();
     foreach my $line (<FG>) {      foreach my $line (@lines) {
  my ($name, $type, $length) = (split(/:/, $line))[0,2,4];   my ($name, $type, $length) = (split(/:/, $line))[0,2,4];
  if($name eq $code_option) {   if($name eq $code_option) {
     $code_length = $length;      $code_length = $length;
Line 421  sub adjust_number_to_print { Line 509  sub adjust_number_to_print {
  #  Unmodified.   #  Unmodified.
     } else {      } else {
  # Error!!!!   # Error!!!!
   
  croak "bad SPLIT_PDFS: $split_pdf in lonprintout::adjust_number_to_print";   croak "bad SPLIT_PDFS: $split_pdf in lonprintout::adjust_number_to_print";
   
     }      }
 }  }
   
   
 sub character_chart {  sub character_chart {
       my $result = shift;
       return  &Apache::entities::replace_entities($result);
   }
   
   sub old_character_chart {
     my $result = shift;      my $result = shift;
     $result =~ s/&\#0?0?(7|9);//g;      $result =~ s/&\#0?0?(7|9);//g;
     $result =~ s/&\#0?(10|13);//g;      $result =~ s/&\#0?(10|13);//g;
Line 548  sub character_chart { Line 643  sub character_chart {
     $result =~ s/&(\#165|yen);/\\textyen /g;      $result =~ s/&(\#165|yen);/\\textyen /g;
     $result =~ s/&(\#166|brvbar);/\\textbrokenbar /g;      $result =~ s/&(\#166|brvbar);/\\textbrokenbar /g;
     $result =~ s/&(\#167|sect);/\\textsection /g;      $result =~ s/&(\#167|sect);/\\textsection /g;
     $result =~ s/&(\#168|uml);/\\texthighdieresis /g;      $result =~ s/&(\#168|uml);/\\"\{\} /g;
     $result =~ s/&(\#169|copy);/\\copyright /g;      $result =~ s/&(\#169|copy);/\\copyright /g;
     $result =~ s/&(\#170|ordf);/\\textordfeminine /g;      $result =~ s/&(\#170|ordf);/\\textordfeminine /g;
     $result =~ s/&(\#172|not);/\\ensuremath\{\\neg\}/g;      $result =~ s/&(\#172|not);/\\ensuremath\{\\neg\}/g;
Line 559  sub character_chart { Line 654  sub character_chart {
     $result =~ s/&(\#177|plusmn);/\\ensuremath\{\\pm\}/g;      $result =~ s/&(\#177|plusmn);/\\ensuremath\{\\pm\}/g;
     $result =~ s/&(\#178|sup2);/\\ensuremath\{^2\}/g;      $result =~ s/&(\#178|sup2);/\\ensuremath\{^2\}/g;
     $result =~ s/&(\#179|sup3);/\\ensuremath\{^3\}/g;      $result =~ s/&(\#179|sup3);/\\ensuremath\{^3\}/g;
     $result =~ s/&(\#180|acute);/\\textacute /g;      $result =~ s/&(\#180|acute);/\\'\{\} /g;
     $result =~ s/&(\#181|micro);/\\ensuremath\{\\mu\}/g;      $result =~ s/&(\#181|micro);/\\ensuremath\{\\mu\}/g;
     $result =~ s/&(\#182|para);/\\P/g;      $result =~ s/&(\#182|para);/\\P/g;
     $result =~ s/&(\#183|middot);/\\ensuremath\{\\cdot\}/g;      $result =~ s/&(\#183|middot);/\\ensuremath\{\\cdot\}/g;
Line 742  sub character_chart { Line 837  sub character_chart {
     $result =~ s/&(hearts|\#9829);/\\ensuremath\{\\heartsuit\}/g;      $result =~ s/&(hearts|\#9829);/\\ensuremath\{\\heartsuit\}/g;
     $result =~ s/&(diams|\#9830);/\\ensuremath\{\\diamondsuit\}/g;      $result =~ s/&(diams|\#9830);/\\ensuremath\{\\diamondsuit\}/g;
 #   Chemically useful 'things' contributed by Hon Kie (bug 4652).  #   Chemically useful 'things' contributed by Hon Kie (bug 4652).
   
     $result =~ s/&\#8636;/\\ensuremath\{\\leftharpoonup\}/g;      $result =~ s/&\#8636;/\\ensuremath\{\\leftharpoonup\}/g;
     $result =~ s/&\#8637;/\\ensuremath\{\\leftharpoondown\}/g;      $result =~ s/&\#8637;/\\ensuremath\{\\leftharpoondown\}/g;
     $result =~ s/&\#8640;/\\ensuremath\{\\rightharpoonup\}/g;      $result =~ s/&\#8640;/\\ensuremath\{\\rightharpoonup\}/g;
Line 781  my %page_formats= Line 877  my %page_formats=
      'legal' => {       'legal' => {
  'book' => {   'book' => {
      '1' => ['7.1 in','13 in',,'-0.57 in','-0.57 in','-0.5 in'],       '1' => ['7.1 in','13 in',,'-0.57 in','-0.57 in','-0.5 in'],
      '2' => ['3.16 in','13 in','-0.57 in','-0.57 in','-0.5 in']       '2' => ['3.66 in','13 in','-0.57 in','-0.57 in','-0.5 in']
  },   },
  'album' => {   'album' => {
      '1' => ['12 in','7.1 in',,'-0.57 in','-0.57 in','-0.5 in'],       '1' => ['12 in','7.1 in',,'-0.57 in','-0.57 in','-0.5 in'],
Line 1060  sub print_latex_header { Line 1156  sub print_latex_header {
      '\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n".       '\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n".
      '\usepackage{wrapfig}'.       '\usepackage{wrapfig}'.
      '\usepackage{picins}\usepackage{calc}'."\n".       '\usepackage{picins}\usepackage{calc}'."\n".
        '\usepackage[T1]{fontenc}'."\n".
                '\usepackage{lmodern}'."\n".
        '\usepackage[postscript]{ucs}'."\n".
        '\usepackage[utf8x]{inputenc}'."\n".
        '\usepackage{pifont}'  . "\n".
        '\usepackage{latexsym}'."\n".
        '\usepackage{amsmath}'.
        '\usepackage{amssymb}'.
        '\usepackage{amsfonts}'.
        '\usepackage{amsthm}'.
        '\usepackage{amscd}'.
      '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n".       '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n".
      '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n".       '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n".
      '\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}'."\n".       '\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}'."\n".
Line 1171  sub recently_generated { Line 1278  sub recently_generated {
     $cuid,$cgid,$crdev,$csize,      $cuid,$cgid,$crdev,$csize,
     $catime,$cmtime,$cctime,      $catime,$cmtime,$cctime,
     $cblksize,$cblocks)=stat($prtspool.'/'.$filename);      $cblksize,$cblocks)=stat($prtspool.'/'.$filename);
  my $result="<a href='/prtspool/$filename'>".          my $ext_text = 'pdf' ? &mt('PDF File'):&mt('Zip File');
     &mt('Generated [_1] ([_2] bytes)',   my $result=&Apache::loncommon::start_data_table_row()
  &Apache::lonlocal::locallocaltime($cctime),$csize).                    .'<td>'
  '</a><br />';                    .'<a href="/prtspool/'.$filename.'">'.$ext_text.'</a>'
                     .'</td>'
                     .'<td>'.&Apache::lonlocal::locallocaltime($cctime).'</td>'
                     .'<td align="right">'.$csize.'</td>'
                     .&Apache::loncommon::end_data_table_row();
  if ($ext eq 'pdf') { $pdf_result .= $result; }   if ($ext eq 'pdf') { $pdf_result .= $result; }
  if ($ext eq 'zip') { $zip_result .= $result; }   if ($ext eq 'zip') { $zip_result .= $result; }
     }      }
       if ($zip_result || $pdf_result) {
           $r->print('<hr />');
       }
     if ($zip_result) {      if ($zip_result) {
  $r->print('<h4>'.&mt('Recently generated printout zip files')."</h4>\n"   $r->print('<h3>'.&mt('Recently generated printout zip files')."</h3>\n"
   .$zip_result);                    .&Apache::loncommon::start_data_table()
                     .&Apache::loncommon::start_data_table_header_row()
                     .'<th>'.&mt('Download').'</th>'
                     .'<th>'.&mt('Creation Date').'</th>'
                     .'<th>'.&mt('File Size (Bytes)').'</th>'
                     .&Apache::loncommon::end_data_table_header_row()
                     .$zip_result
                     .&Apache::loncommon::end_data_table()
           );
     }      }
     if ($pdf_result) {      if ($pdf_result) {
  $r->print('<h4>'.&mt('Recently generated printouts')."</h4>\n"   $r->print('<h3>'.&mt('Recently generated printouts')."</h3>\n"
   .$pdf_result);                    .&Apache::loncommon::start_data_table()
                     .&Apache::loncommon::start_data_table_header_row()
                     .'<th>'.&mt('Download').'</th>'
                     .'<th>'.&mt('Creation Date').'</th>'
                     .'<th>'.&mt('File Size (Bytes)').'</th>'
                     .&Apache::loncommon::end_data_table_header_row()
                     .$pdf_result
                     .&Apache::loncommon::end_data_table()
           );
     }      }
 }  }
   
Line 1251  sub print_construction_sequence { Line 1381  sub print_construction_sequence {
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
  $form{'rndseed'}=$rndseed;   $form{'rndseed'}=$rndseed;
  $resources_printed .=$urlp.':';   $resources_printed .=$urlp.':';
  $texversion=&Apache::lonnet::ssi($urlp,%form);   $texversion=&ssi_with_retries($urlp, $ssi_retry_count, %form);
     }      }
     if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||      if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
  ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) &&    ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) && 
Line 1264  sub print_construction_sequence { Line 1394  sub print_construction_sequence {
  $answerform{'problem_split'}=$parmhash{'problem_stream_switch'};   $answerform{'problem_split'}=$parmhash{'problem_stream_switch'};
  if ($urlp=~/\/res\//) {$env{'request.state'}='published';}   if ($urlp=~/\/res\//) {$env{'request.state'}='published';}
  $resources_printed .= $urlp.':';   $resources_printed .= $urlp.':';
  my $answer=&Apache::lonnet::ssi($urlp,%answerform);   my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform);
  if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {   if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
     $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;      $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
  } else {   } else {
Line 1319  sub print_construction_sequence { Line 1449  sub print_construction_sequence {
 sub output_data {  sub output_data {
     my ($r,$helper,$rparmhash) = @_;      my ($r,$helper,$rparmhash) = @_;
     my %parmhash = %$rparmhash;      my %parmhash = %$rparmhash;
       $ssi_error = 0; # This will be set nonzero by failing ssi's.
     $resources_printed = '';      $resources_printed = '';
     my $do_postprocessing = 1;      my $do_postprocessing = 1;
     my $js = <<ENDPART;      my $js = <<ENDPART;
Line 1405  ENDPART Line 1536  ENDPART
     }      }
           
     if ($helper->{'VARS'}->{'style_file'}=~/\w/) {      if ($helper->{'VARS'}->{'style_file'}=~/\w/) {
  &Apache::lonnet::appenv('construct.style' =>   &Apache::lonnet::appenv({'construct.style' =>
  $helper->{'VARS'}->{'style_file'});   $helper->{'VARS'}->{'style_file'}});
     } elsif ($env{'construct.style'}) {      } elsif ($env{'construct.style'}) {
  &Apache::lonnet::delenv('construct\\.style');   &Apache::lonnet::delenv('construct\\.style');
     }      }
Line 1449  ENDPART Line 1580  ENDPART
     $rndseed=$helper->{'VARS'}->{'curseed'};      $rndseed=$helper->{'VARS'}->{'curseed'};
  }   }
  $form{'rndseed'}=$rndseed;   $form{'rndseed'}=$rndseed;
  &Apache::lonnet::appenv(%moreenv);   &Apache::lonnet::appenv(\%moreenv);
   
  &Apache::lonxml::clear_problem_counter();   &Apache::lonxml::clear_problem_counter();
   
  $resources_printed .= $currentURL.':';   $resources_printed .= $currentURL.':';
  $texversion.=&Apache::lonnet::ssi($currentURL,%form);   $texversion.=&ssi_with_retries($currentURL,$ssi_retry_count, %form);
   
  #  Add annotations if required:   #  Add annotations if required:
           
Line 1475  ENDPART Line 1606  ENDPART
     $form{'problemtype'}='exam';      $form{'problemtype'}='exam';
  }   }
  $resources_printed .= $currentURL.':';   $resources_printed .= $currentURL.':';
  my $answer=&Apache::lonnet::ssi($currentURL,%form);   my $answer=&ssi_with_retries($currentURL,$ssi_retry_count, %form);
   
   
  if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {   if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
Line 1536  ENDPART Line 1667  ENDPART
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
  if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;}   if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;}
  $resources_printed .= $currentURL.':';   $resources_printed .= $currentURL.':';
  my $texversion=&Apache::lonnet::ssi($currentURL,%form);   my $texversion=&ssi_with_retries($currentURL, $ssi_retry_count, %form);
  if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {   if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
     my $annotation = &annotate($currentURL);      my $annotation = &annotate($currentURL);
     $texversion    =~ s/(\\end{document})/$annotation$1/;      $texversion    =~ s/(\\end{document})/$annotation$1/;
Line 1563  ENDPART Line 1694  ENDPART
              ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or               ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or
              ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems')       or               ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems')       or
      ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources')      or # BUGBUG       ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources')      or # BUGBUG
      ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences')) {        ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences') 
        ) { 
   
   
         #-- produce an output string          #-- produce an output string
Line 1571  ENDPART Line 1703  ENDPART
     $selectionmade = 2;      $selectionmade = 2;
  } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') {   } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') {
     $selectionmade = 3;      $selectionmade = 3;
  } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') {   } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') 
    ) {
     $selectionmade = 4;      $selectionmade = 4;
  } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') {  #BUGBUG   } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') {  #BUGBUG
     $selectionmade = 4;      $selectionmade = 4;
Line 1597  ENDPART Line 1730  ENDPART
  my $pbreakresources = keys %page_breaks;   my $pbreakresources = keys %page_breaks;
  for (my $i=0;$i<=$#master_seq;$i++) {   for (my $i=0;$i<=$#master_seq;$i++) {
   
       &Apache::lonenc::reset_enc();
   
   
     # Note due to document structure, not allowed to put \newpage      # Note due to document structure, not allowed to put \newpage
     # prior to the first resource      # prior to the first resource
   
Line 1605  ENDPART Line 1741  ENDPART
     $result.="\\newpage\n";      $result.="\\newpage\n";
  }   }
     }      }
     my ($sequence,undef,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]);      my ($sequence,$middle_thingy,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]);
     $urlp=&Apache::lonnet::clutter($urlp);      $urlp=&Apache::lonnet::clutter($urlp);
     $form{'symb'}=$master_seq[$i];      $form{'symb'}=$master_seq[$i];
   
   
     my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #title of the assignment which contains this problem      my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #title of the assignment which contains this problem
   
     if ($selectionmade==7) {$helper->{VARS}->{'assignment'}=$assignment;}      if ($selectionmade==7) {$helper->{VARS}->{'assignment'}=$assignment;}
     if ($i==0) {$prevassignment=$assignment;}      if ($i==0) {$prevassignment=$assignment;}
     my $texversion='';      my $texversion='';
Line 1617  ENDPART Line 1755  ENDPART
  && $urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {   && $urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
  $resources_printed .= $urlp.':';   $resources_printed .= $urlp.':';
  &Apache::lonxml::remember_problem_counter();   &Apache::lonxml::remember_problem_counter();
  $texversion.=&Apache::lonnet::ssi($urlp,%form);   $texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %form);
  if ($urlp=~/\.page$/) {   if ($urlp=~/\.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 1634  ENDPART Line 1772  ENDPART
     $resources_printed .= $urlp.':';      $resources_printed .= $urlp.':';
   
     &Apache::lonxml::restore_problem_counter();      &Apache::lonxml::restore_problem_counter();
     my $answer=&Apache::lonnet::ssi($urlp,%answerform);      my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform);
   
     if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {      if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
  $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;   $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
Line 1689  ENDPART Line 1827  ENDPART
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
  if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;}   if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;}
  $resources_printed .= $urlp.':';   $resources_printed .= $urlp.':';
  my $texversion=&Apache::lonnet::ssi($urlp,%form);   my $texversion=&ssi_with_retries($urlp, $ssi_retry_count, %form);
  if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {   if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
     my $annotation = &annotate($urlp);      my $annotation = &annotate($urlp);
     $texversion =~ s/(\\end{document)/$annotation$1/;      $texversion =~ s/(\\end{document)/$annotation$1/;
Line 1721  ENDPART Line 1859  ENDPART
  }   }
  $result .= '\end{document}';   $result .= '\end{document}';
      } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') ||       } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') ||
         ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_students') ||
       ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')){        ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')){
   
   
      #-- prints assignments for whole class or for selected students         #-- prints assignments for whole class or for selected students  
  my $type;   my $type;
  if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') {   if (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') ||
        ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_students') ) {
      $selectionmade=5;       $selectionmade=5;
      $type='problems';       $type='problems';
  } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students') {   } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students') {
Line 1823  ENDPART Line 1963  ENDPART
  my $selected_code = $helper->{'VARS'}->{'CODE_SELECTED_FROM_LIST'};   my $selected_code = $helper->{'VARS'}->{'CODE_SELECTED_FROM_LIST'};
   
  my $code_option=$helper->{'VARS'}->{'CODE_OPTION'};   my $code_option=$helper->{'VARS'}->{'CODE_OPTION'};
  open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');           my @lines = &Apache::grades::get_scantronformat_file();
  my ($code_type,$code_length)=('letter',6);   my ($code_type,$code_length)=('letter',6);
  foreach my $line (<FH>) {   foreach my $line (@lines) {
      my ($name,$type,$length) = (split(/:/,$line))[0,2,4];       my ($name,$type,$length) = (split(/:/,$line))[0,2,4];
      if ($name eq $code_option) {       if ($name eq $code_option) {
  $code_length=$length;   $code_length=$length;
Line 1916  ENDPART Line 2056  ENDPART
     $rndseed=$helper->{'VARS'}->{'curseed'};      $rndseed=$helper->{'VARS'}->{'curseed'};
  }   }
  for (my $i=0;$i<=$#list_of_files;$i++) {   for (my $i=0;$i<=$#list_of_files;$i++) {
   
       &Apache::lonenc::reset_enc();
   
     my $urlp = $list_of_files[$i];      my $urlp = $list_of_files[$i];
     $urlp=~s|//|/|;      $urlp=~s|//|/|;
     if ($urlp=~/\//) {      if ($urlp=~/\//) {
Line 1927  ENDPART Line 2070  ENDPART
     $urlp =~ s|^$Apache::lonnet::perlvar{'lonDocRoot'}||;      $urlp =~ s|^$Apache::lonnet::perlvar{'lonDocRoot'}||;
  }   }
  $resources_printed .= $urlp.':';   $resources_printed .= $urlp.':';
  my $texversion=&Apache::lonnet::ssi($urlp,%form);   my $texversion=&ssi_with_retries($urlp, $ssi_retry_count, %form);
  if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||   if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
    ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {     ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
     #  Don't permanently pervert %form:      #  Don't permanently pervert %form:
Line 1937  ENDPART Line 2080  ENDPART
     $answerform{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};      $answerform{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
     $answerform{'rndseed'}=$rndseed;      $answerform{'rndseed'}=$rndseed;
     $resources_printed .= $urlp.':';      $resources_printed .= $urlp.':';
     my $answer=&Apache::lonnet::ssi($urlp,%answerform);      my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform);
     if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {      if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
  $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;   $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
     } else {      } else {
Line 1954  ENDPART Line 2097  ENDPART
  $texversion.='\vskip 1 mm '.$answer.'\end{document}';   $texversion.='\vskip 1 mm '.$answer.'\end{document}';
     }      }
  }   }
                 #this chunck is responsible for printing the path to problem                  #this chunk is responsible for printing the path to problem
   
  my $newurlp=$urlp;   my $newurlp=$urlp;
  if ($newurlp=~/~/) {$newurlp=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|;}   if ($newurlp=~/~/) {$newurlp=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|;}
  $newurlp=&path_to_problem($newurlp,$LaTeXwidth);   $newurlp=&path_to_problem($newurlp,$LaTeXwidth);
Line 1994  ENDPART Line 2138  ENDPART
  #}   #}
     }      }
   
       # Set URLback if this is a construction space print so we can provide
       # a link to the resource being edited.
       #
   
       my $URLback=''; #link to original document
       if ($helper->{'VARS'}->{'construction'} eq '1') {
    #prints resource from the construction space
    $URLback='/'.$helper->{'VARS'}->{'filename'};
    if ($URLback=~/([^?]+)/) {
       $URLback=$1;
       $URLback=~s|^/~|/priv/|;
    }
       }
   
 #-- writing .tex file in prtspool   #-- writing .tex file in prtspool 
     my $temp_file;      my $temp_file;
     my $identifier = &Apache::loncommon::get_cgi_id();      my $identifier = &Apache::loncommon::get_cgi_id();
     my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout_$identifier.tex";      my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout_$identifier.tex";
     if (!($#print_array>0)) {       if (!($#print_array>0)) { 
  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;
  my $begin=index($result,'\begin{document}',0);         my $begin=index($result,'\begin{document}',0);
  my $inc=substr($result,0,$begin+16);         my $inc=substr($result,0,$begin+16); 
     } else {      } else {
  my $begin=index($result,'\begin{document}',0);         my $begin=index($result,'\begin{document}',0);
  my $inc=substr($result,0,$begin+16);         my $inc=substr($result,0,$begin+16);
         for (my $i=0;$i<=$#print_array;$i++) {         for (my $i=0;$i<=$#print_array;$i++) {
     if ($i==0) {    if ($i==0) {
  $print_array[$i]=$result;        $print_array[$i]=$result;
     } else {    } else {
  $print_array[$i].='\end{document}';        $print_array[$i].='\end{document}';
  $print_array[$i] =         $print_array[$i] = 
     &latex_corrections($number_of_columns,$print_array[$i],   &latex_corrections($number_of_columns,$print_array[$i],
        $selectionmade,      $selectionmade, 
        $helper->{'VARS'}->{'ANSWER_TYPE'});     $helper->{'VARS'}->{'ANSWER_TYPE'});
       
  my $anobegin=index($print_array[$i],'\setcounter{page}',0);        my $anobegin=index($print_array[$i],'\setcounter{page}',0);
  substr($print_array[$i],0,$anobegin)='';        substr($print_array[$i],0,$anobegin)='';
  $print_array[$i]=$inc.$print_array[$i];        $print_array[$i]=$inc.$print_array[$i];
     }    }
     my $temp_file;    my $temp_file;
     my $newfilename=$filename;    my $newfilename=$filename;
     my $num=$i+1;    my $num=$i+1;
     $newfilename =~s/\.tex$//;     $newfilename =~s/\.tex$//; 
     $newfilename=sprintf("%s_%03d.tex",$newfilename, $num);    $newfilename=sprintf("%s_%03d.tex",$newfilename, $num);
     unless ($temp_file = Apache::File->new('>'.$newfilename)) {    unless ($temp_file = Apache::File->new('>'.$newfilename)) {
  $r->log_error("Couldn't open $newfilename for output $!");        $r->log_error("Couldn't open $newfilename for output $!");
  return SERVER_ERROR;         return SERVER_ERROR; 
     }    }
     print $temp_file $print_array[$i];    print $temp_file $print_array[$i];
  }         }
     }      }
     my $student_names='';      my $student_names='';
     if ($#print_array>0) {      if ($#print_array>0) {
  for (my $i=0;$i<=$#print_array;$i++) {          for (my $i=0;$i<=$#print_array;$i++) {
     $student_names.=$student_names[$i].'_ENDPERSON_';     $student_names.=$student_names[$i].'_ENDPERSON_';
  }   }
     } else {      } else {
  if ($#student_names>-1) {   if ($#student_names>-1) {
     $student_names=$student_names[0].'_ENDPERSON_';     $student_names=$student_names[0].'_ENDPERSON_';
  } else {   } else {
     my $fullname = &get_name($env{'user.name'},$env{'user.domain'});             my $fullname = &get_name($env{'user.name'},$env{'user.domain'});
     $student_names=join(':',$env{'user.name'},$env{'user.domain'},     $student_names=join(':',$env{'user.name'},$env{'user.domain'},
  $env{'request.course.sec'},$fullname).      $env{'request.course.sec'},$fullname).
     '_ENDPERSON_'.'_END_';   '_ENDPERSON_'.'_END_';
  }  
     }  
   
     my $URLback=''; #link to original document  
     if ($helper->{'VARS'}->{'construction'} eq '1') {  
  #prints resource from the construction space  
  $URLback='/'.$helper->{'VARS'}->{'filename'};  
  if ($URLback=~/([^?]+)/) {  
     $URLback=$1;  
     $URLback=~s|^/~|/priv/|;  
  }   }
     }       }
     # logic for now is too complex to trace if this has been defined  
     #  yet.       # logic for now is too complex to trace if this has been defined
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};       #  yet.
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     &Apache::lonnet::appenv('cgi.'.$identifier.'.file'   => $filename,       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                             'cgi.'.$identifier.'.layout'  => $laystyle,       &Apache::lonnet::appenv({'cgi.'.$identifier.'.file'   => $filename,
                             'cgi.'.$identifier.'.numcol'  => $numberofcolumns,   'cgi.'.$identifier.'.layout'  => $laystyle,
     'cgi.'.$identifier.'.paper'  => $papersize,   'cgi.'.$identifier.'.numcol'  => $numberofcolumns,
                             'cgi.'.$identifier.'.selection' => $selectionmade,   'cgi.'.$identifier.'.paper'  => $papersize,
     'cgi.'.$identifier.'.tableofcontents' => $helper->{'VARS'}->{'TABLE_CONTENTS'},   'cgi.'.$identifier.'.selection' => $selectionmade,
     'cgi.'.$identifier.'.tableofindex' => $helper->{'VARS'}->{'TABLE_INDEX'},   'cgi.'.$identifier.'.tableofcontents' => $helper->{'VARS'}->{'TABLE_CONTENTS'},
     'cgi.'.$identifier.'.role' => $perm{'pav'},   'cgi.'.$identifier.'.tableofindex' => $helper->{'VARS'}->{'TABLE_INDEX'},
                             'cgi.'.$identifier.'.numberoffiles' => $#print_array,   'cgi.'.$identifier.'.role' => $perm{'pav'},
                             'cgi.'.$identifier.'.studentnames' => $student_names,   'cgi.'.$identifier.'.numberoffiles' => $#print_array,
                             'cgi.'.$identifier.'.backref' => $URLback,);   'cgi.'.$identifier.'.studentnames' => $student_names,
     &Apache::lonnet::appenv("cgi.$identifier.user"    => $env{'user.name'},   'cgi.'.$identifier.'.backref' => $URLback,});
     "cgi.$identifier.domain"  => $env{'user.domain'},      &Apache::lonnet::appenv({"cgi.$identifier.user"    => $env{'user.name'},
     "cgi.$identifier.courseid" => $cnum,    "cgi.$identifier.domain"  => $env{'user.domain'},
     "cgi.$identifier.coursedom" => $cdom,    "cgi.$identifier.courseid" => $cnum, 
     "cgi.$identifier.resources" => $resources_printed);   "cgi.$identifier.coursedom" => $cdom, 
    "cgi.$identifier.resources" => $resources_printed});
   
     my $end_page = &Apache::loncommon::end_page();      my $end_page = &Apache::loncommon::end_page();
     $r->print(<<FINALEND);      my $continue_text = &mt('Continue');
       # If there's been an unrecoverable SSI error, report it to the user
       if ($ssi_error) {
           my $helpurl = &Apache::loncommon::top_nav_help('Helpdesk');
           $r->print('<br /><h2>'.&mt('An unrecoverable network error occurred:').'</h2><p>  '.
                     &mt('At least one of the resources you chose to print could not be rendered due to an unrecoverable error when communicating with a server:').
                     '<br />'.$ssi_last_error_resource.'<br />'.$ssi_last_error.
                     '</p><p>'.&mt('You can continue using the link provided below, but make sure to carefully inspect your output file! The errors will be marked in the file.').'<br />'.
                     &mt('You may be able to reprint the individual resources for which this error occurred, as the issue may be temporary.').
                     '<br />'.&mt('If the error persists, please contact the [_1] for assistance.',$helpurl).'</p><p>'.
                     &mt('We apologize for the inconvenience.').'</p>'.
                     '<a href="/cgi-bin/printout.pl?'.$identifier.'">'.$continue_text.'</a>'.$end_page);
       } else {
    $r->print(<<FINALEND);
 <br />  <br />
 <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$identifier" />  <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$identifier" />
 <a href="/cgi-bin/printout.pl?$identifier">Continue</a>  <a href="/cgi-bin/printout.pl?$identifier">$continue_text</a>
 $end_page  $end_page
 FINALEND  FINALEND
       }                                     # endif ssi errors.
 }  }
   
   
Line 2160  sub print_resources { Line 2323  sub print_resources {
   
     &Apache::lonxml::remember_problem_counter();          &Apache::lonxml::remember_problem_counter();    
   
     my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);      my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
   
     if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||      if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
        ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {         ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
Line 2202  sub print_resources { Line 2365  sub print_resources {
     $current_output .= $rendered;          $current_output .= $rendered;    
  } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {   } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {
     $printed .= $curresline.':';      $printed .= $curresline.':';
     my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);      my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
     if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {      if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
  my $url = &Apache::lonnet::clutter($res_url);   my $url = &Apache::lonnet::clutter($res_url);
  my $annotation = &annotate($url);   my $annotation = &annotate($url);
Line 2285  sub handler { Line 2448  sub handler {
     if(-e $conversion_queuefile) {      if(-e $conversion_queuefile) {
  unlink $conversion_queuefile;   unlink $conversion_queuefile;
     }      }
       
   
     &output_data($r,$helper,\%parmhash);      &output_data($r,$helper,\%parmhash);
     return OK;      return OK;
 }   } 
Line 2321  sub get_randomly_ordered_warning { Line 2486  sub get_randomly_ordered_warning {
   
     my $postdata = $env{'form.postdata'} || $helper->{VARS}{'postdata'};      my $postdata = $env{'form.postdata'} || $helper->{VARS}{'postdata'};
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
     my $res = $navmap->getResourceByUrl($map);      if (defined($navmap)) {
     if ($res) {          my $res = $navmap->getResourceByUrl($map);
  my $func =           if ($res) {
     sub { return ($_[0]->is_map() && $_[0]->randomorder); };      my $func = 
  my @matches = $navmap->retrieveResources($res, $func,1,1,1);          sub { return ($_[0]->is_map() && $_[0]->randomorder); };
  if (@matches) {      my @matches = $navmap->retrieveResources($res, $func,1,1,1);
     $message = "Some of the items below are in folders set to be randomly ordered. However, when printing the contents of these folders, they will be printed in the original order for all students, not the randomized order.";      if (@matches) {
  }          $message = "Some of the items below are in folders set to be randomly ordered. However, when printing the contents of these folders, they will be printed in the original order for all students, not the randomized order.";
     }      }
     if ($message) {          }
  return '<message type="warning">'.$message.'</message>';          if ($message) {
       return '<message type="warning">'.$message.'</message>';
           }
       } else {
           &Apache::lonnet::logthis('Retrieval of resources to check for folders set to be randomly ordered failed - could not create navmap object');
           $message = "Retrieval of information about ordering of resources failed."; 
           return '<message type="warning">'.$message.'</message>';
     }      }
     return;      return;
 }  }
Line 2379  sub printHelper { Line 2550  sub printHelper {
     $helper->declareVar("showallfoils");      $helper->declareVar("showallfoils");
     $helper->declareVar("STUDENTS");      $helper->declareVar("STUDENTS");
   
   
      
   
   
     #  The page breaks can get loaded initially from the course environment:      #  The page breaks can get loaded initially from the course environment:
     # But we only do this in the initial state so that they are allowed to change.      # But we only do this in the initial state so that they are allowed to change.
     #      #
Line 2501  sub printHelper { Line 2676  sub printHelper {
     }      }
   
     # Useful filter strings      # Useful filter strings
     my $isProblem = '($res->is_problem()||$res->contains_problem) ';      my $isProblem = '($res->is_problem()||$res->contains_problem||$res->is_practice()) ';
     $isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden;      $isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden;
     my $isProblemOrMap = '$res->is_problem() || $res->contains_problem() || $res->is_sequence()';      my $isProblemOrMap = '$res->is_problem() || $res->contains_problem() || $res->is_sequence() || $res->is_practice()';
     my $isNotMap = '!$res->is_sequence()';      my $isNotMap = '!$res->is_sequence()';
     $isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden;      $isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden;
     my $isMap = '$res->is_map()';      my $isMap = '$res->is_map()';
Line 2564  HELPERFRAGMENT Line 2739  HELPERFRAGMENT
   
         push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b>'), 'all_problems', 'ALL_PROBLEMS'];          push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b>'), 'all_problems', 'ALL_PROBLEMS'];
  push @{$printChoices}, [&mtn('Selected <b>Resources</b> from <b>entire course</b>'), 'all_resources', 'ALL_RESOURCES'];   push @{$printChoices}, [&mtn('Selected <b>Resources</b> from <b>entire course</b>'), 'all_resources', 'ALL_RESOURCES'];
    push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b> for <b>selected people</b>'), 'all_problems_students', 'ALL_PROBLEMS_STUDENTS'];
          &Apache::lonxml::xmlparse($r, 'helper', <<ALL_PROBLEMS);           &Apache::lonxml::xmlparse($r, 'helper', <<ALL_PROBLEMS);
   <state name="ALL_PROBLEMS" title="Select Problem(s) to print">    <state name="ALL_PROBLEMS" title="Select Problem(s) to print">
     <resource variable="RESOURCES" toponly='0' multichoice="1"      <resource variable="RESOURCES" toponly='0' multichoice="1"
Line 2584  HELPERFRAGMENT Line 2760  HELPERFRAGMENT
       $start_new_option        $start_new_option
     </resource>      </resource>
   </state>    </state>
     <state name="ALL_PROBLEMS_STUDENTS" title="Select Problem(s) to print">
       <resource variable="RESOURCES" toponly='0' multichoice="1"
    suppressEmptySequences='0' addstatus="1" closeallpages="1">
         <nextstate>STUDENTS1</nextstate>
         <filterfunc>return $isProblemOrMap;</filterfunc>
         <choicefunc>return $isNotMap;</choicefunc>
         <valuefunc>return $symbFilter;</valuefunc>
         $start_new_option
       </resource>
     </state>
     <state name="STUDENTS1" title="Select People">
         <message><b>Select sorting order of printout</b> </message>
       <choices variable='student_sort'>
         <choice computer='0'>Sort by section then student</choice>
         <choice computer='1'>Sort by students across sections.</choice>
       </choices>
         <message><br /><hr /><br /> </message>
         <student multichoice='1' variable="STUDENTS" nextstate="PRINT_FORMATTING" coursepersonnel="1"/>
     </state>
   
 ALL_PROBLEMS  ALL_PROBLEMS
   
  if ($helper->{VARS}->{'assignment'}) {   if ($helper->{VARS}->{'assignment'}) {
Line 2693  CHOOSE_STUDENTS Line 2889  CHOOSE_STUDENTS
   
  }   }
   
           my @lines = &Apache::grades::get_scantronformat_file();
  open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');  
  my $codechoice='';   my $codechoice='';
  foreach my $line (<FH>) {   foreach my $line (@lines) {
     my ($name,$description,$code_type,$code_length)=      my ($name,$description,$code_type,$code_length)=
  (split(/:/,$line))[0,1,2,4];   (split(/:/,$line))[0,1,2,4];
     if ($code_length > 0 &&       if ($code_length > 0 && 
Line 2961  CHOOSE_FROM_ANY_SEQUENCE Line 3156  CHOOSE_FROM_ANY_SEQUENCE
   
     if (($perm{'pav'} and &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) or       if (($perm{'pav'} and &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) or 
  ($helper->{VARS}->{'construction'} eq '1')) {   ($helper->{VARS}->{'construction'} eq '1')) {
  addMessage("<hr width='33%' /><table><tr><td align='right'>".   &addMessage('<br />'
                    '<label for="ANSWER_TYPE_forminput">'.                     .'<h3>'.&mt('Print Options').'</h3>'
                    &mt('Print').                     .&Apache::lonhtmlcommon::start_pick_box()
                    "</label>: </td><td>");  #                  .&Apache::lonhtmlcommon::row_headline()
   #                  .'<h3>'.&mt('Print Options').'</h3>'
   #                  .&Apache::lonhtmlcommon::row_closure()
                      .&Apache::lonhtmlcommon::row_title(
                          '<label for="ANSWER_TYPE_forminput">'
                         .&mt('Print Answers')
                         .'</label>'
                       )
           );
         $paramHash = Apache::lonhelper::getParamHash();          $paramHash = Apache::lonhelper::getParamHash();
  $paramHash->{'variable'} = 'ANSWER_TYPE';      $paramHash->{'variable'} = 'ANSWER_TYPE';   
  $helper->declareVar('ANSWER_TYPE');            $helper->declareVar('ANSWER_TYPE');         
Line 2974  CHOOSE_FROM_ANY_SEQUENCE Line 3177  CHOOSE_FROM_ANY_SEQUENCE
                                    ['Only Answers', 'only']                                     ['Only Answers', 'only']
                                 ];                                  ];
         Apache::lonhelper::dropdown->new();          Apache::lonhelper::dropdown->new();
  addMessage("</td></tr>");   &addMessage(&Apache::lonhtmlcommon::row_closure());
  $startedTable = 1;   $startedTable = 1;
     }      }
   
Line 2986  CHOOSE_FROM_ANY_SEQUENCE Line 3189  CHOOSE_FROM_ANY_SEQUENCE
                        "</label>: </td><td>");                         "</label>: </td><td>");
     $startedTable = 1;      $startedTable = 1;
  } else {   } else {
     addMessage("<tr><td align='right'>".      &addMessage(&Apache::lonhtmlcommon::row_title(
                        '<label for="LATEX_TYPE_forminput">'.                             '<label for="LATEX_TYPE_forminput">'
                         &mt('LaTeX mode').                             .&mt('LaTeX mode')
                        "</label>: </td><td>");                             .'</label>'
                           )
               );
  }   }
         $paramHash = Apache::lonhelper::getParamHash();          $paramHash = Apache::lonhelper::getParamHash();
  $paramHash->{'variable'} = 'LATEX_TYPE';      $paramHash->{'variable'} = 'LATEX_TYPE';   
Line 3005  CHOOSE_FROM_ANY_SEQUENCE Line 3210  CHOOSE_FROM_ANY_SEQUENCE
  }   }
         Apache::lonhelper::dropdown->new();          Apache::lonhelper::dropdown->new();
     
  addMessage("</td></tr><tr><td align='right'>".   &addMessage(&Apache::lonhtmlcommon::row_closure()
                    '<label for="TABLE_CONTENTS_forminput">'.                     .&Apache::lonhtmlcommon::row_title(
                    &mt('Print Table of Contents').                          '<label for="TABLE_CONTENTS_forminput">'
                    "</label>: </td><td>");                         .&mt('Print Table of Contents')
                          .'</label>'
                       )
           );
         $paramHash = Apache::lonhelper::getParamHash();          $paramHash = Apache::lonhelper::getParamHash();
  $paramHash->{'variable'} = 'TABLE_CONTENTS';      $paramHash->{'variable'} = 'TABLE_CONTENTS';   
  $helper->declareVar('TABLE_CONTENTS');            $helper->declareVar('TABLE_CONTENTS');         
Line 3016  CHOOSE_FROM_ANY_SEQUENCE Line 3224  CHOOSE_FROM_ANY_SEQUENCE
                                    ['No', 'no'],                                     ['No', 'no'],
                                    ['Yes', 'yes'] ];                                     ['Yes', 'yes'] ];
         Apache::lonhelper::dropdown->new();          Apache::lonhelper::dropdown->new();
  addMessage("</td></tr>");   &addMessage(&Apache::lonhtmlcommon::row_closure());
                   
  if (not $helper->{VARS}->{'construction'}) {   if (not $helper->{VARS}->{'construction'}) {
     addMessage("<tr><td align='right'>".      &addMessage(&Apache::lonhtmlcommon::row_title(
                        '<label for="TABLE_INDEX_forminput">'.                              '<label for="TABLE_INDEX_forminput">'
                        &mt('Print Index').                             .&mt('Print Index')
                        "</label>: </td><td>");                             .'</label>'
                           )
               );
     $paramHash = Apache::lonhelper::getParamHash();      $paramHash = Apache::lonhelper::getParamHash();
     $paramHash->{'variable'} = 'TABLE_INDEX';         $paramHash->{'variable'} = 'TABLE_INDEX';   
     $helper->declareVar('TABLE_INDEX');               $helper->declareVar('TABLE_INDEX');         
Line 3030  CHOOSE_FROM_ANY_SEQUENCE Line 3240  CHOOSE_FROM_ANY_SEQUENCE
      ['No', 'no'],       ['No', 'no'],
      ['Yes', 'yes'] ];       ['Yes', 'yes'] ];
     Apache::lonhelper::dropdown->new();      Apache::lonhelper::dropdown->new();
     addMessage("</td></tr>");              &addMessage(&Apache::lonhtmlcommon::row_closure());
     addMessage("<tr><td align='right'>".              &addMessage(&Apache::lonhtmlcommon::row_title(
                        '<label for="PRINT_DISCUSSIONS_forminput">'.                              '<label for="PRINT_DISCUSSIONS_forminput">'
                        &mt('Print Discussions').                             .&mt('Print Discussions')
                        "</label>: </td><td>");                             .'</label>'
                           )
               );
     $paramHash = Apache::lonhelper::getParamHash();      $paramHash = Apache::lonhelper::getParamHash();
     $paramHash->{'variable'} = 'PRINT_DISCUSSIONS';         $paramHash->{'variable'} = 'PRINT_DISCUSSIONS';   
     $helper->declareVar('PRINT_DISCUSSIONS');               $helper->declareVar('PRINT_DISCUSSIONS');         
Line 3042  CHOOSE_FROM_ANY_SEQUENCE Line 3254  CHOOSE_FROM_ANY_SEQUENCE
      ['No', 'no'],       ['No', 'no'],
      ['Yes', 'yes'] ];       ['Yes', 'yes'] ];
     Apache::lonhelper::dropdown->new();      Apache::lonhelper::dropdown->new();
     addMessage("</td></tr>");              &addMessage(&Apache::lonhtmlcommon::row_closure());
   
     # Prompt for printing annotations too.      # Prompt for printing annotations too.
   
     addMessage("<tr><td align='right'>".      &addMessage(&Apache::lonhtmlcommon::row_title(
        '<label for="PRINT_ANNOTATIONS_forminput">'.                              '<label for="PRINT_ANNOTATIONS_forminput">'
        &mt('Print Annotations').                             .&mt('Print Annotations')
        "</label>:</td><td>");                             .'</label>'
                           )
               );
     $paramHash = Apache::lonhelper::getParamHash();      $paramHash = Apache::lonhelper::getParamHash();
     $paramHash->{'variable'} = "PRINT_ANNOTATIONS";      $paramHash->{'variable'} = "PRINT_ANNOTATIONS";
     $helper->declareVar("PRINT_ANNOTATIONS");      $helper->declareVar("PRINT_ANNOTATIONS");
Line 3057  CHOOSE_FROM_ANY_SEQUENCE Line 3271  CHOOSE_FROM_ANY_SEQUENCE
      ['No', 'no'],       ['No', 'no'],
      ['Yes', 'yes']];       ['Yes', 'yes']];
     Apache::lonhelper::dropdown->new();      Apache::lonhelper::dropdown->new();
     addMessage("</td></tr>");              &addMessage(&Apache::lonhtmlcommon::row_closure());
   
     addMessage("<tr><td align = 'right'>  </td><td>");              &addMessage(&Apache::lonhtmlcommon::row_title(&mt('Foils')));
     $paramHash = Apache::lonhelper::getParamHash();      $paramHash = Apache::lonhelper::getParamHash();
     $paramHash->{'multichoice'} = "true";      $paramHash->{'multichoice'} = "true";
     $paramHash->{'allowempty'}  = "true";      $paramHash->{'allowempty'}  = "true";
     $paramHash->{'variable'}   = "showallfoils";      $paramHash->{'variable'}   = "showallfoils";
     $paramHash->{'CHOICES'} = [ ["Show all foils", "1"] ];      $paramHash->{'CHOICES'} = [ ["Show all foils", "1"] ];
     Apache::lonhelper::choices->new();      Apache::lonhelper::choices->new();
     addMessage("</td></tr>");              &addMessage(&Apache::lonhtmlcommon::row_closure(1));
  }   }
   
  if ($helper->{'VARS'}->{'construction'}) {    if ($helper->{'VARS'}->{'construction'}) { 
Line 3075  CHOOSE_FROM_ANY_SEQUENCE Line 3289  CHOOSE_FROM_ANY_SEQUENCE
             my $stylefiletext=&mt("Use style file");              my $stylefiletext=&mt("Use style file");
             my $selectfiletext=&mt("Select style file");              my $selectfiletext=&mt("Select style file");
   
     my $xmlfrag .= <<"RNDSEED";      my $xmlfrag .= '<message>'
     <message><tr><td align='right'>              .&Apache::lonhtmlcommon::row_title('<label for="curseed_forminput">'
             <label for="curseed_forminput">$randseedtext</label>:                                                .$randseedtext
             </td><td></message>                                                .'</label>'
     <string variable="curseed" size="15" maxlength="15">               )
  <defaultvalue>              .'</message>
             return $helper->{VARS}->{'curseed'};              <string variable="curseed" size="15" maxlength="15">
         </defaultvalue>                  <defaultvalue>
     </string>                     return '.$helper->{VARS}->{'curseed'}.';
      <message></td></tr><tr><td align="right">                  </defaultvalue>'
              <label for="style_file">$stylefiletext</label>:              .'</string>'
              </td><td></message>              .'<message>'
               .&Apache::lonhtmlcommon::row_closure()
               .&Apache::lonhtmlcommon::row_title('<label for="style_file">'
                                                 .$stylefiletext
                                                 .'</label>'
                )
               .'</message>
              <string variable="style_file" size="40">               <string variable="style_file" size="40">
  <defaultvalue>                  <defaultvalue>
             return $stylevalue;                      return '.$stylevalue.';
         </defaultvalue>                  </defaultvalue>
              </string><message>&nbsp; <a href="javascript:openbrowser('helpform','style_file_forminput','sty')">$selectfiletext</a> </td></tr><tr><td></td><td align="left"></message>               </string><message>&nbsp;'
   .qq|<a href="javascript:openbrowser('helpform','style_file_forminput','sty')">|
   .$selectfiletext.'</a>'
               .&Apache::lonhtmlcommon::row_closure()
               .&Apache::lonhtmlcommon::row_title(&mt('Show all foils'))
               .'</message>
      <choices allowempty="1" multichoice="true" variable="showallfoils">       <choices allowempty="1" multichoice="true" variable="showallfoils">
                 <choice computer="1">Show all foils</choice>                  <choice computer="1">&nbsp;</choice>
              </choices>               </choices>'
      <message></td></tr></message>      .'<message>'
 RNDSEED              .&Apache::lonhtmlcommon::row_closure()
               .'</message>';
             &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);              &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);
   
   
     addMessage("<tr><td>Problem Type:</td><td>");              &addMessage(&Apache::lonhtmlcommon::row_title(&mt('Problem Type')));
     $paramHash = &Apache::lonhelper::getParamHash();  
     $paramHash->{'variable'} = 'probstatus'; # Already declared:  
     #      #
     # Initial value from construction space:      # Initial value from construction space:
     #      #
     if (!$helper->{VARS}->{'probstatus'} && $env{'form.problemtype'}) {      if (!$helper->{VARS}->{'probstatus'} && $env{'form.problemtype'}) {
  $helper->{VARS}->{'probstatus'} = $env{'form.problemtype'}; # initial value   $helper->{VARS}->{'probstatus'} = $env{'form.problemtype'}; # initial value
     }      }
     $paramHash->{CHOICES} = [      $xmlfrag = << "PROBTYPE";
      ['Homework problem',     'problem'],   <dropdown variable="probstatus" multichoice="0" allowempty="0">
      ['Exam Problem', 'exam'],     <defaultvalue>
      ['Survey question',      'survey']];        return "$helper->{VARS}->{'probstatus'}";
     Apache::lonhelper::dropdown->new();                     </defaultvalue>
     addMessage("</td></tr>");      <choice computer="problem">Homework Problem</choice>
      <choice computer="exam">Exam Problem</choice>
      <choice computer="survey">Survey question</choice>
    </dropdown>
   PROBTYPE
               &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);
       
               &addMessage(&Apache::lonhtmlcommon::row_closure(1));
   
  }           }
     }      }
   
   
   
   
     if ($startedTable) {      if ($startedTable) {
  addMessage("</table>");          &addMessage(&Apache::lonhtmlcommon::end_pick_box());
     }      }
   
     Apache::lonprintout::page_format_state->new("FORMAT");      Apache::lonprintout::page_format_state->new("FORMAT");
Line 3222  sub render { Line 3453  sub render {
     my $PaperType=&mt('Paper type');      my $PaperType=&mt('Paper type');
     my $landscape=&mt('Landscape');      my $landscape=&mt('Landscape');
     my $portrait=&mt('Portrait');      my $portrait=&mt('Portrait');
     $result .= <<STATEHTML;      $result.='<h3>'.&mt('Layout Options').'</h3>'
               .&Apache::loncommon::start_data_table()
               .&Apache::loncommon::start_data_table_header_row()
               .'<th>'.$PageLayout.'</th>'
               .'<th>'.$NumberOfColumns.'</th>'
               .'<th>'.$PaperType.'</th>'
               .&Apache::loncommon::end_data_table_header_row()
               .&Apache::loncommon::start_data_table_row()
       .'<td>'
       .'<label><input type="radio" name="'.${var}.'.layout" value="L" />'.$landscape.'</label><br />'
       .'<label><input type="radio" name="'.${var}.'.layout" value="P" checked="checked" />'.$portrait.'</label>'
       .'</td>';
   
 <hr width="33%" />      $result.='<td align="center">'
 <table cellpadding="3">              .'<select name="'.${var}.'.cols">';
   <tr>  
     <td align="center"><b>$PageLayout</b></td>  
     <td align="center"><b>$NumberOfColumns</b></td>  
     <td align="center"><b>$PaperType</b></td>  
   </tr>  
   <tr>  
     <td>  
       <label><input type="radio" name="${var}.layout" value="L" /> $landscape </label><br />  
       <label><input type="radio" name="${var}.layout" value="P" checked='1'  /> $portrait </label>  
     </td>  
     <td align="center">  
       <select name="${var}.cols">  
 STATEHTML  
   
     my $i;      my $i;
     for ($i = 1; $i <= $maxColumns; $i++) {      for ($i = 1; $i <= $maxColumns; $i++) {
Line 3267  STATEHTML Line 3496  STATEHTML
         }          }
         $i++;          $i++;
     }      }
     $result .= "</select></td></tr></table>";      $result .= <<HTML;
           </select>
       </td>
   HTML
       $result.=&Apache::loncommon::end_data_table_row()
               .&Apache::loncommon::end_data_table();
   
     return $result;      return $result;
 }  }
   

Removed from v.1.513  
changed lines
  Added in v.1.545.2.3


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