Diff for /loncom/interface/lonprintout.pm between versions 1.636 and 1.707

version 1.636, 2013/08/23 17:00:38 version 1.707, 2025/01/15 23:19:30
Line 27 Line 27
 #  #
 package Apache::lonprintout;  package Apache::lonprintout;
 use strict;  use strict;
 use POSIX;  
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
 use Apache::lonxml;  use Apache::lonxml;
 use Apache::lonnet;  use Apache::lonnet;
Line 47  use File::Basename; Line 46  use File::Basename;
   
 use HTTP::Response;  use HTTP::Response;
 use LONCAPA::map();  use LONCAPA::map();
 use POSIX qw(ctime);  
 use Apache::lonlocal;  use Apache::lonlocal;
 use Carp;  use Carp;
 use LONCAPA;  use LONCAPA;
Line 77  my $font_size = 'normalsize'; # Default Line 75  my $font_size = 'normalsize'; # Default
   
 #----------------------------  Helper helpers. -------------------------  #----------------------------  Helper helpers. -------------------------
   
 ##   ##
 # Filter function to determine if a resource is a printable sequence.  # Filter function to determine if a resource is a printable sequence.
 #  #
 # @param $res -Resource to check.  # @param $res -Resource to check.
Line 145  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.
 #    url    - Top url of the sequence  #    map    - the map for which incomplete problems are to be printed
   #    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)  = @_;      my ($helper, $map, $nocurrloc)  = @_;
   
   
     my $symbFilter = '$res->shown_symb()';      my $symbFilter = '$res->shown_symb()';
Line 159  sub create_incomplete_folder_selstud_hel Line 158  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"',        'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"',
       'RESOURCES',        'RESOURCES',
       'CHOOSE_STUDENTS_INCOMPLETE',        'CHOOSE_STUDENTS_INCOMPLETE',
       $map,        $map,
       $selFilter,        $selFilter,
       '',        '',
       $symbFilter,         $symbFilter,
       '');        '');
   
     my $student_chooser = &generate_student_chooser('CHOOSE_STUDENTS_INCOMPLETE',      my $student_chooser = &generate_student_chooser('CHOOSE_STUDENTS_INCOMPLETE',
Line 178  sub create_incomplete_folder_selstud_hel Line 177  sub create_incomplete_folder_selstud_hel
  'CHOOSE_STUDENTS_INCOMPLETE_FORMAT'); # end state.   'CHOOSE_STUDENTS_INCOMPLETE_FORMAT'); # end state.
   
     return $resource_chooser . $student_chooser . $format_chooser;      return $resource_chooser . $student_chooser . $format_chooser;
 }    }
   
   
 # BZ 5209  # BZ 5209
