Diff for /loncom/interface/lonindexer.pm between versions 1.26 and 1.42

version 1.26, 2001/12/04 18:35:47 version 1.42, 2002/05/31 21:50:30
Line 40 Line 40
 # 8/14 H. K. Ng  # 8/14 H. K. Ng
 # 8/28,10/15,11/28,11/29 Scott Harrison  # 8/28,10/15,11/28,11/29 Scott Harrison
 # 11/30 Matthew Hall  # 11/30 Matthew Hall
   # 12/11,12/13 Scott Harrison
   # YEAR=2002
   # 1/17 Scott Harrison
 #  #
 ###  ###
   
Line 61  package Apache::lonindexer; Line 64  package Apache::lonindexer;
 # ------------------------------------------------- modules used by this module  # ------------------------------------------------- modules used by this module
 use strict;  use strict;
 use Apache::lonnet();  use Apache::lonnet();
   use Apache::loncommon();
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use Apache::File;  use Apache::File;
 use GDBM_File;  use GDBM_File;
Line 76  my $extrafield; # default extra table ce Line 80  my $extrafield; # default extra table ce
 my $fnum; # file counter  my $fnum; # file counter
 my $dnum; # directory counter  my $dnum; # directory counter
   
 # ---------------------------------------------------------------------- BEGIN  # ----- Used to include or exclude files with certain extensions.
 sub BEGIN {  my @Only = (); 
     my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.  my @Omit = ();
      '/language.tab');  
     map {  
  $_=~/(\w+)\s+([\w\s\-]+)/;  
  $language{$1}=$2;  
     } <$fh>;  
 }  
   
 # ----------------------------- Handling routine called via Apache and mod_perl  # ----------------------------- Handling routine called via Apache and mod_perl
 sub handler {  sub handler {
Line 112  sub handler { Line 111  sub handler {
     my $uri=$r->uri;      my $uri=$r->uri;
   
 # -------------------------------------- see if called from an interactive mode  # -------------------------------------- see if called from an interactive mode
     &get_unprocessed_cgi();      # Get the parameters from the query string
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
        ['catalogmode','launch','acts','mode','form','element',
                 'only','omit']);
       #-------------------------------------------------------------------
     my $closebutton='';      my $closebutton='';
     my $groupimportbutton='';      my $groupimportbutton='';
     my $colspan='';       my $colspan=''; 
Line 160  END Line 162  END
 onClick="javascript:select_group()">  onClick="javascript:select_group()">
 END  END
         }          }
    # Additions made by Matthew to make the browser a little easier to deal
    # with in the future.
    #
    # $mode (at this time) indicates if we are in edit mode.
    # $form is the name of the form that the URL is placed when the
    #       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'   );
   
           # Deal with 'omit' and 'only' 
           if (exists $ENV{'form.omit'}) {
               @Omit = split(',',$ENV{'form.omit'});
           }
           if (exists $ENV{'form.only'}) {
               @Only = split(',',$ENV{'form.only'});
           }
           
    my $mode = $ENV{'form.mode'};
    my ($form,$element);
    if ($mode eq 'edit' || $mode eq 'parmset') {
       $form    = $ENV{'form.form'};
       $element = $ENV{'form.element'};
    }
    &Apache::lonxml::debug("mode=$mode form=$form element=$element");
 # ------ set catalogmodefunctions to have extra needed javascript functionality  # ------ set catalogmodefunctions to have extra needed javascript functionality
  my $catalogmodefunctions='';   my $catalogmodefunctions='';
  if ($ENV{'form.catalogmode'} eq 'interactive' or   if ($ENV{'form.catalogmode'} eq 'interactive' or
     $ENV{'form.catalogmode'} eq 'groupimport') {      $ENV{'form.catalogmode'} eq 'groupimport') {
     $catalogmodefunctions=<<END;      # The if statement below sets us up to use the old version
       # by default (ie. if $mode is undefined).  This is the easy
       # way out.  Hopefully in the future I'll find a way to get 
       # the calls dealt with in a more comprehensive manner.
   
   #
   # There is now also mode "simple", which is for the simple version of the rat
   #
   #
       if (!defined($mode) || ($mode ne 'edit' && $mode ne 'parmset')) {
                   my $location = "/adm/groupsort?catalogmode=groupimport&";
                   $location .= "mode=".$mode."&";
                   $location .= "acts=";
    $catalogmodefunctions=<<"END";
 function select_data(title,url) {  function select_data(title,url) {
     changeTitle(title);      changeTitle(title);
     changeURL(url);      changeURL(url);
     self.close();      self.close();
 }  }
 function select_group() {  function select_group() {
     window.location="/adm/groupsort?catalogmode=groupimport&acts="+document.forms.fileattr.acts.value;      window.location="$location"+document.forms.fileattr.acts.value;
 }  }
 function changeTitle(val) {  function changeTitle(val) {
     if (opener.inf.document.forms.resinfo.elements.t) {      if (opener.inf) {
         opener.inf.document.forms.resinfo.elements.t.value=val;          if (opener.inf.document.forms.resinfo.elements.t) {
               opener.inf.document.forms.resinfo.elements.t.value=val;
           }
     }      }
 }  }
 function changeURL(val) {  function changeURL(val) {
     if (opener.inf.document.forms.resinfo.elements.u) {      if (opener.inf) {
  opener.inf.document.forms.resinfo.elements.u.value=val;          if (opener.inf.document.forms.resinfo.elements.u) {
       opener.inf.document.forms.resinfo.elements.u.value=val;
           }
     }      }
 }  }
 END  END
               } elsif ($mode eq 'edit') { # we are in 'edit' mode
                   my $location = "/adm/groupsort?catalogmode=interactive&";
                   $location .= "form=$form&element=$element&mode=edit&acts=";
    $catalogmodefunctions=<<END;
   // mode = $mode
   function select_data(title,url) {
       changeURL(url);
       self.close();
   }
   
   function select_group() {
       window.location="$location"+document.forms.fileattr.acts.value;
   }
   
   function changeURL(val) {
       if (window.opener.document) {
    window.opener.document.forms["$form"].elements["$element"].value=val;
       } else {
       alert("The file you selected is: "+val);
       }
   }
   
   END
               } elsif ($mode eq 'parmset') {
                   my $location = "/adm/groupsort?catalogmode=interactive&";
                   $location .= "form=$form&element=$element&mode=parmset&acts=";
    $catalogmodefunctions=<<END;
   // mode = $mode
   function select_data(title,url) {
       changeURL(url);
       self.close();
   }
   
   function select_group() {
       window.location="$location"+document.forms.fileattr.acts.value;
   }
   
   function changeURL(val) {
       if (window.opener.document) {
           var elementname  = "$element"+"_value";
           var checkboxname = "$element"+"_setparmval";
    window.opener.document.forms["$form"].elements[elementname].value=val;
           window.opener.document.forms["$form"].elements[checkboxname].checked=true;
       } else {
       alert("The file you selected is: "+val);
       }
   }
   
   END
               }
         }          }
  if ($ENV{'form.catalogmode'} eq 'groupimport') {          $catalogmodefunctions.=<<END;
     $catalogmodefunctions.=<<END;  
 var acts='';  var acts='';
   function rep_dirpath(suffix,val) {
       eval("document.forms.dirpath"+suffix+".acts.value=val");
   }
   END
    if ($ENV{'form.catalogmode'} eq 'groupimport') {
               $catalogmodefunctions.=<<END;
 function queue(val) {  function queue(val) {
     if (eval("document.forms."+val+".filelink.checked")) {      if (eval("document.forms."+val+".filelink.checked")) {
  var l=val.length;   var l=val.length;
Line 201  function queue(val) { Line 304  function queue(val) {
  document.forms.fileattr.acts.value+='0a'+v+'b';   document.forms.fileattr.acts.value+='0a'+v+'b';
     }      }
 }  }
 function rep_dirpath(suffix,val) {  
     eval("document.forms.dirpath"+suffix+".acts.value=val");  
 }  
 END  END
  }   }
   
Line 239  ENDHEADER Line 339  ENDHEADER
     my %achash;      my %achash;
     my $ac=0;      my $ac=0;
     # some initial hashes for working with data      # some initial hashes for working with data
     map {      foreach (@Acts) {
  my ($state,$ref)=split(/a/);   my ($state,$ref)=split(/a/);
  $ahash{$ref}=$state;   $ahash{$ref}=$state;
  $achash{$ref}=$ac;   $achash{$ref}=$ac;
  $ac++;   $ac++;
     } (@Acts);      }
     # sorting through the actions and changing the tied database hash      # sorting through the actions and changing the tied database hash
     map {      foreach (sort {$achash{$a}<=>$achash{$b}} (keys %ahash)) {
  my $key=$_;   my $key=$_;
  if ($ahash{$key} eq '1') {   if ($ahash{$key} eq '1') {
     $hash{'store_'.$hash{'pre_'.$key.'_link'}}=      $hash{'store_'.$hash{'pre_'.$key.'_link'}}=
Line 260  ENDHEADER Line 360  ENDHEADER
  delete $hash{'store_'.$hash{'pre_'.$key.'_link'}};   delete $hash{'store_'.$hash{'pre_'.$key.'_link'}};
     }      }
  }   }
     } sort {$achash{$a}<=>$achash{$b}} (keys %ahash);      }
     # deleting the previously cached listing      # deleting the previously cached listing
     map {      foreach (keys %hash) {
  if ($_ =~ /^pre_/ && $_ =~/link$/) {   if ($_ =~ /^pre_/ && $_ =~/link$/) {
     my $key = $_;      my $key = $_;
     $key =~ s/^pre_//;      $key =~ s/^pre_//;
Line 270  ENDHEADER Line 370  ENDHEADER
     delete $hash{'pre_'.$key.'_title'};      delete $hash{'pre_'.$key.'_title'};
     delete $hash{'pre_'.$key.'_link'};      delete $hash{'pre_'.$key.'_link'};
  }   }
     } keys %hash;      }
  }   }
   
 # ---------------------------------------------------------------- output title  # ---------------------------------------------------------------- output title
  $r->print('<h2><font color="#888888">The LearningOnline With CAPA '.   $r->print(
   '<h2><font color="#888888">The Learning<i>Online</i> Network with CAPA '.
   'Network Directory Browser</font></h2>'."\n");    'Network Directory Browser</font></h2>'."\n");
 # ---------------------------------- get state of file attributes to be showing  # ---------------------------------- get state of file attributes to be showing
  if ($ENV{'form.attrs'} ne "") {   if ($ENV{'form.attrs'} ne "") {
Line 317  END Line 418  END
   
 # ----------------- output starting row to the indexed file/directory hierarchy  # ----------------- output starting row to the indexed file/directory hierarchy
         my $titleclr="#ddffff";          my $titleclr="#ddffff";
         $r->print("<table border=0><tr><td bgcolor=#eeeeee>\n");  #        $r->print(&initdebug());
  $r->print("<table border=0><tr>\n");  #        $r->print(&writedebug("Omit:@Omit")) if (@Omit);
   #        $r->print(&writedebug("Only:@Only")) if (@Only);
           $r->print("<table width='100\%' border=0><tr><td bgcolor=#eeeeee>\n");
    $r->print("<table width='100\%' border=0><tr>\n");
  $r->print("<td $colspan bgcolor=$titleclr><b>Name</b></td>\n");   $r->print("<td $colspan bgcolor=$titleclr><b>Name</b></td>\n");
  $r->print("<td bgcolor=$titleclr align=right><b>Size (bytes) ".   $r->print("<td bgcolor=$titleclr align=right><b>Size (bytes) ".
   "</b></td>\n") if ($hash{'display_attrs_0'} == 1);    "</b></td>\n") if ($hash{'display_attrs_0'} == 1);
Line 335  END Line 439  END
  $r->print("</tr>");   $r->print("</tr>");
   
 # ----------------- read in what directories have previously been set to "open"  # ----------------- read in what directories have previously been set to "open"
  map {   foreach (keys %hash) {
     if ($_ =~ /^diropen_status_/) {      if ($_ =~ /^diropen_status_/) {
  my $key = $_;   my $key = $_;
  $key =~ s/^diropen_status_//;   $key =~ s/^diropen_status_//;
  $dirs{$key} = $hash{$_};   $dirs{$key} = $hash{$_};
     }      }
  } keys %hash;   }
   
  if ($ENV{'form.openuri'}) {  # take care of review and refresh options   if ($ENV{'form.openuri'}) {  # take care of review and refresh options
     my $uri=$ENV{'form.openuri'};      my $uri=$ENV{'form.openuri'};
Line 457  sub get_list { Line 561  sub get_list {
     $luri =~ s/\//_/g;      $luri =~ s/\//_/g;
   
     if ($ENV{'form.attrs'} eq "Refresh") {      if ($ENV{'form.attrs'} eq "Refresh") {
  map {   foreach (keys %hash) {
     delete $hash{$_} if ($_ =~ /^dirlist_files_/);      delete $hash{$_} if ($_ =~ /^dirlist_files_/);
     } keys %hash;      }
     }      }
   
     if ($hash{'dirlist_files'.$luri}) {      if ($hash{'dirlist_files'.$luri}) {
Line 471  sub get_list { Line 575  sub get_list {
     return @list=&match_ext($r,@list);      return @list=&match_ext($r,@list);
 }  }
   
   sub initdebug {
       return <<ENDJS;
   <script>
   var debugging = true;
   if (debugging) {
       var debuggingWindow = window.open('','Debug','width=400,height=300',true);
   } 
   
   function output(text) {
       if (debugging) {
           debuggingWindow.document.writeln(text);
       }
   }
   output("<html><head><title>Debugging Window</title></head><body><pre>");   
   </script>
   ENDJS
   }
   
   sub writedebug {
       my $text = shift;
       return "<script>output('$text');</script>";
   }
   
 # -------------------- filters out files based on extensions (returns an array)  # -------------------- filters out files based on extensions (returns an array)
 sub match_ext {  sub match_ext {
     my ($r,@packlist)=@_;      my ($r,@packlist)=@_;
Line 489  sub match_ext { Line 616  sub match_ext {
  my $fext = pop(@filecom);   my $fext = pop(@filecom);
  my $fnptr = $unpackline[3]&$dirptr;   my $fnptr = $unpackline[3]&$dirptr;
   if ($fnptr == 0 and $unpackline[3] ne "") {    if ($fnptr == 0 and $unpackline[3] ne "") {
     my $embstyle = &Apache::lonnet::fileembstyle($fext);      my $embstyle = &Apache::loncommon::fileembstyle($fext);
             push @trimlist,$line if (defined($embstyle) &&               push @trimlist,$line if (defined($embstyle) && 
      $embstyle ne 'hdn' );       ($embstyle ne 'hdn' or $fext eq 'meta'));
  } else {   } else {
     push @trimlist,$line;      push @trimlist,$line;
  }   }
Line 592  sub display_line { Line 719  sub display_line {
     if ($fnptr == 0 and $filecom[3] ne "") {      if ($fnptr == 0 and $filecom[3] ne "") {
  my @file_ext = split (/\./,$listname);   my @file_ext = split (/\./,$listname);
  my $curfext = $file_ext[-1];   my $curfext = $file_ext[-1];
           if (@Omit) {
               foreach (@Omit) { return OK if ($curfext eq $_); }
           }
           if (@Only) {
               my $skip = 1;
               foreach (@Only) { $skip = 0 if ($curfext eq $_); }
               return OK if ($skip > 0);
           }
  # Set the icon for the file   # Set the icon for the file
  my $iconname = "unknown.gif";   my $iconname = "unknown.gif";
  my $embstyle = &Apache::lonnet::fileembstyle($curfext);   my $embstyle = &Apache::loncommon::fileembstyle($curfext);
  # The unless conditional that follows is a bit of overkill   # The unless conditional that follows is a bit of overkill
  $iconname = $curfext.".gif" unless   $iconname = $curfext.".gif" unless
     (!defined($embstyle) || $embstyle eq 'unk' || $embstyle eq 'hdn');      (!defined($embstyle) || $embstyle eq 'unk' || $embstyle eq 'hdn');
Line 608  sub display_line { Line 743  sub display_line {
     $title = &Apache::lonnet::metadata($filelink,'title')      $title = &Apache::lonnet::metadata($filelink,'title')
  if ($metafile == 1);   if ($metafile == 1);
     $title=$listname unless $title;      $title=$listname unless $title;
     $r->print("<a href='javascript:select_data(\"",      my $titleesc=HTML::Entities::encode($title);
               $title,'","',$filelink,"\")'>");      $titleesc=~s/\'/\\'/; #' (clean up this spare quote)
               $r->print("<a href=\"javascript:select_data(\'",
                         $titleesc,"','",$filelink,"')\">");
     $r->print("<img src='",$iconpath,"select.gif' border='0' /></a>".      $r->print("<img src='",$iconpath,"select.gif' border='0' /></a>".
       "\n");        "\n");
     $r->print("</td><td valign='bottom' nowrap bgcolor=$fileclr>");      $r->print("</td><td valign='bottom' nowrap bgcolor=$fileclr>");
Line 619  sub display_line { Line 756  sub display_line {
     $title = &Apache::lonnet::metadata($filelink,'title')      $title = &Apache::lonnet::metadata($filelink,'title')
  if ($metafile == 1);   if ($metafile == 1);
     $title=$listname unless $title;      $title=$listname unless $title;
       my $titleesc=&HTML::Entities::encode($title);
     $r->print("<form name='form$fnum'>\n");      $r->print("<form name='form$fnum'>\n");
     $r->print("<input type='checkbox' name='filelink"."' ".      $r->print("<input type='checkbox' name='filelink"."' ".
       "value='$filelink' onClick='".        "value='$filelink' onClick='".
Line 628  sub display_line { Line 766  sub display_line {
     }      }
     $r->print(">\n");      $r->print(">\n");
     $r->print("<input type='hidden' name='title"."' ".      $r->print("<input type='hidden' name='title"."' ".
       "value='$title'>\n");        "value='$titleesc'>\n");
     $r->print("</form>\n");      $r->print("</form>\n");
     $r->print("</td><td valign='bottom' nowrap bgcolor=$fileclr>");      $r->print("</td><td valign='bottom' nowrap bgcolor=$fileclr>");
     $hash{"pre_${fnum}_link"}=$filelink;      $hash{"pre_${fnum}_link"}=$filelink;
     $hash{"pre_${fnum}_title"}=$title;      $hash{"pre_${fnum}_title"}=$titleesc;
      $fnum++;       $fnum++;
  }   }
   
Line 689  sub display_line { Line 827  sub display_line {
  if ($hash{'display_attrs_5'} == 1) {   if ($hash{'display_attrs_5'} == 1) {
     my $lang = &Apache::lonnet::metadata($filelink,'language')      my $lang = &Apache::lonnet::metadata($filelink,'language')
  if ($metafile == 1);   if ($metafile == 1);
     $lang = $language{$lang};      $lang = &Apache::loncommon::languagedescription($lang);
     $lang = '&nbsp;' if (!$lang);      $lang = '&nbsp;' if (!$lang);
     $r->print("<td bgcolor=$fileclr valign=bottom> ".$lang.      $r->print("<td bgcolor=$fileclr valign=bottom> ".$lang.
       " </td>\n");        " </td>\n");
Line 751  sub begin_form { Line 889  sub begin_form {
     $dnum++;      $dnum++;
 }  }
   
 # ----------- grab unprocessed CGI variables that may have been appended to URL  
 sub get_unprocessed_cgi {  
     map {  
        my ($name, $value) = split(/=/,$_);  
        $value =~ tr/+/ /;  
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;  
        if ($name eq 'catalogmode' or $name eq 'launch' or $name eq 'acts') {  
            $ENV{'form.'.$name}=$value;  
        }  
     } (split(/&/,$ENV{'QUERY_STRING'}));  
 }  
   
 # --------- settings whenever the user causes the indexer window to be launched  # --------- settings whenever the user causes the indexer window to be launched
 sub start_fresh_session {  sub start_fresh_session {
     delete $hash{'mode_catalog'};      delete $hash{'mode_catalog'};
     map {      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_/) {   if ($_ =~ /^pre_/) {
     delete $hash{$_};      delete $hash{$_};
  }   }
  if ($_ =~ /^store/) {   if ($_ =~ /^store/) {
     delete $hash{$_};      delete $hash{$_};
  }   }
     } keys %hash;          }
   }
   
   # ------------------------------------------------------------------- setvalues
   sub setvalues {
       # setvalues is used in registerurl to synchronize the database
       # hash and environment hashes
       my ($H1,$h1key,$H2,$h2key) =@_;
       #
       if (exists $H2->{$h2key}) {
    $H1->{$h1key} = $H2->{$h2key};
       } elsif (exists $H1->{$h1key}) {
    $H2->{$h2key} = $H1->{$h1key};
       } 
 }  }
   
 1;  1;
Line 912  begin_form - prints the beginning of a f Line 1056  begin_form - prints the beginning of a f
   
 =item *  =item *
   
 get_unprocessed_cgi - grab unprocessed CGI variables that may have been  
 appended to URL  
   
 =item *  
   
 start_fresh_session - settings whenever the user causes the indexer window  start_fresh_session - settings whenever the user causes the indexer window
 to be launched  to be launched
   

Removed from v.1.26  
changed lines
  Added in v.1.42


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