--- loncom/interface/lonprintout.pm 2009/03/21 04:44:39 1.545.2.4 +++ loncom/interface/lonprintout.pm 2009/08/03 11:01:14 1.560 @@ -1,7 +1,7 @@ # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.545.2.4 2009/03/21 04:44:39 raeburn Exp $ +# $Id: lonprintout.pm,v 1.560 2009/08/03 11:01:14 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -40,6 +40,9 @@ use Apache::lonnavmaps; use Apache::admannotations; use Apache::lonenc; use Apache::entities; +use Apache::londefdef; + +use File::Basename; use HTTP::Response; @@ -67,6 +70,10 @@ my $ssi_last_error; # The error text fr my $ssi_retry_count = 5; # Some arbitrary value. +# Font size: + +my $font_size = 'normalsize'; # Default is normalsize... + # Fetch the contents of a resource, uninterpreted. # This is used here to fetch a latex file to be included @@ -97,7 +104,7 @@ sub fetch_raw_resource { sub annotate { my ($symb) = @_; - my $annotation_text = &Apache::admannotations::get_annotation($symb, 1); + my $annotation_text = &Apache::loncommon::get_annotation($symb, 1); my $result = ""; @@ -111,9 +118,86 @@ sub annotate { return $result; } +# +# Set a global document font size: +# This is done by replacing \begin{document} +# with \begin{document}{\some-font-directive +# and \end{document} with +# }\end{document +# +sub set_font_size { + + my ($text) = @_; + + $text =~ s/\\begin{document}/\\begin{document}{\\$font_size/; + $text =~ s/\\end{document}/}\\end{document}/; + return $text; + + +} + +# include_pdf - PDF files are included into the +# output as follows: +# - The PDF, if necessary, is replicated. +# - The PDF is added to the list of files to convert to postscript (along with the images). +# - The LaTeX is added to include the final converted postscript in the file as an included +# job. The assumption is that the includedpsheader.ps header will be included. +# +# Parameters: +# pdf_uri - URI of the PDF file to include. +# +# Returns: +# The LaTeX to include. +# +# Assumptions: +# The uri is actually a PDF file +# The postscript will have the includepsheader.ps included. +# +# +sub include_pdf { + my ($pdf_uri) = @_; + + # Where is the file? If not local we'll need to repcopy it:' + + my $file = &Apache::lonnet::filelocation('', $pdf_uri); + if (! -e $file) { + &Apache::lonnet::repcopy($file); + $file = &Apache::lonnet::filelocation('',$pdf_uri); + } + + # The file isn ow replicated locally.. or it did not exist in the first place + # (unlikely). If it did exist, add the pdf to the set of files/images that + # need tob e converted for this print job: + + $file =~ s|(.*)/res/|/home/httpd/html/res/|; + + open(FILE,">>/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat"); + print FILE ("$file\n"); + close (FILE); + + # Construct the special to put out. To do this we need to get the + # resulting filename after conversion. The file will have the same name + # but will be in the user's spool directory with converted images. + + my $dirname = "/home/httpd/prtspool/$env{'user.name'}/"; + my ( $base, $path, $ext) = &fileparse($file, '.pdf'); +# my $destname = $dirname.'/'.$base.'.eps'; # Not really an eps but easier in printout.pl + $base =~ s/ /\_/g; + + + my $output = &print_latex_header(); + $output .= '\special{ps: _begin_job_ (' + .$base.'.pdf.eps'. + ')run _end_job_}'; + + return $output; + + +} + # -# ssi_with_retries - Does the server side include of a resource. +# ssi_with_retries- Does the server side include of a resource. # if the ssi call returns an error we'll retry it up to # the number of times requested by the caller. # If we still have a proble, no text is appended to the @@ -146,6 +230,10 @@ sub annotate { sub ssi_with_retries { my ($resource, $retries, %form) = @_; + my $target = $form{'grade_target'}; + my $aom = $form{'answer_output_mode'}; + + my ($content, $response) = &Apache::loncommon::ssi_with_retries($resource, $retries, %form); if (!$response->is_success) { @@ -229,9 +317,11 @@ 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. # Default format? @@ -249,34 +339,34 @@ sub format_page_header { # 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 $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'; + + } + # 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 @@ -858,6 +948,7 @@ sub old_character_chart { $result =~ s/&(rdquo|#8221);/\'\'/g; + return $result; } @@ -983,6 +1074,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; } @@ -1005,7 +1098,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); @@ -1018,12 +1110,12 @@ sub page_format_transformation { $fancypagestatement="\\rhead{}\\chead{}\\lhead{$header_text}"; } if ($layout eq 'album') { - $text =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\n\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\n\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\n\\pagestyle{fancy}$fancypagestatement\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /; + $text =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\n\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\n\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\n\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /; } elsif ($layout eq 'book') { if ($choice ne 'All class print') { - $text =~ s/\\begin{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset $topmargintoinsert\n\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\n\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\\pagestyle{fancy}$fancypagestatement\\begin{document}\n\\voffset=-0\.8 cm\\setcounter{page}{1}\n/; + $text =~ s/\\begin{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset $topmargintoinsert\n\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\n\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\n\\voffset=-0\.8 cm\\setcounter{page}{1}\n/; } else { - $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{}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1} \\vskip 5 mm\n /; + $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') { $text =~ s/(\\begin{document})/$1\\special{papersize=210mm,297mm}/; @@ -1146,41 +1238,8 @@ sub IndexCreation { sub print_latex_header { my $mode=shift; - my $output='\documentclass[letterpaper,twoside]{article}\raggedbottom'; - if (($mode eq 'batchmode') || (!$perm{'pav'})) { - $output.='\batchmode'; - } - $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n". - '\usepackage{multirow}'."\n". - '\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'."\n". - '\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n". - '\usepackage{wrapfig}'. - '\usepackage{picins}\usepackage{calc}'."\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}'. - '\usepackage{amsthm}'. - '\usepackage{amscd}'. - '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n". - '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n". - '\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}'."\n". - '\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}'."\n". - '\setlength{\abovedisplayshortskip}{-0.04in}'."\n". - '\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'."\n". - '\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large'."\n". - '\textbf{Index}} \newline \setlength{\rightmargin}{0in}'."\n". - '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}'."\n". - '\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}'."\n". - '\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}'."\n". - '\setlength{\abovedisplayshortskip}{-0.04in}'."\n". - '\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}\begin{document}'."\n"; - return $output; + + return &Apache::londefdef::latex_header($mode); } sub path_to_problem { @@ -1251,6 +1310,180 @@ sub unsupported { return $result; } +# +# Map from helper layout style to the book/album: +# +sub map_laystyle { + my ($laystyle) = @_; + if ($laystyle eq 'L') { + $laystyle='album'; + } else { + $laystyle='book'; + } + return $laystyle; +} + +sub print_page_in_course { + my ($helper, $rparmhash, $currentURL, $resources) = @_; + my %parmhash = %$rparmhash; + my @page_resources = @$resources; + my $mode = $helper->{'VARS'}->{'LATEX_TYPE'}; + my $symb = $helper->{'VARS'}->{'symb'}; + + + my $format_from_helper = $helper->{'VARS'}->{'FORMAT'}; + + + my @temporary_array=split /\|/,$format_from_helper; + my ($laystyle,$numberofcolumns,$papersize,$pdfFormFields)=@temporary_array; + $laystyle = &map_laystyle($laystyle); + my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle, + $numberofcolumns); + my $LaTeXwidth=&recalcto_mm($textwidth); + + + if ($mode ne '') {$mode='\\'.$mode} + my $result.= &print_latex_header($mode); + if ($currentURL=~m|^(/adm/wrapper/)?ext/|) { + $currentURL=~s|^(/adm/wrapper/)?ext/|http://|; + my $title=&Apache::lonnet::gettitle($symb); + $title = &Apache::lonxml::latex_special_symbols($title); + } else { + $result.=$currentURL; + } + $result .= '\\\\'; + + if ($helper->{'VARS'}->{'style_file'}=~/\w/) { + &Apache::lonnet::appenv({'construct.style' => + $helper->{'VARS'}->{'style_file'}}); + } elsif ($env{'construct.style'}) { + &Apache::lonnet::delenv('construct.style'); + } + + # First is the overall page description. This is then followed by the + # components of the page. Each of which must be printed independently. + + my $the_page = shift(@page_resources); + + foreach my $resource (@page_resources) { + my $resource_src = $resource->src(); # Essentially the URL of the resource. + $result .= $resource->title() . '\\\\'; + + # Recurse if a .page: + + if ($resource_src =~ /.page$/i) { + my $navmap = Apache::lonnavmaps::navmap->new(); + my @page_resources = $navmap->retrieveResources($resource_src); + $result .= &print_page_in_course($helper, $rparmhash, + $resource_src, \@page_resources); + } + # these resources go through the XML transformer: + + 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; + + &Apache::lonxml::remember_problem_counter(); + $moreenv{'request.filename'}=$urlp; + if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {$form{'problemtype'}='exam';} + + $form{'grade_target'} = 'tex'; + $form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); + $form{'pdfFormFiels'} = $pdfFormFields; # + $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'}; + + $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'}; + $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 $rndseed = time; + if ($helper->{'VARS'}->{'curseed'}) { + $rndseed=$helper->{'VARS'}->{'curseed'}; + } + $form{'rndseed'}=$rndseed; + &Apache::lonnet::appenv(\%moreenv); + + &Apache::lonxml::clear_problem_counter(); + + my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form); + + # There seems to be an extraneous \vskip 1mm \\\\ : + + $texversion =~ s/^\\vskip 1mm \\\\\\\\//; + + # current document with answers.. no need to encap in minipage + # since there's only one answer. + + if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || + ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { + my %answerform = %form; + + + $answerform{'problem_split'}=$parmhash{'problem_stream_switch'}; + $answerform{'grade_target'}='answer'; + $answerform{'answer_output_mode'}='tex'; + $answerform{'rndseed'}=$rndseed; + if ($helper->{'VARS'}->{'probstatus'} eq 'exam') { + $answerform{'problemtype'}='exam'; + } + $resources_printed .= $urlp.':'; + my $answer=&ssi_with_retries($urlp,$ssi_retry_count, %answerform); + + if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { + $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; + } else { + $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); + if ($helper->{'VARS'}->{'construction'} ne '1') { + my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}); + $title = &Apache::lonxml::latex_special_symbols($title); + $texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; + $texversion.=&path_to_problem($urlp,$LaTeXwidth); + } else { + $texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm '; + my $URLpath=$urlp; + $URLpath=~s/~([^\/]+)/public_html\/$1\/$1/; + $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); + } + if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') { + $texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$currentURL| \\strut\\\\\\strut /; + + } + $result .= $texversion; + if ($currentURL=~m/\.page\s*$/) { + ($result,$numberofcolumns) = &page_cleanup($result); + } + } + } + + $result.= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill} \end{document}'; + return $result; +} + # # List of recently generated print files @@ -1421,7 +1654,7 @@ sub print_construction_sequence { $result.=$texversion; } elsif ($urlp=~/\.(sequence|page)$/) { - + # header: $result.='\strut\newline\noindent Sequence/page '.$urlp.'\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent '; @@ -1440,7 +1673,21 @@ sub print_construction_sequence { $helper, %form, $LaTeXwidth); } - } + } + elsif ($urlp =~ /\.pdf$/i) { + my $texversion; + if ($member != 0) { + $texversion .= '\cleardoublepage'; + } + + $texversion .= &include_pdf($urlp); + $texversion = &latex_header_footer_remove($texversion); + if ($member != $#order) { + $texversion .= '\\ \cleardoublepage'; + } + + $result .= $texversion; + } } if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;} return $result; @@ -1451,6 +1698,7 @@ sub output_data { my %parmhash = %$rparmhash; $ssi_error = 0; # This will be set nonzero by failing ssi's. $resources_printed = ''; + $font_size = $helper->{'VARS'}->{'fontsize'}; my $do_postprocessing = 1; my $js = < @@ -1480,8 +1728,16 @@ sub output_data { ENDPART - - my $start_page = &Apache::loncommon::start_page('Preparing Printout',$js); + # Breadcrumbs + #FIXME: Choose better/different breadcrumbs?!? Links? + my $brcrum = [{'href' => '', + 'text' => 'Helper'}, #FIXME: Different origin possible than print out helper? + {'href' => '', + 'text' => 'Preparing Printout'}]; + + my $start_page = &Apache::loncommon::start_page('Preparing Printout', + $js, + {'bread_crumbs' => $brcrum,}); my $msg = &mt('Please stand by while processing your print request, this may take some time ...'); $r->print($start_page."\n

