--- loncom/interface/lonindexer.pm 2002/06/20 21:22:20 1.44 +++ loncom/interface/lonindexer.pm 2004/05/07 15:43:45 1.101 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Directory Indexer # -# $Id: lonindexer.pm,v 1.44 2002/06/20 21:22:20 ng Exp $ +# $Id: lonindexer.pm,v 1.101 2004/05/07 15:43:45 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -25,25 +25,6 @@ # # http://www.lon-capa.org/ # -# YEAR=1999 -# 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 -# YEAR=2000 -# 07/20-08/04 H.K. Ng -# YEAR=2001 -# 05/9-05/19/2001 H. K. Ng -# 05/21/2001 H. K. Ng -# 05/23/2001 H. K. Ng -# 5/31,6/1,6/2,6/15 Scott Harrison -# 6/26,7/8 H. K. Ng -# 8/6,8/7,8/10 Scott Harrison -# 8/14 H. K. Ng -# 8/28,10/15,11/28,11/29 Scott Harrison -# 11/30 Matthew Hall -# 12/11,12/13 Scott Harrison -# YEAR=2002 -# 1/17 Scott Harrison -# ### ############################################################################### @@ -65,12 +46,16 @@ package Apache::lonindexer; use strict; use Apache::lonnet(); use Apache::loncommon(); +use Apache::lonhtmlcommon(); +use Apache::lonsequence(); use Apache::Constants qw(:common); +use Apache::lonmeta; use Apache::File; +use Apache::lonlocal; use GDBM_File; # ---------------------------------------- variables used throughout the module -my %hash; # tied to a user-specific gdbm file +my %hash; # global user-specific gdbm file my %dirs; # keys are directories, values are the open/close status my %language; # has the reference information present in language.tab @@ -88,12 +73,13 @@ my @Omit = (); # ----------------------------- Handling routine called via Apache and mod_perl sub handler { my $r = shift; - $r->content_type('text/html'); + my $c = $r->connection(); + &Apache::loncommon::content_type($r,'text/html'); + &Apache::loncommon::no_cache($r); $r->send_http_header; return OK if $r->header_only; $fnum=0; $dnum=0; - untie %hash; # Deal with stupid global variables (is there a way around making # these global to this package? It is just so wrong....) @@ -119,7 +105,7 @@ sub handler { # Get the parameters from the query string &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['catalogmode','launch','acts','mode','form','element', - 'only','omit']); + 'only','omit','titleelement']); #------------------------------------------------------------------- my $closebutton=''; my $groupimportbutton=''; @@ -127,42 +113,47 @@ sub handler { $extrafield=''; my $diropendb = - "/home/httpd/perl/tmp/$domain\_$ENV{'user.name'}_indexer.db"; - - if (tie(%hash,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) { + "/home/httpd/perl/tmp/$ENV{'user.domain'}_$ENV{'user.name'}_indexer.db"; + %hash = (); + { + my %dbfile; + if (tie(%dbfile,'GDBM_File',$diropendb,&GDBM_READER(),0640)) { + while(my($key,$value)=each(%dbfile)) { + $hash{$key}=$value; + } + untie(%dbfile); + } + } + { if ($ENV{'form.launch'} eq '1') { &start_fresh_session(); } # -------------------- refresh environment with user database values (in %hash) - if ($hash{'mode_catalog'} eq 'interactive') { - $ENV{'form.catalogmode'}='interactive'; - } - if ($hash{'mode_catalog'} eq 'groupimport') { - $ENV{'form.catalogmode'}='groupimport'; - } + &setvalues(\%hash,'form.catalogmode',\%ENV,'form.catalogmode' ); # --------------------- define extra fields and buttons in case of special mode if ($ENV{'form.catalogmode'} eq 'interactive') { - $hash{'mode_catalog'}='interactive'; $extrafield=''. ''; $colspan=" colspan='2' "; + my $cl=&mt('Close'); $closebutton=< + END } elsif ($ENV{'form.catalogmode'} eq 'groupimport') { - $hash{'mode_catalog'}='groupimport'; $extrafield=''. ''; $colspan=" colspan='2' "; + my $cl=&mt('Close'); + my $gi=&mt('Group Import'); $closebutton=< + END $groupimportbutton=< END } @@ -174,12 +165,13 @@ END # selection is made. # $element is the name of the element in $formname which receives # the URL. - # &Apache::lonxml::debug('Checking mode, form, element'); - &setvalues(\%hash,'form_mode' ,\%ENV,'form.mode' ); - &setvalues(\%hash,'form_form' ,\%ENV,'form.form' ); - &setvalues(\%hash,'form_element',\%ENV,'form.element'); - &setvalues(\%hash,'form_only' ,\%ENV,'form.only' ); - &setvalues(\%hash,'form_omit' ,\%ENV,'form.omit' ); + #&Apache::lonxml::debug('Checking mode, form, element'); + &setvalues(\%hash,'form.mode' ,\%ENV,'form.mode' ); + &setvalues(\%hash,'form.form' ,\%ENV,'form.form' ); + &setvalues(\%hash,'form.element' ,\%ENV,'form.element'); + &setvalues(\%hash,'form.titleelement',\%ENV,'form.titleelement'); + &setvalues(\%hash,'form.only' ,\%ENV,'form.only' ); + &setvalues(\%hash,'form.omit' ,\%ENV,'form.omit' ); # Deal with 'omit' and 'only' if (exists $ENV{'form.omit'}) { @@ -190,12 +182,13 @@ END } my $mode = $ENV{'form.mode'}; - my ($form,$element); + my ($form,$element,$titleelement); if ($mode eq 'edit' || $mode eq 'parmset') { - $form = $ENV{'form.form'}; - $element = $ENV{'form.element'}; + $form = $ENV{'form.form'}; + $element = $ENV{'form.element'}; + $titleelement = $ENV{'form.titleelement'}; } - &Apache::lonxml::debug("mode=$mode form=$form element=$element"); + #&Apache::lonxml::debug("mode=$mode form=$form element=$element titleelement=$titleelement"); # ------ set catalogmodefunctions to have extra needed javascript functionality my $catalogmodefunctions=''; if ($ENV{'form.catalogmode'} eq 'interactive' or @@ -244,6 +237,7 @@ END // mode = $mode function select_data(title,url) { changeURL(url); + changeTitle(title); self.close(); } @@ -258,8 +252,20 @@ function changeURL(val) { alert("The file you selected is: "+val); } } - END + if (!$titleelement) { + $catalogmodefunctions.='function changeTitle(val) {}'; + } else { + $catalogmodefunctions.=< $catalogmodefunctions -function openWindow(url, wdwName, w, h, toolbar,scrollbar) { - var options = "width=" + w + ",height=" + h + ","; +function openWindow(url, wdwName, w, h, toolbar,scrollbar,locationbar) { + var xpos = (screen.width-w)/2; + xpos = (xpos < 0) ? '0' : xpos; + var ypos = (screen.height-h)/2-30; + ypos = (ypos < 0) ? '0' : ypos; + var options = "width=" + w + ",height=" + h + ",screenx="+xpos+",screeny="+ypos+","; options += "resizable=yes,scrollbars="+scrollbar+",status=no,"; - options += "menubar=no,toolbar="+toolbar+",location=no,directories=no"; + options += "menubar=no,toolbar="+toolbar+",location="+locationbar+",directories=no"; var newWin = window.open(url, wdwName, options); newWin.focus(); } @@ -332,9 +342,10 @@ function gothere(val) { - ENDHEADER - +my ($headerdom)=($uri=~/^\/res\/(\w+)\//); +$r->print(&Apache::loncommon::bodytag('Browse Resources',undef,undef,undef, + $headerdom)); # - Evaluate actions from previous page (both cumulatively and chronologically) if ($ENV{'form.catalogmode'} eq 'groupimport') { my $acts=$ENV{'form.acts'}; @@ -349,7 +360,7 @@ ENDHEADER $achash{$ref}=$ac; $ac++; } - # sorting through the actions and changing the tied database hash + # sorting through the actions and changing the global database hash foreach (sort {$achash{$a}<=>$achash{$b}} (keys %ahash)) { my $key=$_; if ($ahash{$key} eq '1') { @@ -377,70 +388,114 @@ ENDHEADER } } -# ---------------------------------------------------------------- output title - $r->print( -'

