--- rat/lonuserstate.pm 2007/06/28 22:16:53 1.119
+++ rat/lonuserstate.pm 2007/08/28 16:45:20 1.123
@@ -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.119 2007/06/28 22:16:53 albertel Exp $
+# $Id: lonuserstate.pm,v 1.123 2007/08/28 16:45:20 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -108,7 +108,9 @@ sub processversionfile {
sub loadmap {
my $uri=shift;
if ($hash{'map_pc_'.$uri}) {
- $errtext.=&mt('
Multiple use of sequence/page [_1]! The course will not function properly.',$uri);
+ $errtext.='
'.
+ &mt('Multiple use of sequence/page [_1]! The course will not function properly.',''.$uri.'').
+ '
';
return;
}
$pc++;
@@ -234,7 +236,9 @@ sub loadmap {
my $rid=$lpc.'.'.$token->[2]->{'id'};
$hash{'kind_'.$rid}='cond';
- $cond[$#cond+1]=$token->[2]->{'value'};
+ my $condition = $token->[2]->{'value'};
+ $condition =~ s/[\n\r]+/ /gs;
+ push(@cond, $condition);
$hash{'condid_'.$rid}=$#cond;
if ($token->[2]->{'type'}) {
$cond[$#cond].=':'.$token->[2]->{'type'};
@@ -291,9 +295,6 @@ sub loadmap {
} 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'};
}
@@ -318,6 +319,28 @@ sub loadmap {
} else {
$errtext.=&mt('
Map not loaded: The file [_1] does not exist.',$fn);
}
+
+ my $parser = HTML::TokeParser->new(\$instr);
+ $parser->attr_encoded(1);
+ # last parse out the mapalias params so as to ignore anything
+ # refering to non-existant resources
+ while (my $token = $parser->get_token) {
+ next if ($token->[0] ne 'S');
+ if ($token->[1] eq 'param') {
+ &parse_mapalias_param($token,$lpc);
+ }
+ }
+}
+
+sub parse_mapalias_param {
+ my ($token,$lpc) = @_;
+ my $referid=$lpc.'.'.$token->[2]->{'to'};
+ return if (!exists($hash{'src_'.$referid}));
+
+ if ($token->[2]->{'name'}=~/^parameter_(0_)*mapalias$/) {
+ &count_mapalias($token->[2]->{'value'},$referid);
+ $hash{'mapalias_'.$token->[2]->{'value'}}=$referid;
+ }
}
# --------------------------------------------------------- Simplify expression
@@ -348,7 +371,7 @@ sub simplify {
sub traceroute {
my ($sofar,$rid,$beenhere,$encflag,$hdnflag)=@_;
my $newsofar=$sofar=simplify($sofar);
- unless ($beenhere=~/\&$rid\&/) {
+ unless ($beenhere=~/\&\Q$rid\E\&/) {
$beenhere.=$rid.'&';
my ($mapid,$resid)=split(/\./,$rid);
my $symb=&Apache::lonnet::encode_symb($hash{'map_id_'.$mapid},$resid,$hash{'src_'.$rid});
@@ -579,6 +602,7 @@ sub readmap {
%parmhash=();
$errtext='';
$pc=0;
+ &clear_mapalias_count();
&processversionfile(%cenv);
my $furi=&Apache::lonnet::clutter($uri);
$hash{'src_0.0'}=&versiontrack($furi);
@@ -595,6 +619,7 @@ sub readmap {
&accinit($uri,$short,$fn);
&hiddenurls();
}
+ $errtext .= &get_mapalias_errors();
# ------------------------------------------------------- Put versions into src
foreach my $key (keys(%hash)) {
if ($key=~/^src_/) {
@@ -726,6 +751,43 @@ sub evalstate {
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('',
+ 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 .= ''.
+ &mt('Error: Found the mapalias "[_1]" defined multiple times.',
+ $mapalias).
+ '
';
+ }
+ &clear_mapalias_count();
+ return $error_text;
+ }
+ sub clear_mapalias_count {
+ undef(%mapalias_cache);
+ }
+}
1;
__END__