Diff for /rat/lonpage.pm between versions 1.1 and 1.5

version 1.1, 2000/08/30 11:10:23 version 1.5, 2000/09/15 20:03:48
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 Gerd Kortemeyer  # 08/30,08/31,09/06,09/14,09/15 Gerd Kortemeyer
   
 package Apache::lonpage;  package Apache::lonpage;
   
Line 13  use Apache::Constants qw(:common :http); Line 13  use Apache::Constants qw(:common :http);
 use Apache::lonnet();  use Apache::lonnet();
 use GDBM_File;  use GDBM_File;
   
   # -------------------------------------------------------------- Module Globals
   my %hash;
   my @rows;
                     
   my %ssibody=();
   my %ssibgcolor=();
   my %ssitext=();
   my %ssilink=();
   my %ssivlink=();
   my %ssialink=();
   my %cellemb=();
   
   # ------------------------------------------------------------ Build page table
   
   sub tracetable {
       my ($sofar,$rid,$beenhere)=@_;
       my $further=$sofar;
       unless ($beenhere=~/\&$rid\&/) {
          $beenhere.=$rid.'&';  
   
          if (defined($hash{'is_map_'.$rid})) {
              if ((defined($hash{'map_start_'.$hash{'src_'.$rid}})) &&
                  (defined($hash{'map_finish_'.$hash{'src_'.$rid}}))) {
                 my $frid=$hash{'map_finish_'.$hash{'src_'.$rid}};
         $sofar=
                   &tracetable($sofar,$hash{'map_start_'.$hash{'src_'.$rid}},
                   '&'.$frid.'&');
                 $sofar++;
                 if ($hash{'src_'.$frid}) {
                  my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$frid});
                  if (($brepriv eq '2') || ($brepriv eq 'F')) {
                    if (defined($rows[$sofar])) {
                      $rows[$sofar].='&'.$frid;
                    } else {
                      $rows[$sofar]=$frid;
                    }
          }
         }
      }
          } else {
             $sofar++;
             if ($hash{'src_'.$rid}) {
              my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$rid});
              if (($brepriv eq '2') || ($brepriv eq 'F')) {
                if (defined($rows[$sofar])) {
                  $rows[$sofar].='&'.$rid;
                } else {
                  $rows[$sofar]=$rid;
                }
      }
             }
          }
   
          if (defined($hash{'to_'.$rid})) {
             map {
                 my $now=&tracetable($sofar,$hash{'goesto_'.$_},$beenhere);
                 if ($now>$further) { $further=$now; }
             } split(/\,/,$hash{'to_'.$rid});
          }
       }
       return $further;
   }
   
   sub cell {
       my ($r,$colspan,$rid)=@_;
       $r->print('<td colspan="'.$colspan.'"');
       if ($cellemb{$rid} eq 'ssi') {
          $r->print('>'.$ssibody{$rid});
       } elsif ($cellemb{$rid} eq 'img') {
          $r->print('><img src="'.$hash{'src_'.$rid}.'">');
       }
       $r->print('</td>');
   }
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
   
 sub handler {  sub handler {
   my $r=shift;    my $r=shift;
   
 # ----------------------------------------------------------- Set document type  # ------------------------------------------- Set document type for header only
   
   if ($ENV{'browser.mathml'}) {  
     $r->content_type('text/xml');  
   } else {  
     $r->content_type('text/html');  
   }  
   $r->send_http_header;  
   
   return OK if $r->header_only;    if ($r->header_only) {
          if ($ENV{'browser.mathml'}) {
              $r->content_type('text/xml');
          } else {
              $r->content_type('text/html');
          }
          $r->send_http_header;
          return OK;
      }
   
   my $requrl=$r->uri;    my $requrl=$r->uri;
 # ----------------------------------------------------------------- Tie db file  # ----------------------------------------------------------------- Tie db file
   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") {
           my %hash;  
           if (tie(%hash,'GDBM_File',"$fn.db",&GDBM_WRCREAT,0640)) {            if (tie(%hash,'GDBM_File',"$fn.db",&GDBM_WRCREAT,0640)) {
 # ------------------------------------------------------------------- Hash tied  # ------------------------------------------------------------------- Hash tied
               my $firstres=$hash{'map_start_'.$requrl};                my $firstres=$hash{'map_start_'.$requrl};
Line 42  sub handler { Line 116  sub handler {
               if (($firstres) && ($lastres)) {                if (($firstres) && ($lastres)) {
 # ----------------------------------------------------------------- Render page  # ----------------------------------------------------------------- Render page
   
   $r->print("<h2>All is cool.</h2>");                    @rows=();
   
                     &tracetable(0,$firstres,'&'.$lastres.'&');
                     if ($hash{'src_'.$lastres}) {
                        my $brepriv=
                           &Apache::lonnet::allowed('bre',$hash{'src_'.$lastres});
                        if (($brepriv eq '2') || ($brepriv eq 'F')) {
                           $rows[$#rows+1]=''.$lastres;
        }
     }
   
                     my $i;
                     my $j;
                     my $maxcols=-1;
   
   # --------------------------------------------- Get SSI output, post parameters
   
                     for ($i=0;$i<=$#rows;$i++) {
        if ($rows[$i]) {
                         my @colcont=split(/\&/,$rows[$i]);
                         $maxcols=$#colcont>$maxcols?$#colcont:$maxcols;
                         map {
                             my $src=$hash{'src_'.$_};
                             $src=~/\.(\w+)$/;
                             $cellemb{$_}=Apache::lonnet::fileembstyle($1);
                             if ($cellemb{$_} eq 'ssi') {
   # --------------------------------------------------------- This is an SSI cell
         my $prefix=$_.'_';
                                 my %posthash=('request.prefix' => $prefix);
                                 map {
     if ($_=~/^form.$prefix/) {
         my $name=$_;
                                         $name=~s/^form.$prefix//;
                                         $posthash{$name}=$ENV{$_};
                                     }
                                 } keys %ENV;
                                 my $output=Apache::lonnet::ssi($src,%posthash);
   
         $ssibody{$_}=$output;
   
   # ---------------------------------------------------------------- End SSI cell
                             }
                         } @colcont;
                        } 
                     }
                     if ($maxcols<0) {
                         $r->content_type('text/html');
                         $r->send_http_header;
                         $r->print('<html><body>Empty page.</body></html>');
                     } else {
   # ------------------------------------------------------------------ Build page
                         $maxcols++;
                         $r->content_type('text/html');
                         $r->send_http_header;
                         $r->print('<html><body>');
    
                         $r->print('<table cols="'.$maxcols.'" rows="'.
                                    $#rows.'" border="0">');
                         for ($i=0;$i<=$#rows;$i++) {
    if ($rows[$i]) {
                             $r->print("\n<tr>");
                             my @colcont=split(/\&/,$rows[$i]);
                             my $avespan=int($maxcols/($#colcont+1));
                             my $lastspan=$maxcols-$avespan*$#colcont;
                             for ($j=0;$j<$#colcont;$j++) {
                                 &cell($r,$avespan,$colcont[$j]);
                             }
                             &cell($r,$lastspan,$colcont[$#colcont]);
                             $r->print('</tr>');
           }
                         }
                         $r->print("\n</table>");
   
                         $r->print('</body></html>');
   # -------------------------------------------------------------------- End page
                     }                  
 # ------------------------------------------------------------- End render page  # ------------------------------------------------------------- End render page
               } else {                } else {
   $r->print("<h2>Page undefined.</h2>");                    $r->content_type('text/html');
                     $r->send_http_header;
     $r->print('<html><body>Page undefined.</body></html>');
               }                }
 # ------------------------------------------------------------------ Untie hash  # ------------------------------------------------------------------ Untie hash
               unless (untie(%hash)) {                unless (untie(%hash)) {

Removed from v.1.1  
changed lines
  Added in v.1.5


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