Extension:Bullet Feed

From MediaWiki.org
Jump to: navigation, search
MediaWiki extensions manual
Crystal Clear action run.png
Bullet Feed

Release status: beta

Bulletfeedex.jpg
Implementation Tag, Page action
Description Allows a minimalistic bullet-style news page thrown into a simple RSS feed.
Author(s) Cory Perry (cperrytalk)
Latest version 1.2b (2008-02-05)
MediaWiki 1.9.+
Database changes No
License Open/Don't care
Download see code section
Example hdwiki.nmu.edu
Tags
<bullet_feed>,
<rss-desc>
Hooks used
UnknownAction

Translate the Bullet Feed extension if it is available at translatewiki.net

Check usage and version matrix; code metrics

The Bullet Feed extension adds an action to pages that allows a bulleted list to be displayed as an RSS feed for easy updating and formatting on, for example, a main page. Links are not required for items, and if no link is given, the default link is http://yoursite.com/index.php?title=my_page#MY%20ITEM%20TITLE substituting where needed. This project was initially intended for a minimalistic view of the news page that could be posted on the main page without needing to reformat the page. Such example main pages would be

Usage[edit | edit source]

<bullet_feed title=TITLE desc=DESC>
*Item1 [link]                    <!-- Link Optional -->
<rss-desc>ITEM DESCRIPTION</rss-desc> <!-- Optional -->
</bullet_feed>

Enclose the bulleted-list in the tags <bullet_feed> and </bullet_feed>, with the descriptions listed in between the tags <rss-desc> and </rss-desc>. This extension automatically puts an alternative link in the source of the page, so the orange RSS icon shown in Firefox or Internet Explorer 7 will revert to the RSS link, or you can access it directly via: http://yoursite.com/index.php?title=my_page&action=bullet_feed.

Example[edit | edit source]

