Diff for /loncom/interface/lonprintout.pm between versions 1.627.2.38 and 1.697

version 1.627.2.38, 2024/11/11 16:05:56 version 1.697, 2024/10/29 22:00:23
Line 75  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 144  sub printable_sequence { Line 144  sub printable_sequence {
 #    helper - the helper which already contains info about the current folder we can  #    helper - the helper which already contains info about the current folder we can
 #             purloin.  #             purloin.
 #    map    - the map for which incomplete problems are to be printed  #    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 157  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" modallink="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 176  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 196  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" modallink="1"',        'multichoice = "1" suppressEmptySequences="0" addstatus="1" closeallpagtes="1" modallink="1"',
Line 229  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 242  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 252  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" modallink="1"',        'multichoice="1", toponly ="1", addstatus="1", closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"',
       'RESOURCES',        'RESOURCES',
       'PAGESIZE',        'PAGESIZE',
       $map,        $map,
       $filter, '',        $filter, '', 
       $symfilter,        $symfilter,
       '');        '');
   
Line 274  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 288  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 307  CHOOSE_STUDENTS Line 309  CHOOSE_STUDENTS
 #     prompt_text   - Text to use to prompt user.  #     prompt_text   - Text to use to prompt user.
 #     resource_options - Resource tag options e.g.  #     resource_options - Resource tag options e.g.
 #                        "multichoice='1', toponly='1', addstatus='1',  #                        "multichoice='1', toponly='1', addstatus='1',
 #                         modallink='1'"  #                         modallink='1'" 
 #                     that control the selection and appearance of the  #                     that control the selection and appearance of the
 #                     resource selector.  #                     resource selector.
 #     variable      - Name of the variable to hold the choice  #     variable      - Name of the variable to hold the choice
Line 318  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 444  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 458  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 491  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 returned 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 528  sub compute_open_window { Line 660  sub compute_open_window {
  $latest_open  = -1;   $latest_open  = -1;
  $earliest_close = -1;   $earliest_close = -1;
     }      }
       
     return ($latest_open, $earliest_close);      return ($latest_open, $earliest_close);
     
 }  }
   
 ##  ##
