--- loncom/interface/lonprintout.pm 2008/04/22 10:24:24 1.530 +++ loncom/interface/lonprintout.pm 2009/03/21 04:44:39 1.545.2.4 @@ -1,7 +1,7 @@ # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.530 2008/04/22 10:24:24 foxr Exp $ +# $Id: lonprintout.pm,v 1.545.2.4 2009/03/21 04:44:39 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -39,6 +39,8 @@ use Apache::File(); use Apache::lonnavmaps; use Apache::admannotations; use Apache::lonenc; +use Apache::entities; + use HTTP::Response; use LONCAPA::map(); @@ -246,37 +248,42 @@ sub format_page_header { # - Allow the assignment to be 2 lines (wrapped). # my $chars_per_line = $width/2; # Character/textline. - - - my $firstline = "$student $course"; - if (length($firstline) > $chars_per_line) { - my $lastchar = $chars_per_line - length($student) - 1; - if ($lastchar > 0) { - $course = substr($course, 0, $lastchar); - } else { # Nothing left of course: - $course = ''; - } - } - if (length($assignment) > $chars_per_line) { - $assignment = substr($assignment, 0, $chars_per_line); - } - - $format = "\\textbf{$student} $course \\hfill \\thepage \\\\ \\textit{$assignment}"; - } else { - # An open question is how to handle long user formatted page headers... - # A possible future is to support e.g. %na so that the user can control - # the truncation of the elements that can appear in the 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 - # to \% else LaTeX will think they are comments and terminate - # the line.. which is bad!!! + my $firstline = "$student $course"; + if (length($firstline) > $chars_per_line) { + my $lastchar = $chars_per_line - length($student) - 1; + if ($lastchar > 0) { + $course = substr($course, 0, $lastchar); + } else { # Nothing left of course: + $course = ''; + } + } + if (length($assignment) > $chars_per_line) { + $assignment = substr($assignment, 0, $chars_per_line); + } + $format = "\\textbf{$student} $course \\hfill \\thepage \\\\ \\textit{$assignment}"; + } else { + # An open question is how to handle long user formatted page headers... + # A possible future is to support e.g. %na so that the user can control + # the truncation of the elements that can appear in the 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 + # to \% else LaTeX will think they are comments and terminate + # the line.. which is bad!!! + } + + # If the user has role author, $course and $assignment are empty so + # there is '\\ \\ ' in the page header. That's cause a error in LaTeX + if($format =~ /\\\\\s\\\\\s/) { + #TODO find sensible caption for page header + my $testPrintout = '\\\\'.&mt('Construction Space').' \\\\'.&mt('Test-Printout '); + $format =~ s/\\\\\s\\\\\s/$testPrintout/; } @@ -383,8 +390,8 @@ sub is_valid_alpha_code { 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 () { + my @lines = &Apache::grades::get_scantronformat_file(); + foreach my $line (@lines) { my ($name, $type, $length) = (split(/:/, $line))[0,2,4]; if($name eq $code_option) { $code_length = $length; @@ -502,12 +509,19 @@ sub adjust_number_to_print { # Unmodified. } else { # Error!!!! - + croak "bad SPLIT_PDFS: $split_pdf in lonprintout::adjust_number_to_print"; + } } + sub character_chart { + my $result = shift; + return &Apache::entities::replace_entities($result); +} + +sub old_character_chart { my $result = shift; $result =~ s/&\#0?0?(7|9);//g; $result =~ s/&\#0?(10|13);//g; @@ -1142,7 +1156,12 @@ sub print_latex_header { '\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n". '\usepackage{wrapfig}'. '\usepackage{picins}\usepackage{calc}'."\n". - '\usepackage[utf8]{inputenc}'."\n". + '\usepackage[T1]{fontenc}'."\n". + '\usepackage{lmodern}'."\n". + '\usepackage[postscript]{ucs}'."\n". + '\usepackage[utf8x]{inputenc}'."\n". + '\usepackage{pifont}' . "\n". + '\usepackage{latexsym}'."\n". '\usepackage{amsmath}'. '\usepackage{amssymb}'. '\usepackage{amsfonts}'. @@ -1259,20 +1278,43 @@ sub recently_generated { $cuid,$cgid,$crdev,$csize, $catime,$cmtime,$cctime, $cblksize,$cblocks)=stat($prtspool.'/'.$filename); - my $result="". - &mt('Generated [_1] ([_2] bytes)', - &Apache::lonlocal::locallocaltime($cctime),$csize). - '
'; + my $ext_text = 'pdf' ? &mt('PDF File'):&mt('Zip File'); + my $result=&Apache::loncommon::start_data_table_row() + .'' + .''.$ext_text.'' + .'' + .''.&Apache::lonlocal::locallocaltime($cctime).'' + .''.$csize.'' + .&Apache::loncommon::end_data_table_row(); if ($ext eq 'pdf') { $pdf_result .= $result; } if ($ext eq 'zip') { $zip_result .= $result; } } + if ($zip_result || $pdf_result) { + $r->print('
'); + } if ($zip_result) { - $r->print('

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

\n" - .$zip_result); + $r->print('

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

