Diff for /loncom/interface/lonprintout.pm between versions 1.344 and 1.386

version 1.344, 2004/12/27 14:07:28 version 1.386, 2005/08/16 10:25:15
Line 1 Line 1
 # The LearningOnline Network  #  The LearningOnline Network
 # Printout  # Printout
 #  #
 # $Id$  # $Id$
Line 42  use Apache::lonratedt; Line 42  use Apache::lonratedt;
 use POSIX qw(strftime);  use POSIX qw(strftime);
 use Apache::lonlocal;  use Apache::lonlocal;
   
 my $LaTeXwidth = 0;  my $resources_printed = '';
   
   #
   #   Convert a numeric code to letters
   #
   sub num_to_letters {
       my ($num) = @_;
       my @nums= split('',$num);
       my @num_to_let=('A'..'Z');
       my $word;
       foreach my $digit (@nums) { $word.=$num_to_let[$digit]; }
       return $word;
   }
   #   Convert a letter code to numeric.
   #
   sub letters_to_num {
       my ($letters) = @_;
       my @letters = split('', uc($letters));
       my %substitution;
       my $digit = 0;
       foreach my $letter ('A'..'J') {
    $substitution{$letter} = $digit;
    $digit++;
       }
       #  The substitution is done as below to preserve leading
       #  zeroes which are needed to keep the code size exact
       #
       my $result ="";
       foreach my $letter (@letters) {
    $result.=$substitution{$letter};
       }
       return $result;
   }
   
   #  Determine if a code is a valid numeric code.  Valid
   #  numeric codes must be comprised entirely of digits and
   #  have a correct number of digits.
   #
   #  Parameters:
   #     value      - proposed code value.
   #     num_digits - Number of digits required.
   #
   sub is_valid_numeric_code {
       my ($value, $num_digits) = @_;
       #   Remove leading/trailing whitespace;
       $value =~ s/^\s*//;
       $value =~ s/\s*$//;
       
       #  All digits?
       if ($value =~ /^[0-9]+$/) {
    return "Numeric code $value has invalid characters - must only be digits";
       }
       if (length($value) != $num_digits) {
    return "Numeric code $value incorrect number of digits (correct = $num_digits)";
       }
       return undef;
   }
   #   Determines if a code is a valid alhpa code.  Alpha codes
   #   are ciphers that map  [A-J,a-j] -> 0..9 0..9.
   #   They also have a correct digit count.
   # Parameters:
   #     value          - Proposed code value.
   #     num_letters    - correct number of letters.
   # Note:
   #    leading and trailing whitespace are ignored.
   #
   sub is_valid_alpha_code {
       my ($value, $num_letters) = @_;
       
        # strip leading and trailing spaces.
   
       $value =~ s/^\s*//g;
       $value =~ s/\s*$//g;
   
       #  All alphas in the right range?
       if ($value !~ /^[A-J,a-j]+$/) {
    return "Invalid letter code $value must only contain A-J";
       }
       if (length($value) != $num_letters) {
    return "Letter code $value has incorrect number of letters (correct = $num_letters)";
       }
       return undef;
   }
   
   #   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.
   #   The type of code selected can either be numeric or 
   #   Alphabetic.  If alphabetic, the code, in fact is a simple
   #   substitution cipher for the actual numeric code: 0->A, 1->B ...
   #   We'll be nice and be case insensitive for alpha codes.
   # Parameters:
   #    code_value    - the value of the code the user typed in.
   #    code_option   - The code type selected from the set in the scantron format
   #                    table.
   # Returns:
   #    undef         - The code is valid.
   #    other         - An error message indicating what's wrong.
   #
   sub is_code_valid {
       my ($code_value, $code_option) = @_;
       my ($code_type, $code_length) = ('letter', 6); # defaults.
       open(FG, $Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');
       foreach my $line (<FG>) {
    my ($name, $type, $length) = (split(/:/, $line))[0,2,4];
    if($name eq $code_option) {
       $code_length = $length;
       if($type eq 'number') {
    $code_type = 'number';
       }
    }
       }
       my $valid;
       if ($code_type eq 'number') {
    return &is_valid_numeric_code($code_value, $code_length);
       } else {
    return &is_valid_alpha_code($code_value, $code_length);
       }
   
   }
   
 #   Compare two students by name.  The students are in the form  #   Compare two students by name.  The students are in the form
 #   returned by the helper:  #   returned by the helper:
Line 432  sub character_chart { Line 549  sub character_chart {
 my %page_formats=  my %page_formats=
     ('letter' => {      ('letter' => {
  'book' => {   'book' => {
      '1' => [ '7.1 in','10.2 in', '-0.57 in','-0.57 in','1 cm'],       '1' => [ '7.1 in','9.8 in', '-0.57 in','-0.57 in','0.7 cm'],
      '2' => ['3.66 in','10.2 in', '-0.57 in','-0.57 in','1 cm']       '2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','0.7 cm']
  },   },
  'album' => {   'album' => {
      '1' => [ '8.8 in', '6.8 in','-40 pt in',  '-60 pt','1 cm'],       '1' => [ '8.8 in', '6.8 in','-40 pt in',  '-60 pt','1 cm'],
Line 446  my %page_formats= Line 563  my %page_formats=
      '2' => ['3.16 in','13 in','-0.57 in','-0.57 in','-0.5 in']       '2' => ['3.16 in','13 in','-0.57 in','-0.57 in','-0.5 in']
  },   },
  'album' => {   'album' => {
      '1' => [],       '1' => ['12 in','7.1 in',,'-0.57 in','-0.57 in','-0.5 in'],
      '2' => []               '2' => ['6.0 in','7.1 in','-1 in','-1 in','5 in']
           },            },
      },       },
      'tabloid' => {       'tabloid' => {
Line 456  my %page_formats= Line 573  my %page_formats=
      '2' => ['4.9 in','16 in','-0.57 in','-0.57 in','-0.5 in']       '2' => ['4.9 in','16 in','-0.57 in','-0.57 in','-0.5 in']
  },   },
  'album' => {   'album' => {
      '1' => [],       '1' => ['16 in','9.8 in','-0.57 in','-0.57 in','-0.5 in'],
      '2' => []       '2' => ['16 in','4.9 in','-0.57 in','-0.57 in','-0.5 in']
           },            },
      },       },
      'executive' => {       'executive' => {
Line 537  sub page_format { Line 654  sub page_format {
   
 sub get_name {  sub get_name {
     my ($uname,$udom)=@_;      my ($uname,$udom)=@_;
     if (!defined($uname)) { $uname=$ENV{'user.name'}; }      if (!defined($uname)) { $uname=$env{'user.name'}; }
     if (!defined($udom)) { $udom=$ENV{'user.domain'}; }      if (!defined($udom)) { $udom=$env{'user.domain'}; }
     my $plainname=&Apache::loncommon::plainname($uname,$udom);      my $plainname=&Apache::loncommon::plainname($uname,$udom);
     if ($plainname=~/^\s*$/) { $plainname=$uname.'@'.$udom; }      if ($plainname=~/^\s*$/) { $plainname=$uname.'@'.$udom; }
     $plainname=&Apache::lonxml::latex_special_symbols($plainname,'header');      $plainname=&Apache::lonxml::latex_special_symbols($plainname,'header');
Line 547  sub get_name { Line 664  sub get_name {
   
 sub get_course {  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(&Apache::lonnet::unescape($ENV{'course.'.$ENV{'request.course.id'}.'.description'}),'header');   $courseidinfo = &Apache::lonxml::latex_special_symbols(&Apache::lonnet::unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header');
     }      }
     return $courseidinfo;      return $courseidinfo;
 }  }
Line 610  sub page_cleanup { Line 727  sub page_cleanup {
   
 sub details_for_menu {  sub details_for_menu {
     my ($helper)=@_;      my ($helper)=@_;
     my $postdata=$ENV{'form.postdata'};      my $postdata=$env{'form.postdata'};
     if (!$postdata) { $postdata=$helper->{VARS}{'postdata'}; }      if (!$postdata) { $postdata=$helper->{VARS}{'postdata'}; }
     my $name_of_resource = &Apache::lonnet::gettitle($postdata);      my $name_of_resource = &Apache::lonnet::gettitle($postdata);
     my $symbolic = &Apache::lonnet::symbread($postdata);      my $symbolic = &Apache::lonnet::symbread($postdata);
Line 621  sub details_for_menu { Line 738  sub details_for_menu {
  $map =~ m|([^/]+)$|;   $map =~ m|([^/]+)$|;
  $name_of_sequence = $1;   $name_of_sequence = $1;
     }      }
     my $name_of_map = &Apache::lonnet::gettitle($ENV{'request.course.uri'});      my $name_of_map = &Apache::lonnet::gettitle($env{'request.course.uri'});
     if ($name_of_map =~ /^\s*$/) {      if ($name_of_map =~ /^\s*$/) {
  $ENV{'request.course.uri'} =~ m|([^/]+)$|;   $env{'request.course.uri'} =~ m|([^/]+)$|;
  $name_of_map = $1;   $name_of_map = $1;
     }      }
     return ($name_of_resource,$name_of_sequence,$name_of_map);      return ($name_of_resource,$name_of_sequence,$name_of_map);
Line 651  sub latex_corrections { Line 768  sub latex_corrections {
  $first_comment = index($result,'<!--',$first_comment);   $first_comment = index($result,'<!--',$first_comment);
     }      }
     $result =~ s/^\s+$//gm; #remove empty lines      $result =~ s/^\s+$//gm; #remove empty lines
     $result =~ s/(\s)(\s+)/$1/g; #removes more than one empty space      #removes more than one empty space
       $result =~ s|(\s\s+)|($1=~/[\n\r]/)?"\n":" "|ge;
     $result =~ s/\\\\\s*\\vskip/\\vskip/gm;      $result =~ s/\\\\\s*\\vskip/\\vskip/gm;
     $result =~ s/\\\\\s*\\noindent\s*(\\\\)+/\\\\\\noindent /g;      $result =~ s/\\\\\s*\\noindent\s*(\\\\)+/\\\\\\noindent /g;
     $result =~ s/{\\par }\s*\\\\/\\\\/gm;      $result =~ s/{\\par }\s*\\\\/\\\\/gm;
Line 698  sub IndexCreation { Line 816  sub IndexCreation {
 sub print_latex_header {  sub print_latex_header {
     my $mode=shift;      my $mode=shift;
     my $output='\documentclass[letterpaper]{article}';      my $output='\documentclass[letterpaper]{article}';
     if ($mode eq 'batchmode') {      if (($mode eq 'batchmode') || (!$env{'request.role.adv'})) {
  $output.='\batchmode';   $output.='\batchmode';
     }      }
     $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n".      $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n".
Line 726  sub path_to_problem { Line 844  sub path_to_problem {
     my $newurlp = '';      my $newurlp = '';
     $colwidth=~s/\s*mm\s*$//;      $colwidth=~s/\s*mm\s*$//;
 #characters average about 2 mm in width  #characters average about 2 mm in width
     if (length($urlp)*2 > $LaTeXwidth) {      if (length($urlp)*2 > $colwidth) {
  my @elements = split '/',$urlp;   my @elements = split '/',$urlp;
  my $curlength=0;   my $curlength=0;
  foreach my $element (@elements) {   foreach my $element (@elements) {
Line 784  sub unsupported { Line 902  sub unsupported {
 }  }
   
   
   #
   #   Retrieve the hash of page breaks.
   #
   #  Inputs:
   #    helper   - reference to helper object.
   #  Outputs
   #    A reference to a page break hash.
   #
   #
   
   sub get_page_breaks  {
       my ($helper) = @_;
       my %page_breaks;
       
       foreach my $break (split /\|\|\|/, $helper->{'VARS'}->{'FINISHPAGE'}) {
    $page_breaks{$break} = 1;
       }
       
       return %page_breaks;
   }
   
 sub output_data {  sub output_data {
     my ($r,$helper,$rparmhash) = @_;      my ($r,$helper,$rparmhash) = @_;
     my %parmhash = %$rparmhash;      my %parmhash = %$rparmhash;
       my $html=&Apache::lonxml::xmlbegin();
     my $bodytag=&Apache::loncommon::bodytag('Preparing Printout');      my $bodytag=&Apache::loncommon::bodytag('Preparing Printout');
     $r->print(<<ENDPART);      $r->print(<<ENDPART);
 <html>  $html
 <script type="text/javascript" language="Javascript" >  <head>
   <script type="text/javascript" language="Javascript">
     var editbrowser;      var editbrowser;
     function openbrowser(formname,elementname,only,omit) {      function openbrowser(formname,elementname,only,omit) {
         var url = '/res/?';          var url = '/res/?';
Line 814  sub output_data { Line 955  sub output_data {
         editbrowser.focus();          editbrowser.focus();
     }      }
 </script>  </script>
 <head>  
 <title>LON-CAPA output for printing</title>  <title>LON-CAPA output for printing</title>
 </head>  </head>
 $bodytag  $bodytag
 Please stand by while processing your print request, this may take some time ...  Please stand by while processing your print request, this may take some time ...
 ENDPART  ENDPART
   
   
   
       # fetch the pagebreaks and store them in the course environment
       # The page breaks will be pulled into the hash %page_breaks which is
       # indexed by symb and contains 1's for each break.
   
       $env{'form.pagebreaks'}  = $helper->{'VARS'}->{'FINISHPAGE'};
       $env{'form.lastprinttype'} = $helper->{'VARS'}->{'PRINT_TYPE'}; 
       &Apache::loncommon::store_course_settings('print',
         {'pagebreaks'    => 'scalar',
          'lastprinttype' => 'scalar'});
   
       my %page_breaks  = &get_page_breaks($helper);
   
     my $format_from_helper = $helper->{'VARS'}->{'FORMAT'};      my $format_from_helper = $helper->{'VARS'}->{'FORMAT'};
     my ($result,$selectionmade) = ('','');      my ($result,$selectionmade) = ('','');
     my $number_of_columns = 1; #used only for pages to determine the width of the cell      my $number_of_columns = 1; #used only for pages to determine the width of the cell
Line 832  ENDPART Line 986  ENDPART
  $laystyle='book';   $laystyle='book';
     }      }
     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=();
       
       #  Common settings for the %form has:
       # In some cases these settings get overriddent by specific cases, but the
       # settings are common enough to make it worthwhile factoring them out
       # here.
       #
       my %form;
       $form{'grade_target'} = 'tex';
       $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);
   
       # If form.showallfoils is set, then request all foils be shown:
       # privilege will be enforced both by not allowing the 
       # check box selecting this option to be presnt unless it's ok,
       # and by lonresponse's priv. check.
       # The if is here because lonresponse.pm only cares that
       # showallfoils is defined, not what the value is.
   
       if ($helper->{'VARS'}->{'showallfoils'} eq "1") { 
    $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};
       }
   
     if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'current_document') {      if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'current_document') {
       #-- single document - problem, page, html, xml, ...        #-- single document - problem, page, html, xml, ...
  my ($currentURL,$cleanURL);   my ($currentURL,$cleanURL);
   
  if ($helper->{'VARS'}->{'construction'} ne '1') {   if ($helper->{'VARS'}->{'construction'} ne '1') {
             #prints published resource              #prints published resource
     $currentURL=$helper->{'VARS'}->{'postdata'};      $currentURL=$helper->{'VARS'}->{'postdata'};
Line 859  ENDPART Line 1034  ENDPART
  $moreenv{'request.filename'}=$cleanURL;   $moreenv{'request.filename'}=$cleanURL;
  if ($helper->{'VARS'}->{'style_file'}=~/\w/) {   if ($helper->{'VARS'}->{'style_file'}=~/\w/) {
     $moreenv{'construct.style'}=$helper->{'VARS'}->{'style_file'};      $moreenv{'construct.style'}=$helper->{'VARS'}->{'style_file'};
     my $dom = $ENV{'user.domain'};      my $dom = $env{'user.domain'};
     my $user = $ENV{'user.name'};      my $user = $env{'user.name'};
     my $put_result = &Apache::lonnet::put('environment',{'construct.style'=>$helper->{'VARS'}->{'style_file'}},$dom,$user);      my $put_result = &Apache::lonnet::put('environment',{'construct.style'=>$helper->{'VARS'}->{'style_file'}},$dom,$user);
  }   }
  my %form;  
                 if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {$form{'problemtype'}='exam';}                  if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {$form{'problemtype'}='exam';}
  $form{'grade_target'}='tex';  
  $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);  
  $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 879  ENDPART Line 1051  ENDPART
  &Apache::lonnet::appenv(%moreenv);   &Apache::lonnet::appenv(%moreenv);
  &Apache::lonnet::delenv('form.counter');   &Apache::lonnet::delenv('form.counter');
  &Apache::lonxml::init_counter();   &Apache::lonxml::init_counter();
    $resources_printed .= $currentURL.':';
  $texversion.=&Apache::lonnet::ssi($currentURL,%form);   $texversion.=&Apache::lonnet::ssi($currentURL,%form);
  &Apache::lonnet::delenv('form.counter');   &Apache::lonnet::delenv('form.counter');
  &Apache::lonnet::delenv('request.filename');   &Apache::lonnet::delenv('request.filename');
     }      }
     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')) {
  my %form;   $form{'problem_split'}=$parmhash{'problem_stream_switch'};
  $form{'grade_target'}='answer';   $form{'grade_target'}='answer';
  $form{'answer_output_mode'}='tex';   $form{'answer_output_mode'}='tex';
  $form{'rndseed'}=$rndseed;   $form{'rndseed'}=$rndseed;
    $resources_printed .= $currentURL.':';
  my $answer=&Apache::lonnet::ssi($currentURL,%form);   my $answer=&Apache::lonnet::ssi($currentURL,%form);
  if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {   if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
     $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;      $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
Line 932  ENDPART Line 1106  ENDPART
  if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) {   if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) {
     my $texversion='';      my $texversion='';
     if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {      if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {
  my %form;  
  $form{'grade_target'}='tex';  
  $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);  
  $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'};
  $form{'rndseed'}=$rndseed;   $form{'rndseed'}=$rndseed;
    $resources_printed .=$urlp.':';
  $texversion=&Apache::lonnet::ssi($urlp,%form);   $texversion=&Apache::lonnet::ssi($urlp,%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=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) {         ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) {
  my %form;   #  Don't permanently modify %$form...
  $form{'grade_target'}='answer';   my %answerform = %form;
  $form{'answer_output_mode'}='tex';   $answerform{'grade_target'}='answer';
  $form{'rndseed'}=$rndseed;   $answerform{'answer_output_mode'}='tex';
                         if ($urlp=~/\/res\//) {$ENV{'request.state'}='published';}   $answerform{'rndseed'}=$rndseed;
  my $answer=&Apache::lonnet::ssi($urlp,%form);   $answerform{'problem_split'}=$parmhash{'problem_stream_switch'};
                           if ($urlp=~/\/res\//) {$env{'request.state'}='published';}
    $resources_printed .= $urlp.':';
    my $answer=&Apache::lonnet::ssi($urlp,%answerform);
  if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {   if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
     $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;      $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
  } else {   } else {
Line 979  ENDPART Line 1154  ENDPART
     if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;}      if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;}
     $result .= '\end{document}';         $result .= '\end{document}';   
  } elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {    } elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { 
  my %form;  
  $form{'grade_target'}='tex';  
  $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);  
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
  if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;}   if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;}
    $resources_printed .= $currentURL.':';
  my $texversion=&Apache::lonnet::ssi($currentURL,%form);   my $texversion=&Apache::lonnet::ssi($currentURL,%form);
  $result .= $texversion;   $result .= $texversion;
  } else {   } else {
     $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'});      $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'});
  }   }
     } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') or      } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems')       or
              ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or               ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or
              ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') or               ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems')       or
        ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources')      or # BUGBUG
      ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences')) {        ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences')) { 
         #-- produce an output string          #-- produce an output string
  if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') {   if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') {
Line 1000  ENDPART Line 1174  ENDPART
     $selectionmade = 3;      $selectionmade = 3;
  } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') {   } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') {
     $selectionmade = 4;      $selectionmade = 4;
    } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') {  #BUGBUG
       $selectionmade = 4;
  } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences') {   } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences') {
     $selectionmade = 7;      $selectionmade = 7;
  }   }
  my %form=();     
  $form{'grade_target'}='tex';  
  $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);  
  $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 1018  ENDPART Line 1191  ENDPART
  &Apache::lonnet::delenv('form.counter');   &Apache::lonnet::delenv('form.counter');
  &Apache::lonxml::init_counter();   &Apache::lonxml::init_counter();
  for (my $i=0;$i<=$#master_seq;$i++) {   for (my $i=0;$i<=$#master_seq;$i++) {
   
       # Note due to document structure, not allowed to put \newpage
       # prior to the first resource
   
       if (defined $page_breaks{$master_seq[$i]}) {
    if($i != 0) {
       $result.="\\newpage\n";
    }
       }
     my (undef,undef,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]);      my (undef,undef,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]);
     $urlp=&Apache::lonnet::clutter($urlp);      $urlp=&Apache::lonnet::clutter($urlp);
     $form{'symb'}=$master_seq[$i];      $form{'symb'}=$master_seq[$i];
Line 1027  ENDPART Line 1209  ENDPART
     if ($i==0) {$prevassignment=$assignment;}      if ($i==0) {$prevassignment=$assignment;}
     my $texversion='';      my $texversion='';
     if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {      if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
    $resources_printed .= $urlp.':';
  $texversion.=&Apache::lonnet::ssi($urlp,%form);   $texversion.=&Apache::lonnet::ssi($urlp,%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);
Line 1035  ENDPART Line 1218  ENDPART
     $flag_page_in_sequence = 'YES';      $flag_page_in_sequence = 'YES';
  }    } 
  my $lonidsdir=$r->dir_config('lonIDsDir');   my $lonidsdir=$r->dir_config('lonIDsDir');
  my $envfile=$ENV{'user.environment'};   my $envfile=$env{'user.environment'};
  $envfile=~/\/([^\/]+)\.id$/;   $envfile=~/\/([^\/]+)\.id$/;
  $envfile=$1;   $envfile=$1;
  &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);   &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);
  my $current_counter=$ENV{'form.counter'};   my $current_counter=$env{'form.counter'};
  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')) {
     my %form;      #  Don't permanently pervert the %form hash
     $form{'grade_target'}='answer';      my %answerform = %form;
     $form{'answer_output_mode'}='tex';      $answerform{'grade_target'}='answer';
     my $answer=&Apache::lonnet::ssi($urlp,%form);      $answerform{'answer_output_mode'}='tex';
       $resources_printed .= $urlp.':';
       my $answer=&Apache::lonnet::ssi($urlp,%answerform);
     &Apache::lonnet::appenv(('form.counter' => $current_counter));      &Apache::lonnet::appenv(('form.counter' => $current_counter));
     if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {      if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
  $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;   $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
Line 1078  ENDPART Line 1263  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)$/) { 
  my %form;  
  $form{'grade_target'}='tex';  
  $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);  
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
  if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;}   if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;}
    $resources_printed .= $urlp.':';
  my $texversion=&Apache::lonnet::ssi($urlp,%form);   my $texversion=&Apache::lonnet::ssi($urlp,%form);
  if ($flag_latex_header_remove ne 'NO') {   if ($flag_latex_header_remove ne 'NO') {
     $texversion = &latex_header_footer_remove($texversion);      $texversion = &latex_header_footer_remove($texversion);
Line 1110  ENDPART Line 1293  ENDPART
  $result .= '\end{document}';   $result .= '\end{document}';
      } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') ||       } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') ||
       ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')){        ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')){
   
   
      #-- prints assignments for whole class or for selected students         #-- prints assignments for whole class or for selected students  
  my $type;   my $type;
  if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') {   if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') {
Line 1135  ENDPART Line 1320  ENDPART
      $helper->{'VARS'}->{'NUMBER_TO_PRINT'}=$#students+1;       $helper->{'VARS'}->{'NUMBER_TO_PRINT'}=$#students+1;
  }   }
  my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};   my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};
   
  #loop over students   #loop over students
  my $flag_latex_header_remove = 'NO';    my $flag_latex_header_remove = 'NO'; 
  my %moreenv;   my %moreenv;
          $moreenv{'instructor_comments'}='hide';           $moreenv{'instructor_comments'}='hide';
  $moreenv{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);   $moreenv{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);
  $moreenv{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'};   $moreenv{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'};
    $moreenv{'problem_split'}    = $parmhash{'problem_stream_switch'};
    $moreenv{'suppress_tries'}   = $parmhash{'suppress_tries'};
  if ($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') {$moreenv{'problem_split'}='yes';}   if ($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') {$moreenv{'problem_split'}='yes';}
  my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1,'inline','75');   my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1,'inline','75');
  my $student_counter=-1;   my $student_counter=-1;
  foreach my $person (@students) {   foreach my $person (@students) {
              my $duefile="/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.due";  
                my $duefile="/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due";
      if (-e $duefile) {       if (-e $duefile) {
  my $temp_file = Apache::File->new('>>'.$duefile);   my $temp_file = Apache::File->new('>>'.$duefile);
  print $temp_file "1969\n";   print $temp_file "1969\n";
      }       }
      $student_counter++;       $student_counter++;
      my $i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'});       my $i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'});
      my ($output,$fullname)=&print_resources($r,$helper,$person,$type,\%moreenv,\@master_seq,$flag_latex_header_remove);       my ($output,$fullname, $printed)=&print_resources($r,$helper,
        $person,$type,
        \%moreenv,\@master_seq,
        $flag_latex_header_remove,
        $LaTeXwidth);
        $resources_printed .= ":";
      $print_array[$i].=$output;       $print_array[$i].=$output;
      $student_names[$i].=$person.':'.$fullname.'_END_';       $student_names[$i].=$person.':'.$fullname.'_END_';
      &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,&mt('last student').' '.$fullname);       &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,&mt('last student').' '.$fullname);