Line 557  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 566  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 returned 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  #       For consistency with &printable() in lonnavmaps.pm determination of start
Line 690  sub incomplete { Line 822  sub incomplete {
   
   
     my $navmap = Apache::lonnavmaps::navmap->new($username, $domain);      my $navmap = Apache::lonnavmaps::navmap->new($username, $domain);
       
   
     if (defined($navmap)) {      if (defined($navmap)) {
  my $res = $navmap->getResourceByUrl($map);   my $res = $navmap->getResourceByUrl($map);
Line 726  sub incomplete { Line 858  sub incomplete {
 # 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 744  sub master_seq_to_person_seq { Line 876  sub master_seq_to_person_seq {
     if ($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);                                                             $code, $unhidden);
     my ($start,$finish);      my ($start,$finish);
Line 782  sub master_seq_to_person_seq { Line 914  sub master_seq_to_person_seq {
     }      }
   
     return \@output_seq; # for now.      return \@output_seq; # for now.
       
 }  }
   
   
Line 805  sub fetch_raw_resource { Line 937  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 847  sub set_font_size { Line 979  sub set_font_size {
     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).
Line 863  sub set_font_size { Line 996  sub set_font_size {
 #  #
 # 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 943  sub collect_languages { Line 1076  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 953  sub collect_languages { Line 1086  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 1004  sub get_student_view_with_retries { Line 1137  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 1021  sub printf_style_subst { Line 1154  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 ... suppose 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 1049  sub printf_style_subst { Line 1182  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 1059  sub printf_style_subst { Line 1192  sub printf_style_subst {
 #     %s    - The section if it is supplied.  #     %s    - The section if it is supplied.
 #  #
 sub format_page_header {  sub format_page_header {
     my ($width, $format, $assignment, $course, $student) = @_;      my ($width, $format, $assignment, $course, $student, $section) = @_;
   
   
   
     $width = &recalcto_mm($width); # Get width in mm.      $width = &recalcto_mm($width); # Get width in mm.
     my $chars_per_line = int($width/2);   # Character/textline.      my $chars_per_line = int($width/1.6);   # Character/textline.
   
     #  Default format?      #  Default format?
   
Line 1074  sub format_page_header { Line 1207  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).
  #   #
   
         my $firstline = "$student $course";  
         if (length($firstline) > $chars_per_line) {  
             my $lastchar = $chars_per_line - length($student) - 1;  
             if ($lastchar > 0) {  
                 $course = substr($course, 0, $lastchar);  
             } else {            # Nothing left of course:  
                 $course = '';  
             }  
         }  
         if (length($assignment) > $chars_per_line) {  
             $assignment = substr($assignment, 0, $chars_per_line);  
         }  
   
         $format =  "\\textbf{$student} $course \\hfill \\thepage \\\\ \\textit{$assignment}";   my $name_length    = int($chars_per_line *3 /4);
    my $sec_length     = int($chars_per_line / 5);
   
     } else {   $format  = "%$name_length".'n';
         # An open question is how to handle long user formatted page headers...  
         # A possible future is to support e.g. %na so that the user can control  
         # the truncation of the elements that can appear in the header.  
         #  
         $format =  &printf_style_subst("a", $format, $assignment);  
         $format =  &printf_style_subst("c", $format, $course);  
         $format =  &printf_style_subst("n", $format, $student);  
   
         # If the user put %'s in the format string, they must be escaped  
         # to \% else LaTeX will think they are comments and terminate  
         # the line.. which is bad!!!  
   
     }   if ($section) {
       $format .=  ' - Sec: '."%$sec_length".'s';
    }
   
    $format .= '\\\\%c \\\\ %a';
           
   
       }
       # An open question is how to handle long user formatted page headers...
       # A possible future is to support e.g. %na so that the user can control
       # the truncation of the elements that can appear in the header.
       #
       $format =  &printf_style_subst("a", $format, $assignment);
       $format =  &printf_style_subst("c", $format, $course);
       $format =  &printf_style_subst("n", $format, $student);
       $format =  &printf_style_subst("s", $format, $section);
       
       
       # If the user put %'s in the format string, they  must be escaped
       # to \% else LaTeX will think they are comments and terminate
       # the line.. which is bad!!!
       
     # If the user has role author, $course and $assignment are empty so      # If the user has role author, $course and $assignment are empty so
     # there is '\\ \\ ' in the page header. That's cause a error in LaTeX      # there is '\\ \\ ' in the page header. That's cause a error in LaTeX
     if($format =~ /\\\\\s\\\\\s/) {      if($format =~ /\\\\\s\\\\\s/) {
Line 1117  sub format_page_header { Line 1249  sub format_page_header {
         my $testPrintout = '\\\\'.&mt('Authoring Space').' \\\\'.&mt('Test-Printout ');          my $testPrintout = '\\\\'.&mt('Authoring Space').' \\\\'.&mt('Test-Printout ');
         $format =~ s/\\\\\s\\\\\s/$testPrintout/;          $format =~ s/\\\\\s\\\\\s/$testPrintout/;
     }      }
   
     return $format;  
   
     #      #
     #  We're going to trust LaTeX to break lines appropriately, but      #  We're going to trust LaTeX to break lines appropriately, but
     #  we'll truncate anything that's more than 3 lines worth of      #  we'll truncate anything that's more than 3 lines worth of
Line 1135  sub format_page_header { Line 1264  sub format_page_header {
   
   
     return $format;      return $format;
       
 }  }
   
 #  #
Line 1183  sub is_valid_numeric_code { Line 1312  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 1204  sub is_valid_numeric_code { Line 1333  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 1222  sub is_valid_alpha_code { Line 1351  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 1259  sub is_code_valid { Line 1388  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 1315  sub compare_names { Line 1444  sub compare_names {
     #      #
     $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 1325  sub compare_names { Line 1454  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 1338  sub latex_header_footer_remove { Line 1467  sub latex_header_footer_remove {
     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.
 #  #
Line 1362  sub adjust_number_to_print { Line 1491  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 1394  sub old_character_chart { Line 1523  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 1502  sub old_character_chart { Line 1631  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 1528  sub old_character_chart { Line 1657  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 1584  sub old_character_chart { Line 1713  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 1731  sub old_character_chart { Line 1860  sub old_character_chart {
 my %page_formats=  my %page_formats=
     ('letter' => {      ('letter' => {
  'book' => {   'book' => {
      '1' => [ '7.1 in','9.7 in', '-0.57 in','-0.57 in','-0.5 in'],       '1' => [ '7.1 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']       '2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','0.275 in']
  },   },
  'album' => {   'album' => {
      '1' => [ '8.8 in', '6.8 in','-0.55 in',  '-0.55 in','-0.5 in'],       '1' => [ '8.8 in', '6.8 in','-0.55 in',  '-0.55 in','0.394 in'],
      '2' => [ '4.8 in', '6.7 in','-0.5 in', '-1.0 in','3.0 in']       '2' => [ '4.8 in', '6.8 in','-0.5 in', '-1.0 in','3.5 in']
  },   },
      },       },
      'legal' => {       'legal' => {
Line 1746  my %page_formats= Line 1875  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' => ['5.7 in','7.1 in','-1 in','-1 in','5 in']               '2' => ['6.0 in','7.1 in','-1 in','-1 in','5 in']
           },            },
      },       },
      'tabloid' => {       'tabloid' => {
Line 1795  my %page_formats= Line 1924  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' => ['24.0 cm','18.0 cm','-1.0 cm','-1.0 cm','-1.25 cm'],       '1' => ['21.59 cm','19.558 cm','-1.397cm','-2.11 cm','0 cm'],
      '2' => ['11.5 cm','18.0 cm','-0.7 cm','-1.7 cm','-1.25 cm']       '2' => ['9.91 cm','19.558 cm','-1.397 cm','-2.11 cm','0 cm']
  },   },
      },       },
      'a5' => {       'a5' => {
Line 1828  sub page_format { Line 1957  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 1848  sub get_course { Line 1977  sub get_course {
     my $courseidinfo;      my $courseidinfo;
     if (defined($env{'request.course.id'})) {      if (defined($env{'request.course.id'})) {
  $courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header');   $courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header');
    my $sec = $env{'request.course.sec'};
       
     }      }
     return $courseidinfo;      return $courseidinfo;
 }  }
   
 sub page_format_transformation {  sub page_format_transformation {
     my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents,      my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents,$indexlist,$selectionmade) = @_; 
         $indexlist,$selectionmade,$mostrecent) = @_;  
     my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin);      my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin);
   
     if ($selectionmade eq '4') {      if ($selectionmade eq '4') {
Line 1869  sub page_format_transformation { Line 1998  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;  
     if ($mostrecent ne '') {      my $name = &get_name();
         $name = $mostrecent;  
     } else {  
         $name = &get_name();  
     }  
     my $courseidinfo = &get_course();      my $courseidinfo = &get_course();
     if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }  
     my $header_text  = $parmhash{'print_header_format'};      my $header_text  = $parmhash{'print_header_format'};
     $header_text     = &format_page_header($textwidth, $header_text, $assignment,      $header_text     = &format_page_header($textwidth, $header_text, $assignment,
    $courseidinfo, $name);     $courseidinfo, $name);
Line 1885  sub page_format_transformation { Line 2009  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') {   if ($papersize eq 'a4') {
             $paperwidth = '21.0cm';      my $papersize_text;
             $paperheight = '29.7cm';      if ($perm{'pav'}) {
         } elsif ($papersize eq 'letter') {   $papersize_text = '\\special{papersize=210mm,297mm}';
             $paperwidth = '8.5in';      } else {
             $paperheight = '11.0in';   $papersize_text = '\special{papersize=210mm,297mm}';
          } elsif ($papersize eq 'legal') {      }
             $paperwidth = '8.5in';      $text =~ s/(\\begin\{document})/$1$papersize_text/;
             $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') {
Line 1944  sub page_format_transformation { Line 2041  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 = '{';
Line 1996  sub latex_corrections { Line 2093  sub latex_corrections {
     $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 2165  sub print_page_in_course { Line 2262  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);
Line 2181  sub print_page_in_course { Line 2278  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) {
Line 2195  sub print_page_in_course { Line 2292  sub print_page_in_course {
  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.=&latex_header_footer_remove(&unsupported($current_url,$mode,$resource->symb));              $result.=&latex_header_footer_remove(&unsupported($current_url,$mode,$resource->symb));
Line 2214  sub print_page_in_course { Line 2311  sub print_page_in_course {
   
     $form{'grade_target'}  = 'tex';      $form{'grade_target'}  = 'tex';
     $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);      $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);
     $form{'pdfFormFields'} = 'no'; #      $form{'pdfFormFields'} = $pdfFormFields; # 
     $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};      $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};    
       
     $form{'problem_split'}=$parmhash{'problem_stream_switch'};      $form{'problem_split'}=$parmhash{'problem_stream_switch'};
     $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 2232  sub print_page_in_course { Line 2329  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 2272  sub print_page_in_course { Line 2369  sub print_page_in_course {
     }      }
     $texversion.='\vskip 1 mm '.$answer.'\end{document}';      $texversion.='\vskip 1 mm '.$answer.'\end{document}';
  }   }
   
   
   
   
       
     }      }
     # Print annotations.      # Print annotations.
   
Line 2280  sub print_page_in_course { Line 2382  sub print_page_in_course {
  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 2318  sub recently_generated { Line 2420  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 2398  sub get_page_breaks  { Line 2500  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 2409  sub get_page_breaks  { Line 2511  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 2478  sub get_extra_vspaces { Line 2580  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 2512  sub set_form_extraspace { Line 2614  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 2538  sub print_construction_sequence { Line 2640  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 2558  sub print_construction_sequence { Line 2660  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 2573  sub print_construction_sequence { Line 2675  sub print_construction_sequence {
     $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);
Line 2595  sub print_construction_sequence { Line 2697  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 2619  sub print_construction_sequence { Line 2721  sub print_construction_sequence {
     if ($member != $#order) {      if ($member != $#order) {
  $texversion .= '\\ \cleardoublepage';   $texversion .= '\\ \cleardoublepage';
     }      }
       
     $result .= $texversion;      $result .= $texversion;
  }   }
     }      }
Line 2643  sub print_construction_sequence { Line 2745  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 2681  sub output_data { Line 2782  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 2716  ENDPART Line 2817  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 2733  ENDPART Line 2834  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 hash:
     # In some cases these settings get overridden by specific cases, but the      # In some cases these settings get overridden 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
Line 2746  ENDPART Line 2847  ENDPART
     my %form;      my %form;
     $form{'grade_target'} = 'tex';      $form{'grade_target'} = 'tex';
     $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);      $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);
     $form{'pdfFormFields'} = 'no';      $form{'pdfFormFields'} = $pdfFormFields;
   
     # If form.showallfoils is set, then request all foils be shown:      # If form.showallfoils is set, then request all foils be shown:
     # privilege will be enforced both by not allowing the      # privilege will be enforced both by not allowing the 
     # 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 2811  ENDPART Line 2912  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 2854  ENDPART Line 2955  ENDPART
   
   
   
       
     }      }
     # Print annotations.      # Print annotations.
   
Line 2880  ENDPART Line 2981  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') {
Line 2920  ENDPART Line 3022  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 2934  ENDPART Line 3036  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 2944  ENDPART Line 3046  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 3009  ENDPART Line 3111  ENDPART
  $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 3069  ENDPART Line 3171  ENDPART
  if (($selectionmade == 4) and ($assignment ne $prevassignment)) {   if (($selectionmade == 4) and ($assignment ne $prevassignment)) {
     my $name = &get_name();      my $name = &get_name();
     my $courseidinfo = &get_course();      my $courseidinfo = &get_course();
                     if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }  
     $prevassignment=$assignment;      $prevassignment=$assignment;
     my $header_text = $parmhash{'print_header_format'};      my $header_text = $parmhash{'print_header_format'};
     $header_text    = &format_page_header($textwidth, $header_text,      $header_text    = &format_page_header($textwidth, $header_text,
   $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 3083  ENDPART Line 3184  ENDPART
     }      }
  }   }
  $result .= $texversion;   $result .= $texversion;
  $flag_latex_header_remove = 'YES';   $flag_latex_header_remove = 'YES';   
     } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {      } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard|ext\.tool)$/) { 
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
  if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;}   if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;}
                   if ($urlp=~/\/ext\.tool$/) {$urlp=~s/^\/adm\/wrapper//;}
  $resources_printed .= $urlp.':';   $resources_printed .= $urlp.':';
  my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form);   my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form);
  if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {   if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
Line 3100  ENDPART Line 3202  ENDPART
     $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 3131  ENDPART Line 3233  ENDPART
     $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();
Line 3147  ENDPART Line 3249  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 3169  ENDPART Line 3275  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 3185  ENDPART Line 3291  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 3204  ENDPART Line 3310  ENDPART
                  ($map, my $id, my $resource) =                   ($map, my $id, my $resource) =
                      &Apache::lonnet::decode_symb($helper->{VARS}->{'symb'});                       &Apache::lonnet::decode_symb($helper->{VARS}->{'symb'});
              }               }
            } elsif (($helper->{'VARS'}->{'postdata'} eq '/adm/navmaps') && ($perm{'pfo'})) {
                $map = $helper->{'VARS'}->{'SEQUENCE'};
          }           }
   
  #loop over students   #loop over students
Line 3257  ENDPART Line 3365  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')     ||
          $selectionmade = 9;                ($print_type eq 'select_sequences_problems_for_anon') ||
                 ($print_type eq 'select_sequences_resources_for_anon')) {
  my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'};   my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'};
  my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'};   my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'};
  my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'};   my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'};
Line 3280  ENDPART Line 3386  ENDPART
  my ($code_type,$code_length,$bubbles_per_row)=('letter',6,10);   my ($code_type,$code_length,$bubbles_per_row)=('letter',6,10);
  foreach my $line (@lines) {   foreach my $line (@lines) {
              next if (($line =~ /^\#/) || ($line eq ''));               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; 
                  }                   }
      }       }
  }   }
Line 3295  ENDPART Line 3401  ENDPART
          if ($helper->{VARS}{'symb'}) {           if ($helper->{VARS}{'symb'}) {
              ($map, my $id, my $resource) =               ($map, my $id, my $resource) =
                  &Apache::lonnet::decode_symb($helper->{VARS}{'symb'});                   &Apache::lonnet::decode_symb($helper->{VARS}{'symb'});
            } elsif (($helper->{'VARS'}->{'postdata'} eq '/adm/navmaps') && ($perm{'pfo'})) {
                $map = $helper->{'VARS'}->{'SEQUENCE'};
          }           }
  my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth));   my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth));
  $moreenv{'problem_split'}    = $parmhash{'problem_stream_switch'};   $moreenv{'problem_split'}    = $parmhash{'problem_stream_switch'};
Line 3350  ENDPART Line 3458  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;           my $nohidemap;
Line 3359  ENDPART Line 3467  ENDPART
          }           }
  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);
Line 3379  ENDPART Line 3487  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 3447  ENDPART Line 3552  ENDPART
  }   }
  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 3461  ENDPART Line 3566  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,$mostrecent);        $selectionmade);
  $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 3505  ENDPART Line 3605  ENDPART
             }              }
         }          }
         if ($env{'request.enc'}) {          if ($env{'request.enc'}) {
             $url = &Apache::lonenc::encrypted($url);              $url = &Apache::lonenc::encrypted($url); 
         }          }
         if ($url ne '') {          if ($url ne '') {
             my $symb = $helper->{VARS}{'symb'};              my $symb = $helper->{VARS}{'symb'};
Line 3525  ENDPART Line 3625  ENDPART
                 $URLback .= (($URLback =~ /\?/) ? '&amp;':'?').'symb='.&escape($symb.$anchor);                  $URLback .= (($URLback =~ /\?/) ? '&amp;':'?').'symb='.&escape($symb.$anchor);
             }              }
         }          }
       } elsif (($helper->{VARS}->{'postdata'} eq '/adm/navmaps') &&
                ($env{'request.course.id'})) {
           $URLback=$helper->{VARS}->{'postdata'};
     }      }
     #      #
     # Final adjustment of the font size:      # Final adjustment of the font size:
