Diff for /rat/lonpage.pm between versions 1.4 and 1.10

version 1.4, 2000/09/14 20:10:39 version 1.10, 2000/10/02 21:33:40
Line 4 Line 4
 # (TeX Content Handler  # (TeX Content Handler
 #  #
 # 05/29/00,05/30 Gerd Kortemeyer)  # 05/29/00,05/30 Gerd Kortemeyer)
 # 08/30,08/31,09/06,09/14 Gerd Kortemeyer  # 08/30,08/31,09/06,09/14,09/15,09/16,09/19,09/20,09/21,09/23,
   # 10/02 Gerd Kortemeyer
   
 package Apache::lonpage;  package Apache::lonpage;
   
 use strict;  use strict;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
 use Apache::lonnet();  use Apache::lonnet();
   use HTML::TokeParser;
 use GDBM_File;  use GDBM_File;
   
 # -------------------------------------------------------------- Module Globals  # -------------------------------------------------------------- Module Globals
 my %hash;  my %hash;
 my @rows;  my @rows;
                     
 my %ssibody=();  # ------------------------------------------------------------------ Euclid gcd
 my %ssibgcolor=();  
 my %ssitext=();  sub euclid {
 my %ssilink=();      my ($e,$f)=@_;
 my %ssivlink=();      my $a; my $b; my $r;
 my %ssialink=();      if ($e>$f) { $b=$e; $r=$f; } else { $r=$e; $b=$f; }
 my %cellemb=();      while ($r!=0) {
    $a=$b; $b=$r;
           $r=$a%$b;
       }
       return $b;
   }
   
 # ------------------------------------------------------------ Build page table  # ------------------------------------------------------------ Build page table
   
