--- loncom/interface/lonprintout.pm 2005/01/04 22:00:20 1.343.2.2 +++ loncom/interface/lonprintout.pm 2005/06/04 20:52:37 1.376 @@ -1,7 +1,7 @@ -# The LearningOnline Network +# The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.343.2.2 2005/01/04 22:00:20 albertel Exp $ +# $Id: lonprintout.pm,v 1.376 2005/06/04 20:52:37 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -42,8 +42,7 @@ use Apache::lonratedt; use POSIX qw(strftime); use Apache::lonlocal; -my $LaTeXwidth = 0; - +my $resources_printed = ''; # Compare two students by name. The students are in the form # returned by the helper: @@ -446,8 +445,8 @@ my %page_formats= '2' => ['3.16 in','13 in','-0.57 in','-0.57 in','-0.5 in'] }, 'album' => { - '1' => [], - '2' => [] + '1' => ['12 in','7.1 in',,'-0.57 in','-0.57 in','-0.5 in'], + '2' => ['6.0 in','7.1 in','-1 in','-1 in','5 in'] }, }, 'tabloid' => { @@ -456,8 +455,8 @@ my %page_formats= '2' => ['4.9 in','16 in','-0.57 in','-0.57 in','-0.5 in'] }, 'album' => { - '1' => [], - '2' => [] + '1' => ['16 in','9.8 in','-0.57 in','-0.57 in','-0.5 in'], + '2' => ['16 in','4.9 in','-0.57 in','-0.57 in','-0.5 in'] }, }, 'executive' => { @@ -537,8 +536,8 @@ sub page_format { sub get_name { my ($uname,$udom)=@_; - if (!defined($uname)) { $uname=$ENV{'user.name'}; } - if (!defined($udom)) { $udom=$ENV{'user.domain'}; } + if (!defined($uname)) { $uname=$env{'user.name'}; } + if (!defined($udom)) { $udom=$env{'user.domain'}; } my $plainname=&Apache::loncommon::plainname($uname,$udom); if ($plainname=~/^\s*$/) { $plainname=$uname.'@'.$udom; } $plainname=&Apache::lonxml::latex_special_symbols($plainname,'header'); @@ -547,8 +546,8 @@ sub get_name { sub get_course { my $courseidinfo; - if (defined($ENV{'request.course.id'})) { - $courseidinfo = &Apache::lonxml::latex_special_symbols(&Apache::lonnet::unescape($ENV{'course.'.$ENV{'request.course.id'}.'.description'}),'header'); + if (defined($env{'request.course.id'})) { + $courseidinfo = &Apache::lonxml::latex_special_symbols(&Apache::lonnet::unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header'); } return $courseidinfo; } @@ -610,7 +609,7 @@ sub page_cleanup { sub details_for_menu { my ($helper)=@_; - my $postdata=$ENV{'form.postdata'}; + my $postdata=$env{'form.postdata'}; if (!$postdata) { $postdata=$helper->{VARS}{'postdata'}; } my $name_of_resource = &Apache::lonnet::gettitle($postdata); my $symbolic = &Apache::lonnet::symbread($postdata); @@ -621,9 +620,9 @@ sub details_for_menu { $map =~ m|([^/]+)$|; $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*$/) { - $ENV{'request.course.uri'} =~ m|([^/]+)$|; + $env{'request.course.uri'} =~ m|([^/]+)$|; $name_of_map = $1; } return ($name_of_resource,$name_of_sequence,$name_of_map); @@ -698,12 +697,13 @@ sub IndexCreation { sub print_latex_header { my $mode=shift; my $output='\documentclass[letterpaper]{article}'; - if ($mode eq 'batchmode') { + if (($mode eq 'batchmode') || (!$env{'request.role.adv'})) { $output.='\batchmode'; } $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n". '\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'."\n". - '\usepackage[dvips]{graphicx}\usepackage{epsfig}\usepackage{calc}'."\n". + '\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n". + '\usepackage{picins}\usepackage{calc}'."\n". '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n". '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n". '\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}'."\n". @@ -725,7 +725,7 @@ sub path_to_problem { my $newurlp = ''; $colwidth=~s/\s*mm\s*$//; #characters average about 2 mm in width - if (length($urlp)*2 > $LaTeXwidth) { + if (length($urlp)*2 > $colwidth) { my @elements = split '/',$urlp; my $curlength=0; foreach my $element (@elements) { @@ -783,13 +783,36 @@ 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 { my ($r,$helper,$rparmhash) = @_; my %parmhash = %$rparmhash; + my $html=&Apache::lonxml::xmlbegin(); my $bodytag=&Apache::loncommon::bodytag('Preparing Printout'); $r->print(< - - LON-CAPA output for printing $bodytag Please stand by while processing your print request, this may take some time ... 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 ($result,$selectionmade) = ('',''); my $number_of_columns = 1; #used only for pages to determine the width of the cell @@ -831,14 +867,35 @@ ENDPART $laystyle='book'; } 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 @print_array=(); 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') { #-- single document - problem, page, html, xml, ... my ($currentURL,$cleanURL); + if ($helper->{'VARS'}->{'construction'} ne '1') { #prints published resource $currentURL=$helper->{'VARS'}->{'postdata'}; @@ -858,14 +915,11 @@ ENDPART $moreenv{'request.filename'}=$cleanURL; if ($helper->{'VARS'}->{'style_file'}=~/\w/) { $moreenv{'construct.style'}=$helper->{'VARS'}->{'style_file'}; - my $dom = $ENV{'user.domain'}; - my $user = $ENV{'user.name'}; + my $dom = $env{'user.domain'}; + my $user = $env{'user.name'}; 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';} - $form{'grade_target'}='tex'; - $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth); $form{'problem_split'}=$parmhash{'problem_stream_switch'}; $form{'suppress_tries'}=$parmhash{'suppress_tries'}; $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; @@ -878,16 +932,18 @@ ENDPART &Apache::lonnet::appenv(%moreenv); &Apache::lonnet::delenv('form.counter'); &Apache::lonxml::init_counter(); + $resources_printed .= $currentURL.':'; $texversion.=&Apache::lonnet::ssi($currentURL,%form); &Apache::lonnet::delenv('form.counter'); &Apache::lonnet::delenv('request.filename'); } if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { - my %form; + $form{'problem_split'}=$parmhash{'problem_stream_switch'}; $form{'grade_target'}='answer'; $form{'answer_output_mode'}='tex'; $form{'rndseed'}=$rndseed; + $resources_printed .= $currentURL.':'; my $answer=&Apache::lonnet::ssi($currentURL,%form); if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; @@ -931,23 +987,22 @@ ENDPART if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { my $texversion=''; 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{'suppress_tries'}=$parmhash{'suppress_tries'}; $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; $form{'rndseed'}=$rndseed; + $resources_printed .=$urlp.':'; $texversion=&Apache::lonnet::ssi($urlp,%form); } if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) && ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) { - my %form; $form{'grade_target'}='answer'; $form{'answer_output_mode'}='tex'; $form{'rndseed'}=$rndseed; - if ($urlp=~/\/res\//) {$ENV{'request.state'}='published';} + $form{'problem_split'}=$parmhash{'problem_stream_switch'}; + if ($urlp=~/\/res\//) {$env{'request.state'}='published';} + $resources_printed .= $urlp.':'; my $answer=&Apache::lonnet::ssi($urlp,%form); if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; @@ -978,19 +1033,18 @@ ENDPART if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;} $result .= '\end{document}'; } 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'}; if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;} + $resources_printed .= $currentURL.':'; my $texversion=&Apache::lonnet::ssi($currentURL,%form); $result .= $texversion; } else { $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 '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')) { #-- produce an output string if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') { @@ -999,12 +1053,11 @@ ENDPART $selectionmade = 3; } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') { $selectionmade = 4; + } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') { #BUGBUG + $selectionmade = 4; } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences') { $selectionmade = 7; } - my %form=(); - $form{'grade_target'}='tex'; - $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth); $form{'problem_split'}=$parmhash{'problem_stream_switch'}; $form{'suppress_tries'}=$parmhash{'suppress_tries'}; $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; @@ -1017,6 +1070,15 @@ ENDPART &Apache::lonnet::delenv('form.counter'); &Apache::lonxml::init_counter(); 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]); $urlp=&Apache::lonnet::clutter($urlp); $form{'symb'}=$master_seq[$i]; @@ -1026,6 +1088,7 @@ ENDPART if ($i==0) {$prevassignment=$assignment;} my $texversion=''; if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { + $resources_printed .= $urlp.':'; $texversion.=&Apache::lonnet::ssi($urlp,%form); if ($urlp=~/\.page$/) { ($texversion,my $number_of_columns_page) = &page_cleanup($texversion); @@ -1034,16 +1097,16 @@ ENDPART $flag_page_in_sequence = 'YES'; } my $lonidsdir=$r->dir_config('lonIDsDir'); - my $envfile=$ENV{'user.environment'}; + my $envfile=$env{'user.environment'}; $envfile=~/\/([^\/]+)\.id$/; $envfile=$1; &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') || ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { - my %form; $form{'grade_target'}='answer'; $form{'answer_output_mode'}='tex'; + $resources_printed .= $urlp.':'; my $answer=&Apache::lonnet::ssi($urlp,%form); &Apache::lonnet::appenv(('form.counter' => $current_counter)); if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { @@ -1077,11 +1140,9 @@ ENDPART $result .= $texversion; $flag_latex_header_remove = 'YES'; } 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'}; if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;} + $resources_printed .= $urlp.':'; my $texversion=&Apache::lonnet::ssi($urlp,%form); if ($flag_latex_header_remove ne 'NO') { $texversion = &latex_header_footer_remove($texversion); @@ -1103,10 +1164,14 @@ ENDPART if (&Apache::loncommon::connection_aborted($r)) { last; } } &Apache::lonnet::delenv('form.counter'); - if ($flag_page_in_sequence eq 'YES') {$result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/;} + if ($flag_page_in_sequence eq 'YES') { + $result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/; + } $result .= '\end{document}'; } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') || ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')){ + + #-- prints assignments for whole class or for selected students my $type; if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') { @@ -1132,24 +1197,33 @@ ENDPART $helper->{'VARS'}->{'NUMBER_TO_PRINT'}=$#students+1; } my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; + #loop over students my $flag_latex_header_remove = 'NO'; my %moreenv; $moreenv{'instructor_comments'}='hide'; $moreenv{'textwidth'}=&get_textwidth($helper,$LaTeXwidth); $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';} my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1,'inline','75'); my $student_counter=-1; 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) { my $temp_file = Apache::File->new('>>'.$duefile); print $temp_file "1969\n"; } $student_counter++; 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; $student_names[$i].=$person.':'.$fullname.'_END_'; &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,&mt('last student').' '.$fullname); @@ -1160,12 +1234,13 @@ ENDPART $result .= $print_array[0].' \end{document}'; } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon') || ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon') ) { - my $cdom =$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; - my $cnum =$ENV{'course.'.$ENV{'request.course.id'}.'.num'}; + my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'}; my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'}; my $code_name=$helper->{'VARS'}->{'ANON_CODE_STORAGE_NAME'}; my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'}; my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth)); + $moreenv{'problem_split'} = $parmhash{'problem_stream_switch'}; my $seed=time+($$<<16)+($$); my @allcodes; if ($old_name) { @@ -1197,9 +1272,11 @@ ENDPART foreach my $code (sort(@allcodes)) { my $file_num=int($count/$number_per_page); $moreenv{'CODE'}=&num_to_letters($code); - my ($output,$fullname)= + my ($output,$fullname, $printed)= &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; &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, &mt('last assignment').' '.$fullname); @@ -1223,23 +1300,22 @@ ENDPART my $urlp = $list_of_files[$i]; $urlp=~s|//|/|; if ($urlp=~/\//) { - my %form; - $form{'grade_target'}='tex'; - $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth); + $form{'problem_split'}=$parmhash{'problem_stream_switch'}; $form{'rndseed'}=$rndseed; if ($urlp =~ m|/home/([^/]+)/public_html|) { $urlp =~ s|/home/([^/]*)/public_html|/~$1|; } else { $urlp =~ s|^$Apache::lonnet::perlvar{'lonDocRoot'}||; } + $resources_printed .= $urlp.':'; my $texversion=&Apache::lonnet::ssi($urlp,%form); if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { - my %form; $form{'grade_target'}='answer'; $form{'answer_output_mode'}='tex'; $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; $form{'rndseed'}=$rndseed; + $resources_printed .= $urlp.':'; my $answer=&Apache::lonnet::ssi($urlp,%form); if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; @@ -1292,10 +1368,11 @@ ENDPART $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'} /; } + #-- writing .tex file in prtspool my $temp_file; 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)) { unless ($temp_file = Apache::File->new('>'.$filename)) { $r->log_error("Couldn't open $filename for output $!"); @@ -1335,9 +1412,9 @@ ENDPART if ($#student_names>-1) { $student_names=$student_names[0].'_ENDPERSON_'; } else { - my $fullname = &get_name($ENV{'user.name'},$ENV{'user.domain'}); - $student_names=join(':',$ENV{'user.name'},$ENV{'user.domain'}, - $ENV{'request.course.sec'},$fullname). + my $fullname = &get_name($env{'user.name'},$env{'user.domain'}); + $student_names=join(':',$env{'user.name'},$env{'user.domain'}, + $env{'request.course.sec'},$fullname). '_ENDPERSON_'.'_END_'; } } @@ -1354,19 +1431,27 @@ ENDPART $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, 'cgi.'.$identifier.'.layout' => $laystyle, 'cgi.'.$identifier.'.numcol' => $numberofcolumns, 'cgi.'.$identifier.'.paper' => $papersize, 'cgi.'.$identifier.'.selection' => $selectionmade, - 'cgi.'.$identifier.'tableofcontents' => $helper->{'VARS'}->{'TABLE_CONTENTS'}, - 'cgi.'.$identifier.'tableofindex' => $helper->{'VARS'}->{'TABLE_INDEX'}, - 'cgi.'.$identifier.'role' => $ENV{'request.role.adv'}, - 'cgi.'.$identifier.'numberoffiles' => $#print_array, - 'cgi.'.$identifier.'studentnames' => $student_names, - 'cgi.'.$identifier.'backref' => $URLback,); - + 'cgi.'.$identifier.'.tableofcontents' => $helper->{'VARS'}->{'TABLE_CONTENTS'}, + 'cgi.'.$identifier.'.tableofindex' => $helper->{'VARS'}->{'TABLE_INDEX'}, + 'cgi.'.$identifier.'.role' => $env{'request.role.adv'}, + 'cgi.'.$identifier.'.numberoffiles' => $#print_array, + 'cgi.'.$identifier.'.studentnames' => $student_names, + '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(< @@ -1399,8 +1484,10 @@ sub get_CODE { } 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 $printed = ''; my ($username,$userdomain,$usersection) = split /:/,$person; my $fullname = &get_name($username,$userdomain); my $namepostfix; @@ -1408,28 +1495,39 @@ sub print_resources { $namepostfix="\\\\Name: "; $fullname = "CODE - ".$moreenv->{'CODE'}; } + my $i = 0; #goes through all resources, checks if they are available for #current student, and produces output &Apache::lonnet::delenv('form.counter'); &Apache::lonxml::init_counter(); + + my %page_breaks = &get_page_breaks($helper); + foreach my $curresline (@{$master_seq}) { + if (defined $page_breaks{$curresline}) { + if($i != 0) { + $current_output.= "\\newpage\n"; + } + } + $i++; if ( !($type eq 'problems' && ($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library)$/)) ) { my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline); if (&Apache::lonnet::allowed('bre',$res_url)) { 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 $envfile=$ENV{'user.environment'}; + my $envfile=$env{'user.environment'}; $envfile=~/\/([^\/]+)\.id$/; $envfile=$1; &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') || ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { $moreenv->{'answer_output_mode'}='tex'; $moreenv->{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; - my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$ENV{'request.course.id'},%{$moreenv}); + my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$env{'request.course.id'},%{$moreenv}); &Apache::lonnet::appenv(('form.counter' => $current_counter)); if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { $rendered=~s/(\\keephidden{ENDOFPROBLEM})/$ansrendered$1/; @@ -1447,13 +1545,14 @@ sub print_resources { } $current_output .= $rendered; } 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 $envfile=$ENV{'user.environment'}; + my $envfile=$env{'user.environment'}; $envfile=~/\/([^\/]+)\.id$/; $envfile=$1; &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') { $rendered = &latex_header_footer_remove($rendered); } else { @@ -1485,7 +1584,7 @@ sub print_resources { 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; } - return ($current_output,$fullname); + return ($current_output,$fullname, $printed); } @@ -1498,7 +1597,7 @@ sub handler { # if ($loaderror) { return $loaderror; } # $loaderror= # &Apache::lonnet::overloaderror($r, -# $ENV{'course.'.$ENV{'request.course.id'}.'.home'}); +# $env{'course.'.$env{'request.course.id'}.'.home'}); # if ($loaderror) { return $loaderror; } my $result = printHelper($r); @@ -1511,19 +1610,28 @@ sub handler { # foreach $key (keys %{$helper->{'VARS'}}) { # $r->print(' '.$key.'->'.$helper->{'VARS'}->{$key}.'<-
'); # } -# foreach $key (keys %ENV) { -# $r->print(' '.$key.'->'.$ENV{$key}.'<-
'); +# foreach $key (keys %env) { +# $r->print(' '.$key.'->'.$env{$key}.'<-
'); # } # return OK; - my %parmhash=&Apache::lonnet::coursedescription($ENV{'request.course.id'}); - + my %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'}); + # my $key; # foreach $key (keys %parmhash) { # $r->print(' '.$key.'->'.$parmhash{$key}.'<-
'); # } -# 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); return OK; } @@ -1543,7 +1651,7 @@ sub printHelper { my $r = shift; if ($r->header_only) { - if ($ENV{'browser.mathml'}) { + if ($env{'browser.mathml'}) { &Apache::loncommon::content_type($r,'text/xml'); } else { &Apache::loncommon::content_type($r,'text/html'); @@ -1553,7 +1661,7 @@ sub printHelper { } # Send header, nocache - if ($ENV{'browser.mathml'}) { + if ($env{'browser.mathml'}) { &Apache::loncommon::content_type($r,'text/xml'); } else { &Apache::loncommon::content_type($r,'text/html'); @@ -1577,29 +1685,51 @@ sub printHelper { $helper->declareVar('assignment'); $helper->declareVar('style_file'); $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 # very first screen. # 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}->{'construction'} = 1; } else { - if ($ENV{'form.postdata'}) { - $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($ENV{'form.postdata'}); + if ($env{'form.postdata'}) { + $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($env{'form.postdata'}); } - if ($ENV{'form.symb'}) { - $helper->{VARS}->{'symb'} = $ENV{'form.symb'}; + if ($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'}); } } - if ($ENV{'form.symb'}) { - $helper->{VARS}->{'symb'} = $ENV{'form.symb'}; + if ($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'}); } @@ -1631,17 +1761,17 @@ sub printHelper { } $subdir = &Apache::lonnet::filelocation("", $url); } - if (!$helper->{VARS}->{'curseed'} && $ENV{'form.curseed'}) { - $helper->{VARS}->{'curseed'}=$ENV{'form.curseed'}; + if (!$helper->{VARS}->{'curseed'} && $env{'form.curseed'}) { + $helper->{VARS}->{'curseed'}=$env{'form.curseed'}; } - if (!$helper->{VARS}->{'probstatus'} && $ENV{'form.problemtype'}) { - $helper->{VARS}->{'probstatus'}=$ENV{'form.problemtype'}; + if (!$helper->{VARS}->{'probstatus'} && $env{'form.problemtype'}) { + $helper->{VARS}->{'probstatus'}=$env{'form.problemtype'}; } my $userCanSeeHidden = Apache::lonnavmaps::advancedUser(); - my $userPriviledged = ($ENV{'request.role'}=~m/^cc\./ or - $ENV{'request.role'}=~m/^in\./ or - $ENV{'request.role'}=~m/^ta\./); + my $userPriviledged = ($env{'request.role'}=~m/^cc\./ or + $env{'request.role'}=~m/^in\./ or + $env{'request.role'}=~m/^ta\./); Apache::lonhelper::registerHelperTags(); @@ -1684,11 +1814,12 @@ sub printHelper { $helper->declareVar('SEQUENCE'); # Useful for debugging: Dump the help vars - #$r->print(Dumper($helper->{VARS})); - #$r->print($map); +# $r->print(Dumper($helper->{VARS})); +# $r->print($map); # If we're in a sequence... if (($helper->{'VARS'}->{'construction'} ne '1') && + $helper->{VARS}->{'postdata'} && $helper->{VARS}->{'assignment'}) { # Allow problems from sequence @@ -1705,6 +1836,7 @@ sub printHelper { return $isProblem; $map return $symbFilter; +