Diff for /loncom/publisher/lonpublisher.pm between versions 1.103 and 1.138

version 1.103, 2002/10/18 13:49:49 version 1.138, 2003/09/25 22:30:06
Line 33 Line 33
 # 11/28,11/29,11/30,12/01,12/02,12/04,12/23 Gerd Kortemeyer  # 11/28,11/29,11/30,12/01,12/02,12/04,12/23 Gerd Kortemeyer
 # 03/23 Guy Albertelli  # 03/23 Guy Albertelli
 # 03/24,03/29,04/03 Gerd Kortemeyer  # 03/24,03/29,04/03 Gerd Kortemeyer
 # 04/16/2001 Scott Harrison  
 # 05/03,05/05,05/07 Gerd Kortemeyer  # 05/03,05/05,05/07 Gerd Kortemeyer
 # 05/28/2001 Scott Harrison  
 # 06/23,08/07,08/11,8/13,8/17,8/18,8/24,9/26,10/16 Gerd Kortemeyer  # 06/23,08/07,08/11,8/13,8/17,8/18,8/24,9/26,10/16 Gerd Kortemeyer
 # 12/04,12/05 Guy Albertelli  # 12/04,12/05 Guy Albertelli
 # 12/05 Gerd Kortemeyer  # 12/05 Gerd Kortemeyer
 # 12/05 Guy Albertelli  # 12/05 Guy Albertelli
 # 12/06,12/07 Gerd Kortemeyer  # 12/06,12/07 Gerd Kortemeyer
 # 12/15,12/16 Scott Harrison  
 # 12/25 Gerd Kortemeyer  # 12/25 Gerd Kortemeyer
 # YEAR=2002  # YEAR=2002
 # 1/16,1/17 Scott Harrison  
 # 1/17 Gerd Kortemeyer  # 1/17 Gerd Kortemeyer
 #  #
 ###  ###
Line 86  invocation by F<loncapa_apache.conf>: Line 82  invocation by F<loncapa_apache.conf>:
   ErrorDocument     500 /adm/errorhandler    ErrorDocument     500 /adm/errorhandler
   </Location>    </Location>
   
   =head1 OVERVIEW
   
   Authors can only write-access the C</~authorname/> space. They can
   copy resources into the resource area through the publication step,
   and move them back through a recover step. Authors do not have direct
   write-access to their resource space.
   
   During the publication step, several events will be
   triggered. Metadata is gathered, where a wizard manages default
   entries on a hierarchical per-directory base: The wizard imports the
   metadata (including access privileges and royalty information) from
   the most recent published resource in the current directory, and if
   that is not available, from the next directory above, etc. The Network
   keeps all previous versions of a resource and makes them available by
   an explicit version number, which is inserted between the file name
   and extension, for example C<foo.2.html>, while the most recent
   version does not carry a version number (C<foo.html>). Servers
   subscribing to a changed resource are notified that a new version is
   available.
   
 =head1 DESCRIPTION  =head1 DESCRIPTION
   
 B<lonpublisher> takes the proper steps to add resources to the LON-CAPA  B<lonpublisher> takes the proper steps to add resources to the LON-CAPA
Line 121  use File::Copy; Line 137  use File::Copy;
 use Apache::Constants qw(:common :http :methods);  use Apache::Constants qw(:common :http :methods);
 use HTML::LCParser;  use HTML::LCParser;
 use Apache::lonxml;  use Apache::lonxml;
 use Apache::lonhomework;  
 use Apache::loncacc;  use Apache::loncacc;
 use DBI;  use DBI;
 use Apache::lonnet();  use Apache::lonnet();
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonmysql;  use Apache::lonmysql;
   use Apache::lonlocal;
   use vars qw(%metadatafields %metadatakeys);
   
 my %addid;  my %addid;
 my %nokey;  my %nokey;
   
 my %metadatafields;  
 my %metadatakeys;  
   
 my $docroot;  my $docroot;
   
 my $cuname;  my $cuname;