\n" + .&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .''.&mt('Download').'' + .''.&mt('Creation Date').'' + .''.&mt('File Size (Bytes)').'' + .&Apache::loncommon::end_data_table_header_row() + .$zip_result + .&Apache::loncommon::end_data_table() + ); } if ($pdf_result) { - $r->print('

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

\n" - .$pdf_result); + $r->print('

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

\n" + .&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .''.&mt('Download').'' + .''.&mt('Creation Date').'' + .''.&mt('File Size (Bytes)').'' + .&Apache::loncommon::end_data_table_header_row() + .$pdf_result + .&Apache::loncommon::end_data_table() + ); } } @@ -1497,7 +1539,7 @@ ENDPART &Apache::lonnet::appenv({'construct.style' => $helper->{'VARS'}->{'style_file'}}); } elsif ($env{'construct.style'}) { - &Apache::lonnet::delenv('construct\\.style'); + &Apache::lonnet::delenv('construct.style'); } @@ -1652,7 +1694,8 @@ ENDPART ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') 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 @@ -1660,7 +1703,8 @@ ENDPART $selectionmade = 2; } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') { $selectionmade = 3; - } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') { + } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') + ) { $selectionmade = 4; } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') { #BUGBUG $selectionmade = 4; @@ -1815,12 +1859,14 @@ ENDPART } $result .= '\end{document}'; } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') || + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_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') { + if (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') || + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_students') ) { $selectionmade=5; $type='problems'; } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students') { @@ -1917,9 +1963,9 @@ ENDPART my $selected_code = $helper->{'VARS'}->{'CODE_SELECTED_FROM_LIST'}; my $code_option=$helper->{'VARS'}->{'CODE_OPTION'}; - open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); + my @lines = &Apache::grades::get_scantronformat_file(); my ($code_type,$code_length)=('letter',6); - foreach my $line () { + foreach my $line (@lines) { my ($name,$type,$length) = (split(/:/,$line))[0,2,4]; if ($name eq $code_option) { $code_length=$length; @@ -2440,17 +2486,23 @@ sub get_randomly_ordered_warning { 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.''; + if (defined($navmap)) { + 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.''; + } + } else { + &Apache::lonnet::logthis('Retrieval of resources to check for folders set to be randomly ordered failed - could not create navmap object'); + $message = "Retrieval of information about ordering of resources failed."; + return ''.$message.''; } return; } @@ -2624,9 +2676,9 @@ sub printHelper { } # Useful filter strings - my $isProblem = '($res->is_problem()||$res->contains_problem) '; + my $isProblem = '($res->is_problem()||$res->contains_problem||$res->is_practice()) '; $isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden; - my $isProblemOrMap = '$res->is_problem() || $res->contains_problem() || $res->is_sequence()'; + my $isProblemOrMap = '$res->is_problem() || $res->contains_problem() || $res->is_sequence() || $res->is_practice()'; my $isNotMap = '!$res->is_sequence()'; $isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden; my $isMap = '$res->is_map()'; @@ -2687,6 +2739,7 @@ HELPERFRAGMENT push @{$printChoices}, [&mtn('Selected Problems from entire course'), 'all_problems', 'ALL_PROBLEMS']; push @{$printChoices}, [&mtn('Selected Resources from entire course'), 'all_resources', 'ALL_RESOURCES']; + push @{$printChoices}, [&mtn('Selected Problems from entire course for selected people'), 'all_problems_students', 'ALL_PROBLEMS_STUDENTS']; &Apache::lonxml::xmlparse($r, 'helper', < + + + STUDENTS1 + return $isProblemOrMap; + return $isNotMap; + return $symbFilter; + $start_new_option + + + + Select sorting order of printout + + Sort by section then student + Sort by students across sections. + +


