--- loncom/interface/lonprintout.pm 2010/08/04 22:23:26 1.568.2.9 +++ loncom/interface/lonprintout.pm 2013/08/27 02:39:24 1.583.2.6 @@ -2,7 +2,7 @@ # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.568.2.9 2010/08/04 22:23:26 raeburn Exp $ +# $Id: lonprintout.pm,v 1.583.2.6 2013/08/27 02:39:24 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -196,14 +196,19 @@ sub generate_code_selector {


Generate new CODEd Assignments

' @@ -1717,11 +1771,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() .'' @@ -1729,9 +1782,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; } # @@ -1744,7 +1797,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"); @@ -1759,6 +1812,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. @@ -1930,11 +2099,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'}; @@ -1979,7 +2150,6 @@ ENDPART &Apache::lonnet::delenv('construct.style'); } - if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'current_document') { #-- single document - problem, page, html, xml, ... my ($currentURL,$cleanURL); @@ -2149,9 +2319,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') ) { @@ -2198,6 +2368,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]; @@ -2218,8 +2389,7 @@ ENDPART (($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'; + $flag_latex_header_remove = 'YES'; } } $texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %form); @@ -2228,7 +2398,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')) { @@ -2240,7 +2410,6 @@ ENDPART &Apache::lonxml::restore_problem_counter(); my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform); - if ($urlp =~ /\.page$/) { $answer =~ s/\\end{document}(\d*)$//; } @@ -2256,7 +2425,7 @@ ENDPART } else { 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 '; @@ -2286,7 +2455,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, @@ -2350,7 +2519,7 @@ ENDPART } $result .= $texversion; $flag_latex_header_remove = 'YES'; - } + } if (&Apache::loncommon::connection_aborted($r)) { last; } @@ -2451,7 +2620,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; } } @@ -2524,7 +2694,8 @@ ENDPART my ($type) = split(/_/,$helper->{'VARS'}->{'PRINT_TYPE'}); &adjust_number_to_print($helper); my $number_per_page=$helper->{'VARS'}->{'NUMBER_TO_PRINT'}; - if ($number_per_page eq '0' || $number_per_page eq 'all') { + if ($number_per_page eq '0' || $number_per_page eq 'all' + || $number_per_page eq 'section') { $number_per_page=$num_todo; } my $flag_latex_header_remove = 'NO'; @@ -2821,6 +2992,7 @@ sub print_resources { $current_output.= "\\newpage\n"; } } + $current_output .= &get_extra_vspaces($helper, $curresline); $i++; if ( !($type eq 'problems' && @@ -2863,7 +3035,7 @@ sub print_resources { my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); unless ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') { - $header =~ s/\\begin{document}//; #<<<<< + $header =~ s/\\begin{document}//; #<<<<< } my $title = &Apache::lonnet::gettitle($curresline); $title = &Apache::lonxml::latex_special_symbols($title); @@ -3012,6 +3184,11 @@ sub init_perm { $perm{'pfo'}=&Apache::lonnet::allowed('pfo', $env{'request.course.id'}.'/'.$env{'request.course.sec'}); } + $perm{'vgr'}=&Apache::lonnet::allowed('vgr',$env{'request.course.id'}); + if (!$perm{'vgr'}) { + $perm{'vgr'}=&Apache::lonnet::allowed('vgr', + $env{'request.course.id'}.'/'.$env{'request.course.sec'}); + } } sub get_randomly_ordered_warning { @@ -3083,19 +3260,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 @@ -3105,10 +3284,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'}; + } } @@ -3227,7 +3411,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. } @@ -249,6 +256,46 @@ CHOOSE_ANON1 return $result; } +# Returns the XML for choosing how assignments are to be formatted +# that text must still be parsed by the helper xml parser. +# Parameters: 3 (required) + +# helper - The helper; $helper->{'VARS'}->{'PRINT_TYPE'} used +# to check if splitting PDFs by section can be offered. +# title - Title for the current state. +# this_state - State name of the chooser. + +sub generate_format_selector { + my ($helper,$title,$this_state) = @_; + my $secpdfoption; + unless (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon') || + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon_page') || + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon') ) { + $secpdfoption = 'Each PDF contains exactly one section'; + } + return < +
How should the results be printed?
+ + Start each student\'s assignment on a new page/column (add a pagefeed after each assignment) + Add one empty page/column after each student\'s assignment + Add two empty pages/column after each student\'s assignment + Add three empty pages/column after each student\'s assignment + + PAGESIZE +
How do you want assignments split into PDF files?
+ + All assignments in a single PDF file + $secpdfoption + Each PDF contains exactly one assignment + + Specify the number of assignments per PDF: + + +RESOURCE_SELECTOR +} + + #----------------------------------------------------------------------- @@ -312,10 +359,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 +548,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 +595,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 +1341,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 /;} @@ -1476,6 +1529,7 @@ sub unsupported { my $result.= &print_latex_header($mode); if ($currentURL=~m|^(/adm/wrapper/)?ext/|) { $currentURL=~s|^(/adm/wrapper/)?ext/|http://|; + $currentURL=~s|http://https://|https://|; my $title=&Apache::lonnet::gettitle($symb); $title = &Apache::lonxml::latex_special_symbols($title); $result.=' \strut \\\\ '.$title.' \strut \\\\ '.$currentURL.' '; @@ -1527,7 +1581,7 @@ sub print_page_in_course { } else { my $esc_currentURL= $currentURL; $esc_currentURL =~ s/_/\\_/g; - $result.=$esc_currentURL; + $result.=$esc_currentURL; } $result .= '\\\\'; @@ -1568,7 +1622,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'}; @@ -1672,8 +1726,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); @@ -1706,10 +1760,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'} && @@ -3606,6 +3765,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; @@ -3629,6 +3792,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. } @@ -3729,7 +3894,7 @@ CHOOSE_FROM_ANY_SEQUENCE my $startedTable = 0; # have we started an HTML table yet? (need # to close it later) - if (($perm{'pav'} and &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) or + if (($perm{'pav'} and $perm{'vgr'}) or ($helper->{VARS}->{'construction'} eq '1')) { &addMessage('
' .'

'.&mt('Print Options').'

' @@ -3941,6 +4106,7 @@ FONT_SELECTION Homework Problem Exam Problem Survey question + ,choice computer="anonsurvey"Anonymous survey question PROBTYPE &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag); @@ -3975,10 +4141,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; @@ -4101,7 +4269,6 @@ sub render { } $result .= < -