--- loncom/interface/lonprintout.pm 2010/05/22 13:36:55 1.568.2.6 +++ loncom/interface/lonprintout.pm 2010/02/25 04:55:30 1.568.4.2 @@ -2,7 +2,7 @@ # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.568.2.6 2010/05/22 13:36:55 raeburn Exp $ +# $Id: lonprintout.pm,v 1.568.4.2 2010/02/25 04:55:30 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -306,16 +306,11 @@ sub set_font_size { my ($text) = @_; - # There appear to be cases where the font directive is empty.. in which - # case the first substituion would insert a spurious \ oh happy day. - # as this has been the cause of much mystery and hair pulling _sigh_ - - 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,12 +494,15 @@ 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) = @_; + my ($width, $format, $assignment, $course, $student, $section) = @_; + + $width = &recalcto_mm($width); # Get width in mm. - my $chars_per_line = int($width/2); # Character/textline. + my $chars_per_line = int($width/1.6); # Character/textline. # Default format? @@ -520,36 +518,58 @@ sub format_page_header { # - Allow the assignment to be 2 lines (wrapped). # - 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}"; + my $name_length = int($chars_per_line *3 /4); + my $sec_length = int($chars_per_line / 5); + + $format = "%$name_length".'n'; + + if ($section) { + $format .= ' - Sec: '."%$sec_length".'s'; + } + + $format .= '\\\\%c \\\\ %a'; + - } 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!!! } + # 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); + $format = &printf_style_subst("s", $format, $section); + + # 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/; + } + # + # We're going to trust LaTeX to break lines appropriately, but + # we'll truncate anything that's more than 3 lines worth of + # text. This is also assuming (which will probably end badly) + # nobody's going to embed LaTeX control sequences in the title + # header or rather that those control sequences won't get broken + # by the stuff below. + # + my $total_length = 3*$chars_per_line; + if (length($format) > $total_length) { + $format = substr($format, 0, $total_length); + } + + return $format; + } # @@ -1245,6 +1265,8 @@ sub get_course { my $courseidinfo; if (defined($env{'request.course.id'})) { $courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header'); + my $sec = $env{'request.course.sec'}; + } return $courseidinfo; } @@ -1267,7 +1289,6 @@ sub page_format_transformation { my $name = &get_name(); my $courseidinfo = &get_course(); - if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } my $header_text = $parmhash{'print_header_format'}; $header_text = &format_page_header($textwidth, $header_text, $assignment, $courseidinfo, $name); @@ -1288,13 +1309,7 @@ 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/; + $text =~ s/(\\begin{document})/$1\\special{papersize=210mm,297mm}/; } } if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;} @@ -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|page|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{'pdfFormFiels'} = $pdfFormFields; # $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'}; $form{'problem_split'}=$parmhash{'problem_stream_switch'}; @@ -1875,7 +1890,7 @@ sub print_construction_sequence { } sub output_data { - my ($r,$helper,$rparmhash) = @_; + my ($r,$helper,$rparmhash,$is_custom) = @_; my %parmhash = %$rparmhash; $ssi_error = 0; # This will be set nonzero by failing ssi's. $resources_printed = ''; @@ -1916,6 +1931,11 @@ ENDPART {'href' => '', 'text' => 'Preparing Printout'}]; + if ($is_custom) { + $brcrum = [{'href' => '', + 'text' => 'Preparing Printout'}]; + } + my $start_page = &Apache::loncommon::start_page('Preparing Printout', $js, {'bread_crumbs' => $brcrum,}); @@ -1957,7 +1977,7 @@ ENDPART my %form; $form{'grade_target'} = 'tex'; $form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); - $form{'pdfFormFields'} = 'no'; + $form{'pdfFormFields'} = $pdfFormFields; # If form.showallfoils is set, then request all foils be shown: # privilege will be enforced both by not allowing the @@ -1977,7 +1997,6 @@ ENDPART &Apache::lonnet::delenv('construct.style'); } - if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'current_document') { #-- single document - problem, page, html, xml, ... my ($currentURL,$cleanURL); @@ -2267,7 +2286,6 @@ ENDPART if (($selectionmade == 4) and ($assignment ne $prevassignment)) { my $name = &get_name(); my $courseidinfo = &get_course(); - if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } $prevassignment=$assignment; my $header_text = $parmhash{'print_header_format'}; $header_text = &format_page_header($textwidth, $header_text, @@ -2890,12 +2908,10 @@ sub print_resources { my $courseidinfo = &get_course(); - if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } - if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection} my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header'); my $header_line = &format_page_header($LaTeXwidth, $parmhash{'print_header_format'}, - $currentassignment, $courseidinfo, $fullname); + $currentassignment, $courseidinfo, $fullname, $usersection); my $header_start = ($columns_in_format == 1) ? '\lhead' : '\fancyhead[LO]'; $header_line = $header_start.'{'.$header_line.'}'; @@ -2926,17 +2942,109 @@ sub handler { &init_perm(); + my ($helper,$is_custom); + if ((&Apache::loncommon::needs_gci_custom()) && + ($env{'request.role.domain'} eq 'gcitest')) { + if ($r->header_only) { + if ($env{'browser.mathml'}) { + &Apache::loncommon::content_type($r,'text/xml'); + } else { + &Apache::loncommon::content_type($r,'text/html'); + } + $r->send_http_header; + return OK; + } + # Send header, nocache + if ($env{'browser.mathml'}) { + &Apache::loncommon::content_type($r,'text/xml'); + } else { + &Apache::loncommon::content_type($r,'text/html'); + } + &Apache::loncommon::no_cache($r); + $r->send_http_header; + $r->rflush(); - - my $helper = printHelper($r); - if (!ref($helper)) { - return $helper; + my ($navmap_error,$resources,@master_seq); + my $navmap = Apache::lonnavmaps::navmap->new(); + if (!defined($navmap)) { + my $brcrum = [{'href' => '', + 'text' => 'Preparing Printout'}]; + + my $start_page = + &Apache::loncommon::start_page('Preparing Printout','', + {'bread_crumbs' => $brcrum,}); + my $endpage = &Apache::loncommon::end_page(); + + my $navmap_error = ''.&mt('An error occurred retrieving information about the course.').'
'.&mt('It is recommended that you re-select the concept test by clicking on the "Review Questions" tab and then clicking on the "Manage Tests" tab again.').'
'; + $r->print($start_page.$navmap_error.$endpage); + return OK; + } else { + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my @allres=$navmap->retrieveResources('/uploaded/'.$cdom.'/'.$cnum.'/default_1261144274.sequence'); + foreach my $resource (@allres) { + next if ($resource->is_map()); + my $symb = $resource->symb(); + push(@master_seq,$symb); + } + $resources = join('|||',@master_seq); + my ($sequence,$middle_thingy,$urlp) = + &Apache::lonnet::decode_symb($master_seq[0]); + + my $assignment = &Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); + + $helper = { + VARS => { + ANON_CODE_STORAGE_NAME => '', + ANSWER_TYPE => 'yes', + CODE_OPTION => '', + EMPTY_PAGES => '', + FINISHPAGE => '', + FORMAT => 'P|1|letter|no', + LATEX_TYPE => 'batchmode', + NUMBER_TO_PRINT_TOTAL => '', + PRINT_ANNOTATIONS => 'no', + PRINT_DISCUSSIONS => 'no', + PRINT_TYPE => 'map_problems', + RESOURCES => $resources, + REUSE_OLD_CODES => '', + SEQUENCE => '', + SINGLE_CODE => '', + SPLIT_PDFS => '', + STUDENTS => '', + TABLE_CONTENTS => 'no', + TABLE_INDEX => 'no', + assignment => $assignment, + construction => '', + curseed => '', + filename => '', + fontsize => 'normalsize', + pagesize => '', + 'pagesize.height' => '9.8', + 'pagesize.heightunit' => 'in', + 'pagesize.lmargin' => '-0.57', + 'pagesize.lmarginunit' => 'in', + 'pagesize.width' => '7.1', + 'pagesize.widthunit' => 'in', + postdata => $urlp, + probstatus => '', + showallfoils => '', + student_sort => '', + style_file => '', + symb => $master_seq[0], + } + }; + $env{'form.assignment'} = $assignment; + $is_custom = 1; + } + } else { + $helper = printHelper($r); + if (!ref($helper)) { + return $helper; + } } - %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'}); - - # If a figure conversion queue file exists for this user.domain @@ -2945,13 +3053,13 @@ sub handler { my $conversion_queuefile = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat"; if(-e $conversion_queuefile) { - unlink $conversion_queuefile; + unlink $conversion_queuefile; } - - &output_data($r,$helper,\%parmhash); + + &output_data($r,$helper,\%parmhash,$is_custom); return OK; -} +} use Apache::lonhelper; @@ -4018,6 +4126,9 @@ sub render { my $PaperType=&mt('Paper type'); my $landscape=&mt('Landscape'); my $portrait=&mt('Portrait'); + my $pdfFormLabel=&mt('PDF-Formfields'); + my $with=&mt('with Formfields'); + my $without=&mt('without Formfields'); $result.='

'.&mt('Layout Options').'

' @@ -4026,6 +4137,7 @@ sub render { .''.$PageLayout.'' .''.$NumberOfColumns.'' .''.$PaperType.'' + .''.$pdfFormLabel.'' .&Apache::loncommon::end_data_table_header_row() .&Apache::loncommon::start_data_table_row() .'' @@ -4065,7 +4177,12 @@ sub render { } $result .= < - + + + HTML $result.=&Apache::loncommon::end_data_table_row()