Line 197  sub metaeval { Line 211  sub metaeval {
               }                }
               if ($metadatafields{$unikey}) {                if ($metadatafields{$unikey}) {
   my $newentry=$parser->get_text('/'.$entry);    my $newentry=$parser->get_text('/'.$entry);
                   unless (($metadatafields{$unikey}=~/$newentry/) ||                    unless (($metadatafields{$unikey}=~/\Q$newentry\E/) ||
                           ($newentry eq '')) {                            ($newentry eq '')) {
                      $metadatafields{$unikey}.=', '.$newentry;                       $metadatafields{$unikey}.=', '.$newentry;
   }    }
Line 249  sub metaread { Line 263  sub metaread {
     my ($logfile,$fn)=@_;      my ($logfile,$fn)=@_;
     unless (-e $fn) {      unless (-e $fn) {
  print($logfile 'No file '.$fn."\n");   print($logfile 'No file '.$fn."\n");
         return '<br><b>No file:</b> <tt>'.$fn.'</tt>';          return '<br /><b>No file:</b> <tt>'.$fn.'</tt>';
     }      }
     print($logfile 'Processing '.$fn."\n");      print($logfile 'Processing '.$fn."\n");
     my $metastring;      my $metastring;
Line 258  sub metaread { Line 272  sub metaread {
      $metastring=join('',<$metafh>);       $metastring=join('',<$metafh>);
     }      }
     &metaeval($metastring);      &metaeval($metastring);
     return '<br><b>Processed file:</b> <tt>'.$fn.'</tt>';      return '<br /><b>Processed file:</b> <tt>'.$fn.'</tt>';
 }  }
   
 #########################################  #########################################
   
 #########################################  
 #########################################  #########################################
   
 sub coursedependencies {  sub coursedependencies {
Line 313  string which presents the form field (fo Line 325  string which presents the form field (fo
 #########################################  #########################################
 sub textfield {  sub textfield {
     my ($title,$name,$value)=@_;      my ($title,$name,$value)=@_;
     return "\n<p><b>$title:</b><br>".      $title=&mt($title);
       my $uctitle=uc($title);
       return "\n<p><font color=\"#800000\" face=\"helvetica\"><b>$uctitle:".
              "</b></font></p><br />".
            '<input type="text" name="'.$name.'" size=80 value="'.$value.'" />';             '<input type="text" name="'.$name.'" size=80 value="'.$value.'" />';
 }  }
   
Line 324  sub hiddenfield { Line 339  sub hiddenfield {
   
 sub selectbox {  sub selectbox {
     my ($title,$name,$value,$functionref,@idlist)=@_;      my ($title,$name,$value,$functionref,@idlist)=@_;
       $title=&mt($title);
     my $uctitle=uc($title);      my $uctitle=uc($title);
       $value=(split(/\s*,\s*/,$value))[-1];
     my $selout="\n<p><font color=\"#800000\" face=\"helvetica\"><b>$uctitle:".      my $selout="\n<p><font color=\"#800000\" face=\"helvetica\"><b>$uctitle:".
  "</b></font><br />".'<select name="'.$name.'">';   '</b></font></p><br /><select name="'.$name.'">';
     foreach (@idlist) {      foreach (@idlist) {
         $selout.='<option value=\''.$_.'\'';          $selout.='<option value=\''.$_.'\'';
         if ($_ eq $value) {          if ($_ eq $value) {
Line 445  sub get_subscribed_hosts { Line 462  sub get_subscribed_hosts {
     my $srcf=$2;      my $srcf=$2;
     opendir(DIR,$1);      opendir(DIR,$1);
     while ($filename=readdir(DIR)) {      while ($filename=readdir(DIR)) {
  if ($filename=~/$srcf\.(\w+)$/) {   if ($filename=~/\Q$srcf\E\.(\w+)$/) {
     my $subhost=$1;      my $subhost=$1;
     if (($subhost ne 'meta' && $subhost ne 'subscription') &&      if (($subhost ne 'meta' && $subhost ne 'subscription') &&
                 ($subhost ne $Apache::lonnet::perlvar{'lonHostID'})) {                  ($subhost ne $Apache::lonnet::perlvar{'lonHostID'})) {
Line 492  sub get_max_ids_indices { Line 509  sub get_max_ids_indices {
     my $maxindex=10;      my $maxindex=10;
     my $maxid=10;      my $maxid=10;
     my $needsfixup=0;      my $needsfixup=0;
       my $duplicateids=0;
   
       my %allids;
       my %duplicatedids;
   
     my $parser=HTML::LCParser->new($content);      my $parser=HTML::LCParser->new($content);
     my $token;      my $token;
Line 502  sub get_max_ids_indices { Line 523  sub get_max_ids_indices {
  if ($counter eq 'id') {   if ($counter eq 'id') {
     if (defined($token->[2]->{'id'})) {      if (defined($token->[2]->{'id'})) {
  $maxid=($token->[2]->{'id'}>$maxid)?$token->[2]->{'id'}:$maxid;   $maxid=($token->[2]->{'id'}>$maxid)?$token->[2]->{'id'}:$maxid;
    if (exists($allids{$token->[2]->{'id'}})) {
       $duplicateids=1;
       $duplicatedids{$token->[2]->{'id'}}=1;
    } else {
       $allids{$token->[2]->{'id'}}=1;
    }
     } else {      } else {
  $needsfixup=1;   $needsfixup=1;
     }      }
Line 515  sub get_max_ids_indices { Line 542  sub get_max_ids_indices {
     }      }
  }   }
     }      }
     return ($needsfixup,$maxid,$maxindex);      return ($needsfixup,$maxid,$maxindex,$duplicateids,
       (keys(%duplicatedids)));
 }  }
   
 #########################################  #########################################
Line 547  sub get_all_text_unbalanced { Line 575  sub get_all_text_unbalanced {
  } elsif ($token->[0] eq 'E')  {   } elsif ($token->[0] eq 'E')  {
     $result.=$token->[2];      $result.=$token->[2];
  }   }
  if ($result =~ /(.*)$tag(.*)/) {   if ($result =~ /(.*)\Q$tag\E(.*)/s) {
     #&Apache::lonnet::logthis('Got a winner with leftovers ::'.$2);      #&Apache::lonnet::logthis('Got a winner with leftovers ::'.$2);
     #&Apache::lonnet::logthis('Result is :'.$1);      #&Apache::lonnet::logthis('Result is :'.$1);
     $result=$1;      $result=$1;
Line 584  sub fix_ids_and_indices { Line 612  sub fix_ids_and_indices {
  $content=join('',<$org>);   $content=join('',<$org>);
     }      }
   
     my ($needsfixup,$maxid,$maxindex)=&get_max_ids_indices(\$content);      my ($needsfixup,$maxid,$maxindex,$duplicateids,@duplicatedids)=
    &get_max_ids_indices(\$content);
   
       print $logfile ("Got $needsfixup,$maxid,$maxindex,$duplicateids--".
      join(', ',@duplicatedids));
       if ($duplicateids) {
    print $logfile "Duplicate ID(s) exist, ".join(', ',@duplicatedids)."\n";
    my $outstring='<font color="red">Unable to publish file, it contains duplicated ID(s), ID(s) need to be unique. The duplicated ID(s) are: '.join(', ',@duplicatedids).'</font>';
    return ($outstring,1);
       }
     if ($needsfixup) {      if ($needsfixup) {
  print $logfile "Needs ID and/or index fixup\n".   print $logfile "Needs ID and/or index fixup\n".
     "Max ID   : $maxid (min 10)\n".      "Max ID   : $maxid (min 10)\n".
Line 634  sub fix_ids_and_indices { Line 670  sub fix_ids_and_indices {
     }      }
  }   }
  # probably a <randomlabel> image type <label>   # probably a <randomlabel> image type <label>
  if ($lctag eq 'label' && defined($parms{'description'})) {   # or a <image> tag inside <imageresponse>
    if (($lctag eq 'label' && defined($parms{'description'}))
       ||
       ($lctag eq 'image')) {
     my $next_token=$parser[-1]->get_token();      my $next_token=$parser[-1]->get_token();
     if ($next_token->[0] eq 'T') {      if ($next_token->[0] eq 'T') {
  $next_token->[1]=&set_allow(\%allow,$logfile,   $next_token->[1]=&set_allow(\%allow,$logfile,
Line 685  sub fix_ids_and_indices { Line 724  sub fix_ids_and_indices {
  }   }
  if (!$endtag) { if ($token->[4]=~m:/>$:) { $endtag=' /'; }; }   if (!$endtag) { if ($token->[4]=~m:/>$:) { $endtag=' /'; }; }
  $outstring.='<'.$tag.$newparmstring.$endtag.'>';   $outstring.='<'.$tag.$newparmstring.$endtag.'>';
  if ($lctag eq 'm') {   if ($lctag eq 'm' || $lctag eq 'script' 
     $outstring.=&get_all_text_unbalanced('/m',\@parser);                      || $lctag eq 'display' || $lctag eq 'tex') {
       $outstring.=&get_all_text_unbalanced('/'.$lctag,\@parser);
  }   }
     } elsif ($token->[0] eq 'E') {      } elsif ($token->[0] eq 'E') {
  if ($token->[2]) {   if ($token->[2]) {
Line 709  sub fix_ids_and_indices { Line 749  sub fix_ids_and_indices {
  print $logfile "Does not need ID and/or index fixup\n";   print $logfile "Does not need ID and/or index fixup\n";
     }      }
   
     return ($outstring,%allow);      return ($outstring,0,%allow);
 }  }
   
 #########################################  #########################################
Line 779  This is the workhorse function of this m Line 819  This is the workhorse function of this m
 backup copies, performs any automatic processing (prior to publication,  backup copies, performs any automatic processing (prior to publication,
 especially for rat and ssi files),  especially for rat and ssi files),
   
   Returns a 2 element array, the first is the string to be shown to the
   user, the second is an error code, either 1 (an error occured) or 0
   (no error occurred)
   
 I<Additional documentation needed.>  I<Additional documentation needed.>
   
 =cut  =cut
Line 795  sub publish { Line 839  sub publish {
     my %allow=();      my %allow=();
   
     unless ($logfile=Apache::File->new('>>'.$source.'.log')) {      unless ($logfile=Apache::File->new('>>'.$source.'.log')) {
  return    return ('<font color="red">No write permission to user directory, FAIL</font>',1);
          '<font color=red>No write permission to user directory, FAIL</font>';  
     }      }
     print $logfile       print $logfile 
 "\n\n================= Publish ".localtime()." Phase One  ================\n";  "\n\n================= Publish ".localtime()." Phase One  ================\n".$ENV{'user.name'}.'@'.$ENV{'user.domain'}."\n";
   
     if (($style eq 'ssi') || ($style eq 'rat')) {      if (($style eq 'ssi') || ($style eq 'rat') || ($style eq 'prv')) {
 # ------------------------------------------------------- This needs processing  # ------------------------------------------------------- This needs processing
   
 # ----------------------------------------------------------------- Backup Copy  # ----------------------------------------------------------------- Backup Copy
Line 810  sub publish { Line 853  sub publish {
     print $logfile "Copied original file to ".$copyfile."\n";      print $logfile "Copied original file to ".$copyfile."\n";
         } else {          } else {
     print $logfile "Unable to write backup ".$copyfile.':'.$!."\n";      print $logfile "Unable to write backup ".$copyfile.':'.$!."\n";
           return "<font color=red>Failed to write backup copy, $!,FAIL</font>";      return ("<font color=\"red\">Failed to write backup copy, $!,FAIL</font>",1);
         }          }
 # ------------------------------------------------------------- IDs and indices  # ------------------------------------------------------------- IDs and indices
   
  my $outstring;   my ($outstring,$error);
  ($outstring,%allow)=&fix_ids_and_indices($logfile,$source,$target);   ($outstring,$error,%allow)=&fix_ids_and_indices($logfile,$source,
    $target);
    if ($error) { return ($outstring,$error); }
 # ------------------------------------------------------------ Construct Allows  # ------------------------------------------------------------ Construct Allows
           
  $scrout.='<h3>Dependencies</h3>';   $scrout.='<h3>Dependencies</h3>';
Line 826  sub publish { Line 871  sub publish {
            unless ($style eq 'rat') {              unless ($style eq 'rat') { 
               $allowstr.="\n".'<allow src="'.$thisdep.'" />';                $allowstr.="\n".'<allow src="'.$thisdep.'" />';
    }     }
            $scrout.='<br>';             $scrout.='<br />';
            unless ($thisdep=~/\*/) {             unless ($thisdep=~/\*/) {
        $scrout.='<a href="'.$thisdep.'">';         $scrout.='<a href="'.$thisdep.'">';
            }             }
Line 852  sub publish { Line 897  sub publish {
         }          }
         $outstring=~s/\n*(\<\/[^\>]+\>)\s*$/$allowstr\n$1\n/s;          $outstring=~s/\n*(\<\/[^\>]+\>)\s*$/$allowstr\n$1\n/s;
   
   ### FIXME: is this really what we want?
   # I dont' think so, to will corrupt any UTF-8 resources at least, 
   # and any encoding other than ISO-8859-1 will probably break
  #Encode any High ASCII characters   #Encode any High ASCII characters
  $outstring=&HTML::Entities::encode($outstring,"\200-\377");   #$outstring=&HTML::Entities::encode($outstring,"\200-\377");
 # ------------------------------------------------------------- Write modified.  # ------------------------------------------------------------- Write modified.
   
         {          {
           my $org;            my $org;
           unless ($org=Apache::File->new('>'.$source)) {            unless ($org=Apache::File->new('>'.$source)) {
              print $logfile "No write permit to $source\n";               print $logfile "No write permit to $source\n";
              return                return ('<font color="red">'.&mt('No write permission to').
  '<font color="red">No write permission to '.$source.       ' '.$source.
  ', FAIL</font>';       ', '.&mt('FAIL').'</font>',1);
   }    }
           print($org $outstring);            print($org $outstring);
         }          }
Line 879  sub publish { Line 927  sub publish {
      my %oldparmstores=();       my %oldparmstores=();
             
     unless ($batch) {      unless ($batch) {
      $scrout.='<h3>Metadata Information ' .       $scrout.='<h3>'.&mt('Metadata Information').' ' .
        Apache::loncommon::help_open_topic("Metadata_Description")         Apache::loncommon::help_open_topic("Metadata_Description")
        . '</h3>';         . '</h3>';
     }      }
Line 893  sub publish { Line 941  sub publish {
         $metadatafields{'author'}=~s/\s+/ /g;          $metadatafields{'author'}=~s/\s+/ /g;
         $metadatafields{'author'}=~s/\s+$//;          $metadatafields{'author'}=~s/\s+$//;
         $metadatafields{'owner'}=$cuname.'@'.$cudom;          $metadatafields{'owner'}=$cuname.'@'.$cudom;
    $metadatafields{'modifyinguser'}=$ENV{'user.name'}.'@'.
                                    $ENV{'user.domain'};
    $metadatafields{'authorspace'}=$cuname.'@'.$cudom;
   
 # ------------------------------------------------ Check out directory hierachy  # ------------------------------------------------ Check out directory hierachy
   
         my $thisdisfn=$source;          my $thisdisfn=$source;
         $thisdisfn=~s/^\/home\/$cuname\///;          $thisdisfn=~s/^\/home\/\Q$cuname\E\///;
   
         my @urlparts=split(/\//,$thisdisfn);          my @urlparts=split(/\//,$thisdisfn);
         $#urlparts--;          $#urlparts--;
Line 932  sub publish { Line 983  sub publish {
     }      }
   
 # -------------------------------------------------- Parse content for metadata  # -------------------------------------------------- Parse content for metadata
     if ($style eq 'ssi') {      if (($style eq 'ssi') || ($style eq 'prv')) {
         my $oldenv=$ENV{'request.uri'};   my $dir=$source;
    $dir=~s-/[^/]*$--;
         $ENV{'request.uri'}=$target;   my $file=$source;
         $allmeta=Apache::lonxml::xmlparse(undef,'meta',$content);   $file=(split('/',$file))[-1];
         $ENV{'request.uri'}=$oldenv;          $source=&Apache::lonnet::hreflocation($dir,$file);
    $allmeta=&Apache::lonnet::ssi_body($source,('grade_target' => 'meta'));
   
         &metaeval($allmeta);          &metaeval($allmeta);
     }      }
 # ---------------- Find and document discrepancies in the parameters and stores  # ---------------- Find and document discrepancies in the parameters and stores
   
         my $chparms='';      my $chparms='';
         foreach (sort keys %metadatafields) {      foreach (sort keys %metadatafields) {
     if (($_=~/^parameter/) || ($_=~/^stores/)) {   if (($_=~/^parameter/) || ($_=~/^stores/)) {
                 unless ($_=~/\.\w+$/) {       unless ($_=~/\.\w+$/) { 
                    unless ($oldparmstores{$_}) {   unless ($oldparmstores{$_}) {
       print $logfile 'New: '.$_."\n";      print $logfile 'New: '.$_."\n";
                       $chparms.=$_.' ';      $chparms.=$_.' ';
                    }   }
         }      }
             }   }
         }      }
         if ($chparms) {      if ($chparms) {
     $scrout.='<p><b>New parameters or stored values:</b> '.   $scrout.='<p><b>'.&mt('New parameters or stored values').
                      $chparms;      ':</b> '.$chparms.'</p>';
         }      }
   
         $chparms='';      $chparms='';
         foreach (sort keys %oldparmstores) {      foreach (sort keys %oldparmstores) {
     if (($_=~/^parameter/) || ($_=~/^stores/)) {   if (($_=~/^parameter/) || ($_=~/^stores/)) {
                 unless (($metadatafields{$_.'.name'}) ||      unless (($metadatafields{$_.'.name'}) ||
                         ($metadatafields{$_.'.package'}) || ($_=~/\.\w+$/)) {      ($metadatafields{$_.'.package'}) || ($_=~/\.\w+$/)) {
     print $logfile 'Obsolete: '.$_."\n";   print $logfile 'Obsolete: '.$_."\n";
                     $chparms.=$_.' ';   $chparms.=$_.' ';
                 }      }
             }   }
         }      }
         if ($chparms) {      if ($chparms) {
     $scrout.='<p><b>Obsolete parameters or stored values:</b> '.   $scrout.='<p><b>'.&mt('Obsolete parameters or stored values').':</b> '.
                      $chparms;      $chparms.'</p>';
         }      }
   
 # ------------------------------------------------------- Now have all metadata  # ------------------------------------------------------- Now have all metadata
   
         my %keywords=();      my %keywords=();
                   
  if (length($content)<500000) {      if (length($content)<500000) {
     my $textonly=$content;   my $textonly=$content;
             $textonly=~s/\<script[^\<]+\<\/script\>//g;   $textonly=~s/\<script[^\<]+\<\/script\>//g;
             $textonly=~s/\<m\>[^\<]+\<\/m\>//g;   $textonly=~s/\<m\>[^\<]+\<\/m\>//g;
             $textonly=~s/\<[^\>]*\>//g;   $textonly=~s/\<[^\>]*\>//g;
             $textonly=~tr/A-Z/a-z/;   $textonly=~tr/A-Z/a-z/;
             $textonly=~s/[\$\&][a-z]\w*//g;   $textonly=~s/[\$\&][a-z]\w*//g;
             $textonly=~s/[^a-z\s]//g;   $textonly=~s/[^a-z\s]//g;
   
             foreach ($textonly=~m/(\w+)/g) {   foreach ($textonly=~m/(\w+)/g) {
  unless ($nokey{$_}) {      unless ($nokey{$_}) {
                    $keywords{$_}=1;   $keywords{$_}=1;
                 }       } 
             }   }
         }      }
   
                           
             foreach (split(/\W+/,$metadatafields{'keywords'})) {      foreach (split(/\W+/,$metadatafields{'keywords'})) {
  $keywords{$_}=1;   $keywords{$_}=1;
             }      }
 # --------------------------------------------------- Now we also have keywords  # --------------------------------------------------- Now we also have keywords
 # =============================================================================  # =============================================================================
 # INTERACTIVE MODE  # INTERACTIVE MODE
 #  #
    unless ($batch) {      unless ($batch) {
         $scrout.=          $scrout.=
      '<form name="pubform" action="/adm/publish" method="post">'.      '<form name="pubform" action="/adm/publish" method="post">'.
        '<p><input type="submit" value="Finalize Publication" /></p>'.              '<p><input type="submit" value="Finalize Publication" /></p>'.
           &hiddenfield('phase','two').              &hiddenfield('phase','two').
           &hiddenfield('filename',$ENV{'form.filename'}).              &hiddenfield('filename',$ENV{'form.filename'}).
   &hiddenfield('allmeta',&Apache::lonnet::escape($allmeta)).      &hiddenfield('allmeta',&Apache::lonnet::escape($allmeta)).
           &hiddenfield('dependencies',join(',',keys %allow)).              &hiddenfield('dependencies',join(',',keys %allow)).
           &textfield('Title','title',$metadatafields{'title'}).              &textfield('Title','title',$metadatafields{'title'}).
           &textfield('Author(s)','author',$metadatafields{'author'}).              &textfield('Author(s)','author',$metadatafields{'author'}).
   &textfield('Subject','subject',$metadatafields{'subject'});      &textfield('Subject','subject',$metadatafields{'subject'});
   
 # --------------------------------------------------- Scan content for keywords  # --------------------------------------------------- Scan content for keywords
   
         my $keywords_help = Apache::loncommon::help_open_topic("Publishing_Keywords");          my $keywords_help = Apache::loncommon::help_open_topic("Publishing_Keywords");
  my $keywordout=<<"END";   my $keywordout=<<"END";
 <script>  <script>
 function checkAll(field)  function checkAll(field) {
 {  
     for (i = 0; i < field.length; i++)      for (i = 0; i < field.length; i++)
         field[i].checked = true ;          field[i].checked = true ;
 }  }
   
 function uncheckAll(field)  function uncheckAll(field) {
 {  
     for (i = 0; i < field.length; i++)      for (i = 0; i < field.length; i++)
         field[i].checked = false ;          field[i].checked = false ;
 }  }
 </script>  </script>
 <p><b>Keywords: $keywords_help</b>   <p><font color="#800000" face="helvetica"><b>KEYWORDS:</b></font>
 <input type="button" value="check all" onclick="javascript:checkAll(document.pubform.keywords)">    $keywords_help</b>
 <input type="button" value="uncheck all" onclick="javascript:uncheckAll(document.pubform.keywords)">   <input type="button" value="check all" onclick="javascript:checkAll(document.pubform.keywords)" /> 
   <input type="button" value="uncheck all" onclick="javascript:uncheckAll(document.pubform.keywords)" /> 
   </p>
 <br />  <br />
 END  END
         $keywordout.='<table border=2><tr>';   $keywordout.='<table border="2"><tr>';
         my $colcount=0;   my $colcount=0;
   
    foreach (sort keys %keywords) {
       $keywordout.='<td><input type="checkbox" name="keywords" value="'.$_.'"';
       if ($metadatafields{'keywords'}) {
    if ($metadatafields{'keywords'}=~/\Q$_\E/) {
       $keywordout.=' checked="on"';
    }
       } elsif (&Apache::loncommon::keyword($_)) {
    $keywordout.=' checked="on"';
       }
       $keywordout.=' />'.$_.'</td>';
       if ($colcount>10) {
    $keywordout.="</tr><tr>\n";
    $colcount=0;
       }
       $colcount++;
    }
   
             foreach (sort keys %keywords) {  
                 $keywordout.='<td><input type=checkbox name="keywords" value="'.$_.'"';  
                 if ($metadatafields{'keywords'}) {  
                    if ($metadatafields{'keywords'}=~/$_/) {   
                       $keywordout.=' checked';   
                    }  
         } elsif (&Apache::loncommon::keyword($_)) {  
             $keywordout.=' checked';  
                 }   
                 $keywordout.='>'.$_.'</td>';  
                 if ($colcount>10) {  
     $keywordout.="</tr><tr>\n";  
                     $colcount=0;  
                 }  
                 $colcount++;  
             }  
           
  $keywordout.='</tr></table>';   $keywordout.='</tr></table>';
   
         $scrout.=$keywordout;   $scrout.=$keywordout;
   
         $scrout.=&textfield('Additional Keywords','addkey','');   $scrout.=&textfield('Additional Keywords','addkey','');
   
         $scrout.=&textfield('Notes','notes',$metadatafields{'notes'});   $scrout.=&textfield('Notes','notes',$metadatafields{'notes'});
   
         $scrout.=   $scrout.=
              '<p><b>Abstract:</b><br><textarea cols=80 rows=5 name=abstract>'.      "\n<p><font color=\"#800000\" face=\"helvetica\"><b>ABSTRACT:".
               $metadatafields{'abstract'}.'</textarea>';      "</b></font></p><br />".
       '<textarea cols="80" rows="5" name="abstract">'.
       $metadatafields{'abstract'}.'</textarea></p>';
   
  $source=~/\.(\w+)$/;   $source=~/\.(\w+)$/;
   
  $scrout.=&hiddenfield('mime',$1);   $scrout.=&hiddenfield('mime',$1);
   
         $scrout.=&selectbox('Language','language',   my $defaultlanguage=$metadatafields{'language'};
                             $metadatafields{'language'},   $defaultlanguage =~ s/\s*notset\s*//g;
    $defaultlanguage =~ s/^,\s*//g;
    $defaultlanguage =~ s/,\s*$//g;
   
    $scrout.=&selectbox('Language','language',
       $defaultlanguage,
     \&Apache::loncommon::languagedescription,      \&Apache::loncommon::languagedescription,
     (&Apache::loncommon::languageids),      (&Apache::loncommon::languageids),
      );     );
   
         unless ($metadatafields{'creationdate'}) {   unless ($metadatafields{'creationdate'}) {
     $metadatafields{'creationdate'}=time;      $metadatafields{'creationdate'}=time;
         }   }
         $scrout.=&hiddenfield('creationdate',   $scrout.=&hiddenfield('creationdate',
               &Apache::loncommon::unsqltime($metadatafields{'creationdate'}));        &Apache::loncommon::unsqltime($metadatafields{'creationdate'}));
   
    $scrout.=&hiddenfield('lastrevisiondate',time);
   
         $scrout.=&hiddenfield('lastrevisiondate',time);  
   
      
  $scrout.=&textfield('Publisher/Owner','owner',   $scrout.=&textfield('Publisher/Owner','owner',
                             $metadatafields{'owner'});      $metadatafields{'owner'});
   
 # -------------------------------------------------- Correct copyright for rat.  # -------------------------------------------------- Correct copyright for rat.
     if ($style eq 'rat') {          my $defaultoption=$metadatafields{'copyright'};
  if ($metadatafields{'copyright'} eq 'public') {           unless ($defaultoption) { $defaultoption='default'; }
     delete $metadatafields{'copyright'};   unless ($style eq 'prv') {
       if ($style eq 'rat') {
    if ($metadatafields{'copyright'} eq 'public') { 
       delete $metadatafields{'copyright'};
                       $defaultoption='default';
    }
    $scrout.=&selectbox('Copyright/Distribution','copyright',
       $defaultoption,
       \&Apache::loncommon::copyrightdescription,
       (grep !/^public$/,(&Apache::loncommon::copyrightids)));
       } else {
    $scrout.=&selectbox('Copyright/Distribution','copyright',
       $defaultoption,
       \&Apache::loncommon::copyrightdescription,
       (&Apache::loncommon::copyrightids));
       }
       
       my $copyright_help =
    Apache::loncommon::help_open_topic('Publishing_Copyright');
       $scrout =~ s/DISTRIBUTION:/'DISTRIBUTION: ' . $copyright_help/ge;
       $scrout.=&textfield('Custom Distribution File','customdistributionfile',
    $metadatafields{'customdistributionfile'}).
       $copyright_help;
       my $uctitle=uc(&mt('Obsolete'));
               $scrout.=
    "\n<p><font color=\"#800000\" face=\"helvetica\"><b>$uctitle:".
    '</b></font> <input type="checkbox" name="obsolete" ';
       if ($metadatafields{'obsolete'}) {
    $scrout.=' checked="1" ';
       }
       $scrout.='/ ></p>'.
    &textfield('Suggested Replacement for Obsolete File',
       'obsoletereplacement',
       $metadatafields{'obsoletereplacement'});
    } else {
       $scrout.=&hiddenfield('copyright','private');
  }   }
         $scrout.=&selectbox('Copyright/Distribution','copyright',   return ($scrout.'<p><input type="submit" value="'.
                             $metadatafields{'copyright'},   &mt('Finalize Publication').'" /></p></form>',0);
     \&Apache::loncommon::copyrightdescription,  
      (grep !/^public$/,(&Apache::loncommon::copyrightids)));  
     }  
     else {  
         $scrout.=&selectbox('Copyright/Distribution','copyright',  
                             $metadatafields{'copyright'},  
     \&Apache::loncommon::copyrightdescription,  
      (&Apache::loncommon::copyrightids));  
     }  
   
     my $copyright_help =  
         Apache::loncommon::help_open_topic('Publishing_Copyright');  
     $scrout =~ s/DISTRIBUTION:/'DISTRIBUTION: ' . $copyright_help/ge;  
     return $scrout.  
         '<p><input type="submit" value="Finalize Publication" /></p></form>';  
 # =============================================================================  # =============================================================================
 # BATCH MODE  # BATCH MODE
 #  #
   } else {      } else {
 # Transfer metadata directly to environment for stage 2  # Transfer metadata directly to environment for stage 2
     foreach (keys %metadatafields) {   foreach (keys %metadatafields) {
  $ENV{'form.'.$_}=$metadatafields{$_};      $ENV{'form.'.$_}=$metadatafields{$_};
    }
    $ENV{'form.addkey'}='';
    $ENV{'form.keywords'}='';
    foreach (keys %keywords) {
       if ($metadatafields{'keywords'}) {
    if ($metadatafields{'keywords'}=~/\Q$_\E/) { 
       $ENV{'form.keywords'}.=$_.','; 
    }
       } elsif (&Apache::loncommon::keyword($_)) {
    $ENV{'form.keywords'}.=$_.',';
       }
    }
    $ENV{'form.keywords'}=~s/\,$//;
    unless ($ENV{'form.creationdate'}) { $ENV{'form.creationdate'}=time; }
    $ENV{'form.lastrevisiondate'}=time;
    if ((($style eq 'rat') && ($ENV{'form.copyright'} eq 'public')) ||
       (!$ENV{'form.copyright'})) { 
       $ENV{'form.copyright'}='default';
    }
    $ENV{'form.allmeta'}=&Apache::lonnet::escape($allmeta);
    return ($scrout,0);
     }      }
     $ENV{'form.addkey'}='';  
     $ENV{'form.keywords'}='';  
     foreach (keys %keywords) {  
         if ($metadatafields{'keywords'}) {  
            if ($metadatafields{'keywords'}=~/$_/) {   
               $ENV{'form.keywords'}.=$_.',';   
            }  
  } elsif (&Apache::loncommon::keyword($_)) {  
     $ENV{'form.keywords'}.=$_.',';  
         }   
     }  
     $ENV{'form.keywords'}=~s/\,$//;  
     unless ($ENV{'form.creationdate'}) { $ENV{'form.creationdate'}=time; }  
     $ENV{'form.lastrevisiondate'}=time;  
     if ((($style eq 'rat') && ($ENV{'form.copyright'} eq 'public')) ||  
         (!$ENV{'form.copyright'})) {   
  $ENV{'form.copyright'}='default';  
     }   
     $ENV{'form.allmeta'}=&Apache::lonnet::escape($allmeta);  
     return $scrout;  
   }  
 }  }
   
 #########################################  #########################################
Line 1186  sub phasetwo { Line 1265  sub phasetwo {
     my ($r,$source,$target,$style,$distarget,$batch)=@_;      my ($r,$source,$target,$style,$distarget,$batch)=@_;
     $source=~s/\/+/\//g;      $source=~s/\/+/\//g;
     $target=~s/\/+/\//g;      $target=~s/\/+/\//g;
   
       if ($target=~/\_\_\_/) {
    $r->print(
    '<font color="red">'.&mt('Unsupported character combination').
     ' "<tt>___</tt>" '.&mt('in filename, FAIL').'</font>');
           return 0;
       }
     $distarget=~s/\/+/\//g;      $distarget=~s/\/+/\//g;
     my $logfile;      my $logfile;
     unless ($logfile=Apache::File->new('>>'.$source.'.log')) {      unless ($logfile=Apache::File->new('>>'.$source.'.log')) {
  return    $r->print(
             '<font color=red>No write permission to user directory, FAIL</font>';          '<font color="red">'.
    &mt('No write permission to user directory, FAIL').'</font>');
           return 0;
     }      }
     print $logfile       print $logfile 
         "\n================= Publish ".localtime()." Phase Two  ================\n";          "\n================= Publish ".localtime()." Phase Two  ================\n".$ENV{'user.name'}.'@'.$ENV{'user.domain'}."\n";
           
     %metadatafields=();      %metadatafields=();
     %metadatakeys=();      %metadatakeys=();
Line 1211  sub phasetwo { Line 1299  sub phasetwo {
     $metadatafields{'lastrevisiondate'}=$ENV{'form.lastrevisiondate'};      $metadatafields{'lastrevisiondate'}=$ENV{'form.lastrevisiondate'};
     $metadatafields{'owner'}=$ENV{'form.owner'};      $metadatafields{'owner'}=$ENV{'form.owner'};
     $metadatafields{'copyright'}=$ENV{'form.copyright'};      $metadatafields{'copyright'}=$ENV{'form.copyright'};
       $metadatafields{'customdistributionfile'}=
                                    $ENV{'form.customdistributionfile'};
       $metadatafields{'obsolete'}=$ENV{'form.obsolete'};
       $metadatafields{'obsoletereplacement'}=
                           $ENV{'form.obsoletereplacement'};
     $metadatafields{'dependencies'}=$ENV{'form.dependencies'};      $metadatafields{'dependencies'}=$ENV{'form.dependencies'};
           
     my $allkeywords=$ENV{'form.addkey'};      my $allkeywords=$ENV{'form.addkey'};
Line 1230  sub phasetwo { Line 1323  sub phasetwo {
         my $mfh;          my $mfh;
         unless ($mfh=Apache::File->new('>'.$source.'.meta')) {          unless ($mfh=Apache::File->new('>'.$source.'.meta')) {
             return               return 
                 '<font color=red>Could not write metadata, FAIL</font>';                  '<font color="red">'.&mt('Could not write metadata, FAIL').
    '</font>';
         }          }
         foreach (sort keys %metadatafields) {          foreach (sort keys %metadatafields) {
             unless ($_=~/\./) {              unless ($_=~/\./) {
Line 1249  sub phasetwo { Line 1343  sub phasetwo {
                         .'</'.$tag.'>';                          .'</'.$tag.'>';
             }              }
         }          }
         $r->print('<p>Wrote Metadata');          $r->print('<p>'.&mt('Wrote Metadata').'</p>');
         print $logfile "\nWrote metadata";          print $logfile "\nWrote metadata";
     }      }
           
Line 1260  sub phasetwo { Line 1354  sub phasetwo {
     unless ($metadatafields{'copyright'} eq 'priv') {      unless ($metadatafields{'copyright'} eq 'priv') {
         my ($error,$success) = &store_metadata(\%metadatafields);          my ($error,$success) = &store_metadata(\%metadatafields);
         if ($success) {          if ($success) {
             $r->print('<p>Synchronized SQL metadata database');              $r->print('<p>'.&mt('Synchronized SQL metadata database').'</p>');
             print $logfile "\nSynchronized SQL metadata database";              print $logfile "\nSynchronized SQL metadata database";
         } else {          } else {
             $r->print($error);              $r->print($error);
             print $logfile "\n".$error;              print $logfile "\n".$error;
         }          }
     } else {      } else {
         $r->print('<p>Private Publication - did not synchronize database');          $r->print('<p>'.
        &mt('Private Publication - did not synchronize database').'</p>');
         print $logfile "\nPrivate: Did not synchronize data into ".          print $logfile "\nPrivate: Did not synchronize data into ".
             "SQL metadata database";              "SQL metadata database";
     }      }
Line 1282  sub phasetwo { Line 1377  sub phasetwo {
         my $srcd=$1;          my $srcd=$1;
         unless ($srcd=~/^\/home\/httpd\/html\/res/) {          unless ($srcd=~/^\/home\/httpd\/html\/res/) {
             print $logfile "\nPANIC: Target dir is ".$srcd;              print $logfile "\nPANIC: Target dir is ".$srcd;
             return "<font color=red>Invalid target directory, FAIL</font>";              return "<font color=\"red\">Invalid target directory, FAIL</font>";
         }          }
         opendir(DIR,$srcd);          opendir(DIR,$srcd);
         while ($filename=readdir(DIR)) {          while ($filename=readdir(DIR)) {
Line 1290  sub phasetwo { Line 1385  sub phasetwo {
                 unlink($srcd.'/'.$filename);                  unlink($srcd.'/'.$filename);
                 unlink($srcd.'/'.$filename.'.meta');                  unlink($srcd.'/'.$filename.'.meta');
             } else {              } else {
                 if ($filename=~/$srcf\.(\d+)\.$srct$/) {                  if ($filename=~/\Q$srcf\E\.(\d+)\.\Q$srct\E$/) {
                     $maxversion=($1>$maxversion)?$1:$maxversion;                      $maxversion=($1>$maxversion)?$1:$maxversion;
                 }                  }
             }              }
         }          }
         closedir(DIR);          closedir(DIR);
         $maxversion++;          $maxversion++;
         $r->print('<p>Creating old version '.$maxversion);          $r->print('<p>Creating old version '.$maxversion.'</p>');
         print $logfile "\nCreating old version ".$maxversion;          print $logfile "\nCreating old version ".$maxversion."\n";
                   
         my $copyfile=$srcd.'/'.$srcf.'.'.$maxversion.'.'.$srct;          my $copyfile=$srcd.'/'.$srcf.'.'.$maxversion.'.'.$srct;
                   
         if (copy($target,$copyfile)) {          if (copy($target,$copyfile)) {
     print $logfile "Copied old target to ".$copyfile."\n";      print $logfile "Copied old target to ".$copyfile."\n";
             $r->print('<p>Copied old target file');              $r->print('<p>'.&mt('Copied old target file').'</p>');
         } else {          } else {
     print $logfile "Unable to write ".$copyfile.':'.$!."\n";      print $logfile "Unable to write ".$copyfile.':'.$!."\n";
             return "<font color=red>Failed to copy old target, $!, FAIL</font>";              return "<font color=\"red\">".&mt('Failed to copy old target').
    ", $!, ".&mt('FAIL')."</font>";
         }          }
                   
 # --------------------------------------------------------------- Copy Metadata  # --------------------------------------------------------------- Copy Metadata
Line 1316  sub phasetwo { Line 1412  sub phasetwo {
                   
         if (copy($target.'.meta',$copyfile)) {          if (copy($target.'.meta',$copyfile)) {
     print $logfile "Copied old target metadata to ".$copyfile."\n";      print $logfile "Copied old target metadata to ".$copyfile."\n";
             $r->print('<p>Copied old metadata')              $r->print('<p>'.&mt('Copied old metadata').'</p>')
         } else {          } else {
     print $logfile "Unable to write metadata ".$copyfile.':'.$!."\n";      print $logfile "Unable to write metadata ".$copyfile.':'.$!."\n";
             if (-e $target.'.meta') {              if (-e $target.'.meta') {
                 return                   return 
                     "<font color=red>Failed to write old metadata copy, $!, FAIL</font>";                      "<font color=\"red\">".
   &mt('Failed to write old metadata copy').", $!, ".&mt('FAIL')."</font>";
     }      }
         }          }
                   
                   
     } else {      } else {
         $r->print('<p>Initial version');          $r->print('<p>'.&mt('Initial version').'</p>');
         print $logfile "\nInitial version";          print $logfile "\nInitial version";
     }      }
   
Line 1342  sub phasetwo { Line 1439  sub phasetwo {
         $path.="/$parts[$count]";          $path.="/$parts[$count]";
         if ((-e $path)!=1) {          if ((-e $path)!=1) {
             print $logfile "\nCreating directory ".$path;              print $logfile "\nCreating directory ".$path;
             $r->print('<p>Created directory '.$parts[$count]);              $r->print('<p>'.&mt('Created directory').' '.$parts[$count].'</p>');
             mkdir($path,0777);              mkdir($path,0777);
         }          }
     }      }
           
     if (copy($source,$copyfile)) {      if (copy($source,$copyfile)) {
         print $logfile "\nCopied original source to ".$copyfile."\n";          print $logfile "\nCopied original source to ".$copyfile."\n";
         $r->print('<p>Copied source file');          $r->print('<p>'.&mt('Copied source file').'</p>');
     } else {      } else {
         print $logfile "\nUnable to write ".$copyfile.':'.$!."\n";          print $logfile "\nUnable to write ".$copyfile.':'.$!."\n";
         return "<font color=red>Failed to copy source, $!, FAIL</font>";          return "<font color=\"red\">".
       &mt('Failed to copy source').", $!, ".&mt('FAIL')."</font>";
     }      }
           
 # --------------------------------------------------------------- Copy Metadata  # --------------------------------------------------------------- Copy Metadata
Line 1361  sub phasetwo { Line 1459  sub phasetwo {
           
     if (copy($source.'.meta',$copyfile)) {      if (copy($source.'.meta',$copyfile)) {
         print $logfile "\nCopied original metadata to ".$copyfile."\n";          print $logfile "\nCopied original metadata to ".$copyfile."\n";
         $r->print('<p>Copied metadata');          $r->print('<p>'.&mt('Copied metadata').'</p>');
     } else {      } else {
         print $logfile "\nUnable to write metadata ".$copyfile.':'.$!."\n";          print $logfile "\nUnable to write metadata ".$copyfile.':'.$!."\n";
         return           return 
             "<font color=red>Failed to write metadata copy, $!, FAIL</font>";              "<font color=\"red\">".&mt('Failed to write metadata copy').", $!, ".&mt('FAIL')."</font>";
     }      }
     $r->rflush;      $r->rflush;
 # --------------------------------------------------- Send update notifications  # --------------------------------------------------- Send update notifications
   
     my @subscribed=&get_subscribed_hosts($target);      my @subscribed=&get_subscribed_hosts($target);
     foreach my $subhost (@subscribed) {      foreach my $subhost (@subscribed) {
  $r->print('<p>Notifying host '.$subhost.':');$r->rflush;   $r->print('<p>'.&mt('Notifying host').' '.$subhost.':');$r->rflush;
  print $logfile "\nNotifying host ".$subhost.':';   print $logfile "\nNotifying host ".$subhost.':';
  my $reply=&Apache::lonnet::critical('update:'.$target,$subhost);   my $reply=&Apache::lonnet::critical('update:'.$target,$subhost);
  $r->print($reply.'<br />');$r->rflush;   $r->print($reply.'</p><br />');$r->rflush;
  print $logfile $reply;   print $logfile $reply;
     }      }
           
Line 1383  sub phasetwo { Line 1481  sub phasetwo {
   
     my @subscribedmeta=&get_subscribed_hosts("$target.meta");      my @subscribedmeta=&get_subscribed_hosts("$target.meta");
     foreach my $subhost (@subscribedmeta) {      foreach my $subhost (@subscribedmeta) {
  $r->print('<p>Notifying host for metadata only '.$subhost.':');$r->rflush;   $r->print('<p>'.
   &mt('Notifying host for metadata only').' '.$subhost.':');$r->rflush;
  print $logfile "\nNotifying host for metadata only ".$subhost.':';   print $logfile "\nNotifying host for metadata only ".$subhost.':';
  my $reply=&Apache::lonnet::critical('update:'.$target.'.meta',   my $reply=&Apache::lonnet::critical('update:'.$target.'.meta',
     $subhost);      $subhost);
  $r->print($reply.'<br />');$r->rflush;   $r->print($reply.'</p><br />');$r->rflush;
  print $logfile $reply;   print $logfile $reply;
     }      }
           
Line 1395  sub phasetwo { Line 1494  sub phasetwo {
     my %courses=&coursedependencies($target);      my %courses=&coursedependencies($target);
     my $now=time;      my $now=time;
     foreach (keys %courses) {      foreach (keys %courses) {
  $r->print('<p>Notifying course '.$_.':');$r->rflush;   $r->print('<p>'.&mt('Notifying course').' '.$_.':');$r->rflush;
  print $logfile "\nNotifying host ".$_.':';   print $logfile "\nNotifying host ".$_.':';
         my ($cdom,$cname)=split(/\_/,$_);          my ($cdom,$cname)=split(/\_/,$_);
  my $reply=&Apache::lonnet::cput   my $reply=&Apache::lonnet::cput
                   ('versionupdate',{$target => $now},$cdom,$cname);                    ('versionupdate',{$target => $now},$cdom,$cname);
  $r->print($reply.'<br />');$r->rflush;   $r->print($reply.'</p><br />');$r->rflush;
  print $logfile $reply;   print $logfile $reply;
     }      }
 # ------------------------------------------------ Provide link to new resource  # ------------------------------------------------ Provide link to new resource
     unless ($batch) {      unless ($batch) {
         my $thisdistarget=$target;          my $thisdistarget=$target;
         $thisdistarget=~s/^$docroot//;          $thisdistarget=~s/^\Q$docroot\E//;
                   
         my $thissrc=$source;          my $thissrc=$source;
         $thissrc=~s/^\/home\/(\w+)\/public_html/\/priv\/$1/;          $thissrc=~s/^\/home\/(\w+)\/public_html/\/priv\/$1/;
Line 1416  sub phasetwo { Line 1515  sub phasetwo {
                   
                   
         $r->print(          $r->print(
            '<hr><a href="'.$thisdistarget.'"><font size="+2">'.             '<hr /><a href="'.$thisdistarget.'"><font size="+2">'.
            'View Published Version</font></a>'.             &mt('View Published Version').'</font></a>'.
            '<p><a href="'.$thissrc.'"><font size=+2>Back to Source</font></a>'.             '<p><a href="'.$thissrc.'"><font size=+2>'.
     &mt('Back to Source').'</font></a></p>'.
            '<p><a href="'.$thissrcdir.             '<p><a href="'.$thissrcdir.
                    '"><font size="+2">Back to Source Directory</font></a>');                     '"><font size="+2">'.
     &mt('Back to Source Directory').'</font></a></p>');
     }      }
 }  }
   
Line 1428  sub phasetwo { Line 1529  sub phasetwo {
   
 sub batchpublish {  sub batchpublish {
     my ($r,$srcfile,$targetfile)=@_;      my ($r,$srcfile,$targetfile)=@_;
       #publication pollutes %ENV with form.* values
       my %oldENV=%ENV;
     $srcfile=~s/\/+/\//g;      $srcfile=~s/\/+/\//g;
     $targetfile=~s/\/+/\//g;      $targetfile=~s/\/+/\//g;
     my $thisdisfn=$srcfile;      my $thisdisfn=$srcfile;
Line 1436  sub batchpublish { Line 1539  sub batchpublish {
   
     my $docroot=$r->dir_config('lonDocRoot');      my $docroot=$r->dir_config('lonDocRoot');
     my $thisdistarget=$targetfile;      my $thisdistarget=$targetfile;
     $thisdistarget=~s/^$docroot//;      $thisdistarget=~s/^\Q$docroot\E//;
   
   
     undef %metadatafields;      undef %metadatafields;
Line 1449  sub batchpublish { Line 1552  sub batchpublish {
   
       my $thisembstyle=&Apache::loncommon::fileembstyle($thistype);        my $thisembstyle=&Apache::loncommon::fileembstyle($thistype);
             
     $r->print('<h2>Publishing <tt>'.$thisdisfn.'</tt></h2>');      $r->print('<h2>'.&mt('Publishing').' <tt>'.$thisdisfn.'</tt></h2>');
   
 # phase one takes  # phase one takes
 #  my ($source,$target,$style,$batch)=@_;  #  my ($source,$target,$style,$batch)=@_;
     $r->print('<p>'.&publish($srcfile,$targetfile,$thisembstyle,1).'</p>');      my ($outstring,$error)=&publish($srcfile,$targetfile,$thisembstyle,1);
       $r->print('<p>'.$outstring.'</p>');
 # phase two takes  # phase two takes
 # my ($source,$target,$style,$distarget,batch)=@_;  # my ($source,$target,$style,$distarget,batch)=@_;
 # $ENV{'form.allmeta'},$ENV{'form.title'},$ENV{'form.author'},...  # $ENV{'form.allmeta'},$ENV{'form.title'},$ENV{'form.author'},...
     $r->print('<p>');      if (!$error) {
     &phasetwo($r,$srcfile,$targetfile,$thisembstyle,$thisdistarget,1);   $r->print('<p>');
     $r->print('</p>');   &phasetwo($r,$srcfile,$targetfile,$thisembstyle,$thisdistarget,1);
    $r->print('</p>');
       }
       %ENV=%oldENV;
     return '';      return '';
 }  }
   
Line 1500  sub publishdirectory { Line 1607  sub publishdirectory {
         $ruid,$rgid,$rrdev,$rsize,          $ruid,$rgid,$rrdev,$rsize,
         $ratime,$rmtime,$rctime,          $ratime,$rmtime,$rctime,
         $rblksize,$rblocks)=stat($resdir.'/'.$filename);          $rblksize,$rblocks)=stat($resdir.'/'.$filename);
         if ($rmtime<$cmtime) {          if (($rmtime<$cmtime) || ($ENV{'form.forcerepub'})) {
 # previously published, modified now  # previously published, modified now
     $publishthis=1;      $publishthis=1;
                 }                  }
Line 1562  sub handler { Line 1669  sub handler {
   my $r=shift;    my $r=shift;
   
   if ($r->header_only) {    if ($r->header_only) {
      $r->content_type('text/html');       &Apache::loncommon::content_type($r,'text/html');
      $r->send_http_header;       $r->send_http_header;
      return OK;       return OK;
   }    }
Line 1574  sub handler { Line 1681  sub handler {
   
 # -------------------------------------------------------------- Check filename  # -------------------------------------------------------------- Check filename
   
   my $fn=$ENV{'form.filename'};    my $fn=&Apache::lonnet::unescape($ENV{'form.filename'});
   
       
   unless ($fn) {     unless ($fn) { 
Line 1655  unless ($ENV{'form.phase'} eq 'two') { Line 1762  unless ($ENV{'form.phase'} eq 'two') {
   
 # ---------------------------------------------------------- Start page output.  # ---------------------------------------------------------- Start page output.
   
   $r->content_type('text/html');    &Apache::loncommon::content_type($r,'text/html');
   $r->send_http_header;    $r->send_http_header;
   
   $r->print('<html><head><title>LON-CAPA Publishing</title></head>');    $r->print('<html><head><title>LON-CAPA Publishing</title></head>');
Line 1670  unless ($ENV{'form.phase'} eq 'two') { Line 1777  unless ($ENV{'form.phase'} eq 'two') {
   $thistarget=~s/\/public\_html//;    $thistarget=~s/\/public\_html//;
   
   my $thisdistarget=$thistarget;    my $thisdistarget=$thistarget;
   $thisdistarget=~s/^$docroot//;    $thisdistarget=~s/^\Q$docroot\E//;
   
   my $thisdisfn=$thisfn;    my $thisdisfn=$thisfn;
   $thisdisfn=~s/^\/home\/$cuname\/public_html\///;    $thisdisfn=~s/^\/home\/\Q$cuname\E\/public_html\///;
   
   if ($fn=~/\/$/) {    if ($fn=~/\/$/) {
 # -------------------------------------------------------- This is a directory  # -------------------------------------------------------- This is a directory
       &publishdirectory($r,$fn,$thisdisfn);        &publishdirectory($r,$fn,$thisdisfn);
         $r->print('<hr><font size="+2">'.&mt('Done').'</font><br><a href="/priv/'
    .$cuname.'/'.$thisdisfn
    .'">'.&mt('Return to Directory').'</a>');
   
   
   } else {    } else {
 # ---------------------- Evaluate individual file, and then output information.  # ---------------------- Evaluate individual file, and then output information.
       $thisfn=~/\.(\w+)$/;        $thisfn=~/\.(\w+)$/;
       my $thistype=$1;        my $thistype=$1;
       my $thisembstyle=&Apache::loncommon::fileembstyle($thistype);        my $thisembstyle=&Apache::loncommon::fileembstyle($thistype);
         $r->print('<h2>'.&mt('Publishing').' '.
    &Apache::loncommon::filedescription($thistype).' <tt>');
   
       $r->print('<h2>Publishing '.        $r->print(<<ENDCAPTION);
         &Apache::loncommon::filedescription($thistype).' <tt>'.  <a href='javascript:void(window.open("/~$cuname/$thisdisfn","cat","height=300,width=500,scrollbars=1,resizable=1,menubar=0,location=1"))'>
         '<a href="/~'.$cuname.'/'.$thisdisfn.'" target="cat">'.$thisdisfn.  $thisdisfn</a>
         '</a></tt></h2><b>Target:</b> <tt>'.$thisdistarget.'</tt><p>');  ENDCAPTION
         $r->print(
           '</tt></h2><b>'.&mt('Target').':</b> <tt>'.$thisdistarget.'</tt><br />');
         
       if (($cuname ne $ENV{'user.name'}) || ($cudom ne $ENV{'user.domain'})) {        if (($cuname ne $ENV{'user.name'}) || ($cudom ne $ENV{'user.domain'})) {
           $r->print('<h3><font color="red">Co-Author: '.$cuname.' at '.$cudom.            $r->print('<h3><font color="red">'.&mt('Co-Author').': '.$cuname.&mt(' at ').$cudom.
     '</font></h3>');      '</font></h3>');
       }        }
   
       if (&Apache::loncommon::fileembstyle($thistype) eq 'ssi') {        if (&Apache::loncommon::fileembstyle($thistype) eq 'ssi') {
           $r->print('<br /><a href="/adm/diff?filename=/~'.$cuname.'/'.            $r->print(<<ENDDIFF);
                     $thisdisfn.  <br />
    '&versionone=priv" target="cat">Diffs with Current Version</a><p>');  <a href='javascript:void(window.open("/adm/diff?filename=/~$cuname/$thisdisfn&versiontwo=priv","cat","height=300,width=500,scrollbars=1,resizable=1,menubar=0,location=1"))'>
   ENDDIFF
             $r->print(&mt('Diffs with Current Version').'</a><br />');
       }        }
       
 # ------------------ Publishing from $thisfn to $thistarget with $thisembstyle.  # ------------------ Publishing from $thisfn to $thistarget with $thisembstyle.
   
        unless ($ENV{'form.phase'} eq 'two') {         unless ($ENV{'form.phase'} eq 'two') {
          $r->print(     my ($outstring,$error)=&publish($thisfn,$thistarget,$thisembstyle);
           '<hr />'.&publish($thisfn,$thistarget,$thisembstyle));     $r->print('<hr />'.$outstring);
        } else {         } else {
            $r->print('<hr />');             $r->print('<hr />');
            &phasetwo($r,$thisfn,$thistarget,$thisembstyle,$thisdistarget);              &phasetwo($r,$thisfn,$thistarget,$thisembstyle,$thisdistarget); 
        }           }
   
   }    }
   $r->print('</body></html>');    $r->print('</body></html>');
   
Line 1724  __END__ Line 1840  __END__
   
 =back  =back
   
   =back
   
 =cut  =cut
   

Removed from v.1.103  
changed lines
  Added in v.1.138


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