Diff for /loncom/publisher/lonpubdir.pm between versions 1.114 and 1.160.2.1

version 1.114, 2008/11/20 15:19:28 version 1.160.2.1, 2016/08/07 20:23:42
Line 1 Line 1
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 # Construction Space Directory Lister  # Authoring Space Directory Lister
 #  #
 # $Id$  # $Id$
 #  #
Line 33  use strict; Line 33  use strict;
 use Apache::File;  use Apache::File;
 use File::Copy;  use File::Copy;
 use Apache::Constants qw(:common :http :methods);  use Apache::Constants qw(:common :http :methods);
 use Apache::loncacc;  
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonhtmlcommon();  use Apache::lonhtmlcommon();
 use Apache::londiff();  use Apache::londiff();
Line 41  use Apache::lonlocal; Line 40  use Apache::lonlocal;
 use Apache::lonmsg;  use Apache::lonmsg;
 use Apache::lonmenu;  use Apache::lonmenu;
 use Apache::lonnet;  use Apache::lonnet;
 use LONCAPA;  use LONCAPA qw(:DEFAULT :match);
   
 sub handler {  sub handler {
   
   my $r=shift;      my $r=shift;
   
   my $fn;      # Validate access to the construction space and get username:domain.
   
       my ($uname,$udom)=&Apache::lonnet::constructaccess($r->uri); 
       unless (($uname) && ($udom)) {
           return HTTP_NOT_ACCEPTABLE;
       }
   
   # ----------------------------------------------------------- Start page output
   
   $fn = getEffectiveUrl($r);      my $fn=$r->filename;
       $fn=~s/\/$//;
       my $thisdisfn=$fn;
   
       my $docroot=$r->dir_config('lonDocRoot');     # Apache  londocument root.
       if ($thisdisfn eq "$docroot/priv/$udom") {
           if ((-d "/home/$uname/public_html/") && (!-e "$docroot/priv/$udom/$uname")) {
               my ($version) = ($r->dir_config('lonVersion') =~ /^\'?(\d+\.\d+)\./);
               &Apache::loncommon::content_type($r,'text/html');
               $r->send_http_header;
   
               &Apache::lonhtmlcommon::clear_breadcrumbs();
               $r->print(&Apache::loncommon::start_page('Authoring Space').
                         '<div class="LC_error">'.
                         '<br /><p>'.
                         &mt('Your Authoring Space is currently in the location used by LON-CAPA version 2.10 and older, but your domain is using a newer LON-CAPA version ([_1]).',$version).'</p>'.
                         '<p>'.
                         &mt('Please ask your Domain Coordinator to move your Authoring Space to the new location.').
                         '</p>'.
                         '</div>'.
                         &Apache::loncommon::end_page());
               return OK;
           }
       }
       $thisdisfn=~s/^\Q$docroot\E\/priv//;
       
       my $resdir=$docroot.'/res'.$thisdisfn; # Resource directory
       my $targetdir='/res'.$thisdisfn; # Publication target directory.
       my $linkdir='/priv'.$thisdisfn;      # Full URL name of constr space.
   
   # Validate access to the construction space and get username@domain.      my %bombs=&Apache::lonmsg::all_url_author_res_msg($uname,$udom);
   
   my $uname;      &startpage($r, $uname, $udom, $thisdisfn);  # Put out the start of page.
   my $udom;  
   
   ($uname,$udom)=      if (!-d $fn) {
     &Apache::loncacc::constructaccess(          if (-e $fn) {
              $fn,$r->dir_config('lonDefDomain'));               $r->print('<p class="LC_info">'.&mt('Requested item is a file not a directory.').'</p>');
   unless (($uname) && ($udom)) {          } else {
      $r->log_reason($uname.' at '.$udom.              $r->print('<p class="LC_info">'.&mt('The requested subdirectory does not exist.').'</p>');
          ' trying to list directory '.$env{'form.filename'}.          }
          ' ('.$fn.') - not authorized',           $r->print(&Apache::loncommon::end_page());
          $r->filename);           return OK;
      return HTTP_NOT_ACCEPTABLE;      }
   }      my @files;
       if (opendir(DIR,$fn)) {
           @files = grep(!/^\.+$/,readdir(DIR));
           closedir(DIR);
       } else {
           $r->print('<p class="LC_error">'.&mt('Could not open directory.').'</p>');
           $r->print(&Apache::loncommon::end_page());
           return OK;
       }
   
   # Remove trailing / from directory name.      &dircontrols($r,$uname,$udom,$thisdisfn);   # Put out actions for directory, 
                                                   # browse/upload + new file page.
       &resourceactions($r,$uname,$udom,$thisdisfn); # Put out form used for printing/deletion etc.
   
   $fn=~s/\/$//;      my $numdir = 0;
       my $numres = 0;
     
       if ((@files == 0) && ($thisdisfn =~ m{^/$match_domain/$match_username})) {
           if ($thisdisfn =~ m{^/$match_domain/$match_username$}) {
               $r->print('<p class="LC_info">'.&mt('This Authoring Space is currently empty.').'</p>');
           } else {
               $r->print('<p class="LC_info">'.&mt('This subdirectory is currently empty.').'</p>');
           }
           $r->print(&Apache::loncommon::end_page());
           return OK;
       }
   
   unless ($fn) {       # Retrieving value for "sortby" and "sortorder" from QUERY_STRING
      $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
          ' trying to list empty directory', $r->filename);           ['sortby','sortorder']);
      return HTTP_NOT_FOUND;  
   }       # Sort by name as default, not reversed
       if (! exists($env{'form.sortby'})) { $env{'form.sortby'} = 'filename' }
       if (! exists($env{'form.sortorder'})) { $env{'form.sortorder'} = '' }
       my $sortby = $env{'form.sortby'};
       my $sortorder = $env{'form.sortorder'};
   
       # Order in which columns are displayed from left to right
       my @order = ('filetype','actions','filename','title',
                       'pubstatus','cmtime','size');
   
       # Up and down arrows to indicate sort order
       my @arrows = ('&nbsp;&#9650;','&nbsp;&#9660;','');
   
       # Default sort order and column title
       my %columns = (
           filetype =>     {
                               order => 'ascending',
                               text  => &mt('Type'),
                           },
           actions =>      {
                               # Not sortable
                               text  => &mt('Actions'),
                           },
           filename =>     {
                               order => 'ascending',
                               text  => &mt('Name'),
                           },
           title =>        {
                               order => 'ascending',
                               text  => &mt('Title'),
                           },
           pubstatus =>    {
                               order => 'ascending',
                               text  => &mt('Status'),
                               colspan => '2',
                           },
           cmtime =>       {
                               order => 'descending',
                               text  => &mt('Last Modified'),
                           },
           size =>         {
                               order => 'ascending',
                               text  => &mt('Size').' (kB)',
                           },
       ); 
   
       # Print column headers
       my $output = '';
       foreach my $key (@order) {
           my $idx;
           # Append an up or down arrow to sorted column
           if ($sortby eq $key) {
               $idx = ($columns{$key}{order} eq 'ascending') ? 0:1;
               if ($sortorder eq 'rev') { $idx ++; }
               $idx = $idx%2;
           } else { $idx = 2; } # No arrow if column is not sorted
           $output .= (($columns{$key}{order}) ?
               '<th'.($columns{$key}{colspan} ? ' colspan="'.$columns{$key}{colspan}.'"' : '')
               .'><a href="'.$linkdir.'/?sortby='.$key.'&sortorder='
               .((($sortby eq $key) && ($sortorder ne 'rev')) ? 'rev' : '').'">'
               .$columns{$key}{text}.$arrows[$idx].'</a></th>' :
               '<th>'.$columns{$key}{text}.'</th>');
       }
       $r->print(&Apache::loncommon::start_data_table()
           .&Apache::loncommon::start_data_table_header_row() . $output
           .&Apache::loncommon::end_data_table_header_row()
       );
   
       my $dirptr=16384; # Mask indicating a directory in stat.cmode.
       my $filehash = {};
       foreach my $filename (@files) {
           # Skip .DS_Store, .DAV and hidden files
           my ($extension) = ($filename=~/\.(\w+)$/);
           next if (($filename eq '.DS_Store')
                   || ($filename eq '.DAV')
                   || (&Apache::loncommon::fileembstyle($extension) eq 'hdn')
                   || ($filename =~ /^\._/));
   
           my ($cmode,$csize,$cmtime)=(stat($fn.'/'.$filename))[2,7,9];
           my $linkfilename = &HTML::Entities::encode('/priv'.$thisdisfn.'/'.$filename,'<>&"');
           # Identify type of file according to icon used
           my ($filetype) = (&Apache::loncommon::icon($filename) =~ m{/(\w+).gif$}); 
           my $cstr_dir = $r->dir_config('lonDocRoot').'/priv'.$thisdisfn;
           my $meta_same = &isMetaSame($cstr_dir, $resdir, $filename);
           
           # Store size, title, and status for files but not directories
           my $size = (!($cmode&$dirptr)) ? $csize/1024. : 0;
           my ($status, $pubstatus, $title, $fulltitle);
           if (!($cmode&$dirptr)) {
               ($status, $pubstatus) = &getStatus($resdir, $targetdir, $cstr_dir, 
                   $filename, $linkfilename, $cmtime, $meta_same);
               ($fulltitle, $title) = &getTitle($resdir, $targetdir, $filename, 
                                           $linkfilename, $meta_same, \%bombs);
           } else {
               ($status, $pubstatus) = ('','');
               ($fulltitle, $title) = ('','');
           }
   
 # ----------------------------------------------------------- Start page output          # This hash will allow sorting
           $filehash->{ $filename } = {
               "cmtime"            => $cmtime,
               "size"              => $size,
               "cmode"             => $cmode,
               "filetype"          => $filetype,
               "title"             => $title,
               "fulltitle"         => $fulltitle,
               "status"            => $status,
               "pubstatus"         => $pubstatus,
               "linkfilename"      => $linkfilename,
           }
       }
      
       my @sorted_files;
       # Sorting by something other than "Name".  Name is the secondary key.
       if ($sortby =~ m{cmtime|size}) {    # Numeric fields
           # First check if order should be reversed
           if ($sortorder eq "rev") {
               @sorted_files = sort {
                   $filehash->{$a}->{$sortby} <=> $filehash->{$b}->{$sortby}
                       or
                   uc($a) cmp uc($b)
               } (keys(%{$filehash}));
           } else {
               @sorted_files = sort {
                   $filehash->{$b}->{$sortby} <=> $filehash->{$a}->{$sortby}
                       or
                   uc($a) cmp uc($b)
               } (keys(%{$filehash}));
           }
       } elsif ($sortby =~ m{filetype|title|status}) {     # String fields
           if ($sortorder eq "rev") {
               @sorted_files = sort {
                   $filehash->{$b}->{$sortby} cmp $filehash->{$a}->{$sortby}
                       or
                   uc($a) cmp uc($b)
               } (keys(%{$filehash}));
           } else {
               @sorted_files = sort {
                   $filehash->{$a}->{$sortby} cmp $filehash->{$b}->{$sortby}
                       or
                   uc($a) cmp uc($b)
               } (keys(%{$filehash}));
           }
   
   my $thisdisfn=$fn;      # Sort by "Name" is the default
   $thisdisfn=~s/^\/home\/$uname\/public_html//; # subdirectory part of      } else { 
                                                 # construction space.           if ($sortorder eq "rev") {
   my $docroot=$r->dir_config('lonDocRoot');     # Apache  londocument root.              @sorted_files = sort {uc($b) cmp uc($a)} (keys(%{$filehash}));
           } else {
   my $resdir=$docroot.'/res/'.$udom.'/'.$uname.$thisdisfn; # Resource directory              @sorted_files = sort {uc($a) cmp uc($b)} (keys(%{$filehash}));
   my $targetdir=$udom.'/'.$uname.$thisdisfn; # Publiction target directory.          }
   my $linkdir='/priv/'.$uname.$thisdisfn;      # Full URL name of constr space.      }
   
   my %bombs=&Apache::lonmsg::all_url_author_res_msg($uname,$udom);  
   
   &startpage($r, $uname, $udom, $thisdisfn);   # Put out the start of page.  
   if ($env{'environment.remote'} eq 'off') {  
       &dircontrols($r,$uname,$udom,$thisdisfn);    # Put out actions for directory,   
                                                # browse/upload + new file page.  
   } else {  
       &pubbuttons($r,$uname,$thisdisfn);  
   }  
   &resourceactions($r,$uname,$udom,$thisdisfn); #Put out form used for printing/deletion etc.  
   
   my $numdir = 0;      # Print the sorted resources
   my $numres = 0;      foreach my $filename (@sorted_files) {
             if ($filehash->{$filename}->{"cmode"}&$dirptr) {        # Directories
   # Start off the directory table.              &putdirectory($r, $thisdisfn, $linkdir, $filename, 
   $r->print('<h3>'.&mt('Directory Contents:').'</h3>');                  $filehash->{$filename}->{"cmtime"}, 
   $r->print('<table id="LC_browser"><tr>'.                  $targetdir, \%bombs, \$numdir);
             '<th>'.&mt('Type').'</th>'.          } else {                                                # Files
             '<th>'.&mt('Actions').'</th>'.              &putresource($r, $udom, $uname, $filename, $thisdisfn, $resdir,
             '<th>'.&mt('Name').'</th>'.                  $targetdir, $linkdir, $filehash->{$filename}->{"cmtime"}, 
             '<th>'.&mt('Title').'</th>'.                  $filehash->{$filename}->{"size"}, \$numres, 
     '<th>'.&mt('Status').'</th>'.                  $filehash->{$filename}->{"linkfilename"},
             '<th>'.&mt('Last Modified').                  $filehash->{$filename}->{"fulltitle"},
     '</th></tr>'."\n");                  $filehash->{$filename}->{"status"},
                   $filehash->{$filename}->{"pubstatus"});
   my $filename;          }
   my $dirptr=16384; # Mask indicating a directory in stat.cmode.  
   
   opendir(DIR,$fn);  
   my @files=sort {uc($a) cmp uc($b)} (readdir(DIR));  
   foreach my $filename (@files) {  
      my ($cdev,$cino,$cmode,$cnlink,  
          $cuid,$cgid,$crdev,$csize,  
          $catime,$cmtime,$cctime,  
          $cblksize,$cblocks)=stat($fn.'/'.$filename);  
   
      my $extension='';  
      if ($filename=~/\.(\w+)$/) { $extension=$1; }  
      if ($cmode&$dirptr) {  
  putdirectory($r, $thisdisfn, $linkdir, $filename, $cmtime,$targetdir,\%bombs,\$numdir);  
      } elsif (&Apache::loncommon::fileembstyle($extension) ne 'hdn') {  
  putresource($r, $udom, $uname, $filename, $thisdisfn, $resdir,   
      $targetdir, $linkdir, $cmtime,\%bombs,\$numres);  
      } else {  
  # "hidden" extension and not a directory, so hide it away.  
      }  
   }  
   closedir(DIR);  
   
   $r->print('</table>'.&Apache::loncommon::end_page());  
   return OK;    
 }  
 #  
 #  Gets the effective URL of the request and returns it:  
 #    $effn = getEffectiveUrl($r);  
 #       $r  - The Apache Request object.  
 sub getEffectiveUrl {  
     my $r = shift;  
     my $fn;  
       
     if ($env{'form.filename'}) { # If a form filename is defined.  
  $fn=$env{'form.filename'};  
  #  
  #   Replace the ~username of the URL with /home/username/public_html  
  #   so that we don't have to worry about ~ expansion internally.  
  #  
  $fn=~s/^http\:\/\/[^\/]+\///;  
         $fn=~s/^\///;  
         $fn=~s{~($LONCAPA::username_re)}{/home/$1/public_html};  
   
  #  Remove trailing / strings (?)   
   
  $fn=~s/\/[^\/]+$//;  
     } else {  
  #   If no form is defined, use request filename.  
  $fn = $r->filename();  
  my $lonDocRoot=$r->dir_config('lonDocRoot');  
  if ( $fn =~ /$lonDocRoot/ ) {  
     #internal authentication, needs fixup.  
     $fn = $r->uri(); # non users do not get the full path request  
                              # through SCRIPT_FILENAME  
     $fn=~s{^/~($LONCAPA::username_re)}{/home/$1/public_html};  
  }  
     }      }
     $fn=~s/\/+/\//g;  
     return $fn;      $r->print( &Apache::loncommon::end_data_table()
           .&Apache::loncommon::end_page() );
   
       return OK;
 }  }
 #  
   
   
 #   Output the header of the page.  This includes:  #   Output the header of the page.  This includes:
 #   - The HTML header   #   - The HTML header 
 #   - The H1/H3  stuff which includes the directory.  #   - The H1/H3  stuff which includes the directory.
