--- loncom/interface/lonprintout.pm 2007/01/15 11:53:50 1.495 +++ loncom/interface/lonprintout.pm 2008/01/14 10:43:12 1.511 @@ -2,7 +2,7 @@ # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.495 2007/01/15 11:53:50 foxr Exp $ +# $Id: lonprintout.pm,v 1.511 2008/01/14 10:43:12 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -38,6 +38,8 @@ use Apache::grades; use Apache::edit; use Apache::File(); use Apache::lonnavmaps; +use Apache::admannotations; + use LONCAPA::map(); use POSIX qw(strftime); use Apache::lonlocal; @@ -48,6 +50,49 @@ my %perm; my %parmhash; my $resources_printed; +# Fetch the contents of a resource, uninterpreted. +# This is used here to fetch a latex file to be included +# verbatim into the printout< +# NOTE: Ask Guy if there is a lonnet function similar to this? +# +# Parameters: +# URL of the file +# +sub fetch_raw_resource { + my ($url) = @_; + + my $filename = &Apache::lonnet::filelocation("", $url); + my $contents = &Apache::lonnet::getfile($filename); + + if ($contents == -1) { + return "File open failed for $filename"; # This will bomb the print. + } + return $contents; + + +} + +# Fetch the annotations associated with a URL and +# put a centered 'annotations:' title. +# This is all suppressed if the annotations are empty. +# +sub annotate { + my ($symb) = @_; + + my $annotation_text = &Apache::admannotations::get_annotation($symb, 1); + + + my $result = ""; + + if (length($annotation_text) > 0) { + $result .= '\\hspace*{\\fill} \\\\[\\baselineskip] \textbf{Annotations:} \\\\ '; + $result .= "\n"; + $result .= &Apache::lonxml::latex_special_symbols($annotation_text,""); # Escape latex. + $result .= "\n\n"; + } + return $result; +} + # # printf_style_subst item format_string repl # @@ -723,7 +768,7 @@ my %page_formats= '2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','0.275 in'] }, 'album' => { - '1' => [ '8.8 in', '6.8 in','-0.55 in', '-0.55 in','1.0 in'], + '1' => [ '8.8 in', '6.8 in','-0.55 in', '-0.55 in','0.394 in'], '2' => [ '4.8 in', '6.8 in','-0.5 in', '-1.0 in','3.5 in'] }, }, @@ -780,10 +825,10 @@ my %page_formats= 'a4' => { 'book' => { '1' => ['17.6 cm','27.2 cm','-1.397 cm','-2.11 cm','-1.27 cm'], - '2' => [ '9.1 cm','27.2 cm','-1.397 c,','-2.11 cm','-1.27 cm'] + '2' => [ '9.1 cm','27.2 cm','-1.397 cm','-2.11 cm','-1.27 cm'] }, 'album' => { - '1' => ['21.59 cm','19.558 cm','-1.27 cm','-2.11 cm','0 cm'], + '1' => ['21.59 cm','19.558 cm','-1.397cm','-2.11 cm','0 cm'], '2' => ['9.91 cm','19.558 cm','-1.397 cm','-2.11 cm','0 cm'] }, }, @@ -845,7 +890,11 @@ sub page_format_transformation { my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin); if ($selectionmade eq '4') { - $assignment='Problems from the Whole Course'; + if ($choice eq 'all_problems') { + $assignment='Problems from the Whole Course'; + } else { + $assignment='Resources from the Whole Course'; + } } else { $assignment=&Apache::lonxml::latex_special_symbols($assignment,'header'); } @@ -1265,6 +1314,7 @@ sub output_data { my ($r,$helper,$rparmhash) = @_; my %parmhash = %$rparmhash; $resources_printed = ''; + my $do_postprocessing = 1; my $js = < var editbrowser; @@ -1344,6 +1394,14 @@ ENDPART if ($helper->{'VARS'}->{'showallfoils'} eq "1") { $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'}; } + + if ($helper->{'VARS'}->{'style_file'}=~/\w/) { + &Apache::lonnet::appenv('construct.style' => + $helper->{'VARS'}->{'style_file'}); + } elsif ($env{'construct.style'}) { + &Apache::lonnet::delenv('construct\\.style'); + } + if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'current_document') { #-- single document - problem, page, html, xml, ... @@ -1367,18 +1425,16 @@ ENDPART if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') { my %moreenv; $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 $put_result = &Apache::lonnet::put('environment',{'construct.style'=>$helper->{'VARS'}->{'style_file'}},$dom,$user); - } if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {$form{'problemtype'}='exam';} $form{'problem_split'}=$parmhash{'problem_stream_switch'}; $form{'suppress_tries'}=$parmhash{'suppress_tries'}; $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; $form{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'}; - if ($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') {$form{'problem_split'}='yes';} + $form{'print_annotations'}=$helper->{'VARS'}->{'PRINT_ANNOTATIONS'}; + if (($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') || + ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes')) { + $form{'problem_split'}='yes'; + } if ($helper->{'VARS'}->{'curseed'}) { $rndseed=$helper->{'VARS'}->{'curseed'}; } @@ -1390,6 +1446,8 @@ ENDPART $resources_printed .= $currentURL.':'; $texversion.=&Apache::lonnet::ssi($currentURL,%form); + # Add annotations if required: + &Apache::lonxml::clear_problem_counter(); &Apache::lonnet::delenv('request.filename'); @@ -1408,6 +1466,8 @@ ENDPART } $resources_printed .= $currentURL.':'; my $answer=&Apache::lonnet::ssi($currentURL,%form); + + if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; } else { @@ -1421,11 +1481,24 @@ ENDPART $texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm '; my $URLpath=$cleanURL; $URLpath=~s/~([^\/]+)/public_html\/$1\/$1/; - $texversion.=&path_to_problem ($URLpath,$LaTeXwidth); + $texversion.=&path_to_problem($URLpath,$LaTeXwidth); } $texversion.='\vskip 1 mm '.$answer.'\end{document}'; } + + + + } + # Print annotations. + + + if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { + my $annotation .= &annotate($currentURL); + $texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/; + } + + if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { $texversion=&IndexCreation($texversion,$currentURL); } @@ -1454,7 +1527,24 @@ ENDPART if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;} $resources_printed .= $currentURL.':'; my $texversion=&Apache::lonnet::ssi($currentURL,%form); + if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { + my $annotation = &annotate($currentURL); + $texversion =~ s/(\\end{document})/$annotation$1/; + } $result .= $texversion; + } elsif ($cleanURL =~/.tex$/) { + # For this sort of print of a single LaTeX file, + # We can just print the LaTeX file as it is uninterpreted in any way: + # + + $result = &fetch_raw_resource($currentURL); + if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { + my $annotation = &annotate($currentURL); + $result =~ s/(\\end{document})/$annotation$1/; + } + + $do_postprocessing = 0; # Don't massage the result. + } else { $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'}, $helper->{'VARS'}->{'symb'}); @@ -1464,6 +1554,8 @@ ENDPART ($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') { $selectionmade = 2; @@ -1480,7 +1572,11 @@ ENDPART $form{'suppress_tries'}=$parmhash{'suppress_tries'}; $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; $form{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'}; - if ($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') {$form{'problem_split'}='yes';} + $form{'print_annotations'} = $helper->{'VARS'}->{'PRINT_ANNOTATIONS'}; + if (($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') || + ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') ) { + $form{'problem_split'}='yes'; + } my $flag_latex_header_remove = 'NO'; my $flag_page_in_sequence = 'NO'; my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; @@ -1510,7 +1606,6 @@ ENDPART if ($urlp!~m|^/adm/| && $urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { $resources_printed .= $urlp.':'; - &Apache::lonxml::remember_problem_counter(); $texversion.=&Apache::lonnet::ssi($urlp,%form); if ($urlp=~/\.page$/) { @@ -1547,7 +1642,13 @@ ENDPART $texversion=''; } } + + } + if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { + my $annotation .= &annotate($urlp); + $texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/; } + if ($flag_latex_header_remove ne 'NO') { $texversion = &latex_header_footer_remove($texversion); } else { @@ -1579,6 +1680,11 @@ ENDPART if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;} $resources_printed .= $urlp.':'; my $texversion=&Apache::lonnet::ssi($urlp,%form); + if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { + my $annotation = &annotate($urlp); + $texversion =~ s/(\\end{document)/$annotation$1/; + } + if ($flag_latex_header_remove ne 'NO') { $texversion = &latex_header_footer_remove($texversion); } else { @@ -1654,9 +1760,13 @@ ENDPART $moreenv{'instructor_comments'}='hide'; $moreenv{'textwidth'}=&get_textwidth($helper,$LaTeXwidth); $moreenv{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'}; + $moreenv{'print_annotations'} = $helper->{'VARS'}->{'PRINT_ANNOTATIONS'}; $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') || + ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} 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; my $i = 0; @@ -1859,15 +1969,20 @@ ENDPART $result .= '\end{document}'; } #-------------------------------------------------------- corrections for the different page formats - $result = &page_format_transformation($papersize,$laystyle,$numberofcolumns,$helper->{'VARS'}->{'PRINT_TYPE'},$result,$helper->{VARS}->{'assignment'},$helper->{'VARS'}->{'TABLE_CONTENTS'},$helper->{'VARS'}->{'TABLE_INDEX'},$selectionmade); - $result = &latex_corrections($number_of_columns,$result,$selectionmade, - $helper->{'VARS'}->{'ANSWER_TYPE'}); - #if ($numberofcolumns == 1) { + + # Only post process if that has not been turned off e.g. by a raw latex resource. + + if ($do_postprocessing) { + $result = &page_format_transformation($papersize,$laystyle,$numberofcolumns,$helper->{'VARS'}->{'PRINT_TYPE'},$result,$helper->{VARS}->{'assignment'},$helper->{'VARS'}->{'TABLE_CONTENTS'},$helper->{'VARS'}->{'TABLE_INDEX'},$selectionmade); + $result = &latex_corrections($number_of_columns,$result,$selectionmade, + $helper->{'VARS'}->{'ANSWER_TYPE'}); + #if ($numberofcolumns == 1) { $result =~ s/\\textwidth\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textwidth= $helper->{'VARS'}->{'pagesize.width'} $helper->{'VARS'}->{'pagesize.widthunit'} /; $result =~ s/\\textheight\s*=?\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textheight $helper->{'VARS'}->{'pagesize.height'} $helper->{'VARS'}->{'pagesize.heightunit'} /; $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; @@ -1927,10 +2042,7 @@ ENDPART } my $URLback=''; #link to original document - if ($helper->{'VARS'}->{'construction'} ne '1') { - #prints published resource - $URLback=&escape('/adm/flip?postdata=return:'); - } else { + if ($helper->{'VARS'}->{'construction'} eq '1') { #prints resource from the construction space $URLback='/'.$helper->{'VARS'}->{'filename'}; if ($URLback=~/([^?]+)/) { @@ -2019,6 +2131,7 @@ sub print_resources { # postscript. Each ENDOFSTUDENTSTAMP will go on a line by itself. # + foreach my $curresline (@{$master_seq}) { if (defined $page_breaks{$curresline}) { if($i != 0) { @@ -2026,6 +2139,7 @@ sub print_resources { } } $i++; + if ( !($type eq 'problems' && ($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library)$/)) ) { my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline); @@ -2064,6 +2178,12 @@ sub print_resources { $rendered = $header.$body; } } + + if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { + my $url = &Apache::lonnet::clutter($res_url); + my $annotation = &annotate($url); + $rendered =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/; + } if ($remove_latex_header eq 'YES') { $rendered = &latex_header_footer_remove($rendered); } else { @@ -2073,7 +2193,11 @@ sub print_resources { } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { $printed .= $curresline.':'; my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv); - + if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { + my $url = &Apache::lonnet::clutter($res_url); + my $annotation = &annotate($url); + $annotation =~ s/(\\end{document})/$annotation$1/; + } if ($remove_latex_header eq 'YES') { $rendered = &latex_header_footer_remove($rendered); } else { @@ -2180,6 +2304,28 @@ sub init_perm { } } +sub get_randomly_ordered_warning { + my ($helper,$map) = @_; + + my $message; + + my $postdata = $env{'form.postdata'} || $helper->{VARS}{'postdata'}; + my $navmap = Apache::lonnavmaps::navmap->new(); + my $res = $navmap->getResourceByUrl($map); + if ($res) { + my $func = + sub { return ($_[0]->is_map() && $_[0]->randomorder); }; + my @matches = $navmap->retrieveResources($res, $func,1,1,1); + if (@matches) { + $message = "Some of the items below are in folders set to be randomly ordered. However, when printing the contents of these folders, they will be printed in the original order for all students, not the randomized order."; + } + } + if ($message) { + return ''.$message.''; + } + return; +} + sub printHelper { my $r = shift; @@ -2406,8 +2552,8 @@ HELPERFRAGMENT if ($perm{'pfo'} && !$is_published && ($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { - push @{$printChoices}, ['Selected Problems from entire course', 'all_problems', 'ALL_PROBLEMS']; - push @{$printChoices}, ['Selected Resources from entire course', 'all_resources', 'ALL_RESOURCES']; + push @{$printChoices}, [&mtn('Selected Problems from entire course'), 'all_problems', 'ALL_PROBLEMS']; + push @{$printChoices}, [&mtn('Selected Resources from entire course'), 'all_resources', 'ALL_RESOURCES']; &Apache::lonxml::xmlparse($r, 'helper', < Problems from folder [_1] for CODEd assignments",$sequenceTitle), 'problems_for_anon', 'CHOOSE_ANON1']; } + my $randomly_ordered_warning = + &get_randomly_ordered_warning($helper,$map); + # resource_selector will hold a few states that: # - Allow resources to be selected for printing. # - Determine pagination between assignments. @@ -2446,6 +2595,8 @@ ALL_PROBLEMS # my $resource_selector=< + $randomly_ordered_warning + PRINT_FORMATTING
Select resources for the assignment
- Names to store the CODEs under for later: + Names to save the CODEs under for later: @@ -2613,6 +2764,8 @@ CHOOSE_ANON1 $resource_selector=< + $randomly_ordered_warning + PRINT_FORMATTING
Select resources for the assignment
- Names to store the CODEs under for later: + Names to save the CODEs under for later: @@ -2752,7 +2905,7 @@ CHOOSE_FROM_SUBDIR # Allow the user to select any sequence in the course, feed it to # another resource selector for that sequence if (!$helper->{VARS}->{'construction'} && !$is_published) { - push @$printChoices, ["Selected Resources from selected folder in course", + push @$printChoices, [&mtn("Selected Resources from selected folder in course"), 'select_sequences', 'CHOOSE_SEQUENCE']; my $escapedSequenceName = $helper->{VARS}->{'SEQUENCE'}; #Escape apostrophes and backslashes for Perl @@ -2798,7 +2951,10 @@ CHOOSE_FROM_ANY_SEQUENCE if (($perm{'pav'} and &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) or ($helper->{VARS}->{'construction'} eq '1')) { - addMessage("
Print: "); + addMessage("
". + ': "); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = 'ANSWER_TYPE'; $helper->declareVar('ANSWER_TYPE'); @@ -2814,10 +2970,16 @@ CHOOSE_FROM_ANY_SEQUENCE if ($perm{'pav'}) { if (!$startedTable) { - addMessage("
LaTeX mode: "); + addMessage("
"); if (not $helper->{VARS}->{'construction'}) { - addMessage(""); - addMessage(""); + # Prompt for printing annotations too. + + addMessage(""); + addMessage(" RNDSEED &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag); - $helper->{'VARS'}->{'style_file'}=$env{'form.style_file_value'}; - } } @@ -2996,6 +3192,8 @@ sub render { my $PageLayout=&mt('Page layout'); my $NumberOfColumns=&mt('Number of columns'); my $PaperType=&mt('Paper type'); + my $landscape=&mt('Landscape'); + my $portrait=&mt('Portrait'); $result .= < @@ -3007,8 +3205,8 @@ sub render {
". + ': "); $startedTable = 1; } else { - addMessage("
LaTeX mode: "); + addMessage("
". + ': "); } $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = 'LATEX_TYPE'; @@ -2833,7 +2995,10 @@ CHOOSE_FROM_ANY_SEQUENCE } Apache::lonhelper::dropdown->new(); - addMessage("
Print Table of Contents: "); + addMessage("
". + ': "); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = 'TABLE_CONTENTS'; $helper->declareVar('TABLE_CONTENTS'); @@ -2844,7 +3009,10 @@ CHOOSE_FROM_ANY_SEQUENCE addMessage("
Print Index: "); + addMessage("
". + ': "); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = 'TABLE_INDEX'; $helper->declareVar('TABLE_INDEX'); @@ -2853,7 +3021,10 @@ CHOOSE_FROM_ANY_SEQUENCE ['Yes', 'yes'] ]; Apache::lonhelper::dropdown->new(); addMessage("
Print Discussions: "); + addMessage("
". + ': "); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = 'PRINT_DISCUSSIONS'; $helper->declareVar('PRINT_DISCUSSIONS'); @@ -2863,6 +3034,21 @@ CHOOSE_FROM_ANY_SEQUENCE Apache::lonhelper::dropdown->new(); addMessage("
". + ':"); + $paramHash = Apache::lonhelper::getParamHash(); + $paramHash->{'variable'} = "PRINT_ANNOTATIONS"; + $helper->declareVar("PRINT_ANNOTATIONS"); + $paramHash->{CHOICES} = [ + ['No', 'no'], + ['Yes', 'yes']]; + Apache::lonhelper::dropdown->new(); + addMessage("
"); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'multichoice'} = "true"; @@ -2874,24 +3060,34 @@ CHOOSE_FROM_ANY_SEQUENCE } if ($helper->{'VARS'}->{'construction'}) { - my $stylevalue=$env{'construct.style'}; + my $stylevalue='$Apache::lonnet::env{"construct.style"}'; + my $randseedtext=&mt("Use random seed"); + my $stylefiletext=&mt("Use style file"); + my $selectfiletext=&mt("Select style file"); + my $xmlfrag .= <<"RNDSEED"; -
Use random seed: +
+ : + return $helper->{VARS}->{'curseed'}; -
Use style file: -   Select style file
+
+ : + + + + return $stylevalue; + +   $selectfiletext
- Show all foils? + Show all foils
-
- +
+
- + - + - +
Width:$text{'width'}
Height:$text{'height'}
Left margin:$text{'margin'}