--- loncom/interface/lonnavmaps.pm 2002/03/15 21:40:27 1.29 +++ loncom/interface/lonnavmaps.pm 2002/06/24 14:28:10 1.36 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.29 2002/03/15 21:40:27 albertel Exp $ +# $Id: lonnavmaps.pm,v 1.36 2002/06/24 14:28:10 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -239,10 +239,10 @@ sub astatus { my $status=$returnhash{'resource.'.$_.'.solved'}; if ($status eq 'correct_by_student') { - if ($code==0) { $code=3; } else { $code=4; } + if ($code==0||$code==3) { $code=3; } else { $code=4; } $ctext.=' solved'; } elsif ($status eq 'correct_by_override') { - if ($code==0) { $code=3; } else { $code=4; } + if ($code==0||$code==3) { $code=3; } else { $code=4; } $ctext.=' override'; } elsif ($status eq 'incorrect_attempted') { if ($code!=4 && $code!=3) { $code=2; } @@ -258,7 +258,7 @@ sub astatus { if ($code==3) { $code=4; } $ctext.=' override'; } elsif ($status eq 'excused') { - if ($code==0) { $code=3; } else { $code=4; } + if ($code==0||$code==3) { $code=3; } else { $code=4; } $ctext.=' excused'; } else { if ($code==0) { $code=1; } @@ -268,96 +268,123 @@ sub astatus { 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') && (!$hash{'randomout_'.$rid})) + || ($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 { - # it's a page we need to grab out the problems only + $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; } @@ -463,7 +490,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')) { @@ -482,6 +509,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)); @@ -582,16 +610,32 @@ 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='  '; + $rid=~/(\d+)\.(\d+)$/; + my $src= + &Apache::lonnet::declutter($hash{'src_'.$1.'.'.$2}); + my $symb= + &Apache::lonnet::declutter($hash{'map_id_'.$1}).'___'.$2.'___'.$src; + 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 (($ENV{'user.adv'}) && + ($parmhash{$symb.'.0.parameter_randompick'})) { + $adde=' (randomly select '. + $parmhash{$symb.'.0.parameter_randompick'}. + ')'; + } } + if ($rid=~/^j(.+)/) { $rid=$1; } if ($rid=~/^p(\d)(\d)\"([\w\: \(\)\/\,]*)\"(.+)/) { # sub astatus describes what code/tcode mean my $code=$1; @@ -603,6 +647,8 @@ sub handler { } if ($code eq '3') { $add=''; + } elsif ($code eq '4') { + $add=''; } else { $add=''; if ($tcode eq '2') { @@ -618,7 +664,7 @@ sub handler { if ($code eq '1') { $hwke=' ('.$ctext.')'; } - if ($code eq '2') { + if ($code eq '2' || $code eq '4') { $hwk=''; $hwke=' ('.$ctext.')'; } @@ -626,22 +672,13 @@ sub handler { $hwk=''; $hwke=' ('.$ctext.')'; } - if ($code eq '4') { - $hwk=''; - $hwke=' ('.$ctext.')'; - } } - if ($hash{'src_'.$rid} eq $currenturl) { + if ($rid && $hash{'src_'.$rid} eq $currenturl) { $add=$add.''. '> '; $adde= ' <'.$adde; } - my $src= - &Apache::lonnet::declutter($hash{'src_'.$rid}); - $rid=~/^(\d+)\.(\d+)$/; - my $symb= - &Apache::lonnet::declutter($hash{'map_id_'.$1}).'___'.$2.'___'.$src; if ($discussiontimes{$symb}>$lastcheck) { $adde= ''. @@ -669,9 +706,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(''); }