<bullet_feed title="My News Feed" desc="A description of my news feed and what it does.">
* Item with [http://mysite.com link]
* Item without link
* Item with a description
<rss-desc>This is an example of an item with a description.</rss-desc>
* ''Item with other formatting options''
</bullet_feed>

Installation[edit | edit source]

  1. Copy the code from the section with the code
  2. Place the code in a file called BulletFeed.php
  3. Create a directory BulletFeed in your $IP/extensions directory
  4. Move the file to this $IP/extensions/BulletFeed directory
  5. Add to the end of LocalSettings.php:
    require_once("$IP/extensions/BulletFeed/BulletFeed.php");
  6. Installation can now be verified through Special:Version on your wiki

Code[edit | edit source]

BulletFeed.php
<?php
/*
*  Bullet_feed, by Cory Perry (cperry@nmu.edu).  Made to keep the formatting 
*  on the main page of the hdwiki while still parsing the data
*  into an xml file built on the fly and accessed in real-time
*
*  Usage:
*  <bullet_feed title="My Title" desc="My Feed's Description">
*  *Title of item #1
*  <rss-desc>Description of news item</rss-desc>
*  *Title of item #2
*  *Title of [[item #3]]
*  <rss-desc>This item has an automatic link</rss-desc>
*  </bullet_feed>
*/
require_once("$IP/includes/Feed.php");
require_once("$IP/includes/Sanitizer.php");
$wgExtensionCredits['parserhook'][] = array(
    'name' => 'Bullet Feed',
    'version' => '1.2b',
    'author' => 'Cory Perry',
    'url' => 'https://www.mediawiki.org/wiki/Extension:Bullet_Feed',
    'description' => 'Allows a minimalistic bullet-style news page thrown into a simple RSS feed',
    'descriptionmsg' => 'bulletfeed-desc',
);
$wgHooks['UnknownAction'][]='feedAction';
$wgExtensionFunctions[] = 'feedSetup';
/*feedSetup:
* Setup the tag parsing hook functions.
*/
function feedSetup() {
    global $wgParser;
    $wgParser->setHook( 'bullet_feed', 'feedParse' );
    $wgParser->setHook('rss-url','urlParse');
    $wgParser->setHook('rss-desc','descParse');
}
/*descParse:
*Parse the <rss-desc> tags and output 
*the html code in comments for parsing later in the action field.
*Used to grab the description of the news item.
*Params:
*$input: text inclosed by the wiki tags
*$args: any arguments passed to the tags, ignored here.
*$parser: pointer to the parser class that holds all 
*the tag/extension modifiers (usually $wgOut)
*/
function descParse( $input, $args, $parser ) {
    return '<!-- rss-desc text="'.$parser->recursiveTagParse($input).'" -->';
}
/*urlParse *UNIMPLEMENTED*:
*Parse the <url-desc> tags and output 
*the html code in comments for parsing later in the action field
*Used to grab a direct URL from the wiki tags. 
*Params:
*$input: text inclosed by the wiki tags
*$args: any arguments passed to the tags, ignored here.
*$parser: pointer to the parser class that holds all 
*the tag/extension modifiers (usually $wgOut)
*/
function urlParse( $input, $args, $parser ) {
    return '<!-- rss-url text="'.$input.'" -->';
}
$glob_match=array();
/*feedParse :
*Surrounds the RSS feed in enclosing comment fields for easy parsing.
*Also adds a bit of html code for supported browsers to redirect to 
*the RSS feed from the main page.
*Params:
*$input: text inclosed by the wiki tags
*$args: any arguments passed to the tags, like title="", desc="" for 
*the site.  All others are added but ignored in the RSS feed action.
*$parser: pointer to the parser class that holds all 
*the tag/extension modifiers (usually $wgOut)
*/
function feedParse( $input, $args, $parser ) {
    global $wgServer, $wgScript, $wgTitle;
    $str=$parser->recursiveTagParse($input); //Get html code of page
    //vv-- Make-up a header that includes the redirect feature.
    $header='<link rel="alternate" type="application/rss+xml" title="News Feed" href="'.$wgTitle->getLocalUrl( 'action=bullet_feed' ).'" /><!-- FEED_START -->'.'<!-- ';
    foreach($args as $name=>$value){	//Add the arguments as comments to the code.
    	$header.=$name.'="'.$value.'" ';
    }
    $header.='-->';
    return $header.$str.'<!-- FEED_END -->';	//Return the fully parsed html code where the tags were before.
}
/*feedAction:
*Core code for outputting the actual RSS xml file on the fly.
*Called on by http://mysite.ext/index.php?title=my_page&action=bullet_feed
*Params:
*$action: action and arguments sent via address. (arguments ignored).
*$article: Entire article object to be parsed.
*/
function feedAction($action,$article){
	global $wgOut,$wgScriptPath,$wgServer;
	if(!($action=='bullet_feed')){ return true;}
	//Parse the article into html and strip out the table of contents and edit sections
	$content = $wgOut->parse($article->getContent()."\n__NOEDITSECTION__ __NOTOC__");
	//Get the page address for use as a default link.
	preg_match('/^http:\/\/(.*?)\//s',$article->getTitle()->getFullUrl(),$site);
	$site='http://'.$site[1].$wgScriptPath;
	//Cut out all the extra stuff and grab the RSS arguments within the html code.
	preg_match_all('/<!--\\s*FEED_START\\s*-->(.*?)<!--\\s*FEED_END\\s*-->/s',$content,$matches);
	preg_match('/<!--(?:.*?)title=\"(.*?)\"/s',$matches[1][0],$Feedtitle);
	preg_match('/<!--(?:.*?)desc=\"(.*?)\"/s',$matches[1][0],$Feeddesc);
	foreach($matches[1] as $feedKey=>$feed){
		//Make a new standard RSSFeed object to use to output the xml
		$feedStream = new RSSFeed($Feedtitle[1],$Feeddesc[1], $site);
		$feedStream->outHeader();
		//Split the code into news items.
		$titles=preg_split('/<li>(.*?)/s',$feed);
		foreach($titles as $titlekey=>$title){
			if(preg_match('/[A-Za-z1-9]+/',strip_tags($title))==0) continue;
			$link=$article->getTitle()->getFullUrl();
			//If there's a link in the title, use that as the RSS link,
			//otherwise, use the default site link.
			preg_match('/<!--(?:.*?)rss-desc text=\"(.*?)\" -->/s',$title,$desc);
			$title=str_replace($desc,'',$title);
			if(preg_match('/href=\"(.*?)\"/',$title)>0){
				preg_match('/href="(.*?)"/',htmlspecialchars_decode($title),$temp);
				$link=$temp[1];
				if(preg_match('/^\/(.*?)/',$link)){
					$link=$wgServer.$link;
				}
			}
			//Grab the description of the item.
			$i=new FeedItem(strip_tags($title),$desc[1],$link.'#'.strip_tags($title),$Date=wfTimestampNow()-$titlekey);
			$feedStream->outItem($i);
		}
		$feedStream->outFooter();
		die();//<--Not sure if needed
	}
	return false;//<--Don't let wiki parse this article further.
}

Thanks[edit | edit source]

  • Christopher Finke for helping me out with some issues with his RSS Ticker, an add-on for firefox
  • The immense contributors here on the MediaWiki extensions, your code helped understand the wiki much better to accomplish the goal.

See also[edit | edit source]