Line 198  sub create_incomplete_folder_selstud_hel Line 197  sub create_incomplete_folder_selstud_hel
 #   helper   - Helper we are creating states for.  #   helper   - Helper we are creating states for.
 # Returns:  # Returns:
 #   Text that can be parsed by the helper.  #   Text that can be parsed by the helper.
 #   #
   
 sub create_incomplete_course_helper {  sub create_incomplete_course_helper {
     my $helper = shift;      my $helper = shift;
   
     my $filter = '$res->is_problem() || $res->contains_problem() || $res->is_sequence() || $res->is_practice())';      my $filter = '$res->is_problem() || $res->contains_problem() || $res->is_sequence() || $res->is_practice())';
     my $symbfilter = '$res->shown_symb()';      my $symbfilter = '$res->shown_symb()';
       
     my $resource_chooser = &generate_resource_chooser('INCOMPLETE_PROBLEMS_COURSE_RESOURCES',      my $resource_chooser = &generate_resource_chooser('INCOMPLETE_PROBLEMS_COURSE_RESOURCES',
       'Select problem(s) to print',        'Select problem(s) to print',
       'multichoice = "1" suppressEmptySequences="0" addstatus="1" closeallpagtes="1"',        'multichoice = "1" suppressEmptySequences="0" addstatus="1" closeallpagtes="1" modallink="1"',
       'RESOURCES',        'RESOURCES',
       'INCOMPLETE_PROBLEMS_COURSE_STUDENTS',        'INCOMPLETE_PROBLEMS_COURSE_STUDENTS',
       '',        '',
Line 231  sub create_incomplete_course_helper { Line 230  sub create_incomplete_course_helper {
   
 }  }
   
 # BZ5209   # BZ5209
 #   Creates the states needed to run the print helper for a student  #   Creates the states needed to run the print helper for a student
 #   that wants to print his incomplete problems from the current folder.  #   that wants to print his incomplete problems from the current folder.
 # 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 244  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) = @_;      my ($helper, $map, $nocurrloc) = @_;
   
     my $filter    = '$res->is_problem()';      my $filter    = '$res->is_problem()';
     $filter      .= ' && $res->resprintable() ';      $filter      .= ' && $res->resprintable() ';
Line 254  sub create_incomplete_folder_helper { Line 254  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"',        'multichoice="1", toponly ="1", addstatus="1", closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"',
       'RESOURCES',        'RESOURCES',
       'PAGESIZE',        'PAGESIZE',
       $map,        $map,
       $filter, '',         $filter, '',
       $symfilter,        $symfilter,
       '');        '');
   
Line 276  sub create_incomplete_folder_helper { Line 276  sub create_incomplete_folder_helper {
   
   
 sub generate_student_chooser {  sub generate_student_chooser {
     my ($this_state,       my ($this_state,
  $sort_choice,    $sort_choice,
  $variable,    $variable,
  $next_state) = @_;   $next_state) = @_;
     my $result = <<CHOOSE_STUDENTS;      my $result = <<CHOOSE_STUDENTS;
   <state name="$this_state" title="Select Students and Resources">    <state name="$this_state" title="Select Students and Resources">
Line 290  sub generate_student_chooser { Line 290  sub generate_student_chooser {
     </choices>      </choices>
   
       <message><br /><hr /><br /> </message>        <message><br /><hr /><br /> </message>
       <student multichoice='1'         <student multichoice='1'
                variable="$variable"                  variable="$variable" 
                nextstate="$next_state"                  nextstate="$next_state" 
                coursepersonnel="1" />                 coursepersonnel="1" />
Line 308  CHOOSE_STUDENTS Line 308  CHOOSE_STUDENTS
 #     this_state    - State name of the chooser.  #     this_state    - State name of the chooser.
 #     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'"
 #                     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 319  CHOOSE_STUDENTS Line 320  CHOOSE_STUDENTS
 #     filter        - How to filter the resources.  #     filter        - How to filter the resources.
 #     value_func    - <valuefunc> function.  #     value_func    - <valuefunc> function.
 #     choice_func   - If not empty generates a <choicefunc> with this function.  #     choice_func   - If not empty generates a <choicefunc> with this function.
 #     start_new_option   #     start_new_option
 #                   - Fragment appended after valuefunc.  #                   - Fragment appended after valuefunc.
 #  #
 #  #
Line 445  CHOOSE_ANON1 Line 446  CHOOSE_ANON1
    return $result;     return $result;
 }  }
   
 #  Returns the XML for choosing how assignments are to be formatted   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
 #  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)
   
 #   helper       - The helper; $helper->{'VARS'}->{'PRINT_TYPE'} used  #   helper       - The helper; $helper->{'VARS'}->{'PRINT_TYPE'} used
 #                  to check if splitting PDFs by section can be offered.  #                  to check if splitting PDFs by section can be offered.
 #   title        - Title for the current state.   #   title        - Title for the current state.
 #   this_state   - State name of the chooser.  #   this_state   - State name of the chooser.
   
 sub generate_format_selector {  sub generate_format_selector {
Line 459  sub generate_format_selector { Line 588  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 492  RESOURCE_SELECTOR Line 623  RESOURCE_SELECTOR
 # @param \@opens - reference to an array of open dates.  # @param \@opens - reference to an array of open dates.
 # @param \@closes - reference to an array of close dates.  # @param \@closes - reference to an array of close dates.
 #  #
 # @return ($open, $close)   # @return ($open, $close)
 #  #
 # @note If open/close dates are not defined they will be retunred as undef  # @note If open/close dates are not defined they will be returned as undef
 # @note It is possible for there to be no overlap in which case -1,-1   # @note It is possible for there to be no overlap in which case -1,-1
 #       will be returned.  #       will be returned.
 # @note The algorithm used is to take the latest open date and the earliest end date.  # @note The algorithm used is to take the latest open date and the earliest end date.
 #  #
Line 524  sub compute_open_window { Line 655  sub compute_open_window {
   
     # If no overlap...both are -1 as promised.      # If no overlap...both are -1 as promised.
   
     if (defined($earliest_close) && defined($latest_open)      if (($earliest_close ne '') && ($latest_open ne '')
  && ($earliest_close < $latest_open)) {   && ($earliest_close < $latest_open)) {
  $latest_open  = -1;   $latest_open  = -1;
  $earliest_close = -1;   $earliest_close = -1;
     }      }
       
     return ($latest_open, $earliest_close);      return ($latest_open, $earliest_close);
     
 }  }
   
 ##  ##
Line 558  sub printable { Line 689  sub printable {
     if ($close_date && ($close_date < $now)) {      if ($close_date && ($close_date < $now)) {
  return 0;   return 0;
     }      }
       
     return 1;      return 1;
   
 }  }
Line 567  sub printable { Line 698  sub printable {
 # Returns the innermost print start/print end dates for a resource.  # Returns the innermost print start/print end dates for a resource.
 # This is done by looking at the start/end dates for its parts and choosing  # This is done by looking at the start/end dates for its parts and choosing
 # the intersection of those dates.  # the intersection of those dates.
 #   #
 # @param res - lonnvamaps::resource object that represents the resource.  # @param res - lonnvamaps::resource object that represents the resource.
 #  #
 # @return (opendate, closedate)  # @return (opendate, closedate)
 #  #
 # @note If open/close dates are not defined they will be retunred as undef  # @note If open/close dates are not defined they will be returned as undef
 # @note It is possible for there to be no overlap in which case -1,-1   # @note It is possible for there to be no overlap in which case -1,-1
 #       will be returned.  #       will be returned.
 # @note The algorithm used is to take the latest open date and the earliest end date.  # @note The algorithm used is to take the latest open date and the earliest end date.
 #  #       For consistency with &printable() in lonnavmaps.pm determination of start
   #       date for printing checks printstartdate param first, then, if not set,
   #       opendate param, then, if not set, contentopen param.
   
 sub get_print_dates {  sub get_print_dates {
     my $res = shift;      my $res = shift;
Line 595  sub get_print_dates { Line 728  sub get_print_dates {
  foreach my $part (@parts) {   foreach my $part (@parts) {
     my $partopen  = $res->parmval('printstartdate', $part);      my $partopen  = $res->parmval('printstartdate', $part);
     my $partclose = $res->parmval('printenddate',  $part);      my $partclose = $res->parmval('printenddate',  $part);
               if (!$partopen) {
                   $partopen = $res->parmval('opendate',$part);
               }
               if (!$partopen) {
                   $partopen = $res->parmval('contentopen',$part);
               }
               if ($partopen) {
                   push(@open_dates, $partopen);
               }
               if ($partclose) {
                   push(@close_dates, $partclose);
               }
     push(@open_dates, $partopen);      push(@open_dates, $partopen);
     push(@close_dates, $partclose);      push(@close_dates, $partclose);
  }   }
Line 603  sub get_print_dates { Line 747  sub get_print_dates {
   
     ($open_date, $close_date)  = &compute_open_window(\@open_dates, \@close_dates);      ($open_date, $close_date)  = &compute_open_window(\@open_dates, \@close_dates);
   
     if ($open_date) {  
  $open_date  = POSIX::strftime('%D', localtime($open_date));  
     }  
     if ($close_date) {  
  $close_date = POSIX::strftime('%D', localtime($close_date));  
     }  
   
     return ($open_date, $close_date);      return ($open_date, $close_date);
 }  }
   
Line 618  sub get_print_dates { Line 755  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 has from lonnvampas::resource.  # @param $res - Reference to a resource hash from lonnavmaps::resource.
 #  #
 # @return (opendate, closedate)  # @return (opendate, closedate)
 #  #
Line 632  sub course_print_dates { Line 769  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 658  sub map_print_dates { Line 795  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 675  sub map_print_dates { Line 812  sub map_print_dates {
 # Parameters:  # Parameters:
 #   $username - Name of user for whom we are checking.  #   $username - Name of user for whom we are checking.
 #   $domain   - Domain of user we are checking.  #   $domain   - Domain of user we are checking.
   #   $section  - Section for user for whom we are checking.
 #   $map - map name.  #   $map - map name.
 # Returns:  # Returns:
 #     0 - map is not incomplete.  #     0 - map is not incomplete.
 #     1 - map is incomplete.  #     1 - map is incomplete.
 #  #
 sub incomplete {  sub incomplete {
     my ($username, $domain, $map) = @_;      my ($username, $domain, $section, $map) = @_;
   
   
     my $navmap = Apache::lonnavmaps::navmap->new($username, $domain);      my $navmap = Apache::lonnavmaps::navmap->new($username, $domain, $section);
       
   
     if (defined($navmap)) {      if (defined($navmap)) {
  my $res = $navmap->getResourceByUrl($map);   my $res = $navmap->getResourceByUrl($map);
Line 696  sub incomplete { Line 834  sub incomplete {
     }      }
 }  }
 #  #
 #  When printing for students, the resoures and order of the  #  When printing for students, the resources and order of the
 #  resources may need to be altered if there are folders with  #  resources may need to be altered if there are folders with
 #  random selectiopn or random ordering (or both) enabled.  #  random selectiopn or random ordering (or both) enabled.
 #  This sub computes the set of resources to print for a student  #  This sub computes the set of resources to print for a student
 #  modified both by random ordering and selection and filtered  #  modified both by random ordering and selection and filtered
 #  to only those that are in the original set selcted to be printed.  #  to only those that are in the original set selected to be printed.
 #  #
 # Parameters:  # Parameters:
 #   $map - The URL of the folder being printed.  #   $map - The URL of the folder being printed.
Line 712  sub incomplete { Line 850  sub incomplete {
 #   $who   - Student/domain for whome the sequence will be generated.  #   $who   - Student/domain for whome the sequence will be generated.
 #   $code  - CODE being printed when printing Problems/Resources  #   $code  - CODE being printed when printing Problems/Resources
 #            from folder for CODEd assignments  #            from folder for CODEd assignments
   #   $nohidemap - If true, parameter in map for hiddenresource will be
   #                ignored.  The user calling the routine should have
   #                both the pav and vgr privileges if this is set to true).
 #  #
 # Implicit inputs:  # Implicit inputs:
 #   $  #   $
 # Returns:  # Returns:
 #   reference to an array of resources that can be passed to  #   reference to an array of resources that can be passed to
 #   print_resources.  #   print_resources.
 #   #
 sub master_seq_to_person_seq {  sub master_seq_to_person_seq {
     my ($map, $seq, $who, $code, $nohidemap) = @_;      my ($map, $seq, $who, $code, $nohidemap) = @_;
   
Line 733  sub master_seq_to_person_seq { Line 874  sub master_seq_to_person_seq {
     my @output_seq;      my @output_seq;
   
     my $unhidden;      my $unhidden;
     if ($perm{'pav'} && $perm{'vgr'} && $nohidemap) {      if ($nohidemap) {
         $unhidden = &Apache::lonnet::clutter($map);          $unhidden = &Apache::lonnet::clutter($map);
     }      }
       
     my $navmap           = Apache::lonnavmaps::navmap->new($username, $userdomain,      my $navmap           = Apache::lonnavmaps::navmap->new($username, $userdomain,
                                                            $code, $unhidden);                                                             $usersection, $code, $unhidden);
     my ($start,$finish);      my ($start,$finish);
   
     if ($map) {      if ($map) {
Line 756  sub master_seq_to_person_seq { Line 897  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_has.  Presumably the iterator will take care      #  and that are in the seq_hash.  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()) {
Line 774  sub master_seq_to_person_seq { Line 915  sub master_seq_to_person_seq {
     }      }
   
     return \@output_seq; # for now.      return \@output_seq; # for now.
       
 }  }
   
   
Line 797  sub fetch_raw_resource { Line 938  sub fetch_raw_resource {
     }      }
     return $contents;      return $contents;
   
       
 }  }
   
 #  Fetch the annotations associated with a URL and   #  Fetch the annotations associated with a URL and
 #  put a centered 'annotations:' title.  #  put a centered 'annotations:' title.
 #  This is all suppressed if the annotations are empty.  #  This is all suppressed if the annotations are empty.
 #  #
Line 833  sub set_font_size { Line 974  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 substituion would  insert a spurious \ oh happy day.      # case the first substitution 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;
   
   
 }  }
   
 # include_pdf - PDF files are included into the   # include_pdf - PDF files are included into the
 # output as follows:  # output as follows:
 #  - 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 includedpsheader.ps header will be included.  #    job.  The assumption is that the includepsheader.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.
 #     #
 # Returns:  # Returns:
 #  The LaTeX to include.  #  The LaTeX to include.
 #  #
Line 875  sub include_pdf { Line 1017  sub include_pdf {
  $file = &Apache::lonnet::filelocation('',$pdf_uri);   $file = &Apache::lonnet::filelocation('',$pdf_uri);
     }      }
   
     #  The file isn ow replicated locally.. or it did not exist in the first place      #  The file is now 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 tob e converted for this print job:      # need to be 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/};
   
     open(FILE,">>$Apache::lonnet::perlvar{'lonPrtDir'}/$env{'user.name'}_$env{'user.domain'}_printout.dat");      open(FILE,">>","$Apache::lonnet::perlvar{'lonPrtDir'}/$env{'user.name'}_$env{'user.domain'}_printout.dat");
     print FILE ("$file\n");      print FILE ("$file\n");
     close (FILE);      close (FILE);
   
Line 917  sub include_pdf { Line 1059  sub include_pdf {
 sub collect_languages {  sub collect_languages {
     my $doc = shift;      my $doc = shift;
     my %languages;      my %languages;
     while ($doc =~ /\\selectlanguage{(\w+)}/mg) {      while ($doc =~ /\\selectlanguage\{(\w+)}/mg) {
  $languages{$1} = 1; # allows us to request each language exactly once.   $languages{$1} = 1; # allows us to request each language exactly once.
     }      }
     my @lang_list = (keys(%languages)); # List of unique languages      my @lang_list = (keys(%languages)); # List of unique languages
     if (scalar @lang_list) {      if (scalar @lang_list) {
  my $babel_header = '\usepackage[' . join(',', @lang_list) .']{babel}'. "\n";   my $babel_header = '\usepackage[' . join(',', @lang_list) .']{babel}'. "\n";
  $doc =~ s/\\begin{document}/$babel_header\\begin{document}/;   $doc =~ s/\\begin\{document}/$babel_header\\begin{document}/;
     }      }
     return $doc;      return $doc;
 }  }
Line 935  sub collect_languages { Line 1077  sub collect_languages {
 #                      the number of times requested by the caller.  #                      the number of times requested by the caller.
 #                      If we still have a proble, no text is appended to the  #                      If we still have a proble, no text is appended to the
 #                      output and we set some global variables.  #                      output and we set some global variables.
 #                      to indicate to the caller an SSI error occurred.    #                      to indicate to the caller an SSI error occurred.
 #                      All of this is supposed to deal with the issues described  #                      All of this is supposed to deal with the issues described
 #                      in LonCAPA BZ 5631 see:  #                      in LonCAPA BZ 5631 see:
 #                      http://bugs.lon-capa.org/show_bug.cgi?id=5631  #                      http://bugs.lon-capa.org/show_bug.cgi?id=5631
Line 945  sub collect_languages { Line 1087  sub collect_languages {
 #   resource   - The resource to include.  This is passed directly, without  #   resource   - The resource to include.  This is passed directly, without
 #                interpretation to lonnet::ssi.  #                interpretation to lonnet::ssi.
 #   form       - The form hash parameters that guide the interpretation of the resource  #   form       - The form hash parameters that guide the interpretation of the resource
 #                  #
 #   retries    - Number of retries allowed before giving up completely.  #   retries    - Number of retries allowed before giving up completely.
 # Returns:  # Returns:
 #   On success, returns the rendered resource identified by the resource parameter.  #   On success, returns the rendered resource identified by the resource parameter.
Line 996  sub get_student_view_with_retries { Line 1138  sub get_student_view_with_retries {
   
 #  #
 #   printf_style_subst  item format_string repl  #   printf_style_subst  item format_string repl
 #    #
 # Does printf style substitution for a format string that  # Does printf style substitution for a format string that
 # can have %[n]item in it.. wherever, %[n]item occurs,  # can have %[n]item in it.. wherever, %[n]item occurs,
 # rep is substituted in format_string.  Note that  # rep is substituted in format_string.  Note that
 # [n] is an optional integer length.  If provided,  # [n] is an optional integer length.  If provided,
 # repl is truncated to at most [n] characters prior to   # repl is truncated to at most [n] characters prior to
 # substitution.  # substitution.
 #  #
 sub printf_style_subst {  sub printf_style_subst {
Line 1013  sub printf_style_subst { Line 1155  sub printf_style_subst {
  my $subst = $repl;   my $subst = $repl;
  if ($size ne "") {   if ($size ne "") {
     $subst = substr($subst, 0, $size);      $subst = substr($subst, 0, $size);
       
     #  Here's a nice edge case.. supose the end of the      #  Here's a nice edge case ... suppose 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).
     #  We don't just chop off the last character in order to deal      #  We don't just chop off the last character in order to deal
     #  with one last pathology, and that would be if substr had      #  with one last pathology, and that would be if substr had
     #  trimmed us to e.g. \\\        #  trimmed us to e.g. \\\
   
   
     if ($subst =~ /\\$/) {      if ($subst =~ /\\$/) {
Line 1041  sub printf_style_subst { Line 1183  sub printf_style_subst {
 }  }
   
   
 # Format a header according to a format.    # Format a header according to a format.
 #   #
   
 # Substitutions:  # Substitutions:
 #     %a    - Assignment name.  #     %a    - Assignment name.
Line 1066  sub format_page_header { Line 1208  sub format_page_header {
  # we assume that each character is about 2mm in width.   # we assume that each character is about 2mm in width.
  # (correct for the header text size??).  We ignore   # (correct for the header text size??).  We ignore
  # any formatting (e.g. boldfacing in this).   # any formatting (e.g. boldfacing in this).
  #    #
  # - Allow the student/course to be one line.   # - Allow the student/course to be one line.
  #   but only truncate the course.   #   but only truncate the course.
  # - Allow the assignment to be 2 lines (wrapped).   # - Allow the assignment to be 2 lines (wrapped).
Line 1082  sub format_page_header { Line 1224  sub format_page_header {
  if ($section) {   if ($section) {
     $format .=  ' - Sec: '."%$sec_length".'s';      $format .=  ' - Sec: '."%$sec_length".'s';
  }   }
    $format .= '\\hfill\\thepage';
   
  $format .= '\\\\%c \\\\ %a';   $format .= '\\\\%c \\\\ %a';
           
   
     }      }
     # An open question is how to handle long user formatted page headers...      # An open question is how to handle long user formatted page headers...
Line 1095  sub format_page_header { Line 1238  sub format_page_header {
     $format =  &printf_style_subst("c", $format, $course);      $format =  &printf_style_subst("c", $format, $course);
     $format =  &printf_style_subst("n", $format, $student);      $format =  &printf_style_subst("n", $format, $student);
     $format =  &printf_style_subst("s", $format, $section);      $format =  &printf_style_subst("s", $format, $section);
       
       
     # If the user put %'s in the format string, they  must be escaped      # If the user put %'s in the format string, they  must be escaped
     # to \% else LaTeX will think they are comments and terminate      # to \% else LaTeX will think they are comments and terminate
     # the line.. which is bad!!!      # 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
     if($format =~ /\\\\\s\\\\\s/) {      if($format =~ /\\\\\s\\\\\s/) {
Line 1123  sub format_page_header { Line 1266  sub format_page_header {
   
   
     return $format;      return $format;
       
 }  }
   
 #  #
Line 1171  sub is_valid_numeric_code { Line 1314  sub is_valid_numeric_code {
     #   Remove leading/trailing whitespace;      #   Remove leading/trailing whitespace;
     $value =~ s/^\s*//g;      $value =~ s/^\s*//g;
     $value =~ s/\s*$//g;      $value =~ s/\s*$//g;
       
     #  All digits?      #  All digits?
     if ($value !~ /^[0-9]+$/) {      if ($value !~ /^[0-9]+$/) {
  return "Numeric code $value has invalid characters - must only be digits";   return "Numeric code $value has invalid characters - must only be digits";
Line 1192  sub is_valid_numeric_code { Line 1335  sub is_valid_numeric_code {
 #  #
 sub is_valid_alpha_code {  sub is_valid_alpha_code {
     my ($value, $num_letters) = @_;      my ($value, $num_letters) = @_;
       
      # strip leading and trailing spaces.       # strip leading and trailing spaces.
   
     $value =~ s/^\s*//g;      $value =~ s/^\s*//g;
Line 1210  sub is_valid_alpha_code { Line 1353  sub is_valid_alpha_code {
   
 #   Determine if a code entered by the user in a helper is valid.  #   Determine if a code entered by the user in a helper is valid.
 #   valid depends on the code type and the type of code selected.  #   valid depends on the code type and the type of code selected.
 #   The type of code selected can either be numeric or   #   The type of code selected can either be numeric or
 #   Alphabetic.  If alphabetic, the code, in fact is a simple  #   Alphabetic.  If alphabetic, the code, in fact is a simple
 #   substitution cipher for the actual numeric code: 0->A, 1->B ...  #   substitution cipher for the actual numeric code: 0->A, 1->B ...
 #   We'll be nice and be case insensitive for alpha codes.  #   We'll be nice and be case insensitive for alpha codes.
Line 1225  sub is_valid_alpha_code { Line 1368  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.
     my @lines = &Apache::grades::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 1246  sub is_code_valid { Line 1390  sub is_code_valid {
 #  #
 # Compare two students by section (Used to sort by section).  # Compare two students by section (Used to sort by section).
 #  #
 #  Implicit inputs,   #  Implicit inputs,
 #    $a - The first one  #    $a - The first one
 #    $b - The second one.  #    $b - The second one.
 #  #
Line 1298  sub compare_names { Line 1442  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...
       
     $f2 =~ s/^\s+//;      $f2 =~ s/^\s+//;
     $f2 =~ s/\s+$//; # And the same for first 2...      $f2 =~ s/\s+$//; # And the same for first 2...
   
Line 1312  sub compare_names { Line 1456  sub compare_names {
     if($f1 gt $f2) {      if($f1 gt $f2) {
  return 1;   return 1;
     }      }
       
     #  Must be the same name.      #  Must be the same name.
   
     return 0;      return 0;
Line 1320  sub compare_names { Line 1464  sub compare_names {
   
 sub latex_header_footer_remove {  sub latex_header_footer_remove {
     my $text = shift;      my $text = shift;
     $text =~ s/\\end{document}//;      $text =~ s/\\end\{document}//;
     $text =~ s/\\documentclass([^&]*)\\begin{document}//;      $text =~ s/\\documentclass([^&]*)\\begin\{document}//;
     return $text;      return $text;
 }  }
 #  #
 #  If necessary, encapsulate text inside   #  If necessary, encapsulate text inside
 #  a minipage env.  #  a minipage env.
 #  necessity is determined by the problem_split param.  #  necessity is determined by the problem_split param.
 #  #
 sub encapsulate_minipage {  sub encapsulate_minipage {
     my ($text) = @_;      my ($text,$problem_split) = @_;
     if (!($env{'form.problem.split'} =~ /yes/i)) {      if (!($problem_split =~ /yes/i)) {
  $text = '\begin{minipage}{\textwidth}'.$text.'\end{minipage}';   $text = '\begin{minipage}{\textwidth}'.$text.'\end{minipage}';
     }      }
     return $text;      return $text;
Line 1349  sub adjust_number_to_print { Line 1493  sub adjust_number_to_print {
     my $helper = shift;      my $helper = shift;
   
     my $split_pdf = $helper->{'VARS'}->{'SPLIT_PDFS'};      my $split_pdf = $helper->{'VARS'}->{'SPLIT_PDFS'};
       
     if ($split_pdf eq 'all') {      if ($split_pdf eq 'all') {
  $helper->{'VARS'}->{'NUMBER_TO_PRINT'} = 'all';   $helper->{'VARS'}->{'NUMBER_TO_PRINT'} = 'all';
     } elsif ($split_pdf eq 'oneper') {      } elsif ($split_pdf eq 'oneper') {
Line 1381  sub old_character_chart { Line 1525  sub old_character_chart {
     $result =~ s/&(\#0?34|quot);/\"/g;      $result =~ s/&(\#0?34|quot);/\"/g;
     $result =~ s/&\#0?35;/\\\#/g;      $result =~ s/&\#0?35;/\\\#/g;
     $result =~ s/&\#0?36;/\\\$/g;      $result =~ s/&\#0?36;/\\\$/g;
     $result =~ s/&\#0?37;/\\%/g;       $result =~ s/&\#0?37;/\\%/g;
     $result =~ s/&(\#0?38|amp);/\\&/g;       $result =~ s/&(\#0?38|amp);/\\&/g;
     $result =~ s/&\#(0?39|146);/\'/g;      $result =~ s/&\#(0?39|146);/\'/g;
     $result =~ s/&\#0?40;/(/g;      $result =~ s/&\#0?40;/(/g;
     $result =~ s/&\#0?41;/)/g;      $result =~ s/&\#0?41;/)/g;
Line 1489  sub old_character_chart { Line 1633  sub old_character_chart {
     $result =~ s/&(\#160|nbsp);/~/g;      $result =~ s/&(\#160|nbsp);/~/g;
     $result =~ s/&(\#161|iexcl);/!\`/g;      $result =~ s/&(\#161|iexcl);/!\`/g;
     $result =~ s/&(\#162|cent);/\\textcent /g;      $result =~ s/&(\#162|cent);/\\textcent /g;
     $result =~ s/&(\#163|pound);/\\pounds /g;       $result =~ s/&(\#163|pound);/\\pounds /g;
     $result =~ s/&(\#164|curren);/\\textcurrency /g;      $result =~ s/&(\#164|curren);/\\textcurrency /g;
     $result =~ s/&(\#165|yen);/\\textyen /g;      $result =~ s/&(\#165|yen);/\\textyen /g;
     $result =~ s/&(\#166|brvbar);/\\textbrokenbar /g;      $result =~ s/&(\#166|brvbar);/\\textbrokenbar /g;
Line 1515  sub old_character_chart { Line 1659  sub old_character_chart {
     $result =~ s/&(\#188|frac14);/\\textonequarter /g;      $result =~ s/&(\#188|frac14);/\\textonequarter /g;
     $result =~ s/&(\#189|frac12);/\\textonehalf /g;      $result =~ s/&(\#189|frac12);/\\textonehalf /g;
     $result =~ s/&(\#190|frac34);/\\textthreequarters /g;      $result =~ s/&(\#190|frac34);/\\textthreequarters /g;
     $result =~ s/&(\#191|iquest);/?\`/g;         $result =~ s/&(\#191|iquest);/?\`/g;
     $result =~ s/&(\#192|Agrave);/\\\`{A}/g;        $result =~ s/&(\#192|Agrave);/\\\`{A}/g;
     $result =~ s/&(\#193|Aacute);/\\\'{A}/g;       $result =~ s/&(\#193|Aacute);/\\\'{A}/g;
     $result =~ s/&(\#194|Acirc);/\\^{A}/g;      $result =~ s/&(\#194|Acirc);/\\^{A}/g;
     $result =~ s/&(\#195|Atilde);/\\~{A}/g;      $result =~ s/&(\#195|Atilde);/\\~{A}/g;
     $result =~ s/&(\#196|Auml);/\\\"{A}/g;       $result =~ s/&(\#196|Auml);/\\\"{A}/g;
     $result =~ s/&(\#197|Aring);/{\\AA}/g;      $result =~ s/&(\#197|Aring);/{\\AA}/g;
     $result =~ s/&(\#198|AElig);/{\\AE}/g;      $result =~ s/&(\#198|AElig);/{\\AE}/g;
     $result =~ s/&(\#199|Ccedil);/\\c{c}/g;      $result =~ s/&(\#199|Ccedil);/\\c{c}/g;
     $result =~ s/&(\#200|Egrave);/\\\`{E}/g;        $result =~ s/&(\#200|Egrave);/\\\`{E}/g;
     $result =~ s/&(\#201|Eacute);/\\\'{E}/g;          $result =~ s/&(\#201|Eacute);/\\\'{E}/g;
     $result =~ s/&(\#202|Ecirc);/\\^{E}/g;      $result =~ s/&(\#202|Ecirc);/\\^{E}/g;
     $result =~ s/&(\#203|Euml);/\\\"{E}/g;      $result =~ s/&(\#203|Euml);/\\\"{E}/g;
     $result =~ s/&(\#204|Igrave);/\\\`{I}/g;      $result =~ s/&(\#204|Igrave);/\\\`{I}/g;
     $result =~ s/&(\#205|Iacute);/\\\'{I}/g;          $result =~ s/&(\#205|Iacute);/\\\'{I}/g;
     $result =~ s/&(\#206|Icirc);/\\^{I}/g;      $result =~ s/&(\#206|Icirc);/\\^{I}/g;
     $result =~ s/&(\#207|Iuml);/\\\"{I}/g;          $result =~ s/&(\#207|Iuml);/\\\"{I}/g;
     $result =~ s/&(\#209|Ntilde);/\\~{N}/g;      $result =~ s/&(\#209|Ntilde);/\\~{N}/g;
     $result =~ s/&(\#210|Ograve);/\\\`{O}/g;      $result =~ s/&(\#210|Ograve);/\\\`{O}/g;
     $result =~ s/&(\#211|Oacute);/\\\'{O}/g;      $result =~ s/&(\#211|Oacute);/\\\'{O}/g;
     $result =~ s/&(\#212|Ocirc);/\\^{O}/g;      $result =~ s/&(\#212|Ocirc);/\\^{O}/g;
     $result =~ s/&(\#213|Otilde);/\\~{O}/g;      $result =~ s/&(\#213|Otilde);/\\~{O}/g;
     $result =~ s/&(\#214|Ouml);/\\\"{O}/g;          $result =~ s/&(\#214|Ouml);/\\\"{O}/g;
     $result =~ s/&(\#215|times);/\\ensuremath\{\\times\}/g;      $result =~ s/&(\#215|times);/\\ensuremath\{\\times\}/g;
     $result =~ s/&(\#216|Oslash);/{\\O}/g;      $result =~ s/&(\#216|Oslash);/{\\O}/g;
     $result =~ s/&(\#217|Ugrave);/\\\`{U}/g;          $result =~ s/&(\#217|Ugrave);/\\\`{U}/g;
     $result =~ s/&(\#218|Uacute);/\\\'{U}/g;      $result =~ s/&(\#218|Uacute);/\\\'{U}/g;
     $result =~ s/&(\#219|Ucirc);/\\^{U}/g;      $result =~ s/&(\#219|Ucirc);/\\^{U}/g;
     $result =~ s/&(\#220|Uuml);/\\\"{U}/g;      $result =~ s/&(\#220|Uuml);/\\\"{U}/g;
Line 1571  sub old_character_chart { Line 1715  sub old_character_chart {
     $result =~ s/&(\#246|ouml);/\\\"{o}/g;      $result =~ s/&(\#246|ouml);/\\\"{o}/g;
     $result =~ s/&(\#247|divide);/\\ensuremath\{\\div\}/g;      $result =~ s/&(\#247|divide);/\\ensuremath\{\\div\}/g;
     $result =~ s/&(\#248|oslash);/{\\o}/g;      $result =~ s/&(\#248|oslash);/{\\o}/g;
     $result =~ s/&(\#249|ugrave);/\\\`{u}/g;       $result =~ s/&(\#249|ugrave);/\\\`{u}/g;
     $result =~ s/&(\#250|uacute);/\\\'{u}/g;      $result =~ s/&(\#250|uacute);/\\\'{u}/g;
     $result =~ s/&(\#251|ucirc);/\\^{u}/g;      $result =~ s/&(\#251|ucirc);/\\^{u}/g;
     $result =~ s/&(\#252|uuml);/\\\"{u}/g;      $result =~ s/&(\#252|uuml);/\\\"{u}/g;
Line 1718  sub old_character_chart { Line 1862  sub old_character_chart {
 my %page_formats=  my %page_formats=
     ('letter' => {      ('letter' => {
  'book' => {   'book' => {
      '1' => [ '7.1 in','9.8 in', '-0.57 in','-0.57 in','0.275 in'],       '1' => [ '7.1 in','9.7 in', '-0.57 in','-0.57 in','-0.5 in'],
      '2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','0.275 in']       '2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','-0.5 in']
  },   },
  'album' => {   'album' => {
      '1' => [ '8.8 in', '6.8 in','-0.55 in',  '-0.55 in','0.394 in'],       '1' => [ '8.8 in', '6.8 in','-0.55 in',  '-0.55 in','-0.5 in'],
      '2' => [ '4.8 in', '6.8 in','-0.5 in', '-1.0 in','3.5 in']       '2' => [ '4.8 in', '6.7 in','-0.5 in', '-1.0 in','3.0 in']
  },   },
      },       },
      'legal' => {       'legal' => {
Line 1733  my %page_formats= Line 1877  my %page_formats=
  },   },
  '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'],
              '2' => ['6.0 in','7.1 in','-1 in','-1 in','5 in']               '2' => ['5.7 in','7.1 in','-1 in','-1 in','5 in']
           },            },
      },       },
      'tabloid' => {       'tabloid' => {
Line 1782  my %page_formats= Line 1926  my %page_formats=
      '2' => [ '9.1 cm','27.2 cm','-1.397 cm','-2.11 cm','-1.27 cm']       '2' => [ '9.1 cm','27.2 cm','-1.397 cm','-2.11 cm','-1.27 cm']
  },   },
  'album' => {   'album' => {
      '1' => ['21.59 cm','19.558 cm','-1.397cm','-2.11 cm','0 cm'],       '1' => ['24.0 cm','18.0 cm','-1.0 cm','-1.0 cm','-1.25 cm'],
      '2' => ['9.91 cm','19.558 cm','-1.397 cm','-2.11 cm','0 cm']       '2' => ['11.5 cm','18.0 cm','-0.7 cm','-1.7 cm','-1.25 cm']
  },   },
      },       },
      'a5' => {       'a5' => {
Line 1815  sub page_format { Line 1959  sub page_format {
 #                        "A2 [420x594 mm]",           "A3 [297x420 mm]",  #                        "A2 [420x594 mm]",           "A3 [297x420 mm]",
 #                        "A4 [210x297 mm]",           "A5 [148x210 mm]",  #                        "A4 [210x297 mm]",           "A5 [148x210 mm]",
 #                        "A6 [105x148 mm]"  #                        "A6 [105x148 mm]"
 #   #
     my ($papersize,$layout,$numberofcolumns) = @_;       my ($papersize,$layout,$numberofcolumns) = @_;
     return @{$page_formats{$papersize}->{$layout}->{$numberofcolumns}};      return @{$page_formats{$papersize}->{$layout}->{$numberofcolumns}};
 }  }
   
Line 1836  sub get_course { Line 1980  sub get_course {
     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'};   my $sec = $env{'request.course.sec'};
       
     }      }
     return $courseidinfo;      return $courseidinfo;
 }  }
   
 sub page_format_transformation {  sub page_format_transformation {
     my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents,$indexlist,$selectionmade) = @_;       my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents,
           $indexlist,$selectionmade,$mostrecent) = @_;
     my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin);      my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin);
   
     if ($selectionmade eq '4') {      if ($selectionmade eq '4') {
Line 1856  sub page_format_transformation { Line 2001  sub page_format_transformation {
     }      }
     ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin);      ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin);
   
       my $name;
     my $name = &get_name();      if ($mostrecent ne '') {
           $name = $mostrecent;
       } else {
           $name = &get_name();
       }
     my $courseidinfo = &get_course();      my $courseidinfo = &get_course();
     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,
Line 1867  sub page_format_transformation { Line 2016  sub page_format_transformation {
     my $fancypagestatement='';      my $fancypagestatement='';
     if ($numberofcolumns eq '2') {      if ($numberofcolumns eq '2') {
  $fancypagestatement="\\fancyhead{}\\fancyhead[LO]{$header_text}";   $fancypagestatement="\\fancyhead{}\\fancyhead[LO]{$header_text}";
    if ($parmhash{'print_header_format'} eq '') {
       $fancypagestatement .= "\\fancyhead[RE]{\\thepage \\\\[\\baselineskip]}";
    }
     } else {      } else {
  $fancypagestatement="\\rhead{}\\chead{}\\lhead{$header_text}";   $fancypagestatement="\\rhead{}\\chead{}\\lhead{$header_text}";
     }      }
       $fancypagestatement .= "\\fancyfoot{}";
       my ($paperwidth,$paperheight);
     if ($layout eq 'album') {      if ($layout eq 'album') {
     $text =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\n\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\n\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\n\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /;      $text =~ s/\\begin\{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\n\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\n\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\n\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /;
           if ($papersize eq 'a4') {
               $paperwidth = '29.7cm';
               $paperheight = '21.0cm';
           } elsif ($numberofcolumns eq '1') {
               if ($papersize eq 'letter') {
                   $paperwidth = '11.0in';
                   $paperheight = '8.5in';
               } elsif ($papersize eq 'legal') {
                   $paperwidth = '14.0in';
                   $paperheight = '8.5in';
               }
           }
     } elsif ($layout eq 'book') {      } elsif ($layout eq 'book') {
  if ($choice ne 'All class print') {    if ($choice ne 'All class print') {
     $text =~ s/\\begin{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset $topmargintoinsert\n\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\n\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\n\\voffset=-0\.8 cm\\setcounter{page}{1}\n/;      $text =~ s/\\begin\{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset $topmargintoinsert\n\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\n\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\n\\voffset=-0\.8 cm\\setcounter{page}{1}\n/;
  } else {   } else {
     $text =~ s/\\pagestyle{fancy}\\rhead{}\\chead{}\s*\\begin{document}/\\textheight = $textheight\\oddsidemargin = $evenoffset\n\\evensidemargin = $evenoffset $topmargintoinsert\\textwidth= $textwidth\\newlength{\\minipagewidth}\n\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1}  \\vskip 5 mm\n /;      $text =~ s/\\pagestyle\{fancy}\\rhead\{}\\chead\{}\s*\\begin\{document}/\\textheight = $textheight\\oddsidemargin = $evenoffset\n\\evensidemargin = $evenoffset $topmargintoinsert\\textwidth= $textwidth\\newlength{\\minipagewidth}\n\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1}  \\vskip 5 mm\n /;
  }  
  if ($papersize eq 'a4') {  
     my $papersize_text;  
     if ($perm{'pav'}) {  
  $papersize_text = '\\special{papersize=210mm,297mm}';  
     } else {  
  $papersize_text = '\special{papersize=210mm,297mm}';  
     }  
     $text =~ s/(\\begin{document})/$1$papersize_text/;  
  }   }
           if ($papersize eq 'a4') {
               $paperwidth = '21.0cm';
               $paperheight = '29.7cm';
           } elsif ($papersize eq 'letter') {
               $paperwidth = '8.5in';
               $paperheight = '11.0in';
            } elsif ($papersize eq 'legal') {
               $paperwidth = '8.5in';
               $paperheight = '14.0in';
           }
       }
       if ($paperwidth ne '' && $paperheight ne '') {
           my $papersize_text;
           if ($perm{'pav'}) {
               $papersize_text = '\\special{papersize='.$paperwidth.','.$paperheight.'}';
           } else {
               $papersize_text = '\special{papersize='.$paperwidth.','.$paperheight.'}';
           }
           $text =~ s/(\\begin\{document})/$1$papersize_text/;
     }      }
     if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;}      if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;}
     if ($indexlist eq 'yes') {      if ($indexlist eq 'yes') {
  $text=~s/(\\begin{document})/\\makeindex $1/;   $text=~s/(\\begin\{document})/\\makeindex $1/;
  $text=~s/(\\end{document})/\\strut\\\\\\strut\\printindex $1/;   $text=~s/(\\end\{document})/\\strut\\\\\\strut\\printindex $1/;
     }      }
     return $text;      return $text;
 }  }
Line 1899  sub page_format_transformation { Line 2075  sub page_format_transformation {
   
 sub page_cleanup {  sub page_cleanup {
     my $result = shift;      my $result = shift;
    
     $result =~ m/\\end{document}(\d*)$/;      $result =~ m/\\end\{document}(\d*)$/;
     my $number_of_columns = $1;      my $number_of_columns = $1;
     my $insert = '{';      my $insert = '{';
     for (my $id=1;$id<=$number_of_columns;$id++) { $insert .='l'; }      for (my $id=1;$id<=$number_of_columns;$id++) { $insert .='l'; }
     $insert .= '}';      $insert .= '}';
     $result =~ s/(\\begin{longtable})INSERTTHEHEADOFLONGTABLE\\endfirsthead\\endhead/$1$insert/g;      $result =~ s/(\\begin\{longtable})INSERTTHEHEADOFLONGTABLE\\endfirsthead\\endhead/$1$insert/g;
     $result =~ s/&\s*REMOVETHEHEADOFLONGTABLE\\\\/\\\\/g;      $result =~ s/&\s*REMOVETHEHEADOFLONGTABLE\\\\/\\\\/g;
     return $result,$number_of_columns;      return $result,$number_of_columns;
 }  }
Line 1941  my $end_of_student = "\n".'\special{ps:E Line 2117  my $end_of_student = "\n".'\special{ps:E
   
 sub latex_corrections {  sub latex_corrections {
     my ($number_of_columns,$result,$selectionmade,$answer_mode) = @_;      my ($number_of_columns,$result,$selectionmade,$answer_mode) = @_;
 #    $result =~ s/\\includegraphics{/\\includegraphics\[width=\\minipagewidth\]{/g;  #    $result =~ s/\\includegraphics\{/\\includegraphics\[width=\\minipagewidth\]{/g;
     my $copyright = &copyright_line();      my $copyright = &copyright_line();
     if ($selectionmade eq '1' || $answer_mode eq 'only') {      if ($selectionmade eq '1' || $answer_mode eq 'only') {
  $result =~ s/(\\end{document})/\\strut\\vskip 0 mm $copyright $end_of_student $1/;   $result =~ s/(\\end\{document})/\\strut\\vskip 0 mm $copyright $end_of_student $1/;
     } else {      } else {
  $result =~ s/(\\end{document})/\\strut\\vspace\*{-4 mm}\\newline $copyright $end_of_student $1/;   $result =~ s/(\\end\{document})/\\strut\\vspace\*{-4 mm}\\newline $copyright $end_of_student $1/;
     }      }
     $result =~ s/\$number_of_columns/$number_of_columns/g;      $result =~ s/\$number_of_columns/$number_of_columns/g;
     $result =~ s/(\\end{longtable}\s*)(\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill})/$2$1/g;      $result =~ s/(\\end\{longtable}\s*)(\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]\{\\hrulefill})/$2$1/g;
     $result =~ s/(\\end{longtable}\s*)\\strut\\newline/$1/g;      $result =~ s/(\\end\{longtable}\s*)\\strut\\newline/$1/g;
 #-- LaTeX corrections       #-- LaTeX corrections
     my $first_comment = index($result,'<!--',0);      my $first_comment = index($result,'<!--',0);
     while ($first_comment != -1) {      while ($first_comment != -1) {
  my $end_comment = index($result,'-->',$first_comment);   my $end_comment = index($result,'-->',$first_comment);
Line 1969  sub latex_corrections { Line 2145  sub latex_corrections {
     if ($result =~ m/&(\w+|#\d+);/) {      if ($result =~ m/&(\w+|#\d+);/) {
  $result = &character_chart($result);   $result = &character_chart($result);
     }      }
     $result =~ s/(\\end{tabular})\s*\\vskip 0 mm/$1/g;      $result =~ s/(\\end\{tabular})\s*\\vskip 0 mm/$1/g;
     $result =~ s/(\\begin{enumerate})\s*\\noindent/$1/g;      $result =~ s/(\\begin\{enumerate})\s*\\noindent/$1/g;
     return $result;      return $result;
 }  }
   
Line 2063  sub get_textwidth { Line 2239  sub get_textwidth {
   
 sub unsupported {  sub unsupported {
     my ($currentURL,$mode,$symb)=@_;      my ($currentURL,$mode,$symb)=@_;
       my $cleanURL=&Apache::lonenc::check_decrypt($currentURL);
       my $shown = $currentURL;
       if (($cleanURL ne $currentURL) || ($symb =~ m{/^enc/})) {
           $shown = &mt('URL not shown (encrypted)');
       }
     if ($mode ne '') {$mode='\\'.$mode}      if ($mode ne '') {$mode='\\'.$mode}
     my $result.= &print_latex_header($mode);      my $result = &print_latex_header($mode);
     if ($currentURL=~m|^(/adm/wrapper/)?ext/|) {      if ($cleanURL=~m|^(/adm/wrapper)?/ext/|) {
  $currentURL=~s|^(/adm/wrapper/)?ext/|http://|;          $cleanURL=~s|^(/adm/wrapper)?/ext/|http://|;
         $currentURL=~s|^http://https://|https://|;          $cleanURL=~s|^http://https://|https://|;
  my $title=&Apache::lonnet::gettitle($symb);          if ($shown eq $currentURL) {
  $title = &Apache::lonxml::latex_special_symbols($title);              $shown = &Apache::lonxml::latex_special_symbols($cleanURL);
  $result.=' \strut \\\\ '.$title.' \strut \\\\ '.$currentURL.' ';          }
           my $title=&Apache::lonnet::gettitle($symb);
           $title = &Apache::lonxml::latex_special_symbols($title);
           $result.=' \strut \\\\ \textit{'.$title.'} \strut \\\\ '.$shown.' ';
     } else {      } else {
  $result.=$currentURL;          if ($shown eq $currentURL) {
       $result.=&Apache::lonxml::latex_special_symbols($currentURL);
           } else {
               $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}';
     return $result;      return $result;
Line 2108  sub print_page_in_course { Line 2296  sub print_page_in_course {
     $laystyle = &map_laystyle($laystyle);      $laystyle = &map_laystyle($laystyle);
     my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,      my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,
       $numberofcolumns);        $numberofcolumns);
     my $LaTeXwidth=&recalcto_mm($textwidth);       my $LaTeXwidth=&recalcto_mm($textwidth);
   
   
     if ($mode ne '') {$mode='\\'.$mode}      if ($mode ne '') {$mode='\\'.$mode}
     my $result   =    &print_latex_header($mode);      my $result   =    &print_latex_header($mode);
     if ($currentURL=~m|^(/adm/wrapper/)?ext/|) {  
  $currentURL=~s|^(/adm/wrapper/)?ext/|http://|;      my $title=&Apache::lonnet::gettitle($currentURL);
  my $title=&Apache::lonnet::gettitle($symb);      $title = &Apache::lonxml::latex_special_symbols($title);
  $title = &Apache::lonxml::latex_special_symbols($title);      $result .= '\noindent\textit{'.$title.'}\\\\';
     } else {  
         my $esc_currentURL= $currentURL;  
         $esc_currentURL =~ s/_/\\_/g;  
  $result.=$esc_currentURL;  
     }  
     $result .= '\\\\';  
   
     if ($helper->{'VARS'}->{'style_file'}=~/\w/) {      if ($helper->{'VARS'}->{'style_file'}=~/\w/) {
  &Apache::lonnet::appenv({'construct.style' =>   &Apache::lonnet::appenv({'construct.style' =>
Line 2131  sub print_page_in_course { Line 2312  sub print_page_in_course {
  &Apache::lonnet::delenv('construct.style');   &Apache::lonnet::delenv('construct.style');
     }      }
   
     # First is the overall page description.  This is then followed by the       # First is the overall page description.  This is then followed by the
     # components of the page. Each of which must be printed independently.      # components of the page. Each of which must be printed independently.
     my $the_page = shift(@page_resources);       my $the_page = shift(@page_resources);
   
   
     foreach my $resource (@page_resources) {      foreach my $resource (@page_resources) {
  my $resource_src   = $resource->src(); # Essentially the URL of the resource.   my $resource_src   = $resource->src(); # Essentially the URL of the resource.
  $result           .= $resource->title() . '\\\\';          my $current_url = $resource->link();
   
  # Recurse if a .page:   # Recurse if a .page:
   
  if ($resource_src =~ /.page$/i) {   if ($resource_src =~ /.page$/i) {
     my $navmap         = Apache::lonnavmaps::navmap->new();      my $navmap         = Apache::lonnavmaps::navmap->new();
     my @page_resources = $navmap->retrieveResources($resource_src);      my @page_resources = $navmap->retrieveResources($resource_src);
     $result           .= &print_page_in_course($helper, $rparmhash,       $result           .= &print_page_in_course($helper, $rparmhash,
        $resource_src, \@page_resources);         $resource_src, \@page_resources);
         } elsif ($resource->ext()) {          } elsif ($resource->ext()) {
             $result .= &unsupported($currentURL,$mode,$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)$/)  {
  # these resources go through the XML transformer:              # these resources go through the XML transformer:
               $result .= &Apache::lonxml::latex_special_symbols($resource->title()) . '\\\\';
  elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/)  {  
   
     my $urlp = &Apache::lonnet::clutter($resource_src);      my $urlp = &Apache::lonnet::clutter($resource_src);
   
Line 2165  sub print_page_in_course { Line 2345  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'} = $pdfFormFields; #       $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'};
     $form{'suppress_tries'}=$parmhash{'suppress_tries'};      $form{'suppress_tries'}=$parmhash{'suppress_tries'};
     $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};      $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
Line 2183  sub print_page_in_course { Line 2363  sub print_page_in_course {
     }      }
     $form{'rndseed'}=$rndseed;      $form{'rndseed'}=$rndseed;
     &Apache::lonnet::appenv(\%moreenv);      &Apache::lonnet::appenv(\%moreenv);
       
     &Apache::lonxml::clear_problem_counter();      &Apache::lonxml::clear_problem_counter();
   
     my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form);      my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form);
Line 2208  sub print_page_in_course { Line 2388  sub print_page_in_course {
  my $answer=&ssi_with_retries($urlp,$ssi_retry_count, %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 {
     $texversion= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      $texversion= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
     if ($helper->{'VARS'}->{'construction'} ne '1') {      if ($helper->{'VARS'}->{'construction'} ne '1') {
Line 2223  sub print_page_in_course { Line 2403  sub print_page_in_course {
     }      }
     $texversion.='\vskip 1 mm '.$answer.'\end{document}';      $texversion.='\vskip 1 mm '.$answer.'\end{document}';
  }   }
   
   
   
   
       
     }      }
     # Print annotations.      # Print annotations.
   
   
     if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {      if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
  my $annotation .= &annotate($currentURL);   my $annotation .= &annotate($currentURL);
  $texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/;   $texversion =~ s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/;
     }      }
       
     if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {      if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
  $texversion=&IndexCreation($texversion,$currentURL);   $texversion=&IndexCreation($texversion,$currentURL);
     }      }
Line 2274  sub recently_generated { Line 2449  sub recently_generated {
     my $pdf_result;      my $pdf_result;
     opendir(DIR,$prtspool);      opendir(DIR,$prtspool);
   
     my @files =       my @files =
  grep(/^$env{'user.name'}_$env{'user.domain'}_printout_(\d+)_.*\.(pdf|zip)$/,readdir(DIR));   grep(/^$env{'user.name'}_$env{'user.domain'}_printout_(\d+)_.*\.(pdf|zip)$/,readdir(DIR));
     closedir(DIR);      closedir(DIR);
   
Line 2354  sub get_page_breaks  { Line 2529  sub get_page_breaks  {
     }      }
     return %page_breaks;      return %page_breaks;
 }  }
 #   #
 #   Returns text to insert for any extra vskip prior to the resource.  #   Returns text to insert for any extra vskip prior to the resource.
 #   Parameters:  #   Parameters:
 #     helper   - Reference to the helper object driving the printout.  #     helper   - Reference to the helper object driving the printout.
Line 2365  sub get_page_breaks  { Line 2540  sub get_page_breaks  {
 #    EXTRASPACE         has the list of extra space values.  #    EXTRASPACE         has the list of extra space values.
 #    EXTRASPACE_UNITS   is the set of resources for which the units are  #    EXTRASPACE_UNITS   is the set of resources for which the units are
 #                       mm. All others are 'in'.  #                       mm. All others are 'in'.
 #      #
 #    The resource is found in the POSSIBLE_RESOURCES to get the index  #    The resource is found in the POSSIBLE_RESOURCES to get the index
 #    of the EXTRASPACE value.  #    of the EXTRASPACE value.
 #  #
Line 2386  sub load_skips { Line 2561  sub load_skips {
   
     my ($helper)  = @_;      my ($helper)  = @_;
   
     #  If this is the first time, unrap the resources and extra spaces:      # If this is the first time, unwrap the resources and extra spaces:
   
     if (!$skips_loaded) {      if (!$skips_loaded) {
  @extraspace = (split(/\|\|\|/, $helper->{'VARS'}->{'EXTRASPACE'}));   @extraspace = (split(/\|\|\|/, $helper->{'VARS'}->{'EXTRASPACE'}));
Line 2434  sub get_extra_vspaces { Line 2609  sub get_extra_vspaces {
 #  The resource chooser part of the helper needs more than just  #  The resource chooser part of the helper needs more than just
 #  the value of the extraspaces var to recover the value into a text  #  the value of the extraspaces var to recover the value into a text
 #  field option.  This sub produces the required format for the saved var:  #  field option.  This sub produces the required format for the saved var:
 #  specifically   #  specifically
 #    ||| separated fields of the form resourcename=value  #    ||| separated fields of the form resourcename=value
 #  #
 #  Parameters:  #  Parameters:
Line 2468  sub set_form_extraspace { Line 2643  sub set_form_extraspace {
     $env{'form.extraspace'}  = $result;      $env{'form.extraspace'}  = $result;
     $env{'form.extraspace_units'} = $helper->{'VARS'}->{'EXTRASPACE_UNITS'};      $env{'form.extraspace_units'} = $helper->{'VARS'}->{'EXTRASPACE_UNITS'};
     return $result;      return $result;
       
 }  }
   
 #  Output a sequence (recursively if neeed)  #  Output a sequence (recursively if neeed)
Line 2494  sub print_construction_sequence { Line 2669  sub print_construction_sequence {
     }      }
     my $errtext=&LONCAPA::map::mapread(&Apache::lonnet::filelocation('',$currentURL));      my $errtext=&LONCAPA::map::mapread(&Apache::lonnet::filelocation('',$currentURL));
   
     #       #
     #  These make this all support recursing for subsequences.      #  These make this all support recursing for subsequences.
     #      #
     my @order    = @LONCAPA::map::order;      my @order    = @LONCAPA::map::order;
     my @resources = @LONCAPA::map::resources;       my @resources = @LONCAPA::map::resources;
   
     for (my $member=0;$member<=$#order;$member++) {      for (my $member=0;$member<=$#order;$member++) {
  $resources[$order[$member]]=~/^([^:]*):([^:]*):/;   $resources[$order[$member]]=~/^([^:]*):([^:]*):/;
Line 2514  sub print_construction_sequence { Line 2689  sub print_construction_sequence {
  $texversion=&ssi_with_retries($urlp, $ssi_retry_count, %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')) &&
        ($urlp=~/$LONCAPA::assess_page_re/)) {         ($urlp=~/$LONCAPA::assess_page_re/)) {
  #  Don't permanently modify %$form...   #  Don't permanently modify %$form...
  my %answerform = %form;   my %answerform = %form;
Line 2526  sub print_construction_sequence { Line 2701  sub print_construction_sequence {
  $resources_printed .= $urlp.':';   $resources_printed .= $urlp.':';
  my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %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 {
     # If necessary, encapsulate answer in minipage:      # If necessary, encapsulate answer in minipage:
       
     $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
     my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'});      my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'});
     $title = &Apache::lonxml::latex_special_symbols($title);      $title = &Apache::lonxml::latex_special_symbols($title);
     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);      $body = &encapsulate_minipage($body,$answerform{'problem_split'});
     $texversion.=$body;      $texversion.=$body;
  }   }
     }      }
Line 2551  sub print_construction_sequence { Line 2726  sub print_construction_sequence {
     $result.=$texversion;      $result.=$texversion;
   
  } elsif ($urlp=~/\.(sequence|page)$/) {   } elsif ($urlp=~/\.(sequence|page)$/) {
    
     # header:      # header:
   
     $result.='\strut\newline\noindent Sequence/page '.$urlp.'\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent ';      $result.='\strut\newline\noindent Sequence/page '.$urlp.'\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent ';
   
     # IF sequence, recurse:      # IF sequence, recurse:
       
     if ($urlp =~ /\.sequence$/) {      if ($urlp =~ /\.sequence$/) {
  $result .= &print_construction_sequence($urlp,    $result .= &print_construction_sequence($urlp,
  $helper, %form,    $helper, %form,
  $LaTeXwidth);   $LaTeXwidth);
     }      }
  }   }
Line 2575  sub print_construction_sequence { Line 2750  sub print_construction_sequence {
     if ($member != $#order) {      if ($member != $#order) {
  $texversion .= '\\ \cleardoublepage';   $texversion .= '\\ \cleardoublepage';
     }      }
       
     $result .= $texversion;      $result .= $texversion;
  }   }
     }      }
     if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;}      if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin\{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;}
     return $result;      return $result;
 }  }
   
Line 2599  sub print_construction_sequence { Line 2774  sub print_construction_sequence {
 #   6        Print selected problems from a folder.  #   6        Print selected problems from a folder.
 #   7        Print print selected resources from some scope.  #   7        Print print selected resources from some scope.
 #   8        Print resources for selected students.  #   8        Print resources for selected students.
   #   9        Print for anonymous CODEs
 #  #
 #BZ 5209  #BZ 5209
 #   2        map_incomplete_problems_seq Print incomplete problems from the current  #   2        map_incomplete_problems_seq Print incomplete problems from the current
Line 2636  sub output_data { Line 2812  sub output_data {
         url += 'form=' + formname + '&';          url += 'form=' + formname + '&';
         if (only != null) {          if (only != null) {
             url += 'only=' + only + '&';              url += 'only=' + only + '&';
         }           }
         if (omit != null) {          if (omit != null) {
             url += 'omit=' + omit + '&';              url += 'omit=' + omit + '&';
         }          }
Line 2671  ENDPART Line 2847  ENDPART
   
     $env{'form.pagebreaks'}  = $helper->{'VARS'}->{'FINISHPAGE'};      $env{'form.pagebreaks'}  = $helper->{'VARS'}->{'FINISHPAGE'};
     &set_form_extraspace($helper);      &set_form_extraspace($helper);
     $env{'form.lastprinttype'} = $print_type;       $env{'form.lastprinttype'} = $print_type;
     &Apache::loncommon::store_course_settings('print',      &Apache::loncommon::store_course_settings('print',
       {'pagebreaks'    => 'scalar',        {'pagebreaks'    => 'scalar',
        'extraspace'    => 'scalar',         'extraspace'    => 'scalar',
Line 2688  ENDPART Line 2864  ENDPART
     $laystyle = &map_laystyle($laystyle);      $laystyle = &map_laystyle($laystyle);
     my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,$numberofcolumns);      my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,$numberofcolumns);
     my $assignment =  $env{'form.assignment'};      my $assignment =  $env{'form.assignment'};
     my $LaTeXwidth=&recalcto_mm($textwidth);       my $LaTeXwidth=&recalcto_mm($textwidth);
     my @print_array=();      my @print_array=();
     my @student_names=();      my @student_names=();
       my $lastprinted;
   
            #  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.
     #      #
Line 2704  ENDPART Line 2880  ENDPART
     $form{'pdfFormFields'} = $pdfFormFields;      $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
     # check box selecting this option to be presnt unless it's ok,      # check box selecting this option to be presnt unless it's ok,
     # and by lonresponse's priv. check.      # and by lonresponse's priv. check.
     # The if is here because lonresponse.pm only cares that      # The if is here because lonresponse.pm only cares that
     # showallfoils is defined, not what the value is.      # showallfoils is defined, not what the value is.
   
     if ($helper->{'VARS'}->{'showallfoils'} eq "1") {       if ($helper->{'VARS'}->{'showallfoils'} eq "1") {
  $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};   $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};
     }      }
       
     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'}});
Line 2736  ENDPART Line 2912  ENDPART
     $cleanURL=$currentURL;      $cleanURL=$currentURL;
  }   }
  $selectionmade = 1;   $selectionmade = 1;
         
  if ($cleanURL!~m|^/adm/|   if ($cleanURL!~m|^/adm/|
     && $cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) {      && $cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) {
     my $rndseed=time;      my $rndseed=time;
Line 2766  ENDPART Line 2942  ENDPART
  $texversion.=&ssi_with_retries($currentURL,$ssi_retry_count, %form);   $texversion.=&ssi_with_retries($currentURL,$ssi_retry_count, %form);
   
  #  Add annotations if required:   #  Add annotations if required:
       
  &Apache::lonxml::clear_problem_counter();   &Apache::lonxml::clear_problem_counter();
   
  &Apache::lonnet::delenv('request.filename');   &Apache::lonnet::delenv('request.filename');
Line 2789  ENDPART Line 2965  ENDPART
   
   
  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 {
     $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
     if ($helper->{'VARS'}->{'construction'} ne '1') {      if ($helper->{'VARS'}->{'construction'} ne '1') {
Line 2809  ENDPART Line 2985  ENDPART
   
   
   
       
     }      }
     # Print annotations.      # Print annotations.
   
   
     if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {      if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
  my $annotation .= &annotate($currentURL);   my $annotation .= &annotate($currentURL);
  $texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/;   $texversion =~ s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/;
     }      }
   
   
Line 2835  ENDPART Line 3011  ENDPART
  && $currentURL=~/\.(sequence|page)$/ && $helper->{'VARS'}->{'construction'} eq '1') {   && $currentURL=~/\.(sequence|page)$/ && $helper->{'VARS'}->{'construction'} eq '1') {
     $result .= &print_construction_sequence($currentURL, $helper, %form,      $result .= &print_construction_sequence($currentURL, $helper, %form,
     $LaTeXwidth);      $LaTeXwidth);
     $result .= '\end{document}';        $result .= '\end{document}';
     if (!($result =~ /\\begin\{document\}/)) {      if (!($result =~ /\\begin\{document\}/)) {
  $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') {
     my $annotation = &annotate($currentURL);      my $annotation = &annotate($currentURL);
     $texversion    =~ s/(\\end{document})/$annotation$1/;      $texversion    =~ s/(\\end\{document})/$annotation$1/;
  }   }
  $result .= $texversion;   $result .= $texversion;
  } elsif ($cleanURL =~/\.tex$/) {   } elsif ($cleanURL =~/\.tex$/) {
Line 2858  ENDPART Line 3035  ENDPART
     $result = &fetch_raw_resource($currentURL);      $result = &fetch_raw_resource($currentURL);
     if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {      if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
  my $annotation = &annotate($currentURL);   my $annotation = &annotate($currentURL);
  $result =~ s/(\\end{document})/$annotation$1/;   $result =~ s/(\\end\{document})/$annotation$1/;
     }      }
   
     $do_postprocessing = 0; # Don't massage the result.      $do_postprocessing = 0; # Don't massage the result.
Line 2875  ENDPART Line 3052  ENDPART
     $result           .=  &print_page_in_course($helper, $rparmhash,      $result           .=  &print_page_in_course($helper, $rparmhash,
  $cleanURL, \@page_resources);   $cleanURL, \@page_resources);
   
          
  } else {   } else {
     $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'},      $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'},
   $helper->{'VARS'}->{'symb'});    $helper->{'VARS'}->{'symb'});
Line 2889  ENDPART Line 3066  ENDPART
      ($print_type eq 'select_sequences')      or       ($print_type eq 'select_sequences')      or
      ($print_type eq 'map_incomplete_problems_seq')       ($print_type eq 'map_incomplete_problems_seq')
      ) {       ) {
    
         #-- produce an output string          #-- produce an output string
  if (($print_type eq 'map_problems')                or   if (($print_type eq 'map_problems')                or
     ($print_type eq 'map_incomplete_problems_seq') or      ($print_type eq 'map_incomplete_problems_seq') or
Line 2899  ENDPART Line 3076  ENDPART
  ($print_type eq 'map_resources_in_page'))   ($print_type eq 'map_resources_in_page'))
  {   {
     $selectionmade = 3;      $selectionmade = 3;
  } elsif (($print_type eq 'all_problems')    } elsif (($print_type eq 'all_problems')
  ) {   ) {
     $selectionmade = 4;      $selectionmade = 4;
  } elsif ($print_type eq 'all_resources') {  #BUGBUG   } elsif ($print_type eq 'all_resources') {  #BUGBUG
Line 2924  ENDPART Line 3101  ENDPART
   
  &Apache::lonxml::clear_problem_counter();   &Apache::lonxml::clear_problem_counter();
   
  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();      &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 2950  ENDPART Line 3125  ENDPART
     my $texversion='';      my $texversion='';
     if ($urlp!~m|^/adm/|      if ($urlp!~m|^/adm/|
  && $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)$/) {
                   my $extension = $1;
  $resources_printed .= $urlp.':';   $resources_printed .= $urlp.':';
  &Apache::lonxml::remember_problem_counter();   &Apache::lonxml::remember_problem_counter();
  if ($flag_latex_header_remove eq 'NO') {   if ($flag_latex_header_remove eq 'NO') {
Line 2958  ENDPART Line 3134  ENDPART
                             (($i==0) &&                              (($i==0) &&
                              (($urlp=~/\.page$/) ||                               (($urlp=~/\.page$/) ||
                               ($print_type eq 'map_problems_in_page') ||                                ($print_type eq 'map_problems_in_page') ||
                               ($print_type eq 'map_resources_in_page')))) {                                (($print_type eq 'map_resources_in_page') && ($extension !~ /^x?html?$/))))) {
                         $flag_latex_header_remove = 'YES';                          $flag_latex_header_remove = 'YES';
                     }                      }
  }   }
  $texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %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;}
     $texversion =~ s/\\end{document}\d*/\\end{document}/;      $texversion =~ s/\\end\{document}\d*/\\end{document}/;
     $flag_page_in_sequence = 'YES';      $flag_page_in_sequence = 'YES';
  }   }
   
Line 2981  ENDPART Line 3157  ENDPART
     &Apache::lonxml::restore_problem_counter();      &Apache::lonxml::restore_problem_counter();
     my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform);      my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform);
                     if ($urlp =~ /\.page$/) {                      if ($urlp =~ /\.page$/) {
                         $answer =~ s/\\end{document}(\d*)$//;                          $answer =~ s/\\end\{document}(\d*)$//;
                     }                      }
     if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {      if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
                         if ($urlp =~ /\.page$/) {                          if ($urlp =~ /\.page$/) {
                             my @probs = split(/\\keephidden{ENDOFPROBLEM}/,$texversion);                              my @probs = split(/\\keephidden\{ENDOFPROBLEM}/,$texversion);
                             my $lastprob = pop(@probs);                              my $lastprob = pop(@probs);
                             $texversion = join('\keephidden{ENDOFPROBLEM}',@probs).                              $texversion = join('\keephidden{ENDOFPROBLEM}',@probs).
                             $answer.'\keephidden{ENDOFPROBLEM}'.$lastprob;                              $answer.'\keephidden{ENDOFPROBLEM}'.$lastprob;
                         } else {                          } else {
                             $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;                              $texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/;
                         }                          }
     } else {      } else {
  if ($urlp=~/$LONCAPA::assess_page_re/) {   if ($urlp=~/$LONCAPA::assess_page_re/) {
     $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
 #    $texversion =~ s/\\begin{document}//; # FIXME  #    $texversion =~ s/\\begin\{document}//; # FIXME
     my $title = &Apache::lonnet::gettitle($master_seq[$i]);      my $title = &Apache::lonnet::gettitle($master_seq[$i]);
     $title = &Apache::lonxml::latex_special_symbols($title);      $title = &Apache::lonxml::latex_special_symbols($title);
     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);      $body    = &encapsulate_minipage($body,$answerform{'problem_split'});
     $texversion .= $body;      $texversion .= $body;
  } else {   } else {
     $texversion='';      $texversion='';
Line 3011  ENDPART Line 3187  ENDPART
  }   }
  if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {   if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
     my $annotation .= &annotate($urlp);      my $annotation .= &annotate($urlp);
     $texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/;      $texversion =~ s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/;
  }   }
   
  if ($flag_latex_header_remove ne 'NO') {   if ($flag_latex_header_remove ne 'NO') {
     $texversion = &latex_header_footer_remove($texversion);      $texversion = &latex_header_footer_remove($texversion);
  } else {   } else {
     $texversion =~ s/\\end{document}//;      $texversion =~ s/\\end\{document}//;
  }   }
  if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {   if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
     $texversion=&IndexCreation($texversion,$urlp);      $texversion=&IndexCreation($texversion,$urlp);
Line 3028  ENDPART Line 3204  ENDPART
     $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,
   $assignment,     $assignment,
   $courseidinfo,     $courseidinfo,
   $name);    $name);
     if ($numberofcolumns eq '1') {      if ($numberofcolumns eq '1') {
  $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{'.$header_text.'}} \vskip 5 mm ';   $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{'.$header_text.'}} \vskip 5 mm ';
Line 3038  ENDPART Line 3214  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') {
     my $annotation = &annotate($urlp);      my $annotation = &annotate($urlp);
     $texversion =~ s/(\\end{document)/$annotation$1/;      $texversion =~ s/(\\end\{document)/$annotation$1/;
  }   }
   
  if ($flag_latex_header_remove ne 'NO') {   if ($flag_latex_header_remove ne 'NO') {
     $texversion = &latex_header_footer_remove($texversion);      $texversion = &latex_header_footer_remove($texversion);
  } else {   } else {
     $texversion =~ s/\\end{document}/\\vskip 0\.5mm\\noindent\\makebox\[\\textwidth\/\$number_of_columns\]\[b\]\{\\hrulefill\}/;      $texversion =~ s/\\end\{document}/\\vskip 0\.5mm\\noindent\\makebox\[\\textwidth\/\$number_of_columns\]\[b\]\{\\hrulefill\}/;
  }   }
  $result .= $texversion;   $result .= $texversion;
  $flag_latex_header_remove = 'YES';    $flag_latex_header_remove = 'YES';
     } elsif ($urlp=~ /\.pdf$/i) {      } elsif ($urlp=~ /\.pdf$/i) {
  if ($i > 0) {   if ($i > 0) {
     $result .= '\cleardoublepage';      $result .= '\cleardoublepage';
Line 3083  ENDPART Line 3260  ENDPART
  if ($flag_latex_header_remove ne 'NO') {   if ($flag_latex_header_remove ne 'NO') {
     $texversion = &latex_header_footer_remove($texversion);      $texversion = &latex_header_footer_remove($texversion);
  } else {   } else {
     $texversion =~ s/\\end{document}//;      $texversion =~ s/\\end\{document}//;
  }   }
  $result .= $texversion;   $result .= $texversion;
  $flag_latex_header_remove = 'YES';      $flag_latex_header_remove = 'YES';
     }      }
     if (&Apache::loncommon::connection_aborted($r)) {       if (&Apache::loncommon::connection_aborted($r)) {
  last;    last;
     }      }
  }   }
  &Apache::lonxml::clear_problem_counter();   &Apache::lonxml::clear_problem_counter();
  if ($flag_page_in_sequence eq 'YES') {   if ($flag_page_in_sequence eq 'YES') {
     $result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/;      $result =~ s/\\usepackage\{calc}/\\usepackage{calc}\\usepackage{longtable}/;
  }   }
  $result .= '\end{document}';   $result .= '\end{document}';
      } elsif (($print_type eq 'problems_for_students')           ||       } elsif (($print_type eq 'problems_for_students')           ||
Line 3102  ENDPART Line 3279  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
  my $type;   my $type;
  if (($print_type eq 'problems_for_students')           ||   if (($print_type eq 'problems_for_students')           ||
      ($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 3124  ENDPART Line 3305  ENDPART
  #   to override this and output the students by name.   #   to override this and output the students by name.
  #    Each element of the students array is of the form:   #    Each element of the students array is of the form:
  #       username:domain:section:last, first:status   #       username:domain:section:last, first:status
  #       #
  #  Note that student sort is not compatible with printing    #  Note that student sort is not compatible with printing
  #  1 section per pdf...so that setting overrides.   #  1 section per pdf...so that setting overrides.
  #      #
  if (($helper->{'VARS'}->{'student_sort'}    eq 1)  &&    if (($helper->{'VARS'}->{'student_sort'}    eq 1)  &&
      ($helper->{'VARS'}->{'SPLIT_PDFS'} ne "sections")) {       ($helper->{'VARS'}->{'SPLIT_PDFS'} ne "sections")) {
      @students = sort compare_names  @students;       @students = sort compare_names  @students;
  } else {   } else {
      @students = sort compare_sections @students;        @students = sort compare_sections @students;
  }   }
  &adjust_number_to_print($helper);   &adjust_number_to_print($helper);
   
Line 3140  ENDPART Line 3321  ENDPART
      $helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq 'all' ) {       $helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq 'all' ) {
      $helper->{'VARS'}->{'NUMBER_TO_PRINT'}=$#students+1;       $helper->{'VARS'}->{'NUMBER_TO_PRINT'}=$#students+1;
  }   }
  # If we are splitting on section boundaries, we need    # If we are splitting on section boundaries, we need
  # to remember that in split_on_sections and    # to remember that in split_on_sections and
  # print all of the students in the list.   # print all of the students in the list.
  #   #
  my $split_on_sections = 0;   my $split_on_sections = 0;
Line 3153  ENDPART Line 3334  ENDPART
   
          my $map;           my $map;
          if ($helper->{VARS}->{'symb'}) {           if ($helper->{VARS}->{'symb'}) {
              ($map, my $id, my $resource) =               unless ((($print_type eq 'all_problems_students') ||
                  &Apache::lonnet::decode_symb($helper->{VARS}->{'symb'});                        ($print_type eq 'incomplete_problems_selpeople_course')) &&
                         $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 3175  ENDPART Line 3362  ENDPART
  my $student_counter=-1;   my $student_counter=-1;
  my $i = 0;   my $i = 0;
  my $last_section = (split(/:/,$students[0]))[2];   my $last_section = (split(/:/,$students[0]))[2];
            my $nohidemap;
            if ($perm{'pav'} && $perm{'vgr'}) {
                $nohidemap = 1;
            }
  foreach my $person (@students) {   foreach my $person (@students) {
              my $duefile="/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due";               my $duefile="/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due";
      if (-e $duefile) {       if (-e $duefile) {
Line 3192  ENDPART Line 3383  ENDPART
  $i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'});   $i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'});
      }       }
      my $actual_seq = master_seq_to_person_seq($map, \@master_seq,       my $actual_seq = master_seq_to_person_seq($map, \@master_seq,
                                                        $person, undef, 1);                                                         $person, undef, $nohidemap);
      my ($output,$fullname, $printed)=&print_resources($r,$helper,       my ($output,$fullname, $printed)=&print_resources($r,$helper,
      $person,$type,       $person,$type,
      \%moreenv,  $actual_seq,       \%moreenv,  $actual_seq,
Line 3204  ENDPART Line 3395  ENDPART
 #     &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,&mt('last student').' '.$fullname);  #     &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,&mt('last student').' '.$fullname);
      &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student');       &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student');
      $flag_latex_header_remove = 'YES';       $flag_latex_header_remove = 'YES';
                if ($printed) {
                    $lastprinted = $fullname;
                }
      if (&Apache::loncommon::connection_aborted($r)) { last; }       if (&Apache::loncommon::connection_aborted($r)) { last; }
  }   }
  &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);   &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
  $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')) {
            $selectionmade = 9;
  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 3219  ENDPART Line 3416  ENDPART
  my $single_code = $helper->{'VARS'}->{'SINGLE_CODE'};   my $single_code = $helper->{'VARS'}->{'SINGLE_CODE'};
  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'};
          my @lines = &Apache::grades::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) {
              chomp($line);               next if (($line =~ /^\#/) || ($line eq ''));
      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) {
  $code_length=$length;   $code_length=$length;
  if ($type eq 'number') { $code_type = 'number'; }   if ($type eq 'number') { $code_type = 'number'; }
                  chomp($bubbles_per_item);                    chomp($bubbles_per_item);
                  if (($bubbles_per_item ne '') && ($bubbles_per_item > 0)) {                   if (($bubbles_per_item ne '') && ($bubbles_per_item > 0)) {
                      $bubbles_per_row = $bubbles_per_item;                        $bubbles_per_row = $bubbles_per_item;
                  }                   }
      }       }
  }   }
          my ($randomorder,$randompick,$map);           my $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'});
              my $navmap = Apache::lonnavmaps::navmap->new();           } elsif (($helper->{'VARS'}->{'postdata'} eq '/adm/navmaps') && ($perm{'pfo'})) {
              if (defined($navmap)) {               $map = $helper->{'VARS'}->{'SEQUENCE'};
                  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'};
            $moreenv{'suppress_tries'} = $parmhash{'suppress_tries'};
          $moreenv{'instructor_comments'}='hide';           $moreenv{'instructor_comments'}='hide';
          $moreenv{'bubbles_per_row'} = $bubbles_per_row;           $moreenv{'bubbles_per_row'} = $bubbles_per_row;
  my $seed=time+($$<<16)+($$);   my $seed=time+($$<<16)+($$);
Line 3280  ENDPART Line 3472  ENDPART
  $moreenv{'CODE'}=&get_CODE(\%allcodes,$i,$seed,$code_length,   $moreenv{'CODE'}=&get_CODE(\%allcodes,$i,$seed,$code_length,
     $code_type);      $code_type);
      }       }
                $code_name =~ s/^\s+//;
                $code_name =~ s/\s+$//;
      if ($code_name) {       if ($code_name) {
  &Apache::lonnet::put('CODEs',   &Apache::lonnet::put('CODEs',
       {        {
Line 3298  ENDPART Line 3492  ENDPART
      || $number_per_page eq 'section') {       || $number_per_page eq 'section') {
      $number_per_page=$num_todo > 0 ? $num_todo : 1;       $number_per_page=$num_todo > 0 ? $num_todo : 1;
  }   }
  my $flag_latex_header_remove = 'NO';    my $flag_latex_header_remove = 'NO';
  my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$num_todo);   my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$num_todo);
  my $count=0;   my $count=0;
            my $nohidemap;
            if ($perm{'pav'} && $perm{'vgr'}) {
                $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);
      if ($code_type eq 'number') {        if ($code_type eq 'number') {
  $moreenv{'CODE'}=$code;   $moreenv{'CODE'}=$code;
      } else {       } else {
  $moreenv{'CODE'}=&num_to_letters($code);   $moreenv{'CODE'}=&num_to_letters($code);
      }       }
              my $actual_seq = \@master_seq;               $env{'form.CODE'} = $moreenv{'CODE'};
              if ($randomorder || $randompick) {               my $actual_seq = master_seq_to_person_seq($map, \@master_seq,
                  $env{'form.CODE'} = $moreenv{'CODE'};                                                         undef,
                  $actual_seq = master_seq_to_person_seq($map, \@master_seq,                                                         $moreenv{'CODE'}, $nohidemap);
                                                         undef,               delete($env{'form.CODE'});
                                                         $moreenv{'CODE'}, 1);  
                  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 3326  ENDPART Line 3521  ENDPART
        &mt('last assignment').' '.$fullname);         &mt('last assignment').' '.$fullname);
      $flag_latex_header_remove = 'YES';       $flag_latex_header_remove = 'YES';
      $count++;       $count++;
                if ($printed) {
                    $lastprinted = $fullname;
                }
      if (&Apache::loncommon::connection_aborted($r)) { last; }       if (&Apache::loncommon::connection_aborted($r)) { last; }
  }   }
  &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);   &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
  $result .= $print_array[0].'  \end{document}';   $result .= $print_array[0].'  \end{document}';
      } elsif ($print_type eq 'problems_from_directory') {             } elsif ($print_type eq 'problems_from_directory') {
     #prints selected problems from the subdirectory       #prints selected problems from the subdirectory
  $selectionmade = 6;   $selectionmade = 6;
         my @list_of_files=split /\|\|\|/, $helper->{'VARS'}->{'FILES'};          my @list_of_files=split /\|\|\|/, $helper->{'VARS'}->{'FILES'};
  @list_of_files=sort @list_of_files;   @list_of_files=sort @list_of_files;
  my $flag_latex_header_remove = 'NO';    my $flag_latex_header_remove = 'NO';
  my $rndseed=time;   my $rndseed=time;
  if ($helper->{'VARS'}->{'curseed'}) {   if ($helper->{'VARS'}->{'curseed'}) {
     $rndseed=$helper->{'VARS'}->{'curseed'};      $rndseed=$helper->{'VARS'}->{'curseed'};
Line 3363  ENDPART Line 3561  ENDPART
     $resources_printed .= $urlp.':';      $resources_printed .= $urlp.':';
     my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %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 {
  $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});   $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
  if ($helper->{'VARS'}->{'construction'} ne '1') {   if ($helper->{'VARS'}->{'construction'} ne '1') {
Line 3380  ENDPART Line 3578  ENDPART
                 #this chunk is responsible for printing the path to problem                  #this chunk is responsible for printing the path to problem
   
  my $newurlp=&path_to_problem($urlp,$LaTeXwidth);   my $newurlp=&path_to_problem($urlp,$LaTeXwidth);
  $texversion =~ s/(\\begin{minipage}{\\textwidth})/$1 $newurlp/;   $texversion =~ s/(\\begin\{minipage}\{\\textwidth})/$1 $newurlp/;
  if ($flag_latex_header_remove ne 'NO') {   if ($flag_latex_header_remove ne 'NO') {
     $texversion = &latex_header_footer_remove($texversion);      $texversion = &latex_header_footer_remove($texversion);
  } else {   } else {
     $texversion =~ s/\\end{document}//;      $texversion =~ s/\\end\{document}//;
  }   }
  if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {   if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
     $texversion=&IndexCreation($texversion,$urlp);      $texversion=&IndexCreation($texversion,$urlp);
  }   }
  if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') {   if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') {
     $texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$urlp| \\strut\\\\\\strut /;      $texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$urlp| \\strut\\\\\\strut /;
       
  }   }
  $result .= $texversion;   $result .= $texversion;
     }      }
     $flag_latex_header_remove = 'YES';        $flag_latex_header_remove = 'YES';
  }   }
  if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\typeout)/ RANDOM SEED IS $rndseed $1/;}   if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\typeout)/ RANDOM SEED IS $rndseed $1/;}
  $result .= '\end{document}';         $result .= '\end{document}';      
Line 3405  ENDPART Line 3603  ENDPART
     # Only post process if that has not been turned off e.g. by a raw latex resource.      # Only post process if that has not been turned off e.g. by a raw latex resource.
   
     if ($do_postprocessing) {      if ($do_postprocessing) {
           my $mostrecent;
           if ((($selectionmade == 5) || ($selectionmade == 8) || ($selectionmade == 9)) &&
               (($numberofcolumns == 1) || ($laystyle eq 'album' && $papersize eq 'a4'))) {
               $mostrecent = $lastprinted;
           }
  $result = &page_format_transformation($papersize,   $result = &page_format_transformation($papersize,
       $laystyle,$numberofcolumns,        $laystyle,$numberofcolumns,
       $print_type,$result,        $print_type,$result,
       $helper->{VARS}->{'assignment'},        $helper->{VARS}->{'assignment'},
       $helper->{'VARS'}->{'TABLE_CONTENTS'},        $helper->{'VARS'}->{'TABLE_CONTENTS'},
       $helper->{'VARS'}->{'TABLE_INDEX'},        $helper->{'VARS'}->{'TABLE_INDEX'},
       $selectionmade);        $selectionmade,$mostrecent);
  $result = &latex_corrections($number_of_columns,$result,$selectionmade,   $result = &latex_corrections($number_of_columns,$result,$selectionmade,
      $helper->{'VARS'}->{'ANSWER_TYPE'});       $helper->{'VARS'}->{'ANSWER_TYPE'});
  #if ($numberofcolumns == 1) {   #if ($numberofcolumns == 1) {
Line 3422  ENDPART Line 3625  ENDPART
  #}   #}
     }      }
   
     # Set URLback if this is a construction space print so we can provide      # Set URLback so we can provide a link back to the resource and to change options.
     # a link to the resource being edited.      # (Since the browser back button does not currently work with https,
     #      # the back link is useful even when there is an easy-to-miss LON-CAPA back button.)
   
     my $URLback=''; #link to original document      my $URLback=''; #link to original document
     if ($helper->{'VARS'}->{'construction'} eq '1') {      if ($helper->{'VARS'}->{'construction'} eq '1') {
  $URLback=$helper->{'VARS'}->{'filename'};   $URLback=$helper->{'VARS'}->{'filename'};
       } elsif ($helper->{VARS}{'symb'}) {
           my ($map, $id, $url) = &Apache::lonnet::decode_symb($helper->{VARS}{'symb'});
           my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'};
           my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'};
           my ($anchor,$usehttp,$plainurl);
           $url = &Apache::lonnet::clutter($url);
           $plainurl = $url;
           if (($ENV{'SERVER_PORT'} == 443) && ($env{'request.course.id'}) &&
               (($url =~ m{^\Q/public/$cdom/$cnum/syllabus\E($|\?)}) ||
                ($url =~ m{^\Q/adm/wrapper/ext/\E(?!https:)}))) {
               unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl())) {
                   $usehttp = 1;
               }
           }
           if ($env{'request.enc'}) {
               $url = &Apache::lonenc::encrypted($url);
           }
           if ($url ne '') {
               my $symb = $helper->{VARS}{'symb'};
               if ($url =~ m{^\Q/adm/wrapper/ext/\E}) {
                   my $link = $url;
                   ($link,$anchor) = ($url =~ /^([^\#]+)(?:|(\#[^\#]+))$/);
                   if ($anchor) {
                       ($symb) = ($helper->{VARS}{'symb'} =~ /^([^\#]+)/);
                   }
                   $url = $link;
               }
               $URLback = $url;
               if ($usehttp) {
                   $URLback .= (($URLback =~ /\?/) ? '&amp;':'?').'usehttp=1';
               }
               unless ($plainurl =~ /\.page$/) {
                   $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 3441  ENDPART Line 3682  ENDPART
     $result       = &collect_languages($result);      $result       = &collect_languages($result);
   
   
 #-- 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);
Line 3461  ENDPART Line 3702  ENDPART
       $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];
Line 3473  ENDPART Line 3714  ENDPART
   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];
        }         }
Line 3512  ENDPART Line 3753  ENDPART
  'cgi.'.$identifier.'.role' => $perm{'pav'},   'cgi.'.$identifier.'.role' => $perm{'pav'},
  'cgi.'.$identifier.'.numberoffiles' => $#print_array,   'cgi.'.$identifier.'.numberoffiles' => $#print_array,
  'cgi.'.$identifier.'.studentnames' => $student_names,   'cgi.'.$identifier.'.studentnames' => $student_names,
  'cgi.'.$identifier.'.backref' => $URLback,});   'cgi.'.$identifier.'.backref' => &escape($URLback),});
     &Apache::lonnet::appenv({"cgi.$identifier.user"    => $env{'user.name'},      &Apache::lonnet::appenv({"cgi.$identifier.user"    => $env{'user.name'},
  "cgi.$identifier.domain"  => $env{'user.domain'},   "cgi.$identifier.domain"  => $env{'user.domain'},
  "cgi.$identifier.courseid" => $cnum,    "cgi.$identifier.courseid" => $cnum,
  "cgi.$identifier.coursedom" => $cdom,    "cgi.$identifier.coursedom" => $cdom,
  "cgi.$identifier.resources" => $resources_printed});   "cgi.$identifier.resources" => $resources_printed});
   
     my $end_page = &Apache::loncommon::end_page();      my $end_page = &Apache::loncommon::end_page();
Line 3563  sub get_CODE { Line 3804  sub get_CODE {
 sub print_resources {  sub print_resources {
     my ($r,$helper,$person,$type,$moreenv,$master_seq,$remove_latex_header,      my ($r,$helper,$person,$type,$moreenv,$master_seq,$remove_latex_header,
  $LaTeXwidth)=@_;   $LaTeXwidth)=@_;
     my $current_output = '';       my $current_output = '';
     my $printed = '';      my $printed = '';
     my ($username,$userdomain,$usersection) = split /:/,$person;      my ($username,$userdomain,$usersection) = split /:/,$person;
     my $fullname = &get_name($username,$userdomain);      my $fullname = &get_name($username,$userdomain);
Line 3590  sub print_resources { Line 3831  sub print_resources {
   
     my $i           = 0;      my $i           = 0;
     my $actually_printed = 0; # Count of resources printed.      my $actually_printed = 0; # Count of resources printed.
     #goes through all resources, checks if they are available for       #goes through all resources, checks if they are available for
     #current student, and produces output         #current student, and produces output
   
     &Apache::lonxml::clear_problem_counter();      &Apache::lonxml::clear_problem_counter();
     my %page_breaks  = &get_page_breaks($helper);      my %page_breaks  = &get_page_breaks($helper);
     my $columns_in_format = (split(/\|/,$helper->{'VARS'}->{'FORMAT'}))[1];      my $columns_in_format = (split(/\|/,$helper->{'VARS'}->{'FORMAT'}))[1];
     #      #
     #   end each student with a       #   end each student with a
     #   Special that allows the post processor to even out the page      #   Special that allows the post processor to even out the page
     #   counts later.  Nasty problem this... it would be really      #   counts later.  Nasty problem this... it would be really
     #   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 prntout.pl to strip  ENDOFSTUDENTSTAMP from the      #   so we will just rely on printout.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 3611  sub print_resources { Line 3852  sub print_resources {
     my $current_assignment = "";      my $current_assignment = "";
     my $assignment;      my $assignment;
     my $courseidinfo = &get_course();      my $courseidinfo = &get_course();
       my $possprint = scalar(@{$master_seq});
   
     foreach my $curresline (@{$master_seq})  {      foreach my $curresline (@{$master_seq})  {
  if (defined $page_breaks{$curresline}) {   if (defined $page_breaks{$curresline}) {
Line 3624  sub print_resources { Line 3866  sub print_resources {
   
  # See if we need to emit a new header:   # See if we need to emit a new header:
   
  if ( !($type eq 'problems' &&    if ( !($type eq 'problems' &&
        ($curresline!~ m/$LONCAPA::assess_page_re/)) ) {         ($curresline!~ m/$LONCAPA::assess_page_re/)) ) {
     if ($print_incomplete && !&incomplete($username, $userdomain, $res_url)) {      if ($print_incomplete && !&incomplete($username, $userdomain, $usersection, $res_url)) {
  next;   next;
     }      }
     $actually_printed++; # we're going to print one.      $actually_printed++; # we're going to print one.
   
     if (&Apache::lonnet::allowed('bre',$res_url)) {      if (&Apache::lonnet::allowed('bre',$res_url)) {
  if ($res_url!~m|^ext/|   if ($res_url!~m|^ext/|
     && $res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {      && $res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
     $printed .= $curresline.':';      $printed .= $curresline.':';
     &Apache::lonxml::remember_problem_counter();          &Apache::lonxml::remember_problem_counter();
   
     my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$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 ($res_url =~ /\.page$/) {                      if ($res_url =~ /\.page$/) {
Line 3643  sub print_resources { Line 3886  sub print_resources {
                                 $rendered = &print_latex_header().$rendered;                                  $rendered = &print_latex_header().$rendered;
                             }                              }
                         }                          }
 ;  
                         if ($remove_latex_header eq 'YES') {                          if ($remove_latex_header eq 'YES') {
                             $rendered = &latex_header_footer_remove($rendered);                              $rendered = &latex_header_footer_remove($rendered);
                         } else {                          } else {
                             $rendered =~ s/\\end{document}\d*//;                              $rendered =~ s/\\end\{document}\d*//;
                         }                          }
                     }                      }
     if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||      if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
Line 3658  sub print_resources { Line 3900  sub print_resources {
   
   
  $answerenv{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $answerenv{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
   
  &Apache::lonxml::restore_problem_counter();   &Apache::lonxml::restore_problem_counter();
   
  my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$env{'request.course.id'},%answerenv);   my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$env{'request.course.id'},%answerenv);
   
  if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {   if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
     $rendered=~s/(\\keephidden{ENDOFPROBLEM})/$ansrendered$1/;      $rendered=~s/(\\keephidden\{ENDOFPROBLEM})/$ansrendered$1/;
  } else {   } else {
   
       
     my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
                             unless ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') {                              unless ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') {
                                 $header =~ s/\\begin{document}//;     #<<<<<                                  $header =~ s/\\begin\{document}//;     #<<<<<
                             }                              }
     my $title = &Apache::lonnet::gettitle($curresline);      my $title = &Apache::lonnet::gettitle($curresline);
     $title = &Apache::lonxml::latex_special_symbols($title);      $title = &Apache::lonxml::latex_special_symbols($title);
     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);      $body     = &encapsulate_minipage($body,$answerenv{'problem_split'});
     $rendered = $header.$body;      $rendered = $header.$body;
  }   }
     }      }
     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);
  $rendered =~  s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/;   $rendered =~  s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/;
     }      }
     my $junk;      my $junk;
     if ($remove_latex_header eq 'YES') {      if ($remove_latex_header eq 'YES') {
  $rendered = &latex_header_footer_remove($rendered);   $rendered = &latex_header_footer_remove($rendered);
     } else {      } else {
  $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 3702  sub print_resources { Line 3942  sub print_resources {
     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);
  $annotation    =~ s/(\\end{document})/$annotation$1/;   $annotation    =~ s/(\\end\{document})/$annotation$1/;
     }      }
     if ($remove_latex_header eq 'YES') {      if ($remove_latex_header eq 'YES') {
  $rendered = &latex_header_footer_remove($rendered);   $rendered = &latex_header_footer_remove($rendered);
     } else {      } else {
  $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 3722  sub print_resources { Line 3962  sub print_resources {
     if ($remove_latex_header ne 'NO') {      if ($remove_latex_header ne 'NO') {
  $rendered = &latex_header_footer_remove($rendered);   $rendered = &latex_header_footer_remove($rendered);
     } else {      } else {
  $rendered =~ s/\\end{document}//;   $rendered =~ s/\\end\{document}//;
     }      }
     $current_output .= $rendered;      $current_output .= $rendered;
  }   }
Line 3733  sub print_resources { Line 3973  sub print_resources {
     &Apache::lonnet::gettitle($map), 'header');      &Apache::lonnet::gettitle($map), 'header');
  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, $usersection);    $fullname, $usersection);
     my $header_start = ($columns_in_format == 1) ? '\lhead'      my $header_start = ($columns_in_format == 1) ? '\lhead'
  : '\fancyhead[LO]';   : '\fancyhead[LO]';
Line 3751  sub print_resources { Line 3991  sub print_resources {
     #      #
   
     if ($actually_printed == 0) {      if ($actually_printed == 0) {
  $current_output  = &encapsulate_minipage("\\vskip -10mm \nNo incomplete resources\n \\vskip 100 mm { }\n");          my $message = &mt('No resources to print');
           if (!$possprint) {
               if ($perm{'pav'} || $perm{'pfo'}) {
                   $message = &mt('There are no unhidden resources to print.')."\n\n".
                              &mt('The most likely reason is one of the following: ')."\n".
                              '\begin{itemize}'."\n".
                              '\item '.&mt("The 'Resource hidden from students' parameter is set for the folder being printed.")."\n".
                              '\item '.&mt("'Hidden' is checked in the Course Editor individually for each resource in the folder being printed.")."\n".
                              '\end{itemize}'."\n\n".
                              &mt("Note: to print a bubblesheet exam which you want to hide from students, ".
                                  "use the Course Editor to check the 'Hidden' checkbox for the exam folder itself.")."\n";
               }
           } elsif ($print_incomplete) {
               $message = &mt('No incomplete resources');
           }
           if ($message) {
       $current_output  = &encapsulate_minipage("\\vskip -10mm \n$message\n \\vskip 100 mm { }\n",$moreenv->{'problem_split'});
           }
  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;
  } else {   } else {
Line 3762  sub print_resources { Line 4019  sub print_resources {
     if ($syllabus_first) {      if ($syllabus_first) {
         $current_output =~ s/\\\\ Last updated:/Last updated:/          $current_output =~ s/\\\\ Last updated:/Last updated:/
     }      }
     if (0) {      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, $usersection);
  $currentassignment, $courseidinfo, $fullname, $usersection);      my $header_start = ($columns_in_format == 1) ? '\lhead' : '\fancyhead[LO]';
  my $header_start = ($columns_in_format == 1) ? '\lhead'      my $newheader = $header_start.'{'.$header_line.'}';
     : '\fancyhead[LO]';  
  $header_line = $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$header_line$namepostfix}\\vskip 5 mm /;   $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$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'};
   
 # $current_output = '\strut\vspace*{-6 mm}\\newline'.  
 #    &copyright_line().' \newpage '.$blankpages.$end_of_student.  
 #    '\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent'.  
 #    $header_line.$namepostfix. '} \vskip 5 mm '.$current_output;  
  $current_output = '\strut\vspace*{-6 mm}\\newline'.   $current_output = '\strut\vspace*{-6 mm}\\newline'.
     &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'.
     .$namepostfix. '} \vskip 5 mm '.$current_output;      $newheader.$namepostfix. '} \vskip 5 mm '.$current_output;
   
     }      }
     #      #
Line 3820  sub handler { Line 4069  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 ($blocked,$blocktext) =           my $clientip = &Apache::lonnet::get_requestor_ip($r);
             &Apache::loncommon::blocking_status('printout',$cnum,$cdom);          my ($blocked,$blocktext) =
               &Apache::loncommon::blocking_status('printout',$clientip,$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 '') {
                 $checkrole .= "/$env{'request.course.sec'}";                  $checkrole .= "/$env{'request.course.sec'}";
             }              }
             unless ((&Apache::lonnet::allowed('evb',undef,undef,$checkrole)) &&               unless ((&Apache::lonnet::allowed('evb',undef,undef,$checkrole)) &&
                     ($env{'request.role'} !~ m{^st\./$cdom/$cnum})) {                      ($env{'request.role'} !~ m{^st\./$cdom/$cnum})) {
                 &printing_blocked($r,$blocktext);                  &printing_blocked($r,$blocktext);
                 return OK;                  return OK;
             }              }
         }          }
     }      }
       
     &init_perm();      &init_perm();
     my $helper = printHelper($r);      my $helper = printHelper($r);
     if (!ref($helper)) {      if (!ref($helper)) {
  return $helper;   return $helper;
     }      }
      
   
     %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'});  
    
   
   
       %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'});
   
     #  If a figure conversion queue file exists for this user.domain      #  If a figure conversion queue file exists for this user.domain
     # we delete it since it can only be bad (if it were good, printout.pl      # we delete it since it can only be bad (if it were good, printout.pl
Line 3855  sub handler { Line 4102  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 3901  sub get_randomly_ordered_warning { Line 4147  sub get_randomly_ordered_warning {
     if (defined($navmap)) {      if (defined($navmap)) {
         my $res = $navmap->getResourceByUrl($map);          my $res = $navmap->getResourceByUrl($map);
         if ($res) {          if ($res) {
     my $func =       my $func =
         sub { return ($_[0]->is_map() && $_[0]->randomorder); };          sub { return ($_[0]->is_map() && $_[0]->randomorder); };
     my @matches = $navmap->retrieveResources($res, $func,1,1,1);      my @matches = $navmap->retrieveResources($res, $func,1,1,1);
   
         }          }
     } else {      } else {
         $message = "Retrieval of information about ordering of resources failed.";           $message = "Retrieval of information about ordering of resources failed.";
         return '<message type="warning">'.$message.'</message>';          return '<message type="warning">'.$message.'</message>';
     }      }
     return;      return;
Line 3940  sub printHelper { Line 4186  sub printHelper {
     # write it by hand      # write it by hand
   
     Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});      Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});
       
     my $helper = Apache::lonhelper::helper->new("Printing Helper");      my $helper = Apache::lonhelper::helper->new("Printing Helper");
     $helper->declareVar('symb');      $helper->declareVar('symb');
     $helper->declareVar('postdata');          $helper->declareVar('postdata');
     $helper->declareVar('curseed');       $helper->declareVar('curseed');
     $helper->declareVar('probstatus');         $helper->declareVar('probstatus');
     $helper->declareVar('filename');      $helper->declareVar('filename');
     $helper->declareVar('construction');      $helper->declareVar('construction');
     $helper->declareVar('assignment');      $helper->declareVar('assignment');
Line 3957  sub printHelper { Line 4203  sub printHelper {
     $helper->declareVar("STUDENTS");      $helper->declareVar("STUDENTS");
     $helper->declareVar("EXTRASPACE");      $helper->declareVar("EXTRASPACE");
   
      
   
   
     #  The page breaks and extra spaces      #  The page breaks and extra spaces
Line 3965  sub printHelper { Line 4211  sub printHelper {
     # 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.
     #      #
   
       
     &Apache::loncommon::restore_course_settings('print',      &Apache::loncommon::restore_course_settings('print',
  {'pagebreaks'  => 'scalar',   {'pagebreaks'  => 'scalar',
  'extraspace'  => 'scalar',   'extraspace'  => 'scalar',
  'extraspace_units' => 'scalar',   'extraspace_units' => 'scalar',
          'lastprinttype' => 'scalar'});           'lastprinttype' => 'scalar'});
       
     # This will persistently load in the data we want from the      # This will persistently load in the data we want from the
     # very first screen.      # very first screen.
       
     if($helper->{VARS}->{PRINT_TYPE} eq $env{'form.lastprinttype'}) {      if($helper->{VARS}->{PRINT_TYPE} eq $env{'form.lastprinttype'}) {
  if (!defined ($env{"form.CURRENT_STATE"})) {   if (!defined ($env{"form.CURRENT_STATE"})) {
       
     $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'};      $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'};
     $helper->{VARS}->{EXTRASPACE} = $env{'form.extraspace'};      $helper->{VARS}->{EXTRASPACE} = $env{'form.extraspace'};
     $helper->{VARS}->{EXTRASPACE_UNITS} = $env{'form.extraspace_units'};      $helper->{VARS}->{EXTRASPACE_UNITS} = $env{'form.extraspace_units'};
Line 3990  sub printHelper { Line 4236  sub printHelper {
   
     }      }
  }   }
   
     }      }
   
     # Detect whether we're coming from construction space      # Detect whether we're coming from construction space
Line 3999  sub printHelper { Line 4244  sub printHelper {
         $helper->{VARS}->{'construction'} = 1;          $helper->{VARS}->{'construction'} = 1;
     } else {      } else {
         if ($env{'form.postdata'}) {          if ($env{'form.postdata'}) {
             $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($env{'form.postdata'});              unless ($env{'form.postdata'} eq '/adm/navmaps') {
                   $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 4008  sub printHelper { Line 4255  sub printHelper {
             $helper->{VARS}->{'symb'} = $env{'form.symb'};              $helper->{VARS}->{'symb'} = $env{'form.symb'};
         }          }
         if ($env{'form.url'}) {          if ($env{'form.url'}) {
             $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});              unless ($env{'form.url'} eq '/adm/navmaps') {
                   $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});
               }
         }          }
   
     }      }
   
     if ($env{'form.symb'}) {      if ($helper->{VARS}->{'symb'} ne '') {
         $helper->{VARS}->{'symb'} = $env{'form.symb'};          $helper->{VARS}->{'symb'}=
     }      &Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'});
     if ($env{'form.url'}) {      }
         $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});      my ($resourceTitle,$sequenceTitle,$mapTitle,$cdom,$cnum);
       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);
     }      }
     $helper->{VARS}->{'symb'}=  
  &Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'});  
     my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper);  
     if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;}      if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;}
   
       
     # Extract map      # Extract map
     my $symb = $helper->{VARS}->{'symb'};      my $symb = $helper->{VARS}->{'symb'};
     my ($map, $id, $url);      my ($map, $id, $url);
     my $subdir;      my $subdir;
     my $is_published=0; # True when printing from resource space.      my $is_published=0; # True when printing from resource space.
     my $res_printable = 1; # By default the current resource is printable.          my $res_printable = 1; # By default the current resource is printable.
       my $res_error;
     my $userCanPrint = ($perm{'pav'} || $perm{'pfo'});      my $userCanPrint = ($perm{'pav'} || $perm{'pfo'});
     my $res_printstartdate;      my $res_printstartdate;
     my $res_printenddate;      my $res_printenddate;
Line 4042  sub printHelper { Line 4310  sub printHelper {
   
     # Get the resource name from construction space      # Get the resource name from construction space
     if ($helper->{VARS}->{'construction'}) {      if ($helper->{VARS}->{'construction'}) {
         $resourceTitle = substr($helper->{VARS}->{'filename'},           $resourceTitle = substr($helper->{VARS}->{'filename'},
                                 rindex($helper->{VARS}->{'filename'}, '/')+1);                                  rindex($helper->{VARS}->{'filename'}, '/')+1);
         $subdir = substr($helper->{VARS}->{'filename'},          $subdir = substr($helper->{VARS}->{'filename'},
                          0, rindex($helper->{VARS}->{'filename'}, '/') + 1);                           0, rindex($helper->{VARS}->{'filename'}, '/') + 1);
Line 4051  sub printHelper { Line 4319  sub printHelper {
   
  if ($symb ne '') {   if ($symb ne '') {
     ($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));
     my $navmap = Apache::lonnavmaps::navmap->new();          } elsif (($helper->{VARS}->{'postdata'} eq '/adm/navmaps') &&
     my $res   = $navmap->getBySymb($symb);                  ($env{'request.course.id'} ne '')) {
     $res_printable  = $res->resprintable() | $userCanPrint; #printability in course context              if ($env{'course.'.$env{'request.course.id'}.'.url'} eq
     ($res_printstartdate, $res_printenddate) = &get_print_dates($res);                  "uploaded/$cdom/$cnum/default.sequence") {
     ($course_open, $course_close) = &course_print_dates($res);                  $map = $env{'course.'.$env{'request.course.id'}.'.url'};
     ($map_open, $map_close)       = &map_print_dates($res);                  $url = $helper->{VARS}->{'postdata'};
               }
           }
           if (($symb ne '') || ($map ne '')) {
               if (!$userCanPrint) {
           my $navmap = Apache::lonnavmaps::navmap->new();
                   if (ref($navmap)) {
                       my $res;
                       if ($symb ne '') {
                   $res = $navmap->getBySymb($symb);
                       } elsif ($map ne '') {
                           $res = $navmap->getResourceByUrl($map);
                       }
                       if (ref($res)) {
                   $res_printable = $res->resprintable(); #printability in course context
                   ($res_printstartdate, $res_printenddate) = &get_print_dates($res);
                   ($course_open, $course_close) = &course_print_dates($res);
                   ($map_open, $map_close) = &map_print_dates($res);
                       } else {
                           $res_error = 1;
                       }
                   } else {
                       $res_error = 1;
                   }
               }
  } else {   } else {
     # Resource space.      # Resource space.
   
Line 4071  sub printHelper { Line 4362  sub printHelper {
             my $postdata = $helper->{VARS}->{'postdata'};              my $postdata = $helper->{VARS}->{'postdata'};
             $resourceTitle = substr($postdata, rindex($postdata, '/') + 1);              $resourceTitle = substr($postdata, rindex($postdata, '/') + 1);
         }          }
         $subdir = &Apache::lonnet::filelocation("", $url);          if (($url eq '/adm/navmaps') && ($map eq $env{'course.'.$env{'request.course.id'}.'.url'})) {
               $res_printable=0;
           } else {
               $subdir = &Apache::lonnet::filelocation("", $url);
           }
   
   
     }      }
Line 4108  sub printHelper { Line 4403  sub printHelper {
     # Give that as a choice.      # Give that as a choice.
   
     if ($resourceTitle && $res_printable) {      if ($resourceTitle && $res_printable) {
         push @{$printChoices}, ["<b><i>$resourceTitle</i></b> (".&mt('the resource you just saw on the screen').")", 'current_document', 'PAGESIZE'];          push(@{$printChoices}, ["<b><i>$resourceTitle</i></b> (".&mt('the resource you just saw on the screen').")", 'current_document', 'PAGESIZE']);
     }       }
   
     # Useful filter strings      # Useful filter strings
   
Line 4134  sub printHelper { Line 4429  sub printHelper {
   
     my $start_new_option;      my $start_new_option;
     if ($perm{'pav'}) {      if ($perm{'pav'}) {
  $start_new_option =    $start_new_option =
     "<option text='".&mt('Start new page[_1]before selected','<br />').      "<option text='".&mt('Start new page[_1]before selected','<br />').
     "' variable='FINISHPAGE' />".      "' variable='FINISHPAGE' />".
     "<option text='".&mt('Extra space[_1]before selected','<br />').      "<option text='".&mt('Extra space[_1]before selected','<br />').
Line 4144  sub printHelper { Line 4439  sub printHelper {
     "<option text='".&mt('Space units[_1]check for mm','<br />').      "<option text='".&mt('Space units[_1]check for mm','<br />').
     "' variable='EXTRASPACE_UNITS' type='checkbox' />"      "' variable='EXTRASPACE_UNITS' type='checkbox' />"
     ;      ;
       
   
     }      }
   
     # If not construction space user can print the components of a page:      # If not construction space user can print the components of a page:
Line 4164  sub printHelper { Line 4457  sub printHelper {
  my $resourcesymb   = $page_resources[0]->symb();   my $resourcesymb   = $page_resources[0]->symb();
  my ($pagemap, $pageid, $pageurl) = &Apache::lonnet::decode_symb($symb);   my ($pagemap, $pageid, $pageurl) = &Apache::lonnet::decode_symb($symb);
  if ($page_ispage) {   if ($page_ispage) {
     push @{$printChoices},       push(@{$printChoices},
     [&mt('Selected [_1]Problems[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'),       [&mt('Selected [_1]Problems[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'),
      'map_problems_in_page',        'map_problems_in_page',
      'CHOOSE_PROBLEMS_PAGE'];       'CHOOSE_PROBLEMS_PAGE']);
     push @{$printChoices},       push(@{$printChoices},
     [&mt('Selected [_1]Resources[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'),       [&mt('Selected [_1]Resources[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'),
      'map_resources_in_page',        'map_resources_in_page',
      'CHOOSE_RESOURCES_PAGE'];       'CHOOSE_RESOURCES_PAGE']);
  }   }
         my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS_PAGE',          my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS_PAGE',
  'Select Problem(s) to print',   'Select Problem(s) to print',
  "multichoice='1' toponly='1' addstatus='1' closeallpages='1'",   "multichoice='1' toponly='1' addstatus='1' closeallpages='1' modallink='1'",
  'RESOURCES',   'RESOURCES',
  'PAGESIZE',   'PAGESIZE',
  $url,   $url,
Line 4185  sub printHelper { Line 4478  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"',      'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"',
     'RESOURCES',      'RESOURCES',
     'PAGESIZE',      'PAGESIZE',
     $url,      $url,
     $isNotMap, '', $symbFilter,      $isNotMap, '', $symbFilter,
     $start_new_option);      $start_new_option);
   
       
   
   
   
Line 4210  sub printHelper { Line 4503  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);    &create_incomplete_folder_selstud_helper($helper, $map, $nocurrloc);
     &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); # Create needed states for student.   my $helperStates = &create_incomplete_folder_helper($helper, $map, $nocurrloc); # 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 4231  sub printHelper { Line 4529  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},
  [&mt('Selected  [_1]Incomplete Problems[_2] from folder [_3]' . $textSuffix,   [$optionText,
       '<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)) {
     push @{$printChoices},               if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') {
     [&mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'),                   $optionText = &mt('Selected [_1]Problems[_2] [_3]not in a folder[_4]','<b>','</b>','<i>','</i>');
      'map_problems',               } else {
      'CHOOSE_PROBLEMS'];                  $optionText = &mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>');
               }
       push(@{$printChoices},
       [$optionText,
        'map_problems',
        'CHOOSE_PROBLEMS']);
     # Allow all resources from sequence      # Allow all resources from sequence
     push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'),               if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') {
     'map_problems_pages',                   $optionText = &mt('Selected [_1]Resources[_2] [_3]not in a folder[_4]','<b>','</b>','<i>','</i>');
     'CHOOSE_PROBLEMS_HTML'];              } else {
                   $optionText = &mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>');
               }
       push(@{$printChoices}, [$optionText,
       'map_problems_pages',
       '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"',      'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"',
     'RESOURCES',      'RESOURCES',
     'PAGESIZE',      'PAGESIZE',
     $map,      $map,
Line 4259  sub printHelper { Line 4572  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"',    'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'" suppressNavmap="1"',
   'RESOURCES',    'RESOURCES',
   'PAGESIZE',    'PAGESIZE',
   $map,    $map,
   $isNotMap, '',    $isNotMap, '',
   $symbFilter,    $symbFilter,
   $start_new_option);    $start_new_option);
       
     &Apache::lonxml::xmlparse($r, 'helper', $helperFragment);      &Apache::lonxml::xmlparse($r, 'helper', $helperFragment);
  } else {   } else {
     # TODO: Figure out how to tell them the folder is not printable.      # TODO: Figure out how to tell them the folder is not printable.
  }   }
     }      }
  # If the user has pfo (print for others) allow them to print all    # If the user has pfo (print for others) allow them to print all
  # problems and resources  in the entire course, optionally for selected students   # problems and resources  in the entire course, optionally for selected students
  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},
      [&mtn('Selected <b>Incomplete Problems</b> from <b>entire course</b> for selected people'),       [&mt('Selected [_1]Incomplete Problems[_2] from [_3]entire course[_4] for [_5]selected people[_6]',
                 '<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 4290  sub printHelper { Line 4604  sub printHelper {
   
  #  Selected problems/resources from entire course:   #  Selected problems/resources from entire course:
   
         push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b>'), 'all_problems', 'ALL_PROBLEMS'];          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>Resources</b> from <b>entire course</b>'), 'all_resources', 'ALL_RESOURCES'];   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>Problems</b> from <b>entire course</b> for <b>selected people</b>'), 'all_problems_students', 'ALL_PROBLEMS_STUDENTS'];   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']);
 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 4304  my $suffixXml = <<ALL_PROBLEMS; Line 4618  my $suffixXml = <<ALL_PROBLEMS;
       <student multichoice='1' variable="STUDENTS" nextstate="PRINT_FORMATTING" coursepersonnel="1"/>        <student multichoice='1' variable="STUDENTS" nextstate="PRINT_FORMATTING" coursepersonnel="1"/>
   </state>    </state>
 ALL_PROBLEMS  ALL_PROBLEMS
          &Apache::lonxml::xmlparse($r, 'helper',            &Apache::lonxml::xmlparse($r, 'helper',
    &generate_resource_chooser('ALL_PROBLEMS',     &generate_resource_chooser('ALL_PROBLEMS',
       'Select Problem(s) to print',        'Select Problem(s) to print',
       'multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1"',        'multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1" modallink="1"',
       'RESOURCES',        'RESOURCES',
       'PAGESIZE',        'PAGESIZE',
       '',        '',
Line 4316  ALL_PROBLEMS Line 4630  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'",        'toponly="0" multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"',
       'RESOURCES',        'RESOURCES',
       'PAGESIZE',        'PAGESIZE',
       '',        '',
Line 4324  ALL_PROBLEMS Line 4638  ALL_PROBLEMS
       $start_new_option) .        $start_new_option) .
    &generate_resource_chooser('ALL_PROBLEMS_STUDENTS',     &generate_resource_chooser('ALL_PROBLEMS_STUDENTS',
       'Select Problem(s) to print',        'Select Problem(s) to print',
       'toponly="0" multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1"',        'toponly="0" multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1" modallink="1"',
       'RESOURCES',        'RESOURCES',
       'STUDENTS1',        'STUDENTS1',
       '',        '',
Line 4339  ALL_PROBLEMS Line 4653  ALL_PROBLEMS
     # either for selected students or for coded assignments.      # either for selected students or for coded assignments.
   
     if ($page_ispage) {      if ($page_ispage) {
  push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from page [_3] for [_4]selected people[_5]',   push(@{$printChoices}, [&mt('Selected [_1]Problems[_2] from page [_3] for [_4]selected people[_5]',
     '<b>', '</b>', '<b><i>'.$page_title.'</i></b>', '<b>', '</b>'),      '<b>', '</b>', '<b><i>'.$page_title.'</i></b>', '<b>', '</b>'),
  'problems_for_students_from_page', 'CHOOSE_TGT_STUDENTS_PAGE'];   'problems_for_students_from_page', 'CHOOSE_TGT_STUDENTS_PAGE']);
  push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from page [_3] for [_4]CODEd assignments[_5]',   push(@{$printChoices}, [&mt('Selected [_1]Problems[_2] from page [_3] for [_4]CODEd assignments[_5]',
     '<b>', '</b>', '<b><i>'.$page_title.'</i></b>', '<b>', '</b>'),      '<b>', '</b>', '<b><i>'.$page_title.'</i></b>', '<b>', '</b>'),
  'problems_for_anon_page', 'CHOOSE_ANON1_PAGE'];   'problems_for_anon_page', 'CHOOSE_ANON1_PAGE']);
     }      }
     push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]selected people[_5]',      push(@{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]selected people[_5]',
  '<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'),    '<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'),
     'problems_for_students', 'CHOOSE_STUDENTS'];      'problems_for_students', 'CHOOSE_STUDENTS']);
     push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]CODEd assignments[_5]',      push(@{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]CODEd assignments[_5]',
  '<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'),    '<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'),
     'problems_for_anon', 'CHOOSE_ANON1'];      'problems_for_anon', 'CHOOSE_ANON1']);
  }  
   
  my $randomly_ordered_warning =   
             &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"',  
   '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'",  
  '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::grades::get_scantronformat_file();          my ($randomly_ordered_warning,$codechoice,$code_selection,$namechoice) =
  my $codechoice='';              &generate_common_choosers($r,$helper,$map,$url,$isProblem,$symbFilter,$start_new_option);
  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'",  
    'RESOURCES',  
    'PRINT_FORMATTING',  
    $url,  
    $isProblem, '',  $symbFilter,  
    $start_new_option);  
  &Apache::lonxml::xmlparse($r, 'helper', $anon_page);  
   
   
  if ($helper->{VARS}->{'assignment'}) {   if ($helper->{VARS}->{'assignment'}) {
   
     # Assignment printing:      # Assignment printing:
   
     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=<<RESOURCE_SELECTOR;          # 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;
     <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>
     <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>      <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>
     <resource variable="RESOURCES" multichoice="1" addstatus="1"       <resource variable="RESOURCES" multichoice="1" addstatus="1"
               closeallpages="1">                closeallpages="1" modallink="1">
       <filterfunc>return $isNotMap;</filterfunc>        <filterfunc>return $isNotMap;</filterfunc>
       <mapurl>$map</mapurl>        <mapurl>$map</mapurl>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
Line 4592  CHOOSE_ANON2 Line 4785  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'})
     ||      ||
     (&Apache::lonnet::allowed('bre',$subdir) eq 'F'      (&Apache::lonnet::allowed('bre',$subdir) eq 'F'
      &&        &&
      $helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)       $helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)
     ))       ))
  && $helper->{VARS}->{'assignment'} eq ""   && $helper->{VARS}->{'assignment'} eq ""
  ) {   ) {
  my $pretty_dir = &Apache::lonnet::hreflocation($subdir);   my $pretty_dir = &Apache::lonnet::hreflocation($subdir);
         push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from current subdirectory [_3]','<b>','</b>','<b><i>'.$pretty_dir.'</i></b>','<b>','</b>'), 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];          push(@{$printChoices}, [&mt('Selected [_1]Problems[_2] from current subdirectory [_3]','<b>','</b>','<b><i>'.$pretty_dir.'</i></b>','<b>','</b>'), 'problems_from_directory', 'CHOOSE_FROM_SUBDIR']);
         my $xmlfrag = <<CHOOSE_FROM_SUBDIR;          my $xmlfrag = <<CHOOSE_FROM_SUBDIR;
   <state name="CHOOSE_FROM_SUBDIR" title="Select File(s) from <b><small>$pretty_dir</small></b> to print">    <state name="CHOOSE_FROM_SUBDIR" title="Select File(s) from <b><small>$pretty_dir</small></b> to print">
   
Line 4611  CHOOSE_ANON2 Line 4805  CHOOSE_ANON2
       <nextstate>PAGESIZE</nextstate>        <nextstate>PAGESIZE</nextstate>
       <filechoice>return '$subdir';</filechoice>        <filechoice>return '$subdir';</filechoice>
 CHOOSE_FROM_SUBDIR  CHOOSE_FROM_SUBDIR
           
         # this is broken up because I really want interpolation above,          # this is broken up because I really want interpolation above,
         # and I really DON'T want it below          # and I really DON'T want it below
         $xmlfrag .= <<'CHOOSE_FROM_SUBDIR';          $xmlfrag .= <<'CHOOSE_FROM_SUBDIR';
Line 4626  CHOOSE_FROM_SUBDIR Line 4820  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'} && !$is_published) {      if ((!$helper->{VARS}->{'construction'}) &&
  push @$printChoices, [&mtn("Selected <b>Resources</b> from <b>selected folder</b> in course"),          (!$is_published || (($subdir eq '') && ($url eq '/adm/navmaps')))) {
       'select_sequences', 'CHOOSE_SEQUENCE'];          push(@$printChoices,[&mt('Selected [_1]Resources[_2] from [_3]selected folder[_4] in course',
  my $escapedSequenceName = $helper->{VARS}->{'SEQUENCE'};                                   '<b>','</b>','<b>','</b>'),
  #Escape apostrophes and backslashes for Perl                               'select_sequences','CHOOSE_SEQUENCE']);
  $escapedSequenceName =~ s/\\/\\\\/g;          my $escapedSequenceName;
  $escapedSequenceName =~ s/'/\\'/g;          if ($helper->{VARS}->{'SEQUENCE'} ne '') {
  &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_FROM_ANY_SEQUENCE);              $escapedSequenceName = $helper->{VARS}->{'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 4647  CHOOSE_FROM_SUBDIR Line 4975  CHOOSE_FROM_SUBDIR
   <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">                closeallpages="1" modallink="1" suppressNavmap="1" $nocurrloc>
       <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 4656  CHOOSE_FROM_SUBDIR Line 4984  CHOOSE_FROM_SUBDIR
       </resource>        </resource>
     </state>      </state>
 CHOOSE_FROM_ANY_SEQUENCE  CHOOSE_FROM_ANY_SEQUENCE
 }          }
       }
       my $numchoices = 0;
       if (ref($printChoices) eq 'ARRAY') {
           $numchoices = @{$printChoices};
       }
       # Early out if nothing to print
       if (!$numchoices) {
           $r->print(&Apache::loncommon::start_page('Printing Helper').
                     '<h2>'.&mt('Unable to determine print context').'</h2>'.
                     '<p>'.&mt('Please display a resource, and then click the "Print" button/icon').'</p>');
           my $prtspool=$r->dir_config('lonPrtDir');
           my $footer = &recently_generated($prtspool);
           $r->print($footer.&Apache::loncommon::end_page());
           return OK;
       }
   
     # Generate the first state, to select which resources get printed.      # Generate the first state, to select which resources get printed.
     Apache::lonhelper::state->new("START", "Select Printing Options:");      Apache::lonhelper::state->new("START", "Select Printing Options:");
     if (!$res_printable) {      if (!$res_printable) {
  $paramHash = Apache::lonhelper::getParamHash();          my $noprintmsg;
  $paramHash->{MESSAGE_TEXT} =           if ($res_error) {
             '<p class="LC_info">'              $noprintmsg = &mt('Print availability for current resource could not be determined');
            .&mt('Printing for current resource is only possible between [_1] and [_2]',          } else {
                 $res_printstartdate, $res_printenddate).'</p>';              my $now = time;
  Apache::lonhelper::message->new();              my $shownprintstart = &Apache::lonlocal::locallocaltime($res_printstartdate);
               my $shownprintend = &Apache::lonlocal::locallocaltime($res_printenddate);
               if (($res_printenddate) && ($res_printenddate < $now)) {
                   $noprintmsg = &mt('Printing for current resource no longer available (ended: [_1])',
                                     $shownprintend);
               } else {
                   if (($res_printstartdate) && ($res_printstartdate > $now)) {
                       if (($res_printenddate) && ($res_printenddate > $now) && ($res_printenddate > $res_printstartdate)) {
                           $noprintmsg = &mt('Printing for current resource is only possible between [_1] and [_2]',
                                             $shownprintstart,$shownprintend);
                       } elsif (!$res_printenddate) {
                           $noprintmsg = &mt('Printing for current resource will only be possible starting [_1]',
                                             $shownprintstart);
                       } else {
                           $noprintmsg = &mt('Printing for current resource is unavailable');
                       }
                   }
               }
           }
   
           if ($noprintmsg) {
               $paramHash = Apache::lonhelper::getParamHash();
       $paramHash->{MESSAGE_TEXT} =
                   '<p class="LC_info">'.$noprintmsg.'</p>';
       Apache::lonhelper::message->new();
           }
     }      }
     $paramHash = Apache::lonhelper::getParamHash();      $paramHash = Apache::lonhelper::getParamHash();
     $paramHash = Apache::lonhelper::getParamHash();      $paramHash = Apache::lonhelper::getParamHash();
Line 4680  CHOOSE_FROM_ANY_SEQUENCE Line 5048  CHOOSE_FROM_ANY_SEQUENCE
     my $startedTable = 0; # have we started an HTML table yet? (need      my $startedTable = 0; # have we started an HTML table yet? (need
                           # to close it later)                            # to close it later)
   
     if (($perm{'pav'} and $perm{'vgr'}) or       if (($perm{'pav'} and $perm{'vgr'}) or
  ($helper->{VARS}->{'construction'} eq '1')) {   ($helper->{VARS}->{'construction'} eq '1')) {
  &addMessage('<br />'   &addMessage('<br />'
                    .'<h3>'.&mt('Print Options').'</h3>'                     .'<h3>'.&mt('Print Options').'</h3>'
Line 4692  CHOOSE_FROM_ANY_SEQUENCE Line 5060  CHOOSE_FROM_ANY_SEQUENCE
                     )                      )
         );          );
         $paramHash = Apache::lonhelper::getParamHash();          $paramHash = Apache::lonhelper::getParamHash();
  $paramHash->{'variable'} = 'ANSWER_TYPE';      $paramHash->{'variable'} = 'ANSWER_TYPE';
  $helper->declareVar('ANSWER_TYPE');            $helper->declareVar('ANSWER_TYPE');
         $paramHash->{CHOICES} = [          $paramHash->{CHOICES} = [
                                    ['Without Answers', 'yes'],                                     ['Without Answers', 'yes'],
                                    ['With Answers', 'no'],                                     ['With Answers', 'no'],
Line 4711  CHOOSE_FROM_ANY_SEQUENCE Line 5079  CHOOSE_FROM_ANY_SEQUENCE
             &addMessage(&Apache::lonhtmlcommon::row_title(&mt('Font Size')));              &addMessage(&Apache::lonhtmlcommon::row_title(&mt('Font Size')));
             my $xmlfrag = << "FONT_SELECTION";              my $xmlfrag = << "FONT_SELECTION";
   
             
             <dropdown variable='fontsize' multichoice='0', allowempty='0'>              <dropdown variable='fontsize' multichoice='0' allowempty='0'>
             <defaultvalue>              <defaultvalue>
   return 'normalsize';    return 'normalsize';
             </defaultvalue>              </defaultvalue>
Line 4748  FONT_SELECTION Line 5116  FONT_SELECTION
             );              );
  }   }
         $paramHash = Apache::lonhelper::getParamHash();          $paramHash = Apache::lonhelper::getParamHash();
  $paramHash->{'variable'} = 'LATEX_TYPE';      $paramHash->{'variable'} = 'LATEX_TYPE';
  $helper->declareVar('LATEX_TYPE');     $helper->declareVar('LATEX_TYPE');
  if ($helper->{VARS}->{'construction'} eq '1') {          if ($helper->{VARS}->{'construction'} eq '1') {
     $paramHash->{CHOICES} = [      $paramHash->{CHOICES} = [
      ['standard LaTeX mode', 'standard'],        ['standard LaTeX mode', 'standard'],
      ['LaTeX batchmode', 'batchmode'], ];       ['LaTeX batchmode', 'batchmode'], ];
  } else {   } else {
     $paramHash->{CHOICES} = [      $paramHash->{CHOICES} = [
Line 4760  FONT_SELECTION Line 5128  FONT_SELECTION
      ['standard LaTeX mode', 'standard'] ];       ['standard LaTeX mode', 'standard'] ];
  }   }
         Apache::lonhelper::dropdown->new();          Apache::lonhelper::dropdown->new();
    
  &addMessage(&Apache::lonhtmlcommon::row_closure()   &addMessage(&Apache::lonhtmlcommon::row_closure()
                    .&Apache::lonhtmlcommon::row_title(                     .&Apache::lonhtmlcommon::row_title(
                         '<label for="TABLE_CONTENTS_forminput">'                          '<label for="TABLE_CONTENTS_forminput">'
Line 4769  FONT_SELECTION Line 5137  FONT_SELECTION
                     )                      )
         );          );
         $paramHash = Apache::lonhelper::getParamHash();          $paramHash = Apache::lonhelper::getParamHash();
  $paramHash->{'variable'} = 'TABLE_CONTENTS';      $paramHash->{'variable'} = 'TABLE_CONTENTS';
  $helper->declareVar('TABLE_CONTENTS');            $helper->declareVar('TABLE_CONTENTS');
         $paramHash->{CHOICES} = [          $paramHash->{CHOICES} = [
                                    ['No', 'no'],                                     ['No', 'no'],
                                    ['Yes', 'yes'] ];                                     ['Yes', 'yes'] ];
         Apache::lonhelper::dropdown->new();          Apache::lonhelper::dropdown->new();
  &addMessage(&Apache::lonhtmlcommon::row_closure());   &addMessage(&Apache::lonhtmlcommon::row_closure());
           
  if (not $helper->{VARS}->{'construction'}) {   if (not $helper->{VARS}->{'construction'}) {
     &addMessage(&Apache::lonhtmlcommon::row_title(      &addMessage(&Apache::lonhtmlcommon::row_title(
                             '<label for="TABLE_INDEX_forminput">'                              '<label for="TABLE_INDEX_forminput">'
Line 4785  FONT_SELECTION Line 5153  FONT_SELECTION
                         )                          )
             );              );
     $paramHash = Apache::lonhelper::getParamHash();      $paramHash = Apache::lonhelper::getParamHash();
     $paramHash->{'variable'} = 'TABLE_INDEX';         $paramHash->{'variable'} = 'TABLE_INDEX';
     $helper->declareVar('TABLE_INDEX');               $helper->declareVar('TABLE_INDEX');
     $paramHash->{CHOICES} = [      $paramHash->{CHOICES} = [
      ['No', 'no'],       ['No', 'no'],
      ['Yes', 'yes'] ];       ['Yes', 'yes'] ];
Line 4799  FONT_SELECTION Line 5167  FONT_SELECTION
                         )                          )
             );              );
     $paramHash = Apache::lonhelper::getParamHash();      $paramHash = Apache::lonhelper::getParamHash();
     $paramHash->{'variable'} = 'PRINT_DISCUSSIONS';         $paramHash->{'variable'} = 'PRINT_DISCUSSIONS';
     $helper->declareVar('PRINT_DISCUSSIONS');               $helper->declareVar('PRINT_DISCUSSIONS');
     $paramHash->{CHOICES} = [      $paramHash->{CHOICES} = [
      ['No', 'no'],       ['No', 'no'],
      ['Yes', 'yes'] ];       ['Yes', 'yes'] ];
Line 4834  FONT_SELECTION Line 5202  FONT_SELECTION
             &addMessage(&Apache::lonhtmlcommon::row_closure(1));              &addMessage(&Apache::lonhtmlcommon::row_closure(1));
  }   }
   
  if ($helper->{'VARS'}->{'construction'}) {    if ($helper->{'VARS'}->{'construction'}) {
     my $stylevalue='$Apache::lonnet::env{"construct.style"}';      my $stylevalue='$Apache::lonnet::env{"construct.style"}';
             my $randseedtext=&mt("Use random seed");              my $randseedtext=&mt("Use random seed");
             my $stylefiletext=&mt("Use style file");              my $stylefiletext=&mt("Use style file");
Line 4925  PROBTYPE Line 5293  PROBTYPE
     # If we're in the "final" state, bailout and return to handler      # If we're in the "final" state, bailout and return to handler
     if ($helper->{STATE} eq 'FINAL') {      if ($helper->{STATE} eq 'FINAL') {
         return $helper;          return $helper;
     }          }
   
     my $footer;      my $footer;
     if ($helper->{STATE} eq 'START') {      if ($helper->{STATE} eq 'START') {
         my $prtspool=$r->dir_config('lonPrtDir');           my $prtspool=$r->dir_config('lonPrtDir');
  $footer = &recently_generated($prtspool);   $footer = &recently_generated($prtspool);
     }      }
     $r->print($helper->display($footer));      $r->print($helper->display($footer));
Line 4949  package Apache::lonprintout::page_format Line 5317  package Apache::lonprintout::page_format
   
 See lonhelper.pm documentation for discussion of the helper framework.  See lonhelper.pm documentation for discussion of the helper framework.
   
 Apache::lonprintout::page_format_state is an element that gives the   Apache::lonprintout::page_format_state is an element that gives the
 user an opportunity to select the page layout they wish to print   user an opportunity to select the page layout they wish to print
 with: Number of columns, portrait/landscape, and paper size. If you   with: Number of columns, portrait/landscape, and paper size. If you
 want to change the paper size choices, change the @paperSize array   want to change the paper size choices, change the @paperSize array
 contents in this package.  contents in this package.
   
 page_format_state is always directly invoked in lonprintout.pm, so there  page_format_state is always directly invoked in lonprintout.pm, so there
Line 4976  use Apache::lonnet; Line 5344  use Apache::lonnet;
   
 my $maxColumns = 2;  my $maxColumns = 2;
 # it'd be nice if these all worked  # it'd be nice if these all worked
 #my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]",   #my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]",
 #                 "tabloid (ledger) [11x17 in]", "executive [7 1/2x10 in]",  #                 "tabloid (ledger) [11x17 in]", "executive [7 1/2x10 in]",
 #                 "a2 [420x594 mm]", "a3 [297x420 mm]", "a4 [210x297 mm]",   #                 "a2 [420x594 mm]", "a3 [297x420 mm]", "a4 [210x297 mm]",
 #                 "a5 [148x210 mm]", "a6 [105x148 mm]" );  #                 "a5 [148x210 mm]", "a6 [105x148 mm]" );
 my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]",   my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]",
  "a4 [210x297 mm]");   "a4 [210x297 mm]");
   
 # Tentative format: Orientation (L = Landscape, P = portrait) | Colnum |  # Tentative format: Orientation (L = Landscape, P = portrait) | Colnum |
 #                   Paper type  #                   Paper type
   
 sub new {   sub new {
     my $self = Apache::lonhelper::element->new();      my $self = Apache::lonhelper::element->new();
   
     shift;      shift;
Line 5008  sub render { Line 5376  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-Formfields');      my $pdfFormLabel=&mt('PDF Form Fields');
     my $with=&mt('with Formfields');      my $with=&mt('with Form Fields');
     my $without=&mt('without Formfields');      my $without=&mt('without Form Fields');
       
   
     $result.='<h3>'.&mt('Layout Options').'</h3>'      $result.='<h3>'.&mt('Layout Options').'</h3>'
             .&Apache::loncommon::start_data_table()              .&Apache::loncommon::start_data_table()
Line 5078  sub postprocess { Line 5446  sub postprocess {
   
     my $var = $self->{'variable'};      my $var = $self->{'variable'};
     my $helper = Apache::lonhelper->getHelper();      my $helper = Apache::lonhelper->getHelper();
     $helper->{VARS}->{$var} =       $helper->{VARS}->{$var} =
         $env{"form.$var.layout"} . '|' . $env{"form.$var.cols"} . '|' .          $env{"form.$var.layout"} . '|' . $env{"form.$var.cols"} . '|' .
         $env{"form.$var.paper"} . '|' . $env{"form.$var.pdfFormFields"};          $env{"form.$var.paper"} . '|' . $env{"form.$var.pdfFormFields"};
     return 1;      return 1;
Line 5094  package Apache::lonprintout::page_size_s Line 5462  package Apache::lonprintout::page_size_s
   
 See lonhelper.pm documentation for discussion of the helper framework.  See lonhelper.pm documentation for discussion of the helper framework.
   
 Apache::lonprintout::page_size_state is an element that gives the   Apache::lonprintout::page_size_state is an element that gives the
 user the opportunity to further refine the page settings if they  user the opportunity to further refine the page settings if they
 select a single-column page.  select a single-column page.
   
Line 5117  use strict; Line 5485  use strict;
   
   
   
 sub new {   sub new {
     my $self = Apache::lonhelper::element->new();      my $self = Apache::lonhelper::element->new();
   
     shift; # disturbs me (probably prevents subclassing) but works (drops      shift; # disturbs me (probably prevents subclassing) but works (drops
Line 5127  sub new { Line 5495  sub new {
     my $helper = Apache::lonhelper::getHelper();      my $helper = Apache::lonhelper::getHelper();
     $helper->declareVar($self->{'variable'});      $helper->declareVar($self->{'variable'});
   
     # The variable name of the format element, so we can look into       # The variable name of the format element, so we can look into
     # $helper->{VARS} to figure out whether the columns are one or two      # $helper->{VARS} to figure out whether the columns are one or two
     $self->{'formatvar'} = shift;      $self->{'formatvar'} = shift;
   
Line 5167  sub render { Line 5535  sub render {
      $size{'height_and_units'},       $size{'height_and_units'},
      $size{'margin_and_units'})=       $size{'margin_and_units'})=
  &Apache::lonprintout::page_format($papersize, $laystyle, $cols);   &Apache::lonprintout::page_format($papersize, $laystyle, $cols);
       
     foreach my $dimension ('width','height','margin') {      foreach my $dimension ('width','height','margin') {
  ($size{$dimension},$size{$dimension.'_unit'}) =   ($size{$dimension},$size{$dimension.'_unit'}) =
     split(/ +/, $size{$dimension.'_and_units'},2);      split(/ +/, $size{$dimension.'_and_units'},2);
Line 5252  sub preprocess { Line 5620  sub preprocess {
   
  foreach my $dim ('width', 'height', 'lmargin') {   foreach my $dim ('width', 'height', 'lmargin') {
     my ($value, $units) = split(/ /, $size{$dim});      my ($value, $units) = split(/ /, $size{$dim});
           
     $helper->{VARS}->{"$var.".$dim}      = $value;      $helper->{VARS}->{"$var.".$dim}      = $value;
     $helper->{VARS}->{"$var.".$dim.'unit'} = $units;      $helper->{VARS}->{"$var.".$dim.'unit'} = $units;
       
  }   }
   
   
Line 5263  sub preprocess { Line 5631  sub preprocess {
   
  $helper->changeState($self->{NEXTSTATE});   $helper->changeState($self->{NEXTSTATE});
     }      }
      
     return 1;      return 1;
 }  }
   
Line 5272  sub postprocess { Line 5640  sub postprocess {
   
     my $var = $self->{'variable'};      my $var = $self->{'variable'};
     my $helper = Apache::lonhelper->getHelper();      my $helper = Apache::lonhelper->getHelper();
     my $width = $helper->{VARS}->{$var .'.width'} = $env{"form.${var}.width"};       my $width = $helper->{VARS}->{$var .'.width'} = $env{"form.${var}.width"};
     my $height = $helper->{VARS}->{$var .'.height'} = $env{"form.${var}.height"};       my $height = $helper->{VARS}->{$var .'.height'} = $env{"form.${var}.height"};
     my $lmargin = $helper->{VARS}->{$var .'.lmargin'} = $env{"form.${var}.lmargin"};       my $lmargin = $helper->{VARS}->{$var .'.lmargin'} = $env{"form.${var}.lmargin"};
     $helper->{VARS}->{$var .'.widthunit'} = $env{"form.${var}.widthunit"};       $helper->{VARS}->{$var .'.widthunit'} = $env{"form.${var}.widthunit"};
     $helper->{VARS}->{$var .'.heightunit'} = $env{"form.${var}.heightunit"};       $helper->{VARS}->{$var .'.heightunit'} = $env{"form.${var}.heightunit"};
     $helper->{VARS}->{$var .'.lmarginunit'} = $env{"form.${var}.lmarginunit"};       $helper->{VARS}->{$var .'.lmarginunit'} = $env{"form.${var}.lmarginunit"};
   
     my $error = '';      my $error = '';
   
     # /^-?[0-9]+(\.[0-9]*)?$/ -> optional minus, at least on digit, followed       # /^-?[0-9]+(\.[0-9]*)?$/ -> optional minus, at least on digit, followed
     # by an optional period, followed by digits, ending the string      # by an optional period, followed by digits, ending the string
   
     if ($width !~  /^-?[0-9]*(\.[0-9]*)?$/) {      if ($width !~  /^-?[0-9]*(\.[0-9]*)?$/) {

Removed from v.1.636  
changed lines
  Added in v.1.707


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