--- rat/lonpage.pm 2006/04/04 19:54:51 1.74 +++ rat/lonpage.pm 2011/07/28 02:53:33 1.95 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Page Handler # -# $Id: lonpage.pm,v 1.74 2006/04/04 19:54:51 albertel Exp $ +# $Id: lonpage.pm,v 1.95 2011/07/28 02:53:33 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,6 +27,9 @@ # ### + + + package Apache::lonpage; use strict; @@ -39,6 +42,9 @@ use Apache::lonmenu; use HTML::TokeParser; use GDBM_File; use Apache::lonsequence; +use lib '/home/httpd/lib/perl/'; +use LONCAPA; + # -------------------------------------------------------------- Module Globals my %hash; @@ -75,7 +81,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}); @@ -152,6 +158,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'); @@ -203,8 +222,6 @@ sub handler { my %ssivlink=(); my %ssialink=(); - my %metalink=(); - my %cellemb=(); my $allscript=''; @@ -227,7 +244,6 @@ sub handler { if ($hash{'encrypted_'.$_}) { $src=&Apache::lonenc::encrypted($src); } - $metalink{$_}=$src.'.meta'; $cellemb{$_}= &Apache::loncommon::fileembstyle($extension); if ($cellemb{$_} eq 'ssi') { @@ -239,12 +255,14 @@ sub handler { 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) { @@ -267,11 +285,11 @@ sub handler { } } my $output=Apache::lonnet::ssi($src,%posthash); - $output=~s|//(\s*)?\s||gs; - if ($target eq 'tex') { + $output=~s|//(\s*)?\s||gs; + 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; } @@ -335,11 +353,13 @@ sub handler { $output=~s/\]*\>//gsi; $output=~s/\<\/form[^\>]*\>//gsi; $output=~ - s/\<((?:input|select|button|textarea)[^\>]+)name\s*\=\s*[\'\"]*([\w\.\:]+)[\'\"]*([^\>]*)\>/\<$1 name="$prefix$2" $3\>/gsi; + s/\<((?:input|select|button|textarea)[^\>]+)name\s*\=\s*[\'\"]*([^\'\"]+)[\'\"]*([^\>]*)\>/\<$1 name="$prefix$2" $3\>/gsi; + $output=~ + s/\<((?:input|select)[^\>]+\Qjavascript:setSubmittedPart\E)\(\s*[\'\"]([^\'\"]+)[\'\"]*\s*\)/\<$1('$2','$prefix')/gsi; } $thisdir=~s/\/[^\/]*$//; foreach (@rlinks) { - unless (($_=~/^http:\/\//i) || + unless (($_=~/^https?\:\/\//i) || ($_=~/^\//) || ($_=~/^javascript:/i) || ($_=~/^mailto:/i) || @@ -369,7 +389,7 @@ sub handler { # ------------------------------------------------------------------ Build page # ---------------------------------------------------------------- Send headers - unless ($target eq 'tex') { + unless (($target eq 'tex') || ($target eq 'tex_answer')) { if ($isxml) { &Apache::loncommon::content_type($r,'text/xml'); } else { @@ -378,96 +398,58 @@ sub handler { $r->send_http_header; # ------------------------------------------------------------------------ Head if ($allscript) { - $allscript .= - "\n\n"; + $allscript = + "\n".'\n"; } # ------------------------------------------------------------------ Start body - $r->print(&Apache::loncommon::start_page(undef,undef, + $r->print(&Apache::loncommon::start_page(undef,$allscript, {'force_register' => 1, 'bgcolor' => '#ffffff',})); # ------------------------------------------------------------------ Start form if ($nforms) { - $r->print('
'); } - } elsif ($target eq 'tex') { - $r->print('\documentclass{article} - \newcommand{\keephidden}[1]{} - \usepackage[dvips]{graphicx} - \usepackage{epsfig} - \usepackage{calc} - \usepackage{longtable} - \begin{document}'); + } elsif (($target eq 'tex') || ($target eq 'tex_answer')) { + # I think this is not needed as the header + # will be put in for each of the page parts + # by the londefdef.pm now that we are opening up + # the parts of a page. + #$r->print('\documentclass{article} + # \newcommand{\keephidden}[1]{} + # \usepackage[dvips]{graphicx} + # \usepackage{epsfig} + # \usepackage{calc} + # \usepackage{longtable} + # \begin{document}'); } # ----------------------------------------------------------------- Start table - if ($target eq 'tex') { - $r->print('\begin{longtable}INSERTTHEHEADOFLONGTABLE\endfirsthead\endhead '); + if (($target eq 'tex') || ($target eq 'tex_answer')) { +# # $r->print('\begin{longtable}INSERTTHEHEADOFLONGTABLE\endfirsthead\endhead '); if ($number_of_columns le $lcm) {$number_of_columns=$lcm;}; } else { $r->print(''); } +# generate rows for ($i=0;$i<=$#rows;$i++) { if ($rows[$i]) { - unless ($target eq 'tex') { + unless (($target eq 'tex') || ($target eq 'tex_answer')) { $r->print("\n"); } my @colcont=split(/\&/,$rows[$i]); my $avespan=$lcm/($#colcont+1); for ($j=0;$j<=$#colcont;$j++) { my $rid=$colcont[$j]; - my $metainfo = ''; - my $esrc=&Apache::lonnet::declutter($hash{'src_'.$rid}); - my ($mapid,$resid)=split(/\./,$rid); - my $symb=&Apache::lonnet::encode_symb($hash{'map_id_'.$mapid},$resid,$hash{'src_'.$rid}); - if ($hash{'encrypted_'.$rid}) { - $symb=&Apache::lonenc::encrypted($symb); - $esrc=&Apache::lonenc::encrypted($esrc); - } - unless ($hash{'src_'.$rid} =~ m-^/uploaded/-) { - $metainfo =''. - ''. - ''. - ''; - } - $metainfo .= ''. - ''. - ''; - if ( - ($hash{'src_'.$rid}=~/\.(problem|exam|quiz|assess|survey|form)$/) && - (&Apache::lonnet::allowed('mgr',$env{'request.course.id'})) && - ($hash{'src_'.$rid} !~ m-^/uploaded/-)) { - my ($mapid,$resid)=split(/\./,$rid); - my $symb= - &Apache::lonnet::declutter($hash{'map_id_'.$mapid}). - '___'.$resid.'___'. - &Apache::lonnet::declutter($hash{'src_'.$rid}); - $metainfo.= - ''. - '&command=submission">'. - ''. - ''. - ''. - '&command=gradingmenu">'. - ''. - ''. - ''. - '" >'. - ''. - ''; - } - $metainfo.='