Line 76  sub tracetable { Line 83  sub tracetable {
     return $further;      return $further;
 }  }
   
 sub cell {  
     my ($r,$colspan,$rid)=@_;  
     $r->print('<td colspan="'.$colspan.'">');  
     $r->print($hash{'src_'.$rid});  
     $r->print('</td>');  
 }  
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
   
 sub handler {  sub handler {
Line 105  sub handler { Line 105  sub handler {
   if ($ENV{'request.course.fn'}) {    if ($ENV{'request.course.fn'}) {
       my $fn=$ENV{'request.course.fn'};        my $fn=$ENV{'request.course.fn'};
       if (-e "$fn.db") {        if (-e "$fn.db") {
           if (tie(%hash,'GDBM_File',"$fn.db",&GDBM_WRCREAT,0640)) {            if (tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER,0640)) {
 # ------------------------------------------------------------------- Hash tied  # ------------------------------------------------------------------- Hash tied
               my $firstres=$hash{'map_start_'.$requrl};                my $firstres=$hash{'map_start_'.$requrl};
               my $lastres=$hash{'map_finish_'.$requrl};                my $lastres=$hash{'map_finish_'.$requrl};
Line 123  sub handler { Line 123  sub handler {
      }       }
   }    }
   
   # ------------------------------------------------------------ Add to symb list
   
                   my $i;                    my $i;
                     my %symbhash=();
                     for ($i=0;$i<=$#rows;$i++) {
        if ($rows[$i]) {
                           my @colcont=split(/\&/,$rows[$i]);
                           map {
                              $symbhash{$hash{'src_'.$_}}='';
           } @colcont;
        }
     }
                     &Apache::lonnet::symblist($requrl,%symbhash);
   
   # ------------------------------------------------------------------ Page parms
   
                   my $j;                    my $j;
                   my $maxcols=-1;                    my $lcm=1;
                     my $contents=0;
                     my $nforms=0;
                     
                     my %ssibody=();
                     my %ssibgcolor=();
                     my %ssitext=();
                     my %ssilink=();
                     my %ssivlink=();
                     my %ssialink=();
                     my %cellemb=();
   
                     my $allscript='';
                     my $allmeta='';
   
                     my $isxml=0;
                     my $xmlheader='';
                     my $xmlbody='';
   
 # --------------------------------------------- Get SSI output, post parameters  # --------------------------------------------- Get SSI output, post parameters
   
                   for ($i=0;$i<=$#rows;$i++) {                    for ($i=0;$i<=$#rows;$i++) {
      if ($rows[$i]) {       if ($rows[$i]) {
         $contents++;
                       my @colcont=split(/\&/,$rows[$i]);                        my @colcont=split(/\&/,$rows[$i]);
                       $maxcols=$#colcont>$maxcols?$#colcont:$maxcols;                        $lcm*=($#colcont+1)/euclid($lcm,($#colcont+1));
                       map {                        map {
                           my $src=$hash{'src_'.$_};                            my $src=$hash{'src_'.$_};
                           $src=~/\.\w+$/;                            $src=~/\.(\w+)$/;
                           $cellemb{$_}=Apache::lonnet::fileembstyle($1);                            $cellemb{$_}=Apache::lonnet::fileembstyle($1);
                           if ($cellemb{$_} eq 'ssi') {                            if ($cellemb{$_} eq 'ssi') {
 # --------------------------------------------------------- This is an SSI cell  # --------------------------------------------------------- This is an SSI cell
         my $prefix=$_.'_';
                                 my %posthash=('request.prefix' => $prefix);
                                 if (($ENV{'form.'.$prefix.'submit'}) 
                                  || ($ENV{'form.all_submit'})) {
                                  map {
     if ($_=~/^form.$prefix/) {
         my $name=$_;
                                         $name=~s/^form.$prefix//;
                                         $posthash{$name}=$ENV{$_};
                                     }
                                  } keys %ENV;
         }
                                 my $output=Apache::lonnet::ssi($src,%posthash);
                                 my $parser=HTML::TokeParser->new(\$output);
                                 my $token;
                                 my $bodydef=0;
                                 my $thisxml=0;
                                 if ($output=~/\?xml/) {
                                    $isxml=1;
                                    $thisxml=1;
                                    $output=~
            /((?:\<(?:\?xml|\!DOC|html)[^\>]*(?:\>|\>\]\>)\s*)+)\<body[^\>]*\>/si;
                                    $xmlheader=$1;
         }
                                 while (($bodydef==0) &&
                                        ($token=$parser->get_token)) {
     if ($token->[1] eq 'body') {
         $bodydef=1;
                                         $ssibgcolor{$_}=$token->[2]->{'bgcolor'};
                                         $ssitext{$_}=$token->[2]->{'text'};
                                         $ssilink{$_}=$token->[2]->{'link'};
                                         $ssivlink{$_}=$token->[2]->{'vlink'};
                                         $ssialink{$_}=$token->[2]->{'alink'};
                                         if ($thisxml) {
     $xmlbody=$token->[4];
                                         }
                                     }
                                     if ($token->[1] eq 'meta') {
         $allmeta.="\n".$token->[4].'</meta>';
                                     }
                                     if ($token->[1] eq 'script') {
         $allscript.="\n\n"
                                                   .$parser->get_text('/script');
                                     }
                                 }
                                 if ($output=~/\<body[^\>]*\>(.*)/si) {
                                    $output=$1; 
                                 }
                                 $output=~s/\<\/body\>.*//si;
                                 if ($output=~/\<form/si) {
     $nforms++;
                                     $output=~s/\<form[^\>]*\>//gsi;
                                     $output=~s/\<\/form[^\>]*\>//gsi;
                                 }
         $ssibody{$_}=$output;
   
 # ---------------------------------------------------------------- End SSI cell  # ---------------------------------------------------------------- End SSI cell
                           }                            }
                       } @colcont;                        } @colcont;
                      }                        } 
                   }                    }
                   if ($maxcols<0) {                    unless ($contents) {
                       $r->content_type('text/html');                        $r->content_type('text/html');
                       $r->send_http_header;                        $r->send_http_header;
                       $r->print('<html><body>Empty page.</body></html>');                        $r->print('<html><body>Empty page.</body></html>');
                   } else {                    } else {
 # ------------------------------------------------------------------ Build page  # ------------------------------------------------------------------ Build page
                       $maxcols++;  
                       $r->content_type('text/html');  # ---------------------------------------------------------------- Send headers
                       $r->send_http_header;                        if ($isxml) {
                       $r->print('<html><body>');    $r->content_type('text/xml');
                              $r->send_http_header;
                       $r->print('<table cols="'.$maxcols.'" rows="'.                            $r->print($xmlheader);
                                  $#rows.'" border=1>');        } else {
                       for ($i=2;$i<=$#rows;$i++) {                            $r->content_type('text/html');
                             $r->send_http_header;
                             $r->print('<html>');
         }
   # ------------------------------------------------------------------------ Head
                         $r->print("\n<head>\n".$allmeta);
                         if ($allscript) {
     $r->print("\n<script>\n".$allscript."\n</script>\n");
                         }
                         $r->print("\n</head>\n");
   # ------------------------------------------------------------------ Start body
                         if ($isxml) {
                             $r->print($xmlbody);
                         } else {
     $r->print('<body bgcolor="#FFFFFF">');
                         }
   # ------------------------------------------------------------------ Start form
                         if ($nforms) {
     $r->print('<form method="post" action="'.
       $requrl.'">');
                         }
   # ----------------------------------------------------------------- Start table
                         $r->print('<table cols="'.$lcm.'" border="0">');
                         for ($i=0;$i<=$#rows;$i++) {
    if ($rows[$i]) {
                           $r->print("\n<tr>");                            $r->print("\n<tr>");
                           my @colcont=split(/\&/,$rows[$i]);                            my @colcont=split(/\&/,$rows[$i]);
                           my $avespan=int($maxcols/($#colcont+1));                            my $avespan=$lcm/($#colcont+1);
                           my $lastspan=$maxcols-$avespan*$#colcont;                            for ($j=0;$j<=$#colcont;$j++) {
                           for ($j=0;$j<$#colcont;$j++) {                                my $rid=$colcont[$j];
                               &cell($r,$avespan,$colcont[$j]);                                $r->print('<td colspan="'.$avespan.'"');
                                 if ($cellemb{$rid} eq 'ssi') {
     if ($ssibgcolor{$rid}) {
                                        $r->print(' bgcolor="'.
                                                  $ssibgcolor{$rid}.'"');
                                     }
                                     $r->print('><font');
                                     if ($ssitext{$rid}) {
        $r->print(' text="'.$ssitext{$rid}.'"');
                                     }
                                     if ($ssilink{$rid}) {
        $r->print(' link="'.$ssilink{$rid}.'"');
                                     }
                                     if ($ssitext{$rid}) {
        $r->print(' vlink="'.$ssivlink{$rid}.'"');
                                     }
                                     if ($ssialink{$rid}) {
        $r->print(' alink="'.$ssialink{$rid}.'"');
                                     }
                               
                                     $r->print('>'.$ssibody{$rid}.'</font>');
                                 } elsif ($cellemb{$rid} eq 'img') {
                                     $r->print('><img src="'.
                                       $hash{'src_'.$rid}.'"></img>');
         }
                                 $r->print('</td>');
                           }                            }
                           &cell($r,$lastspan,$colcont[$#colcont]);  
                           $r->print('</tr>');                            $r->print('</tr>');
           }
                       }                        }
                       $r->print("\n</table>");                        $r->print("\n</table>");
   # ---------------------------------------------------------------- Submit, etc.
                         if ($nforms) {
                             $r->print(
                     '<input name="all_submit" value="Submit All" type="'.
     (($nforms>1)?'submit':'hidden').'"></input></form>');
                         }
                       $r->print('</body></html>');                        $r->print('</body></html>');
 # -------------------------------------------------------------------- End page  # -------------------------------------------------------------------- End page
                   }                                      }                  
Line 190  sub handler { Line 333  sub handler {
           }            }
       }         } 
   }    }
   $ENV{'user.error.msg'}="$requrl:bre:1:1:Course not initialized";    $ENV{'user.error.msg'}="$requrl:bre:0:0:Course not initialized";
   return HTTP_NOT_ACCEPTABLE;     return HTTP_NOT_ACCEPTABLE; 
 }  }
   

Removed from v.1.4  
changed lines
  Added in v.1.10


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
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.