[LON-CAPA-cvs] cvs: loncom / lonmap.pm
foxr
foxr at source.lon-capa.org
Tue Sep 13 06:27:52 EDT 2011
foxr Tue Sep 13 10:27:52 2011 EDT
Modified files:
/loncom lonmap.pm
Log:
Good perl compilation.
-------------- next part --------------
Index: loncom/lonmap.pm
diff -u loncom/lonmap.pm:1.1 loncom/lonmap.pm:1.2
--- loncom/lonmap.pm:1.1 Wed Sep 7 10:58:36 2011
+++ loncom/lonmap.pm Tue Sep 13 10:27:52 2011
@@ -2,7 +2,7 @@
#
# Read maps into a 'big hash'.
#
-# $Id: lonmap.pm,v 1.1 2011/09/07 10:58:36 foxr Exp $
+# $Id: lonmap.pm,v 1.2 2011/09/13 10:27:52 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -38,7 +38,7 @@
use HTML::TokeParser;
-use Apache::LONCAPA;
+use LONCAPA;
use Apache::lonnet;
#------------- File scoped variables:
@@ -56,8 +56,9 @@
my %randomorder;
my %encurl;
my %hiddenurl;
+my %parmhash;
my @cond; # Array of conditions.
-
+my $retfrid;
#
# Other stuff we make global (sigh) so that it does not need
# to be passed around all the time:
@@ -128,7 +129,7 @@
sub merge_conditions {
my $hash = shift;
- for (my $i = 0; i < scalar(@cond); i++) {
+ for (my $i = 0; $i < scalar(@cond); $i++) {
$hash->{'condition' . '.' . $i} = $cond[$i];
}
}
@@ -181,7 +182,7 @@
# result string.'
#
# Parameters:
-# none
+# hash - Reference to the hash we are trying t build up.
# Implicit inputs
# %mapalias - a hash that is indexed by map aliases and contains for each key
# an array of the resource id's the alias 'points to'.
@@ -191,6 +192,7 @@
#
#
sub get_mapalias_errors {
+ my $hash = shift;
my $error_text;
foreach my $mapalias (sort(keys(%mapalias_cache))) {
next if (scalar(@{ $mapalias_cache{$mapalias} } ) == 1);
@@ -199,13 +201,13 @@
join('</li><li>',
map {
my $id = $_;
- if (exists($hash{'src_'.$id})) {
+ if (exists($hash->{'src_'.$id})) {
$count++;
}
my ($mapid) = split(/\./,$id);
&mt('Resource "[_1]" <br /> in Map "[_2]"',
- $hash{'title_'.$id},
- $hash{'title_'.$hash{'ids_'.$hash{'map_id_'.$mapid}}});
+ $hash->{'title_'.$id},
+ $hash->{'title_'.$hash->{'ids_'.$hash->{'map_id_'.$mapid}}});
} (@{ $mapalias_cache{$mapalias} }));
next if ($count < 2);
$error_text .= '<div class="LC_error">'.
@@ -229,6 +231,31 @@
#
#
+# Put a version into a src element of a hash or url:
+#
+# Parameters:
+# uri - URI into which the version must be added.
+# hash - Reference to the hash being built up.
+# short- Short coursename.
+#
+
+sub putinversion {
+ my ($uri, $hash, $short) = @_;
+ my $key=$short.'_'.&Apache::lonnet::clutter($uri);
+ if ($hash->{'version_'.$uri}) {
+ my $version=$hash->{'version_'.$uri};
+ if ($version eq 'mostrecent') { return $uri; }
+ if ($version eq &Apache::lonnet::getversion(
+ &Apache::lonnet::filelocation('',$uri)))
+ { return $uri; }
+ $uri=~s/\.(\w+)$/\.$version\.$1/;
+ }
+ &Apache::lonnet::do_cache_new('courseresversion',$key,&Apache::lonnet::declutter($uri),600);
+ return $uri;
+}
+
+
+#
# Create hash entries for each version of the course.
# Parameters:
# $cenv - Reference to a course environment from lonnet::coursedescription.
@@ -291,7 +318,7 @@
unless ($hash->{'version_'.$uri}) {
$hash->{'version_'.$uri}=$version;
} elsif ($version!=$hash->{'version_'.$uri}) {
- throw Error::Simple(&versionerror($uri,$hash{'version_'.$uri},$version));
+ throw Error::Simple(&versionerror($uri, $hash->{'version_'.$uri}, $version));
}
}
return $uri;
@@ -410,7 +437,7 @@
#
sub accinit {
- my ($uri,$short,$fn)=@_;
+ my ($uri, $short, $fn, $hash)=@_;
my %acchash=();
my %captured=();
my $condcounter=0;
@@ -542,7 +569,7 @@
# new value indicating how far the map has been traversed (the sofar).
#
sub traceroute {
- my ($sofar,$rid,$beenhere,$encflag,$hdnflag)=@_;
+ my ($sofar, $rid, $beenhere, $encflag, $hdnflag, $hash)=@_;
my $newsofar=$sofar=simplify($sofar);
unless ($beenhere=~/\&\Q$rid\E\&/) {
@@ -608,7 +635,7 @@
$further=simplify('('.'_'.$rid.')&('.
$hash->{'condid_'.$hash->{'undercond_'.$id}}.')');
} else {
- $errtext.=&mt('<br />Undefined condition ID: [_1]',$hash->{'undercond_'.$id});
+ my $errtext.=&mt('<br />Undefined condition ID: [_1]',$hash->{'undercond_'.$id});
throw Error::Simple($errtext);
}
}
@@ -1128,7 +1155,7 @@
# Check for duplication: A map may only be included once.
if($hash->{'map_pc_' . $uri}) {
- throw Error::Simple('Duplicate map: ' $uri);
+ throw Error::Simple('Duplicate map: ', $uri);
}
# count the map number and save it locally so that we don't lose it
# when we recurse.
@@ -1151,7 +1178,7 @@
my $parent_no = $1; # Parent's map number.
if (defined($hash->{'map_hierarchy_' . $parent_no})) {
$hash->{'map_hierarchy_' . $lmap_no} =
- $hash->{'map_hierarchy_' . $parent_no} . ',' $parent_no;
+ $hash->{'map_hierarchy_' . $parent_no} . ',' . $parent_no;
} else {
# Only 1 level deep ..nothing to append to:
@@ -1165,13 +1192,13 @@
my $filename = &Apache::lonnet::filelocation('', &append_version($uri, $hash));
my $ispage = ($filename =~/\.page$/);
- unless ($ispage || ($filname =~ /\.sequence$/)) {
+ unless ($ispage || ($filename =~ /\.sequence$/)) {
throw Error::Simple(&mt("<br />Invalid map: <tt>[_1]</tt>", $filename));
}
$filename =~ /\.(\w+)$/;
- $hash->{'map_type_'.$lpc}=$1;
+ $hash->{'map_type_'.$lmap_no}=$1;
# Repcopy the file and get its contents...report errors if we can't
@@ -1192,7 +1219,7 @@
# tags.. this is because there is no body to a <param> tag.
#
- my $parser = HTML::TokeParser->new($\contents);
+ my $parser = HTML::TokeParser->new(\$contents);
$parser->attr_encoded(1); # Don't interpret entities in attributes (leave &xyz; alone).
while (my $token = $parser->get_token()) {
@@ -1207,7 +1234,7 @@
# resources, they are also not processed if random order is turned on.
#
- $parser = HTML::TokeParser->new($\contents); # no way to reset the existing parser
+ $parser = HTML::TokeParser->new(\$contents); # no way to reset the existing parser
$parser->attr_encoded(1);
my $linkpc=0;
@@ -1220,7 +1247,7 @@
# Resource
if ($token->[1] eq 'resource') {
- my $resource_id = &parse_resource($token,$lpc,$ispage,$uri, $hash);
+ my $resource_id = &parse_resource($token,$lmap_no,$ispage,$uri, $hash);
if (defined $resource_id) {
push(@map_ids, $resource_id);
}
@@ -1228,14 +1255,14 @@
# Link
} elsif ($token->[1] eq 'link' && !$randomize) {
- &make_link(++$linkpc,$lpc,$token->[2]->{'to'},
+ &make_link(++$linkpc,$lmap_no,$token->[2]->{'to'},
$token->[2]->{'from'},
$token->[2]->{'condition'}, $hash); # note ..condition may be undefined.
# condition
} elsif ($token->[1] eq 'condition' && !$randomize) {
- &parse_condition($token,$lpc, $hash);
+ &parse_condition($token,$lmap_no, $hash);
}
}
@@ -1279,7 +1306,7 @@
my $from = shift(@map_ids);
- my $from_rid = $lpc.'.'.$from;
+ my $from_rid = $lmap_no.'.'.$from;
$hash->{'map_start_'.$uri} = $from_rid;
$hash->{'type_'.$from_rid}='start';
@@ -1288,8 +1315,8 @@
# if randomorder was set. This means that for an instructor to choose
while (my $to = shift(@map_ids)) {
- &make_link(++$linkpc,$lpc,$to,$from);
- my $to_rid = $lpc.'.'.$to;
+ &make_link(++$linkpc,$lmap_no,$to,$from);
+ my $to_rid = $lmap_no.'.'.$to;
$hash->{'type_'.$to_rid}='normal';
$from = $to;
$from_rid = $to_rid;
@@ -1308,7 +1335,7 @@
while (my $token = $parser->get_token) {
next if ($token->[0] ne 'S');
if ($token->[1] eq 'param') {
- &parse_mapalias_param($token,$lpc, $hash);
+ &parse_mapalias_param($token,$lmap_no, $hash);
}
}
@@ -1342,8 +1369,11 @@
%randompickseed = ();
%encurl = ();
%hiddenurl = ();
+ %parmhash = ();
@cond = ();
+ $retfrid = '';
+
#
$username = $uname;
@@ -1357,7 +1387,7 @@
# Get the information we need about the course.
# Return without filling in anything if we can't get any info:
- my %cenv = &Apache::lonnet::coursedesription($short_name,
+ my %cenv = &Apache::lonnet::coursedescription($short_name,
{'freshen_cache' => 1,
'user' => $uname});
unless ($cenv{'url'}) {
@@ -1374,33 +1404,51 @@
# Figure out the map filename's URI, and set up some starting points for the map.
- $course_uri = $cenv->{'url'};
- $map_uri = &Apache::lonnet::clutter($course_uri);
+ my $course_uri = $cenv{'url'};
+ my $map_uri = &Apache::lonnet::clutter($course_uri);
$target_hash->{'src_0.0'} = &versiontrack($map_uri, $target_hash);
$target_hash->{'title_0.0'} = &Apache::lonnet::metadata($course_uri, 'title');
- $target_hash->{'ids_'.$file_map_uri} = '0.0';
+ $target_hash->{'ids_'.$map_uri} = '0.0';
$target_hash->{'is_map_0.0'} = 1;
&read_map($course_uri, '0.0', &hash);
#
- if (defined($hash->{'map_start_'.$uri})) {
+ if (defined($target_hash->{'map_start_'.$map_uri})) {
- &traceroute('0',$hash->{'map_start_'.$course_uri},'&', $hash);
- &accinit($course_uri, $short_name, $fn, $hash);
- &hiddenurls($hash);
+ &traceroute('0',$target_hash->{'map_start_'.$course_uri},'&', $target_hash);
+ &accinit($course_uri, $short_name, $filepath, $target_hash);
+ &hiddenurls($target_hash);
+ }
+ my $errors = &get_mapalias_errors($target_hash);
+ if ($errors ne "") {
+ throw Error::Simple("Map alias errors: ", $errors);
+ }
+
+ # Put the versions in to src:
+
+ foreach my $key (keys(%$target_hash)) {
+ if ($key =~ /^src_/) {
+ $target_hash->{$key} =
+ &putinversion($target_hash->{$key}, $target_hash, $short_name);
+ } elsif ($key =~ /^(map_(?:start|finish|pc)_)(.*)/) {
+ my ($type, $url) = ($1,$2);
+ my $value = $target_hash->{$key};
+ $target_hash->{$type.&putinversion($url, $target_hash, $short_name)}=$value;
+ }
}
# Merge in the child hashes in case the caller wants that information as well.
- &merge_hash($hash, 'randompick', \%randompick);
- &merge_hash($hash, 'randompickseed', \%randompick);
- &merge_hash($hash, 'randomorder', \%randomorder);
- &merge_hash($hash, 'encurl', \%encurl);
- &merge_hash($hash, 'hiddenurl', \%hiddenurl);
- &merge_conditions($hash);
+ &merge_hash($target_hash, 'randompick', \%randompick);
+ &merge_hash($target_hash, 'randompickseed', \%randompick);
+ &merge_hash($target_hash, 'randomorder', \%randomorder);
+ &merge_hash($target_hash, 'encurl', \%encurl);
+ &merge_hash($target_hash, 'hiddenurl', \%hiddenurl);
+ &merge_hash($target_hash, 'param', \%parmhash);
+ &merge_conditions($target_hash);
}
otherwise {
my $e = shift;
More information about the LON-CAPA-cvs
mailing list