MediaWiki  REL1_22
Feed.php
Go to the documentation of this file.
00001 <?php
00038 class FeedItem {
00042     var $title;
00043 
00044     var $description;
00045     var $url;
00046     var $date;
00047     var $author;
00048     var $uniqueId;
00049     var $comments;
00050     var $rssIsPermalink = false;
00051 
00062     function __construct( $title, $description, $url, $date = '', $author = '', $comments = '' ) {
00063         $this->title = $title;
00064         $this->description = $description;
00065         $this->url = $url;
00066         $this->uniqueId = $url;
00067         $this->date = $date;
00068         $this->author = $author;
00069         $this->comments = $comments;
00070     }
00071 
00078     public function xmlEncode( $string ) {
00079         $string = str_replace( "\r\n", "\n", $string );
00080         $string = preg_replace( '/[\x00-\x08\x0b\x0c\x0e-\x1f]/', '', $string );
00081         return htmlspecialchars( $string );
00082     }
00083 
00089     public function getUniqueId() {
00090         if ( $this->uniqueId ) {
00091             return $this->xmlEncode( $this->uniqueId );
00092         }
00093     }
00094 
00101     public function setUniqueId( $uniqueId, $rssIsPermalink = false ) {
00102         $this->uniqueId = $uniqueId;
00103         $this->rssIsPermalink = $rssIsPermalink;
00104     }
00105 
00111     public function getTitle() {
00112         return $this->xmlEncode( $this->title );
00113     }
00114 
00120     public function getUrl() {
00121         return $this->xmlEncode( $this->url );
00122     }
00123 
00129     public function getDescription() {
00130         return $this->xmlEncode( $this->description );
00131     }
00132 
00138     public function getLanguage() {
00139         global $wgLanguageCode;
00140         return $wgLanguageCode;
00141     }
00142 
00148     public function getDate() {
00149         return $this->date;
00150     }
00151 
00157     public function getAuthor() {
00158         return $this->xmlEncode( $this->author );
00159     }
00160 
00166     public function getComments() {
00167         return $this->xmlEncode( $this->comments );
00168     }
00169 
00176     public static function stripComment( $text ) {
00177         return preg_replace( '/\[\[([^]]*\|)?([^]]+)\]\]/', '\2', $text );
00178     }
00180 }
00181 
00186 abstract class ChannelFeed extends FeedItem {
00195     abstract public function outHeader();
00196 
00205     abstract public function outItem( $item );
00206 
00214     abstract public function outFooter();
00215 
00224     public function httpHeaders() {
00225         global $wgOut, $wgVaryOnXFP;
00226 
00227         # We take over from $wgOut, excepting its cache header info
00228         $wgOut->disable();
00229         $mimetype = $this->contentType();
00230         header( "Content-type: $mimetype; charset=UTF-8" );
00231         if ( $wgVaryOnXFP ) {
00232             $wgOut->addVaryHeader( 'X-Forwarded-Proto' );
00233         }
00234         $wgOut->sendCacheControl();
00235 
00236     }
00237 
00244     function contentType() {
00245         global $wgRequest;
00246         $ctype = $wgRequest->getVal( 'ctype', 'application/xml' );
00247         $allowedctypes = array( 'application/xml', 'text/xml', 'application/rss+xml', 'application/atom+xml' );
00248         return ( in_array( $ctype, $allowedctypes ) ? $ctype : 'application/xml' );
00249     }
00250 
00256     function outXmlHeader() {
00257         global $wgStylePath, $wgStyleVersion;
00258 
00259         $this->httpHeaders();
00260         echo '<?xml version="1.0"?>' . "\n";
00261         echo '<?xml-stylesheet type="text/css" href="' .
00262             htmlspecialchars( wfExpandUrl( "$wgStylePath/common/feed.css?$wgStyleVersion", PROTO_CURRENT ) ) .
00263             '"?' . ">\n";
00264     }
00265 }
00266 
00272 class RSSFeed extends ChannelFeed {
00273 
00280     function formatTime( $ts ) {
00281         return gmdate( 'D, d M Y H:i:s \G\M\T', wfTimestamp( TS_UNIX, $ts ) );
00282     }
00283 
00287     function outHeader() {
00288         global $wgVersion;
00289 
00290         $this->outXmlHeader();
00291         ?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
00292     <channel>
00293         <title><?php print $this->getTitle() ?></title>
00294         <link><?php print wfExpandUrl( $this->getUrl(), PROTO_CURRENT ) ?></link>
00295         <description><?php print $this->getDescription() ?></description>
00296         <language><?php print $this->getLanguage() ?></language>
00297         <generator>MediaWiki <?php print $wgVersion ?></generator>
00298         <lastBuildDate><?php print $this->formatTime( wfTimestampNow() ) ?></lastBuildDate>
00299 <?php
00300     }
00301 
00306     function outItem( $item ) {
00307     ?>
00308         <item>
00309             <title><?php print $item->getTitle(); ?></title>
00310             <link><?php print wfExpandUrl( $item->getUrl(), PROTO_CURRENT ); ?></link>
00311             <guid<?php if ( !$item->rssIsPermalink ) { print ' isPermaLink="false"'; } ?>><?php print $item->getUniqueId(); ?></guid>
00312             <description><?php print $item->getDescription() ?></description>
00313             <?php if ( $item->getDate() ) { ?><pubDate><?php print $this->formatTime( $item->getDate() ); ?></pubDate><?php } ?>
00314             <?php if ( $item->getAuthor() ) { ?><dc:creator><?php print $item->getAuthor(); ?></dc:creator><?php }?>
00315             <?php if ( $item->getComments() ) { ?><comments><?php print wfExpandUrl( $item->getComments(), PROTO_CURRENT ); ?></comments><?php }?>
00316         </item>
00317 <?php
00318     }
00319 
00323     function outFooter() {
00324     ?>
00325     </channel>
00326 </rss><?php
00327     }
00328 }
00329 
00335 class AtomFeed extends ChannelFeed {
00340     function formatTime( $ts ) {
00341         // need to use RFC 822 time format at least for rss2.0
00342         return gmdate( 'Y-m-d\TH:i:s', wfTimestamp( TS_UNIX, $ts ) );
00343     }
00344 
00348     function outHeader() {
00349         global $wgVersion;
00350 
00351         $this->outXmlHeader();
00352         ?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="<?php print $this->getLanguage() ?>">
00353         <id><?php print $this->getFeedId() ?></id>
00354         <title><?php print $this->getTitle() ?></title>
00355         <link rel="self" type="application/atom+xml" href="<?php print wfExpandUrl( $this->getSelfUrl(), PROTO_CURRENT ) ?>"/>
00356         <link rel="alternate" type="text/html" href="<?php print wfExpandUrl( $this->getUrl(), PROTO_CURRENT ) ?>"/>
00357         <updated><?php print $this->formatTime( wfTimestampNow() ) ?>Z</updated>
00358         <subtitle><?php print $this->getDescription() ?></subtitle>
00359         <generator>MediaWiki <?php print $wgVersion ?></generator>
00360 
00361 <?php
00362     }
00363 
00373     function getFeedId() {
00374         return $this->getSelfUrl();
00375     }
00376 
00382     function getSelfUrl() {
00383         global $wgRequest;
00384         return htmlspecialchars( $wgRequest->getFullRequestURL() );
00385     }
00386 
00391     function outItem( $item ) {
00392         global $wgMimeType;
00393     ?>
00394     <entry>
00395         <id><?php print $item->getUniqueId(); ?></id>
00396         <title><?php print $item->getTitle(); ?></title>
00397         <link rel="alternate" type="<?php print $wgMimeType ?>" href="<?php print wfExpandUrl( $item->getUrl(), PROTO_CURRENT ); ?>"/>
00398         <?php if ( $item->getDate() ) { ?>
00399         <updated><?php print $this->formatTime( $item->getDate() ); ?>Z</updated>
00400         <?php } ?>
00401 
00402         <summary type="html"><?php print $item->getDescription() ?></summary>
00403         <?php if ( $item->getAuthor() ) { ?><author><name><?php print $item->getAuthor(); ?></name></author><?php }?>
00404     </entry>
00405 
00406 <?php /* @todo FIXME: Need to add comments
00407     <?php if( $item->getComments() ) { ?><dc:comment><?php print $item->getComments() ?></dc:comment><?php }?>
00408       */
00409     }
00410 
00414     function outFooter() {?>
00415     </feed><?php
00416     }
00417 }