+ +
+ ALL_PROBLEMS if ($helper->{VARS}->{'assignment'}) { @@ -2816,10 +2889,9 @@ CHOOSE_STUDENTS } - - open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); + my @lines = &Apache::grades::get_scantronformat_file(); my $codechoice=''; - foreach my $line () { + foreach my $line (@lines) { my ($name,$description,$code_type,$code_length)= (split(/:/,$line))[0,1,2,4]; if ($code_length > 0 && @@ -3084,10 +3156,18 @@ CHOOSE_FROM_ANY_SEQUENCE if (($perm{'pav'} and &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) or ($helper->{VARS}->{'construction'} eq '1')) { - addMessage("
"); + &addMessage(&Apache::lonhtmlcommon::row_closure()); $startedTable = 1; } @@ -3109,10 +3189,12 @@ CHOOSE_FROM_ANY_SEQUENCE ": "); + &addMessage(&Apache::lonhtmlcommon::row_closure()); if (not $helper->{VARS}->{'construction'}) { - addMessage(""); - addMessage(""); + &addMessage(&Apache::lonhtmlcommon::row_closure()); # Prompt for printing annotations too. - addMessage(""); + &addMessage(&Apache::lonhtmlcommon::row_closure()); - addMessage(""); + &addMessage(&Apache::lonhtmlcommon::row_closure(1)); } if ($helper->{'VARS'}->{'construction'}) { @@ -3198,32 +3289,44 @@ CHOOSE_FROM_ANY_SEQUENCE my $stylefiletext=&mt("Use style file"); my $selectfiletext=&mt("Select style file"); - my $xmlfrag .= <<"RNDSEED"; - -RNDSEED +   + ' + .'' + .&Apache::lonhtmlcommon::row_closure() + .''; &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag); - addMessage(""); + &addMessage(&Apache::lonhtmlcommon::row_closure(1)); - } + } } if ($startedTable) { - addMessage("
". - ': "); + &addMessage('
' + .'

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

' + .&Apache::lonhtmlcommon::start_pick_box() +# .&Apache::lonhtmlcommon::row_headline() +# .'

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

' +# .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title( + '' + ) + ); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = 'ANSWER_TYPE'; $helper->declareVar('ANSWER_TYPE'); @@ -3097,7 +3177,7 @@ CHOOSE_FROM_ANY_SEQUENCE ['Only Answers', 'only'] ]; Apache::lonhelper::dropdown->new(); - addMessage("
"); $startedTable = 1; } else { - addMessage("
". - ': "); + &addMessage(&Apache::lonhtmlcommon::row_title( + '' + ) + ); } $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = 'LATEX_TYPE'; @@ -3128,10 +3210,13 @@ CHOOSE_FROM_ANY_SEQUENCE } Apache::lonhelper::dropdown->new(); - addMessage("
". - ': "); + &addMessage(&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title( + '' + ) + ); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = 'TABLE_CONTENTS'; $helper->declareVar('TABLE_CONTENTS'); @@ -3139,13 +3224,15 @@ CHOOSE_FROM_ANY_SEQUENCE ['No', 'no'], ['Yes', 'yes'] ]; Apache::lonhelper::dropdown->new(); - addMessage("
". - ': "); + &addMessage(&Apache::lonhtmlcommon::row_title( + '' + ) + ); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = 'TABLE_INDEX'; $helper->declareVar('TABLE_INDEX'); @@ -3153,11 +3240,13 @@ CHOOSE_FROM_ANY_SEQUENCE ['No', 'no'], ['Yes', 'yes'] ]; Apache::lonhelper::dropdown->new(); - addMessage("
". - ': "); + &addMessage(&Apache::lonhtmlcommon::row_closure()); + &addMessage(&Apache::lonhtmlcommon::row_title( + '' + ) + ); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = 'PRINT_DISCUSSIONS'; $helper->declareVar('PRINT_DISCUSSIONS'); @@ -3165,14 +3254,16 @@ CHOOSE_FROM_ANY_SEQUENCE ['No', 'no'], ['Yes', 'yes'] ]; Apache::lonhelper::dropdown->new(); - addMessage("
". - ':"); + &addMessage(&Apache::lonhtmlcommon::row_title( + '' + ) + ); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = "PRINT_ANNOTATIONS"; $helper->declareVar("PRINT_ANNOTATIONS"); @@ -3180,16 +3271,16 @@ CHOOSE_FROM_ANY_SEQUENCE ['No', 'no'], ['Yes', 'yes']]; Apache::lonhelper::dropdown->new(); - addMessage("
"); + &addMessage(&Apache::lonhtmlcommon::row_title(&mt('Foils'))); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'multichoice'} = "true"; $paramHash->{'allowempty'} = "true"; $paramHash->{'variable'} = "showallfoils"; $paramHash->{'CHOICES'} = [ ["Show all foils", "1"] ]; Apache::lonhelper::choices->new(); - addMessage("
- : - - - - return $helper->{VARS}->{'curseed'}; - - -
- : - + my $xmlfrag .= '' + .&Apache::lonhtmlcommon::row_title('' + ) + .' + + + return '.$helper->{VARS}->{'curseed'}.'; + ' + .'' + .'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title('' + ) + .' - - return $stylevalue; - -   $selectfiletext
+ + return '.$stylevalue.'; + +  ' +.qq|| +.$selectfiletext.'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title(&mt('Show all foils')) + .' - Show all foils - -
Problem Type:"); + &addMessage(&Apache::lonhtmlcommon::row_title(&mt('Problem Type'))); # # Initial value from construction space: # @@ -3242,16 +3345,16 @@ RNDSEED PROBTYPE &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag); - addMessage("
"); + &addMessage(&Apache::lonhtmlcommon::end_pick_box()); } Apache::lonprintout::page_format_state->new("FORMAT"); @@ -3350,23 +3453,21 @@ sub render { my $PaperType=&mt('Paper type'); my $landscape=&mt('Landscape'); my $portrait=&mt('Portrait'); - $result .= <' + .&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .''.$PageLayout.'' + .''.$NumberOfColumns.'' + .''.$PaperType.'' + .&Apache::loncommon::end_data_table_header_row() + .&Apache::loncommon::start_data_table_row() + .'' + .'
' + .'' + .''; -
- - - - - - - - -
$PageLayout$NumberOfColumns$PaperType
-
- -
- ' + .'
"; + $result .= < + +HTML + $result.=&Apache::loncommon::end_data_table_row() + .&Apache::loncommon::end_data_table(); + return $result; }