--- loncom/interface/lonnavmaps.pm 2001/01/03 16:20:59 1.1 +++ loncom/interface/lonnavmaps.pm 2001/01/06 13:45:37 1.2 @@ -1,41 +1,247 @@ -# The LearningOnline Network -# Navigate Maps +# The LearningOnline Network with CAPA +# Navigate Maps Handler # -# (Internal Server Error Handler +# (Page Handler # -# (Login Screen -# 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14, -# 1/14/00,5/29,5/30,6/1,6/29,7/1,11/9 Gerd Kortemeyer) +# (TeX Content Handler # -# 3/1/1 Gerd Kortemeyer) -# -# 3/1 Gerd Kortemeyer +# 05/29/00,05/30 Gerd Kortemeyer) +# 08/30,08/31,09/06,09/14,09/15,09/16,09/19,09/20,09/21,09/23, +# 10/02,10/10,10/14,10/16,10/18,10/19,10/31,11/6,11/14,11/16 Gerd Kortemeyer) # +# 3/1/1,6/1 Gerd Kortemeyer + package Apache::lonnavmaps; use strict; -use Apache::Constants qw(:common); +use Apache::Constants qw(:common :http); +use Apache::lonnet(); +use HTML::TokeParser; +use GDBM_File; + +# -------------------------------------------------------------- Module Globals +my %hash; +my @rows; + +# ------------------------------------------------------------------ Euclid gcd + +sub euclid { + my ($e,$f)=@_; + my $a; my $b; my $r; + if ($e>$f) { $b=$e; $r=$f; } else { $r=$e; $b=$f; } + while ($r!=0) { + $a=$b; $b=$r; + $r=$a%$b; + } + return $b; +} + +# ------------------------------------------------------------ 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})) { + my $mincond=1; + my $next=''; + map { + my $thiscond= + &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}}); + if ($thiscond>=$mincond) { + if ($next) { + $next.=','.$_.':'.$thiscond; + } else { + $next=$_.':'.$thiscond; + } + if ($thiscond>$mincond) { $mincond=$thiscond; } + } + } split(/\,/,$hash{'to_'.$rid}); + map { + my ($linkid,$condval)=split(/\:/,$_); + if ($condval>=$mincond) { + my $now=&tracetable($sofar,$hash{'goesto_'.$linkid},$beenhere); + if ($now>$further) { $further=$now; } + } + } split(/\,/,$next); + + } + } + return $further; +} + +# ================================================================ Main Handler sub handler { - my $r = shift; - $r->content_type('text/html'); - $r->send_http_header; - return OK if $r->header_only; - -# --------------------------------------------------- Print login screen header - $r->print(< - -The LearningOnline Network with CAPA - - -

Navigate Maps

- - - -ENDDOCUMENT - return OK; -} + my $r=shift; + + +# ------------------------------------------- Set document type for 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; +# ----------------------------------------------------------------- Tie db file + if ($ENV{'request.course.fn'}) { + my $fn=$ENV{'request.course.fn'}; + if (-e "$fn.db") { + if (tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER,0640)) { +# ------------------------------------------------------------------- Hash tied + my $firstres=$hash{'map_start_/res/'.$ENV{'request.course.uri'}}; + my $lastres=$hash{'map_finish_/res/'.$ENV{'request.course.uri'}}; + if (($firstres) && ($lastres)) { +# ----------------------------------------------------------------- Render page + + @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; + } + } + +# ------------------------------------------------------------ Add to symb list + + 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 $lcm=1; + my $contents=0; + +# ---------------------------------------------- Go through table to get layout + + for ($i=0;$i<=$#rows;$i++) { + if ($rows[$i]) { + $contents++; + my @colcont=split(/\&/,$rows[$i]); + $lcm*=($#colcont+1)/euclid($lcm,($#colcont+1)); + } + } + + unless ($contents) { + $r->content_type('text/html'); + $r->send_http_header; + $r->print('Empty Map.'); + } else { +# ------------------------------------------------------------------ Build page + +# ---------------------------------------------------------------- Send headers + + $r->content_type('text/html'); + $r->send_http_header; + $r->print( + 'Navigate LON-CAPA Maps'); + + $r->print(''. + '

Navigate Course Map

'); + +# ----------------------------------------------------------------- Start table + $r->print(''); + for ($i=0;$i<=$#rows;$i++) { + if ($rows[$i]) { + $r->print("\n"); + my @colcont=split(/\&/,$rows[$i]); + my $avespan=$lcm/($#colcont+1); + for ($j=0;$j<=$#colcont;$j++) { + my $rid=$colcont[$j]; + $r->print(''); + } + $r->print(''); + } + } + $r->print("\n
'. + $hash{'title_'.$rid}.''); + $r->print('
"); + + $r->print(''); +# -------------------------------------------------------------------- End page + } +# ------------------------------------------------------------- End render page + } else { + $r->content_type('text/html'); + $r->send_http_header; + $r->print('Coursemap undefined.'); + } +# ------------------------------------------------------------------ Untie hash + unless (untie(%hash)) { + &Apache::lonnet::logthis("WARNING: ". + "Could not untie coursemap $fn (browse)."); + } +# -------------------------------------------------------------------- All done + return OK; +# ----------------------------------------------- Errors, hash could no be tied + } + } + } + $ENV{'user.error.msg'}="$requrl:bre:0:0:Course not initialized"; + return HTTP_NOT_ACCEPTABLE; +} 1; __END__ + + + + + + +