Skip to content
Snippets Groups Projects
Commit 4bf3df7c authored by Gina Haeussge's avatar Gina Haeussge
Browse files

Introduced new events in feed.php for preprocessing the wiki's feeds

Ignore-this: 4032feaea914f4b03dcdc4656837a11a
This patch introduces three new events, FEED_OPTS_POSTPROCESS, FEED_MODE_UNKNOWN and FEED_DATA_PROCESS that allow for action plugins to hook into every part of the feed creation process.

darcs-hash:20091110203404-2b4f5-54f2f928302e02459cc6bf7927438cceae3f2cc2.gz
parent ef457c67
No related branches found
No related tags found
No related merge requests found
......@@ -59,14 +59,24 @@ $image->url = DOKU_URL."lib/images/favicon.ico";
$image->link = DOKU_URL;
$rss->image = $image;
$data = null;
if($opt['feed_mode'] == 'list'){
rssListNamespace($rss,$opt);
$data = rssListNamespace($opt);
}elseif($opt['feed_mode'] == 'search'){
rssSearch($rss,$opt);
$data = rssSearch($opt);
}else{
rssRecentChanges($rss,$opt);
$eventData = array(
'opt' => &$opt,
'data' => &$data,
);
$event = new Doku_Event('FEED_MODE_UNKNOWN', $eventData);
if ($event->advise_before(true)) {
$data = rssRecentChanges($opt);
}
$event->advise_after();
}
rss_buildItems($rss, $data, $opt);
$feed = $rss->createFeed($opt['feed_type'],'utf-8');
// save cachefile
......@@ -121,6 +131,11 @@ function rss_parseOptions(){
$opt['feed_type'] = 'RSS1.0';
$opt['mime_type'] = 'application/xml';
}
$eventData = array(
'opt' => &$opt,
);
trigger_event('FEED_OPTS_POSTPROCESS', $eventData);
return $opt;
}
......@@ -137,139 +152,148 @@ function rss_buildItems(&$rss,&$data,$opt){
global $lang;
global $auth;
foreach($data as $ditem){
if(!is_array($ditem)){
// not an array? then only a list of IDs was given
$ditem = array( 'id' => $ditem );
}
$eventData = array(
'rss' => &$rss,
'data' => &$data,
'opt' => &$opt,
);
$event = new Doku_Event('FEED_DATA_PROCESS', $eventData);
if ($event->advise_before(false)){
foreach($data as $ditem){
if(!is_array($ditem)){
// not an array? then only a list of IDs was given
$ditem = array( 'id' => $ditem );
}
$item = new FeedItem();
$id = $ditem['id'];
$meta = p_get_metadata($id);
// add date
if($ditem['date']){
$date = $ditem['date'];
}elseif($meta['date']['modified']){
$date = $meta['date']['modified'];
}else{
$date = @filemtime(wikiFN($id));
}
if($date) $item->date = date('r',$date);
$item = new FeedItem();
$id = $ditem['id'];
$meta = p_get_metadata($id);
// add title
if($conf['useheading'] && $meta['title']){
$item->title = $meta['title'];
}else{
$item->title = $ditem['id'];
}
if($conf['rss_show_summary'] && !empty($ditem['sum'])){
$item->title .= ' - '.strip_tags($ditem['sum']);
}
// add date
if($ditem['date']){
$date = $ditem['date'];
}elseif($meta['date']['modified']){
$date = $meta['date']['modified'];
}else{
$date = @filemtime(wikiFN($id));
}
if($date) $item->date = date('r',$date);
// add item link
switch ($opt['link_to']){
case 'page':
$item->link = wl($id,'rev='.$date,true,'&');
break;
case 'rev':
$item->link = wl($id,'do=revisions&rev='.$date,true,'&');
break;
case 'current':
$item->link = wl($id, '', true,'&');
break;
case 'diff':
default:
$item->link = wl($id,'rev='.$date.'&do=diff',true,'&');
}
// add title
if($conf['useheading'] && $meta['title']){
$item->title = $meta['title'];
}else{
$item->title = $ditem['id'];
}
if($conf['rss_show_summary'] && !empty($ditem['sum'])){
$item->title .= ' - '.strip_tags($ditem['sum']);
}
// add item content
switch ($opt['item_content']){
case 'diff':
case 'htmldiff':
require_once(DOKU_INC.'inc/DifferenceEngine.php');
$revs = getRevisions($id, 0, 1);
$rev = $revs[0];
if($rev){
$df = new Diff(explode("\n",htmlspecialchars(rawWiki($id,$rev))),
explode("\n",htmlspecialchars(rawWiki($id,''))));
}else{
$df = new Diff(array(''),
explode("\n",htmlspecialchars(rawWiki($id,''))));
}
// add item link
switch ($opt['link_to']){
case 'page':
$item->link = wl($id,'rev='.$date,true,'&');
break;
case 'rev':
$item->link = wl($id,'do=revisions&rev='.$date,true,'&');
break;
case 'current':
$item->link = wl($id, '', true,'&');
break;
case 'diff':
default:
$item->link = wl($id,'rev='.$date.'&do=diff',true,'&');
}
if($opt['item_content'] == 'htmldiff'){
$tdf = new TableDiffFormatter();
$content = '<table>';
$content .= '<tr><th colspan="2" width="50%">'.$rev.'</th>';
$content .= '<th colspan="2" width="50%">'.$lang['current'].'</th></tr>';
$content .= $tdf->format($df);
$content .= '</table>';
// add item content
switch ($opt['item_content']){
case 'diff':
case 'htmldiff':
require_once(DOKU_INC.'inc/DifferenceEngine.php');
$revs = getRevisions($id, 0, 1);
$rev = $revs[0];
if($rev){
$df = new Diff(explode("\n",htmlspecialchars(rawWiki($id,$rev))),
explode("\n",htmlspecialchars(rawWiki($id,''))));
}else{
$df = new Diff(array(''),
explode("\n",htmlspecialchars(rawWiki($id,''))));
}
if($opt['item_content'] == 'htmldiff'){
$tdf = new TableDiffFormatter();
$content = '<table>';
$content .= '<tr><th colspan="2" width="50%">'.$rev.'</th>';
$content .= '<th colspan="2" width="50%">'.$lang['current'].'</th></tr>';
$content .= $tdf->format($df);
$content .= '</table>';
}else{
$udf = new UnifiedDiffFormatter();
$content = "<pre>\n".$udf->format($df)."\n</pre>";
}
break;
case 'html':
$content = p_wiki_xhtml($id,$date,false);
// no TOC in feeds
$content = preg_replace('/(<!-- TOC START -->).*(<!-- TOC END -->)/s','',$content);
// make URLs work when canonical is not set, regexp instead of rerendering!
if(!$conf['canonical']){
$base = preg_quote(DOKU_REL,'/');
$content = preg_replace('/(<a href|<img src)="('.$base.')/s','$1="'.DOKU_URL,$content);
}
break;
case 'abstract':
default:
$content = $meta['description']['abstract'];
}
$item->description = $content; //FIXME a plugin hook here could be senseful
// add user
# FIXME should the user be pulled from metadata as well?
$user = null;
$user = @$ditem['user']; // the @ spares time repeating lookup
$item->author = '';
if($user && $conf['useacl'] && $auth){
$userInfo = $auth->getUserData($user);
$item->author = $userInfo['name'];
if($userInfo && !$opt['guardmail']){
$item->authorEmail = $userInfo['mail'];
}else{
$udf = new UnifiedDiffFormatter();
$content = "<pre>\n".$udf->format($df)."\n</pre>";
//cannot obfuscate because some RSS readers may check validity
$item->authorEmail = $user.'@'.$recent['ip'];
}
break;
case 'html':
$content = p_wiki_xhtml($id,$date,false);
// no TOC in feeds
$content = preg_replace('/(<!-- TOC START -->).*(<!-- TOC END -->)/s','',$content);
// make URLs work when canonical is not set, regexp instead of rerendering!
if(!$conf['canonical']){
$base = preg_quote(DOKU_REL,'/');
$content = preg_replace('/(<a href|<img src)="('.$base.')/s','$1="'.DOKU_URL,$content);
}
break;
case 'abstract':
default:
$content = $meta['description']['abstract'];
}
$item->description = $content; //FIXME a plugin hook here could be senseful
// add user
# FIXME should the user be pulled from metadata as well?
$user = null;
$user = @$ditem['user']; // the @ spares time repeating lookup
$item->author = '';
if($user && $conf['useacl'] && $auth){
$userInfo = $auth->getUserData($user);
$item->author = $userInfo['name'];
if($userInfo && !$opt['guardmail']){
$item->authorEmail = $userInfo['mail'];
}else{
//cannot obfuscate because some RSS readers may check validity
}elseif($user){
// this happens when no ACL but some Apache auth is used
$item->author = $user;
$item->authorEmail = $user.'@'.$recent['ip'];
}else{
$item->authorEmail = 'anonymous@'.$recent['ip'];
}
}elseif($user){
// this happens when no ACL but some Apache auth is used
$item->author = $user;
$item->authorEmail = $user.'@'.$recent['ip'];
}else{
$item->authorEmail = 'anonymous@'.$recent['ip'];
}
// add category
if($meta['subject']){
$item->category = $meta['subject'];
}else{
$cat = getNS($id);
if($cat) $item->category = $cat;
}
// add category
if($meta['subject']){
$item->category = $meta['subject'];
}else{
$cat = getNS($id);
if($cat) $item->category = $cat;
}
// finally add the item to the feed object, after handing it to registered plugins
$evdata = array('item' => &$item,
'opt' => &$opt,
'ditem' => &$ditem,
'rss' => &$rss);
$evt = new Doku_Event('FEED_ITEM_ADD', $evdata);
if ($evt->advise_before()){
$rss->addItem($item);
// finally add the item to the feed object, after handing it to registered plugins
$evdata = array('item' => &$item,
'opt' => &$opt,
'ditem' => &$ditem,
'rss' => &$rss);
$evt = new Doku_Event('FEED_ITEM_ADD', $evdata);
if ($evt->advise_before()){
$rss->addItem($item);
}
$evt->advise_after(); // for completeness
}
$evt->advise_after(); // for completeness
}
$event->advise_after();
}
......@@ -278,7 +302,7 @@ function rss_buildItems(&$rss,&$data,$opt){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function rssRecentChanges(&$rss,$opt){
function rssRecentChanges($opt){
global $conf;
global $auth;
......@@ -286,8 +310,7 @@ function rssRecentChanges(&$rss,$opt){
if(!$opt['show_minor']) $flags += RECENTS_SKIP_MINORS;
$recents = getRecents(0,$opt['items'],$opt['namespace'],$flags);
rss_buildItems($rss,$recents,$opt);
return $recents;
}
/**
......@@ -295,7 +318,7 @@ function rssRecentChanges(&$rss,$opt){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function rssListNamespace(&$rss,$opt){
function rssListNamespace($opt){
require_once(DOKU_INC.'inc/search.php');
global $conf;
......@@ -306,7 +329,7 @@ function rssListNamespace(&$rss,$opt){
sort($data);
search($data,$conf['datadir'],'search_list','',$ns);
rss_buildItems($rss,$data,$opt);
return $data;
}
/**
......@@ -314,14 +337,15 @@ function rssListNamespace(&$rss,$opt){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function rssSearch(&$rss,$opt){
function rssSearch($opt){
if(!$opt['search_query']) return;
require_once(DOKU_INC.'inc/fulltext.php');
$data = array();
$data = ft_pageSearch($opt['search_query'],$poswords);
$data = array_keys($data);
rss_buildItems($rss,$data,$opt);
return $data;
}
//Setup VIM: ex: et ts=4 enc=utf-8 :
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment