Diff for /rat/lonpage.pm between versions 1.75 and 1.98

version 1.75, 2006/05/30 17:15:10 version 1.98, 2012/11/30 18:16:53
Line 27 Line 27
 #  #
 ###  ###
   
   
   
   
 package Apache::lonpage;  package Apache::lonpage;
   
 use strict;  use strict;
Line 78  sub tracetable { Line 81  sub tracetable {
                     my $frid=$hash{'map_finish_'.$hash{'src_'.$rid}};                      my $frid=$hash{'map_finish_'.$hash{'src_'.$rid}};
             $sofar=              $sofar=
                        &tracetable($sofar,$hash{'map_start_'.$hash{'src_'.$rid}},                         &tracetable($sofar,$hash{'map_start_'.$hash{'src_'.$rid}},
                        '&'.$frid.'&');                         '&'.$frid.$beenhere);
                     $sofar++;                      $sofar++;
                     if ($hash{'src_'.$frid}) {                      if ($hash{'src_'.$frid}) {
                         my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$frid});                          my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$frid});
Line 155  sub handler { Line 158  sub handler {
   my $number_of_columns = 1;    my $number_of_columns = 1;
   my $requrl=$r->uri;      my $requrl=$r->uri;  
   my $target = $env{'form.grade_target'};    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");  #  &Apache::lonnet::logthis("Got a target of $target");
   if ($target eq 'meta') {    if ($target eq 'meta') {
       &Apache::loncommon::content_type($r,'text/html');        &Apache::loncommon::content_type($r,'text/html');
Line 198  sub handler { Line 214  sub handler {
                   my $lcm=1;                    my $lcm=1;
                   my $contents=0;                    my $contents=0;
                   my $nforms=0;                    my $nforms=0;
                     my $nuploads=0;
                     my %turninpaths;
                     my %multiresps;
                     my $turninparent;
                                       
                   my %ssibody=();                    my %ssibody=();
                   my %ssibgcolor=();                    my %ssibgcolor=();
Line 206  sub handler { Line 226  sub handler {
                   my %ssivlink=();                    my %ssivlink=();
                   my %ssialink=();                    my %ssialink=();
             
                   my %metalink=();  
   
                   my %cellemb=();                    my %cellemb=();
   
                   my $allscript='';                    my $allscript='';
Line 230  sub handler { Line 248  sub handler {
   if ($hash{'encrypted_'.$_}) {    if ($hash{'encrypted_'.$_}) {
       $src=&Apache::lonenc::encrypted($src);        $src=&Apache::lonenc::encrypted($src);
   }    }
                           $metalink{$_}=$src.'.meta';  
                           $cellemb{$_}=                            $cellemb{$_}=
       &Apache::loncommon::fileembstyle($extension);        &Apache::loncommon::fileembstyle($extension);
                           if ($cellemb{$_} eq 'ssi') {                            if ($cellemb{$_} eq 'ssi') {
Line 242  sub handler { Line 259  sub handler {
                               my %posthash=('request.prefix' => $prefix,                                my %posthash=('request.prefix' => $prefix,
     'LONCAPA_INTERNAL_no_discussion' => 'true',      'LONCAPA_INTERNAL_no_discussion' => 'true',
     'symb' => $symb);      '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{'grade_target'}=$env{'form.grade_target'};
   $posthash{'textwidth'}=$env{'form.textwidth'};    $posthash{'textwidth'}=$env{'form.textwidth'};
   $posthash{'problem_split'}=$env{'form.problem_split'};    $posthash{'problem_split'}=$env{'form.problem_split'};
   $posthash{'latex_type'}=$env{'form.latex_type'};    $posthash{'latex_type'}=$env{'form.latex_type'};
   $posthash{'rndseed'}=$env{'form.rndseed'};    $posthash{'rndseed'}=$env{'form.rndseed'};
                                     $posthash{'answer_output_mode'} = $env{'form.answer_output_mode'};
       }        }
       my $submitted=exists($env{'form.all_submit'});        my $submitted=exists($env{'form.all_submit'});
       if (!$submitted) {        if (!$submitted) {
Line 270  sub handler { Line 289  sub handler {
   }    }
       }        }
                               my $output=Apache::lonnet::ssi($src,%posthash);                                my $output=Apache::lonnet::ssi($src,%posthash);
       $output=~s|//(\s*<!--)? BEGIN LON-CAPA Internal.+// END LON-CAPA Internal\s*(-->)?\s||gs;        $output=~s|//(\s*<!--)? BEGIN LON-CAPA Internal.+?// END LON-CAPA Internal\s*(-->)?\s||gs;
                               if ($target eq 'tex') {                                if (($target eq 'tex') || ($target eq 'tex_answer')) {
   $output =~ s/^([^&]+)\\begin{document}//;    $output =~ s/^([^&]+)\\begin{document}//;
   $output =~ s/\\end{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                                     #some additional cleanup necessary for LateX (due to limitations of table environment 
   $output =~ s/(\\vskip\s*\d+mm)\s*(\\\\)+/$1/g;    $output =~ s/(\\vskip\s*\d+mm)\s*(\\\\)+/$1/g;
       }        }
Line 337  sub handler { Line 356  sub handler {
   $nforms++;    $nforms++;
                                   $output=~s/\<form[^\>]*\>//gsi;                                    $output=~s/\<form[^\>]*\>//gsi;
                                   $output=~s/\<\/form[^\>]*\>//gsi;                                    $output=~s/\<\/form[^\>]*\>//gsi;
                                     if ($output=~/\<input[^\>]+name\s*=\s*[\'\"]*HWFILE/) {
                                         $nuploads++;
                                     }
                                   $output=~                                    $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;
                                     if ($nuploads) {
                                         $output=~
                                             s/\<(input[^\>]+name=\"\Q$prefix\EHWFILE[^\>]+)\s*id\s*\=\s*[\'\"]*([^\'\"]+)[\'\"]*([^\)]*)\>/\<$1 id="$prefix$2" $3\>/gsi;
                                          ($turninpaths{$prefix},$multiresps{$prefix}) = 
                                              &Apache::loncommon::get_turnedin_filepath($symb,$env{'user.name'},$env{'user.domain'});
                                          if ($turninparent eq '') {
                                              $turninparent = $turninpaths{$prefix};
                                              $turninparent =~ s{(/[^/]+)$}{}; 
                                          }
                                     }
                                     $output=~
                                         s/\<((?:input|select)[^\>]+\Qjavascript:setSubmittedPart\E)\(\s*[\'\"]([^\'\"]+)[\'\"]*\s*\)/\<$1('$2','$prefix')/gsi;
                               }                                }
                               $thisdir=~s/\/[^\/]*$//;                                $thisdir=~s/\/[^\/]*$//;
       foreach (@rlinks) {        foreach (@rlinks) {
   unless (($_=~/^http:\/\//i) ||    unless (($_=~/^https?\:\/\//i) ||
   ($_=~/^\//) ||    ($_=~/^\//) ||
   ($_=~/^javascript:/i) ||    ($_=~/^javascript:/i) ||
   ($_=~/^mailto:/i) ||    ($_=~/^mailto:/i) ||
Line 372  sub handler { Line 406  sub handler {
 # ------------------------------------------------------------------ Build page  # ------------------------------------------------------------------ Build page
   
 # ---------------------------------------------------------------- Send headers  # ---------------------------------------------------------------- Send headers
       unless ($target eq 'tex') {        unless (($target eq 'tex') || ($target eq 'tex_answer')) {
   if ($isxml) {    if ($isxml) {
       &Apache::loncommon::content_type($r,'text/xml');        &Apache::loncommon::content_type($r,'text/xml');
   } else {    } else {
Line 381  sub handler { Line 415  sub handler {
   $r->send_http_header;    $r->send_http_header;
 # ------------------------------------------------------------------------ Head  # ------------------------------------------------------------------------ Head
   if ($allscript) {    if ($allscript) {
       $allscript .=         $allscript = 
   "\n<script type=\"text/javascript\">\n".    "\n".'<script type="text/javascript">'."\n".
   $allscript."\n</script>\n";    $allscript.
     "\n</script>\n";
   }    }
                             if (($nforms) && ($nuploads)) {
                                 $allscript .= &Apache::lonhtmlcommon::file_submissionchk_js(\%turninpaths,\%multiresps);
                             }
 # ------------------------------------------------------------------ Start body  # ------------------------------------------------------------------ Start body
   $r->print(&Apache::loncommon::start_page(undef,undef,    $r->print(&Apache::loncommon::start_page(undef,$allscript,
    {'force_register' => 1,     {'force_register' => 1,
     'bgcolor'        => '#ffffff',}));      'bgcolor'        => '#ffffff',}));
 # ------------------------------------------------------------------ Start form  # ------------------------------------------------------------------ Start form
   if ($nforms) {    if ($nforms) {
       $r->print('<form method="post" action="'.        my $fmtag = '<form name="lonhomework" method="post"  enctype="multipart/form-data"';
                                 if ($nuploads) {
                                     my $multi;
                                     if ($nuploads > 1) {
                                         $multi = 1;
                                     }
                                     $fmtag .= 'onsubmit="return file_submission_check(this,'."'$turninparent','$multi'".');"';
                                 }
                                 $fmtag .= ' action="'.
  &Apache::lonenc::check_encrypt($requrl)   &Apache::lonenc::check_encrypt($requrl)
  .'">');   .'">';
                                 $r->print($fmtag);
   }    }
       } elsif ($target eq 'tex') {        } elsif (($target eq 'tex') || ($target eq 'tex_answer')) {
   $r->print('\documentclass{article}    #  I think this is not needed as the header
                                  \newcommand{\keephidden}[1]{}               # will be put in for each of the page parts
                                  \usepackage[dvips]{graphicx}    # by the londefdef.pm now that we are opening up
                                  \usepackage{epsfig}    # the parts of a page.
                                  \usepackage{calc}    #$r->print('\documentclass{article}
                                  \usepackage{longtable}                            #       \newcommand{\keephidden}[1]{}           
                                  \begin{document}');                            #       \usepackage[dvips]{graphicx}
                             #       \usepackage{epsfig}
                             #       \usepackage{calc}
                             #       \usepackage{longtable}
                             #       \begin{document}');
       }        }
 # ----------------------------------------------------------------- Start table  # ----------------------------------------------------------------- Start table
       if ($target eq 'tex') {        if (($target eq 'tex') || ($target eq 'tex_answer')) {
   $r->print('\begin{longtable}INSERTTHEHEADOFLONGTABLE\endfirsthead\endhead ');  # #  $r->print('\begin{longtable}INSERTTHEHEADOFLONGTABLE\endfirsthead\endhead ');
   if ($number_of_columns le $lcm) {$number_of_columns=$lcm;};    if ($number_of_columns le $lcm) {$number_of_columns=$lcm;};
       } else {        } else {
   $r->print('<table width="100%" cols="'.$lcm.'" border="0">');    $r->print('<table width="100%" cols="'.$lcm.'" border="0">');
       }        }
   # generate rows
                       for ($i=0;$i<=$#rows;$i++) {                        for ($i=0;$i<=$#rows;$i++) {
  if ($rows[$i]) {   if ($rows[$i]) {
     unless ($target eq 'tex') {      unless (($target eq 'tex') || ($target eq 'tex_answer')) {
  $r->print("\n<tr>");   $r->print("\n<tr>");
     }      }
                           my @colcont=split(/\&/,$rows[$i]);                            my @colcont=split(/\&/,$rows[$i]);
                           my $avespan=$lcm/($#colcont+1);                            my $avespan=$lcm/($#colcont+1);
                           for ($j=0;$j<=$#colcont;$j++) {                            for ($j=0;$j<=$#colcont;$j++) {
                               my $rid=$colcont[$j];                                my $rid=$colcont[$j];
                               my $metainfo = '';  
       my $esrc=&Apache::lonnet::declutter($hash{'src_'.$rid});        my $metainfo =&get_buttons(\%hash,$rid).'<br />';
       my ($mapid,$resid)=split(/\./,$rid);      unless (($target eq 'tex') || ($target eq 'tex_answer')) {
       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 ='<a name="'.&escape($symb).'" />'.  
                                   '<a href="'.$metalink{$rid}.'" target="LONcatInfo">'.  
                                   '<img src="/adm/lonMisc/cat_button.gif" border=0>'.  
                                   '</img></a>';  
                               }  
                               $metainfo .= '<a href="/adm/evaluate?postdata='.  
   &escape($esrc).  
                                   '" target="LONcatInfo">'.  
                                   '<img src="/adm/lonMisc/eval_button.gif" border=0>'.  
                                   '</img></a>';  
                               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.=  
                   '<a href="/adm/grades?symb='.&escape($symb).  
 #                 '&command=submission" target="LONcatInfo">'.  
                   '&command=submission">'.  
                           '<img src="/adm/lonMisc/subm_button.gif" border=0>'.  
   '</img></a>'.  
                   '<a href="/adm/grades?symb='.&escape($symb).  
 #                  '&command=gradingmenu" target="LONcatInfo">'.  
                   '&command=gradingmenu">'.  
                           '<img src="/adm/lonMisc/pgrd_button.gif" border=0>'.  
   '</img></a>'.  
                   '<a href="/adm/parmset?symb='.&escape($symb).  
 #                          '" target="LONcatInfo">'.  
                           '" >'.  
                           '<img src="/adm/lonMisc/pprm_button.gif" border=0>'.  
       '</img></a>';  
                               }  
                               $metainfo.='<br></br>';  
     unless ($target eq 'tex') {  
  $r->print('<td colspan="'.$avespan.'"');   $r->print('<td colspan="'.$avespan.'"');
     }      }
                               if ($cellemb{$rid} eq 'ssi') {                                if ($cellemb{$rid} eq 'ssi') {
   unless ($target eq 'tex') {    unless (($target eq 'tex') || ($target eq 'tex_answer')) {
       if ($ssibgcolor{$rid}) {        if ($ssibgcolor{$rid}) {
   $r->print(' bgcolor="'.    $r->print(' bgcolor="'.
     $ssibgcolor{$rid}.'"');      $ssibgcolor{$rid}.'"');
Line 492  sub handler { Line 500  sub handler {
       $r->print('>');        $r->print('>');
   }    }
                                   $r->print($ssibody{$rid});                                    $r->print($ssibody{$rid});
   unless ($target eq 'tex') {    unless (($target eq 'tex') || ($target eq 'tex_answer')) {
       $r->print('</font>');        $r->print('</font>');
                                   }                                    }
                                   if ($env{'course.'.                                    if ($env{'course.'.
                                       $env{'request.course.id'}.                                        $env{'request.course.id'}.
                                       '.pageseparators'} eq 'yes') {                                        '.pageseparators'} eq 'yes') {
                                       unless($target eq 'tex') {                                        unless (($target eq 'tex') || ($target eq 'tex_answer')) {
                                           $r->print('<hr />');                                            $r->print('<hr />');
                                       } else {                                        } 
                                           $r->print('\hline');  
                                       }  
   }    }
       } elsif ($cellemb{$rid} eq 'img') {        } elsif ($cellemb{$rid} eq 'img') {
                                   $r->print('>'.$metainfo.'<img src="'.                                    $r->print('>'.$metainfo.'<img src="'.
                                     $hash{'src_'.$rid}.'"></img>');                                      $hash{'src_'.$rid}.'" />');
       } elsif ($cellemb{$rid} eq 'emb') {        } elsif ($cellemb{$rid} eq 'emb') {
                                   $r->print('>'.$metainfo.'<embed src="'.                                    $r->print('>'.$metainfo.'<embed src="'.
                                     $hash{'src_'.$rid}.'"></embed>');                                      $hash{'src_'.$rid}.'"></embed>');
Line 515  sub handler { Line 521  sub handler {
                                   &mt('It is recommended that you use an up-to-date virus scanner before handling this file.').'</p><p><table>'.                                    &mt('It is recommended that you use an up-to-date virus scanner before handling this file.').'</p><p><table>'.
                                   &Apache::londocs::entryline(0,&mt("Click to download or use your browser's Save Link function"),'/'.&Apache::lonnet::declutter($hash{'src_'.$rid})).'</table></p><br />');                                    &Apache::londocs::entryline(0,&mt("Click to download or use your browser's Save Link function"),'/'.&Apache::lonnet::declutter($hash{'src_'.$rid})).'</table></p><br />');
                               }                                }
       unless ($target eq 'tex') {        unless (($target eq 'tex') || ($target eq 'tex_answer')) {
   $r->print('</td>');    $r->print('</td>');
       } else {        } else {
                                   for (my $incol=1;$incol<=$avespan;$incol++) {  #                                  for (my $incol=1;$incol<=$avespan;$incol++) {
       $r->print(' & ');  #      $r->print(' & ');
   }  #  }
       }        }
                           }                            }
       unless ($target eq 'tex') {        unless (($target eq 'tex') || ($target eq 'tex_answer')) {
   $r->print('</tr>');    $r->print('</tr>');
       } else {        } else {
   $r->print('REMOVETHEHEADOFLONGTABLE\\\\');  #  $r->print('REMOVETHEHEADOFLONGTABLE\\\\');
       }        }
         }          }
                       }                        }
       unless ($target eq 'tex') {        unless (($target eq 'tex') || ($target eq 'tex_answer')) {
   $r->print("\n</table>");    $r->print("\n</table>");
       } else {        } else {
   $r->print('\end{longtable}\strut');  #  $r->print('\end{longtable}\strut');
       }        }
 # ---------------------------------------------------------------- Submit, etc.  # ---------------------------------------------------------------- Submit, etc.
                       if ($nforms) {                        if ($nforms) {
Line 541  sub handler { Line 547  sub handler {
                   '<input name="all_submit" value="Submit All" type="'.                    '<input name="all_submit" value="Submit All" type="'.
   (($nforms>1)?'submit':'hidden').'"></input></form>');    (($nforms>1)?'submit':'hidden').'"></input></form>');
                       }                        }
       unless ($target eq 'tex') {        unless (($target eq 'tex') || ($target eq 'tex_answer')) {
   $r->print(&Apache::loncommon::end_page());    $r->print(&Apache::loncommon::end_page({'discussion'
         => 1,}));
       } else {        } else {
   $r->print('\end{document}'.$number_of_columns);    $r->print('\end{document}'.$number_of_columns);
       }        }
Line 574  sub handler { Line 581  sub handler {
   return OK;     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 .='<a name="'.&escape($symb).'" />'.
       '<a href="'.$hash->{'src_'.$rid}.'.meta'.'" target="LONcatInfo">'.
       '<img src="/adm/lonMisc/cat_button.png" class="LC_icon" />'.
       '</a>';
       }
       if ($hash->{'src_'.$rid} !~ m{^/uploaded/}) {
           $metainfo .= '<a href="/adm/evaluate?postdata='.
       &escape($esrc).
       '" target="LONcatInfo">'.
       '<img src="/adm/lonMisc/eval_button.png" class="LC_icon" />'.
       '</a>';
       }
       if (($hash->{'src_'.$rid}=~/$LONCAPA::assess_re/) &&
    ($hash->{'src_'.$rid} !~ m-^/uploaded/-)) {
   
    if (&Apache::lonnet::allowed('mgr',$env{'request.course.id'})) {
       $metainfo.=
    '<a href="/adm/grades?symb='.&escape($symb).
   #               '&command=submission" target="LONcatInfo">'.
    '&command=submission">'.
    '<img src="/adm/lonMisc/subm_button.png" class="LC_icon" />'.
    '</a>'.
    '<a href="/adm/grades?symb='.&escape($symb).
   #               '&command=gradingmenu" target="LONcatInfo">'.
    '&command=gradingmenu">'.
    '<img src="/adm/lonMisc/pgrd_button.png" class="LC_icon" />'.
    '</a>';
    }
    if (&Apache::lonnet::allowed('opa',$env{'request.course.id'})) {
       $metainfo.=
    '<a href="/adm/parmset?symb='.&escape($symb).
   #               '" target="LONcatInfo">'.
    '" >'.
    '<img src="/adm/lonMisc/pprm_button.png" class="LC_icon" />'.
    '</a>';
    }
       }
       return $metainfo;
   }
   
 1;  1;
 __END__  __END__
   
   
 =head1 NAME  =head1 NAME
   
 Apache::lonpage - Page Handler  Apache::lonpage - Page Handler
Line 678  tracetable() : Build page table. Line 743  tracetable() : Build page table.
 =cut  =cut
   
   
   
   

Removed from v.1.75  
changed lines
  Added in v.1.98


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>