Line 1163  ENDPART Line 1357  ENDPART
  $result .= $print_array[0].'  \end{document}';   $result .= $print_array[0].'  \end{document}';
      } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon')     ||       } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon')     ||
       ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon')  ) {         ($helper->{'VARS'}->{'PRINT_TYPE'} eq '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'};
  my $code_name=$helper->{'VARS'}->{'ANON_CODE_STORAGE_NAME'};   my $code_name=$helper->{'VARS'}->{'ANON_CODE_STORAGE_NAME'};
  my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'};   my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'};
    my $single_code = $helper->{'VARS'}->{'SINGLE_CODE'};
    my $code_option=$helper->{'VARS'}->{'CODE_OPTION'};
    open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');
    my ($code_type,$code_length)=('letter',6);
    foreach my $line (<FH>) {
        my ($name,$type,$length) = (split(/:/,$line))[0,2,4];
        if ($name eq $code_option) {
    $code_length=$length;
    if ($type eq 'number') { $code_type = 'number'; }
        }
    }
  my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth));   my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth));
    $moreenv{'problem_split'}    = $parmhash{'problem_stream_switch'};
  my $seed=time+($$<<16)+($$);   my $seed=time+($$<<16)+($$);
  my @allcodes;   my @allcodes;
  if ($old_name) {   if ($old_name) {
      my %result=&Apache::lonnet::get('CODEs',[$old_name],$cdom,$cnum);       my %result=&Apache::lonnet::get('CODEs',
        [$old_name,"type\0$old_name"],
        $cdom,$cnum);
        $code_type=$result{"type\0$old_name"};
      @allcodes=split(',',$result{$old_name});       @allcodes=split(',',$result{$old_name});
      $num_todo=scalar(@allcodes);       $num_todo=scalar(@allcodes);
    } elsif ($single_code) {
   
        # If an alpha code have to convert to numbers so it can be
        # converted back to letters again :-)
        #
        if ($code_type ne 'number') {
    $single_code = &letters_to_num($single_code);
    $num_todo    = 1;
        }
        @allcodes = ($single_code);
  } else {   } else {
      my %allcodes;       my %allcodes;
      srand($seed);       srand($seed);
      for (my $i=0;$i<$num_todo;$i++) {       for (my $i=0;$i<$num_todo;$i++) {
  $moreenv{'CODE'}=&get_CODE(\%allcodes,$i,$seed,'6');   $moreenv{'CODE'}=&get_CODE(\%allcodes,$i,$seed,$code_length,
       $code_type);
      }       }
      if ($code_name) {       if ($code_name) {
  &Apache::lonnet::put('CODEs',   &Apache::lonnet::put('CODEs',
       {$code_name =>join(',',keys(%allcodes))},        {
    $code_name =>join(',',keys(%allcodes)),
    "type\0$code_name" => $code_type
         },
       $cdom,$cnum);        $cdom,$cnum);
      }       }
      @allcodes=keys(%allcodes);       @allcodes=keys(%allcodes);
Line 1199  ENDPART Line 1422  ENDPART
  my $count=0;   my $count=0;
  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);
      $moreenv{'CODE'}=&num_to_letters($code);       if ($code_type eq 'number') { 
      my ($output,$fullname)=   $moreenv{'CODE'}=$code;
        } else {
    $moreenv{'CODE'}=&num_to_letters($code);
        }
        my ($output,$fullname, $printed)=
  &print_resources($r,$helper,'anonymous',$type,\%moreenv,   &print_resources($r,$helper,'anonymous',$type,\%moreenv,
   \@master_seq,$flag_latex_header_remove);    \@master_seq,$flag_latex_header_remove,
     $LaTeXwidth);
        $resources_printed .= ":";
      $print_array[$file_num].=$output;       $print_array[$file_num].=$output;
      &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,       &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
        &mt('last assignment').' '.$fullname);         &mt('last assignment').' '.$fullname);
Line 1226  ENDPART Line 1455  ENDPART
     my $urlp = $list_of_files[$i];      my $urlp = $list_of_files[$i];
     $urlp=~s|//|/|;      $urlp=~s|//|/|;
     if ($urlp=~/\//) {      if ($urlp=~/\//) {
  my %form;   $form{'problem_split'}=$parmhash{'problem_stream_switch'};
  $form{'grade_target'}='tex';  
  $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);  
  $form{'rndseed'}=$rndseed;   $form{'rndseed'}=$rndseed;
  if ($urlp =~ m|/home/([^/]+)/public_html|) {   if ($urlp =~ m|/home/([^/]+)/public_html|) {
     $urlp =~ s|/home/([^/]*)/public_html|/~$1|;      $urlp =~ s|/home/([^/]*)/public_html|/~$1|;
  } else {   } else {
     $urlp =~ s|^$Apache::lonnet::perlvar{'lonDocRoot'}||;      $urlp =~ s|^$Apache::lonnet::perlvar{'lonDocRoot'}||;
  }   }
    $resources_printed .= $urlp.':';
  my $texversion=&Apache::lonnet::ssi($urlp,%form);   my $texversion=&Apache::lonnet::ssi($urlp,%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')) {
     my %form;      #  Don't permanently pervert %form:
     $form{'grade_target'}='answer';      my %answerform = %form;
     $form{'answer_output_mode'}='tex';      $answerform{'grade_target'}='answer';
     $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};      $answerform{'answer_output_mode'}='tex';
     $form{'rndseed'}=$rndseed;      $answerform{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
     my $answer=&Apache::lonnet::ssi($urlp,%form);      $answerform{'rndseed'}=$rndseed;
       $resources_printed .= $urlp.':';
       my $answer=&Apache::lonnet::ssi($urlp,%answerform);
     if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {      if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
  $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;   $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
     } else {      } else {
Line 1295  ENDPART Line 1525  ENDPART
  $result =~ s/\\evensidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\evensidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /;   $result =~ s/\\evensidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\evensidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /;
  $result =~ s/\\oddsidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\oddsidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /;   $result =~ s/\\oddsidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\oddsidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /;
     }      }
   
 #-- 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 $!");
