Annotation of rat/lonpage.pm, revision 1.3

1.1       www         1: # The LearningOnline Network with CAPA
                      2: # Page Handler
                      3: #
                      4: # (TeX Content Handler
                      5: #
                      6: # 05/29/00,05/30 Gerd Kortemeyer)
1.3     ! www         7: # 08/30,08/31,09/06,09/14 Gerd Kortemeyer
1.1       www         8: 
                      9: package Apache::lonpage;
                     10: 
                     11: use strict;
                     12: use Apache::Constants qw(:common :http);
                     13: use Apache::lonnet();
                     14: use GDBM_File;
                     15: 
1.2       www        16: # -------------------------------------------------------------- Module Globals
                     17: my %hash;
                     18: my @rows;
                     19: 
                     20: # ------------------------------------------------------------ Build page table
                     21: 
                     22: sub tracetable {
                     23:     my ($sofar,$rid,$beenhere)=@_;
                     24:     my $further=$sofar;
                     25:     unless ($beenhere=~/\&$rid\&/) {
                     26:        $beenhere.=$rid.'&';  
                     27: 
                     28:        if (defined($hash{'is_map_'.$rid})) {
                     29:            if ((defined($hash{'map_start_'.$hash{'src_'.$rid}})) &&
                     30:                (defined($hash{'map_finish_'.$hash{'src_'.$rid}}))) {
1.3     ! www        31:                my $frid=$hash{'map_finish_'.$hash{'src_'.$rid}};
1.2       www        32: 	       $sofar=
                     33:                 &tracetable($sofar,$hash{'map_start_'.$hash{'src_'.$rid}},
1.3     ! www        34:                 '&'.$frid.'&');
1.2       www        35:                $sofar++;
1.3     ! www        36:                my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$frid});
        !            37:                if (($brepriv eq '2') || ($brepriv eq 'F')) {
        !            38:                  if (defined($rows[$sofar])) {
        !            39:                    $rows[$sofar].='&'.$frid;
        !            40:                  } else {
        !            41:                    $rows[$sofar]=$frid;
        !            42:                  }
        !            43: 	       }
1.2       www        44: 	   }
                     45:        } else {
                     46:            $sofar++;
1.3     ! www        47:            my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$rid});
        !            48:            if (($brepriv eq '2') || ($brepriv eq 'F')) {
        !            49:              if (defined($rows[$sofar])) {
1.2       www        50:                $rows[$sofar].='&'.$rid;
1.3     ! www        51:              } else {
1.2       www        52:                $rows[$sofar]=$rid;
1.3     ! www        53:              }
        !            54: 	   }
1.2       www        55:        }
                     56: 
                     57:        if (defined($hash{'to_'.$rid})) {
                     58:           map {
                     59:               my $now=&tracetable($sofar,$hash{'goesto_'.$_},$beenhere);
                     60:               if ($now>$further) { $further=$now; }
                     61:           } split(/\,/,$hash{'to_'.$rid});
                     62:        }
                     63:     }
                     64:     return $further;
                     65: }
                     66: 
                     67: 
1.1       www        68: # ================================================================ Main Handler
                     69: 
                     70: sub handler {
                     71:   my $r=shift;
                     72: 
1.3     ! www        73: # ------------------------------------------- Set document type for header only
1.1       www        74: 
1.3     ! www        75:   if ($r->header_only) {
        !            76:        if ($ENV{'browser.mathml'}) {
        !            77:            $r->content_type('text/xml');
        !            78:        } else {
        !            79:            $r->content_type('text/html');
        !            80:        }
        !            81:        $r->send_http_header;
        !            82:        return OK;
        !            83:    }
1.1       www        84: 
                     85:   my $requrl=$r->uri;
                     86: # ----------------------------------------------------------------- Tie db file
                     87:   if ($ENV{'request.course.fn'}) {
                     88:       my $fn=$ENV{'request.course.fn'};
                     89:       if (-e "$fn.db") {
                     90:           if (tie(%hash,'GDBM_File',"$fn.db",&GDBM_WRCREAT,0640)) {
                     91: # ------------------------------------------------------------------- Hash tied
                     92:               my $firstres=$hash{'map_start_'.$requrl};
                     93:               my $lastres=$hash{'map_finish_'.$requrl};
                     94:               if (($firstres) && ($lastres)) {
                     95: # ----------------------------------------------------------------- Render page
                     96: 
1.3     ! www        97:                   @rows=();
1.2       www        98: 
                     99:                   &tracetable(0,$firstres,'&'.$lastres.'&');
                    100:                   $rows[$#rows+1]=''.$lastres;
                    101: 
                    102:                   my $i;
1.3     ! www       103:                   my $maxcols=-1;
        !           104:                   my %ssibody=();
        !           105:                   my %ssibgcolor=();
        !           106:                   my %ssitext=();
        !           107:                   my %ssilink=();
        !           108:                   my %ssivlink=();
        !           109:                   my %ssialink=();
        !           110:                   my %cellemb=();
        !           111: 
        !           112: # --------------------------------------------- Get SSI output, post parameters
        !           113: 
1.2       www       114:                   for ($i=0;$i<=$#rows;$i++) {
1.3     ! www       115:                       my @colcont=split(/\&/,$rows[$i]);
        !           116:                       $maxcols=$#colcont>$maxcols?$#colcont:$maxcols;
        !           117:                       map {
        !           118:                           my $src=$hash{'src_'.$_};
        !           119:                           $src=~/\.\w+$/;
        !           120:                           $cellemb{$_}=Apache::lonnet::fileembstyle($1);
        !           121:                           if ($cellemb{$_} eq 'ssi') {
        !           122: # --------------------------------------------------------- This is an SSI cell
        !           123: 
        !           124: # ---------------------------------------------------------------- End SSI cell
        !           125:                           }
        !           126:                       } @colcont;
        !           127:                       
1.2       www       128:                   }
1.3     ! www       129:                   if ($maxcols<0) {
        !           130:                       $r->content_type('text/html');
        !           131:                       $r->send_http_header;
        !           132:                       $r->print('<html><body>Empty page.</body></html>');
        !           133:                   } else {
        !           134: # ------------------------------------------------------------------ Build page
1.1       www       135: 
1.3     ! www       136: # -------------------------------------------------------------------- End page
        !           137:                   }                  
1.1       www       138: # ------------------------------------------------------------- End render page
                    139:               } else {
1.3     ! www       140:                   $r->content_type('text/html');
        !           141:                   $r->send_http_header;
        !           142: 		  $r->print('<html><body>Page undefined.</body></html>');
1.1       www       143:               }
                    144: # ------------------------------------------------------------------ Untie hash
                    145:               unless (untie(%hash)) {
                    146:                    &Apache::lonnet::logthis("<font color=blue>WARNING: ".
                    147:                        "Could not untie coursemap $fn (browse).</font>"); 
                    148:               }
                    149: # -------------------------------------------------------------------- All done
                    150: 	      return OK;
                    151: # ----------------------------------------------- Errors, hash could no be tied
                    152:           }
                    153:       } 
                    154:   }
                    155:   $ENV{'user.error.msg'}="$requrl:bre:1:1:Course not initialized";
                    156:   return HTTP_NOT_ACCEPTABLE; 
                    157: }
                    158: 
                    159: 1;
                    160: __END__
                    161: 
                    162: 
                    163: 
                    164: 
                    165: 
                    166: 
                    167: 

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