File:  [LON-CAPA] / loncom / interface / lonindexer.pm
Revision 1.1: download - view: text, annotated - select for diffs
Mon Aug 28 21:07:32 2000 UTC (23 years, 8 months ago) by www
Branches: MAIN
CVS tags: HEAD
Lonindexer moved

# The LearningOnline Network with CAPA
# Directory Indexer
# (Login Screen
# 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14 Gerd Kortemeyer)
# 11/23 Gerd Kortemeyer
# 07/20-08/04 H.K. Ng
#
package Apache::lonindexer;

use strict;
use Apache::lonnet();
use Apache::Constants qw(:common);

sub handler {
    my $r = shift;
    $r->content_type('text/html');
    $r->send_http_header;
    return OK if $r->header_only;

    my $iconpath= $r->dir_config('lonIconsURL');
    my $domain  = $r->dir_config('lonDefDomain');
    my $role    = $r->dir_config('lonRole');
    my $loadlim = $r->dir_config('lonLoadLim');
    my $servadm = $r->dir_config('lonAdmEMail');
    my $sysadm  = $r->dir_config('lonSysEMail');
    my $lonhost = $r->dir_config('lonHostID');
    my $tabdir  = $r->dir_config('lonTabDir');

# ---------------------------------------------------------------- Print Header
    $r->print(<<ENDHEADER);
<html>
<head>
<title>The LearningOnline Network Directory Browser</title>
</head>
<body bgcolor="#FFFFFF">
ENDHEADER

    my $line;
    my (@attrchk,@openpath);
    my $uri=$r->uri;
    my $iconpath="/res/adm/pages/indexericons/";

    $r->print("<h2>The LearningOnline Network Directory Browser</h2>\n");

    for (my $i=0; $i<=5; $i++) {
	$attrchk[$i] = "checked" if $ENV{'form.attr'.$i} == 1;
    }
    $r->print(<<END);
<b>Display file attributes</b><br>
<form method="post" name="fileattr" action="$uri" enctype="application/x-www-form-urlencoded">
<table border=0><tr>
<td><input type=checkbox name=attr0 value="1" $attrchk[0]>Size</td>
<td><input type=checkbox name=attr1 value="1" $attrchk[1]>Last access</td>
<td><input type=checkbox name=attr2 value="1" $attrchk[2]>Last modified</td>
</tr><tr>
<td><input type=checkbox name=attr3 value="1" $attrchk[3]>Author</td>
<td><input type=checkbox name=attr4 value="1" $attrchk[4]>Keywords</td>
<td><input type=checkbox name=attr5 value="1" $attrchk[5]>Language</td>
</tr></table>
<input type=hidden name=openuri value="$ENV{'form.openuri'}">
<input type="submit" name="dirlistattr" value="Review">
<input type="submit" name="dirlistattr" value="Refresh">
</form>
END
    my $titleclr="#ddffff";
    my $fileclr="#ffffdd";

    $r->print("<table border=0><tr><td bgcolor=#eeeeee>\n");
    $r->print("<table border=0><tr>\n");
    $r->print("<td bgcolor=$titleclr><b>Name</b></td>\n");
    $r->print("<td bgcolor=$titleclr align=right><b>Size (bytes) </b></td>\n") if ($ENV{'form.attr0'} == 1);
    $r->print("<td bgcolor=$titleclr><b>Last accessed</b></td>\n") if ($ENV{'form.attr1'} == 1);
    $r->print("<td bgcolor=$titleclr><b>Last modified</b></td>\n") if ($ENV{'form.attr2'} == 1);
    $r->print("</tr>");

    if ($ENV{'form.openuri'} =~ /$uri\&/) {
	my @pathcom = split(/\//,$uri);
	pop @pathcom;
	my $splituri = join ('/',@pathcom);
	$uri = join ('',$splituri,"/");
    }


    my $openuri = $ENV{'form.openuri'};
#    $r->print ("<hr>openuri=$openuri<br>");
    $openuri =~ s/$uri(.*)\&//g;
#    $r->print ("<hr>parsed openuri=$openuri<br>");
    @openpath = split(/\&/,$openuri);
#    $r->print ("<hr>open path=@openpath<br>");
    push @openpath, $uri;
#    $r->print ("<hr>append current uri to open path=@openpath<br>");
    @openpath = sort @openpath;
#    $r->print ("<hr>sorted open path=@openpath<br>");


    my $indent = -1;
    &display_line ($r,1,"/res/".$domain."&domain");
    &branch ($r,"/res/".$domain."/",$indent,@openpath);

    $r->print("</table>");
    $r->print("</td></tr></table>");
    $r->print("</body></html>\n");
#    &display_env($r);

    return OK;
}
 
#    my @packlist=&Apache::lonnet::dirlist($uri);
#    print "Dir list<br>".join('<br>',@packlist)."<br>";    

sub branch {
    my ($r,$uri,$indent,@openuri)=@_;
    my ($calluri,$line,@list);
    my ($domusr,$foo,$strip,$testdir,$compuri,$chkdir,$diropen);
    my $dirptr=16384;
    $indent++;

    foreach $calluri (@openuri) {
	@list=&get_list($r,$uri);
	foreach $line (@list) {
	    chomp $line;

	    ($strip,$domusr,$foo,$testdir,$foo)=split(/\&/,$line,5);
	    $compuri=join("",$strip,"/");
	    $chkdir=$testdir&$dirptr;
	    if ($domusr eq "domain" or $domusr eq "user") {
		$chkdir = $dirptr;
		$testdir = $dirptr;
	    }
	    $diropen = 0;
	    $diropen = 1 if ($compuri eq $calluri);
	    &display_line($r,$diropen,$line,$indent);

	    my @securi;
	    push @securi,$calluri;
	    &branch($r,$compuri,$indent,@securi) if ($calluri =~ $compuri and $calluri=~/^$uri/ and $chkdir == $dirptr and $testdir ne "");
	}
    }
    $indent--;
}

# ------ get complete list based on the uri ------
sub get_list {
    my ($r,$uri)=@_;
    my @list;
    my $luri=$uri;
    $luri=~s/\//_/g;
    unlink "/home/httpd/perl/tmp/$ENV{'user.name'}_dirlist*.tmp" if ($ENV{'form.dirlistattr'} eq "Refresh");
    my $dirlist = "/home/httpd/perl/tmp/$ENV{'user.name'}_dirlist$luri.tmp";
    if (-e $dirlist) {
	my $FH = Apache::File->new($dirlist);
	@list=<$FH>;
    } else {
	@list=&Apache::lonnet::dirlist($uri);
	my $FH = Apache::File->new(">$dirlist");
	print $FH join("\n",@list);
    }
    return @list=&match_ext($r,@list);
}

# ------ get previously opened path, if any ------
sub get_openpath {
    my $uri=shift;
    my @list;
    my $openlist = "/home/httpd/perl/tmp/$ENV{'user.name'}_dirlist_open_path.tmp";
    if (-e $openlist) {
	my $FH = Apache::File->new($openlist);
	@list=<$FH>;
	close ($FH);
	my $line;
	my $FH = Apache::File->new(">$openlist");
	print $FH "$uri\n" if $list[0] eq "";
	foreach $line (@list) {
	    chomp $line;
	    if ($line eq $uri) {
		my @pathcom = split(/\//,$uri);
		pop @pathcom;
		my $splituri = join ('/',@pathcom);
		$uri = join ('',$splituri,"/");
	    } else {
		print $FH "$line\n";
	    }
	}
    } else {
	my $FH = Apache::File->new(">$openlist");
	print $FH "$uri\n";
    }
    return $uri;
}

sub match_ext {
    my ($r,@packlist)=@_;
    my $line;
    my @trimlist;
    my $nextline;
    my @fileext;
    my $dirptr=16384;

    my $tabdir  = $r->dir_config('lonTabDir');
    my $fn = $tabdir."/filetypes.tab";
    if (-e $fn) {
	my $FH=Apache::File->new($fn);
	my @content=<$FH>;
	foreach $line (@content) {
	    (my $ext,my $foo) = split /\s+/,$line;
	    push @fileext,$ext;
	}
    }
    foreach $line (@packlist) {
	my ($foo,$strip) = split(/\/html/,$line);
	my @unpacklist = split (/\&/,$strip);

	my @pathfn = split (/\//,$unpacklist[0]);
	my $fndir = $pathfn[scalar(@pathfn)-1];
	my @filecom = split (/\./,$fndir);
	my $curfext = $filecom[scalar(@filecom)-1];
	my $fnptr = $unpacklist[3]&$dirptr;
 	if ($fnptr == 0 and $unpacklist[3] ne "") {
	    foreach $nextline (@fileext) {
		push @trimlist,$strip if $nextline eq $curfext;
	    }
	} else {
	    push @trimlist,$strip;
	}
    }
    return @trimlist;
}

sub display_line{
    my ($r,$diropen,$line,$indent)=@_;
    my (@pathfn, $fndir, $fnptr);
    my $dirptr=16384;
    my $fileclr="#ffffe6";
    my $iconpath="/res/adm/pages/indexericons/";

    my @filecom = split (/\&/,$line);
    my @pathcom = split (/\//,$filecom[0]);
    my $listname = $pathcom[scalar(@pathcom)-1];
    my $fnptr = $filecom[3]&$dirptr;

    my $tabtag="</td>";
    my $nextline;
    my $i=0;

    while ($i<=5) {
	my $key="form.attr".$i;
	$tabtag=join('',$tabtag,"<td bgcolor=",$fileclr,">&nbsp;</td>") if $ENV{$key} == 1;
	$i++;
    }

    if ($filecom[1] eq "domain") {
	$r->print("<tr>");
	$r->print("<td bgcolor=$fileclr valign=bottom>");
	&begin_form ($r,$filecom[0]);
	$r->print ("<input src=\"$iconpath");
	$r->print ("comp.blue.gif\"");
	$r->print (" name=\"submit\" height=\"22\" type=\"image\" border=\"0\">\n");
	$r->print("Domain - $listname $tabtag</tr></form>\n");
	return OK;
    }

    if ($filecom[1] eq "user") {
	$r->print("<tr>");
	$r->print("<td bgcolor=$fileclr valign=bottom>\n");
	&begin_form ($r,$filecom[0]);
	my $count = 0;
	while ($count <= $indent) {
	    $r->print("<img src=",$iconpath,"white_space_20_22.gif border=0>\n");
	    $count++;
	}
	$r->print ("<input src=\"$iconpath");
	$r->print ("folder_pointer_closed.gif\"") if $diropen == 0;
	$r->print ("folder_pointer_opened.gif\"") if $diropen == 1;
	$r->print (" name=\"submit\" height=\"22\" type=\"image\" border=\"0\">\n");
	$r->print("<img src=",$iconpath,"quill.gif border=0>\n");
	$r->print("$listname $tabtag</tr></form>\n");
	return OK;
    }

# display file
    if ($fnptr == 0 and $filecom[3] ne "") {
	my @file_ext = split (/\./,$listname);
	my $curfext = $file_ext[scalar(@file_ext)-1];
	my $count = 0;
	$r->print("<tr><td bgcolor=$fileclr>");
	while ($count <= $indent) {
	    $r->print("<img src=",$iconpath,"white_space_20_22.gif border=0>\n");
	    $count++;
	}
	$r->print("<img src=",$iconpath,"white_space_20_22.gif border=0>\n");
	$r->print("<img src=$iconpath$curfext.gif border=0>\n");
	$r->print(" <a href=$filecom[0]>",$listname,"</a> </td>\n");
	$r->print("<td bgcolor=$fileclr align=right valign=bottom> ",$filecom[8]," </td>\n") if $ENV{'form.attr0'} == 1;
	$r->print("<td bgcolor=$fileclr valign=bottom> ".(localtime($filecom[9]))." </td>\n") if $ENV{'form.attr1'} == 1;
	$r->print("<td bgcolor=$fileclr valign=bottom> ".(localtime($filecom[10]))." </td>\n") if $ENV{'form.attr2'} == 1;
	$r->print("</tr>\n");
    }

# display directory
    if ($fnptr == $dirptr) {
	my @file_ext = split (/\./,$listname);
	my $curfext = $file_ext[scalar(@file_ext)-1];
	$r->print("<tr><td bgcolor=$fileclr valign=bottom>");
	&begin_form ($r,$filecom[0]);

	my $count = 0;
	while ($count <= $indent) {
	    $r->print("<img src=",$iconpath,"white_space_20_22.gif border=0>\n");
	    $count++;
	}

	$r->print ("<input src=\"$iconpath");
	$r->print ("folder_pointer_closed.gif\"") if $diropen == 0;
	$r->print ("folder_pointer_opened.gif\"") if $diropen == 1;
	$r->print (" name=\"submit\" height=\"22\" type=\"image\" border=\"0\">\n");
	$r->print("<img src=",$iconpath,"folder_closed.gif border=0>\n") if $diropen == 0;
	$r->print("<img src=",$iconpath,"folder_opened.gif border=0>\n") if $diropen == 1;
	$r->print("$listname $tabtag</tr></form>\n");
    }
}

sub begin_form {
    my ($r,$uri) = @_;
    my $currenturi = $r->uri;
    my $openuri = $ENV{'form.openuri'};
    if ($ENV{'form.openuri'} =~ /$currenturi(.*)\&/) {
	$openuri =~ s/$currenturi(.*)\&//g;
    } else {
	$currenturi = join ('',$currenturi,"&");
	$openuri = join ('&',$ENV{'form.openuri'},$currenturi);
	$openuri =~ s/\&+/\&/g;
    }
    $r->print ("<form method=\"post\" name=\"dirpath\" action=\"$uri/\" enctype=\"application/x-www-form-urlencoded\">\n");
    $r->print ("<input type=hidden name=openuri value=\"$openuri\">\n");

    for (my $i=0; $i<=5; $i++) {
	$r->print ("<input type=hidden name=attr$i value=\"1\">\n") if $ENV{'form.attr'.$i} == 1;
    }
}

sub display_env {
    my $r=shift;
    my %otherenv;
    $otherenv{'hi'}='there';
    $otherenv{'does_this'}='work?';
    &Apache::lonnet::appenv(%otherenv);
    my $envkey;
    foreach $envkey (sort keys %ENV) {
	$r->print("$envkey: $ENV{$envkey}<br>\n");
    }
#    $r->print("<hr>".&Apache::lonnet::ssi('/res/msu/korte/test.tex')); 
#    $r->print("<hr>".join('<br>',&Apache::lonnet::dirlist('/res/msu/korte/')));
}

1;
__END__

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