Line 190  sub getEffectiveUrl { Line 319  sub getEffectiveUrl {
   
 sub startpage {  sub startpage {
     my ($r, $uname, $udom, $thisdisfn) = @_;      my ($r, $uname, $udom, $thisdisfn) = @_;
     my $currdir = '/priv/'.$uname.$thisdisfn;  
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;      $r->send_http_header;
   
     my $formaction='/priv/'.$uname.$thisdisfn.'/';      my $formaction='/priv'.$thisdisfn.'/';
     $formaction=~s|/+|/|g;      $formaction=~s|/+|/|g;
     my $pagetitle .= &Apache::loncommon::help_open_menu('','',3,'Authoring').  
         '<font face="Arial, Helvetica, sans-serif" size="+1"><b>'.&mt('Construction Space').'</b>:</font>&nbsp;'.  
         '<form name="dirs" method="post" action="'.$formaction.  
         '" target="_parent"><tt><b>'.  
         &Apache::lonhtmlcommon::crumbs($uname.$thisdisfn.'/','_top','/priv','','+1',1)."</b></tt><br />".  
         &Apache::lonhtmlcommon::select_recent('construct','recent',  
                  'this.form.action=this.form.recent.value;this.form.submit()').  
               '</form>';  
     &Apache::lonhtmlcommon::store_recent('construct',$formaction,$formaction);      &Apache::lonhtmlcommon::store_recent('construct',$formaction,$formaction);
     if ($env{'environment.remote'} eq 'off') {  
  $env{'request.noversionuri'}=$currdir.'/';      &Apache::lonhtmlcommon::clear_breadcrumbs();
  $r->print(&Apache::loncommon::start_page('Construction Space',undef,      &Apache::lonhtmlcommon::add_breadcrumb({
  {'body_title' =>          'text'  => 'Authoring Space',
       $pagetitle,}));          'href'  => &Apache::loncommon::authorspace($formaction),
     } else {      });
  $r->print(&Apache::loncommon::start_page('Construction Space',undef,      # breadcrumbs (and tools) will be created 
  { 'only_body' => 1,}));      # in start_page->bodytag->innerregister
  $r->print($pagetitle);  
     }      $env{'request.noversionuri'}=$formaction;
       $r->print(&Apache::loncommon::start_page('Authoring Space'));
   
       my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
       my $current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,"$londocroot/priv/$udom/$uname");
       my $disk_quota = &Apache::loncommon::get_user_quota($uname,$udom,'author'); #expressed in MB
       $disk_quota = 1000 * $disk_quota; # convert from MB to kB
   
       $r->print(&Apache::loncommon::head_subbox(
                        '<div style="float:right;padding-top:0;margin-top;0">'
                       .&Apache::lonhtmlcommon::display_usage($current_disk_usage,
                                                              $disk_quota,'authoring')
                       .'</div>'
                       .&Apache::loncommon::CSTR_pageheader()));
   
     my $esc_thisdisfn = &Apache::loncommon::escape_single($thisdisfn);      my $esc_thisdisfn = &Apache::loncommon::escape_single($thisdisfn);
     my $doctitle = 'LON-CAPA '.&mt('Construction Space');      my $doctitle = 'LON-CAPA '.&mt('Authoring Space');
     my $newname = &mt('New Name');      my $newname = &mt('New Name');
     my $pubdirscript=(<<ENDPUBDIRSCRIPT);      my $pubdirscript=(<<ENDPUBDIRSCRIPT);
 <script type="text/javascript">  <script type="text/javascript">
 top.document.title = '$esc_thisdisfn/ - $doctitle';  top.document.title = '$esc_thisdisfn/ - $doctitle';
 // Store directory location for menu bar to find  // Store directory location for menu bar to find
   
 parent.lastknownpriv='/~$uname$esc_thisdisfn/';  parent.lastknownpriv='/priv$esc_thisdisfn/';
   
 // Confirmation dialogues  // Confirmation dialogues
   
Line 327  parent.lastknownpriv='/~$uname$esc_thisd Line 460  parent.lastknownpriv='/~$uname$esc_thisd
 </script>  </script>
 ENDPUBDIRSCRIPT  ENDPUBDIRSCRIPT
     $r->print($pubdirscript);      $r->print($pubdirscript);
   
     if ((($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) &&  
  $env{'environment.remote'} ne 'off') {  
  $r->print('<h3>'.&mt('Co-Author').': '.$uname.' at '.$udom.  
   '</h3>');  
     }  
 }  }
   
 sub dircontrols {  sub dircontrols {
Line 373  sub dircontrols { Line 500  sub dircontrols {
                                       );                                        );
     my $mytype = $lt{'type'}; # avoid conflict with " and ' in javascript      my $mytype = $lt{'type'}; # avoid conflict with " and ' in javascript
     $r->print(<<END);      $r->print(<<END);
         <table id="LC_cstr_controls">  <div class="LC_columnSection">
          <tr>    <div>
           <th>$lt{'acti'}</th>      <form name="curractions" method="post" action="">
           <th>$lt{'updc'}</th>        <fieldset>
           <th>$lt{'crea'}</th>          <legend>$lt{'acti'}</legend>
         </tr>          <select name="dirtask" onchange="currdiract(this.form)">
         <tr>  
          <td>  
           <form name="curractions" method="post" action="">  
            <select name="dirtask" onchange="currdiract(this.form)">  
             <option>$lt{'sela'}</option>              <option>$lt{'sela'}</option>
             <option value="publish">$lt{'pubd'}</option>              <option value="publish">$lt{'pubd'}</option>
             <option value="editmeta">$lt{'edit'}</option>              <option value="editmeta">$lt{'edit'}</option>
             <option value="printdir">$lt{'prnt'}</option>              <option value="printdir">$lt{'prnt'}</option>
             <option value="delete">$lt{'dedr'}</option>              <option value="delete">$lt{'dedr'}</option>
            </select>          </select>
            <input type="hidden" name="filename" value="/~$uname$thisdisfn/" />          <input type="hidden" name="filename" value="/priv$thisdisfn/" />
           </form>        </fieldset>
           <form name="publishdir" method="post" action="/adm/publish" target="_parent">      </form>
            <input type="hidden" name="pubrec" value="" />      <form name="publishdir" method="post" action="/adm/publish" target="_parent">
            <input type="hidden" name="filename" value="" />        <input type="hidden" name="pubrec" value="" />
           </form>        <input type="hidden" name="filename" value="" />
           <form name="printdir" method="post" action="/adm/printout" target="_parent">      </form>
            <input type="hidden" name="postdata" value="" />      <form name="printdir" method="post" action="/adm/printout" target="_parent">
           </form>        <input type="hidden" name="postdata" value="" />
          </td>      </form>
          <td>    </div>
     <form name="upublisher" enctype="multipart/form-data" method="post" action="/adm/upload" target="_parent">  
       <input type="hidden" name="filename" value="/~$uname$thisdisfn/" />    <div>
       <input type="file" name="upfile" size="20" />      <form name="upublisher" enctype="multipart/form-data" method="post" action="/adm/upload" target="_parent">
       <input type="button" value="$lt{'uplo'}"  onclick="checkUpload(this.form)" />        <fieldset>
     </form>          <legend>$lt{'updc'}</legend>
  </td>          <input type="hidden" name="filename" value="/priv$thisdisfn/" />
  <td>          <input type="file" name="upfile" size="20" />
     <form name="fileaction" method="post" action="/adm/cfile" target="_parent">          <input type="button" value="$lt{'uplo'}"  onclick="checkUpload(this.form)" />
       <span style="white-space: nowrap">        </fieldset>
  <input type="hidden" name="filename" value="/~$uname$thisdisfn/" />      </form>
     </div>
   
     <div>
       <form name="fileaction" method="post" action="/adm/cfile" target="_parent">
         <fieldset>
                 <legend>$lt{'crea'}</legend>
         <span class="LC_nobreak">
    <input type="hidden" name="filename" value="/priv$thisdisfn/" />
                   <script type="text/javascript">                    <script type="text/javascript">
                     function validate_go() {                      function validate_go() {
                         var selected = document.fileaction.action.selectedIndex;                          var selected = document.fileaction.action.selectedIndex;
Line 434  sub dircontrols { Line 565  sub dircontrols {
             <option value="newdir">$lt{'nsub'}:</option>              <option value="newdir">$lt{'nsub'}:</option>
   </select>&nbsp;<input type="text" name="newfilename" value="$lt{'type'}" onfocus="if (this.value == '$mytype') this.value=''" />&nbsp;<input type="button" value="Go" onclick="validate_go();" />    </select>&nbsp;<input type="text" name="newfilename" value="$lt{'type'}" onfocus="if (this.value == '$mytype') this.value=''" />&nbsp;<input type="button" value="Go" onclick="validate_go();" />
  </span>   </span>
  </form>        </fieldset>
   </td>      </form>
          </tr>    </div>
         </table>  </div>
 END  END
 }  }
   
 sub pubbuttons {  
     my ($r,$uname,$thisdisfn) = @_;  
     $r->print('<form method="post" action="/adm/publish" target="_parent">'.  
               '<table><tr><td><input type="hidden" name="filename" value="/~'.  
                $uname.$thisdisfn.'/" />'.  
               '<input type="submit" value="'.&mt('Publish Directory').'" /></td><td>'.  
 '<input type="button" onclick="window.location='."'/~".  
                $uname.$thisdisfn."/default.meta'".'" value="'.  
 &mt('Edit Directory Catalog Information').'" /></td></tr></table></form>');  
 }  
   
 sub resourceactions {  sub resourceactions {
     my ($r,$uname,$udom,$thisdisfn) = @_;      my ($r,$uname,$udom,$thisdisfn) = @_;
     $r->print(<<END);      $r->print(<<END);
Line 510  sub getSourceRightString { Line 630  sub getSourceRightString {
 }  }
 #  #
 #  Put out a directory table row:  #  Put out a directory table row:
 #    putdirectory(r, base, here, dirname, modtime)  #    putdirectory(r, base, here, dirname, modtime, targetdir, bombs, numdir)
 #      r       - Apache request object.  #      r         - Apache request object.
 #      reqfile - File in request.  #      reqfile   - File in request.
 #      here    - Where we are in directory tree.  #      here      - Where we are in directory tree.
 #      dirname - Name of directory special file.  #      dirname   - Name of directory special file.
 #      modtime - Encoded modification time.  #      modtime   - Encoded modification time.
 #   #      targetdir - Publication target directory.
   #      bombs     - Reference to hash of URLs with runtime error messages.
   #      numdir    - Reference to scalar used to track number of sub-directories
   #                  in directory (used in form name for each "actions" dropdown).
   #
 sub putdirectory {  sub putdirectory {
     my ($r, $reqfile, $here, $dirname, $modtime, $resdir, $bombs, $numdir) = @_;      my ($r, $reqfile, $here, $dirname, $modtime, $targetdir, $bombs, $numdir) = @_;
     # construct the display filename: the directory name unless ..:  
       # construct the display filename: the directory name unless ..:
      
       my $actionitem;
    
     my $disfilename = $dirname;      my $disfilename = $dirname;
     if ($dirname eq '..') {  # Don't display directory itself, and there is no way up from root directory
  $disfilename = '<i>'.&mt('Parent Directory').'</i>';      unless ((($dirname eq '..') && ($reqfile=~/^\/[^\/]+\/[^\/]+$/)) || ($dirname eq '.')) {
     }          my $kaputt=0;
     unless ( (($dirname eq '..') && ($reqfile eq '')) || ($dirname eq '.')) {          if (ref($bombs) eq 'HASH') {
  my $kaputt=0;              foreach my $key (keys(%{$bombs})) {
  foreach (keys %{$bombs}) {                  my $currentdir = &Apache::lonnet::declutter("$targetdir/$disfilename");
     if ($_=~m:^\Q$resdir\E/\Q$disfilename\E/:) { $kaputt=1; last; }                  if (($key) =~ m{^\Q$currentdir\E/}) { $kaputt=1; last; }
  }              }
           }
   #
   # Get the metadata from that directory's default.meta to display titles
   #
  %Apache::lonpublisher::metadatafields=();   %Apache::lonpublisher::metadatafields=();
  %Apache::lonpublisher::metadatakeys=();   %Apache::lonpublisher::metadatakeys=();
  my $construct=$here;   &Apache::lonpublisher::metaeval(
  $construct=~s{^/priv/($LONCAPA::username_re)$}{/home/$1/public_html};                   &Apache::lonnet::getfile($r->dir_config('lonDocRoot').$here.'/'.$dirname.'/default.meta')
         my $dirpath = $here;                                         );
         $dirpath=~s{^/priv/}{/~};  
  &Apache::lonpublisher::metaeval(&Apache::lonnet::getfile(  
         $construct.'/'.$dirname.'/default.meta'  
  ));  
         my $actionitem = '';  
         if ($dirname eq '..') {          if ($dirname eq '..') {
             $actionitem = &mt('Go to ...');              $actionitem = &mt('Go to ...');
               $disfilename = '<i>'.&mt('Parent Directory').'</i>';
         } else {          } else {
             $actionitem =               $actionitem = 
                     '<form name="dirselect_'.$$numdir.                      '<form name="dirselect_'.$$numdir.
Line 554  sub putdirectory { Line 681  sub putdirectory {
                       '<option value="printdir">'.&mt('Print directory').'</option>'.                        '<option value="printdir">'.&mt('Print directory').'</option>'.
                       '<option value="delete">'.&mt('Delete directory').'</option>'.                        '<option value="delete">'.&mt('Delete directory').'</option>'.
                     '</select>'.                      '</select>'.
                      '<input type="hidden" name="filename" value="'.&HTML::Entities::encode($dirpath.'/'.$dirname,'<>&"').'/" />'.                       '<input type="hidden" name="filename" value="'.&HTML::Entities::encode($here.'/'.$dirname,'<>&"').'/" />'.
                      '<input type="hidden" name="openname" value="'.$here.'/'.$dirname.'/" />'.                       '<input type="hidden" name="openname" value="'.$here.'/'.$dirname.'/" />'.
                      '<input type="hidden" name="postdata" value="" />'.                       '<input type="hidden" name="postdata" value="" />'.
                    '</form>';                     '</form>';
Line 562  sub putdirectory { Line 689  sub putdirectory {
         }          }
  $r->print('<tr class="LC_browser_folder">'.   $r->print('<tr class="LC_browser_folder">'.
   '<td><img src="'.    '<td><img src="'.
   $Apache::lonnet::perlvar{'lonIconsURL'}.'/folder_closed.gif" alt="folder" /></td>'.    $Apache::lonnet::perlvar{'lonIconsURL'}.'/navmap.folder.closed.gif" alt="folder" /></td>'.
   '<td>'.$actionitem.'</td>'.    '<td>'.$actionitem.'</td>'.
   '<td><span class="LC_filename"><a href="'.&HTML::Entities::encode($here.'/'.$dirname,'<>&"').'/" target="_parent">'.    '<td><span class="LC_filename"><a href="'.&HTML::Entities::encode($here.'/'.$dirname,'<>&"').'/" target="_parent">'.
   $disfilename.'</a></span></td>'.    $disfilename.'</a></span></td>'.
         '<td colspan="2">'.($kaputt?&Apache::lonhtmlcommon::authorbombs($resdir.'/'.$disfilename.'/'):'').$Apache::lonpublisher::metadatafields{'title'});          '<td colspan="3">'.($kaputt?&Apache::lonhtmlcommon::authorbombs($targetdir.'/'.$disfilename.'/'):'').$Apache::lonpublisher::metadatafields{'title'});
  if ($Apache::lonpublisher::metadatafields{'subject'} ne '') {   if ($Apache::lonpublisher::metadatafields{'subject'} ne '') {
     $r->print(' <i>'.      $r->print(' <i>'.
       $Apache::lonpublisher::metadatafields{'subject'}.        $Apache::lonpublisher::metadatafields{'subject'}.
Line 574  sub putdirectory { Line 701  sub putdirectory {
  }   }
  $r->print($Apache::lonpublisher::metadatafields{'keywords'}.'</td>'.   $r->print($Apache::lonpublisher::metadatafields{'keywords'}.'</td>'.
   '<td>'.&Apache::lonlocal::locallocaltime($modtime).'</td>'.    '<td>'.&Apache::lonlocal::locallocaltime($modtime).'</td>'.
             '<td></td>'.
   "</tr>\n");    "</tr>\n");
     }      }
     return OK;      return;
 }  }
 #  
 #   Put a table row for a file resource.  sub getTitle {
 #      my ($resdir, $targetdir, $filename, $linkfilename, $meta_same, $bombs) = @_;
 sub putresource {      my $title='';
     my ($r, $udom, $uname, $filename, $thisdisfn,       my $titleString = &getTitleString($targetdir.'/'.$filename);
  $resdir, $targetdir, $linkdir,      if (-e $resdir.'/'.$filename) {
  $cmtime,$bombs,$numres) = @_;   $title = '<a href="'.$targetdir.'/'.$filename.
     &Apache::lonnet::devalidate_cache_new('meta',$targetdir.'/'.$filename);      '.meta" target="cat">'.$titleString.'</a>';
           if (!$meta_same) {
       $title = &mt('Metadata Modified').'<br />'.$title.
    '<br />'.
                   &Apache::loncommon::modal_link(
                       '/adm/diff?filename='.$linkfilename.'.meta'.'&amp;versiontwo=priv',
                       &mt('Metadata Diffs'),600,500);
       $title.="\n".'<br />'.
                   &Apache::loncommon::modal_link(
                       '/adm/retrieve?filename='.$linkfilename.'.meta&amp;inhibitmenu=yes&amp;add_modal=yes',
                       &mt('Retrieve Metadata'),600,500);
           } 
       }
       # Allow editing metadata of published and unpublished resources
       $title .= "\n".'<br />' if ($title);
       $title .= '<a href="'.$linkfilename.'.meta">'.
                 ($$bombs{&Apache::lonnet::declutter($targetdir.'/'.$filename)}?
                     '<img src="/adm/lonMisc/bomb.gif" border="0" alt="'.&mt('bomb').'" />':
                     &mt('Edit Metadata')).
                 '</a>';
   
       return ($title, $titleString);
   }
   
   
   sub isMetaSame {
       my ($cstr_dir, $resdir, $filename) = @_;
       my $meta_cmtime = (stat($cstr_dir.'/'.$filename.'.meta'))[9];
       my $meta_rmtime = (stat($resdir.'/'.$filename.'.meta'))[9];
       return (&Apache::londiff::are_different_files($resdir.'/'.$filename.'.meta',
               $cstr_dir.'/'.$filename.'.meta') && $meta_rmtime < $meta_cmtime) 
           ? 0 : 1;
   }
       
   
   sub getStatus {    
       my ($resdir, $targetdir, $cstr_dir, $filename,  
               $linkfilename, $cmtime, $meta_same) = @_;
     my $pubstatus = 'unpublished';      my $pubstatus = 'unpublished';
     my $status=&mt('Unpublished');      my $status = &mt('Unpublished');
     my $css_class='LC_browser_file';  
     my $title='&nbsp;';  
     my $publish_button=&mt('Publish');  
     my $cstr_dir = '/home/'.$uname.'/public_html/'.$thisdisfn.'/';  
 #    my $action_buttons=  
 #        '<br /><a target="_parent" href="/adm/cfile?action=delete&filename=/~'.  
 # $uname.'/'.$thisdisfn.'/'.$filename.'">'.  
 # &mt('Delete').'</a>';  
     if (-e $resdir.'/'.$filename) {      if (-e $resdir.'/'.$filename) {
         my $same=0;          my $same = 0;
  my ($rdev,$rino,$rmode,$rnlink,          if ((stat($resdir.'/'.$filename))[9] >= $cmtime) {
     $ruid,$rgid,$rrdev,$rsize,              $same = 1;
     $ratime,$rmtime,$rctime,  
     $rblksize,$rblocks)=stat($resdir.'/'.$filename);  
         if ($rmtime>=$cmtime) {  
            $same=1;  
         } else {          } else {
            if (&Apache::londiff::are_different_files($resdir.'/'.$filename,             if (&Apache::londiff::are_different_files($resdir.'/'.$filename,
      $cstr_dir.'/'.$filename)) {       $cstr_dir.'/'.$filename)) {
               $same=0;                $same = 0;
            } else {             } else {
               $same=1;                $same = 1;
            }             }
         }          }
  my $meta_cmtime = (stat($cstr_dir.'/'.$filename.'.meta'))[9];  
  my $meta_rmtime = (stat($resdir.'/'.$filename.'.meta'))[9];          my $rights_status =
  my $meta_same = 1;              &mt(&getCopyRightString($targetdir.'/'.$filename)).', ';
  if ($meta_rmtime < $meta_cmtime  
     && &Apache::londiff::are_different_files($resdir.'/'.$filename.'.meta',          my %lt_SourceRight = &Apache::lonlocal::texthash(
      $cstr_dir.'/'.$filename.'.meta')) {                 'open'   => 'Source: open',
     $meta_same = 0;                 'closed' => 'Source: closed',
  }          );
  $publish_button=&mt('Re-publish');          $rights_status .=
  my $rights_status =              $lt_SourceRight{&getSourceRightString($targetdir.'/'.$filename)};
     &mt(&getCopyRightString($targetdir.'/'.$filename)).' '.  
     &mt(&getSourceRightString($targetdir.'/'.$filename));  
  $title = '<a href="/res/'.$targetdir.'/'.$filename.  
     '.meta" target="cat">'.  
     &getTitleString($targetdir.'/'.$filename).'</a>';  
  if ($same) {   if ($same) {
     if (&Apache::lonnet::metadata($targetdir.'/'.$filename,'obsolete')) {      if (&Apache::lonnet::metadata($targetdir.'/'.$filename,'obsolete')) {
                 $pubstatus = 'obsolete';                  $pubstatus = 'obsolete';
Line 640  sub putresource { Line 790  sub putresource {
  $status=&mt('Published').   $status=&mt('Published').
     '<br />'. $rights_status;      '<br />'. $rights_status;
     }      }
 #    } else {  
 # $action_buttons='';  
 #    }  
  } else {   } else {
             $pubstatus = 'modified';              $pubstatus = 'modified';
     $status=&mt('Modified').      $status=&mt('Modified').
  '<br />'. $rights_status;   '<br />'. $rights_status;
 #    $action_buttons='';  
     if (&Apache::loncommon::fileembstyle(($filename=~/\.(\w+)$/)) eq 'ssi') {      if (&Apache::loncommon::fileembstyle(($filename=~/\.(\w+)$/)) eq 'ssi') {
  $status.='<br /><a href="/adm/diff?filename=/~'.$uname.   $status.='<br />'.
     $thisdisfn.'/'.$filename.                           &Apache::loncommon::modal_link(
     '&amp;versiontwo=priv" target="cat">'.&mt('Diffs').'</a>';                               '/adm/diff?filename='.$linkfilename.'&amp;versiontwo=priv',
                                &mt('Diffs'),600,500);
     }      }
  }    } 
   
  $title.="\n".'<br /><a href="/~'.$uname.$thisdisfn.'/'.$filename.'.meta">'.    $status.="\n".'<br />'.
     ($$bombs{$targetdir.'/'.$filename}?'<img src="/adm/lonMisc/bomb.gif" border="0" alt="'.&mt('bomb').'" />':&mt('Edit Metadata')).'</a>';               &Apache::loncommon::modal_link(
                    '/adm/retrieve?filename='.$linkfilename.'&amp;inhibitmenu=yes&amp;add_modal=yes',&mt('Retrieve'),600,500);
  if (!$meta_same) {  
     $title = &mt('Metadata Modified').'<br />'.$title.  
  '<br /><a href="/adm/diff?filename=/~'.$uname.  
  $thisdisfn.'/'.$filename.'.meta'.  
  '&amp;versiontwo=priv" target="cat">'.&mt('Metadata Diffs').'</a>';  
     $title.="\n".'<br /><a href="/adm/retrieve?filename=/~'.$uname.  
  $thisdisfn.'/'.$filename.'.meta" target="_parent">'.&mt('Retrieve Metadata').'</a>';  
  }  
  $status.="\n".'<br /><a href="/adm/retrieve?filename=/~'.$uname.  
     $thisdisfn.'/'.$filename.'" target="_parent">'.&mt('Retrieve').'</a>';  
     }      }
   
       return ($status, $pubstatus);
   }
   
   
   #
   #   Put a table row for a file resource.
   #
   sub putresource {
       my ($r, $udom, $uname, $filename, $thisdisfn, $resdir, $targetdir, 
               $linkdir, $cmtime, $size, $numres, $linkfilename, $title, 
               $status, $pubstatus) = @_;
       &Apache::lonnet::devalidate_cache_new('meta',$targetdir.'/'.$filename);
   
     my $editlink='';      my $editlink='';
     my $editlink2='';      my $editlink2='';
     if ($filename=~/\.(xml|html|htm|xhtml|xhtm|sty)$/) {      if ($filename=~/\.(xml|html|htm|xhtml|xhtm|sty)$/) {
  $editlink=' <br />(<a href="'.$linkdir.'/'.$filename.'?forceedit=1" target="_parent">'.&mt('Edit').'</a>)';   $editlink=' <br />(<a href="'.$linkdir.'/'.$filename.'?editmode=Edit&amp;problemmode=edit">'.&mt('Edit').'</a>)';
     }      }
     if ($filename=~/\.(problem|exam|quiz|assess|survey|form|library)$/) {      if ($filename=~/$LONCAPA::assess_re/) {
  $editlink=' (<a href="'.$linkdir.'/'.$filename.'?forceedit=1" target="_parent">'.&mt('EditXML').'</a>)';   $editlink=' (<a href="'.$linkdir.'/'.$filename.'?editmode=Edit&amp;problemmode=editxml">'.&mt('EditXML').'</a>)';
  $editlink2=' <br />(<a href="'.$linkdir.'/'.$filename.'?forceColoredit=1" target="_parent">'.&mt('Edit').'</a>)';   $editlink2=' <br />(<a href="'.$linkdir.'/'.$filename.'?editmode=Edit&amp;problemmode=edit">'.&mt('Edit').'</a>)';
     }      }
     if ($filename=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm|sty)$/) {      if ($filename=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm|sty)$/) {
  $editlink.=' (<a href="/adm/cleanup?filename=/~'.$uname.   $editlink.=' (<a href="/adm/cleanup?filename='.$linkfilename.'" target="_parent">'.&mt('Clean Up').')</a>';
     $thisdisfn.'/'.$filename.'" target="_parent">'.&mt('Clean Up').')</a>';  
     }      }
     if ($filename=~/\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/) {      if ($filename=~/\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/) {
  $editlink=' (<a target="_parent" href="/adm/cfile?decompress=/~'.   $editlink=' (<a target="_parent" href="/adm/cfile?decompress='.$linkfilename.'">'.&mt('Decompress').'</a>)';
       $uname.$thisdisfn.'/'.$filename.'">'.&mt('Decompress').'</a>)';  
     }      }
       my $publish_button = (-e $resdir.'/'.$filename) ? &mt('Re-publish') : &mt('Publish');
     my $pub_select = '';      my $pub_select = '';
     &create_pubselect($r,\$pub_select,$udom,$uname,$thisdisfn,$filename,$resdir,$pubstatus,$publish_button,$numres);      &create_pubselect($r,\$pub_select,$udom,$uname,$thisdisfn,$filename,$resdir,$pubstatus,$publish_button,$numres);
     $r->print('<tr class="LC_browser_file_'.$pubstatus.'">'.      $r->print(&Apache::loncommon::start_data_table_row().
       '<td>'.($filename=~/[\#\~]$/?'&nbsp;':        '<td>'.($filename=~/[\#\~]$/?'&nbsp;':
       '<img src="'.&Apache::loncommon::icon($filename).'" alt="" />').'</td>'.        '<img src="'.&Apache::loncommon::icon($filename).'" alt="" />').'</td>'.
               '<td>'.$pub_select.'</td>'.                '<td>'.$pub_select.'</td>'.
Line 697  sub putresource { Line 847  sub putresource {
                $filename.'</a></span>'.$editlink2.$editlink.                 $filename.'</a></span>'.$editlink2.$editlink.
       '</td>'.        '</td>'.
       '<td>'.$title.'</td>'.        '<td>'.$title.'</td>'.
       '<td>'.$status.'</td>'.                '<td class="LC_browser_file_'.$pubstatus.'">&nbsp;&nbsp;</td>'. # Display publication status
                 '<td>'.$status.'</td>'.
       '<td>'.&Apache::lonlocal::locallocaltime($cmtime).'</td>'.        '<td>'.&Apache::lonlocal::locallocaltime($cmtime).'</td>'.
       "</tr>\n");        '<td>'.sprintf("%.1f",$size).'</td>'.
     return OK;        &Apache::loncommon::end_data_table_row()
       );
       return;
 }  }
   
 sub create_pubselect {  sub create_pubselect {
Line 730  sub create_pubselect { Line 883  sub create_pubselect {
 '<option value="cleanup">'.&mt('Clean up').'</option>'.  '<option value="cleanup">'.&mt('Clean up').'</option>'.
 '<option value="print">'.&mt('Print').'</option>'.  '<option value="print">'.&mt('Print').'</option>'.
 '</select>  '</select>
 <input type="hidden" name="filename" value="/~'.  <input type="hidden" name="filename" value="/priv'.
  &HTML::Entities::encode($uname.$thisdisfn.'/'.$filename,'<>&"').'" />   &HTML::Entities::encode($thisdisfn.'/'.$filename,'<>&"').'" />
  <input type="hidden" name="dispfilename" value="'.   <input type="hidden" name="dispfilename" value="'.
  &HTML::Entities::encode($filename).'" /></form>';   &HTML::Entities::encode($filename).'" /></form>';
     $$numres ++;      $$numres ++;
Line 753  sub check_for_versions { Line 906  sub check_for_versions {
             $versions ++;                      $versions ++;        
         }          }
     }      }
       closedir(DIR);
     return $versions;      return $versions;
 }  }
   
 #  
 #   Categorize files in the directory.  
 #   For each file in a list of files in a file directory,   
 #   the  file categorized as one of:  
 #    - directory    
 #    - sequence  
 #    - problem   
 #    - Other resource.  
 #  
 #   For each file the modification date is determined as well.  
 #   Returned is a list of sublists:  
 #    (directories, sequences, problems, other)  
 #   each of the sublists contains entries of the following form (sorted by  
 #   filename):  
 #     (filename, typecode, lastmodtime)  
 #  
 #   $list = CategorizeFiles($location, $files)  
 #       $location   - Directory in which the files live (relative to our  
 #                     execution.  
 #       $files      - list of files.  
 #  
 sub CategorizeFiles {  
     my $location = shift;  
     my $files    = shift;  
 }  
   
 1;  1;
 __END__  __END__
   
   
 =head1 NAME  =head1 NAME
   
 Apache::lonpubdir - Construction space directory lister  Apache::lonpubdir - Authoring space directory lister
   
 =head1 SYNOPSIS  =head1 SYNOPSIS
   
 Invoked (for various locations) by /etc/httpd/conf/srm.conf:  Invoked (for various locations) by /etc/httpd/conf/srm.conf:
   
  <LocationMatch "^/\~.*/$">   <LocationMatch "^/+priv.*/$">
  PerlAccessHandler       Apache::loncacc   PerlAccessHandler       Apache::loncacc
  SetHandler perl-script   SetHandler perl-script
  PerlHandler Apache::lonpubdir   PerlHandler Apache::lonpubdir
Line 867  Output the header of the page.  This inc Line 995  Output the header of the page.  This inc
     $str = getTitleString($fullname);      $str = getTitleString($fullname);
         $fullname - Fully qualified filename to check.          $fullname - Fully qualified filename to check.
   
 =item putdirectory(r, base, here, dirname, modtime)  =item putdirectory($r, $base, $here, $dirname, $modtime, $targetdir, $bombs,
                      $numdir)
   
     Put out a directory table row:      Put out a directory table row:
           
     putdirectory($r, $base, $here, $dirname, $modtime)          $r        - Apache request object.
         $r       - Apache request object.          $reqfile  - File in request.
         $reqfile - File in request.          $here     - Where we are in directory tree.
         $here    - Where we are in directory tree.          $dirname  - Name of directory special file.
         $dirname - Name of directory special file.          $modtime  - Encoded modification time.
         $modtime - Encoded modification time.          targetdir - Publication target directory.
           bombs     - Reference to hash of URLs with runtime error messages.
 =item CategorizeFiles($location, $files)          numdir    - Reference to scalar used to track number of sub-directories
                           in directory (used in form name for each "actions" dropdown).
     Categorize files in the directory.  
     For each file in a list of files in a file directory,   
     the  file categorized as one of:  
         - directory    
         - sequence  
         - problem   
         - Other resource.  
   
     For each file the modification date is determined as well.  
     Returned is a list of sublists:  
         (directories, sequences, problems, other)  
     each of the sublists contains entries of the following form (sorted by filename):  
     (filename, typecode, lastmodtime)  
       
         $list = CategorizeFiles($location, $files)  
         $location   - Directory in which the files live (relative to our execution)  
         $files      - list of files.  
   
 =back  =back
   
 =cut  =cut
   

Removed from v.1.114  
changed lines
  Added in v.1.160.2.1


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
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.