--- loncom/interface/lonnavmaps.pm 2002/03/15 16:31:10 1.28 +++ loncom/interface/lonnavmaps.pm 2002/03/26 23:14:39 1.35 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.28 2002/03/15 16:31:10 albertel Exp $ +# $Id: lonnavmaps.pm,v 1.35 2002/03/26 23:14:39 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -178,10 +178,11 @@ sub parmval { # 1: not attempted # 2: attempted but wrong, or incorrect by instructor # 3: solved or correct by instructor -# "excused" needs to be supported, but is not yet. Could be code=4. +# 4: partially correct (one or more parts correct) +# "excused" needs to be supported, but is not yet. sub astatus { my $rid=shift; - my $code=1; + my $code=0; my $ctext=''; $rid=~/(\d+)\.(\d+)/; my $symb=&Apache::lonnet::declutter($hash{'map_id_'.$1}).'___'.$2.'___'. @@ -238,13 +239,14 @@ sub astatus { my $status=$returnhash{'resource.'.$_.'.solved'}; if ($status eq 'correct_by_student') { - unless ($code==2) { $code=3; } + if ($code==0||$code==3) { $code=3; } else { $code=4; } $ctext.=' solved'; } elsif ($status eq 'correct_by_override') { - unless ($code==2) { $code=3; } + if ($code==0||$code==3) { $code=3; } else { $code=4; } $ctext.=' override'; } elsif ($status eq 'incorrect_attempted') { - $code=2; + if ($code!=4 && $code!=3) { $code=2; } + if ($code==3) { $code=4; } $ctext.=' ('. ($returnhash{'resource.'.$_.'.tries'}? $returnhash{'resource.'.$_.'.tries'}:'0'); @@ -252,105 +254,136 @@ sub astatus { if ($numtries) { $ctext.='/'.$numtries.' tries'; } $ctext.=')'; } elsif ($status eq 'incorrect_by_override') { - $code=2; + if ($code!=4 && $code!=3) { $code=2; } + if ($code==3) { $code=4; } $ctext.=' override'; } elsif ($status eq 'excused') { - unless ($code==2) { $code=3; } + if ($code==0||$code==3) { $code=3; } else { $code=4; } $ctext.=' excused'; + } else { + if ($code==0) { $code=1; } } } return 'p'.$code.$tcode.'"'.$ctext.'"'; } -# ------------------------------------------------------------ Build page table -sub tracetable { - my ($sofar,$rid,$beenhere)=@_; - my $further=$sofar; - unless ($beenhere=~/\&$rid\&/) { - $beenhere.=$rid.'&'; - - if (defined($hash{'is_map_'.$rid})) { - $sofar++; - my $tprefix=''; - if ($hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$rid}}} - eq 'sequence') { - $tprefix='h'; +sub addresource { + my ($resource,$sofar,$rid,$showtypes,$indent,$linkid)=@_; + if ($showtypes eq 'problems') { + if ($resource!~/\.(problem|exam|quiz|assess|survey|form)$/) { + return; + } + } + my $brepriv=&Apache::lonnet::allowed('bre',$resource); + if ($hash{'src_'.$rid}) { + if (($brepriv eq '2') || ($brepriv eq 'F')) { + my $pprefix=''; + if ($resource=~/\.(problem|exam|quiz|assess|survey|form)$/) { + $pprefix=&astatus($rid); + } + $$sofar++; + if ($indent) { $pprefix='i'.$indent.','.$pprefix; } + if ($linkid) { $pprefix='l'.$linkid.','.$pprefix; } + if (defined($rows[$$sofar])) { + $rows[$$sofar].='&'.$pprefix.$rid; + } else { + $rows[$$sofar]=$pprefix.$rid; } - if (defined($rows[$sofar])) { - $rows[$sofar].='&'.$tprefix.$rid; + } + } +} + +sub followlinks () { + my ($rid,$sofar,$beenhere,$further,$showtypes,$indent,$linkid)=@_; + my $mincond=1; + my $next=''; + foreach (split(/\,/,$hash{'to_'.$rid})) { + my $thiscond= + &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}}); + if ($thiscond>=$mincond) { + if ($next) { + $next.=','.$_.':'.$thiscond; } else { - $rows[$sofar]=$tprefix.$rid; + $next=$_.':'.$thiscond; } - if ((defined($hash{'map_start_'.$hash{'src_'.$rid}})) && - (defined($hash{'map_finish_'.$hash{'src_'.$rid}})) && - ($tprefix eq 'h')) { - 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')) { - my $pprefix=''; - if ($hash{'src_'.$frid}=~ - /\.(problem|exam|quiz|assess|survey|form)$/) { - $pprefix=&astatus($frid); - - } - if (defined($rows[$sofar])) { - $rows[$sofar].='&'.$pprefix.$frid; - } else { - $rows[$sofar]=$pprefix.$frid; - } + if ($thiscond>$mincond) { $mincond=$thiscond; } + } + } + my $col=0; + &Apache::lonxml::debug("following links -$next-"); + foreach (split(/\,/,$next)) { + my ($nextlinkid,$condval)=split(/\:/,$_); + if ($condval>=$mincond) { + my $now=&tracetable($sofar,$hash{'goesto_'.$nextlinkid}, + $beenhere,$showtypes,$indent,$linkid); + if ($now>$further) { + if ($col>0) { + my $string; + for(my $i=0;$i<$col;$i++) { $string.='&'; } + for(my $i=$further+1;$now-1>$i;$i++) { + $rows[$i]=$string.$rows[$i]; } } + $further=$now; } + } + $col++; + } + return $further; +} +# ------------------------------------------------------------ Build page table + +sub tracetable { + my ($sofar,$rid,$beenhere,$showtypes,$indent,$linkid)=@_; + my $newshowtypes=$showtypes; + my $further=$sofar; + #$Apache::lonxml::debug=1; + &Apache::lonxml::debug("$rid ; $linkid ; $sofar ; $beenhere ; ".$hash{'src_'.$rid}); + if ($beenhere=~/\&$rid\&/) { return $further; } + $beenhere.=$rid.'&'; + + if (defined($hash{'is_map_'.$rid})) { + $sofar++; + my $tprefix=''; + if ($hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$rid}}} + eq 'sequence') { + $tprefix='h'; + } elsif ($hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$rid}}} + eq 'page') { + $tprefix='j'; + if ($indent) { $tprefix='i'.$indent.','.$tprefix; } + if ($linkid) { $tprefix='l'.$linkid.','.$tprefix; } + $newshowtypes='problems'; + $indent++; + #if in a .page continue to link the encompising .page + if (!$linkid) { $linkid=$rid; } + } + if (defined($rows[$sofar])) { + $rows[$sofar].='&'.$tprefix.$rid; } else { - $sofar++; - if ($hash{'src_'.$rid}) { - my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$rid}); - if (($brepriv eq '2') || ($brepriv eq 'F')) { - my $pprefix=''; - if ($hash{'src_'.$rid}=~ - /\.(problem|exam|quiz|assess|survey|form)$/) { - $pprefix=&astatus($rid); - } - if (defined($rows[$sofar])) { - $rows[$sofar].='&'.$pprefix.$rid; - } else { - $rows[$sofar]=$pprefix.$rid; - } - } - } + $rows[$sofar]=$tprefix.$rid; } - - if (defined($hash{'to_'.$rid})) { - my $mincond=1; - my $next=''; - foreach (split(/\,/,$hash{'to_'.$rid})) { - my $thiscond= - &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}}); - if ($thiscond>=$mincond) { - if ($next) { - $next.=','.$_.':'.$thiscond; - } else { - $next=$_.':'.$thiscond; - } - if ($thiscond>$mincond) { $mincond=$thiscond; } - } - } - foreach (split(/\,/,$next)) { - my ($linkid,$condval)=split(/\:/,$_); - if ($condval>=$mincond) { - my $now=&tracetable($sofar,$hash{'goesto_'.$linkid},$beenhere); - if ($now>$further) { $further=$now; } - } - } + 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.'&',$newshowtypes,$indent,$linkid); + &addresource($hash{'src_'.$frid},\$sofar,$frid,$newshowtypes, + $indent,$linkid); + if ($tprefix =~ /j$/) { $indent--; $linkid=''; } } + } else { + &addresource($hash{'src_'.$rid},\$sofar,$rid,$showtypes, + $indent,$linkid); } + + if (defined($hash{'to_'.$rid})) { + $further=&followlinks($rid,$sofar,$beenhere,$further,$showtypes, + $indent,$linkid); + } + return $further; } @@ -456,7 +489,7 @@ sub handler { @rows=(); - &tracetable(0,$firstres,'&'.$lastres.'&'); + &tracetable(0,$firstres,'&'.$lastres.'&','',0); if ($hash{'src_'.$lastres}) { my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$lastres}); if (($brepriv eq '2') || ($brepriv eq 'F')) { @@ -475,6 +508,7 @@ sub handler { for ($i=0;$i<=$#rows;$i++) { if ($rows[$i]) { + &Apache::lonxml::debug("Row $i is:".$rows[$i]); $contents++; my @colcont=split(/\&/,$rows[$i]); $lcm*=($#colcont+1)/euclid($lcm,($#colcont+1)); @@ -575,16 +609,21 @@ sub handler { my @colcont=split(/\&/,$rows[$i]); my $avespan=$lcm/($#colcont+1); for ($j=0;$j<=$#colcont;$j++) { + my $indent;my $indentstr; + my $linkid; my $rid=$colcont[$j]; - my $add='  '; + my $add=''; my $adde=''; my $hwk=''; my $hwke=''; + if ($rid=~/^l(\d+\.\d+),(.+)/) { $linkid=$1; $rid=$2; } + if ($rid=~/^i(\d+),(.+)/) { $indent=$1; $rid=$2; } if ($rid=~/^h(.+)/) { $rid=$1; $add=''; $adde=''; } + if ($rid=~/^j(.+)/) { $rid=$1; } if ($rid=~/^p(\d)(\d)\"([\w\: \(\)\/\,]*)\"(.+)/) { # sub astatus describes what code/tcode mean my $code=$1; @@ -596,6 +635,8 @@ sub handler { } if ($code eq '3') { $add=''; + } elsif ($code eq '4') { + $add=''; } else { $add=''; if ($tcode eq '2') { @@ -611,7 +652,7 @@ sub handler { if ($code eq '1') { $hwke=' ('.$ctext.')'; } - if ($code eq '2') { + if ($code eq '2' || $code eq '4') { $hwk=''; $hwke=' ('.$ctext.')'; } @@ -620,7 +661,7 @@ sub handler { $hwke=' ('.$ctext.')'; } } - if ($hash{'src_'.$rid} eq $currenturl) { + if ($rid && $hash{'src_'.$rid} eq $currenturl) { $add=$add.''. '> '; $adde= @@ -658,9 +699,19 @@ sub handler { } } } - $r->print($add.''.$hwk. - $hash{'title_'.$rid}.$hwke.''.$adde); + if ($indent) { + my $is="  "; + for(my $i=-1;$i<$indent;$i++) { $indentstr.=$is; } + } + if (!$linkid) { $linkid=$rid; } + $r->print($add.$indentstr); + if ($rid) { + $r->print(''. + $hwk.$hash{'title_'.$rid}.$hwke.''); + } + $r->print($adde); } $r->print(''); } 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.