[LON-CAPA-cvs] cvs: loncom /publisher lonpubdir.pm

foxr lon-capa-cvs@mail.lon-capa.org
Sat, 09 Feb 2002 01:38:54 -0000


foxr		Fri Feb  8 20:38:54 2002 EDT

  Modified files:              
    /loncom/publisher	lonpubdir.pm 
  Log:
  Restructure the code to make it somewhat easier to read/maintain.
  
  
  
Index: loncom/publisher/lonpubdir.pm
diff -u loncom/publisher/lonpubdir.pm:1.22 loncom/publisher/lonpubdir.pm:1.23
--- loncom/publisher/lonpubdir.pm:1.22	Tue Feb  5 17:25:00 2002
+++ loncom/publisher/lonpubdir.pm	Fri Feb  8 20:38:54 2002
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # (Publication Handler
 #
-# $Id: lonpubdir.pm,v 1.22 2002/02/05 22:25:00 foxr Exp $
+# $Id: lonpubdir.pm,v 1.23 2002/02/09 01:38:54 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -56,13 +56,11 @@
 
   my $fn;
 
-  if ($ENV{'form.filename'}) {
-      $fn=$ENV{'form.filename'};
-      $fn=~s/^http\:\/\/[^\/]+\/\~(\w+)/\/home\/$1\/public_html/;
-      $fn=~s/\/[^\/]+$//;
-  } else {
-      $fn=$r->filename();
-  }
+
+
+  $fn = getEffectiveUrl($r);
+
+  # Validate access to the construction space and get username@domain.
 
   my $uname;
   my $udom;
@@ -77,7 +75,9 @@
          $r->filename); 
      return HTTP_NOT_ACCEPTABLE;
   }
-     
+
+  # Remove trailing / from direcgtory name.
+
   $fn=~s/\/$//;
 
   unless ($fn) { 
@@ -88,38 +88,27 @@
 
 # ----------------------------------------------------------- Start page output
 
+  my $thisdisfn=$fn;
+  $thisdisfn=~s/^\/home\/$uname\/public_html//;	# subdirectory part of
+                                                # construction space. 
+  my $docroot=$r->dir_config('lonDocRoot');     # Apache  londocument root.
 
-  $r->content_type('text/html');
-  $r->send_http_header;
+  my $resdir=$docroot.'/res/'.$udom.'/'.$uname.$thisdisfn; # Resource directory
+  my $targetdir=$udom.'/'.$uname.$thisdisfn; # Publiction target directory.
+  my $linkdir='/~'.$uname.$thisdisfn;        # Full URL name of constr space.
 
-  $r->print('<html><head><title>LON-CAPA Construction Space</title></head>');
 
-  $r->print(
-   '<body bgcolor="#FFFFFF"><img align=right src=/adm/lonIcons/lonlogos.gif>');
 
-  my $thisdisfn=$fn;
-  $thisdisfn=~s/^\/home\/$uname\/public_html//;
-  
-  $r->print('<h1>Construction Space Directory <tt>'.$thisdisfn.'/</tt></h1>');
+  startpage($r, $uname, $udom, $thisdisfn);	# Put out the start of page.
   
-  if (($uname ne $ENV{'user.name'}) || ($udom ne $ENV{'user.domain'})) {
-          $r->print('<h3>Co-Author: '.$uname.' at '.$udom.
-               '</h3>');
-  }
-
-
-  my $docroot=$r->dir_config('lonDocRoot');
-
-  my $resdir=$docroot.'/res/'.$udom.'/'.$uname.$thisdisfn;
-  my $targetdir=$udom.'/'.$uname.$thisdisfn;
-  my $linkdir='/~'.$uname.$thisdisfn;
+  # Start off the diretory table.
 
   $r->print('<table border=2>'.
- '<tr><th>Actions</th><th>Name</th><th>Title</th>'.
- '<th>Status</th><th>Last Modified</th></tr>');
+	    '<tr><th>Actions</th><th>Name</th><th>Title</th>'.
+	    '<th>Status</th><th>Last Modified</th></tr>');
 
   my $filename;
-  my $dirptr=16384;
+  my $dirptr=16384;		# Mask indicating a directory in stat.cmode.
 
   opendir(DIR,$fn);
   my @files=sort(readdir(DIR));
@@ -146,6 +135,80 @@
   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\:\/\/[^\/]+\/\~(\w+)/\/home\/$1\/public_html/;
+	
+	#  Remove trailing / strings (?) 
+	
+	$fn=~s/\/[^\/]+$//;
+    } else {			# If no form is defined, use request filename.
+	$fn=$r->filename();
+    }
+    return $fn;
+}
+#
+#   Output the header of the page.  This includes:
+#   - The HTML header 
+#   - The H1/H3  stuff which includes the directory.
+#
+#     startpage($r, $uame, $udom, $thisdisfn);
+#      $r     - The apache request object.
+#      $uname - User name.
+#      $udom  - Domain name the user is logged in under.
+#      $thisdisfn - Displayable version of the filename.
+sub startpage {
+    my ($r, $uname, $udom, $thisdisfn) = @_;
+    
+    $r->content_type('text/html');
+    $r->send_http_header;
+    
+    $r->print('<html><head><title>LON-CAPA Construction Space</title></head>');
+    
+    $r->print('<body bgcolor="#FFFFFF"><img align=right '.
+	      'src=/adm/lonIcons/lonlogos.gif>');
+    
+    $r->print('<h1>Construction Space Directory <tt>'.
+	      $thisdisfn.'/</tt></h1>');
+    
+    if (($uname ne $ENV{'user.name'}) || ($udom ne $ENV{'user.domain'})) {
+	$r->print('<h3>Co-Author: '.$uname.' at '.$udom.
+		  '</h3>');
+    }
+}
+
+#
+#   Get the title string or "[untitled]" if the file has no title metadata:
+#   Without the latter substitution, it's impossible to examine metadata for
+#   untitled resources.  Resources may be legitimately untitled, to prevent
+#   searches from locating them.
+#
+#   $str = getTitleString($fullname);
+#       $fullname - Fully qualified filename to check.
+#
+sub getTitleString {
+    my $fullname = shift;
+    my $title    = &Apache::lonnet::metadata($fullname, 'title');
+
+    unless ($title) {
+	$title = "[untitled]";
+    }
+    return $title;
+}
+
+
+#
 #  Put out a directory table row:
 #    putdirectory(r, base, here, dirname, modtime)
 #      r       - Apache request object.
@@ -193,8 +256,9 @@
 	    $rblksize,$rblocks)=stat($resdir.'/'.$filename);
 	if ($rmtime>=$cmtime) {
 	    $status='Published';
-	    $title='<a href="/res/'.$targetdir.'/'.$filename.'.meta" target=cat>'.
-		&Apache::lonnet::metadata($targetdir.'/'.$filename,'title').'</a>';
+	    $title='<a href="/res/'.$targetdir.'/'.$filename.
+		'.meta" target=cat>'.
+		getTitleString($targetdir.'/'.$filename, 'title').'</a>';
 	} else {
 	    $status='Modified';
 	    $title='<a href="/res/'.$targetdir.'/'.$filename.'.meta" target=cat>'.
@@ -220,6 +284,31 @@
 	      '<td>'.localtime($cmtime).'</td>'.
 	      '</tr>');
     return OK;
+}
+#
+#   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;