Line 1321  ENDPART Line 1552  ENDPART
     my $temp_file;      my $temp_file;
     my $newfilename=$filename;      my $newfilename=$filename;
     my $num=$i+1;      my $num=$i+1;
     $newfilename =~s/\.tex$/_$num\.tex/;       $newfilename =~s/\.tex$//; 
       $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; 
Line 1338  ENDPART Line 1570  ENDPART
  if ($#student_names>-1) {   if ($#student_names>-1) {
     $student_names=$student_names[0].'_ENDPERSON_';      $student_names=$student_names[0].'_ENDPERSON_';
  } else {   } else {
     my $fullname = &get_name($ENV{'user.name'},$ENV{'user.domain'});      my $fullname = &get_name($env{'user.name'},$env{'user.domain'});
     $student_names=join(':',$ENV{'user.name'},$ENV{'user.domain'},      $student_names=join(':',$env{'user.name'},$env{'user.domain'},
  $ENV{'request.course.sec'},$fullname).   $env{'request.course.sec'},$fullname).
     '_ENDPERSON_'.'_END_';      '_ENDPERSON_'.'_END_';
  }   }
     }      }
Line 1357  ENDPART Line 1589  ENDPART
     $URLback=~s|^/~|/priv/|;      $URLback=~s|^/~|/priv/|;
  }   }
     }      }
       # logic for now is too complex to trace if this has been defined
       #  yet.
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     &Apache::lonnet::appenv('cgi.'.$identifier.'.file'   => $filename,      &Apache::lonnet::appenv('cgi.'.$identifier.'.file'   => $filename,
                             'cgi.'.$identifier.'.layout'  => $laystyle,                              'cgi.'.$identifier.'.layout'  => $laystyle,
                             'cgi.'.$identifier.'.numcol'  => $numberofcolumns,                              'cgi.'.$identifier.'.numcol'  => $numberofcolumns,
     'cgi.'.$identifier.'.paper'  => $papersize,      'cgi.'.$identifier.'.paper'  => $papersize,
                             'cgi.'.$identifier.'.selection' => $selectionmade,                              'cgi.'.$identifier.'.selection' => $selectionmade,
     'cgi.'.$identifier.'tableofcontents' => $helper->{'VARS'}->{'TABLE_CONTENTS'},      'cgi.'.$identifier.'.tableofcontents' => $helper->{'VARS'}->{'TABLE_CONTENTS'},
     'cgi.'.$identifier.'tableofindex' => $helper->{'VARS'}->{'TABLE_INDEX'},      'cgi.'.$identifier.'.tableofindex' => $helper->{'VARS'}->{'TABLE_INDEX'},
     'cgi.'.$identifier.'role' => $ENV{'request.role.adv'},      'cgi.'.$identifier.'.role' => $env{'request.role.adv'},
                             'cgi.'.$identifier.'numberoffiles' => $#print_array,                              'cgi.'.$identifier.'.numberoffiles' => $#print_array,
                             'cgi.'.$identifier.'studentnames' => $student_names,                              'cgi.'.$identifier.'.studentnames' => $student_names,
                             'cgi.'.$identifier.'backref' => $URLback,);                              'cgi.'.$identifier.'.backref' => $URLback,);
        &Apache::lonnet::appenv("cgi.$identifier.user"    => $env{'user.name'},
       "cgi.$identifier.domain"  => $env{'user.domain'},
       "cgi.$identifier.courseid" => $cnum, 
       "cgi.$identifier.coursedom" => $cdom, 
       "cgi.$identifier.resources" => $resources_printed);
   
 $r->print(<<FINALEND);  $r->print(<<FINALEND);
 <br />  <br />
 <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$identifier" />  <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$identifier" />
