Diff for /loncom/interface/lonrss.pm between versions 1.8 and 1.25

version 1.8, 2006/03/15 21:43:20 version 1.25, 2006/06/03 21:05:04
Line 29 Line 29
 package Apache::lonrss;  package Apache::lonrss;
   
 use strict;  use strict;
   use LONCAPA;
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::lonnet;  use Apache::lonnet;
Line 36  use Apache::lontexconvert; Line 37  use Apache::lontexconvert;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonhtmlcommon;  use Apache::lonhtmlcommon;
   
   
 sub filterfeedname {  sub filterfeedname {
     my $filename=shift;      my $filename=shift;
     $filename=~s/(\_rss\.html|\.rss)$//;      $filename=~s/(\_rss\.html|\.rss)$//;
     $filename=~s/\W//g;      $filename=~s/\W//g;
       $filename=~s/\_rssfeed$//;
       $filename=~s/^nohist\_//;
     return $filename;      return $filename;
 }  }
   
Line 51  sub displayfeedname { Line 55  sub displayfeedname {
     my ($rawname,$uname,$udom)=@_;      my ($rawname,$uname,$udom)=@_;
     my $filterfilename=&filterfeedname($rawname);      my $filterfilename=&filterfeedname($rawname);
 # do we have a stored name?  # do we have a stored name?
     my %stored=&Apache::lonnet::get('nohist_all_rss_feeds',[$filterfilename],$udom,$uname);      my %stored=&Apache::lonnet::get('nohist_all_rss_feeds',[$filterfilename,'feed_display_option_'.$filterfilename],$udom,$uname);
     if ($stored{$filterfilename}) { return $stored{$filterfilename}; }      if ($stored{$filterfilename}) { return ($stored{$filterfilename},$stored{'feed_display_option_'.$filterfilename}); }
 # no, construct a name  # no, construct a name
     my $name=$filterfilename;       my $name=$filterfilename; 
     if ($name=~/^CourseBlog/) {      if ($name=~/^CourseBlog/) {
Line 63  sub displayfeedname { Line 67  sub displayfeedname {
     } else {      } else {
  $name=~s/\_/ /g;   $name=~s/\_/ /g;
     }      }
     return $name;      return ($name,$stored{'feed_display_option_'.$filterfilename});
 }  }
   
 sub renamefeed {  sub namefeed {
     my ($rawname,$uname,$udom,$newname)=@_;      my ($rawname,$uname,$udom,$newname)=@_;
     return &Apache::lonnet::put('nohist_all_rss_feeds',      return &Apache::lonnet::put('nohist_all_rss_feeds',
  { &filterfeedname($rawname) => $newname },   { &filterfeedname($rawname) => $newname },
  $udom,$uname);   $udom,$uname);
 }  }
   
   sub changefeeddisplay {
       my ($rawname,$uname,$udom,$newstatus)=@_;
       return &Apache::lonnet::put('nohist_all_rss_feeds',
    { 'feed_display_option_'.&filterfeedname($rawname) => $newstatus },
    $udom,$uname);
   }
   
 sub advertisefeeds {  sub advertisefeeds {
     return;  
     my ($uname,$udom,$edit)=@_;      my ($uname,$udom,$edit)=@_;
     my $feeds='';      my $feeds='';
     my %feednames=&Apache::lonnet::dump('nohist_all_rss_feeds',$udom,$uname);      my %feednames=&Apache::lonnet::dump('nohist_all_rss_feeds',$udom,$uname);
Line 83  sub advertisefeeds { Line 93  sub advertisefeeds {
  $mode='adm';   $mode='adm';
     }      }
     foreach my $feed (sort(keys(%feednames))) {      foreach my $feed (sort(keys(%feednames))) {
  if ($feed!~/^error\:/) {   if (($feed!~/^error\:/) && ($feed!~/^feed\_display\_option\_/)) {
     my $feedurl='feed://'.$ENV{'HTTP_HOST'}.'/public/'.$udom.'/'.$uname.'/'.$feed.'.rss';      my $feedurl='http://'.$ENV{'HTTP_HOST'}.'/public/'.$udom.'/'.$uname.'/'.$feed.'.rss';
     my $htmlurl='http://'.$ENV{'HTTP_HOST'}.'/'.$mode.'/'.$udom.'/'.$uname.'/'.$feed.'_rss.html';      my $htmlurl='http://'.$ENV{'HTTP_HOST'}.'/'.$mode.'/'.$udom.'/'.$uname.'/'.$feed.'_rss.html';
     $feeds.='<li>'.$feednames{$feed}.      if ($feednames{'feed_display_option_'.$feed} eq 'hidden') {
  '<br />'.($edit?&mt('Edit'):'HTML').': <a href="'.$htmlurl.'"><tt>'.$htmlurl.'</tt></a>'.   if ($edit) {
  ($edit?'':'<br />RSS: <a href="'.$feedurl.'"><tt>'.$feedurl.'</tt></a>').'</li>';      $feeds.='<li><i>'.$feednames{$feed}.'</i><br />'.&mt('Hidden').': <a href="'.$htmlurl.'"><tt>'.$htmlurl.'</tt></a></li>';
    }
       } else {
    $feeds.='<li><b>'.$feednames{$feed}.
       '</b><br />'.($edit?&mt('Edit'):'HTML').': <a href="'.$htmlurl.'"><tt>'.$htmlurl.'</tt></a>'.
       '<br />RSS: <a href="'.$feedurl.'"><tt>'.$feedurl.'</tt></a></li>';
       }
  }   }
     }      }
     if ($feeds) {      if ($feeds) {
Line 98  sub advertisefeeds { Line 114  sub advertisefeeds {
     }      }
 }  }
   
   sub rss_link {
       my ($url) = @_;
       return qq|<link rel="alternate" type="application/rss+xml" title="Course Announcements" href="$url" />|;
   }
   
 {  {
     my $feedcounter;      my $feedcounter;
     sub addentry {      sub get_new_feed_id {
  $feedcounter++;   $feedcounter++;
  my $id=time.'00000'.$$.'00000'.$feedcounter;   return time().'00000'.$$.'00000'.$feedcounter;
  return &editentry($id,@_);  
     }      }
 }  }
   
   sub addentry {
       my $id=&get_new_feed_id();
       return &editentry($id,@_);
   }
   
 sub editentry {  sub editentry {
     my ($id,$uname,$udom,$filename,$title,$description,$url,$status,$encurl,$enclength,$enctype)=@_;      my ($id,$uname,$udom,$filename,$title,$description,$url,$status,$encurl,$enctype)=@_;
       if ($status eq 'deleted') {
    return &changestatus($id,$uname,$udom,$filename,$status);
       }
     my $feedname=&feedname($filename);      my $feedname=&feedname($filename);
     &Apache::lonnet::put('nohist_all_rss_feeds',      &Apache::lonnet::put('nohist_all_rss_feeds',
  { &filterfeedname($filename) => &displayfeedname($filename,$uname,$udom) },   { &filterfeedname($filename) => 
          (&displayfeedname($filename,$uname,$udom))[0] },
  $udom,$uname);   $udom,$uname);
     return &Apache::lonnet::put($feedname,{      return &Apache::lonnet::put($feedname,{
  $id.'_title' => $title,   $id.'_title' => $title,
  $id.'_description' => $description,   $id.'_description' => $description,
  $id.'_link' => $url,   $id.'_link' => $url,
  $id.'_enclosureurl' => $encurl,   $id.'_enclosureurl' => $encurl,
  $id.'_enclosurelength' => $enclength,  
  $id.'_enclosuretype' => $enctype,   $id.'_enclosuretype' => $enctype,
  $id.'_status' => $status},$udom,$uname);   $id.'_status' => $status},$udom,$uname);
 }  }
Line 131  sub changestatus { Line 159  sub changestatus {
        $id.'_description',         $id.'_description',
        $id.'_link',         $id.'_link',
        $id.'_enclosureurl',         $id.'_enclosureurl',
        $id.'_enclosurelength',  
        $id.'_enclosuretype',         $id.'_enclosuretype',
        $id.'_status'],$udom,$uname);         $id.'_status'],$udom,$uname);
     } else {      } else {
Line 140  sub changestatus { Line 167  sub changestatus {
 }  }
   
 sub changed_js {  sub changed_js {
   
     return <<ENDSCRIPT;      return <<ENDSCRIPT;
 <script type="text/javascript">  <script type="text/javascript">
     function changed(tform,id) {      function changed(tform,id) {
         tform.elements[id+"_modified"].checked=true;          tform.elements[id+"_modified"].checked=true;
     }      }
 </script>  </script>
 ENDSCRIPT      ENDSCRIPT
   }
   
   sub determine_enclosure_types {
       my ($url)=@_;
       my ($ending)=($url=~/\.(\w+)$/);
       return &Apache::loncommon::filemimetype($ending);
   }
   
   sub course_blog_link {
       my ($id,$title,$description,$url,$encurl,$enctype)=@_;
       if ($env{'request.course.id'}) {
    return &add_blog_entry_link($id,
       $env{'course.'.$env{'request.course.id'}.'.num'},
       $env{'course.'.$env{'request.course.id'}.'.domain'},
       'Course_Announcements',
       $title,$description,$url,'public',$encurl,$enctype,
       &mt('Add to Course Announcements'));
       } else {
    return '';
       }
   }
   
   sub add_blog_entry_link {
       my ($id,$uname,$udom,$filename,$title,$description,$url,$status,$encurl,$enctype,$linktext)=@_;
       return "<a href='/adm/$udom/$uname/".&filterfeedname($filename).'_rss.html?queryid='.
    &escape($id).
    '&title='.&escape($title).
    '&description='.&escape($description).
    '&url='.&escape($url).
    '&status='.&escape($status).
    '&encurl='.&escape($encurl).
    '&enctype='.&escape($enctype).
    "'>".$linktext.'</a>';
   
 }  }
   
 sub handler {  sub handler {
Line 160  sub handler { Line 220  sub handler {
  $edit=1;   $edit=1;
  $html=1;   $html=1;
     }      }
       if  (($mode eq 'adm') && (&Apache::lonnet::allowed('mdc',$env{'request.course.id'}))) {
    $edit=1;
    $html=1;
       }
     if ($filename=~/\.html$/) {      if ($filename=~/\.html$/) {
  $html=1;   $html=1;
     }      }
Line 175  sub handler { Line 239  sub handler {
   
     my $filterfeedname=&filterfeedname($filename);      my $filterfeedname=&filterfeedname($filename);
     my $feedname=&feedname($filename);      my $feedname=&feedname($filename);
     my $displayfeedname=&displayfeedname($filename,$uname,$udom);      my ($displayfeedname,$displayoption)=&displayfeedname($filename,$uname,$udom);
     if ($html) {      if ($html) {
  $r->print(&Apache::lonxml::xmlbegin().   my $title = $displayfeedname?$displayfeedname
   &Apache::loncommon::head($displayfeedname).                                      :"Available RSS Feeds and Blogs";
   &Apache::loncommon::bodytag($displayfeedname,'','','',$udom,   $r->print(&Apache::loncommon::start_page($title,undef
       $env{'form.register'}).   {'domain'         => $udom,
     'force_register' =>
         $env{'form.register'}}).
   &changed_js());    &changed_js());
       } else { # render RSS
     } else {  
  $r->print("<rss version='2.0' xmlns:dc='http://purl.org/dc/elements/1.1'>\n<channel>".   $r->print("<rss version='2.0' xmlns:dc='http://purl.org/dc/elements/1.1'>\n<channel>".
   "\n<link>http://".$ENV{'HTTP_HOST'}.'/public/'.$udom.'/'.$uname.'/'.    "\n<link>http://".$ENV{'HTTP_HOST'}.'/public/'.$udom.'/'.$uname.'/'.
   $filterfeedname.'_rss.html</link>'.    $filterfeedname.'_rss.html</link>'.
Line 191  sub handler { Line 256  sub handler {
   &mt('An RSS Feed provided by the LON-CAPA Learning Content Management System').    &mt('An RSS Feed provided by the LON-CAPA Learning Content Management System').
   '</description>');    '</description>');
     }      }
   # This will be the entry id for new additions to the blog
       my $newid = &get_new_feed_id();
 # Is this user for real?  # Is this user for real?
     my $homeserver=&Apache::lonnet::homeserver($uname,$udom);      my $homeserver=&Apache::lonnet::homeserver($uname,$udom);
     if ($html) {      if ($html) {
   # Any new feeds or renaming of feeds?
    if ($edit) {
   # Hide a feed?
       if ($env{'form.hidethisblog'}) {
    &changefeeddisplay($feedname,$uname,$udom,'hidden');
    ($displayfeedname,$displayoption)=&displayfeedname($filename,$uname,$udom);
       }
   # Advertise a feed?
       if ($env{'form.advertisethisblog'}) {
    &changefeeddisplay($feedname,$uname,$udom,'public');
    ($displayfeedname,$displayoption)=&displayfeedname($filename,$uname,$udom);
       }
   # New feed?
       if ($env{'form.namenewblog'}=~/\w/) {
    &namefeed($env{'form.namenewblog'},$uname,$udom,$env{'form.namenewblog'});
       }
   # Old feed that is being renamed?
       if (($displayfeedname) && ($env{'form.newblogname'}=~/\w/)) {
    if ($env{'form.newblogname'} ne $displayfeedname) {
       &namefeed($feedname,$uname,$udom,$env{'form.newblogname'});
       ($displayfeedname,$displayoption)=&displayfeedname($filename,$uname,$udom);
    }
       }
    }
  $r->print(&advertisefeeds($uname,$udom,$edit));   $r->print(&advertisefeeds($uname,$udom,$edit));
     }       } 
     if ($homeserver eq 'no_host') {      if ($homeserver eq 'no_host') {
  $r->print(($html?'<h3>':'<title>').&mt('No feed available').($html?'</h3>':'</title>'));   $r->print(($html?'<h3>':'<title>').&mt('No feed available').($html?'</h3>':'</title>'));
     } else {      } else { # is indeed a user
 # Course or user?  # Course or user?
  my $name='';   my $name='';
  if ($uname=~/^\d/) {   if ($uname=~/^\d/) {
Line 207  sub handler { Line 298  sub handler {
  } else {   } else {
     $name=&Apache::loncommon::nickname($uname,$udom);      $name=&Apache::loncommon::nickname($uname,$udom);
  }   }
         $r->print("\n".  # Add a new feed
   ($html?'<h3>':'<title>').          if (($html) && ($edit)) {
   &mt('LON-CAPA Feed "[_1]" for [_2]',$displayfeedname,$name).      $r->print('<form method="post">');
   ($html?'</h3>'.($edit?'<form method="post"><br />'.              $r->print(&mt('Name for New Feed').": <input type='text' size='40' name='namenewblog' />");
   &mt('Name of blog/journal').      $r->print('<input type="submit" value="'.&mt('Start a New Feed').'" />');
   ': <input type="text" size="50" name="newblogname" value="'.      $r->print('</form>');
   $displayfeedname.'" />':'').'<ul>':'</title>'));  
 # Render private items?  
         my $viewpubliconly=1;  
         if (($env{'user.name'} eq $uname) && ($env{'user.domain'} eq $udom)) {  
     $viewpubliconly=0;  
  }   }
           if ($displayfeedname) { # this is an existing feed
   # Anything to store?
       if ($edit) {
   # check if this was called with a query string
    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['queryid']);
    if ($env{'form.queryid'}) {
   # yes, collect the remainder
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
       ['title',
        'description',
        'url',
        'status',
        'enclosureurl',
        'enclosuretype']);
   #    my ($id,$uname,$udom,$filename,$title,$description,$url,$status,$encurl,$enctype)=@_;
   
       &editentry($env{'form.queryid'},
          $uname,$udom,$filename,
          $env{'form.title'},
          $env{'form.description'},
          $env{'form.url'},
          $env{'form.status'},
          $env{'form.encurl'},
          $env{'form.enctype'}
          );
    }
    my %newsfeed=&Apache::lonnet::dump($feedname,$udom,$uname);
    foreach my $entry (sort(keys(%newsfeed)),$env{'form.newid'}.'_status') {
       if ($entry=~/^(\d+)\_status$/) {
    my $id=$1;
    if ($env{'form.'.$id.'_modified'}) {
       &editentry($id,$uname,$udom,$feedname,
          $env{'form.'.$id.'_title'},
          $env{'form.'.$id.'_description'},
          $env{'form.'.$id.'_url'},
          $env{'form.'.$id.'_status'},
          $env{'form.'.$id.'_enclosureurl'},
          $env{'form.'.$id.'_enclosuretype'},
          );
    }
       }
    }
       } #done storing
   
       $r->print("\n".
         ($html?'<hr /><h3>':'<title>').
         &mt('LON-CAPA Feed "[_1]" for [_2]',$displayfeedname,$name).
         ($displayoption eq 'hidden'?' ('.&mt('Hidden').')':'').
         ($html?'</h3>'.($edit?'<form method="post"><br />'.
         &mt('Name of this Feed').
         ': <input type="text" size="50" name="newblogname" value="'.
         $displayfeedname.'" />':'').'<ul>':'</title>'));
   # Render private items?
       my $viewpubliconly=1;
       if (($env{'user.name'} eq $uname) && ($env{'user.domain'} eq $udom)) {
    $viewpubliconly=0;
       }
 # Get feed items  # Get feed items
         my %newsfeed=&Apache::lonnet::dump($feedname,$udom,$uname);      my %newsfeed=&Apache::lonnet::dump($feedname,$udom,$uname);
  foreach my $entry (sort(keys(%newsfeed))) {      foreach my $entry (sort(keys(%newsfeed)),$newid.'_status') {
     if ($entry=~/^(\d+)\_status$/) {   if ($entry=~/^(\d+)\_status$/) { # is an entry
  my $id=$1;      my $id=$1;
  if ($edit) {      if ($edit) {
     my %lt=&Apache::lonlocal::texthash('public' => 'public',   my %lt=&Apache::lonlocal::texthash('public' => 'public',
        'private' => 'private',     'private' => 'private',
        'hidden' => 'hidden',     'hidden' => 'hidden',
        'delete' => 'delete',     'delete' => 'delete',
        'store' => 'Store changes');     'store' => 'Store changes',
     my %status=();     'title' => 'Title',
     $status{$newsfeed{$id.'_status'}}='checked="checked"';     'link' => 'Link',
     $r->print(<<ENDEDIT);     'description' => 'Description');
    my %status=();
    unless ($newsfeed{$id.'_status'}) { $newsfeed{$id.'_status'}='public'; }
    $status{$newsfeed{$id.'_status'}}='checked="checked"';
    $r->print(<<ENDEDIT);
 <li>  <li>
 <label><input name='$id\_modified' type='checkbox' /> $lt{'store'}</label>  <label><input name='$id\_modified' type='checkbox' value="modified" /> $lt{'store'}</label>
 &nbsp;&nbsp;  &nbsp;&nbsp;
 <label><input name='$id\_status' type="radio" value="public" $status{'public'} onClick="changed(this.form,'$id');" /> $lt{'public'}</label>  <label><input name='$id\_status' type="radio" value="public" $status{'public'} onClick="changed(this.form,'$id');" /> $lt{'public'}</label>
 &nbsp;&nbsp;  &nbsp;&nbsp;
Line 242  sub handler { Line 389  sub handler {
 &nbsp;&nbsp;  &nbsp;&nbsp;
 <label><input name='$id\_status' type="radio" value="hidden" $status{'hidden'} onClick="changed(this.form,'$id');" /> $lt{'hidden'}</label>  <label><input name='$id\_status' type="radio" value="hidden" $status{'hidden'} onClick="changed(this.form,'$id');" /> $lt{'hidden'}</label>
 &nbsp;&nbsp;  &nbsp;&nbsp;
 <label><input name='$id\_status' type="radio" value="delete" onClick="changed(this.form,'$id');" /> $lt{'delete'}</label>  <label><input name='$id\_status' type="radio" value="deleted" onClick="changed(this.form,'$id');" /> $lt{'delete'}</label>
 <br />  <br />
 <input name='$id\_title' type='text' size='80' value='$newsfeed{$id.'_title'}' onChange="changed(this.form,'$id');" /><br />  $lt{'title'}:
   <input name='$id\_title' type='text' size='60' value='$newsfeed{$id.'_title'}' onChange="changed(this.form,'$id');" /><br />
   $lt{'description'}:<br />
 <textarea name='$id\_description' rows="6" cols="80" onChange="changed(this.form,'$id');">$newsfeed{$id.'_description'}</textarea><br />  <textarea name='$id\_description' rows="6" cols="80" onChange="changed(this.form,'$id');">$newsfeed{$id.'_description'}</textarea><br />
 <input name='$id\_link' type='text' size='80' value='$newsfeed{$id.'_link'}' onChange="changed(this.form,'$id');" />  $lt{'link'}:
   <input name='$id\_link' type='text' size='60' value='$newsfeed{$id.'_link'}' onChange="changed(this.form,'$id');" />
 <hr /></li>  <hr /></li>
 ENDEDIT  ENDEDIT
  } else {      } else { # not in edit mode, just displaying
     if (($newsfeed{$id.'_status'} ne 'public') && ($viewpubliconly)) { next; }   if (($newsfeed{$id.'_status'} ne 'public') && ($viewpubliconly)) { next; }
     if ($newsfeed{$id.'_status'} eq 'hidden') { next; }   if ($newsfeed{$id.'_status'} eq 'hidden') { next; }
     $r->print("\n".($html?"\n<li><b>":"<item>\n<title>").$newsfeed{$id.'_title'}.   $r->print("\n".($html?"\n<li><b>":"<item>\n<title>").$newsfeed{$id.'_title'}.
       ($html?"</b><br />\n":"</title>\n<description>").    ($html?"</b><br />\n":"</title>\n<description>").
       $newsfeed{$id.'_description'}.    $newsfeed{$id.'_description'}.
       ($html?"<br />\n<a href='":"</description>\n<link>").    ($html?"<br />\n<a href='":"</description>\n<link>").
       "http://".$ENV{'HTTP_HOST'}.    "http://".$ENV{'HTTP_HOST'}.
       $newsfeed{$id.'_link'}.    $newsfeed{$id.'_link'}.
       ($html?("'>".&mt('Read more')."</a><br />\n"):"</link>\n"));    ($html?("'>".&mt('Read more')."</a><br />\n"):"</link>\n"));
     if ($newsfeed{$id.'_enclosureurl'}) {  # Enclosure? Get stats
  $r->print(($html?"<a href='":"\n<enclosure url='").   if ($newsfeed{$id.'_enclosureurl'}) {
   $newsfeed{$id.'_enclosureurl'}."' length='".$newsfeed{$id.'_enclosurelength'}.      my @stat=&Apache::lonnet::stat_file($newsfeed{$id.'_enclosureurl'});
   "' type='".$newsfeed{$id.'_enclosuretype'}.($html?"'>".&mt('Enclosure')."</a>":"' />"));      if ($stat[7]) {
     }  # Has non-zero length (and exists)
     if ($html) {   my $enclosuretype=$newsfeed{$id.'_enclosetype'};
  $r->print("\n<hr /></li>\n");   $r->print(($html?"<a href='":"\n<enclosure url='").
     } else {    $newsfeed{$id.'_enclosureurl'}."' length='".$stat[7].
  $r->print("\n<guid isPermaLink='false'>".$id.$filterfeedname.'_'.$udom.'_'.$uname."</guid></item>\n");    "' type='".$enclosuretype.($html?"'>".&mt('Enclosure')."</a>":"' />"));
     }      }
    }
    if ($html) { # is HTML
       $r->print("\n<hr /></li>\n");
    } else { # is RSS
       $r->print("\n<guid isPermaLink='false'>".$id.$filterfeedname.'_'.$udom.'_'.$uname."</guid></item>\n");
    }
       } # end of "in edit mode"
    } # end of rendering a real entry
       } # end of loop through all keys
       if ($html) {
    $r->print('</ul>');
    if ($edit) {
       $r->print('<input type="hidden" name="newid" value="'.$newid.'"/><input type="submit" value="'.&mt('Store Marked Changes').'" />'.
         ($displayoption eq 'hidden'?'<input type="submit" name="advertisethisblog" value="'.&mt('Advertise this Feed').'" />':
          '<input type="submit" name="hidethisblog" value="'.&mt('Hide this Feed').'" />'));
  }   }
     }      }
  }   } # was a real display feedname
     }   $r->print(($html?'</form>'.&Apache::loncommon::end_page():'</channel></rss>'."\n"));
     $r->print("\n".($html?'</ul>'.($edit?'<input type="submit" value="'.&mt('Store Marked Changes').'" /></form>':'').&Apache::loncommon::end_page():'</channel></rss>'."\n"));      } # a real user
     return OK;      return OK;
 }   } # end handler
 1;  1;
 __END__  __END__

Removed from v.1.8  
changed lines
  Added in v.1.25


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.