--- rat/lonpage.pm 2007/09/26 00:34:31 1.84.2.1 +++ rat/lonpage.pm 2014/09/16 13:28:34 1.106 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Page Handler # -# $Id: lonpage.pm,v 1.84.2.1 2007/09/26 00:34:31 albertel Exp $ +# $Id: lonpage.pm,v 1.106 2014/09/16 13:28:34 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,12 +27,16 @@ # ### + + + package Apache::lonpage; use strict; use Apache::Constants qw(:common :http); use Apache::lonnet; use Apache::loncommon(); +use Apache::lonhtmlcommon; use Apache::lonxml(); use Apache::lonlocal; use Apache::lonmenu; @@ -78,7 +82,7 @@ sub tracetable { my $frid=$hash{'map_finish_'.$hash{'src_'.$rid}}; $sofar= &tracetable($sofar,$hash{'map_start_'.$hash{'src_'.$rid}}, - '&'.$frid.'&'); + '&'.$frid.$beenhere); $sofar++; if ($hash{'src_'.$frid}) { my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$frid}); @@ -155,6 +159,19 @@ sub handler { my $number_of_columns = 1; my $requrl=$r->uri; my $target = $env{'form.grade_target'}; + +# Short term solution: define target as 'tex_answer' when retrieving answers +# for resources in a .page when generating printouts. +# A better long-term fix would be to modify the way problem rendering, and +# answer rendering are retrieved for individual resources when printing a .page, +# so rendered problem and answer are sequential for individual resources in +# the .page +# + if ($target eq 'answer') { + if ($env{'form.answer_output_mode'} eq 'tex') { + $target = 'tex_answer'; + } + } # &Apache::lonnet::logthis("Got a target of $target"); if ($target eq 'meta') { &Apache::loncommon::content_type($r,'text/html'); @@ -198,6 +215,10 @@ sub handler { my $lcm=1; my $contents=0; my $nforms=0; + my $nuploads=0; + my %turninpaths; + my %multiresps; + my $turninparent; my %ssibody=(); my %ssibgcolor=(); @@ -207,6 +228,7 @@ sub handler { my %ssialink=(); my %cellemb=(); + my %cellexternal=(); my $allscript=''; my $allmeta=''; @@ -224,27 +246,37 @@ sub handler { $lcm*=($#colcont+1)/euclid($lcm,($#colcont+1)); foreach (@colcont) { my $src=$hash{'src_'.$_}; - my ($extension)=($src=~/\.(\w+)$/); + my ($extension)=($src=~/\.(\w+)$/); + $cellexternal{$_}=($hash{'ext_'.$_} eq 'true:'); if ($hash{'encrypted_'.$_}) { $src=&Apache::lonenc::encrypted($src); } $cellemb{$_}= &Apache::loncommon::fileembstyle($extension); - if ($cellemb{$_} eq 'ssi') { + if ($cellexternal{$_}) { + unless (($target eq 'tex') || ($target eq 'tex_answer')) { + $ssibody{$_} = <No iframe support! +ENDEXT + } + } elsif ($cellemb{$_} eq 'ssi') { # --------------------------------------------------------- This is an SSI cell my ($mapid,$resid)=split(/\./,$_); my $symb=&Apache::lonnet::encode_symb($hash{'map_id_'.$mapid},$resid,$src); my $prefix=$_.'_'; + my $idprefix= join('_',($mapid,$resid,'')); my %posthash=('request.prefix' => $prefix, 'LONCAPA_INTERNAL_no_discussion' => 'true', 'symb' => $symb); - if ($env{'form.grade_target'} eq 'tex') { + if (($env{'form.grade_target'} eq 'tex') || + ($env{'form.answer_output_mode'} eq 'tex')) { $posthash{'grade_target'}=$env{'form.grade_target'}; $posthash{'textwidth'}=$env{'form.textwidth'}; $posthash{'problem_split'}=$env{'form.problem_split'}; $posthash{'latex_type'}=$env{'form.latex_type'}; $posthash{'rndseed'}=$env{'form.rndseed'}; + $posthash{'answer_output_mode'} = $env{'form.answer_output_mode'}; } my $submitted=exists($env{'form.all_submit'}); if (!$submitted) { @@ -268,10 +300,10 @@ sub handler { } my $output=Apache::lonnet::ssi($src,%posthash); $output=~s|//(\s*)?\s||gs; - if ($target eq 'tex') { + if (($target eq 'tex') || ($target eq 'tex_answer')) { $output =~ s/^([^&]+)\\begin{document}//; $output =~ s/\\end{document}//; - $output = '\parbox{\minipagewidth}{ '.$output.' }'; +# $output = '\parbox{\minipagewidth}{ '.$output.' }'; #some additional cleanup necessary for LateX (due to limitations of table environment $output =~ s/(\\vskip\s*\d+mm)\s*(\\\\)+/$1/g; } @@ -334,12 +366,33 @@ sub handler { $nforms++; $output=~s/\]*\>//gsi; $output=~s/\<\/form[^\>]*\>//gsi; + if ($output=~/\]+name\s*=\s*[\'\"]*HWFILE/) { + $nuploads++; + } $output=~ s/\<((?:input|select|button|textarea)[^\>]+)name\s*\=\s*[\'\"]*([^\'\"]+)[\'\"]*([^\>]*)\>/\<$1 name="$prefix$2" $3\>/gsi; + $output=~ + s/\<((?:input|select|button|textarea)[^\>]+)id\s*\=\s*[\'\"]*([^\'\"]+)[\'\"]*([^\>]*)\>/\<$1 id="$idprefix$2" $3\>/gsi; + $output=~ + s/(\Q