\n$msg\n

\n"); @@ -1502,12 +1758,9 @@ ENDPART my ($result,$selectionmade) = ('',''); my $number_of_columns = 1; #used only for pages to determine the width of the cell my @temporary_array=split /\|/,$format_from_helper; - my ($laystyle,$numberofcolumns,$papersize)=@temporary_array; - if ($laystyle eq 'L') { - $laystyle='album'; - } else { - $laystyle='book'; - } + my ($laystyle,$numberofcolumns,$papersize,$pdfFormFields)=@temporary_array; + + $laystyle = &map_laystyle($laystyle); my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,$numberofcolumns); my $assignment = $env{'form.assignment'}; my $LaTeXwidth=&recalcto_mm($textwidth); @@ -1523,6 +1776,7 @@ ENDPART my %form; $form{'grade_target'} = 'tex'; $form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); + $form{'pdfFormFields'} = $pdfFormFields; # If form.showallfoils is set, then request all foils be shown: # privilege will be enforced both by not allowing the @@ -1560,7 +1814,7 @@ ENDPART } $selectionmade = 1; if ($cleanURL!~m|^/adm/| - && $cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { + && $cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { my $rndseed=time; my $texversion=''; if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') { @@ -1630,6 +1884,7 @@ ENDPART + } # Print annotations. @@ -1652,10 +1907,12 @@ ENDPART ($result,$number_of_columns) = &page_cleanup($result); } } elsif ($cleanURL!~m|^/adm/| - && $currentURL=~/\.sequence$/ && $helper->{'VARS'}->{'construction'} eq '1') { + && $currentURL=~/\.(sequence|page)$/ && $helper->{'VARS'}->{'construction'} eq '1') { #printing content of sequence from the construction space + + $currentURL=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|; - $result .= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); +# $result .= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); $result .= &print_construction_sequence($currentURL, $helper, %form, $LaTeXwidth); $result .= '\end{document}'; @@ -1673,7 +1930,7 @@ ENDPART $texversion =~ s/(\\end{document})/$annotation$1/; } $result .= $texversion; - } elsif ($cleanURL =~/.tex$/) { + } 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: # @@ -1686,7 +1943,21 @@ ENDPART $do_postprocessing = 0; # Don't massage the result. + } elsif ($cleanURL =~ /\.pdf$/i) { + $result .= &include_pdf($cleanURL); + $result .= '\end{document}'; + } elsif ($cleanURL =~ /\.page$/i) { # Print page in non construction space contexts. + + # Determine the set of resources in the map of the page: + + my $navmap = Apache::lonnavmaps::navmap->new(); + my @page_resources = $navmap->retrieveResources($cleanURL); + $result .= &print_page_in_course($helper, $rparmhash, + $cleanURL, \@page_resources); + + } else { + &Apache::lonnet::logthis("Unsupported type handler"); $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'}, $helper->{'VARS'}->{'symb'}); } @@ -1757,6 +2028,7 @@ ENDPART &Apache::lonxml::remember_problem_counter(); $texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %form); if ($urlp=~/\.page$/) { + ($texversion,my $number_of_columns_page) = &page_cleanup($texversion); if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} $texversion =~ s/\\end{document}\d*/\\end{document}/; @@ -1779,6 +2051,7 @@ ENDPART } else { if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) { $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); + $texversion =~ s/\\begin{document}//; 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 '; @@ -1808,13 +2081,13 @@ 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, $assignment, $courseidinfo, $name); + if ($numberofcolumns eq '1') { $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{'.$header_text.'}} \vskip 5 mm '; } else { @@ -1835,11 +2108,28 @@ ENDPART if ($flag_latex_header_remove ne 'NO') { $texversion = &latex_header_footer_remove($texversion); - } else { + } else { $texversion =~ s/\\end{document}/\\vskip 0\.5mm\\noindent\\makebox\[\\textwidth\/\$number_of_columns\]\[b\]\{\\hrulefill\}/; } $result .= $texversion; $flag_latex_header_remove = 'YES'; + } elsif ($urlp=~ /\.pdf$/i) { + if ($i > 0) { + $result .= '\cleardoublepage'; + } + $result .= &include_pdf($urlp); + if ($i != $#master_seq) { + if ($numberofcolumns eq '1') { + $result .= '\newpage'; + } else { + # the \\'s seem to be needed to let LaTeX know there's something + # on the page since LaTeX seems to not like to clear an empty page. + # + $result .= '\\ \cleardoublepage'; + } + } + $flag_latex_header_remove = 'YES'; + } else { $texversion=&unsupported($urlp,$helper->{'VARS'}->{'LATEX_TYPE'}, $master_seq[$i]); @@ -1851,7 +2141,9 @@ ENDPART $result .= $texversion; $flag_latex_header_remove = 'YES'; } - if (&Apache::loncommon::connection_aborted($r)) { last; } + if (&Apache::loncommon::connection_aborted($r)) { + last; + } } &Apache::lonxml::clear_problem_counter(); if ($flag_page_in_sequence eq 'YES') { @@ -1905,7 +2197,7 @@ ENDPART my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; #loop over students - my $flag_latex_header_remove = 'NO'; + my $flag_latex_header_remove = 'NO'; my %moreenv; $moreenv{'instructor_comments'}='hide'; $moreenv{'textwidth'}=&get_textwidth($helper,$LaTeXwidth); @@ -2151,6 +2443,11 @@ ENDPART $URLback=~s|^/~|/priv/|; } } + # + # Final adjustment of the font size: + # + + $result = set_font_size($result); #-- writing .tex file in prtspool my $temp_file; @@ -2235,7 +2532,7 @@ ENDPART # If there's been an unrecoverable SSI error, report it to the user if ($ssi_error) { my $helpurl = &Apache::loncommon::top_nav_help('Helpdesk'); - $r->print('