Line 1379  $r->print(<<FINALEND); Line 1619  $r->print(<<FINALEND);
 FINALEND  FINALEND
 }  }
   
 sub num_to_letters {  
     my ($num) = @_;  
     my @nums= split('',$num);  
     my @num_to_let=('A'..'Z');  
     my $word;  
     foreach my $digit (@nums) { $word.=$num_to_let[$digit]; }  
     return $word;  
 }  
   
 sub get_CODE {  sub get_CODE {
     my ($all_codes,$num,$seed,$size)=@_;      my ($all_codes,$num,$seed,$size,$type)=@_;
     my $max='1'.'0'x$size;      my $max='1'.'0'x$size;
     my $newcode;      my $newcode;
     while(1) {      while(1) {
  $newcode=sprintf("%06d",int(rand($max)));   $newcode=sprintf("%06d",int(rand($max)));
  if (!exists($$all_codes{$newcode})) {   if (!exists($$all_codes{$newcode})) {
     $$all_codes{$newcode}=1;      $$all_codes{$newcode}=1;
     return &num_to_letters($newcode);      if ($type eq 'number' ) {
    return $newcode;
       } else {
    return &num_to_letters($newcode);
       }
  }   }
     }      }
 }  }
   
 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)=@_;
     my $current_output = '';       my $current_output = ''; 
       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);
     my $namepostfix;      my $namepostfix;
Line 1411  sub print_resources { Line 1649  sub print_resources {
  $namepostfix="\\\\Name: ";   $namepostfix="\\\\Name: ";
  $fullname = "CODE - ".$moreenv->{'CODE'};   $fullname = "CODE - ".$moreenv->{'CODE'};
     }      }
       my $i           = 0;
     #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::lonnet::delenv('form.counter');      &Apache::lonnet::delenv('form.counter');
     &Apache::lonxml::init_counter();      &Apache::lonxml::init_counter();
   
       my %page_breaks  = &get_page_breaks($helper);
   
     foreach my $curresline (@{$master_seq})  {      foreach my $curresline (@{$master_seq})  {
    if (defined $page_breaks{$curresline}) {
       if($i != 0) {
    $current_output.= "\\newpage\n";
       }
    }
    $i++;
  if ( !($type eq 'problems' &&    if ( !($type eq 'problems' && 
        ($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library)$/)) ) {         ($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library)$/)) ) {
     my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline);      my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline);
     if (&Apache::lonnet::allowed('bre',$res_url)) {      if (&Apache::lonnet::allowed('bre',$res_url)) {
  if ($res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {   if ($res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
     my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$ENV{'request.course.id'},'tex',$moreenv);      $printed .= $curresline.':';
       my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
     my $lonidsdir=$r->dir_config('lonIDsDir');      my $lonidsdir=$r->dir_config('lonIDsDir');
     my $envfile=$ENV{'user.environment'};      my $envfile=$env{'user.environment'};
     $envfile=~/\/([^\/]+)\.id$/;      $envfile=~/\/([^\/]+)\.id$/;
     $envfile=$1;      $envfile=$1;
     &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);      &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);
     my $current_counter=$ENV{'form.counter'};      my $current_counter=$env{'form.counter'};
     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')) {
  $moreenv->{'answer_output_mode'}='tex';   #   Use a copy of the hash so we don't pervert it on future loop passes.
  $moreenv->{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   my %answerenv = %{$moreenv};
  my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$ENV{'request.course.id'},%{$moreenv});   $answerenv{'answer_output_mode'}='tex';
    $answerenv{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
    my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$env{'request.course.id'},%answerenv);
  &Apache::lonnet::appenv(('form.counter' => $current_counter));   &Apache::lonnet::appenv(('form.counter' => $current_counter));
  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/;
Line 1450  sub print_resources { Line 1701  sub print_resources {
     }      }
     $current_output .= $rendered;          $current_output .= $rendered;    
  } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {   } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {
     my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$ENV{'request.course.id'},'tex',$moreenv);      $printed .= $curresline.':';
       my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
     my $lonidsdir=$r->dir_config('lonIDsDir');      my $lonidsdir=$r->dir_config('lonIDsDir');
     my $envfile=$ENV{'user.environment'};      my $envfile=$env{'user.environment'};
     $envfile=~/\/([^\/]+)\.id$/;      $envfile=~/\/([^\/]+)\.id$/;
     $envfile=$1;      $envfile=$1;
     &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);      &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);
     my $current_counter=$ENV{'form.counter'};      my $current_counter=$env{'form.counter'};
     if ($remove_latex_header eq 'YES') {      if ($remove_latex_header eq 'YES') {
  $rendered = &latex_header_footer_remove($rendered);   $rendered = &latex_header_footer_remove($rendered);
     } else {      } else {
Line 1488  sub print_resources { Line 1740  sub print_resources {
  for (my $j=0;$j<$helper->{'VARS'}->{'EMPTY_PAGES'};$j++) {$blankpages.='\clearpage\strut\clearpage';}   for (my $j=0;$j<$helper->{'VARS'}->{'EMPTY_PAGES'};$j++) {$blankpages.='\clearpage\strut\clearpage';}
  $current_output = '\strut\vspace*{-6 mm}\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\vspace*{-2 mm}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blankpages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}'.$namepostfix.'}} \vskip 5 mm '.$current_output;   $current_output = '\strut\vspace*{-6 mm}\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\vspace*{-2 mm}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blankpages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}'.$namepostfix.'}} \vskip 5 mm '.$current_output;
     }      }
     return ($current_output,$fullname);      return ($current_output,$fullname, $printed);
   
 }  }
   
