 |
This extension stores its source code on a wiki page. Please be aware that this code may be unreviewed or maliciously altered. They may contain security holes, outdated interfaces that are no longer compatible etc.
Note: No localisation updates are provided for this extension by translatewiki.net.
The developer is encouraged and invited to request access to MediaWiki's code repository to address this. |
 |
The author of this extension is no longer maintaining it! Meaning any reports for additional features and/or bugfixes will more than likely be ignored. Volunteers are encouraged to take on the task of developing and maintaining it. As a courtesy, you may want to contact the author. You should also remove this template and list yourself as maintaining the extension in the page's {{extension}} infobox.
|
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
<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]
<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]
- Copy the code from the section with the code
- Place the code in a file called
BulletFeed.php
- Create a directory
BulletFeed in your $IP/extensions directory
- Move the file to this
$IP/extensions/BulletFeed directory
- Add to the end of LocalSettings.php:
require_once("$IP/extensions/BulletFeed/BulletFeed.php");
- Installation can now be verified through Special:Version on your wiki
- 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]
- 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]