--- loncom/interface/lonprintout.pm 2010/05/24 22:10:42 1.568.2.7 +++ loncom/interface/lonprintout.pm 2010/09/02 00:17:36 1.583.2.3 @@ -2,7 +2,7 @@ # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.568.2.7 2010/05/24 22:10:42 raeburn Exp $ +# $Id: lonprintout.pm,v 1.583.2.3 2010/09/02 00:17:36 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -196,14 +196,19 @@ sub generate_code_selector {


Generate new CODEd Assignments

' @@ -1715,11 +1730,10 @@ sub recently_generated { .'' .&Apache::loncommon::end_data_table_header_row() .$zip_result - .&Apache::loncommon::end_data_table() - ); + .&Apache::loncommon::end_data_table(); } if ($pdf_result) { - $r->print('

'.&mt('Recently generated printouts')."

\n" + $output .='

'.&mt('Recently generated printouts')."

\n" .&Apache::loncommon::start_data_table() .&Apache::loncommon::start_data_table_header_row() .'' @@ -1727,9 +1741,9 @@ sub recently_generated { .'' .&Apache::loncommon::end_data_table_header_row() .$pdf_result - .&Apache::loncommon::end_data_table() - ); + .&Apache::loncommon::end_data_table(); } + return $output; } # @@ -1742,7 +1756,7 @@ sub recently_generated { # # # use Data::Dumper; -#sub dump_helper_vars { +# sub dump_helper_vars { # my ($helper) = @_; # my $helpervars = Dumper($helper->{'VARS'}); # &Apache::lonnet::logthis("Dump of helper vars:\n $helpervars"); @@ -1757,6 +1771,122 @@ sub get_page_breaks { } return %page_breaks; } +# +# Returns text to insert for any extra vskip prior to the resource. +# Parameters: +# helper - Reference to the helper object driving the printout. +# resource - Identifies the resource about to be printed. +# +# This is done as follows: +# POSSIBLE_RESOURCES has the list of possible resources. +# EXTRASPACE has the list of extra space values. +# EXTRASPACE_UNITS is the set of resources for which the units are +# mm. All others are 'in'. +# +# The resource is found in the POSSIBLE_RESOURCES to get the index +# of the EXTRASPACE value. +# +# In order to speed this up for lengthy printouts, the first time, +# POSSIBLE_RESOURCES is turned into a look up hash and +# EXTRASPACE is turned into an array. +# + + +my %possible_resources; +my %extraspace_mm; +my @extraspace; +my $skips_loaded = 0; + +# Function to load the skips hash and array + +sub load_skips { + + my ($helper) = @_; + + # If this is the first time, unrap the resources and extra spaces: + + if (!$skips_loaded) { + @extraspace = (split(/\|\|\|/, $helper->{'VARS'}->{'EXTRASPACE'})); + my @resource_list = (split(/\|\|\|/, $helper->{'VARS'}->{'POSSIBLE_RESOURCES'})); + my $i = 0; + foreach my $resource (@resource_list) { + $possible_resources{$resource} = $i; + $i++; + } + foreach my $mm_resource (split(/\|\|\|/, $helper->{'VARS'}->{'EXTRASPACE_UNITS'})) { + $extraspace_mm{$mm_resource} = 1; + } + $skips_loaded = 1; + } +} + +sub get_extra_vspaces { + my ($helper, $resource) = @_; + + &load_skips($helper); + + # Lookup the resource in the possible resources hash.. that is the index + # into the extraspace array that gives us either an empty string or + # the number of mm to skip: + + my $index = $possible_resources{$resource}; + my $skip = $extraspace[$index]; + + my $result = ''; + if ($skip ne '') { + my $units = 'in'; + if (defined($extraspace_mm{$resource})) { + $units = 'mm'; + } + $result = '\vskip '.$skip.' '.$units; + } + + + return $result; + + +} + +# +# The resource chooser part of the helper needs more than just +# the value of the extraspaces var to recover the value into a text +# field option. This sub produces the required format for the saved var: +# specifically +# ||| separated fields of the form resourcename=value +# +# Parameters: +# $helper - Refers to the helper we are configuring +# Implicit input: +# $helper->{'VARS'}->{'EXTRASPACE'} - the spaces helper var has the text field +# value. +# $helper->{'VARS'}->{'EXTRASPACE_UNITS'} - units for the skips (checkboxes). +# $helper->{'VARS'}->{'POSSIBLE_RESOURCES'} - has the list of resources. ||| +# separated of course. +# Implicit outputs: +# $env{'form.extraspace'} +# $env{'form.extraspace_units'} +# +sub set_form_extraspace { + my ($helper) = @_; + + # the most convenient way to do this is to drive from the skips arrays/hash. + # may not be the fastest, but this is once per print request so it's not so + # speed critical: + + &load_skips($helper); + + my $result = ''; + + foreach my $resource (keys(%possible_resources)) { + my $vskip = $extraspace[$possible_resources{$resource}]; + $result .= $resource .'=' . $vskip . '|||'; + } + + $env{'form.extraspace'} = $result; + $env{'form.extraspace_units'} = $helper->{'VARS'}->{'EXTRASPACE_UNITS'}; + return $result; + +} # Output a sequence (recursively if neeed) # from construction space. @@ -1928,11 +2058,13 @@ ENDPART # indexed by symb and contains 1's for each break. $env{'form.pagebreaks'} = $helper->{'VARS'}->{'FINISHPAGE'}; + &set_form_extraspace($helper); $env{'form.lastprinttype'} = $helper->{'VARS'}->{'PRINT_TYPE'}; &Apache::loncommon::store_course_settings('print', {'pagebreaks' => 'scalar', + 'extraspace' => 'scalar', + 'extraspace_units' => 'scalar', 'lastprinttype' => 'scalar'}); - my %page_breaks = &get_page_breaks($helper); my $format_from_helper = $helper->{'VARS'}->{'FORMAT'}; @@ -1977,7 +2109,6 @@ ENDPART &Apache::lonnet::delenv('construct.style'); } - if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'current_document') { #-- single document - problem, page, html, xml, ... my ($currentURL,$cleanURL); @@ -2147,9 +2278,9 @@ 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') or ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_in_page') ) { @@ -2196,6 +2327,7 @@ ENDPART $result.="\\newpage\n"; } } + $result .= &get_extra_vspaces($helper, $master_seq[$i]); my ($sequence,$middle_thingy,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]); $urlp=&Apache::lonnet::clutter($urlp); $form{'symb'}=$master_seq[$i]; @@ -2211,7 +2343,13 @@ ENDPART &Apache::lonxml::remember_problem_counter(); if ($flag_latex_header_remove eq 'NO') { $texversion.=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); # RF - $flag_latex_header_remove = 'YES'; + unless (($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') || + (($i==0) && + (($urlp=~/\.page$/) || + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_in_page') || + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page')))) { + $flag_latex_header_remove = 'YES'; + } } $texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %form); if ($urlp=~/\.page$/) { @@ -2219,7 +2357,7 @@ ENDPART if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} $texversion =~ s/\\end{document}\d*/\\end{document}/; $flag_page_in_sequence = 'YES'; - } + } if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { @@ -2231,13 +2369,22 @@ ENDPART &Apache::lonxml::restore_problem_counter(); my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform); - + if ($urlp =~ /\.page$/) { + $answer =~ s/\\end{document}(\d*)$//; + } if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { - $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; + if ($urlp =~ /\.page$/) { + my @probs = split(/\\keephidden{ENDOFPROBLEM}/,$texversion); + my $lastprob = pop(@probs); + $texversion = join('\keephidden{ENDOFPROBLEM}',@probs). + $answer.'\keephidden{ENDOFPROBLEM}'.$lastprob; + } else { + $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; + } } else { - if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) { + if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/) { $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); - $texversion =~ s/\\begin{document}//; +# $texversion =~ s/\\begin{document}//; # FIXME my $title = &Apache::lonnet::gettitle($master_seq[$i]); $title = &Apache::lonxml::latex_special_symbols($title); my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; @@ -2267,7 +2414,7 @@ ENDPART if (($selectionmade == 4) and ($assignment ne $prevassignment)) { my $name = &get_name(); my $courseidinfo = &get_course(); - if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } + if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } $prevassignment=$assignment; my $header_text = $parmhash{'print_header_format'}; $header_text = &format_page_header($textwidth, $header_text, @@ -2331,7 +2478,7 @@ ENDPART } $result .= $texversion; $flag_latex_header_remove = 'YES'; - } + } if (&Apache::loncommon::connection_aborted($r)) { last; } @@ -2432,7 +2579,8 @@ ENDPART $resources_printed .= ":"; $print_array[$i].=$output; $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); + &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student'); $flag_latex_header_remove = 'YES'; if (&Apache::loncommon::connection_aborted($r)) { last; } } @@ -2802,10 +2950,11 @@ sub print_resources { $current_output.= "\\newpage\n"; } } + $current_output .= &get_extra_vspaces($helper, $curresline); $i++; if ( !($type eq 'problems' && - ($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library)$/)) ) { + ($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) ) { my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline); if (&Apache::lonnet::allowed('bre',$res_url)) { if ($res_url!~m|^ext/| @@ -2814,6 +2963,18 @@ sub print_resources { &Apache::lonxml::remember_problem_counter(); my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv); + if ($res_url =~ /\.page$/) { + if ($remove_latex_header eq 'NO') { + if (!($rendered =~ /\\begin\{document\}/)) { + $rendered = &print_latex_header().$rendered; + } + } + if ($remove_latex_header eq 'YES') { + $rendered = &latex_header_footer_remove($rendered); + } else { + $rendered =~ s/\\end{document}\d*//; + } + } if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { # Use a copy of the hash so we don't pervert it on future loop passes. @@ -2831,7 +2992,9 @@ sub print_resources { my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); - $header =~ s/\\begin{document}//; #<<<<< + unless ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') { + $header =~ s/\\begin{document}//; #<<<<< + } my $title = &Apache::lonnet::gettitle($curresline); $title = &Apache::lonxml::latex_special_symbols($title); my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; @@ -2892,7 +3055,9 @@ sub print_resources { if (&Apache::loncommon::connection_aborted($r)) { last; } } - + if ($syllabus_first) { + $current_output =~ s/\\\\ Last updated:/Last updated:/ + } my $courseidinfo = &get_course(); if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection} @@ -2903,11 +3068,8 @@ sub print_resources { my $header_start = ($columns_in_format == 1) ? '\lhead' : '\fancyhead[LO]'; $header_line = $header_start.'{'.$header_line.'}'; - if ($current_output=~/\\documentclass/ && (!$syllabus_first)) { + if ($current_output=~/\\documentclass/) { $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$header_line$namepostfix}\\vskip 5 mm /; - } elsif ($syllabus_first) { - - $current_output =~ s/\\\\ Last updated:/Last updated:/ } else { my $blankpages = '\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'}; @@ -3051,19 +3213,21 @@ sub printHelper { $helper->declareVar('PRINT_TYPE'); $helper->declareVar("showallfoils"); $helper->declareVar("STUDENTS"); - + $helper->declareVar("EXTRASPACE"); - # The page breaks can get loaded initially from the course environment: + # The page breaks and extra spaces + # can get loaded initially from the course environment: # But we only do this in the initial state so that they are allowed to change. # - # $helper->{VARS}->{FINISHPAGE} = ''; &Apache::loncommon::restore_course_settings('print', {'pagebreaks' => 'scalar', + 'extraspace' => 'scalar', + 'extraspace_units' => 'scalar', 'lastprinttype' => 'scalar'}); # This will persistently load in the data we want from the @@ -3073,10 +3237,15 @@ sub printHelper { if (!defined ($env{"form.CURRENT_STATE"})) { $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'}; + $helper->{VARS}->{EXTRASPACE} = $env{'form.extraspace'}; + $helper->{VARS}->{EXTRASPACE_UNITS} = $env{'form.extraspace_units'}; } else { my $state = $env{"form.CURRENT_STATE"}; if ($state eq "START") { $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'}; + $helper->{VARS}->{EXTRASPACE} = $env{'form.extraspace'}; + $helper->{VARS}->{EXTRASPACE_UNITS} = $env{'form.extraspace_units'}; + } } @@ -3195,7 +3364,16 @@ sub printHelper { if ($perm{'pav'}) { $start_new_option = "
Number of CODEd assignments to print: - + if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) && !\$helper->{'VARS'}{'REUSE_OLD_CODES'} && !\$helper->{'VARS'}{'SINGLE_CODE'} && - !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { + !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'} ) { + return "You need to specify the number of assignments to print"; } + if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) >= 1) && + (\$helper->{'VARS'}{'SINGLE_CODE'} ne '') ) { + return 'Specifying number of codes to print and a specific code is not compatible'; + } return undef; @@ -228,6 +233,8 @@ sub generate_code_selector { !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'}, \$helper->{'VARS'}{'CODE_OPTION'}); + } elsif (\$helper->{'VARS'}{'SINGLE_CODE'} ne ''){ + return 'Specifying a code name is incompatible with specifying number of codes.'; } else { return undef; # Other forces control us. } @@ -312,10 +319,12 @@ sub set_font_size { if ($font_size ne '') { - $text =~ s/\\begin{document}/\\begin{document}{\\$font_size/; + $text =~ s/\\begin{document}/\\begin{document}{\\$font_size/; } $text =~ s/\\end{document}/}\\end{document}/; return $text; + + } # include_pdf - PDF files are included into the @@ -499,10 +508,13 @@ sub printf_style_subst { # %a - Assignment name. # %c - Course name. # %n - Student name. +# %s - The section if it is supplied. # sub format_page_header { my ($width, $format, $assignment, $course, $student) = @_; + + $width = &recalcto_mm($width); # Get width in mm. my $chars_per_line = int($width/2); # Character/textline. @@ -543,10 +555,11 @@ sub format_page_header { $format = &printf_style_subst("a", $format, $assignment); $format = &printf_style_subst("c", $format, $course); $format = &printf_style_subst("n", $format, $student); - - # If the user put %'s in the format string, they must be escaped + + # If the user put %'s in the format string, they must be escaped # to \% else LaTeX will think they are comments and terminate # the line.. which is bad!!! + } return $format; @@ -1288,13 +1301,13 @@ sub page_format_transformation { $text =~ s/\\pagestyle{fancy}\\rhead{}\\chead{}\s*\\begin{document}/\\textheight = $textheight\\oddsidemargin = $evenoffset\n\\evensidemargin = $evenoffset $topmargintoinsert\\textwidth= $textwidth\\newlength{\\minipagewidth}\n\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1} \\vskip 5 mm\n /; } if ($papersize eq 'a4') { - my $papersize_text; - if ($perm{'pav'}) { - $papersize_text = '\\special{papersize=210mm,297mm}'; - } else { - $papersize_text = '\special{papersize=210mm,297mm}'; - } - $text =~ s/(\\begin{document})/$1$papersize_text/; + my $papersize_text; + if ($perm{'pav'}) { + $papersize_text = '\\special{papersize=210mm,297mm}'; + } else { + $papersize_text = '\special{papersize=210mm,297mm}'; + } + $text =~ s/(\\begin{document})/$1$papersize_text/; } } if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;} @@ -1525,7 +1538,9 @@ sub print_page_in_course { my $title=&Apache::lonnet::gettitle($symb); $title = &Apache::lonxml::latex_special_symbols($title); } else { - $result.=$currentURL; + my $esc_currentURL= $currentURL; + $esc_currentURL =~ s/_/\\_/g; + $result.=$esc_currentURL; } $result .= '\\\\'; @@ -1555,7 +1570,7 @@ sub print_page_in_course { } # these resources go through the XML transformer: - elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { + elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { my $urlp = &Apache::lonnet::clutter($resource_src); my %form; my %moreenv; @@ -1566,7 +1581,7 @@ sub print_page_in_course { $form{'grade_target'} = 'tex'; $form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); - $form{'pdfFormFields'} = 'no'; + $form{'pdfFormFields'} = 'no'; $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'}; $form{'problem_split'}=$parmhash{'problem_stream_switch'}; @@ -1670,8 +1685,8 @@ sub print_page_in_course { # List of recently generated print files # sub recently_generated { - my $r=shift; - my $prtspool=$r->dir_config('lonPrtDir'); + my ($prtspool) = @_; + my $output; my $zip_result; my $pdf_result; opendir(DIR,$prtspool); @@ -1704,10 +1719,10 @@ sub recently_generated { if ($ext eq 'zip') { $zip_result .= $result; } } if ($zip_result || $pdf_result) { - $r->print('
'); + $output ='
'; } if ($zip_result) { - $r->print('

'.&mt('Recently generated printout zip files')."

\n" + $output .='

'.&mt('Recently generated printout zip files')."

\n" .&Apache::loncommon::start_data_table() .&Apache::loncommon::start_data_table_header_row() .'
'.&mt('Download').''.&mt('File Size (Bytes)').''.&mt('Download').''.&mt('File Size (Bytes)').'
HTML $result.=&Apache::loncommon::end_data_table_row()
Number of CODEd assignments to print: - + if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) && !\$helper->{'VARS'}{'REUSE_OLD_CODES'} && @@ -3574,6 +3752,10 @@ CHOOSE_STUDENTS1 !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { return "You need to specify the number of assignments to print"; } + if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) >= 1) && + (\$helper->{'VARS'}{'SINGLE_CODE'} ne '') ) { + return 'Specifying number of codes to print and a specific code is not compatible'; + } return undef; @@ -3597,6 +3779,8 @@ CHOOSE_STUDENTS1 !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'}, \$helper->{'VARS'}{'CODE_OPTION'}); + } elsif (\$helper->{'VARS'}{'SINGLE_CODE'} ne ''){ + return 'Specifying a code name is incompatible specifying number of codes.'; } else { return undef; # Other forces control us. } @@ -3909,6 +4093,7 @@ FONT_SELECTION Homework Problem Exam Problem Survey question + ,choice computer="anonsurvey"Anonymous survey question PROBTYPE &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag); @@ -3943,10 +4128,12 @@ PROBTYPE return $helper; } - $r->print($helper->display()); + my $footer; if ($helper->{STATE} eq 'START') { - &recently_generated($r); + my $prtspool=$r->dir_config('lonPrtDir'); + $footer = &recently_generated($prtspool); } + $r->print($helper->display($footer)); &Apache::lonhelper::unregisterHelperTags(); return OK; @@ -4069,7 +4256,6 @@ sub render { } $result .= < -