Diff for /rat/lonuserstate.pm between versions 1.118.2.2 and 1.123

version 1.118.2.2, 2007/06/28 23:26:38 version 1.123, 2007/08/28 16:45:20
Line 56  my $retfrid; # variable with the very fi Line 56  my $retfrid; # variable with the very fi
 my $retfurl; # first URL  my $retfurl; # first URL
 my %randompick; # randomly picked resources  my %randompick; # randomly picked resources
 my %randompickseed; # optional seed for randomly picking resources  my %randompickseed; # optional seed for randomly picking resources
 my %randomorder; # maps to order contents randomly  
 my %encurl; # URLs in this folder are supposed to be encrypted  my %encurl; # URLs in this folder are supposed to be encrypted
 my %hiddenurl; # this URL (or complete folder) is supposed to be hidden  my %hiddenurl; # this URL (or complete folder) is supposed to be hidden
   
Line 107  sub processversionfile { Line 106  sub processversionfile {
 # --------------------------------------------------------- Loads map from disk  # --------------------------------------------------------- Loads map from disk
   
 sub loadmap {   sub loadmap { 
     my ($uri,$parent_rid)=@_;      my $uri=shift;
     if ($hash{'map_pc_'.$uri}) {       if ($hash{'map_pc_'.$uri}) { 
  $errtext.=&mt('<br />Multiple use of sequence/page <tt>[_1]</tt>! The course will not function properly.',$uri);   $errtext.='<p class="LC_error">'.
       &mt('Multiple use of sequence/page [_1]! The course will not function properly.','<tt>'.$uri.'</tt>').
       '</p>';
  return;    return; 
     }      }
     $pc++;      $pc++;
Line 130  sub loadmap { Line 131  sub loadmap {
   
     my $instr=&Apache::lonnet::getfile($fn);      my $instr=&Apache::lonnet::getfile($fn);
   
     if ($instr eq -1) {      unless ($instr eq -1) {
         $errtext.=&mt('<br />Map not loaded: The file <tt>[_1]</tt> does not exist.',$fn);  
  return;  
     }  
   
 # Successfully got file, parse it  # Successfully got file, parse it
   
     my $parser = HTML::TokeParser->new(\$instr);          my $parser = HTML::TokeParser->new(\$instr);
     $parser->attr_encoded(1);   $parser->attr_encoded(1);
     # first get all parameters          my $token;
     while (my $token = $parser->get_token) {  
  next if ($token->[0] ne 'S');  
  if ($token->[1] eq 'param') {  
     &parse_param($token,$lpc);  
  }   
     }  
     #reset parser  
     $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 = ($randomorder{$parent_rid} =~ /^yes$/i);          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'};
   
     my @map_ids;                      $hash{'kind_'.$rid}='res';
     while (my $token = $parser->get_token) {                      $hash{'title_'.$rid}=$token->[2]->{'title'};
  next if ($token->[0] ne 'S');                      my $turi=&versiontrack($token->[2]->{'src'});
  if ($token->[1] eq 'resource') {                      if ($token->[2]->{'version'}) {
     push(@map_ids,&parse_resource($token,$lpc,$ispage,$uri));   unless ($hash{'version_'.$turi}) {
  } elsif ($token->[1] eq 'link' && !$randomize) {      $hash{'version_'.$turi}=$1;
 # ----------------------------------------------------------------------- Links   }
     &make_link(++$linkpc,$lpc,$token->[2]->{'to'},      }
        $token->[2]->{'from'},      my $title=$token->[2]->{'title'};
        $token->[2]->{'condition'});      $title=~s/\&colon\;/\:/gs;
  } elsif ($token->[1] eq 'condition' && !$randomize) {  #    my $symb=&Apache::lonnet::encode_symb($uri,
     &parse_condition($token,$lpc);  #  $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';
       }
   
     if ($randomize) {                      $hash{'src_'.$rid}=$turi;
  my $seed = (split(/\./,$parent_rid))[1];  
  if ($randompickseed{$parent_rid}) {  
     $seed = $randompickseed{$parent_rid};  
  }  
  my $rndseed=&Apache::lonnet::rndseed($seed);  
  &Apache::lonnet::setup_random_from_rndseed($rndseed);  
  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;                      if ($token->[2]->{'external'} eq 'true') {
  $hash{'type_'.$from_rid}='finish';                          $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 $rid=$lpc.'.'.$token->[2]->{'id'};
   
 # -------------------------------------------------------------------- Resource                      $hash{'kind_'.$rid}='cond';
 sub parse_resource {      my $condition = $token->[2]->{'value'};
     my ($token,$lpc,$ispage,$uri) = @_;      $condition =~ s/[\n\r]+/ /gs; 
     if ($token->[2]->{'type'} eq 'zombie') { next; }                      push(@cond, $condition);
     my $rid=$lpc.'.'.$token->[2]->{'id'};                      $hash{'condid_'.$rid}=$#cond;
                           if ($token->[2]->{'type'}) {
     $hash{'kind_'.$rid}='res';                          $cond[$#cond].=':'.$token->[2]->{'type'};
     $hash{'title_'.$rid}=$token->[2]->{'title'};                      }  else {
     my $turi=&versiontrack($token->[2]->{'src'});                          $cond[$#cond].=':normal';
     if ($token->[2]->{'version'}) {                      }
  unless ($hash{'version_'.$turi}) {  
     $hash{'version_'.$turi}=$1;                  } elsif ($token->[1] eq 'link') {
  }  # ----------------------------------------------------------------------- Links
     }  
     my $title=$token->[2]->{'title'};                      $linkpc++;
     $title=~s/\&colon\;/\:/gs;                      my $linkid=$lpc.'.'.$linkpc;
 #   my $symb=&Apache::lonnet::encode_symb($uri,  
 #  $token->[2]->{'id'},                      my $goesto=$lpc.'.'.$token->[2]->{'to'};
 #  $turi);                      my $comesfrom=$lpc.'.'.$token->[2]->{'from'};
 #   &Apache::lonnet::do_cache_new('title',$symb,$title);                      my $undercond=0;
     unless ($ispage) {  
  $turi=~/\.(\w+)$/;                      if ($token->[2]->{'condition'}) {
  my $embstyle=&Apache::loncommon::fileembstyle($1);   $undercond=$lpc.'.'.$token->[2]->{'condition'};
  if ($token->[2]->{'external'} eq 'true') { # external                      }
     $turi=~s/^http\:\/\//\/adm\/wrapper\/ext\//;  
  } elsif ($turi=~/^\/*uploaded\//) { # uploaded                      $hash{'goesto_'.$linkid}=$goesto;
     if (($embstyle eq 'img')                       $hash{'comesfrom_'.$linkid}=$comesfrom;
  || ($embstyle eq 'emb')                      $hash{'undercond_'.$linkid}=$undercond;
  || ($embstyle eq 'wrp')) {  
  $turi='/adm/wrapper'.$turi;                      if (defined($hash{'to_'.$comesfrom})) {
     } elsif ($embstyle eq 'ssi') {                          $hash{'to_'.$comesfrom}.=','.$linkid;
  #do nothing with these                      } else {
     } elsif ($turi!~/\.(sequence|page)$/) {                          $hash{'to_'.$comesfrom}=''.$linkid;
  $turi='/adm/coursedocs/showdoc'.$turi;                      }
     }                      if (defined($hash{'from_'.$goesto})) {
  } elsif ($turi=~/\S/) { # normal non-empty internal resource                          $hash{'from_'.$goesto}.=','.$linkid;
     my $mapdir=$uri;                      } else {
     $mapdir=~s/[^\/]+$//;                          $hash{'from_'.$goesto}=''.$linkid;
     $turi=&Apache::lonnet::hreflocation($mapdir,$turi);                      }
     if (($embstyle eq 'img')                   } elsif ($token->[1] eq 'param') {
  || ($embstyle eq 'emb')  # ------------------------------------------------------------------- Parameter
  || ($embstyle eq 'wrp')) {  
  $turi='/adm/wrapper'.$turi;                      my $referid=$lpc.'.'.$token->[2]->{'to'};
     }      my $name=$token->[2]->{'name'};
  }      my $part;
     }      if ($name=~/^parameter_(.*)_/) {
 # Store reverse lookup, remove query string   $part=$1;
     my $idsuri=$turi;      } else {
     $idsuri=~s/\?.+$//;   $part=0;
     if (defined($hash{'ids_'.$idsuri})) {      }
  $hash{'ids_'.$idsuri}.=','.$rid;      $name=~s/^.*_([^_]*)$/$1/;
     } else {                      my $newparam=
  $hash{'ids_'.$idsuri}=''.$rid;   &escape($token->[2]->{'type'}).':'.
     }   &escape($part.'.'.$name).'='.
        &escape($token->[2]->{'value'});
     if ($turi=~/\/(syllabus|aboutme|navmaps|smppg|bulletinboard)$/) {                      if (defined($hash{'param_'.$referid})) {
  $turi.='?register=1';                          $hash{'param_'.$referid}.='&'.$newparam;
     }                      } else {
                               $hash{'param_'.$referid}=''.$newparam;
     $hash{'src_'.$rid}=$turi;                      }
                           if ($token->[2]->{'name'}=~/^parameter_(0_)*randompick$/) {
     if ($token->[2]->{'external'} eq 'true') {   $randompick{$referid}=$token->[2]->{'value'};
  $hash{'ext_'.$rid}='true:';                      }
     } else {                      if ($token->[2]->{'name'}=~/^parameter_(0_)*randompickseed$/) {
  $hash{'ext_'.$rid}='false:';   $randompickseed{$referid}=$token->[2]->{'value'};
     }                      }
     if ($token->[2]->{'type'}) {                      if ($token->[2]->{'name'}=~/^parameter_(0_)*encrypturl$/) {
  $hash{'type_'.$rid}=$token->[2]->{'type'};   if ($token->[2]->{'value'}=~/^yes$/i) {
  if ($token->[2]->{'type'} eq 'start') {      $encurl{$referid}=1;
     $hash{'map_start_'.$uri}="$rid";   }
  }                      }
  if ($token->[2]->{'type'} eq 'finish') {                      if ($token->[2]->{'name'}=~/^parameter_(0_)*hiddenresource$/) {
     $hash{'map_finish_'.$uri}="$rid";   if ($token->[2]->{'value'}=~/^yes$/i) {
  }      $hiddenurl{$referid}=1;
     }  else {   }
  $hash{'type_'.$rid}='normal';                      }
     }                  } 
       
     if (($turi=~/\.sequence$/) ||              }
  ($turi=~/\.page$/)) {          }
  $hash{'is_map_'.$rid}=1;  
  &loadmap($turi,$rid);  
     }   
     return $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;  
   
     if ($condition) {  
  $undercond=$lpc.'.'.$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 {      } else {
  $hash{'from_'.$goesto}=''.$linkid;          $errtext.=&mt('<br />Map not loaded: The file <tt>[_1]</tt> does not exist.',$fn);
     }      }
 }  
   
 # ------------------------------------------------------------------- Condition      my $parser = HTML::TokeParser->new(\$instr);
 sub parse_condition {      $parser->attr_encoded(1);
     my ($token,$lpc) = @_;      # last parse out the mapalias params so as to ignore anything
     my $rid=$lpc.'.'.$token->[2]->{'id'};      # refering to non-existant resources
           while (my $token = $parser->get_token) {
     $hash{'kind_'.$rid}='cond';   next if ($token->[0] ne 'S');
     $cond[$#cond+1]=$token->[2]->{'value'};   if ($token->[1] eq 'param') {
     $hash{'condid_'.$rid}=$#cond;      &parse_mapalias_param($token,$lpc);
     if ($token->[2]->{'type'}) {   } 
  $cond[$#cond].=':'.$token->[2]->{'type'};  
     }  else {  
  $cond[$#cond].=':normal';  
     }      }
 }  }
   
 # ------------------------------------------------------------------- Parameter  sub parse_mapalias_param {
   
 sub parse_param {  
     my ($token,$lpc) = @_;      my ($token,$lpc) = @_;
     my $referid=$lpc.'.'.$token->[2]->{'to'};      my $referid=$lpc.'.'.$token->[2]->{'to'};
     my $name=$token->[2]->{'name'};      return if (!exists($hash{'src_'.$referid}));
     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$/) {      if ($token->[2]->{'name'}=~/^parameter_(0_)*mapalias$/) {
    &count_mapalias($token->[2]->{'value'},$referid);
  $hash{'mapalias_'.$token->[2]->{'value'}}=$referid;   $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$/) {  
  $randompickseed{$referid}=$token->[2]->{'value'};  
     }  
     if ($token->[2]->{'name'}=~/^parameter_(0_)*randomorder$/) {  
  $randomorder{$referid}=$token->[2]->{'value'};  
  &Apache::lonnet::logthis("roing $referid ".$randomorder{$referid});  
     }  
     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;  
  }  
     }  
 }  }
   
 # --------------------------------------------------------- Simplify expression  # --------------------------------------------------------- Simplify expression
Line 404  sub simplify { Line 371  sub simplify {
 sub traceroute {  sub traceroute {
     my ($sofar,$rid,$beenhere,$encflag,$hdnflag)=@_;      my ($sofar,$rid,$beenhere,$encflag,$hdnflag)=@_;
     my $newsofar=$sofar=simplify($sofar);      my $newsofar=$sofar=simplify($sofar);
     unless ($beenhere=~/\&$rid\&/) {      unless ($beenhere=~/\&\Q$rid\E\&/) {
  $beenhere.=$rid.'&';     $beenhere.=$rid.'&';  
  my ($mapid,$resid)=split(/\./,$rid);   my ($mapid,$resid)=split(/\./,$rid);
  my $symb=&Apache::lonnet::encode_symb($hash{'map_id_'.$mapid},$resid,$hash{'src_'.$rid});   my $symb=&Apache::lonnet::encode_symb($hash{'map_id_'.$mapid},$resid,$hash{'src_'.$rid});
Line 635  sub readmap { Line 602  sub readmap {
  %parmhash=();   %parmhash=();
  $errtext='';   $errtext='';
  $pc=0;   $pc=0;
    &clear_mapalias_count();
  &processversionfile(%cenv);   &processversionfile(%cenv);
  my $furi=&Apache::lonnet::clutter($uri);   my $furi=&Apache::lonnet::clutter($uri);
  $hash{'src_0.0'}=&versiontrack($furi);   $hash{'src_0.0'}=&versiontrack($furi);
  $hash{'title_0.0'}=&Apache::lonnet::metadata($uri,'title');   $hash{'title_0.0'}=&Apache::lonnet::metadata($uri,'title');
  $hash{'ids_'.$furi}='0.0';   $hash{'ids_'.$furi}='0.0';
  $hash{'is_map_0.0'}=1;   $hash{'is_map_0.0'}=1;
  loadmap($uri,'0.0');   loadmap($uri);
  if (defined($hash{'map_start_'.$uri})) {   if (defined($hash{'map_start_'.$uri})) {
     &Apache::lonnet::appenv("request.course.id"  => $short,      &Apache::lonnet::appenv("request.course.id"  => $short,
     "request.course.fn"  => $fn,      "request.course.fn"  => $fn,
Line 651  sub readmap { Line 619  sub readmap {
     &accinit($uri,$short,$fn);      &accinit($uri,$short,$fn);
     &hiddenurls();      &hiddenurls();
  }   }
    $errtext .= &get_mapalias_errors();
 # ------------------------------------------------------- Put versions into src  # ------------------------------------------------------- Put versions into src
  foreach my $key (keys(%hash)) {   foreach my $key (keys(%hash)) {
     if ($key=~/^src_/) {      if ($key=~/^src_/) {
Line 782  sub evalstate { Line 751  sub evalstate {
     return $state;      return $state;
 }  }
   
   {
       my %mapalias_cache;
       sub count_mapalias {
    my ($value,$resid) = @_;
     push(@{ $mapalias_cache{$value} }, $resid);
       }
   
       sub get_mapalias_errors {
    my $error_text;
    foreach my $mapalias (sort(keys(%mapalias_cache))) {
       next if (scalar(@{ $mapalias_cache{$mapalias} } ) == 1);
       my $count;
       my $which =
    join('</li><li>', 
        map {
    my $id = $_;
    if (exists($hash{'src_'.$id})) {
        $count++;
    }
    my ($mapid) = split(/\./,$id);
                            &mt('[_1] in [_2]', $hash{'title_'.$id},
   
        $hash{'title_'.$hash{'ids_'.$hash{'map_id_'.$mapid}}});
        } (@{ $mapalias_cache{$mapalias} }));
       next if ($count < 2);
       $error_text .= '<div class="LC_error">'.
    &mt('Error: Found the mapalias "[_1]" defined multiple times.',
       $mapalias).
    '</div><ul><li>'.$which.'</li></ul>';
    }
    &clear_mapalias_count();
    return $error_text;
       }
       sub clear_mapalias_count {
    undef(%mapalias_cache);
       }
   }
 1;  1;
 __END__  __END__
   

Removed from v.1.118.2.2  
changed lines
  Added in v.1.123


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