'.&mt('An unrecoverable network error occurred:').'

'. + $r->print('

'.&mt('An unrecoverable network error occurred:').'

'. &mt('At least one of the resources you chose to print could not be rendered due to an unrecoverable error when communicating with a server:'). '
'.$ssi_last_error_resource.'
'.$ssi_last_error. '

'.&mt('You can continue using the link provided below, but make sure to carefully inspect your output file! The errors will be marked in the file.').'
'. @@ -2320,7 +2617,6 @@ sub print_resources { if ($res_url!~m|^ext/| && $res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { $printed .= $curresline.':'; - &Apache::lonxml::remember_problem_counter(); my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv); @@ -2342,6 +2638,7 @@ sub print_resources { my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); + $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 '; @@ -2377,7 +2674,13 @@ sub print_resources { $rendered =~ s/\\end{document}//; } $current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut '; - + } elsif($res_url = ~/\.pdf$/) { + my $url = &Apache::lonnet::clutter($res_url); + my $rendered = &include_pdf($url); + if ($remove_latex_header ne 'NO') { + $rendered = &latex_header_footer_remove($rendered); + } + $current_output .= $rendered; } else { my $rendered = &unsupported($res_url,$helper->{'VARS'}->{'LATEX_TYPE'},$curresline); if ($remove_latex_header ne 'NO') { @@ -2389,20 +2692,19 @@ sub print_resources { } } $remove_latex_header = 'YES'; - } + } if (&Apache::loncommon::connection_aborted($r)) { last; } } + + 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.'}'; - if ($current_output=~/\\documentclass/) { $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$header_line$namepostfix}\\vskip 5 mm /; } else { @@ -2500,7 +2802,6 @@ sub get_randomly_ordered_warning { 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.''; } @@ -2580,7 +2881,6 @@ sub printHelper { } - # Detect whether we're coming from construction space if ($env{'form.postdata'}=~/^(?:http:\/\/[^\/]+\/|\/|)\~([^\/]+)\/(.*)$/) { $helper->{VARS}->{'filename'} = "~$1/$2"; @@ -2697,13 +2997,12 @@ sub printHelper { } if (($helper->{'VARS'}->{'construction'} ne '1' ) && - $helper->{VARS}->{'postdata'} && $helper->{VARS}->{'assignment'}) { # Allow problems from sequence - push @{$printChoices}, [&mt('Selected Problems in folder [_1]',$sequenceTitle), 'map_problems', 'CHOOSE_PROBLEMS']; + push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3]','','',''.$sequenceTitle.''), 'map_problems', 'CHOOSE_PROBLEMS']; # Allow all resources from sequence - push @{$printChoices}, [&mt('Selected Resources in folder [_1]',$sequenceTitle), 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML']; + push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','','',''.$sequenceTitle.''), 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML']; my $helperFragment = < @@ -2732,8 +3031,8 @@ HELPERFRAGMENT &Apache::lonxml::xmlparse($r, 'helper', $helperFragment); } - # If the user has pfo (print for otheres) allow them to print all - # problems and resources in the entier course, optionally for selected students + # If the user has pfo (print for others) allow them to print all + # problems and resources in the entire course, optionally for selected students if ($perm{'pfo'} && !$is_published && ($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { @@ -2783,8 +3082,8 @@ HELPERFRAGMENT ALL_PROBLEMS if ($helper->{VARS}->{'assignment'}) { - push @{$printChoices}, [&mt("Selected Problems from folder [_1] for selected people",$sequenceTitle), 'problems_for_students', 'CHOOSE_STUDENTS']; - push @{$printChoices}, [&mt("Selected Problems from folder [_1] for CODEd assignments",$sequenceTitle), 'problems_for_anon', 'CHOOSE_ANON1']; + push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]selected people[_5]','','',''.$sequenceTitle.'','',''), 'problems_for_students', 'CHOOSE_STUDENTS']; + push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]CODEd assignments[_5]','','',''.$sequenceTitle.'','',''), 'problems_for_anon', 'CHOOSE_ANON1']; } my $randomly_ordered_warning = @@ -2962,8 +3261,8 @@ CHOOSE_ANON1 if ($helper->{VARS}->{'assignment'}) { - push @{$printChoices}, [&mt("Selected Resources from folder [_1] for selected people",$sequenceTitle), 'resources_for_students', 'CHOOSE_STUDENTS1']; - push @{$printChoices}, [&mt("Selected Resources from folder [_1] for CODEd assignments",$sequenceTitle), 'resources_for_anon', 'CHOOSE_ANON2']; + push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]selected people[_5]','','',''.$sequenceTitle.'','',''), 'resources_for_students', 'CHOOSE_STUDENTS1']; + push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]CODEd assignments[_5]','','',''.$sequenceTitle.'','',''), 'resources_for_anon', 'CHOOSE_ANON2']; } @@ -3084,9 +3383,8 @@ CHOOSE_ANON2 )) && $helper->{VARS}->{'assignment'} eq "" ) { - my $pretty_dir = &Apache::lonnet::hreflocation($subdir); - push @{$printChoices}, [&mt("Selected Problems from current subdirectory [_1]",$pretty_dir), 'problems_from_directory', 'CHOOSE_FROM_SUBDIR']; + push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from current subdirectory [_3]','','',''.$pretty_dir.'','',''), 'problems_from_directory', 'CHOOSE_FROM_SUBDIR']; my $xmlfrag = < @@ -3159,9 +3457,6 @@ CHOOSE_FROM_ANY_SEQUENCE &addMessage('
' .'

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

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

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

' -# .&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_title( '