--- rat/lonuserstate.pm 2006/07/07 22:01:25 1.118 +++ rat/lonuserstate.pm 2007/06/08 19:33:06 1.118.2.1 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Construct and maintain state and binary representation of course for user # -# $Id: lonuserstate.pm,v 1.118 2006/07/07 22:01:25 raeburn Exp $ +# $Id: lonuserstate.pm,v 1.118.2.1 2007/06/08 19:33:06 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -129,194 +129,230 @@ sub loadmap { my $instr=&Apache::lonnet::getfile($fn); - unless ($instr eq -1) { + if ($instr eq -1) { + $errtext.=&mt('
Map not loaded: The file [_1] does not exist.',$fn); + return; + } # Successfully got file, parse it - my $parser = HTML::TokeParser->new(\$instr); - $parser->attr_encoded(1); - my $token; + my $parser = HTML::TokeParser->new(\$instr); + $parser->attr_encoded(1); - my $linkpc=0; + my $linkpc=0; - $fn=~/\.(\w+)$/; + $fn=~/\.(\w+)$/; - $hash{'map_type_'.$lpc}=$1; + $hash{'map_type_'.$lpc}=$1; + + my $randomize=1; + my @map_ids; + while (my $token = $parser->get_token) { + next if ($token->[0] ne 'S'); + if ($token->[1] eq 'resource') { + push(@map_ids,&parse_resource($token,$lpc,$ispage,$uri)); + } elsif ($token->[1] eq 'link' && !$randomize) { +# ----------------------------------------------------------------------- Links + &make_link(++$linkpc,$lpc,$token->[2]->{'to'}, + $token->[2]->{'from'}, + $token->[2]->{'condition'}); + } elsif ($token->[1] eq 'condition' && !$randomize) { + &parse_condition($token,$lpc); + } elsif ($token->[1] eq 'param') { + &parse_param($token,$lpc); + } + } + + if ($randomize) { + my @map_ids=&Math::Random::random_permutation(@map_ids); + my $from = shift(@map_ids); + my $from_rid = $lpc.'.'.$from; + $hash{'map_start_'.$uri} = $from_rid; + $hash{'type_'.$from_rid}='start'; + + while (my $to = shift(@map_ids)) { + &make_link(++$linkpc,$lpc,$to,$from); + my $to_rid = $lpc.'.'.$to; + $hash{'type_'.$to_rid}='normal'; + $from = $to; + $from_rid = $to_rid; + } + + $hash{'map_finish_'.$uri}= $from_rid; + $hash{'type_'.$from_rid}='finish'; + } +} - while ($token = $parser->get_token) { - if ($token->[0] eq 'S') { - if ($token->[1] eq 'resource') { -# -------------------------------------------------------------------- Resource - if ($token->[2]->{'type'} eq 'zombie') { next; } - my $rid=$lpc.'.'.$token->[2]->{'id'}; - $hash{'kind_'.$rid}='res'; - $hash{'title_'.$rid}=$token->[2]->{'title'}; - my $turi=&versiontrack($token->[2]->{'src'}); - if ($token->[2]->{'version'}) { - unless ($hash{'version_'.$turi}) { - $hash{'version_'.$turi}=$1; - } - } - my $title=$token->[2]->{'title'}; - $title=~s/\&colon\;/\:/gs; -# my $symb=&Apache::lonnet::encode_symb($uri, -# $token->[2]->{'id'}, -# $turi); -# &Apache::lonnet::do_cache_new('title',$symb,$title); - unless ($ispage) { - $turi=~/\.(\w+)$/; - my $embstyle=&Apache::loncommon::fileembstyle($1); - if ($token->[2]->{'external'} eq 'true') { # external - $turi=~s/^http\:\/\//\/adm\/wrapper\/ext\//; - } elsif ($turi=~/^\/*uploaded\//) { # uploaded - if (($embstyle eq 'img') - || ($embstyle eq 'emb') - || ($embstyle eq 'wrp')) { - $turi='/adm/wrapper'.$turi; - } elsif ($embstyle eq 'ssi') { - #do nothing with these - } elsif ($turi!~/\.(sequence|page)$/) { - $turi='/adm/coursedocs/showdoc'.$turi; - } - } elsif ($turi=~/\S/) { # normal non-empty internal resource - my $mapdir=$uri; - $mapdir=~s/[^\/]+$//; - $turi=&Apache::lonnet::hreflocation($mapdir,$turi); - if (($embstyle eq 'img') - || ($embstyle eq 'emb') - || ($embstyle eq 'wrp')) { - $turi='/adm/wrapper'.$turi; - } - } - } +# -------------------------------------------------------------------- Resource +sub parse_resource { + my ($token,$lpc,$ispage,$uri) = @_; + if ($token->[2]->{'type'} eq 'zombie') { next; } + my $rid=$lpc.'.'.$token->[2]->{'id'}; + + $hash{'kind_'.$rid}='res'; + $hash{'title_'.$rid}=$token->[2]->{'title'}; + my $turi=&versiontrack($token->[2]->{'src'}); + if ($token->[2]->{'version'}) { + unless ($hash{'version_'.$turi}) { + $hash{'version_'.$turi}=$1; + } + } + my $title=$token->[2]->{'title'}; + $title=~s/\&colon\;/\:/gs; +# my $symb=&Apache::lonnet::encode_symb($uri, +# $token->[2]->{'id'}, +# $turi); +# &Apache::lonnet::do_cache_new('title',$symb,$title); + unless ($ispage) { + $turi=~/\.(\w+)$/; + my $embstyle=&Apache::loncommon::fileembstyle($1); + if ($token->[2]->{'external'} eq 'true') { # external + $turi=~s/^http\:\/\//\/adm\/wrapper\/ext\//; + } elsif ($turi=~/^\/*uploaded\//) { # uploaded + if (($embstyle eq 'img') + || ($embstyle eq 'emb') + || ($embstyle eq 'wrp')) { + $turi='/adm/wrapper'.$turi; + } elsif ($embstyle eq 'ssi') { + #do nothing with these + } elsif ($turi!~/\.(sequence|page)$/) { + $turi='/adm/coursedocs/showdoc'.$turi; + } + } elsif ($turi=~/\S/) { # normal non-empty internal resource + my $mapdir=$uri; + $mapdir=~s/[^\/]+$//; + $turi=&Apache::lonnet::hreflocation($mapdir,$turi); + if (($embstyle eq 'img') + || ($embstyle eq 'emb') + || ($embstyle eq 'wrp')) { + $turi='/adm/wrapper'.$turi; + } + } + } # Store reverse lookup, remove query string - my $idsuri=$turi; - $idsuri=~s/\?.+$//; - if (defined($hash{'ids_'.$idsuri})) { - $hash{'ids_'.$idsuri}.=','.$rid; - } else { - $hash{'ids_'.$idsuri}=''.$rid; - } - - if ($turi=~/\/(syllabus|aboutme|navmaps|smppg|bulletinboard)$/) { - $turi.='?register=1'; - } - - $hash{'src_'.$rid}=$turi; - - if ($token->[2]->{'external'} eq 'true') { - $hash{'ext_'.$rid}='true:'; - } else { - $hash{'ext_'.$rid}='false:'; - } - if ($token->[2]->{'type'}) { - $hash{'type_'.$rid}=$token->[2]->{'type'}; - if ($token->[2]->{'type'} eq 'start') { - $hash{'map_start_'.$uri}="$rid"; - } - if ($token->[2]->{'type'} eq 'finish') { - $hash{'map_finish_'.$uri}="$rid"; - } - } else { - $hash{'type_'.$rid}='normal'; - } - - if (($turi=~/\.sequence$/) || - ($turi=~/\.page$/)) { - $hash{'is_map_'.$rid}=1; - &loadmap($turi); - } - - } elsif ($token->[1] eq 'condition') { -# ------------------------------------------------------------------- Condition + my $idsuri=$turi; + $idsuri=~s/\?.+$//; + if (defined($hash{'ids_'.$idsuri})) { + $hash{'ids_'.$idsuri}.=','.$rid; + } else { + $hash{'ids_'.$idsuri}=''.$rid; + } + + if ($turi=~/\/(syllabus|aboutme|navmaps|smppg|bulletinboard)$/) { + $turi.='?register=1'; + } + + $hash{'src_'.$rid}=$turi; + + if ($token->[2]->{'external'} eq 'true') { + $hash{'ext_'.$rid}='true:'; + } else { + $hash{'ext_'.$rid}='false:'; + } + if ($token->[2]->{'type'}) { + $hash{'type_'.$rid}=$token->[2]->{'type'}; + if ($token->[2]->{'type'} eq 'start') { + $hash{'map_start_'.$uri}="$rid"; + } + if ($token->[2]->{'type'} eq 'finish') { + $hash{'map_finish_'.$uri}="$rid"; + } + } else { + $hash{'type_'.$rid}='normal'; + } + + if (($turi=~/\.sequence$/) || + ($turi=~/\.page$/)) { + $hash{'is_map_'.$rid}=1; + &loadmap($turi); + } + return $token->[2]->{'id'}; +} - my $rid=$lpc.'.'.$token->[2]->{'id'}; +sub make_link { + my ($linkpc,$lpc,$to,$from,$condition) = @_; + + my $linkid=$lpc.'.'.$linkpc; + my $goesto=$lpc.'.'.$to; + my $comesfrom=$lpc.'.'.$from; + my $undercond=0; - $hash{'kind_'.$rid}='cond'; - $cond[$#cond+1]=$token->[2]->{'value'}; - $hash{'condid_'.$rid}=$#cond; - if ($token->[2]->{'type'}) { - $cond[$#cond].=':'.$token->[2]->{'type'}; - } else { - $cond[$#cond].=':normal'; - } + if ($condition) { + $undercond=$lpc.'.'.$condition; + } - } elsif ($token->[1] eq 'link') { -# ----------------------------------------------------------------------- Links + $hash{'goesto_'.$linkid}=$goesto; + $hash{'comesfrom_'.$linkid}=$comesfrom; + $hash{'undercond_'.$linkid}=$undercond; - $linkpc++; - my $linkid=$lpc.'.'.$linkpc; + if (defined($hash{'to_'.$comesfrom})) { + $hash{'to_'.$comesfrom}.=','.$linkid; + } else { + $hash{'to_'.$comesfrom}=''.$linkid; + } + if (defined($hash{'from_'.$goesto})) { + $hash{'from_'.$goesto}.=','.$linkid; + } else { + $hash{'from_'.$goesto}=''.$linkid; + } +} - my $goesto=$lpc.'.'.$token->[2]->{'to'}; - my $comesfrom=$lpc.'.'.$token->[2]->{'from'}; - my $undercond=0; - - if ($token->[2]->{'condition'}) { - $undercond=$lpc.'.'.$token->[2]->{'condition'}; - } - - $hash{'goesto_'.$linkid}=$goesto; - $hash{'comesfrom_'.$linkid}=$comesfrom; - $hash{'undercond_'.$linkid}=$undercond; - - if (defined($hash{'to_'.$comesfrom})) { - $hash{'to_'.$comesfrom}.=','.$linkid; - } else { - $hash{'to_'.$comesfrom}=''.$linkid; - } - if (defined($hash{'from_'.$goesto})) { - $hash{'from_'.$goesto}.=','.$linkid; - } else { - $hash{'from_'.$goesto}=''.$linkid; - } - } elsif ($token->[1] eq 'param') { -# ------------------------------------------------------------------- Parameter +# ------------------------------------------------------------------- Condition +sub parse_condition { + my ($token,$lpc) = @_; + my $rid=$lpc.'.'.$token->[2]->{'id'}; + + $hash{'kind_'.$rid}='cond'; + $cond[$#cond+1]=$token->[2]->{'value'}; + $hash{'condid_'.$rid}=$#cond; + if ($token->[2]->{'type'}) { + $cond[$#cond].=':'.$token->[2]->{'type'}; + } else { + $cond[$#cond].=':normal'; + } +} - my $referid=$lpc.'.'.$token->[2]->{'to'}; - my $name=$token->[2]->{'name'}; - my $part; - if ($name=~/^parameter_(.*)_/) { - $part=$1; - } else { - $part=0; - } - $name=~s/^.*_([^_]*)$/$1/; - my $newparam= - &escape($token->[2]->{'type'}).':'. - &escape($part.'.'.$name).'='. - &escape($token->[2]->{'value'}); - if (defined($hash{'param_'.$referid})) { - $hash{'param_'.$referid}.='&'.$newparam; - } else { - $hash{'param_'.$referid}=''.$newparam; - } - if ($token->[2]->{'name'}=~/^parameter_(0_)*mapalias$/) { - $hash{'mapalias_'.$token->[2]->{'value'}}=$referid; - } - if ($token->[2]->{'name'}=~/^parameter_(0_)*randompick$/) { - $randompick{$referid}=$token->[2]->{'value'}; - } - if ($token->[2]->{'name'}=~/^parameter_(0_)*randompickseed$/) { - $randompick{$referid}=$token->[2]->{'value'}; - } - if ($token->[2]->{'name'}=~/^parameter_(0_)*encrypturl$/) { - if ($token->[2]->{'value'}=~/^yes$/i) { - $encurl{$referid}=1; - } - } - if ($token->[2]->{'name'}=~/^parameter_(0_)*hiddenresource$/) { - if ($token->[2]->{'value'}=~/^yes$/i) { - $hiddenurl{$referid}=1; - } - } - } - - } - } +# ------------------------------------------------------------------- Parameter +sub parse_param { + my ($token,$lpc) = @_; + my $referid=$lpc.'.'.$token->[2]->{'to'}; + my $name=$token->[2]->{'name'}; + my $part; + if ($name=~/^parameter_(.*)_/) { + $part=$1; } else { - $errtext.=&mt('
Map not loaded: The file [_1] does not exist.',$fn); + $part=0; + } + $name=~s/^.*_([^_]*)$/$1/; + my $newparam= + &escape($token->[2]->{'type'}).':'. + &escape($part.'.'.$name).'='. + &escape($token->[2]->{'value'}); + if (defined($hash{'param_'.$referid})) { + $hash{'param_'.$referid}.='&'.$newparam; + } else { + $hash{'param_'.$referid}=''.$newparam; + } + if ($token->[2]->{'name'}=~/^parameter_(0_)*mapalias$/) { + $hash{'mapalias_'.$token->[2]->{'value'}}=$referid; + } + if ($token->[2]->{'name'}=~/^parameter_(0_)*randompick$/) { + $randompick{$referid}=$token->[2]->{'value'}; + } + if ($token->[2]->{'name'}=~/^parameter_(0_)*randompickseed$/) { + $randompick{$referid}=$token->[2]->{'value'}; + } + if ($token->[2]->{'name'}=~/^parameter_(0_)*encrypturl$/) { + if ($token->[2]->{'value'}=~/^yes$/i) { + $encurl{$referid}=1; + } + } + if ($token->[2]->{'name'}=~/^parameter_(0_)*hiddenresource$/) { + if ($token->[2]->{'value'}=~/^yes$/i) { + $hiddenurl{$referid}=1; + } } }