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

version 1.118.2.2, 2007/06/28 23:26:38 version 1.119, 2007/06/28 22:16:53
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.=&mt('<br />Multiple use of sequence/page <tt>[_1]</tt>! The course will not function properly.',$uri);
  return;    return; 
Line 130  sub loadmap { Line 129  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;  
   
     $fn=~/\.(\w+)$/;  
   
     $hash{'map_type_'.$lpc}=$1;  
   
     my $randomize = ($randomorder{$parent_rid} =~ /^yes$/i);  
   
     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);  
  }  
     }  
   
     if ($randomize) {          my $linkpc=0;
  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;          $fn=~/\.(\w+)$/;
  $hash{'type_'.$from_rid}='finish';  
     }  
 }  
   
           $hash{'map_type_'.$lpc}=$1;
   
           while ($token = $parser->get_token) {
       if ($token->[0] eq 'S') {
                   if ($token->[1] eq 'resource') {
 # -------------------------------------------------------------------- Resource  # -------------------------------------------------------------------- Resource
 sub parse_resource {                      if ($token->[2]->{'type'} eq 'zombie') { next; }
     my ($token,$lpc,$ispage,$uri) = @_;                      my $rid=$lpc.'.'.$token->[2]->{'id'};
     if ($token->[2]->{'type'} eq 'zombie') { next; }  
     my $rid=$lpc.'.'.$token->[2]->{'id'};                      $hash{'kind_'.$rid}='res';
                           $hash{'title_'.$rid}=$token->[2]->{'title'};
     $hash{'kind_'.$rid}='res';                      my $turi=&versiontrack($token->[2]->{'src'});
     $hash{'title_'.$rid}=$token->[2]->{'title'};                      if ($token->[2]->{'version'}) {
     my $turi=&versiontrack($token->[2]->{'src'});   unless ($hash{'version_'.$turi}) {
     if ($token->[2]->{'version'}) {      $hash{'version_'.$turi}=$1;
  unless ($hash{'version_'.$turi}) {   }
     $hash{'version_'.$turi}=$1;      }
  }      my $title=$token->[2]->{'title'};
     }      $title=~s/\&colon\;/\:/gs;
     my $title=$token->[2]->{'title'};  #    my $symb=&Apache::lonnet::encode_symb($uri,
     $title=~s/\&colon\;/\:/gs;  #  $token->[2]->{'id'},
 #   my $symb=&Apache::lonnet::encode_symb($uri,  #  $turi);
 #  $token->[2]->{'id'},  #    &Apache::lonnet::do_cache_new('title',$symb,$title);
 #  $turi);                      unless ($ispage) {
 #   &Apache::lonnet::do_cache_new('title',$symb,$title);                          $turi=~/\.(\w+)$/;
     unless ($ispage) {                          my $embstyle=&Apache::loncommon::fileembstyle($1);
  $turi=~/\.(\w+)$/;                          if ($token->[2]->{'external'} eq 'true') { # external
  my $embstyle=&Apache::loncommon::fileembstyle($1);                              $turi=~s/^http\:\/\//\/adm\/wrapper\/ext\//;
  if ($token->[2]->{'external'} eq 'true') { # external                          } elsif ($turi=~/^\/*uploaded\//) { # uploaded
     $turi=~s/^http\:\/\//\/adm\/wrapper\/ext\//;      if (($embstyle eq 'img') 
  } elsif ($turi=~/^\/*uploaded\//) { # uploaded   || ($embstyle eq 'emb')
     if (($embstyle eq 'img')    || ($embstyle eq 'wrp')) {
  || ($embstyle eq 'emb')                                  $turi='/adm/wrapper'.$turi;
  || ($embstyle eq 'wrp')) {      } elsif ($embstyle eq 'ssi') {
  $turi='/adm/wrapper'.$turi;   #do nothing with these
     } elsif ($embstyle eq 'ssi') {      } elsif ($turi!~/\.(sequence|page)$/) {
  #do nothing with these   $turi='/adm/coursedocs/showdoc'.$turi;
     } elsif ($turi!~/\.(sequence|page)$/) {                              }
  $turi='/adm/coursedocs/showdoc'.$turi;                          } elsif ($turi=~/\S/) { # normal non-empty internal resource
     }      my $mapdir=$uri;
  } elsif ($turi=~/\S/) { # normal non-empty internal resource      $mapdir=~s/[^\/]+$//;
     my $mapdir=$uri;      $turi=&Apache::lonnet::hreflocation($mapdir,$turi);
     $mapdir=~s/[^\/]+$//;      if (($embstyle eq 'img') 
     $turi=&Apache::lonnet::hreflocation($mapdir,$turi);   || ($embstyle eq 'emb')
     if (($embstyle eq 'img')    || ($embstyle eq 'wrp')) {
  || ($embstyle eq 'emb')   $turi='/adm/wrapper'.$turi;
  || ($embstyle eq 'wrp')) {      }
  $turi='/adm/wrapper'.$turi;                          }
     }      }
  }  
     }  
 # Store reverse lookup, remove query string  # Store reverse lookup, remove query string
     my $idsuri=$turi;      my $idsuri=$turi;
     $idsuri=~s/\?.+$//;      $idsuri=~s/\?.+$//;
     if (defined($hash{'ids_'.$idsuri})) {                      if (defined($hash{'ids_'.$idsuri})) {
  $hash{'ids_'.$idsuri}.=','.$rid;                          $hash{'ids_'.$idsuri}.=','.$rid;
     } else {                      } else {
  $hash{'ids_'.$idsuri}=''.$rid;                          $hash{'ids_'.$idsuri}=''.$rid;
     }                      }
                      
     if ($turi=~/\/(syllabus|aboutme|navmaps|smppg|bulletinboard)$/) {                      if ($turi=~/\/(syllabus|aboutme|navmaps|smppg|bulletinboard)$/) {
  $turi.='?register=1';   $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,$rid);  
     }   
     return $token->[2]->{'id'};  
 }  
   
 sub make_link {                      $hash{'src_'.$rid}=$turi;
     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 {  
  $hash{'from_'.$goesto}=''.$linkid;  
     }  
 }  
   
                       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  # ------------------------------------------------------------------- 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 $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';
                       }
   
                   } elsif ($token->[1] eq 'link') {
   # ----------------------------------------------------------------------- Links
   
                       $linkpc++;
                       my $linkid=$lpc.'.'.$linkpc;
   
                       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  # ------------------------------------------------------------------- Parameter
   
 sub parse_param {                      my $referid=$lpc.'.'.$token->[2]->{'to'};
     my ($token,$lpc) = @_;      my $name=$token->[2]->{'name'};
     my $referid=$lpc.'.'.$token->[2]->{'to'};      my $part;
     my $name=$token->[2]->{'name'};      if ($name=~/^parameter_(.*)_/) {
     my $part;   $part=$1;
     if ($name=~/^parameter_(.*)_/) {      } else {
  $part=$1;   $part=0;
     } else {      }
  $part=0;      $name=~s/^.*_([^_]*)$/$1/;
     }                      my $newparam=
     $name=~s/^.*_([^_]*)$/$1/;   &escape($token->[2]->{'type'}).':'.
     my $newparam=   &escape($part.'.'.$name).'='.
  &escape($token->[2]->{'type'}).':'.   &escape($token->[2]->{'value'});
  &escape($part.'.'.$name).'='.                      if (defined($hash{'param_'.$referid})) {
  &escape($token->[2]->{'value'});                          $hash{'param_'.$referid}.='&'.$newparam;
     if (defined($hash{'param_'.$referid})) {                      } else {
  $hash{'param_'.$referid}.='&'.$newparam;                          $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$/) {
    $randompickseed{$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;
    }
                       }
                   } 
   
               }
           }
   
     } else {      } else {
  $hash{'param_'.$referid}=''.$newparam;          $errtext.=&mt('<br />Map not loaded: The file <tt>[_1]</tt> does not exist.',$fn);
     }  
     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$/) {  
  $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;  
  }  
     }      }
 }  }
   
Line 641  sub readmap { Line 585  sub readmap {
  $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,

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


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