X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FFeed.php;h=f9dbf5ba715f6086bc6bad078396e56154f1b267;hb=6088cd4458f6b6ca36bcdd881c4c3d4d49b6d1b8;hp=f154c861bc5e956bb70288d7cc01136de21301ea;hpb=e57ac87ceb707957788885963befa7ad68d0798a;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Feed.php b/includes/Feed.php index f154c861bc..f9dbf5ba71 100644 --- a/includes/Feed.php +++ b/includes/Feed.php @@ -1,204 +1,318 @@ -# http://www.mediawiki.org/ -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# http://www.gnu.org/copyleft/gpl.html - /** + * Basic support for outputting syndication feeds in RSS, other formats. + * * Contain a feed class as well as classes to build rss / atom ... feeds * Available feeds are defined in Defines.php - * @package MediaWiki + * + * Copyright © 2004 Brion Vibber + * http://www.mediawiki.org/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file */ +/** + * @defgroup Feed Feed + */ /** - * @todo document - * @package MediaWiki + * A base class for basic support for outputting syndication feeds in RSS and other formats. + * + * @ingroup Feed */ class FeedItem { - /**#@+ - * @var string - * @access private + /** + * @var Title */ - var $Title = 'Wiki'; - var $Description = ''; - var $Url = ''; - var $Date = ''; - var $Author = ''; - /**#@-*/ - + var $title; + + var $description; + var $url; + var $date; + var $author; + var $uniqueId; + var $comments; + var $rssIsPermalink = false; + /** - * @todo document + * Constructor + * + * @param $title String|Title Item's title + * @param $description String + * @param $url String: URL uniquely designating the item. + * @param $date String: Item's date + * @param $author String: Author's user name + * @param $comments String */ - function FeedItem( $Title, $Description, $Url, $Date = '', $Author = '', $Comments = '' ) { - $this->Title = $Title; - $this->Description = $Description; - $this->Url = $Url; - $this->Date = $Date; - $this->Author = $Author; - $this->Comments = $Comments; + function __construct( $title, $description, $url, $date = '', $author = '', $comments = '' ) { + $this->title = $title; + $this->description = $description; + $this->url = $url; + $this->uniqueId = $url; + $this->date = $date; + $this->author = $author; + $this->comments = $comments; } - + /** - * @static - * @todo document + * Encode $string so that it can be safely embedded in a XML document + * + * @param $string String: string to encode + * @return String */ - function xmlEncode( $string ) { - global $wgInputEncoding, $wgLang; + public function xmlEncode( $string ) { $string = str_replace( "\r\n", "\n", $string ); - if( strcasecmp( $wgInputEncoding, 'utf-8' ) != 0 ) { - $string = $wgLang->iconv( $wgInputEncoding, 'utf-8', $string ); - } + $string = preg_replace( '/[\x00-\x08\x0b\x0c\x0e-\x1f]/', '', $string ); return htmlspecialchars( $string ); } - + /** - * @todo document + * Get the unique id of this item + * + * @return String */ - function getTitle() { return $this->xmlEncode( $this->Title ); } + public function getUniqueId() { + if ( $this->uniqueId ) { + return $this->xmlEncode( $this->uniqueId ); + } + } + /** - * @todo document + * set the unique id of an item + * + * @param $uniqueId String: unique id for the item + * @param $rssIsPermalink Boolean: set to true if the guid (unique id) is a permalink (RSS feeds only) */ - function getUrl() { return $this->xmlEncode( $this->Url ); } + public function setUniqueId( $uniqueId, $rssIsPermalink = false ) { + $this->uniqueId = $uniqueId; + $this->rssIsPermalink = $rssIsPermalink; + } + /** - * @todo document + * Get the title of this item; already xml-encoded + * + * @return String */ - function getDescription() { return $this->xmlEncode( $this->Description ); } + public function getTitle() { + return $this->xmlEncode( $this->title ); + } + /** - * @todo document + * Get the URL of this item; already xml-encoded + * + * @return String */ - function getLanguage() { + public function getUrl() { + return $this->xmlEncode( $this->url ); + } + + /** + * Get the description of this item; already xml-encoded + * + * @return String + */ + public function getDescription() { + return $this->xmlEncode( $this->description ); + } + + /** + * Get the language of this item + * + * @return String + */ + public function getLanguage() { global $wgLanguageCode; return $wgLanguageCode; } + /** - * @todo document + * Get the title of this item + * + * @return String */ - function getDate() { return $this->Date; } + public function getDate() { + return $this->date; + } + /** - * @todo document + * Get the author of this item; already xml-encoded + * + * @return String */ - function getAuthor() { return $this->xmlEncode( $this->Author ); } + public function getAuthor() { + return $this->xmlEncode( $this->author ); + } + /** - * @todo document + * Get the comment of this item; already xml-encoded + * + * @return String */ - function getComments() { return $this->xmlEncode( $this->Comments ); } + public function getComments() { + return $this->xmlEncode( $this->comments ); + } + + /** + * Quickie hack... strip out wikilinks to more legible form from the comment. + * + * @param $text String: wikitext + * @return String + */ + public static function stripComment( $text ) { + return preg_replace( '/\[\[([^]]*\|)?([^]]+)\]\]/', '\2', $text ); + } + /**#@-*/ } /** - * @todo document - * @package MediaWiki + * @todo document (needs one-sentence top-level class description). + * @ingroup Feed */ -class ChannelFeed extends FeedItem { - /**#@+ - * Abstract function, override! - * @abstract - */ - +abstract class ChannelFeed extends FeedItem { /** * Generate Header of the feed + * @par Example: + * @code + * print ""; + * @endcode + * @param $item */ - function outHeader() { - # print ""; - } - + abstract public function outHeader(); + /** * Generate an item + * @par Example: + * @code + * print "..."; + * @endcode * @param $item */ - function outItem( $item ) { - # print "..."; - } - + abstract public function outItem( $item ); + /** * Generate Footer of the feed + * @par Example: + * @code + * print ""; + * @endcode */ - function outFooter() { - # print ""; - } - /**#@-*/ - + abstract public function outFooter(); + /** - * @todo document - * @param string $mimetype (optional) type of output + * Setup and send HTTP headers. Don't send any content; + * content might end up being cached and re-sent with + * these same headers later. + * + * This should be called from the outHeader() method, + * but can also be called separately. */ - function outXmlHeader( $mimetype='application/xml' ) { - global $wgServer, $wgStylePath, $wgOut; - + public function httpHeaders() { + global $wgOut, $wgVaryOnXFP; + # We take over from $wgOut, excepting its cache header info $wgOut->disable(); + $mimetype = $this->contentType(); header( "Content-type: $mimetype; charset=UTF-8" ); + if ( $wgVaryOnXFP ) { + $wgOut->addVaryHeader( 'X-Forwarded-Proto' ); + } $wgOut->sendCacheControl(); - - print '<' . '?xml version="1.0" encoding="utf-8"?' . ">\n"; - print '<' . '?xml-stylesheet type="text/css" href="' . - htmlspecialchars( "$wgServer$wgStylePath/feed.css" ) . '"?' . ">\n"; + + } + + /** + * Return an internet media type to be sent in the headers. + * + * @return string + * @private + */ + function contentType() { + global $wgRequest; + $ctype = $wgRequest->getVal('ctype','application/xml'); + $allowedctypes = array('application/xml','text/xml','application/rss+xml','application/atom+xml'); + return (in_array($ctype, $allowedctypes) ? $ctype : 'application/xml'); + } + + /** + * Output the initial XML headers with a stylesheet for legibility + * if someone finds it in a browser. + * @private + */ + function outXmlHeader() { + global $wgStylePath, $wgStyleVersion; + + $this->httpHeaders(); + echo '' . "\n"; + echo '\n"; } } /** * Generate a RSS feed - * @todo document - * @package MediaWiki + * + * @ingroup Feed */ class RSSFeed extends ChannelFeed { /** * Format a date given a timestamp - * @param integer $ts Timestamp - * @return string Date string + * + * @param $ts Integer: timestamp + * @return String: date string */ function formatTime( $ts ) { return gmdate( 'D, d M Y H:i:s \G\M\T', wfTimestamp( TS_UNIX, $ts ) ); } - + /** * Ouput an RSS 2.0 header */ function outHeader() { global $wgVersion; - + $this->outXmlHeader(); ?> <?php print $this->getTitle() ?> - getUrl() ?> + getUrl(), PROTO_CURRENT ) ?> getDescription() ?> getLanguage() ?> MediaWiki formatTime( wfTimestampNow() ) ?> <?php print $item->getTitle() ?> - getUrl() ?> + getUrl(), PROTO_CURRENT ) ?> + rssIsPermalink ) print ' isPermaLink="false"' ?>>getUniqueId() ?> getDescription() ?> getDate() ) { ?>formatTime( $item->getDate() ) ?> getAuthor() ) { ?>getAuthor() ?> - getComments() ) { ?>getComments() ?> + getComments() ) { ?>getComments(), PROTO_CURRENT ) ?> outXmlHeader(); - ?> + ?> + getFeedId() ?> <?php print $this->getTitle() ?> - - formatTime( wfTimestampNow() ) ?>Z - getDescription() ?> + + + formatTime( wfTimestampNow() ) ?>Z + getDescription() ?> MediaWiki - + getSelfUrl(); + } + + /** + * Atom 1.0 requests a self-reference to the feed. + * @return string + * @private + */ + function getSelfUrl() { + global $wgRequest; + return htmlspecialchars( $wgRequest->getFullRequestURL() ); + } + + /** + * Output a given item. + * @param $item */ function outItem( $item ) { global $wgMimeType; ?> + getUniqueId() ?> <?php print $item->getTitle() ?> - + getDate() ) { ?> - formatTime( $item->getDate() ) ?>Z - formatTime( $item->getDate() ) ?> - formatTime( $item->getDate() ) ?>Z - - getDescription() ?> - getAuthor() ) { ?>getAuthor() ?> - foobar + formatTime( $item->getDate() ) ?>Z + + + getDescription() ?> + getAuthor() ) { ?>getAuthor() ?> -getComments() ) { ?>getComments() ?> - */ + */ } - + /** - * @todo document + * Outputs the footer for Atom 1.0 feed (basicly '\'). */ function outFooter() {?>