Line 1501  sub handler { Line 1753  sub handler {
 #    if ($loaderror) { return $loaderror; }  #    if ($loaderror) { return $loaderror; }
 #    $loaderror=  #    $loaderror=
 #       &Apache::lonnet::overloaderror($r,  #       &Apache::lonnet::overloaderror($r,
 #         $ENV{'course.'.$ENV{'request.course.id'}.'.home'});  #         $env{'course.'.$env{'request.course.id'}.'.home'});
 #    if ($loaderror) { return $loaderror; }  #    if ($loaderror) { return $loaderror; }
   
     my $result = printHelper($r);      my $result = printHelper($r);
Line 1514  sub handler { Line 1766  sub handler {
 # foreach $key (keys %{$helper->{'VARS'}}) {  # foreach $key (keys %{$helper->{'VARS'}}) {
 #    $r->print(' '.$key.'->'.$helper->{'VARS'}->{$key}.'<-<br />');  #    $r->print(' '.$key.'->'.$helper->{'VARS'}->{$key}.'<-<br />');
 # }  # }
 # foreach $key (keys %ENV) {  # foreach $key (keys %env) {
 #    $r->print(' '.$key.'->'.$ENV{$key}.'<-<br />');  #    $r->print(' '.$key.'->'.$env{$key}.'<-<br />');
 # }  # }
 # return OK;  # return OK;
   
     my %parmhash=&Apache::lonnet::coursedescription($ENV{'request.course.id'});      my %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'});
        
 # my $key;   # my $key; 
 # foreach $key (keys %parmhash) {  # foreach $key (keys %parmhash) {
 #    $r->print(' '.$key.'->'.$parmhash{$key}.'<-<br />');  #    $r->print(' '.$key.'->'.$parmhash{$key}.'<-<br />');
 # }  # }
 # return OK;  #
   
   
       #  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
       # would have deleted it the last time around.
   
       my $conversion_queuefile = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat";
       if(-e $conversion_queuefile) {
    unlink $conversion_queuefile;
       }
     &output_data($r,$helper,\%parmhash);      &output_data($r,$helper,\%parmhash);
     return OK;      return OK;
 }   } 
Line 1546  sub printHelper { Line 1807  sub printHelper {
     my $r = shift;      my $r = shift;
   
     if ($r->header_only) {      if ($r->header_only) {
         if ($ENV{'browser.mathml'}) {          if ($env{'browser.mathml'}) {
             &Apache::loncommon::content_type($r,'text/xml');              &Apache::loncommon::content_type($r,'text/xml');
         } else {          } else {
             &Apache::loncommon::content_type($r,'text/html');              &Apache::loncommon::content_type($r,'text/html');
Line 1556  sub printHelper { Line 1817  sub printHelper {
     }      }
   
     # Send header, nocache      # Send header, nocache
     if ($ENV{'browser.mathml'}) {      if ($env{'browser.mathml'}) {
         &Apache::loncommon::content_type($r,'text/xml');          &Apache::loncommon::content_type($r,'text/xml');
     } else {      } else {
         &Apache::loncommon::content_type($r,'text/html');          &Apache::loncommon::content_type($r,'text/html');
Line 1580  sub printHelper { Line 1841  sub printHelper {
     $helper->declareVar('assignment');      $helper->declareVar('assignment');
     $helper->declareVar('style_file');      $helper->declareVar('style_file');
     $helper->declareVar('student_sort');      $helper->declareVar('student_sort');
       $helper->declareVar('FINISHPAGE');
       $helper->declareVar('PRINT_TYPE');
       $helper->declareVar("showallfoils");
   
       #  The page breaks can get loaded initially from the course environment:
   
       if((!defined($env{"form.CURRENT_STATE"}))  ||
          ($env{'form.CURRENT_STATE'} == "START")) {
    $helper->{VARS}->{FINISHPAGE} = ""; # In case they did a back e.g.
       }
   
   
       
       &Apache::loncommon::restore_course_settings('print',
    {'pagebreaks'  => 'scalar',
            'lastprinttype' => 'scalar'});
   
       
       if("$helper->{VARS}->{PRINT_TYPE}" eq "$env{'form.lastprinttype'}") {
    $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'};
       }
       
           
     # 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.
     # Detect whether we're coming from construction space      # Detect whether we're coming from construction space
     if ($ENV{'form.postdata'}=~/^(?:http:\/\/[^\/]+\/|\/|)\~([^\/]+)\/(.*)$/) {      if ($env{'form.postdata'}=~/^(?:http:\/\/[^\/]+\/|\/|)\~([^\/]+)\/(.*)$/) {
         $helper->{VARS}->{'filename'} = "~$1/$2";          $helper->{VARS}->{'filename'} = "~$1/$2";
         $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'});              $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($env{'form.postdata'});
         }          }
         if ($ENV{'form.symb'}) {          if ($env{'form.symb'}) {
             $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'});              $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});
         }          }
     }      }
   
     if ($ENV{'form.symb'}) {      if ($env{'form.symb'}) {
         $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'});          $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});
   
     }      }
Line 1634  sub printHelper { Line 1917  sub printHelper {
         }          }
         $subdir = &Apache::lonnet::filelocation("", $url);          $subdir = &Apache::lonnet::filelocation("", $url);
     }      }
     if (!$helper->{VARS}->{'curseed'} && $ENV{'form.curseed'}) {      if (!$helper->{VARS}->{'curseed'} && $env{'form.curseed'}) {
  $helper->{VARS}->{'curseed'}=$ENV{'form.curseed'};   $helper->{VARS}->{'curseed'}=$env{'form.curseed'};
     }      }
     if (!$helper->{VARS}->{'probstatus'} && $ENV{'form.problemtype'}) {      if (!$helper->{VARS}->{'probstatus'} && $env{'form.problemtype'}) {
  $helper->{VARS}->{'probstatus'}=$ENV{'form.problemtype'};   $helper->{VARS}->{'probstatus'}=$env{'form.problemtype'};
     }      }
   
     my $userCanSeeHidden = Apache::lonnavmaps::advancedUser();      my $userCanSeeHidden = Apache::lonnavmaps::advancedUser();
     my $userPriviledged = ($ENV{'request.role'}=~m/^cc\./ or      my $userPriviledged = ($env{'request.role'}=~m/^cc\./ or
    $ENV{'request.role'}=~m/^in\./ or     $env{'request.role'}=~m/^in\./ or
    $ENV{'request.role'}=~m/^ta\./);     $env{'request.role'}=~m/^ta\./);
   
     Apache::lonhelper::registerHelperTags();      Apache::lonhelper::registerHelperTags();
   
Line 1687  sub printHelper { Line 1970  sub printHelper {
     $helper->declareVar('SEQUENCE');      $helper->declareVar('SEQUENCE');
   
     # Useful for debugging: Dump the help vars      # Useful for debugging: Dump the help vars
     #$r->print(Dumper($helper->{VARS}));  #    $r->print(Dumper($helper->{VARS}));
     #$r->print($map);  #    $r->print($map);
   
     # If we're in a sequence...      # If we're in a sequence...
     if (($helper->{'VARS'}->{'construction'} ne '1') &&      if (($helper->{'VARS'}->{'construction'} ne '1') &&
   
  $helper->{VARS}->{'postdata'} &&   $helper->{VARS}->{'postdata'} &&
  $helper->{VARS}->{'assignment'}) {   $helper->{VARS}->{'assignment'}) {
         # Allow problems from sequence          # Allow problems from sequence
Line 1708  sub printHelper { Line 1992  sub printHelper {
       <filterfunc>return $isProblem;</filterfunc>        <filterfunc>return $isProblem;</filterfunc>
       <mapurl>$map</mapurl>        <mapurl>$map</mapurl>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
         <option text='Newpage' variable='FINISHPAGE' />
       </resource>        </resource>
     </state>      </state>
   
Line 1719  sub printHelper { Line 2004  sub printHelper {
       <filterfunc>return $isNotMap;</filterfunc>        <filterfunc>return $isNotMap;</filterfunc>
       <mapurl>$map</mapurl>        <mapurl>$map</mapurl>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
         <option text='Newpage' variable='FINISHPAGE' />
       </resource>        </resource>
     </state>      </state>
 HELPERFRAGMENT  HELPERFRAGMENT
Line 1726  HELPERFRAGMENT Line 2012  HELPERFRAGMENT
  &Apache::lonxml::xmlparse($r, 'helper', $helperFragment);   &Apache::lonxml::xmlparse($r, 'helper', $helperFragment);
     }      }
   
     # If the user is priviledged, allow them to print all       # If the user is privileged, allow them to print all 
     # problems in the course, optionally for selected students      # problems and resources  in the entier course, optionally for selected students
     if ($userPriviledged &&       if ($userPriviledged && 
         ($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) {           ($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { 
   
         push @{$printChoices}, ['<b>Problems</b> from <b>entire course</b>', 'all_problems', 'ALL_PROBLEMS'];          push @{$printChoices}, ['<b>Problems</b> from <b>entire course</b>', 'all_problems', 'ALL_PROBLEMS'];
    push @{$printChoices}, ['<b>Resources</b> from <b>entire course</b>', 'all_resources', 'ALL_RESOURCES'];
          &Apache::lonxml::xmlparse($r, 'helper', <<ALL_PROBLEMS);           &Apache::lonxml::xmlparse($r, 'helper', <<ALL_PROBLEMS);
   <state name="ALL_PROBLEMS" title="Select Problem(s) to print">    <state name="ALL_PROBLEMS" title="Select Problem(s) to print">
     <message>(mark them then click "next" button) <br /></message>      <message>(mark them then click "next" button) <br /></message>
Line 1740  HELPERFRAGMENT Line 2028  HELPERFRAGMENT
       <filterfunc>return $isProblemOrMap;</filterfunc>        <filterfunc>return $isProblemOrMap;</filterfunc>
       <choicefunc>return $isNotMap;</choicefunc>        <choicefunc>return $isNotMap;</choicefunc>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
         <option text='Newpage' variable='FINISHPAGE' />
       </resource>
     </state>
     <state name="ALL_RESOURCES" title="Select Resource(s) to print">
       <message>(Mark them then click "next" button) <br /> </message>
       <resource variable="RESOURCES" toponly='0' multichoice='1'
                 suppressEmptySequences='0' addstatus='1' closeallpages='1'>
         <nextstate>PAGESIZE</nextstate>
         <filterfunc>return $isNotMap; </filterfunc>
         <valuefunc>return $symbFilter;</valuefunc>
         <option text='NewPage' variable='FINISHPAGE' />
     </resource>      </resource>
   </state>    </state>
 ALL_PROBLEMS  ALL_PROBLEMS
Line 1755  ALL_PROBLEMS Line 2054  ALL_PROBLEMS
       <filterfunc>return $isProblem;</filterfunc>        <filterfunc>return $isProblem;</filterfunc>
       <mapurl>$map</mapurl>        <mapurl>$map</mapurl>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
         <option text='New Page' variable='FINISHPAGE' />
       </resource>        </resource>
     <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>      <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>
     <choices variable="EMPTY_PAGES">      <choices variable="EMPTY_PAGES">
Line 1769  RESOURCE_SELECTOR Line 2069  RESOURCE_SELECTOR
   
         &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS);          &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS);
   <state name="CHOOSE_STUDENTS" title="Select Students and Resources">    <state name="CHOOSE_STUDENTS" title="Select Students and Resources">
       <student multichoice='1' variable="STUDENTS" nextstate="PAGESIZE" />        <student multichoice='1' variable="STUDENTS" nextstate="PAGESIZE" coursepersonnel="1"/>
         <message><b>Select sort order</b> </message>
     <choices variable='student_sort'>      <choices variable='student_sort'>
       <choice computer='0'>Sort by section then student</choice>        <choice computer='0'>Sort by section then student</choice>
       <choice computer='1'>Sort by students across sections.</choice>        <choice computer='1'>Sort by students across sections.</choice>
Line 1778  RESOURCE_SELECTOR Line 2079  RESOURCE_SELECTOR
   </state>    </state>
 CHOOSE_STUDENTS  CHOOSE_STUDENTS
   
  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 @names=&Apache::lonnet::getkeys('CODEs',$cdom,$cnum);          my @names=&Apache::lonnet::getkeys('CODEs',$cdom,$cnum);
  my $namechoice='<choice></choice>';   my $namechoice='<choice></choice>';
  foreach my $name (sort {uc($a) cmp uc($b)} @names) {   foreach my $name (sort {uc($a) cmp uc($b)} @names) {
     if ($name =~ /^error: 2 /) { next; }      if ($name =~ /^error: 2 /) { next; }
       if ($name =~ /^type\0/) { next; }
     $namechoice.='<choice computer="'.$name.'">'.$name.'</choice>';      $namechoice.='<choice computer="'.$name.'">'.$name.'</choice>';
  }   }
    open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');
    my $codechoice='';
    foreach my $line (<FH>) {
       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>';
    }
         &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON1);          &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON1);
   <state name="CHOOSE_ANON1" title="Select Students and Resources">    <state name="CHOOSE_ANON1" title="Select Students and Resources">
     <nextstate>PAGESIZE</nextstate>      <nextstate>PAGESIZE</nextstate>
     <message><hr width='33%' /><b>Number of anonymous assignments to print?</b></message>      <message><hr width='33%' /></message>
     <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5"></string>      <message><table><tr><td><b>Number of anonymous assignments to print?</b></td><td></message>
     <message><br /><b>Names to store the CODEs under for later:</b></message>      <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5">
          <validator>
    if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&
       !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                &&
               !\$helper->{'VARS'}{'SINGLE_CODE'}) {
       return "You need to specify the number of assignments to print";
    }
    return undef;
          </validator>
       </string>
       <message></td></tr><tr><td></message>
       <message><b>Value of CODE to print?</b></td><td></message>
       <string variable="SINGLE_CODE" size="10" defaultvalue="zzzz">
           <validator>
      if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}           &&
         !\$helper->{'VARS'}{'REUSE_OLD_CODES'}) {
         return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'},
         \$helper->{'VARS'}{'CODE_OPTION'});
      } else {
          return undef; # Other forces control us.
      }
           </validator>
       </string>
       <message></td></tr><tr><td></message>
       <message><b>Names to store the CODEs under for later:</b></message>
       <message></td><td></message>
     <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />      <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />
       <message></td></tr><tr><td></message>
       <message><b>Bubble sheet type:</b></message>
       <message></td><td></message>
       <dropdown variable="CODE_OPTION" multichoice="0" allowempty="0">
       $codechoice
       </dropdown>
       <message></td></tr></table></message>
     <message><hr width='33%' /></message>      <message><hr width='33%' /></message>
     <message><b>Reprint a set of saved CODEs:</b></message>      <message><b>Reprint a set of saved CODEs:</b></message>
     <dropdown variable="REUSE_OLD_CODES">      <dropdown variable="REUSE_OLD_CODES">
Line 1817  CHOOSE_ANON1 Line 2164  CHOOSE_ANON1
       <filterfunc>return $isNotMap;</filterfunc>        <filterfunc>return $isNotMap;</filterfunc>
       <mapurl>$map</mapurl>        <mapurl>$map</mapurl>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
         <option text='Newpage' variable='FINISHPAGE' />
       </resource>        </resource>
     <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>      <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>
     <choices variable="EMPTY_PAGES">      <choices variable="EMPTY_PAGES">
Line 1831  RESOURCE_SELECTOR Line 2179  RESOURCE_SELECTOR
   
  &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS1);   &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS1);
   <state name="CHOOSE_STUDENTS1" title="Select Students and Resources">    <state name="CHOOSE_STUDENTS1" title="Select Students and Resources">
     <student multichoice='1' variable="STUDENTS" nextstate="PAGESIZE" />      <student multichoice='1' variable="STUDENTS" nextstate="PAGESIZE" coursepersonnel="1" />
     <choices variable='student_sort'>      <choices variable='student_sort'>
       <choice computer='0'>Sort by section then student</choice>        <choice computer='0'>Sort by section then student</choice>
       <choice computer='1'>Sort by students across sections.</choice>        <choice computer='1'>Sort by students across sections.</choice>
Line 1844  CHOOSE_STUDENTS1 Line 2192  CHOOSE_STUDENTS1
  &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON2);   &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON2);
   <state name="CHOOSE_ANON2" title="Select Students and Resources">    <state name="CHOOSE_ANON2" title="Select Students and Resources">
     <nextstate>PAGESIZE</nextstate>      <nextstate>PAGESIZE</nextstate>
     <message><hr width='33%' /><b>Number of anonymous assignments to print?</b></message>      <message><table><tr><td><b>Number of anonymous assignments to print?</b></td><td></message>
     <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5"></string>      <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5">
     <message><br /><b>Names to store the CODEs under for later:</b></message>         <validator>
    if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&
       !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                &&
       !\$helper->{'VARS'}{'SINGLE_CODE'}) {
       return "You need to specify the number of assignments to print";
    }
    return undef;
          </validator>
       </string>
       <message></td></tr><tr><td></message>
       <message><b>Value of CODE to print?</b></td><td></message>
       <string variable="SINGLE_CODE" size="10" defaultvalue="zzzz">
           <validator>
      if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}           &&
         !\$helper->{'VARS'}{'REUSE_OLD_CODES'}) {
         return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'},
         \$helper->{'VARS'}{'CODE_OPTION'});
      } else {
          return undef; # Other forces control us.
      }
           </validator>
       </string>
       <message></td></tr><tr><td></message>
       <message><b>Names to store the CODEs under for later:</b></message>
       <message></td><td></message>
     <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />      <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />
       <message></td></tr><tr><td></message>
       <message><b>Bubble sheet type:</b></message>
       <message></td><td></message>
       <dropdown variable="CODE_OPTION" multichoice="0" allowempty="0">
       $codechoice
       </dropdown>
       <message></td></tr></table></message>
     <message><hr width='33%' /></message>      <message><hr width='33%' /></message>
     <message><b>Reprint a set of saved CODEs:</b></message>      <message><b>Reprint a set of saved CODEs:</b></message>
     <dropdown variable="REUSE_OLD_CODES">      <dropdown variable="REUSE_OLD_CODES">
Line 1860  CHOOSE_ANON2 Line 2239  CHOOSE_ANON2
     }      }
   
     # FIXME: That RE should come from a library somewhere.      # FIXME: That RE should come from a library somewhere.
     if ((((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) and $ENV{'request.role.adv'} and $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/') {          if ((((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) and $env{'request.role.adv'} and $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/') {    
         push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('from current subdirectory')." <b><i>$subdir</i></b>", 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];          push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('from current subdirectory')." <b><i>$subdir</i></b>", 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];
   
         my $f = '$filename';          my $f = '$filename';
Line 1900  CHOOSE_FROM_SUBDIR Line 2279  CHOOSE_FROM_SUBDIR
       <nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate>        <nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate>
       <filterfunc>return \$res->is_sequence;</filterfunc>        <filterfunc>return \$res->is_sequence;</filterfunc>
       <valuefunc>return $urlValue;</valuefunc>        <valuefunc>return $urlValue;</valuefunc>
         <option text='Newpage' variable='FINISHPAGE' />
       </resource>        </resource>
     </state>      </state>
   <state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print">    <state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print">
Line 1910  CHOOSE_FROM_SUBDIR Line 2290  CHOOSE_FROM_SUBDIR
       <filterfunc>return $isProblem</filterfunc>        <filterfunc>return $isProblem</filterfunc>
       <mapurl evaluate='1'>return '$escapedSequenceName';</mapurl>        <mapurl evaluate='1'>return '$escapedSequenceName';</mapurl>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
         <option text='Newpage' variable='FINISHPAGE' />
       </resource>        </resource>
     </state>      </state>
 CHOOSE_FROM_ANY_SEQUENCE  CHOOSE_FROM_ANY_SEQUENCE
Line 1922  CHOOSE_FROM_ANY_SEQUENCE Line 2303  CHOOSE_FROM_ANY_SEQUENCE
     Apache::lonhelper::message->new();      Apache::lonhelper::message->new();
     $paramHash = Apache::lonhelper::getParamHash();      $paramHash = Apache::lonhelper::getParamHash();
     $paramHash->{'variable'} = 'PRINT_TYPE';      $paramHash->{'variable'} = 'PRINT_TYPE';
     $helper->declareVar('PRINT_TYPE');  
     $paramHash->{CHOICES} = $printChoices;      $paramHash->{CHOICES} = $printChoices;
     Apache::lonhelper::choices->new();      Apache::lonhelper::choices->new();
   
     my $startedTable = 0; # have we started an HTML table yet? (need      my $startedTable = 0; # have we started an HTML table yet? (need
                           # to close it later)                            # to close it later)
   
     if (($ENV{'request.role.adv'} and &Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) or       if (($env{'request.role.adv'} and &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) or 
  ($helper->{VARS}->{'construction'} eq '1')) {   ($helper->{VARS}->{'construction'} eq '1')) {
  addMessage("<hr width='33%' /><table><tr><td align='right'>Print: </td><td>");   addMessage("<hr width='33%' /><table><tr><td align='right'>Print: </td><td>");
         $paramHash = Apache::lonhelper::getParamHash();          $paramHash = Apache::lonhelper::getParamHash();
Line 1938  CHOOSE_FROM_ANY_SEQUENCE Line 2318  CHOOSE_FROM_ANY_SEQUENCE
         $paramHash->{CHOICES} = [          $paramHash->{CHOICES} = [
                                    ['Without Answers', 'yes'],                                     ['Without Answers', 'yes'],
                                    ['With Answers', 'no'],                                     ['With Answers', 'no'],
                                    ['Only Answers', 'only'],                                     ['Only Answers', 'only']
                                    ['As Exam Problem', 'exam']  
                                 ];                                  ];
         Apache::lonhelper::dropdown->new();          Apache::lonhelper::dropdown->new();
  addMessage("</td></tr>");   addMessage("</td></tr>");
  $startedTable = 1;   $startedTable = 1;
     }      }
   
     if ($ENV{'request.role.adv'}) {      if ($env{'request.role.adv'}) {
  if (!$startedTable) {   if (!$startedTable) {
     addMessage("<hr width='33%' /><table><tr><td align='right'>LaTeX mode: </td><td>");      addMessage("<hr width='33%' /><table><tr><td align='right'>LaTeX mode: </td><td>");
     $startedTable = 1;      $startedTable = 1;
Line 1996  CHOOSE_FROM_ANY_SEQUENCE Line 2375  CHOOSE_FROM_ANY_SEQUENCE
      ['Yes', 'yes'] ];       ['Yes', 'yes'] ];
     Apache::lonhelper::dropdown->new();      Apache::lonhelper::dropdown->new();
     addMessage("</td></tr>");      addMessage("</td></tr>");
   
               #  If advanced roles, then allow to show all foils.
   
               if ($env{'request.role.adv'}) {
    addMessage("<tr><td align = 'right'>  </td><td>");
    $paramHash = Apache::lonhelper::getParamHash();
    $paramHash->{'multichoice'} = "true";
    $paramHash->{'allowempty'}  = "true";
    $paramHash->{'variable'}   = "showallfoils";
    $paramHash->{'CHOICES'} = [ ["Show all foils", "1"] ];
    Apache::lonhelper::choices->new();
    addMessage("</td></tr>");
               }
   
  }   }
   
  if ($helper->{'VARS'}->{'construction'}) {    if ($helper->{'VARS'}->{'construction'}) { 
     my $stylevalue=$ENV{'construct.style'};      my $stylevalue=$env{'construct.style'};
     my $xmlfrag .= <<"RNDSEED";      my $xmlfrag .= <<"RNDSEED";
     <message><tr><td align='right'>Use random seed:  </td><td></message>      <message><tr><td align='right'>Use random seed:  </td><td></message>
     <string variable="curseed" size="15" maxlength="15">      <string variable="curseed" size="15" maxlength="15">
Line 2008  CHOOSE_FROM_ANY_SEQUENCE Line 2401  CHOOSE_FROM_ANY_SEQUENCE
         </defaultvalue>          </defaultvalue>
     </string>      </string>
      <message></td></tr><tr><td align="right">Use style file:</td><td></message>       <message></td></tr><tr><td align="right">Use style file:</td><td></message>
              <message><input type="text" size="40" name="style_file_value" value="$stylevalue"  />&nbsp; <a href="javascript:openbrowser('helpform','style_file','sty')">Select style file</a> </td><td></message>               <message><input type="text" size="40" name="style_file_value" value="$stylevalue"  />&nbsp; <a href="javascript:openbrowser('helpform','style_file','sty')">Select style file</a> </td><tr><td></message>
              <message></td></tr></message>       <choices allowempty="1" multichoice="true" variable="showallfoils">
                   <choice computer="1">Show all foils?</choice>
                </choices>
        <message></td></tr></message>
 RNDSEED  RNDSEED
             &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);              &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);
     $helper->{'VARS'}->{'style_file'}=$ENV{'form.style_file_value'};      $helper->{'VARS'}->{'style_file'}=$env{'form.style_file_value'};
  }      
    } 
   
     }      }
   
   
