version 1.102, 2002/11/12 18:24:38
|
version 1.106, 2002/11/14 21:36:23
|
Line 37
|
Line 37
|
# 3/1/1,6/1,17/1,29/1,30/1,2/8,9/21,9/24,9/25 Gerd Kortemeyer |
# 3/1/1,6/1,17/1,29/1,30/1,2/8,9/21,9/24,9/25 Gerd Kortemeyer |
# YEAR=2002 |
# YEAR=2002 |
# 1/1 Gerd Kortemeyer |
# 1/1 Gerd Kortemeyer |
# |
# Oct-Nov Jeremy Bowers |
|
|
package Apache::lonnavmaps; |
package Apache::lonnavmaps; |
|
|
use strict; |
use strict; |
use Apache::Constants qw(:common :http); |
use Apache::Constants qw(:common :http); |
use Apache::lonnet(); |
|
use Apache::loncommon(); |
use Apache::loncommon(); |
use GDBM_File; |
|
use POSIX qw (floor strftime); |
use POSIX qw (floor strftime); |
|
|
sub handler { |
sub handler { |
Line 73 sub handler {
|
Line 71 sub handler {
|
&Apache::loncommon::no_cache($r); |
&Apache::loncommon::no_cache($r); |
$r->send_http_header; |
$r->send_http_header; |
|
|
# Create the nav map the nav map |
# Create the nav map |
my $navmap = Apache::lonnavmaps::navmap->new( |
my $navmap = Apache::lonnavmaps::navmap->new( |
$ENV{"request.course.fn"}.".db", |
$ENV{"request.course.fn"}.".db", |
$ENV{"request.course.fn"}."_parms.db", 1, 1); |
$ENV{"request.course.fn"}."_parms.db", 1, 1); |
Line 437 sub handler {
|
Line 435 sub handler {
|
'symb='.&Apache::lonnet::escape($curRes->symb()). |
'symb='.&Apache::lonnet::escape($curRes->symb()). |
'"'; |
'"'; |
|
|
my $title = $curRes->title(); |
my $title = $curRes->compTitle(); |
if (!$title) { |
|
$title = $curRes->src(); |
|
$title = substr ($title, rindex($title, "/") + 1); |
|
} |
|
my $partLabel = ""; |
my $partLabel = ""; |
my $newBranchText = ""; |
my $newBranchText = ""; |
|
|
Line 532 sub handler {
|
Line 526 sub handler {
|
} |
} |
|
|
$r->print(" ${newBranchText}${linkopen}$icon${linkclose}\n"); |
$r->print(" ${newBranchText}${linkopen}$icon${linkclose}\n"); |
|
#$r->print($curRes->awarded($part)); |
|
|
my $curMarkerBegin = ""; |
my $curMarkerBegin = ""; |
my $curMarkerEnd = ""; |
my $curMarkerEnd = ""; |
Line 1355 sub new {
|
Line 1350 sub new {
|
my $resultingVal = $curRes->{DATA}->{$valName}; |
my $resultingVal = $curRes->{DATA}->{$valName}; |
my $nextResources = $curRes->$nextResourceMethod(); |
my $nextResources = $curRes->$nextResourceMethod(); |
my $resourceCount = scalar(@{$nextResources}); |
my $resourceCount = scalar(@{$nextResources}); |
|
|
if ($resourceCount == 1) { |
if ($resourceCount == 1) { |
my $current = $nextResources->[0]->{DATA}->{$valName} || 999999999; |
my $current = $nextResources->[0]->{DATA}->{$valName} || 999999999; |
$nextResources->[0]->{DATA}->{$valName} = min($resultingVal, $current); |
$nextResources->[0]->{DATA}->{$valName} = min($resultingVal, $current); |
Line 1441 sub next {
|
Line 1436 sub next {
|
my $here; |
my $here; |
while ( $i >= 0 && !$found ) { |
while ( $i >= 0 && !$found ) { |
if ( scalar(@{$self->{STACK}->[$i]}) > 0 ) { |
if ( scalar(@{$self->{STACK}->[$i]}) > 0 ) { |
$here = $self->{HERE} = shift @{$self->{STACK}->[$i]}; |
$here = pop @{$self->{STACK}->[$i]}; |
$found = 1; |
$found = 1; |
$newDepth = $i; |
$newDepth = $i; |
} |
} |
Line 1459 sub next {
|
Line 1454 sub next {
|
} |
} |
} |
} |
|
|
|
# If this is not a resource, it must be an END_BRANCH marker we want |
|
# to return directly. |
|
if (!ref($here)) { |
|
if ($here == END_BRANCH()) { # paranoia, in case of later extension |
|
$self->{CURRENT_DEPTH}--; |
|
return $here; |
|
} |
|
} |
|
|
|
# Otherwise, it is a resource and it's safe to store in $self->{HERE} |
|
$self->{HERE} = $here; |
|
|
# Get to the right level |
# Get to the right level |
if ( $self->{CURRENT_DEPTH} > $newDepth ) { |
if ( $self->{CURRENT_DEPTH} > $newDepth ) { |
push @{$self->{STACK}->[$newDepth]}, $here; |
push @{$self->{STACK}->[$newDepth]}, $here; |
Line 1478 sub next {
|
Line 1485 sub next {
|
# So we need to look at all the resources we can get to from here, |
# So we need to look at all the resources we can get to from here, |
# categorize them if we haven't seen them, remember if we have a new |
# categorize them if we haven't seen them, remember if we have a new |
my $nextUnfiltered = $here->getNext(); |
my $nextUnfiltered = $here->getNext(); |
|
my $maxDepthAdded = -1; |
|
|
for (@$nextUnfiltered) { |
for (@$nextUnfiltered) { |
if (!defined($self->{ALREADY_SEEN}->{$_->{ID}})) { |
if (!defined($self->{ALREADY_SEEN}->{$_->{ID}})) { |
push @{$self->{STACK}->[$_->{DATA}->{DISPLAY_DEPTH}]}, $_; |
my $depth = $_->{DATA}->{DISPLAY_DEPTH}; |
|
push @{$self->{STACK}->[$depth]}, $_; |
$self->{ALREADY_SEEN}->{$_->{ID}} = 1; |
$self->{ALREADY_SEEN}->{$_->{ID}} = 1; |
|
if ($maxDepthAdded < $depth) { $maxDepthAdded = $depth; } |
} |
} |
} |
} |
|
|
|
# Is this the end of a branch? If so, all of the resources examined above |
|
# led to lower levels then the one we are currently at, so we push a END_BRANCH |
|
# marker onto the stack so we don't forget. |
|
# Example: For the usual A(BC)(DE)F case, when the iterator goes down the |
|
# BC branch and gets to C, it will see F as the only next resource, but it's |
|
# one level lower. Thus, this is the end of the branch, since there are no |
|
# more resources added to this level or above. |
|
my $isEndOfBranch = $maxDepthAdded < $self->{CURRENT_DEPTH}; |
|
if ($isEndOfBranch) { |
|
push @{$self->{STACK}->[$self->{CURRENT_DEPTH}]}, END_BRANCH(); |
|
} |
|
|
# That ends the main iterator logic. Now, do we want to recurse |
# That ends the main iterator logic. Now, do we want to recurse |
# down this map (if this resource is a map)? |
# down this map (if this resource is a map)? |
if ($self->{HERE}->is_map() && |
if ($self->{HERE}->is_map() && |
Line 1757 These are methods that help you retrieve
|
Line 1779 These are methods that help you retrieve
|
|
|
=over 4 |
=over 4 |
|
|
|
=item * B<compTitle>: Returns a "composite title", that is equal to $res->title() if the resource has a title, and is otherwise the last part of the URL (e.g., "problem.problem"). |
|
|
=item * B<ext>: Returns true if the resource is external. |
=item * B<ext>: Returns true if the resource is external. |
|
|
=item * B<goesto>: Returns the "goesto" value from the compiled nav map. (It is likely you want to use B<getNext> instead.) |
=item * B<goesto>: Returns the "goesto" value from the compiled nav map. (It is likely you want to use B<getNext> instead.) |
Line 1806 sub symb {
|
Line 1830 sub symb {
|
} |
} |
sub title { my $self=shift; return $self->navHash("title_", 1); } |
sub title { my $self=shift; return $self->navHash("title_", 1); } |
sub to { my $self=shift; return $self->navHash("to_", 1); } |
sub to { my $self=shift; return $self->navHash("to_", 1); } |
|
sub compTitle { |
|
my $self = shift; |
|
my $title = $self->title(); |
|
if (!$title) { |
|
$title = $self->src(); |
|
$title = substr($title, rindex($title, '/') + 1); |
|
} |
|
return $title; |
|
} |
=pod |
=pod |
|
|
B<Predicate Testing the Resource> |
B<Predicate Testing the Resource> |
Line 1966 sub answerdate {
|
Line 1998 sub answerdate {
|
} |
} |
return $self->parmval("answerdate", $part); |
return $self->parmval("answerdate", $part); |
} |
} |
|
sub awarded { |
|
(my $self, my $part) = @_; |
|
return $self->parmval("awarded", $part); |
|
} |
sub duedate { |
sub duedate { |
(my $self, my $part) = @_; |
(my $self, my $part) = @_; |
return $self->parmval("duedate", $part); |
return $self->parmval("duedate", $part); |
Line 2433 sub getPrevious {
|
Line 2469 sub getPrevious {
|
# Don't remember it if the student doesn't have browse priviledges |
# Don't remember it if the student doesn't have browse priviledges |
# future note: this may properly belong in the client of the resource |
# future note: this may properly belong in the client of the resource |
my $browsePriv = &Apache::lonnet::allowed('bre', $self->src); |
my $browsePriv = &Apache::lonnet::allowed('bre', $self->src); |
if ($browsePriv ne '2' && $browsePriv ne 'F') { |
if (!($browsePriv ne '2' && $browsePriv ne 'F')) { |
push @branches, $prev; |
push @branches, $prev; |
} |
} |
} |
} |