Line 3537  ENDPART Line 3640  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 3557  ENDPART Line 3660  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 3569  ENDPART Line 3672  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 3611  ENDPART Line 3714  ENDPART
  'cgi.'.$identifier.'.backref' => &escape($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 3659  sub get_CODE { Line 3762  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 3686  sub print_resources { Line 3789  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
Line 3708  sub print_resources { Line 3811  sub print_resources {
     my $assignment;      my $assignment;
     my $courseidinfo = &get_course();      my $courseidinfo = &get_course();
     my $possprint = scalar(@{$master_seq});      my $possprint = scalar(@{$master_seq});
     if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }  
     if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection}  
   
     foreach my $curresline (@{$master_seq})  {      foreach my $curresline (@{$master_seq})  {
  if (defined $page_breaks{$curresline}) {   if (defined $page_breaks{$curresline}) {
Line 3723  sub print_resources { Line 3824  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, $res_url)) {
  next;   next;
Line 3734  sub print_resources { Line 3835  sub print_resources {
  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 3766  sub print_resources { Line 3867  sub print_resources {
  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}//;     #<<<<<
Line 3790  sub print_resources { Line 3893  sub print_resources {
     } 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 3831  sub print_resources { Line 3934  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);    $fullname, $usersection);
     my $header_start = ($columns_in_format == 1) ? '\lhead'      my $header_start = ($columns_in_format == 1) ? '\lhead'
  : '\fancyhead[LO]';   : '\fancyhead[LO]';
     $header_line = $header_start.'{'.$header_line.'}';      $header_line = $header_start.'{'.$header_line.'}';
Line 3864  sub print_resources { Line 3967  sub print_resources {
         } elsif ($print_incomplete) {          } elsif ($print_incomplete) {
             $message = &mt('No incomplete resources');              $message = &mt('No incomplete resources');
         }          }
         if ($message) {          if ($message) { 
             $current_output  = &encapsulate_minipage("\\vskip -10mm \n$message\n \\vskip 100 mm { }\n",$moreenv->{'problem_split'});      $current_output  = &encapsulate_minipage("\\vskip -10mm \n$message\n \\vskip 100 mm { }\n",$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;
Line 3879  sub print_resources { Line 3982  sub print_resources {
     }      }
     my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header');      my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header');
     my $header_line =      my $header_line =
         &format_page_header($LaTeXwidth, $parmhash{'print_header_format'},      &format_page_header($LaTeXwidth, $parmhash{'print_header_format'},
                             $currentassignment, $courseidinfo, $fullname);                          $currentassignment, $courseidinfo, $fullname, $usersection);
     my $header_start = ($columns_in_format == 1) ? '\lhead' : '\fancyhead[LO]';      my $header_start = ($columns_in_format == 1) ? '\lhead' : '\fancyhead[LO]';
     my $newheader = $header_start.'{'.$header_line.'}';      my $newheader = $header_start.'{'.$header_line.'}';
     if ($current_output=~/\\documentclass/) {      if ($current_output=~/\\documentclass/) {
  $current_output =~ s/\\begin\{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$newheader$namepostfix}\\vskip 5 mm /;   $current_output =~ s/\\begin\{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$newheader$namepostfix}\\vskip 5 mm /;
   
     } else {      } else {
  my $blankpages =   my $blankpages = 
     '\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'};      '\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'};
   
  $current_output = '\strut\vspace*{-6 mm}\\newline'.   $current_output = '\strut\vspace*{-6 mm}\\newline'.
Line 3928  sub handler { Line 4031  sub handler {
         my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};          my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
         my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};          my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
         my $clientip = &Apache::lonnet::get_requestor_ip($r);          my $clientip = &Apache::lonnet::get_requestor_ip($r);
         my ($blocked,$blocktext) =          my ($blocked,$blocktext) = 
             &Apache::loncommon::blocking_status('printout',$clientip,$cnum,$cdom);              &Apache::loncommon::blocking_status('printout',$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 3960  sub handler { Line 4066  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 4005  sub get_randomly_ordered_warning { Line 4112  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 4044  sub printHelper { Line 4151  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 4061  sub printHelper { Line 4168  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 4069  sub printHelper { Line 4176  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 4094  sub printHelper { Line 4201  sub printHelper {
   
     }      }
  }   }
   
     }      }
   
     # Detect whether we're coming from construction space      # Detect whether we're coming from construction space
Line 4102  sub printHelper { Line 4210  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 4111  sub printHelper { Line 4221  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'}) {  
         $helper->{VARS}->{'symb'} = $env{'form.symb'};  
     }  
     if ($env{'form.url'}) {  
         $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});  
   
     }  
     if ($helper->{VARS}->{'symb'} ne '') {      if ($helper->{VARS}->{'symb'} ne '') {
         $helper->{VARS}->{'symb'}=          $helper->{VARS}->{'symb'}=
     &Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'});      &Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'});
     }      }
     my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper);      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);
       }
     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 $res_error;
     my $userCanPrint = ($perm{'pav'} || $perm{'pfo'});      my $userCanPrint = ($perm{'pav'} || $perm{'pfo'});
     my $res_printstartdate;      my $res_printstartdate;
Line 4146  sub printHelper { Line 4277  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 4155  sub printHelper { Line 4286  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));
           } elsif (($helper->{VARS}->{'postdata'} eq '/adm/navmaps') &&
                   ($env{'request.course.id'} ne '')) {
               if ($env{'course.'.$env{'request.course.id'}.'.url'} eq
                   "uploaded/$cdom/$cnum/default.sequence") {
                   $map = $env{'course.'.$env{'request.course.id'}.'.url'};
                   $url = $helper->{VARS}->{'postdata'};
               }
           }
           if (($symb ne '') || ($map ne '')) {
             if (!$userCanPrint) {              if (!$userCanPrint) {
         my $navmap = Apache::lonnavmaps::navmap->new();          my $navmap = Apache::lonnavmaps::navmap->new();
                 if (ref($navmap)) {                  if (ref($navmap)) {
             my $res = $navmap->getBySymb($symb);                      my $res;
                       if ($symb ne '') {
                   $res = $navmap->getBySymb($symb);
                       } elsif ($map ne '') {
                           $res = $navmap->getResourceByUrl($map);
                       }
                     if (ref($res)) {                      if (ref($res)) {
                 $res_printable = $res->resprintable(); #printability in course context                  $res_printable = $res->resprintable(); #printability in course context
                 ($res_printstartdate, $res_printenddate) = &get_print_dates($res);                  ($res_printstartdate, $res_printenddate) = &get_print_dates($res);
                 ($course_open, $course_close) = &course_print_dates($res);                  ($course_open, $course_close) = &course_print_dates($res);
                 ($map_open, $map_close) = &map_print_dates($res);                  ($map_open, $map_close) = &map_print_dates($res);
                     } else {                      } else {
                         $res_error = 1;                          $res_error = 1; 
                     }                      }
                 } else {                  } else {
                     $res_error = 1;                      $res_error = 1;
Line 4184  sub printHelper { Line 4329  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 4222  sub printHelper { Line 4371  sub printHelper {
   
     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 4247  sub printHelper { Line 4396  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 4257  sub printHelper { Line 4406  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 4275  sub printHelper { Line 4426  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',
Line 4321  sub printHelper { Line 4472  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 4342  sub printHelper { Line 4498  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 {
                   $optionText = &mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>');
               }
       push @{$printChoices}, 
       [$optionText, 
        'map_problems', 
      'CHOOSE_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>');
               } 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'];      'CHOOSE_PROBLEMS_HTML'];
     my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS',      my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS',
     'Select Problem(s) to print',      'Select Problem(s) to print',
     'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1"',      'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"',
     'RESOURCES',      'RESOURCES',
     'PAGESIZE',      'PAGESIZE',
     $map,      $map,
Line 4370  sub printHelper { Line 4541  sub printHelper {
     $start_new_option);      $start_new_option);
     $helperFragment .= &generate_resource_chooser('CHOOSE_PROBLEMS_HTML',      $helperFragment .= &generate_resource_chooser('CHOOSE_PROBLEMS_HTML',
   'Select Resource(s) to print',    'Select Resource(s) to print',
   'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="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 4401  sub printHelper { Line 4573  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 4415  my $suffixXml = <<ALL_PROBLEMS; Line 4587  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" modallink="1"',        'multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1" modallink="1"',
Line 4458  ALL_PROBLEMS Line 4630  ALL_PROBLEMS
  '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 =          my ($randomly_ordered_warning,$codechoice,$code_selection,$namechoice) =
             &get_randomly_ordered_warning($helper, $map);              &generate_common_choosers($r,$helper,$map,$url,$isProblem,$symbFilter,$start_new_option);
   
  # resource_selector will hold a few states that:  
  #   - Allow resources to be selected for printing.  
  #   - Determine pagination between assignments.  
  #   - Determine how many assignments should be bundled into a single PDF.  
         # TODO:  
  #    Probably good to do things like separate this up into several vars, each  
  #    with one state, and use REGEXPs at inclusion time to set state names  
  #    and next states for better mix and match capability  
  #  
  my $resource_selector= &generate_resource_chooser('SELECT_PROBLEMS',  
   'Select resources to print',  
   'multichoice="1" addstatus="1" closeallpages="1" modallink="1" 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);  
   
   
  if ($helper->{VARS}->{'assignment'}) {   if ($helper->{VARS}->{'assignment'}) {
   
Line 4606  ALL_PROBLEMS Line 4648  ALL_PROBLEMS
     push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]CODEd assignments[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'resources_for_anon', 'CHOOSE_ANON2'];      push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]CODEd assignments[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'resources_for_anon', 'CHOOSE_ANON2'];
  }   }
   
           # resource_selector will hold a few states that:
           #   - Allow resources to be selected for printing.
           #   - Determine pagination between assignments.
           #   - Determine how many assignments should be bundled into a single PDF.
           # TODO:
           #    Probably good to do things like separate this up into several vars, each
           #    with one state, and use REGEXPs at inclusion time to set state names
           #    and next states for better mix and match capability
           #
   
  $resource_selector=<<RESOURCE_SELECTOR;   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" modallink="1">                closeallpages="1" modallink="1">
       <filterfunc>return $isNotMap;</filterfunc>        <filterfunc>return $isNotMap;</filterfunc>
       <mapurl>$map</mapurl>        <mapurl>$map</mapurl>
Line 4704  CHOOSE_ANON2 Line 4755  CHOOSE_ANON2
   
     # FIXME: That RE should come from a library somewhere.      # FIXME: That RE should come from a library somewhere.
     if (($perm{'pav'}       if (($perm{'pav'} 
           && ($subdir ne '') 
  && $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'   && $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'
  && (defined($helper->{'VARS'}->{'construction'})   && (defined($helper->{'VARS'}->{'construction'})
     ||      ||
Line 4722  CHOOSE_ANON2 Line 4774  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 4737  CHOOSE_FROM_SUBDIR Line 4789  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 4758  CHOOSE_FROM_SUBDIR Line 4944  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" modallink="1" suppressNavmap="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 4767  CHOOSE_FROM_SUBDIR Line 4953  CHOOSE_FROM_SUBDIR
       </resource>        </resource>
     </state>      </state>
 CHOOSE_FROM_ANY_SEQUENCE  CHOOSE_FROM_ANY_SEQUENCE
 }          }
       }
     my $numchoices = 0;      my $numchoices = 0;
     if (ref($printChoices) eq 'ARRAY') {      if (ref($printChoices) eq 'ARRAY') {
         $numchoices = @{$printChoices};          $numchoices = @{$printChoices};
Line 4814  CHOOSE_FROM_ANY_SEQUENCE Line 5000  CHOOSE_FROM_ANY_SEQUENCE
   
         if ($noprintmsg) {          if ($noprintmsg) {
             $paramHash = Apache::lonhelper::getParamHash();              $paramHash = Apache::lonhelper::getParamHash();
             $paramHash->{MESSAGE_TEXT} =      $paramHash->{MESSAGE_TEXT} = 
                 '<p class="LC_info">'.$noprintmsg.'</p>';                  '<p class="LC_info">'.$noprintmsg.'</p>';
             Apache::lonhelper::message->new();      Apache::lonhelper::message->new();
         }          }
     }      }
     $paramHash = Apache::lonhelper::getParamHash();      $paramHash = Apache::lonhelper::getParamHash();
Line 4843  CHOOSE_FROM_ANY_SEQUENCE Line 5029  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 4862  CHOOSE_FROM_ANY_SEQUENCE Line 5048  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';
Line 4899  FONT_SELECTION Line 5085  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 4911  FONT_SELECTION Line 5097  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 4920  FONT_SELECTION Line 5106  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 4936  FONT_SELECTION Line 5122  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 4950  FONT_SELECTION Line 5136  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 4985  FONT_SELECTION Line 5171  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 5041  FONT_SELECTION Line 5227  FONT_SELECTION
       return "$helper->{VARS}->{'probstatus'}";        return "$helper->{VARS}->{'probstatus'}";
                    </defaultvalue>                     </defaultvalue>
    <choice computer="problem">Homework Problem</choice>     <choice computer="problem">Homework Problem</choice>
    <choice computer="exam">Exam Problem</choice>     <choice computer="exam">Bubblesheet Exam Problem</choice>
    <choice computer="survey">Survey question</choice>     <choice computer="survey">Survey question</choice>
                    ,choice computer="anonsurvey"Anonymous survey question</choice>                     ,choice computer="anonsurvey"Anonymous survey question</choice>
  </dropdown>   </dropdown>
Line 5076  PROBTYPE Line 5262  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 5100  package Apache::lonprintout::page_format Line 5286  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 5127  use Apache::lonnet; Line 5313  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 5159  sub render { Line 5345  sub render {
     my $PaperType=&mt('Paper type');      my $PaperType=&mt('Paper type');
     my $landscape=&mt('Landscape');      my $landscape=&mt('Landscape');
     my $portrait=&mt('Portrait');      my $portrait=&mt('Portrait');
       my $pdfFormLabel=&mt('PDF Form Fields');
       my $with=&mt('with Form Fields');
       my $without=&mt('without Form Fields');
       
   
     $result.='<h3>'.&mt('Layout Options').'</h3>'      $result.='<h3>'.&mt('Layout Options').'</h3>'
             .&Apache::loncommon::start_data_table()              .&Apache::loncommon::start_data_table()
Line 5167  sub render { Line 5356  sub render {
             .'<th>'.$PageLayout.'</th>'              .'<th>'.$PageLayout.'</th>'
             .'<th>'.$NumberOfColumns.'</th>'              .'<th>'.$NumberOfColumns.'</th>'
             .'<th>'.$PaperType.'</th>'              .'<th>'.$PaperType.'</th>'
               .'<th>'.$pdfFormLabel.'</th>'
             .&Apache::loncommon::end_data_table_header_row()              .&Apache::loncommon::end_data_table_header_row()
             .&Apache::loncommon::start_data_table_row()              .&Apache::loncommon::start_data_table_row()
     .'<td>'      .'<td>'
Line 5207  sub render { Line 5397  sub render {
     $result .= <<HTML;      $result .= <<HTML;
         </select>          </select>
     </td>      </td>
       <td align='center'>
           <select name='${var}.pdfFormFields'>
               <option selected="selected" value="no">$without</option>
               <option value="yes">$with</option>
           </select>
       </td>
 HTML  HTML
     $result.=&Apache::loncommon::end_data_table_row()      $result.=&Apache::loncommon::end_data_table_row()
             .&Apache::loncommon::end_data_table();              .&Apache::loncommon::end_data_table();
Line 5219  sub postprocess { Line 5415  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 5235  package Apache::lonprintout::page_size_s Line 5431  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 5258  use strict; Line 5454  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 5268  sub new { Line 5464  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 5308  sub render { Line 5504  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 5393  sub preprocess { Line 5589  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 5404  sub preprocess { Line 5600  sub preprocess {
   
  $helper->changeState($self->{NEXTSTATE});   $helper->changeState($self->{NEXTSTATE});
     }      }
      
     return 1;      return 1;
 }  }
   
Line 5413  sub postprocess { Line 5609  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.627.2.38  
changed lines
  Added in v.1.697


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