Line 2080  no strict; Line 2478  no strict;
 @ISA = ("Apache::lonhelper::element");  @ISA = ("Apache::lonhelper::element");
 use strict;  use strict;
 use Apache::lonlocal;  use Apache::lonlocal;
   use Apache::lonnet;
   
 my $maxColumns = 2;  my $maxColumns = 2;
   # it'd be nice if these all worked
   #my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]", 
   #                 "tabloid (ledger) [11x17 in]", "executive [7 1/2x10 in]",
   #                 "a2 [420x594 mm]", "a3 [297x420 mm]", "a4 [210x297 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]", 
                  "tabloid (ledger) [11x17 in]", "executive [7 1/2x10 in]",   "a4 [210x297 mm]");
                  "a2 [420x594 mm]", "a3 [297x420 mm]", "a4 [210x297 mm]",   
                  "a5 [148x210 mm]", "a6 [105x148 mm]" );  
   
 # Tentative format: Orientation (L = Landscape, P = portrait) | Colnum |  # Tentative format: Orientation (L = Landscape, P = portrait) | Colnum |
 #                   Paper type  #                   Paper type
Line 2121  sub render { Line 2523  sub render {
   </tr>    </tr>
   <tr>    <tr>
     <td>      <td>
       <input type="radio" name="${var}.layout" value="L" /> Landscape<br />        <label><input type="radio" name="${var}.layout" value="L" /> Landscape </label><br />
       <input type="radio" name="${var}.layout" value="P" checked='1'  /> Portrait        <label><input type="radio" name="${var}.layout" value="P" checked='1'  /> Portrait </label>
     </td>      </td>
     <td align="center">      <td align="center">
       <select name="${var}.cols">        <select name="${var}.cols">
Line 2140  STATEHTML Line 2542  STATEHTML
     $result .= "</select></td><td>\n";      $result .= "</select></td><td>\n";
     $result .= "<select name='${var}.paper'>\n";      $result .= "<select name='${var}.paper'>\n";
   
     my %parmhash=&Apache::lonnet::coursedescription($ENV{'request.course.id'});      my %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'});
     my $DefaultPaperSize=$parmhash{'default_paper_size'};      my $DefaultPaperSize=$parmhash{'default_paper_size'};
     if ($DefaultPaperSize eq '') {$DefaultPaperSize='letter';}      if ($DefaultPaperSize eq '') {$DefaultPaperSize='letter';}
     $i = 0;      $i = 0;
Line 2164  sub postprocess { Line 2566  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.paper"};
     return 1;      return 1;
 }  }
   
Line 2195  is no tag interface. You actually pass p Line 2597  is no tag interface. You actually pass p
 =cut  =cut
   
 use Apache::lonhelper;  use Apache::lonhelper;
   use Apache::lonnet;
 no strict;  no strict;
 @ISA = ("Apache::lonhelper::element");  @ISA = ("Apache::lonhelper::element");
 use strict;  use strict;
Line 2293  sub postprocess { Line 2695  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 = '';
   

Removed from v.1.344  
changed lines
  Added in v.1.386


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