'; - unless ($target eq 'tex') { + + my $metainfo =&get_buttons(\%hash,$rid).'
'; + unless (($target eq 'tex') || ($target eq 'tex_answer')) { $r->print(''); } else { - for (my $incol=1;$incol<=$avespan;$incol++) { - $r->print(' & '); - } +# for (my $incol=1;$incol<=$avespan;$incol++) { +# $r->print(' & '); +# } } } - unless ($target eq 'tex') { + unless (($target eq 'tex') || ($target eq 'tex_answer')) { $r->print(''); } else { - $r->print('REMOVETHEHEADOFLONGTABLE\\\\'); +# $r->print('REMOVETHEHEADOFLONGTABLE\\\\'); } } } - unless ($target eq 'tex') { + unless (($target eq 'tex') || ($target eq 'tex_answer')) { $r->print("\n
print(' bgcolor="'. $ssibgcolor{$rid}.'"'); @@ -489,21 +471,19 @@ sub handler { $r->print('>'); } $r->print($ssibody{$rid}); - unless ($target eq 'tex') { + unless (($target eq 'tex') || ($target eq 'tex_answer')) { $r->print(''); } if ($env{'course.'. $env{'request.course.id'}. '.pageseparators'} eq 'yes') { - unless($target eq 'tex') { + unless (($target eq 'tex') || ($target eq 'tex_answer')) { $r->print('
'); - } else { - $r->print('\hline'); - } + } } } elsif ($cellemb{$rid} eq 'img') { $r->print('>'.$metainfo.''); + $hash{'src_'.$rid}.'" />'); } elsif ($cellemb{$rid} eq 'emb') { $r->print('>'.$metainfo.''); @@ -512,25 +492,25 @@ sub handler { &mt('It is recommended that you use an up-to-date virus scanner before handling this file.').'

'. &Apache::londocs::entryline(0,&mt("Click to download or use your browser's Save Link function"),'/'.&Apache::lonnet::declutter($hash{'src_'.$rid})).'


'); } - unless ($target eq 'tex') { + unless (($target eq 'tex') || ($target eq 'tex_answer')) { $r->print('
"); } else { - $r->print('\end{longtable}\strut'); +# $r->print('\end{longtable}\strut'); } # ---------------------------------------------------------------- Submit, etc. if ($nforms) { @@ -538,8 +518,9 @@ sub handler { '
'); } - unless ($target eq 'tex') { - $r->print(&Apache::loncommon::end_page()); + unless (($target eq 'tex') || ($target eq 'tex_answer')) { + $r->print(&Apache::loncommon::end_page({'discussion' + => 1,})); } else { $r->print('\end{document}'.$number_of_columns); } @@ -571,9 +552,65 @@ sub handler { return OK; } +sub get_buttons { + my ($hash,$rid) = @_; + + my $metainfo = ''; + my $esrc=&Apache::lonnet::declutter($hash->{'src_'.$rid}); + my ($mapid,$resid)=split(/\./,$rid); + my $symb=&Apache::lonnet::encode_symb($hash->{'map_id_'.$mapid}, + $resid, + $hash->{'src_'.$rid}); + if ($hash->{'encrypted_'.$rid}) { + $symb=&Apache::lonenc::encrypted($symb); + $esrc=&Apache::lonenc::encrypted($esrc); + } + if ($hash->{'src_'.$rid} !~ m-^/uploaded/- + && !$env{'request.enc'} + && ($env{'request.role.adv'} + || !$hash->{'encrypted_'.$rid})) { + $metainfo .=''. + ''. + ''. + ''; + } + $metainfo .= ''. + ''. + ''; + if (($hash->{'src_'.$rid}=~/\.(problem|exam|quiz|assess|survey|form)$/) && + ($hash->{'src_'.$rid} !~ m-^/uploaded/-)) { + + if (&Apache::lonnet::allowed('mgr',$env{'request.course.id'})) { + $metainfo.= + ''. + '&command=submission">'. + ''. + ''. + ''. + '&command=gradingmenu">'. + ''. + ''; + } + if (&Apache::lonnet::allowed('opa',$env{'request.course.id'})) { + $metainfo.= + ''. + '" >'. + ''. + ''; + } + } + return $metainfo; +} + 1; __END__ + =head1 NAME Apache::lonpage - Page Handler @@ -675,5 +712,3 @@ tracetable() : Build page table. =cut - - 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.