The LearningOnline Network with CAPA '. - 'Network Directory Browser

'."\n"); # ---------------------------------- get state of file attributes to be showing - if ($ENV{'form.attrs'} ne "") { - for (my $i=0; $i<=6; $i++) { + if ($ENV{'form.attrs'}) { + for (my $i=0; $i<=9; $i++) { delete $hash{'display_attrs_'.$i}; if ($ENV{'form.attr'.$i} == 1) { - $attrchk[$i] = "checked"; + $attrchk[$i] = 'checked'; $hash{'display_attrs_'.$i} = 1; } } } else { - for (my $i=0; $i<=6; $i++) { - $attrchk[$i] = "checked" if $hash{'display_attrs_'.$i} == 1; + for (my $i=0; $i<=9; $i++) { + $attrchk[$i] = 'checked' if $hash{'display_attrs_'.$i} == 1; } } + # ------------------------------- output state of file attributes to be showing +# All versions has to the last item +# since it does not take an extra col + my %lt=&Apache::lonlocal::texthash( + 'ti' => 'Title', + 'si' => 'Size', + 'la' => 'Last access', + 'lm' => 'Last modified', + 'st' => 'Statistics', + 'au' => 'Author', + 'kw' => 'Keywords', + 'ln' => 'Language', + 'sr' => 'Show resource', + 'av' => 'All versions', + 'ud' => 'Update Display' + ); + my $Displayfileattributes=&mt('Display file attributes'); $r->print(<Display file attributes
+$Displayfileattributes
- - - - + + + + + - - - + + + + +
Size Last access Last modified All versions $lt{'ti'} $lt{'si'} $lt{'la'} $lt{'lm'} $lt{'st'}
Author Keywords Language $lt{'au'} $lt{'kw'} $lt{'ln'} $lt{'sr'} $lt{'av'}  
- + + -  - -$closebutton -$groupimportbutton -
+$closebutton $groupimportbutton END - +# -------------- Filter out sequence containment in crumbs and "recent folders" + my $storeuri=$uri; + $storeuri='/'.(split(/\.(page|sequence)\/\//,$uri))[-1]; + $storeuri=~s/\/+/\//g; +# ---------------------------------------------------------------- Bread crumbs + $r->print(&Apache::lonhtmlcommon::crumbs($storeuri,'','', + (($ENV{'form.catalogmode'} eq 'groupimport')? + 'document.forms.fileattr':'')). + &Apache::lonhtmlcommon::select_recent('residx','resrecent', +'this.form.action=this.form.resrecent.options[this.form.resrecent.selectedIndex].value;this.form.submit();')); +# -------------------------------------------------------- Resource Home Button + my $reshome=$ENV{'course.'.$ENV{'request.course.id'}.'.reshome'}; + if ($reshome) { + $r->print("
print('javascript:document.forms.fileattr.action="'.$reshome.'";document.forms.fileattr.submit();'); + } else { + $r->print($reshome); + } + $r->print("'>".&mt('Home').''); + } + $r->print(''); +# ------------------------------------------------------ Remember where we were + &Apache::loncommon::storeresurl($storeuri); + &Apache::lonhtmlcommon::store_recent('residx',$storeuri,$storeuri); # ----------------- output starting row to the indexed file/directory hierarchy my $titleclr="#ddffff"; # $r->print(&initdebug()); # $r->print(&writedebug("Omit:@Omit")) if (@Omit); # $r->print(&writedebug("Only:@Only")) if (@Only); - $r->print("
\n"); - $r->print("\n"); - $r->print("\n"); - $r->print("\n") if ($hash{'display_attrs_0'} == 1); - $r->print("\n") - if ($hash{'display_attrs_1'} == 1); - $r->print("\n") + $r->print("
NameSize (bytes) ". - "Last accessedLast modified
\n"); + $r->print("\n"); + $r->print("\n"); + $r->print("\n") + if ($hash{'display_attrs_0'} == 1); + $r->print("\n") if ($hash{'display_attrs_1'} == 1); + $r->print("\n") if ($hash{'display_attrs_2'} == 1); - $r->print("\n") + $r->print("\n") if ($hash{'display_attrs_3'} == 1); - $r->print("\n") + $r->print("\n") if ($hash{'display_attrs_4'} == 1); - $r->print("\n") + $r->print("\n") if ($hash{'display_attrs_5'} == 1); - $r->print(""); + $r->print("\n") + if ($hash{'display_attrs_6'} == 1); + $r->print("\n") + if ($hash{'display_attrs_7'} == 1); + $r->print("\n") + if ($hash{'display_attrs_8'} == 1); + $r->print(''); # ----------------- read in what directories have previously been set to "open" foreach (keys %hash) { @@ -467,21 +522,19 @@ END } } - my $bredir = $ENV{'form.dirPointer'}; my $toplevel; my $indent = 0; $uri = $uri.'/' if $uri !~ /.*\/$/; - if ($bredir ne "on") { - $hash{'top.level'} = $uri; - $toplevel = $uri; - - } else { - $toplevel = $hash{'top.level'}; - } + if ($ENV{'form.dirPointer'} ne 'on') { + $hash{'top.level'} = $uri; + $toplevel = $uri; + } else { + $toplevel = $hash{'top.level'}; + } # -------------------------------- if not at top level, provide an uplink arrow - if ($toplevel ne "/res/"){ + if ($toplevel ne '/res/'){ my (@uri_com) = split(/\//,$uri); pop @uri_com; my $upone = join('/',@uri_com); @@ -498,61 +551,73 @@ END $r->print(""); # -------------------------------------------------------------- end the tables - $r->print("
".&mt('Name')."".&mt('Title')."".&mt("Size")." (".&mt("bytes").") ". + "".&mt("Last accessed")."Author(s)".&mt("Last modified")."Keywords".&mt("Author(s)")."Language".&mt("Keywords")."
".&mt("Language")."".&mt("Resource")."".&mt("Usage Statistics")."
(". + &mt("Courses/Network Hits").")
"); - $r->print("
"); + $r->print('
'); + $r->print(''); # --------------------------------------------------- end the output and return - $r->print("\n"); - untie(%hash); - } else { - $r->print('Unable to tie hash to db '. - 'file'); - return OK; + $r->print(''."\n"); } + if(! $c->aborted()) { +# write back into the temporary file + my %dbfile; + if (tie(%dbfile,'GDBM_File',$diropendb,&GDBM_NEWDB(),0640)) { + while (my($key,$value) = each(%hash)) { + $dbfile{$key}=$value; + } + untie(%dbfile); + } + } + return OK; } # ----------------------------------------------- recursive scan of a directory sub scanDir { my ($r,$startdir,$indent,$hashref)=@_; + my $c = $r->connection(); my ($compuri,$curdir); my $dirptr=16384; + my $obs; $indent++; - my %dupdirs = %dirs; my @list=&get_list($r,$startdir); foreach my $line (@list) { - my ($strip,$dom,$foo,$testdir,$foo)=split(/\&/,$line,5); - next if $strip =~ /.*\.meta$/; + return if ($c->aborted()); + #This is a kludge, sorry aboot this + my ($strip,$dom,undef,$testdir,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,$obs,undef)=split(/\&/,$line,16); + next if($strip =~ /.*\.meta$/ | $obs eq '1'); my (@fileparts) = split(/\./,$strip); - if ($hash{'display_attrs_6'} != 1) { + if ($hash{'display_attrs_9'} != 1) { +# if not all versions to be shown if (scalar(@fileparts) >= 3) { my $fext = pop @fileparts; my $ov = pop @fileparts; my $fname = join ('.',@fileparts,$fext); - next if (grep /$fname/,@list and $ov =~ /\d+/); + next if (grep /\Q$fname\E/,@list and $ov =~ /^\d+$/); } } - if ($dom eq "domain") { - $compuri = join('',$strip,"/"); # dom list has /res/ - $curdir = $compuri; + if ($dom eq 'domain') { + # dom list has full path /res// already + $curdir=''; + $compuri = (split(/\&/,$line))[0]; } else { # user, dir & file have name only, i.e., w/o path - $compuri = join('',$startdir,$strip,"/"); + $compuri = join('',$startdir,$strip,'/'); $curdir = $startdir; } - my $diropen = "closed"; - if (($dirptr&$testdir) or ($dom =~ /^(domain|user)$/)) { + my $diropen = 'closed'; + if (($dirptr&$testdir) or ($dom =~ /^(domain|user)$/) or ($compuri=~/\.(sequence|page)\/$/)) { while (my ($key,$val)= each %dupdirs) { if ($key eq $compuri and $val eq "open") { $diropen = "opened"; - delete $dupdirs{key},$dirs{$key}; + delete($dupdirs{$key}); + delete($dirs{$key}); } } } &display_line($r,$diropen,$line,$indent,$curdir,$hashref,@list); - &scanDir ($r,$compuri,$indent) if $diropen eq "opened"; + &scanDir ($r,$compuri,$indent) if $diropen eq 'opened'; } $indent--; } @@ -560,21 +625,30 @@ sub scanDir { # --------------- get complete matched list based on the uri (returns an array) sub get_list { my ($r,$uri)=@_; - my @list; - my $luri = $uri; - $luri =~ s/\//_/g; - - if ($ENV{'form.attrs'} eq "Refresh") { + my @list=(); + (my $luri = $uri) =~ s/\//_/g; + if ($ENV{'form.updatedisplay'}) { foreach (keys %hash) { delete $hash{$_} if ($_ =~ /^dirlist_files_/); - } + } } - if ($hash{'dirlist_files'.$luri}) { + if ($hash{'dirlist_files_'.$luri}) { @list = split(/\n/,$hash{'dirlist_files_'.$luri}); + } elsif ($uri=~/\.(page|sequence)\/$/) { +# is a page or a sequence + $uri=~s/\/$//; + $uri='/'.(split(/\.(page|sequence)\/\//,$uri))[-1]; + $uri=~s/\/+/\//g; + foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$uri))) { + my @ratpart=split(/\:/,$_); + push @list,$ratpart[1]; + } + $hash{'dirlist_files_'.$luri} = join("\n",@list); } else { +# is really a directory @list = &Apache::lonnet::dirlist($uri); - $hash{'dirlist_files_'.$luri} = join('\n',@list); + $hash{'dirlist_files_'.$luri} = join("\n",@list); } return @list=&match_ext($r,@list); } @@ -614,11 +688,11 @@ sub match_ext { chomp $line; $line =~ s/^\/home\/httpd\/html//; my @unpackline = split (/\&/,$line); - next if ($unpackline[0] eq "."); - next if ($unpackline[0] eq ".."); + next if ($unpackline[0] eq '.'); + next if ($unpackline[0] eq '..'); my @filecom = split (/\./,$unpackline[0]); my $fext = pop(@filecom); - my $fnptr = $unpackline[3]&$dirptr; + my $fnptr = ($unpackline[3]&$dirptr) || ($fext=~/\.(page|sequence)$/); if ($fnptr == 0 and $unpackline[3] ne "") { my $embstyle = &Apache::loncommon::fileembstyle($fext); push @trimlist,$line if (defined($embstyle) && @@ -627,39 +701,56 @@ sub match_ext { push @trimlist,$line; } } - @trimlist = sort (@trimlist); + @trimlist = sort {uc($a) cmp uc($b)} (@trimlist); return @trimlist; } # ------------------------------- displays one line in appropriate table format sub display_line { my ($r,$diropen,$line,$indent,$startdir,$hashref,@list)=@_; - my (@pathfn, $fndir, $fnptr); + my (@pathfn, $fndir); +# there could be relative paths (files actually belonging into this directory) +# or absolute paths (for example, from sequences) + my $absolute; + my $pathprefix; + if ($line=~/^\/res\//) { + $absolute=1; + $pathprefix=''; + } else { + $absolute=0; + $pathprefix=$startdir; + } my $dirptr=16384; my $fileclr="#ffffe6"; - my $iconpath= $r->dir_config('lonIconsURL') . "/"; + my $iconpath= $r->dir_config('lonIconsURL') . '/'; my @filecom = split (/\&/,$line); my @pathcom = split (/\//,$filecom[0]); my $listname = $pathcom[scalar(@pathcom)-1]; my $fnptr = $filecom[3]&$dirptr; - my $msg = 'View '.$filecom[0].' resources'; - $msg = 'Close '.$filecom[0].' directory' if $diropen eq "opened"; + my $msg = &mt('View').' '.$filecom[0].' '.&mt('resources'); + $msg = &mt('Close').' '.$filecom[0].' '.&mt('directory') if $diropen eq 'opened'; - my $tabtag=""; + my $tabtag=''; my $i=0; - - while ($i<=5) { - $tabtag=join('',$tabtag," ") + while ($i<=8) { + $tabtag=join('',$tabtag," ") if $hash{'display_attrs_'.$i} == 1; $i++; } + + my $valign = ($hash{'display_attrs_7'} == 1 ? 'top' : 'bottom'); # display uplink arrow - if ($filecom[1] eq "viewOneUp") { - $r->print("$extrafield"); - $r->print("\n"); - $r->print ('
print("$extrafield"); + $r->print("\n"); + $r->print ('print ('print (' name="'.$msg.'" height="22" type="image" border="0">'. "\n"); - $r->print("Up $tabtag
\n"); + $r->print(&mt("Up")." $tabtag\n"); return OK; } +# Do we have permission to look at this? + + if($filecom[15] ne '1') { return OK if (!&Apache::lonnet::allowed('bre',$pathprefix.$filecom[0])); } + +# make absolute links appear on different background + if ($absolute) { $fileclr='#aaaa88'; } # display domain - if ($filecom[1] eq "domain") { - $r->print (''."\n") - if ($ENV{'form.dirPointer'} eq "on"); - $r->print("$extrafield"); - $r->print(""); - &begin_form ($r,$filecom[0].'/'); - my $anchor = $filecom[0].'/'; + if ($filecom[1] eq 'domain') { + $r->print (''."\n") + if ($ENV{'form.dirPointer'} eq "on"); + $r->print("$extrafield"); + $r->print(""); + &begin_form ($r,$filecom[0]); + my $anchor = $filecom[0]; $anchor =~ s/\///g; $r->print (''); $r->print (''); @@ -691,16 +788,21 @@ sub display_line { $r->print (' name="'.$msg.'" height="22" type="image" border="0">'. "\n"); $r->print ('print (' border="0" />'."\n"); - $r->print("Domain - $listname $tabtag\n"); + $r->print (&mt("Domain")." - $listname "); + if ($Apache::lonnet::domaindescription{$listname}) { + $r->print("(".$Apache::lonnet::domaindescription{$listname}. + ")"); + } + $r->print (" $tabtag\n"); return OK; # display user directory } - if ($filecom[1] eq "user") { - $r->print("$extrafield"); - $r->print("\n"); + if ($filecom[1] eq 'user') { + $r->print("$extrafield"); + $r->print("\n"); my $curdir = $startdir.$filecom[0].'/'; my $anchor = $curdir; $anchor =~ s/\///g; @@ -715,12 +817,17 @@ sub display_line { $r->print (''); - $r->print ($listname.$tabtag.''."\n"); + my $domain=(split(m|/|,$startdir))[2]; + my $plainname=&Apache::loncommon::plainname($listname,$domain); + $r->print ($listname); + if (defined($plainname) && $plainname) { $r->print(" ($plainname) "); } + $r->print ($tabtag.''."\n"); return OK; } # display file - if ($fnptr == 0 and $filecom[3] ne "") { + if (($fnptr == 0 and $filecom[3] ne '') or $absolute) { + my $filelink = $pathprefix.$filecom[0]; my @file_ext = split (/\./,$listname); my $curfext = $file_ext[-1]; if (@Omit) { @@ -732,35 +839,28 @@ sub display_line { return OK if ($skip > 0); } # Set the icon for the file - my $iconname = "unknown.gif"; - my $embstyle = &Apache::loncommon::fileembstyle($curfext); - # The unless conditional that follows is a bit of overkill - $iconname = $curfext.".gif" unless - (!defined($embstyle) || $embstyle eq 'unk' || $embstyle eq 'hdn'); - # - my $filelink = $startdir.$filecom[0]; - $r->print(""); - my $metafile = grep /^$filecom[0]\.meta\&/, @list; + my $iconname = &Apache::loncommon::icon($listname); + $r->print(""); + my $metafile = grep /^\Q$filecom[0]\E\.meta\&/, @list; my $title; if ($ENV{'form.catalogmode'} eq 'interactive') { $title=$listname; $title = &Apache::lonnet::metadata($filelink,'title') if ($metafile == 1); $title=$listname unless $title; - my $titleesc=HTML::Entities::encode($title); + my $titleesc=HTML::Entities::encode($title,'<>&"'); $titleesc=~s/\'/\\'/; #' (clean up this spare quote) $r->print(""); $r->print("". "\n"); - $r->print(""); - } - elsif ($ENV{'form.catalogmode'} eq 'groupimport') { + $r->print(""); + } elsif ($ENV{'form.catalogmode'} eq 'groupimport') { $title=$listname; $title = &Apache::lonnet::metadata($filelink,'title') if ($metafile == 1); $title=$listname unless $title; - my $titleesc=&HTML::Entities::encode($title); + my $titleesc=&HTML::Entities::encode($title,'<>&"'); $r->print("
\n"); $r->print("\n"); $r->print("
\n"); - $r->print(""); + $r->print(""); $hash{"pre_${fnum}_link"}=$filelink; $hash{"pre_${fnum}_title"}=$titleesc; $fnum++; } - +# Form to open or close sequences + if ($filelink=~/\.(page|sequence)$/) { + my $curdir = $startdir.$filecom[0].'/'; + my $anchor = $curdir; + $anchor =~ s/\///g; + &begin_form($r,$curdir); + $indent--; + } +# General indentation if ($indent > 0 and $indent < 11) { $r->print("\n"); @@ -793,60 +901,114 @@ sub display_line { $r->print("\n") if $rem > 0; } - - $r->print("\n"); +# Sequence open/close icon + if ($filelink=~/\.(page|sequence)$/) { + my $curdir = $startdir.$filecom[0].'/'; + my $anchor = $curdir; + $anchor =~ s/\///g; + $r->print (''); + $r->print ('print (' name="'.$msg.'" height="22" type="image" border="0">'. + "\n"); + } +# Filetype icons + $r->print("\n"); +# Close form to open/close sequence + if ($filelink=~/\.(page|sequence)$/) { + $r->print(''); + } $r->print (" $listname "); $r->print (" (metadata) ") if ($metafile == 1); $r->print("\n"); - $r->print(" ", + if ($hash{'display_attrs_0'} == 1) { + my $title = &Apache::lonnet::gettitle($filelink,'title') + if ($metafile == 1); + $r->print(' '.($title eq '' ? ' ' : $title). + ' '."\n"); + } + $r->print(' ', $filecom[8]," \n") - if $hash{'display_attrs_0'} == 1; - $r->print(" ". - (localtime($filecom[9]))." \n") if $hash{'display_attrs_1'} == 1; - $r->print(" ". - (localtime($filecom[10]))." \n") + $r->print(' '. + (localtime($filecom[9]))." \n") if $hash{'display_attrs_2'} == 1; + $r->print(' '. + (localtime($filecom[10]))." \n") + if $hash{'display_attrs_3'} == 1; - if ($hash{'display_attrs_3'} == 1) { + if ($hash{'display_attrs_4'} == 1) { my $author = &Apache::lonnet::metadata($filelink,'author') if ($metafile == 1); - $author = ' ' if (!$author); - $r->print(" ".$author. + $r->print(' '.($author eq '' ? ' ' : $author). " \n"); } - if ($hash{'display_attrs_4'} == 1) { + if ($hash{'display_attrs_5'} == 1) { my $keywords = &Apache::lonnet::metadata($filelink,'keywords') if ($metafile == 1); - $keywords = ' ' if (!$keywords); - $r->print(" ".$keywords. + # $keywords = ' ' if (!$keywords); + $r->print(' '.($keywords eq '' ? ' ' : $keywords). " \n"); } - if ($hash{'display_attrs_5'} == 1) { + if ($hash{'display_attrs_6'} == 1) { my $lang = &Apache::lonnet::metadata($filelink,'language') if ($metafile == 1); $lang = &Apache::loncommon::languagedescription($lang); - $lang = ' ' if (!$lang); - $r->print(" ".$lang. + $r->print(' '.($lang eq '' ? ' ' : $lang). " \n"); } + if ($hash{'display_attrs_7'} == 1) { + my $output=''; + my $embstyle=&Apache::loncommon::fileembstyle($curfext); + if ($embstyle eq 'ssi') { + my $cache=$Apache::lonnet::perlvar{'lonDocRoot'}.$filelink. + '.tmp'; + if ((!$ENV{'form.updatedisplay'}) && + (-e $cache)) { + open(FH,$cache); + $output=join("\n",); + close(FH); + } else { + $output=&Apache::lonnet::ssi_body($filelink); + open(FH,">$cache"); + print FH $output; + close(FH); + } + $output=''.$output.''; + } elsif ($embstyle eq 'img') { + $output=''; + } elsif ($filelink=~/^\/res\/(\w+)\/(\w+)\//) { + $output=''; + } + $r->print(' '.($output eq '' ? ' ':$output). + " \n"); + } + if ($hash{'display_attrs_8'} == 1) { + my (%stat) = &Apache::lonmeta::dynamicmeta($filelink) if ($metafile == 1); + my $stat = (exists($stat{'course'}) ? $stat{'course'} : ''). + ((exists($stat{'course'}) || exists($stat{'count'})) ? '/' : ''). + (exists($stat{'count'}) ? $stat{'count'} : ''); + $r->print(' '.($stat eq '' ? ' ' : $stat). + ' '."\n"); + } + $r->print("\n"); } # -- display directory if ($fnptr == $dirptr) { - my @file_ext = split (/\./,$listname); - my $curfext = $file_ext[scalar(@file_ext)-1]; my $curdir = $startdir.$filecom[0].'/'; my $anchor = $curdir; $anchor =~ s/\///g; - $r->print("$extrafield"); + $r->print("$extrafield"); &begin_form ($r,$curdir); my $indentm1 = $indent-1; if ($indentm1 < 11 and $indentm1 > 0) { @@ -872,7 +1034,49 @@ sub display_line { $r->print (''. "\n"); - $r->print ("$listname$tabtag\n"); + $r->print ("$listname\n"); +# Attributes + my $filelink = $startdir.$filecom[0].'/default'; + + if ($hash{'display_attrs_0'} == 1) { + my $title = &Apache::lonnet::gettitle($filelink,'title'); + $r->print(' '.($title eq '' ? ' ' : $title). + ' '."\n"); + } + $r->print(' ', + $filecom[8]," \n") + if $hash{'display_attrs_1'} == 1; + $r->print(' '. + (localtime($filecom[9]))." \n") + if $hash{'display_attrs_2'} == 1; + $r->print(' '. + (localtime($filecom[10]))." \n") + if $hash{'display_attrs_3'} == 1; + + if ($hash{'display_attrs_4'} == 1) { + my $author = &Apache::lonnet::metadata($filelink,'author'); + $r->print(' '.($author eq '' ? ' ' : $author). + " \n"); + } + if ($hash{'display_attrs_5'} == 1) { + my $keywords = &Apache::lonnet::metadata($filelink,'keywords'); + # $keywords = ' ' if (!$keywords); + $r->print(' '.($keywords eq '' ? ' ' : $keywords). + " \n"); + } + if ($hash{'display_attrs_6'} == 1) { + my $lang = &Apache::lonnet::metadata($filelink,'language'); + $lang = &Apache::loncommon::languagedescription($lang); + $r->print(' '.($lang eq '' ? ' ' : $lang). + " \n"); + } + if ($hash{'display_attrs_7'} == 1) { + $r->print(' '); + } + if ($hash{'display_attrs_8'} == 1) { + $r->print(' '); + } + $r->print(''); } } @@ -895,19 +1099,14 @@ sub begin_form { # --------- settings whenever the user causes the indexer window to be launched sub start_fresh_session { - delete $hash{'mode_catalog'}; - delete $hash{'form_mode'}; - delete $hash{'form_form'}; - delete $hash{'form_element'}; - delete $hash{'form_omit'}; - delete $hash{'form_only'}; + delete $hash{'form.catalogmode'}; + delete $hash{'form.mode'}; + delete $hash{'form.form'}; + delete $hash{'form.element'}; + delete $hash{'form.omit'}; + delete $hash{'form.only'}; foreach (keys %hash) { - if ($_ =~ /^pre_/) { - delete $hash{$_}; - } - if ($_ =~ /^store/) { - delete $hash{$_}; - } + delete $hash{$_} if (/^(pre_|store)/); } } @@ -926,6 +1125,12 @@ sub setvalues { 1; +sub cleanup { + if (tied(%hash)){ + &Apache::lonnet::logthis('Cleanup indexer: hash'); + } +} + =head1 NAME Apache::lonindexer - mod_perl module for cross server filesystem browsing 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.