Diff for /loncom/interface/lonprintout.pm between versions 1.627.2.32.2.7 and 1.673

version 1.627.2.32.2.7, 2023/04/18 18:48:14 version 1.673, 2021/04/29 17:45:22
Line 143  sub printable_sequence { Line 143  sub printable_sequence {
 # Parameters:  # Parameters:
 #    helper - the helper which already contains info about the current folder we can  #    helper - the helper which already contains info about the current folder we can
 #             purloin.  #             purloin.
 #    map    - the map for which incomplete problems are to be printed  #    url    - Top url of the sequence
 #    nocurrloc - True if printout called from icon/link in Tools in /adm/navmaps  
 # Return:  # Return:
 #     XML that can be parsed by the helper to drive the state machine.  #     XML that can be parsed by the helper to drive the state machine.
 #  #
 sub create_incomplete_folder_selstud_helper {  sub create_incomplete_folder_selstud_helper {
     my ($helper, $map, $nocurrloc)  = @_;      my ($helper, $map)  = @_;
   
   
     my $symbFilter = '$res->shown_symb()';      my $symbFilter = '$res->shown_symb()';
Line 158  sub create_incomplete_folder_selstud_hel Line 157  sub create_incomplete_folder_selstud_hel
   
     my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_PEOPLE_SEQ',      my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_PEOPLE_SEQ',
       'Select problem(s) to print',        'Select problem(s) to print',
       'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"',        'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1"',
       'RESOURCES',        'RESOURCES',
       'CHOOSE_STUDENTS_INCOMPLETE',        'CHOOSE_STUDENTS_INCOMPLETE',
       $map,        $map,
Line 236  sub create_incomplete_course_helper { Line 235  sub create_incomplete_course_helper {
 # Parameters:  # Parameters:
 #   $helper - helper we are generating states for.  #   $helper - helper we are generating states for.
 #   $map    - The map for which the student wants incomplete problems.  #   $map    - The map for which the student wants incomplete problems.
 #   $nocurrloc - True if printout called from icon/link in Tools in /adm/navmaps  
 # Returns:  # Returns:
 #   XML that defines the helper states being created.  #   XML that defines the helper states being created.
 #  #
Line 244  sub create_incomplete_course_helper { Line 242  sub create_incomplete_course_helper {
 #   CHOOSE_INCOMPLETE_SEQ  - Resource selector.  #   CHOOSE_INCOMPLETE_SEQ  - Resource selector.
 #  #
 sub create_incomplete_folder_helper {  sub create_incomplete_folder_helper {
     my ($helper, $map, $nocurrloc) = @_;      my ($helper, $map) = @_;
   
     my $filter    = '$res->is_problem()';      my $filter    = '$res->is_problem()';
     $filter      .= ' && $res->resprintable() ';      $filter      .= ' && $res->resprintable() ';
Line 254  sub create_incomplete_folder_helper { Line 252  sub create_incomplete_folder_helper {
   
     my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_SEQ',      my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_SEQ',
       'Select problem(s) to print',        'Select problem(s) to print',
       'multichoice="1", toponly ="1", addstatus="1", closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"',        'multichoice="1", toponly ="1", addstatus="1", closeallpages="1" modallink="1"',
       'RESOURCES',        'RESOURCES',
       'PAGESIZE',        'PAGESIZE',
       $map,        $map,
Line 309  CHOOSE_STUDENTS Line 307  CHOOSE_STUDENTS
 #     prompt_text   - Text to use to prompt user.  #     prompt_text   - Text to use to prompt user.
 #     resource_options - Resource tag options e.g.  #     resource_options - Resource tag options e.g.
 #                        "multichoice='1', toponly='1', addstatus='1',  #                        "multichoice='1', toponly='1', addstatus='1',
 #                         modallink='1'"  #                         modallink='1'" 
 #                     that control the selection and appearance of the  #                     that control the selection and appearance of the
 #                     resource selector.  #                     resource selector.
 #     variable      - Name of the variable to hold the choice  #     variable      - Name of the variable to hold the choice
Line 446  CHOOSE_ANON1 Line 444  CHOOSE_ANON1
    return $result;     return $result;
 }  }
   
 sub generate_common_choosers {  
     my ($r,$helper,$map,$url,$isProblem,$symbFilter,$start_new_option) = @_;  
   
     my $randomly_ordered_warning =  
         &get_randomly_ordered_warning($helper, $map);  
   
     # code for a few states used for printout launched from both  
     # /adm/navmaps and from a resource by a privileged user:  
     #   - To allow resources to be selected for printing.  
     #   - To determine pagination between assignments.  
     #   - To determine how many assignments should be bundled into a single PDF.  
   
     my $resource_selector= &generate_resource_chooser('SELECT_PROBLEMS',  
                                                       'Select resources to print',  
                                                       'multichoice="1" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"',  
                                                       'RESOURCES',  
                                                       'PRINT_FORMATTING',  
                                                       $map,  
                                                       $isProblem, '', $symbFilter,  
                                                       $start_new_option);  
     $resource_selector .=  &generate_format_selector($helper,  
                                                      'How should results be printed?',  
                                                      'PRINT_FORMATTING').  
                            &generate_resource_chooser('CHOOSE_STUDENTS_PAGE',  
                                                       'Select Problem(s) to print',  
                                                       "multichoice='1' addstatus='1' closeallpages ='1' modallink='1'",  
                                                       'RESOURCES',  
                                                       'PRINT_FORMATTING',  
                                                       $url,  
                                                       $isProblem, '',  $symbFilter,  
                                                       $start_new_option);  
   
 # Generate student choosers.  
   
     &Apache::lonxml::xmlparse($r, 'helper',  
                               &generate_student_chooser('CHOOSE_TGT_STUDENTS_PAGE',  
                                                         'student_sort',  
                                                         'STUDENTS',  
                                                         'CHOOSE_STUDENTS_PAGE'));  
     &Apache::lonxml::xmlparse($r, 'helper',  
                               &generate_student_chooser('CHOOSE_STUDENTS',  
                                                         'student_sort',  
                                                         'STUDENTS',  
                                                         'SELECT_PROBLEMS'));  
     &Apache::lonxml::xmlparse($r, 'helper', $resource_selector);  
   
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};  
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};  
     my @names=&Apache::lonnet::getkeys('CODEs',$cdom,$cnum);  
     my $namechoice='<choice></choice>';  
     foreach my $name (sort {uc($a) cmp uc($b)} @names) {  
         if ($name =~ /^error: 2 /) { next; }  
         if ($name =~ /^type\0/) { next; }  
         $namechoice.='<choice computer="'.$name.'">'.$name.'</choice>';  
     }  
   
     my %code_values;  
     my %codes_to_print;  
     foreach my $key (@names) {  
         %code_values = &Apache::grades::get_codes($key, $cdom, $cnum);  
         foreach my $key (keys(%code_values)) {  
             $codes_to_print{$key} = 1;  
         }  
     }  
   
     my $code_selection;  
     foreach my $code (sort {uc($a) cmp uc($b)} (keys(%codes_to_print))) {  
         my $choice  = $code;  
         if ($code =~ /^[A-Z]+$/) { # Alpha code  
             $choice = &letters_to_num($code);  
         }  
         push(@{$helper->{DATA}{ALL_CODE_CHOICES}},[$code,$choice]);  
     }  
     if (%codes_to_print) {  
         $code_selection .='  
         <message><b>Choose single CODE from list:</b></message>  
         <message></td><td></message>  
             <dropdown variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0">  
               <choice></choice>  
               <exec>  
                  push(@{$state->{CHOICES}},@{$helper->{DATA}{ALL_CODE_CHOICES}});  
               </exec>  
             </dropdown>  
         <message></td></tr><tr><td></message>  
         '.$/;  
     }  
   
     my @lines = &Apache::lonnet::get_scantronformat_file();  
     my $codechoice='';  
     foreach my $line (@lines) {  
         next if (($line =~ /^\#/) || ($line eq ''));  
         my ($name,$description,$code_type,$code_length)=  
             (split(/:/,$line))[0,1,2,4];  
         if ($code_length > 0 &&  
             $code_type =~/^(letter|number|-1)/) {  
             $codechoice.='<choice computer="'.$name.'">'.$description.'</choice>';  
         }  
     }  
     if ($codechoice eq '') {  
         $codechoice='<choice computer="default">Default</choice>';  
     }  
     my $anon1 = &generate_code_selector($helper,  
                                         'CHOOSE_ANON1',  
                                         'SELECT_PROBLEMS',  
                                         $codechoice,  
                                         $code_selection,  
                                         $namechoice) . $resource_selector;  
   
     &Apache::lonxml::xmlparse($r, 'helper',$anon1);  
   
     my $anon_page = &generate_code_selector($helper,  
                                             'CHOOSE_ANON1_PAGE',  
                                             'SELECT_PROBLEMS_PAGE',  
                                             $codechoice,  
                                             $code_selection,  
                                             $namechoice) .  
                     &generate_resource_chooser('SELECT_PROBLEMS_PAGE',  
                                                'Select Problem(s) to print',  
                                                "multichoice='1' addstatus='1' closeallpages ='1' modallink='1'",  
                                                'RESOURCES',  
                                                'PRINT_FORMATTING',  
                                                $url,  
                                                $isProblem, '',  $symbFilter,  
                                                $start_new_option);  
     &Apache::lonxml::xmlparse($r, 'helper', $anon_page);  
     return ($randomly_ordered_warning,$codechoice,$code_selection,$namechoice);  
 }  
   
 #  Returns the XML for choosing how assignments are to be formatted   #  Returns the XML for choosing how assignments are to be formatted 
 #  that text must still be parsed by the helper xml parser.  #  that text must still be parsed by the helper xml parser.
 # Parameters: 3 (required)  # Parameters: 3 (required)
Line 588  sub generate_format_selector { Line 458  sub generate_format_selector {
     my $secpdfoption;      my $secpdfoption;
     unless (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon')     ||      unless (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon')     ||
             ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon_page') ||              ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon_page') ||
             ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon') ||              ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon')  ) {
             ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences_problems_for_anon') ||  
             ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences_resources_for_anon')) {  
         $secpdfoption =  '<choice computer="sections">Each PDF contains exactly one section</choice>';          $secpdfoption =  '<choice computer="sections">Each PDF contains exactly one section</choice>';
     }      }
     return <<RESOURCE_SELECTOR;      return <<RESOURCE_SELECTOR;
Line 711  sub printable { Line 579  sub printable {
 #       date for printing checks printstartdate param first, then, if not set,  #       date for printing checks printstartdate param first, then, if not set,
 #       opendate param, then, if not set, contentopen param.  #       opendate param, then, if not set, contentopen param.
   
   
 sub get_print_dates {  sub get_print_dates {
     my $res = shift;      my $res = shift;
     my $partsref = $res->parts();      my $partsref = $res->parts();
Line 756  sub get_print_dates { Line 623  sub get_print_dates {
 # get_print_dates but namvaps::course_print_dates are gotten...and not converted  # get_print_dates but namvaps::course_print_dates are gotten...and not converted
 # to times either.  # to times either.
 #  #
 # @param $res - Reference to a resource hash from lonnavmaps::resource.  # @param $res - Reference to a resource has from lonnvampas::resource.
 #  #
 # @return (opendate, closedate)  # @return (opendate, closedate)
 #  #
Line 770  sub course_print_dates { Line 637  sub course_print_dates {
     my @close_dates;      my @close_dates;
     my $navmap = $res->{NAV_MAP}; # Slightly OO dirty.      my $navmap = $res->{NAV_MAP}; # Slightly OO dirty.
   
     # Don't bother looping over undefined or empty parts array;      # Don't bother looping over undefined or empty parts arraY;
   
     if (@parts) {      if (@parts) {
  foreach my $part (@parts) {   foreach my $part (@parts) {
Line 796  sub map_print_dates { Line 663  sub map_print_dates {
     my $navmap = $res->{NAV_MAP}; # slightly OO dirty.      my $navmap = $res->{NAV_MAP}; # slightly OO dirty.
   
   
     # Don't bother looping over undefined or empty parts array;      # Don't bother looping over undefined or empty parts arraY;
   
     if (@parts) {      if (@parts) {
  foreach my $part (@parts) {   foreach my $part (@parts) {
Line 879  sub master_seq_to_person_seq { Line 746  sub master_seq_to_person_seq {
     }      }
           
     my $navmap           = Apache::lonnavmaps::navmap->new($username, $userdomain,      my $navmap           = Apache::lonnavmaps::navmap->new($username, $userdomain,
                                                            $code,$unhidden);                                                             $code, $unhidden);
     my ($start,$finish);      my ($start,$finish);
   
     if ($map) {      if ($map) {
Line 897  sub master_seq_to_person_seq { Line 764  sub master_seq_to_person_seq {
     my $iterator         = $navmap->getIterator($start,$finish,{},1);      my $iterator         = $navmap->getIterator($start,$finish,{},1);
   
     #  Iterate on the resource..select the items that are randomly selected      #  Iterate on the resource..select the items that are randomly selected
     #  and that are in the seq_hash.  Presumably the iterator will take care      #  and that are in the seq_has.  Presumably the iterator will take care
     #  of the random ordering part of the deal.      # of the random ordering part of the deal.
       #
     my $curres;      my $curres;
     while ($curres = $iterator->next()) {      while ($curres = $iterator->next()) {
  #   #
  #  Only process resources..that are not removed by randomout...   #  Only process resources..that are not removed by randomout...
  #  and are selected for printint as well.   #  and are selected for printint as well.
  #   #
   
         if (ref($curres) && ! $curres->randomout()) {          if (ref($curres) && ! $curres->randomout()) {
             my $currsymb = $curres->symb();              my $currsymb = $curres->symb();
             if (exists($seq_hash{$currsymb})) {              if (exists($seq_hash{$currsymb})) {
Line 974  sub set_font_size { Line 841  sub set_font_size {
     my ($text) = @_;      my ($text) = @_;
   
     # There appear to be cases where the font directive is empty.. in which      # There appear to be cases where the font directive is empty.. in which
     # case the first substitution would insert a spurious \ oh happy day.      # case the first substituion would  insert a spurious \ oh happy day.
     # as this has been the cause of much mystery and hair pulling _sigh_      # as this has been the cause of much mystery and hair pulling _sigh_
   
     if ($font_size ne '') {      if ($font_size ne '') {
   
  $text =~ s/\\begin\{document}/\\begin{document}{\\$font_size/;   $text =~ s/\\begin\{document}/\\begin{document}{\\$font_size/;
  $text =~ s/\\end\{document}/}\\end{document}/;          $text =~ s/\\end\{document}/}\\end{document}/;
   
     }      }
     return $text;      return $text;
   
Line 992  sub set_font_size { Line 860  sub set_font_size {
 #  - The PDF, if necessary, is replicated.  #  - The PDF, if necessary, is replicated.
 #  - The PDF is added to the list of files to convert to postscript (along with the images).  #  - The PDF is added to the list of files to convert to postscript (along with the images).
 #  - The LaTeX is added to include the final converted postscript in the file as an included  #  - The LaTeX is added to include the final converted postscript in the file as an included
 #    job.  The assumption is that the includepsheader.ps header will be included.  #    job.  The assumption is that the includedpsheader.ps header will be included.
 #  #
 # Parameters:  # Parameters:
 #   pdf_uri   - URI of the PDF file to include.  #   pdf_uri   - URI of the PDF file to include.
Line 1016  sub include_pdf { Line 884  sub include_pdf {
  $file = &Apache::lonnet::filelocation('',$pdf_uri);   $file = &Apache::lonnet::filelocation('',$pdf_uri);
     }      }
   
     #  The file is now replicated locally ... or it did not exist in the first place      #  The file isn ow replicated locally.. or it did not exist in the first place
     # (unlikely).  If it did exist, add the pdf to the set of files/images that      # (unlikely).  If it did exist, add the pdf to the set of files/images that
     # need to be converted for this print job:      # need tob e converted for this print job:
   
     my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};      my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
     $file =~ s{(.*)/res/}{$londocroot/res/};      $file =~ s{(.*)/res/}{$londocroot/res/};
Line 1155  sub printf_style_subst { Line 1023  sub printf_style_subst {
  if ($size ne "") {   if ($size ne "") {
     $subst = substr($subst, 0, $size);      $subst = substr($subst, 0, $size);
           
     #  Here's a nice edge case ... suppose the end of the      #  Here's a nice edge case.. supose the end of the
     #  substring is a \.  In that case may have just      #  substring is a \.  In that case may have  just
     #  chopped off a TeX escape... in that case, we append      #  chopped off a TeX escape... in that case, we append
     #   " " for the trailing character, and let the field       #   " " for the trailing character, and let the field 
     #  spill over a bit (sigh).      #  spill over a bit (sigh).
Line 1192  sub printf_style_subst { Line 1060  sub printf_style_subst {
 #     %s    - The section if it is supplied.  #     %s    - The section if it is supplied.
 #  #
 sub format_page_header {  sub format_page_header {
     my ($width, $format, $assignment, $course, $student) = @_;      my ($width, $format, $assignment, $course, $student, $section) = @_;
   
   
   
     $width = &recalcto_mm($width); # Get width in mm.      $width = &recalcto_mm($width); # Get width in mm.
     my $chars_per_line = int($width/2);   # Character/textline.      my $chars_per_line = int($width/1.6);   # Character/textline.
   
     #  Default format?      #  Default format?
   
Line 1213  sub format_page_header { Line 1081  sub format_page_header {
  # - Allow the assignment to be 2 lines (wrapped).   # - Allow the assignment to be 2 lines (wrapped).
  #   #
   
         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}";   my $name_length    = int($chars_per_line *3 /4);
    my $sec_length     = int($chars_per_line / 5);
   
     } else {   $format  = "%$name_length".'n';
         # 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 ($section) {
       $format .=  ' - Sec: '."%$sec_length".'s';
    }
   
     return $format;   $format .= '\\\\%c \\\\ %a';
           
   
       }
       # 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);
       $format =  &printf_style_subst("s", $format, $section);
       
       
       # 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      # 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      # there is '\\ \\ ' in the page header. That's cause a error in LaTeX
Line 1372  sub is_code_valid { Line 1236  sub is_code_valid {
     my ($code_type, $code_length) = ('letter', 6); # defaults.      my ($code_type, $code_length) = ('letter', 6); # defaults.
     my @lines = &Apache::lonnet::get_scantronformat_file();      my @lines = &Apache::lonnet::get_scantronformat_file();
     foreach my $line (@lines) {      foreach my $line (@lines) {
         next if (($line =~ /^\#/) || ($line eq ''));  
  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 1444  sub compare_names { Line 1307  sub compare_names {
     }      }
   
     # Break the tie on the first name, but there are leading (possibly trailing      # Break the tie on the first name, but there are leading (possibly trailing
     # whitespaces to get rid of first)      # whitespaces to get rid of first 
     #      #
     $f1 =~ s/^\s+//; # Remove leading...      $f1 =~ s/^\s+//; # Remove leading...
     $f1 =~ s/\s+$//; # Trailing spaces from first 1...      $f1 =~ s/\s+$//; # Trailing spaces from first 1...
Line 1476  sub latex_header_footer_remove { Line 1339  sub latex_header_footer_remove {
 #  necessity is determined by the problem_split param.  #  necessity is determined by the problem_split param.
 #  #
 sub encapsulate_minipage {  sub encapsulate_minipage {
     my ($text,$problem_split) = @_;      my ($text) = @_;
     if (!($problem_split =~ /yes/i)) {      if (!($env{'form.problem.split'} =~ /yes/i)) {
  $text = '\begin{minipage}{\textwidth}'.$text.'\end{minipage}';   $text = '\begin{minipage}{\textwidth}'.$text.'\end{minipage}';
     }      }
     return $text;      return $text;
Line 1981  sub get_course { Line 1844  sub get_course {
     my $courseidinfo;      my $courseidinfo;
     if (defined($env{'request.course.id'})) {      if (defined($env{'request.course.id'})) {
  $courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header');   $courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header');
    my $sec = $env{'request.course.sec'};
       
     }      }
     return $courseidinfo;      return $courseidinfo;
 }  }
Line 2003  sub page_format_transformation { Line 1868  sub page_format_transformation {
   
     my $name = &get_name();      my $name = &get_name();
     my $courseidinfo = &get_course();      my $courseidinfo = &get_course();
     if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }  
     my $header_text  = $parmhash{'print_header_format'};      my $header_text  = $parmhash{'print_header_format'};
     $header_text     = &format_page_header($textwidth, $header_text, $assignment,      $header_text     = &format_page_header($textwidth, $header_text, $assignment,
    $courseidinfo, $name);     $courseidinfo, $name);
Line 2215  sub unsupported { Line 2079  sub unsupported {
     }      }
     if ($mode ne '') {$mode='\\'.$mode}      if ($mode ne '') {$mode='\\'.$mode}
     my $result = &print_latex_header($mode);      my $result = &print_latex_header($mode);
     if ($cleanURL=~m|^(/adm/wrapper/)?ext/|) {      if ($cleanURL=~m|^(/adm/wrapper)?/ext/|) {
         $cleanURL=~s|^(/adm/wrapper/)?ext/|http://|;          $cleanURL=~s|^(/adm/wrapper)?/ext/|http://|;
         $cleanURL=~s|^http://https://|https://|;          $cleanURL=~s|^http://https://|https://|;
         if ($shown eq $currentURL) {          if ($shown eq $currentURL) {
             $shown = &Apache::lonxml::latex_special_symbols($cleanURL);              $shown = &Apache::lonxml::latex_special_symbols($cleanURL);
Line 2228  sub unsupported { Line 2092  sub unsupported {
         if ($shown eq $currentURL) {          if ($shown eq $currentURL) {
     $result.=&Apache::lonxml::latex_special_symbols($currentURL);      $result.=&Apache::lonxml::latex_special_symbols($currentURL);
         } else {          } else {
             $result.=$shown;                 $result.=$shown;
         }          }
     }      }
     $result.= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill} \end{document}';      $result.= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill} \end{document}';
Line 2300  sub print_page_in_course { Line 2164  sub print_page_in_course {
         } elsif ($resource->ext()) {          } elsif ($resource->ext()) {
             $result.=&latex_header_footer_remove(&unsupported($current_url,$mode,$resource->symb));              $result.=&latex_header_footer_remove(&unsupported($current_url,$mode,$resource->symb));
  } elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/)  {   } elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/)  {
             # these resources go through the XML transformer:                 # these resources go through the XML transformer:
             $result .= &Apache::lonxml::latex_special_symbols($resource->title()) . '\\\\';              $result .= &Apache::lonxml::latex_special_symbols($resource->title()) . '\\\\';
   
     my $urlp = &Apache::lonnet::clutter($resource_src);      my $urlp = &Apache::lonnet::clutter($resource_src);
Line 2314  sub print_page_in_course { Line 2178  sub print_page_in_course {
   
     $form{'grade_target'}  = 'tex';      $form{'grade_target'}  = 'tex';
     $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);      $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);
     $form{'pdfFormFields'} = 'no'; #       $form{'pdfFormFields'} = $pdfFormFields; # 
     $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};          $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};    
           
     $form{'problem_split'}=$parmhash{'problem_stream_switch'};      $form{'problem_split'}=$parmhash{'problem_stream_switch'};
Line 2535  sub load_skips { Line 2399  sub load_skips {
   
     my ($helper)  = @_;      my ($helper)  = @_;
   
     # If this is the first time, unwrap the resources and extra spaces:      #  If this is the first time, unrap the resources and extra spaces:
   
     if (!$skips_loaded) {      if (!$skips_loaded) {
  @extraspace = (split(/\|\|\|/, $helper->{'VARS'}->{'EXTRASPACE'}));   @extraspace = (split(/\|\|\|/, $helper->{'VARS'}->{'EXTRASPACE'}));
Line 2685  sub print_construction_sequence { Line 2549  sub print_construction_sequence {
     my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';      my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
     $body.=&path_to_problem($urlp,$LaTeXwidth);      $body.=&path_to_problem($urlp,$LaTeXwidth);
     $body.='\vskip 1 mm '.$answer.'\end{document}';      $body.='\vskip 1 mm '.$answer.'\end{document}';
     $body = &encapsulate_minipage($body,$answerform{'problem_split'});      $body = &encapsulate_minipage($body);
     $texversion.=$body;      $texversion.=$body;
  }   }
     }      }
Line 2842  ENDPART Line 2706  ENDPART
     my @student_names=();      my @student_names=();
   
             
     #  Common settings for the %form hash:      #  Common settings for the %form has:
     # In some cases these settings get overridden by specific cases, but the      # In some cases these settings get overriddent by specific cases, but the
     # settings are common enough to make it worthwhile factoring them out      # settings are common enough to make it worthwhile factoring them out
     # here.      # here.
     #      #
     my %form;      my %form;
     $form{'grade_target'} = 'tex';      $form{'grade_target'} = 'tex';
     $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);      $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);
     $form{'pdfFormFields'} = 'no';      $form{'pdfFormFields'} = $pdfFormFields;
   
     # If form.showallfoils is set, then request all foils be shown:      # If form.showallfoils is set, then request all foils be shown:
     # privilege will be enforced both by not allowing the       # privilege will be enforced both by not allowing the 
Line 2989  ENDPART Line 2853  ENDPART
  $result = &print_latex_header() . $result;   $result = &print_latex_header() . $result;
     }      }
     # End construction space sequence.      # End construction space sequence.
  } elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {    } elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard|ext\.tool)$/) { 
  $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//;}
                   if ($currentURL=~/\/ext\.tool$/) {$currentURL=~s/^\/adm\/wrapper//;}
  $resources_printed .= $currentURL.':';   $resources_printed .= $currentURL.':';
  my $texversion = &ssi_with_retries($currentURL, $ssi_retry_count, %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') {
Line 3149  ENDPART Line 3014  ENDPART
     my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';      my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
     $body   .= &path_to_problem ($urlp,$LaTeXwidth);      $body   .= &path_to_problem ($urlp,$LaTeXwidth);
     $body   .='\vskip 1 mm '.$answer;      $body   .='\vskip 1 mm '.$answer;
     $body    = &encapsulate_minipage($body,$answerform{'problem_split'});      $body    = &encapsulate_minipage($body);
     $texversion .= $body;      $texversion .= $body;
  } else {   } else {
     $texversion='';      $texversion='';
Line 3173  ENDPART Line 3038  ENDPART
  if (($selectionmade == 4) and ($assignment ne $prevassignment)) {   if (($selectionmade == 4) and ($assignment ne $prevassignment)) {
     my $name = &get_name();      my $name = &get_name();
     my $courseidinfo = &get_course();      my $courseidinfo = &get_course();
                     if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }  
     $prevassignment=$assignment;      $prevassignment=$assignment;
     my $header_text = $parmhash{'print_header_format'};      my $header_text = $parmhash{'print_header_format'};
     $header_text    = &format_page_header($textwidth, $header_text,      $header_text    = &format_page_header($textwidth, $header_text,
Line 3188  ENDPART Line 3052  ENDPART
  }   }
  $result .= $texversion;   $result .= $texversion;
  $flag_latex_header_remove = 'YES';      $flag_latex_header_remove = 'YES';   
     } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {       } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard|ext\.tool)$/) { 
  $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//;}
                   if ($urlp=~/\/ext\.tool$/) {$urlp=~s/^\/adm\/wrapper//;}
  $resources_printed .= $urlp.':';   $resources_printed .= $urlp.':';
  my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %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') {
Line 3251  ENDPART Line 3116  ENDPART
       ($print_type eq 'all_problems_students')           ||        ($print_type eq 'all_problems_students')           ||
       ($print_type eq 'resources_for_students')          ||        ($print_type eq 'resources_for_students')          ||
       ($print_type eq 'incomplete_problems_selpeople_course') ||        ($print_type eq 'incomplete_problems_selpeople_course') ||
       ($print_type eq 'map_incomplete_problems_people_seq') ||        ($print_type eq 'map_incomplete_problems_people_seq')){
               ($print_type eq 'select_sequences_problems_for_students') ||  
               ($print_type eq 'select_sequences_resources_for_students')) {  
   
   
      #-- prints assignments for whole class or for selected students         #-- prints assignments for whole class or for selected students  
Line 3262  ENDPART Line 3125  ENDPART
      ($print_type eq 'problems_for_students_from_page') ||       ($print_type eq 'problems_for_students_from_page') ||
      ($print_type eq 'all_problems_students')           ||       ($print_type eq 'all_problems_students')           ||
      ($print_type eq 'incomplete_problems_selpeople_course') ||       ($print_type eq 'incomplete_problems_selpeople_course') ||
      ($print_type eq 'map_incomplete_problems_people_seq') ||       ($print_type eq 'map_incomplete_problems_people_seq')) {
              ($print_type eq 'select_sequences_problems_for_students')) {  
      $selectionmade=5;       $selectionmade=5;
      $type='problems';       $type='problems';
  } elsif (($print_type eq 'resources_for_students') ||   } elsif ($print_type eq 'resources_for_students') {
                   ($print_type eq 'select_sequences_resources_for_students')) {  
      $selectionmade=8;       $selectionmade=8;
      $type='resources';       $type='resources';
  }   }
Line 3306  ENDPART Line 3167  ENDPART
   
          my $map;           my $map;
          if ($helper->{VARS}->{'symb'}) {           if ($helper->{VARS}->{'symb'}) {
              unless ((($print_type eq 'all_problems_students') ||               ($map, my $id, my $resource) =
                       ($print_type eq 'incomplete_problems_selpeople_course')) &&                   &Apache::lonnet::decode_symb($helper->{VARS}->{'symb'});
                       $perm{'pfo'}) {  
                  ($map, my $id, my $resource) =  
                      &Apache::lonnet::decode_symb($helper->{VARS}->{'symb'});  
              }  
          } elsif (($helper->{'VARS'}->{'postdata'} eq '/adm/navmaps') && ($perm{'pfo'})) {  
              $map = $helper->{'VARS'}->{'SEQUENCE'};  
          }           }
   
  #loop over students   #loop over students
Line 3373  ENDPART Line 3228  ENDPART
  $result .= $print_array[0].'  \end{document}';   $result .= $print_array[0].'  \end{document}';
      } elsif (($print_type eq 'problems_for_anon')      ||       } elsif (($print_type eq 'problems_for_anon')      ||
       ($print_type eq 'problems_for_anon_page') ||        ($print_type eq 'problems_for_anon_page') ||
       ($print_type eq 'resources_for_anon')     ||        ($print_type eq 'resources_for_anon')  ) {
               ($print_type eq 'select_sequences_problems_for_anon') ||  
               ($print_type eq 'select_sequences_resources_for_anon')) {  
  my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'};   my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'};
  my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'};   my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'};
  my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'};   my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'};
Line 3387  ENDPART Line 3240  ENDPART
          my @lines = &Apache::lonnet::get_scantronformat_file();           my @lines = &Apache::lonnet::get_scantronformat_file();
  my ($code_type,$code_length,$bubbles_per_row)=('letter',6,10);   my ($code_type,$code_length,$bubbles_per_row)=('letter',6,10);
  foreach my $line (@lines) {   foreach my $line (@lines) {
              next if (($line =~ /^\#/) || ($line eq ''));               chomp($line);
      my ($name,$type,$length,$bubbles_per_item) =        my ($name,$type,$length,$bubbles_per_item) = 
                  (split(/:/,$line))[0,2,4,17];                   (split(/:/,$line))[0,2,4,17];
      if ($name eq $code_option) {       if ($name eq $code_option) {
Line 3399  ENDPART Line 3252  ENDPART
                  }                   }
      }       }
  }   }
          my $map;           my ($randomorder,$randompick,$map);
          if ($helper->{VARS}{'symb'}) {           if ($helper->{VARS}{'symb'}) {
              ($map, my $id, my $resource) =               ($map, my $id, my $resource) =
                  &Apache::lonnet::decode_symb($helper->{VARS}{'symb'});                   &Apache::lonnet::decode_symb($helper->{VARS}{'symb'});
          } elsif (($helper->{'VARS'}->{'postdata'} eq '/adm/navmaps') && ($perm{'pfo'})) {               my $navmap = Apache::lonnavmaps::navmap->new();
              $map = $helper->{'VARS'}->{'SEQUENCE'};               if (defined($navmap)) {
                    if ($map) {
                        my $mapres = $navmap->getResourceByUrl($map);
                        $randomorder = $mapres->randomorder();
                        $randompick = $mapres->randompick();
                    }
                }
          }           }
  my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth));   my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth));
  $moreenv{'problem_split'}    = $parmhash{'problem_stream_switch'};   $moreenv{'problem_split'}    = $parmhash{'problem_stream_switch'};
Line 3464  ENDPART Line 3323  ENDPART
  my $count=0;   my $count=0;
          my $nohidemap;           my $nohidemap;
          if ($perm{'pav'} && $perm{'vgr'}) {           if ($perm{'pav'} && $perm{'vgr'}) {
              $nohidemap = 1;                $nohidemap = 1;
          }           }
  foreach my $code (sort(@allcodes)) {   foreach my $code (sort(@allcodes)) {
      my $file_num=int($count/$number_per_page);       my $file_num=int($count/$number_per_page);
Line 3473  ENDPART Line 3332  ENDPART
      } else {       } else {
  $moreenv{'CODE'}=&num_to_letters($code);   $moreenv{'CODE'}=&num_to_letters($code);
      }       }
              $env{'form.CODE'} = $moreenv{'CODE'};               my $actual_seq = \@master_seq;
              my $actual_seq = master_seq_to_person_seq($map, \@master_seq,               if ($randomorder || $randompick) {
                                                        undef,                   $env{'form.CODE'} = $moreenv{'CODE'};
                                                        $moreenv{'CODE'}, $nohidemap);                   $actual_seq = master_seq_to_person_seq($map, \@master_seq,
              delete($env{'form.CODE'});                                                          undef,
                                                           $moreenv{'CODE'}, $nohidemap);
                    delete($env{'form.CODE'});
                }
      my ($output,$fullname, $printed)=       my ($output,$fullname, $printed)=
  &print_resources($r,$helper,'anonymous',$type,\%moreenv,   &print_resources($r,$helper,'anonymous',$type,\%moreenv,
   $actual_seq,$flag_latex_header_remove,    $actual_seq,$flag_latex_header_remove,
Line 3606  ENDPART Line 3468  ENDPART
             }              }
         }          }
         if ($env{'request.enc'}) {          if ($env{'request.enc'}) {
             $url = &Apache::lonenc::encrypted($url);              $url = &Apache::lonenc::encrypted($url); 
         }          }
         if ($url ne '') {          if ($url ne '') {
             my $symb = $helper->{VARS}{'symb'};              my $symb = $helper->{VARS}{'symb'};
Line 3626  ENDPART Line 3488  ENDPART
                 $URLback .= (($URLback =~ /\?/) ? '&amp;':'?').'symb='.&escape($symb.$anchor);                  $URLback .= (($URLback =~ /\?/) ? '&amp;':'?').'symb='.&escape($symb.$anchor);
             }              }
         }          }
     } elsif (($helper->{VARS}->{'postdata'} eq '/adm/navmaps') &&  
              ($env{'request.course.id'})) {  
         $URLback=$helper->{VARS}->{'postdata'};  
     }      }
     #      #
     # Final adjustment of the font size:      # Final adjustment of the font size:
Line 3803  sub print_resources { Line 3662  sub print_resources {
     #   nice to put the special in as a postscript comment      #   nice to put the special in as a postscript comment
     #   e.g. \special{ps:\ENDOFSTUDENTSTAMP}  unfortunately,      #   e.g. \special{ps:\ENDOFSTUDENTSTAMP}  unfortunately,
     #   The special gets passed the \ and dvips puts it in the output file      #   The special gets passed the \ and dvips puts it in the output file
     #   so we will just rely on printout.pl to strip ENDOFSTUDENTSTAMP from the      #   so we will just rely on prntout.pl to strip  ENDOFSTUDENTSTAMP from the
     #   postscript.  Each ENDOFSTUDENTSTAMP will go on a line by itself.      #   postscript.  Each ENDOFSTUDENTSTAMP will go on a line by itself.
     #      #
   
Line 3812  sub print_resources { Line 3671  sub print_resources {
     my $assignment;      my $assignment;
     my $courseidinfo = &get_course();      my $courseidinfo = &get_course();
     my $possprint = scalar(@{$master_seq});      my $possprint = scalar(@{$master_seq});
     if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }  
     if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection}  
   
     foreach my $curresline (@{$master_seq})  {      foreach my $curresline (@{$master_seq})  {
  if (defined $page_breaks{$curresline}) {   if (defined $page_breaks{$curresline}) {
Line 3881  sub print_resources { Line 3738  sub print_resources {
     my $body   ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';      my $body   ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
     $body     .=&path_to_problem($res_url,$LaTeXwidth);      $body     .=&path_to_problem($res_url,$LaTeXwidth);
     $body     .='\vskip 1 mm '.$ansrendered;      $body     .='\vskip 1 mm '.$ansrendered;
     $body     = &encapsulate_minipage($body,$answerenv{'problem_split'});      $body     = &encapsulate_minipage($body);
     $rendered = $header.$body;      $rendered = $header.$body;
  }   }
     }      }
Line 3897  sub print_resources { Line 3754  sub print_resources {
  $rendered =~ s/\\end\{document}//;   $rendered =~ s/\\end\{document}//;
     }      }
     $current_output .= $rendered;          $current_output .= $rendered;    
  } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {   } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard|ext\.tool)$/) {
     if ($i == 1) {      if ($i == 1) {
  $syllabus_first = 1;   $syllabus_first = 1;
     }      }
Line 3914  sub print_resources { Line 3771  sub print_resources {
  $rendered =~ s/\\end\{document}//;   $rendered =~ s/\\end\{document}//;
     }      }
     $current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut ';      $current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut ';
  } elsif($res_url =~ /\.pdf$/) {   } elsif($res_url = ~/\.pdf$/) {
     my $url = &Apache::lonnet::clutter($res_url);      my $url = &Apache::lonnet::clutter($res_url);
     my $rendered  = &include_pdf($url);      my $rendered  = &include_pdf($url);
     if ($remove_latex_header ne 'NO') {      if ($remove_latex_header ne 'NO') {
Line 3938  sub print_resources { Line 3795  sub print_resources {
  if (($assignment ne $current_assignment) && ($assignment ne "")) {   if (($assignment ne $current_assignment) && ($assignment ne "")) {
     my $header_line = &format_page_header($LaTeXwidth, $parmhash{'print_header_format'},      my $header_line = &format_page_header($LaTeXwidth, $parmhash{'print_header_format'},
   $assignment, $courseidinfo,     $assignment, $courseidinfo, 
   $fullname);    $fullname, $usersection);
     my $header_start = ($columns_in_format == 1) ? '\lhead'      my $header_start = ($columns_in_format == 1) ? '\lhead'
  : '\fancyhead[LO]';   : '\fancyhead[LO]';
     $header_line = $header_start.'{'.$header_line.'}';      $header_line = $header_start.'{'.$header_line.'}';
Line 3970  sub print_resources { Line 3827  sub print_resources {
         } elsif ($print_incomplete) {          } elsif ($print_incomplete) {
             $message = &mt('No incomplete resources');              $message = &mt('No incomplete resources');
         }          }
         if ($message) {          if ($message) { 
             $current_output  = &encapsulate_minipage("\\vskip -10mm \n$message\n \\vskip 100 mm { }\n",$moreenv->{'problem_split'});      $current_output  = &encapsulate_minipage("\\vskip -10mm \n$message\n \\vskip 100 mm { }\n");
         }          }
  if ($remove_latex_header eq "NO") {   if ($remove_latex_header eq "NO") {
     $current_output = &print_latex_header() . $current_output;      $current_output = &print_latex_header() . $current_output;
Line 3985  sub print_resources { Line 3842  sub print_resources {
     }      }
     my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header');      my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header');
     my $header_line =      my $header_line =
         &format_page_header($LaTeXwidth, $parmhash{'print_header_format'},      &format_page_header($LaTeXwidth, $parmhash{'print_header_format'},
                             $currentassignment, $courseidinfo, $fullname);                          $currentassignment, $courseidinfo, $fullname, $usersection);
     my $header_start = ($columns_in_format == 1) ? '\lhead' : '\fancyhead[LO]';      my $header_start = ($columns_in_format == 1) ? '\lhead' : '\fancyhead[LO]';
     my $newheader = $header_start.'{'.$header_line.'}';      my $newheader = $header_start.'{'.$header_line.'}';
   
     if ($current_output=~/\\documentclass/) {      if ($current_output=~/\\documentclass/) {
  $current_output =~ s/\\begin\{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$newheader$namepostfix}\\vskip 5 mm /;   $current_output =~ s/\\begin\{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$newheader$namepostfix}\\vskip 5 mm /;
   
     } else {      } else {
  my $blankpages =    my $blankpages = 
     '\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'};      '\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'};
Line 4000  sub print_resources { Line 3857  sub print_resources {
     &copyright_line().' \newpage '.$blankpages.$end_of_student.      &copyright_line().' \newpage '.$blankpages.$end_of_student.
     '\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent'.      '\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent'.
     $newheader.$namepostfix. '} \vskip 5 mm '.$current_output;      $newheader.$namepostfix. '} \vskip 5 mm '.$current_output;
   
     }      }
     #      #
     #  Close the student bracketing.      #  Close the student bracketing.
Line 4032  sub handler { Line 3890  sub handler {
     if ($env{'request.course.id'}) {      if ($env{'request.course.id'}) {
         my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};          my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
         my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};          my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
         my $clientip = &Apache::lonnet::get_requestor_ip($r);  
         my ($blocked,$blocktext) =           my ($blocked,$blocktext) = 
             &Apache::loncommon::blocking_status('printout',$clientip,$cnum,$cdom);              &Apache::loncommon::blocking_status('printout',$cnum,$cdom);
         if ($blocked) {          if ($blocked) {
             my $checkrole = "cm./$cdom/$cnum";              my $checkrole = "cm./$cdom/$cnum";
             if ($env{'request.course.sec'} ne '') {              if ($env{'request.course.sec'} ne '') {
Line 4212  sub printHelper { Line 4069  sub printHelper {
         $helper->{VARS}->{'construction'} = 1;          $helper->{VARS}->{'construction'} = 1;
     } else {      } else {
         if ($env{'form.postdata'}) {          if ($env{'form.postdata'}) {
             unless ($env{'form.postdata'} eq '/adm/navmaps') {              $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($env{'form.postdata'});
                 $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($env{'form.postdata'});  
             }  
     if ( $helper->{VARS}->{'symb'} eq '') {      if ( $helper->{VARS}->{'symb'} eq '') {
  $helper->{VARS}->{'postdata'} = $env{'form.postdata'};   $helper->{VARS}->{'postdata'} = $env{'form.postdata'};
     }      }
Line 4223  sub printHelper { Line 4078  sub printHelper {
             $helper->{VARS}->{'symb'} = $env{'form.symb'};              $helper->{VARS}->{'symb'} = $env{'form.symb'};
         }          }
         if ($env{'form.url'}) {          if ($env{'form.url'}) {
             unless ($env{'form.url'} eq '/adm/navmaps') {              $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});
                 $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});  
             }  
         }          }
   
     }      }
   
       if ($env{'form.symb'}) {
           $helper->{VARS}->{'symb'} = $env{'form.symb'};
       }
       if ($env{'form.url'}) {
           $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});
       }
     if ($helper->{VARS}->{'symb'} ne '') {      if ($helper->{VARS}->{'symb'} ne '') {
         $helper->{VARS}->{'symb'}=          $helper->{VARS}->{'symb'}=
     &Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'});      &Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'});
     }      }
     my ($resourceTitle,$sequenceTitle,$mapTitle,$cdom,$cnum);      my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper);
     if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') {  
         $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};  
         $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};  
         if ($env{'course.'.$env{'request.course.id'}.'.url'} eq  
             "uploaded/$cdom/$cnum/default.sequence") {  
             my $navmap = Apache::lonnavmaps::navmap->new();  
             if (ref($navmap)) {  
                 my @toplevelres = $navmap->retrieveResources('',sub { !(($_[0]->is_map()) || ($_[0]->src =~ /^\/adm\/navmaps/)) },0,0);  
                 if (@toplevelres) {  
                     my @printable;  
                     if ($perm{'pav'} || $perm{'pfo'}) {  
                         @printable = @toplevelres;  
                     } else {  
                         @printable = $navmap->retrieveResources(undef,sub { $_[0]->resprintable() },0,1);  
                     }  
                     if (@printable) {  
                         $sequenceTitle = 'Main Content';  
                         $mapTitle = $sequenceTitle;  
                     }  
                 }  
             }  
         }  
     } else {  
         ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper);  
     }  
     if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;}      if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;}
   
           
Line 4290  sub printHelper { Line 4125  sub printHelper {
     ($map, $id, $url) = &Apache::lonnet::decode_symb($symb);      ($map, $id, $url) = &Apache::lonnet::decode_symb($symb);
     $helper->{VARS}->{'postdata'} =       $helper->{VARS}->{'postdata'} = 
  &Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url));   &Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url));
         } elsif (($helper->{VARS}->{'postdata'} eq '/adm/navmaps') &&  
                 ($env{'request.course.id'} ne '')) {  
             if ($env{'course.'.$env{'request.course.id'}.'.url'} eq  
                 "uploaded/$cdom/$cnum/default.sequence") {  
                 $map = $env{'course.'.$env{'request.course.id'}.'.url'};  
                 $url = $helper->{VARS}->{'postdata'};  
             }  
         }  
         if (($symb ne '') || ($map ne '')) {  
             if (!$userCanPrint) {              if (!$userCanPrint) {
         my $navmap = Apache::lonnavmaps::navmap->new();          my $navmap = Apache::lonnavmaps::navmap->new();
                 if (ref($navmap)) {                  if (ref($navmap)) {
                     my $res;              my $res = $navmap->getBySymb($symb);
                     if ($symb ne '') {  
                         $res = $navmap->getBySymb($symb);  
                     } elsif ($map ne '') {  
                         $res = $navmap->getResourceByUrl($map);  
                     }  
                     if (ref($res)) {                      if (ref($res)) {
                 $res_printable = $res->resprintable(); #printability in course context                  $res_printable = $res->resprintable(); #printability in course context
                 ($res_printstartdate, $res_printenddate) = &get_print_dates($res);                  ($res_printstartdate, $res_printenddate) = &get_print_dates($res);
                 ($course_open, $course_close) = &course_print_dates($res);                  ($course_open, $course_close) = &course_print_dates($res);
                 ($map_open, $map_close) = &map_print_dates($res);                  ($map_open, $map_close) = &map_print_dates($res);
                     } else {                      } else {
                         $res_error = 1;                          $res_error = 1; 
                     }                      }
                 } else {                  } else {
                     $res_error = 1;                      $res_error = 1;
Line 4331  sub printHelper { Line 4152  sub printHelper {
             my $postdata = $helper->{VARS}->{'postdata'};              my $postdata = $helper->{VARS}->{'postdata'};
             $resourceTitle = substr($postdata, rindex($postdata, '/') + 1);              $resourceTitle = substr($postdata, rindex($postdata, '/') + 1);
         }          }
         if (($url eq '/adm/navmaps') && ($map eq $env{'course.'.$env{'request.course.id'}.'.url'})) {          $subdir = &Apache::lonnet::filelocation("", $url);
             $res_printable=0;  
         } else {  
             $subdir = &Apache::lonnet::filelocation("", $url);  
         }  
   
   
     }      }
Line 4449  sub printHelper { Line 4266  sub printHelper {
   
       $helperFragment .= &generate_resource_chooser('CHOOSE_RESOURCES_PAGE',        $helperFragment .= &generate_resource_chooser('CHOOSE_RESOURCES_PAGE',
     'Select Resource(s) to print',      'Select Resource(s) to print',
     'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"',      'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1"',
     'RESOURCES',      'RESOURCES',
     'PAGESIZE',      'PAGESIZE',
     $url,      $url,
     $isNotMap, '', $symbFilter,      $isNotMap, '', $symbFilter,
     $start_new_option);      $start_new_option);
   
       
   
   
   
Line 4474  sub printHelper { Line 4291  sub printHelper {
  # the exact form of this depends on whether or not we are privileged or a mere   # the exact form of this depends on whether or not we are privileged or a mere
  # plebe of s student:   # plebe of s student:
   
         my $optionText    = '';  
  my $printSelector = 'map_incomplete_problems_seq';   my $printSelector = 'map_incomplete_problems_seq';
  my $nextState     = 'CHOOSE_INCOMPLETE_SEQ';   my $nextState     = 'CHOOSE_INCOMPLETE_SEQ';
  my $textSuffix    = '';   my $textSuffix    = '';
         my $nocurrloc = '';  
         if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') {  
             $nocurrloc = 1;  
         }  
   
  if ($userCanPrint)  {   if ($userCanPrint)  {
     $printSelector = 'map_incomplete_problems_people_seq';      $printSelector = 'map_incomplete_problems_people_seq';
     $nextState     = 'CHOOSE_INCOMPLETE_PEOPLE_SEQ';      $nextState     = 'CHOOSE_INCOMPLETE_PEOPLE_SEQ';
     $textSuffix    = ' for selected students';      $textSuffix    = ' for selected students';
     my $helperStates =      my $helperStates =
  &create_incomplete_folder_selstud_helper($helper, $map, $nocurrloc);    &create_incomplete_folder_selstud_helper($helper, $map); 
     &Apache::lonxml::xmlparse($r, 'helper', $helperStates);      &Apache::lonxml::xmlparse($r, 'helper', $helperStates);
  } else {   } else {
     if (&printable($map_open, $map_close)) {      if (&printable($map_open, $map_close)) {
  my $helperStates = &create_incomplete_folder_helper($helper, $map, $nocurrloc); # Create needed states for student.   my $helperStates = &create_incomplete_folder_helper($helper, $map); # Create needed states for student.
  &Apache::lonxml::xmlparse($r, 'helper', $helperStates);   &Apache::lonxml::xmlparse($r, 'helper', $helperStates);
     } else {      } else {
  # TODO: Figure out how to break the news...this folder is not printable.   # TODO: Figure out how to break the news...this folder is not printable.
Line 4500  sub printHelper { Line 4312  sub printHelper {
  }   }
   
  if ($userCanPrint || &printable($map_open, $map_close)) {   if ($userCanPrint || &printable($map_open, $map_close)) {
             if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') {  
                 $optionText = &mt('Selected [_1]Incomplete Problems[_2] [_3]not in a folder[_4]' . $textSuffix,  
                                   '<b>','</b>','<i>','</i>');  
             } else {  
                 $optionText = &mt('Selected [_1]Incomplete Problems[_2] from folder [_3]' . $textSuffix,  
                                   '<b>','</b>','<b><i>'.$sequenceTitle.'</b></i>');  
             }  
     push(@{$printChoices},      push(@{$printChoices},
  [$optionText,   [&mt('Selected  [_1]Incomplete Problems[_2] from folder [_3]' . $textSuffix,
         '<b>', '</b>',
         '<b><i>'. $sequenceTitle . '</b></i>'),
   $printSelector,    $printSelector,
   $nextState]);    $nextState]);
  }   }
         # Allow problems from sequence          # Allow problems from sequence
  if ($userCanPrint || &printable($map_open, $map_close)) {   if ($userCanPrint || &printable($map_open, $map_close)) {
             if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') {  
                 $optionText = &mt('Selected [_1]Problems[_2] [_3]not in a folder[_4]','<b>','</b>','<i>','</i>');  
             } else {  
                 $optionText = &mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>');  
             }  
     push @{$printChoices},       push @{$printChoices}, 
     [$optionText,       [&mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), 
      'map_problems',        'map_problems', 
      'CHOOSE_PROBLEMS'];       'CHOOSE_PROBLEMS'];
     # Allow all resources from sequence      # Allow all resources from sequence
             if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') {      push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), 
                 $optionText = &mt('Selected [_1]Resources[_2] [_3]not in a folder[_4]','<b>','</b>','<i>','</i>');  
             } else {  
                 $optionText = &mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>');  
             }  
     push @{$printChoices}, [$optionText,   
     'map_problems_pages',       'map_problems_pages', 
     'CHOOSE_PROBLEMS_HTML'];      'CHOOSE_PROBLEMS_HTML'];
     my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS',      my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS',
     'Select Problem(s) to print',      'Select Problem(s) to print',
     'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"',      'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1"',
     'RESOURCES',      'RESOURCES',
     'PAGESIZE',      'PAGESIZE',
     $map,      $map,
Line 4543  sub printHelper { Line 4340  sub printHelper {
     $start_new_option);      $start_new_option);
     $helperFragment .= &generate_resource_chooser('CHOOSE_PROBLEMS_HTML',      $helperFragment .= &generate_resource_chooser('CHOOSE_PROBLEMS_HTML',
   'Select Resource(s) to print',    'Select Resource(s) to print',
   'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'" suppressNavmap="1"',    'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1"',
   'RESOURCES',    'RESOURCES',
   'PAGESIZE',    'PAGESIZE',
   $map,    $map,
Line 4561  sub printHelper { Line 4358  sub printHelper {
  my $post_data = $helper->{VARS}->{'postdata'};   my $post_data = $helper->{VARS}->{'postdata'};
           
     if ($perm{'pfo'} &&  !$is_published  &&      if ($perm{'pfo'} &&  !$is_published  &&
         ($post_data=~/\/res\// || $post_data =~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) {          ($post_data=~/\/res\// || $post_data =~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { 
   
  # BZ 5209 - incomplete problems from entire course:   # BZ 5209 - incomplete problems from entire course:
   
  push(@{$printChoices},   push(@{$printChoices},
      [&mt('Selected [_1]Incomplete Problems[_2] from [_3]entire course[_4] for [_5]selected people[_6]',       [&mtn('Selected <b>Incomplete Problems</b> from <b>entire course</b> for selected people'),
               '<b>','</b>','<b>','</b>','<b>','</b>'),  
       'incomplete_problems_selpeople_course', 'INCOMPLETE_PROBLEMS_COURSE_RESOURCES']);        'incomplete_problems_selpeople_course', 'INCOMPLETE_PROBLEMS_COURSE_RESOURCES']);
  my $helperFragment = &create_incomplete_course_helper($helper); # Create needed states.   my $helperFragment = &create_incomplete_course_helper($helper); # Create needed states.
   
Line 4575  sub printHelper { Line 4371  sub printHelper {
   
  #  Selected problems/resources from entire course:   #  Selected problems/resources from entire course:
   
         push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from [_3]entire course[_4]','<b>','</b>','<b>','</b>'), 'all_problems', 'ALL_PROBLEMS'];          push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b>'), 'all_problems', 'ALL_PROBLEMS'];
  push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from [_3]entire course[_4]','<b>','</b>','<b>','</b>'), 'all_resources', 'ALL_RESOURCES'];   push @{$printChoices}, [&mtn('Selected <b>Resources</b> from <b>entire course</b>'), 'all_resources', 'ALL_RESOURCES'];
  push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from [_3]entire course[_4] for [_5]selected people[_6]','<b>','</b>','<b>','</b>','<b>','</b>'), 'all_problems_students', 'ALL_PROBLEMS_STUDENTS'];   push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b> for <b>selected people</b>'), 'all_problems_students', 'ALL_PROBLEMS_STUDENTS'];
 my $suffixXml = <<ALL_PROBLEMS;  my $suffixXml = <<ALL_PROBLEMS;
   <state name="STUDENTS1" title="Select People">    <state name="STUDENTS1" title="Select People">
       <message><b>Select sorting order of printout</b> </message>        <message><b>Select sorting order of printout</b> </message>
Line 4601  ALL_PROBLEMS Line 4397  ALL_PROBLEMS
       $start_new_option) .        $start_new_option) .
    &generate_resource_chooser('ALL_RESOURCES',     &generate_resource_chooser('ALL_RESOURCES',
       'Select Resource(s) to print',        'Select Resource(s) to print',
       'toponly="0" multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"',        " toponly='0' multichoice='1' suppressEmptySequences='0' addstatus='1' closeallpages='1' modallink='1'",
       'RESOURCES',        'RESOURCES',
       'PAGESIZE',        'PAGESIZE',
       '',        '',
Line 4639  ALL_PROBLEMS Line 4435  ALL_PROBLEMS
     'problems_for_anon', 'CHOOSE_ANON1'];      'problems_for_anon', 'CHOOSE_ANON1'];
  }   }
   
         my ($randomly_ordered_warning,$codechoice,$code_selection,$namechoice) =   my $randomly_ordered_warning = 
             &generate_common_choosers($r,$helper,$map,$url,$isProblem,$symbFilter,$start_new_option);              &get_randomly_ordered_warning($helper, $map);
   
    # resource_selector will hold a few states that:
    #   - Allow resources to be selected for printing.
    #   - Determine pagination between assignments.
    #   - Determine how many assignments should be bundled into a single PDF.
           # TODO:
    #    Probably good to do things like separate this up into several vars, each
    #    with one state, and use REGEXPs at inclusion time to set state names
    #    and next states for better mix and match capability
    #
    my $resource_selector= &generate_resource_chooser('SELECT_PROBLEMS',
     'Select resources to print',
     'multichoice="1" addstatus="1" closeallpages="1" modallink="1"',
     'RESOURCES', 
     'PRINT_FORMATTING',
     $map,
     $isProblem, '', $symbFilter,
     $start_new_option);
    $resource_selector .=  &generate_format_selector($helper,
                                                            'How should results be printed?',
                                                            'PRINT_FORMATTING').
                                  &generate_resource_chooser('CHOOSE_STUDENTS_PAGE',
    'Select Problem(s) to print',
    "multichoice='1' addstatus='1' closeallpages ='1' modallink='1'",
    'RESOURCES',
    'PRINT_FORMATTING',
    $url,
    $isProblem, '',  $symbFilter,
    $start_new_option);
   
   
   # Generate student choosers.
   
   
   
           &Apache::lonxml::xmlparse($r, 'helper',
     &generate_student_chooser('CHOOSE_TGT_STUDENTS_PAGE',
       'student_sort',
       'STUDENTS',
       'CHOOSE_STUDENTS_PAGE'));
    &Apache::lonxml::xmlparse($r, 'helper', 
     &generate_student_chooser('CHOOSE_STUDENTS',
       'student_sort',
       'STUDENTS',
       'SELECT_PROBLEMS'));
    &Apache::lonxml::xmlparse($r, 'helper', $resource_selector);
   
    my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
    my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           my @names=&Apache::lonnet::getkeys('CODEs',$cdom,$cnum);
    my $namechoice='<choice></choice>';
    foreach my $name (sort {uc($a) cmp uc($b)} @names) {
       if ($name =~ /^error: 2 /) { next; }
       if ($name =~ /^type\0/) { next; }
       $namechoice.='<choice computer="'.$name.'">'.$name.'</choice>';
    }
   
   
    my %code_values;
    my %codes_to_print;
    foreach my $key (@names) {
       %code_values = &Apache::grades::get_codes($key, $cdom, $cnum);
       foreach my $key (keys(%code_values)) {
    $codes_to_print{$key} = 1;
       }
    }
   
    my $code_selection;
    foreach my $code (sort {uc($a) cmp uc($b)} (keys(%codes_to_print))) {
       my $choice  = $code;
       if ($code =~ /^[A-Z]+$/) { # Alpha code
    $choice = &letters_to_num($code);
       }
       push(@{$helper->{DATA}{ALL_CODE_CHOICES}},[$code,$choice]);
    }
    if (%codes_to_print) {
       $code_selection .='   
       <message><b>Choose single CODE from list:</b></message>
    <message></td><td></message>
    <dropdown variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0">
                     <choice></choice>
                     <exec>
                        push(@{$state->{CHOICES}},@{$helper->{DATA}{ALL_CODE_CHOICES}});
                     </exec>
    </dropdown>
       <message></td></tr><tr><td></message>
               '.$/;
   
    }
   
           my @lines = &Apache::lonnet::get_scantronformat_file();
    my $codechoice='';
    foreach my $line (@lines) {
               next if (($line =~ /^\#/) || ($line eq ''));
       my ($name,$description,$code_type,$code_length)=
    (split(/:/,$line))[0,1,2,4];
       if ($code_length > 0 && 
    $code_type =~/^(letter|number|-1)/) {
    $codechoice.='<choice computer="'.$name.'">'.$description.'</choice>';
       }
    }
    if ($codechoice eq '') {
       $codechoice='<choice computer="default">Default</choice>';
    }
    my $anon1 = &generate_code_selector($helper, 
       'CHOOSE_ANON1',
       'SELECT_PROBLEMS',
       $codechoice,
       $code_selection,
       $namechoice) . $resource_selector;
       
       
           &Apache::lonxml::xmlparse($r, 'helper',$anon1);
   
    my $anon_page = &generate_code_selector($helper,
    'CHOOSE_ANON1_PAGE',
    'SELECT_PROBLEMS_PAGE',
    $codechoice,
    $code_selection,
    $namechoice) .
    &generate_resource_chooser('SELECT_PROBLEMS_PAGE',
      'Select Problem(s) to print',
      "multichoice='1' addstatus='1' closeallpages ='1' modallink='1'",
      'RESOURCES',
      'PRINT_FORMATTING',
      $url,
      $isProblem, '',  $symbFilter,
      $start_new_option);
    &Apache::lonxml::xmlparse($r, 'helper', $anon_page);
   
   
  if ($helper->{VARS}->{'assignment'}) {   if ($helper->{VARS}->{'assignment'}) {
   
Line 4649  ALL_PROBLEMS Line 4575  ALL_PROBLEMS
     push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]selected people[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'resources_for_students', 'CHOOSE_STUDENTS1'];      push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]selected people[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'resources_for_students', 'CHOOSE_STUDENTS1'];
     push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]CODEd assignments[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'resources_for_anon', 'CHOOSE_ANON2'];      push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]CODEd assignments[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'resources_for_anon', 'CHOOSE_ANON2'];
  }   }
   
         # resource_selector will hold a few states that:  
         #   - Allow resources to be selected for printing.  
         #   - Determine pagination between assignments.  
         #   - Determine how many assignments should be bundled into a single PDF.  
         # TODO:  
         #    Probably good to do things like separate this up into several vars, each  
         #    with one state, and use REGEXPs at inclusion time to set state names  
         #    and next states for better mix and match capability  
         #  
           
  my $resource_selector=<<RESOURCE_SELECTOR;  
    $resource_selector=<<RESOURCE_SELECTOR;
     <state name="SELECT_RESOURCES" title="Select Resources">      <state name="SELECT_RESOURCES" title="Select Resources">
     $randomly_ordered_warning      $randomly_ordered_warning
     <nextstate>PRINT_FORMATTING</nextstate>      <nextstate>PRINT_FORMATTING</nextstate>
Line 4757  CHOOSE_ANON2 Line 4674  CHOOSE_ANON2
   
     # FIXME: That RE should come from a library somewhere.      # FIXME: That RE should come from a library somewhere.
     if (($perm{'pav'}       if (($perm{'pav'} 
         && ($subdir ne '')  
  && $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'   && $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'
  && (defined($helper->{'VARS'}->{'construction'})   && (defined($helper->{'VARS'}->{'construction'})
     ||      ||
Line 4791  CHOOSE_FROM_SUBDIR Line 4707  CHOOSE_FROM_SUBDIR
   
     # Allow the user to select any sequence in the course, feed it to      # Allow the user to select any sequence in the course, feed it to
     # another resource selector for that sequence      # another resource selector for that sequence
     if ((!$helper->{VARS}->{'construction'}) &&      if (!$helper->{VARS}->{'construction'} && !$is_published) {
         (!$is_published || (($subdir eq '') && ($url eq '/adm/navmaps')))) {   push @$printChoices, [&mtn("Selected <b>Resources</b> from <b>selected folder</b> in course"),
         push(@$printChoices,[&mt('Selected [_1]Resources[_2] from [_3]selected folder[_4] in course',        'select_sequences', 'CHOOSE_SEQUENCE'];
                                  '<b>','</b>','<b>','</b>'),   my $escapedSequenceName = $helper->{VARS}->{'SEQUENCE'};
                              'select_sequences','CHOOSE_SEQUENCE']);   #Escape apostrophes and backslashes for Perl
         my $escapedSequenceName;   $escapedSequenceName =~ s/\\/\\\\/g;
         if ($helper->{VARS}->{'SEQUENCE'} ne '') {   $escapedSequenceName =~ s/'/\\'/g;
             $escapedSequenceName = $helper->{VARS}->{'SEQUENCE'};   &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_FROM_ANY_SEQUENCE);
         } elsif (($subdir eq '') && ($url eq '/adm/navmaps')) {  
             my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};  
             my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};  
             if ($env{'course.'.$env{'request.course.id'}.'.url'} eq  
                 "uploaded/$cdom/$cnum/default.sequence") {  
                 $escapedSequenceName = $env{'course.'.$env{'request.course.id'}.'.url'};  
             }  
         }  
         #Escape apostrophes and backslashes for Perl  
         $escapedSequenceName =~ s/\\/\\\\/g;  
         $escapedSequenceName =~ s/'/\\'/g;  
         my $nocurrloc;  
         if (($subdir eq '') && ($url eq '/adm/navmaps')) {  
             $nocurrloc = 'nocurrloc="1"';  
             if ($perm{'pfo'}) {  
                 push(@{$printChoices},  
                     [&mt('Selected [_1]Problems[_2] from [_3]selected folder[_4] in course for [_5]selected people[_6]',  
                          '<b>','</b>','<b>','</b>','<b>','</b>'),  
                          'select_sequences_problems_for_students','CHOOSE_SEQUENCE_STUDENTS'],  
                     [&mt('Selected [_1]Problems[_2] from [_3]selected folder[_4] in course  for [_5]CODEd assignments[_6]',  
                          '<b>','</b>','<b>','</b>','<b>','</b>'),  
                          'select_sequences_problems_for_anon','CHOOSE_SEQUENCE_ANON1'],  
                     [&mt('Selected [_1]Resources[_2] from [_3]selected folder[_4] in course for [_5]selected people[_6]',  
                          '<b>','</b>','<b>','</b>','<b>','</b>'),  
                          'select_sequences_resources_for_students','CHOOSE_SEQUENCE_STUDENTS1'],  
                     [&mt('Selected [_1]Resources[_2] from [_3]selected folder[_4] in course for [_5]CODEd assignments[_6]',  
                          '<b>','</b>','<b>','</b>','<b>','</b>'),  
                          'select_sequences_resources_for_anon','CHOOSE_SEQUENCE_ANON2']);  
                 if ($escapedSequenceName) {  
                     my ($randomly_ordered_warning,$codechoice,$code_selection,$namechoice) =  
                         &generate_common_choosers($r,$helper,$escapedSequenceName,$escapedSequenceName,  
                                                   $isProblem,$symbFilter,$start_new_option);  
   
                     my $resource_selector = <<RESOURCE_SELECTOR;  
   <state name="CHOOSE_STUDENTS2" title="Select Students and Resources">  
     <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="SELECT_RESOURCES" coursepersonnel="1" />  
   
     </state>  
     <state name="SELECT_RESOURCES" title="Select Resources">  
     $randomly_ordered_warning  
     <nextstate>PRINT_FORMATTING</nextstate>  
     <message>(mark desired resources then click "next" button) <br /></message>  
     <resource variable="RESOURCES" multichoice="1" addstatus="1"  
               closeallpages="1" modallink="1" suppressNavmap="1" $nocurrloc>  
       <filterfunc>return $isNotMap;</filterfunc>  
       <mapurl>$escapedSequenceName</mapurl>  
       <valuefunc>return $symbFilter;</valuefunc>  
       $start_new_option  
       </resource>  
     </state>  
 RESOURCE_SELECTOR  
   
                     my $anon3 = &generate_code_selector($helper,  
                                                         'CHOOSE_ANON3',  
                                                         'SELECT_RESOURCES',  
                                                         $codechoice,  
                                                         $code_selection,  
                                                         $namechoice) . $resource_selector;  
   
                     &Apache::lonxml::xmlparse($r, 'helper',$anon3);  
                 }  
             }  
         }  
         if (($subdir eq '') && ($url eq '/adm/navmaps') && ($perm{'pfo'})) {  
             &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_FROM_ANY_SEQUENCE);  
   <state name="CHOOSE_SEQUENCE" title="Select Sequence To Print From">  
     <message>Select the sequence to print resources from:</message>  
     <resource variable="SEQUENCE">  
       <nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate>  
       <filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc>  
       <valuefunc>return $urlValue;</valuefunc>  
       <choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0);  
         </choicefunc>  
       </resource>  
     </state>  
   <state name="CHOOSE_SEQUENCE_STUDENTS" title="Select Sequence To Print From">  
     <message>Select the sequence to print resources from:</message>  
     <resource variable="SEQUENCE">  
       <nextstate>CHOOSE_STUDENTS</nextstate>  
       <filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc>  
       <valuefunc>return $urlValue;</valuefunc>  
       <choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0);  
         </choicefunc>  
       </resource>  
     </state>  
   <state name="CHOOSE_SEQUENCE_ANON1" title="Select Sequence To Print From">  
     <message>Select the sequence to print resources from:</message>  
     <resource variable="SEQUENCE">  
       <nextstate>CHOOSE_ANON1</nextstate>  
       <filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc>  
       <valuefunc>return $urlValue;</valuefunc>  
       <choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0);  
         </choicefunc>  
       </resource>  
     </state>  
   <state name="CHOOSE_SEQUENCE_STUDENTS1" title="Select Sequence To Print From">  
     <message>Select the sequence to print resources from:</message>  
     <resource variable="SEQUENCE">  
       <nextstate>CHOOSE_STUDENTS2</nextstate>  
       <filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc>  
       <valuefunc>return $urlValue;</valuefunc>  
       <choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0);  
         </choicefunc>  
       </resource>  
     </state>  
   <state name="CHOOSE_SEQUENCE_ANON2" title="Select Sequence To Print From">  
     <message>Select the sequence to print resources from:</message>  
     <resource variable="SEQUENCE">  
       <nextstate>CHOOSE_ANON3</nextstate>  
       <filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc>  
       <valuefunc>return $urlValue;</valuefunc>  
       <choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0);  
         </choicefunc>  
       </resource>  
     </state>  
   <state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print">  
     <message>(mark desired resources then click "next" button) <br /></message>  
     <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"  
               closeallpages="1" modallink="1" suppressNavmap="1" $nocurrloc>  
       <nextstate>PAGESIZE</nextstate>  
       <filterfunc>return $isNotMap</filterfunc>  
       <mapurl evaluate='1'>return '$escapedSequenceName';</mapurl>  
       <valuefunc>return $symbFilter;</valuefunc>  
       $start_new_option  
       </resource>  
     </state>  
 CHOOSE_FROM_ANY_SEQUENCE  
         } else {  
     &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_FROM_ANY_SEQUENCE);  
   <state name="CHOOSE_SEQUENCE" title="Select Sequence To Print From">    <state name="CHOOSE_SEQUENCE" title="Select Sequence To Print From">
     <message>Select the sequence to print resources from:</message>      <message>Select the sequence to print resources from:</message>
     <resource variable="SEQUENCE">      <resource variable="SEQUENCE">
Line 4946  CHOOSE_FROM_ANY_SEQUENCE Line 4728  CHOOSE_FROM_ANY_SEQUENCE
   <state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print">    <state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print">
     <message>(mark desired resources then click "next" button) <br /></message>      <message>(mark desired resources then click "next" button) <br /></message>
     <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"      <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"
               closeallpages="1" modallink="1" suppressNavmap="1" $nocurrloc>                closeallpages="1" modallink="1">
       <nextstate>PAGESIZE</nextstate>        <nextstate>PAGESIZE</nextstate>
       <filterfunc>return $isNotMap</filterfunc>        <filterfunc>return $isNotMap</filterfunc>
       <mapurl evaluate='1'>return '$escapedSequenceName';</mapurl>        <mapurl evaluate='1'>return '$escapedSequenceName';</mapurl>
Line 4955  CHOOSE_FROM_ANY_SEQUENCE Line 4737  CHOOSE_FROM_ANY_SEQUENCE
       </resource>        </resource>
     </state>      </state>
 CHOOSE_FROM_ANY_SEQUENCE  CHOOSE_FROM_ANY_SEQUENCE
         }  }
     }  
     my $numchoices = 0;      my $numchoices = 0;
     if (ref($printChoices) eq 'ARRAY') {      if (ref($printChoices) eq 'ARRAY') {
         $numchoices = @{$printChoices};          $numchoices = @{$printChoices};
Line 5002  CHOOSE_FROM_ANY_SEQUENCE Line 4784  CHOOSE_FROM_ANY_SEQUENCE
   
         if ($noprintmsg) {          if ($noprintmsg) {
             $paramHash = Apache::lonhelper::getParamHash();              $paramHash = Apache::lonhelper::getParamHash();
             $paramHash->{MESSAGE_TEXT} =      $paramHash->{MESSAGE_TEXT} = 
                 '<p class="LC_info">'.$noprintmsg.'</p>';                  '<p class="LC_info">'.$noprintmsg.'</p>';
             Apache::lonhelper::message->new();      Apache::lonhelper::message->new();
         }          }
     }      }
     $paramHash = Apache::lonhelper::getParamHash();      $paramHash = Apache::lonhelper::getParamHash();
Line 5229  FONT_SELECTION Line 5011  FONT_SELECTION
       return "$helper->{VARS}->{'probstatus'}";        return "$helper->{VARS}->{'probstatus'}";
                    </defaultvalue>                     </defaultvalue>
    <choice computer="problem">Homework Problem</choice>     <choice computer="problem">Homework Problem</choice>
    <choice computer="exam">Exam Problem</choice>     <choice computer="exam">Bubblesheet Exam Problem</choice>
    <choice computer="survey">Survey question</choice>     <choice computer="survey">Survey question</choice>
                    ,choice computer="anonsurvey"Anonymous survey question</choice>                     ,choice computer="anonsurvey"Anonymous survey question</choice>
  </dropdown>   </dropdown>
Line 5347  sub render { Line 5129  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');
       my $pdfFormLabel=&mt('PDF Form Fields');
       my $with=&mt('with Form Fields');
       my $without=&mt('without Form Fields');
           
   
     $result.='<h3>'.&mt('Layout Options').'</h3>'      $result.='<h3>'.&mt('Layout Options').'</h3>'
Line 5355  sub render { Line 5140  sub render {
             .'<th>'.$PageLayout.'</th>'              .'<th>'.$PageLayout.'</th>'
             .'<th>'.$NumberOfColumns.'</th>'              .'<th>'.$NumberOfColumns.'</th>'
             .'<th>'.$PaperType.'</th>'              .'<th>'.$PaperType.'</th>'
               .'<th>'.$pdfFormLabel.'</th>'
             .&Apache::loncommon::end_data_table_header_row()              .&Apache::loncommon::end_data_table_header_row()
             .&Apache::loncommon::start_data_table_row()              .&Apache::loncommon::start_data_table_row()
     .'<td>'      .'<td>'
Line 5395  sub render { Line 5181  sub render {
     $result .= <<HTML;      $result .= <<HTML;
         </select>          </select>
     </td>      </td>
       <td align='center'>
           <select name='${var}.pdfFormFields'>
               <option selected="selected" value="no">$without</option>
               <option value="yes">$with</option>
           </select>
       </td>
 HTML  HTML
     $result.=&Apache::loncommon::end_data_table_row()      $result.=&Apache::loncommon::end_data_table_row()
             .&Apache::loncommon::end_data_table();              .&Apache::loncommon::end_data_table();

Removed from v.1.627.2.32.2.7  
changed lines
  Added in v.1.673


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