summaryrefslogtreecommitdiff
path: root/feed.php
diff options
context:
space:
mode:
authorGina Haeussge <osd@foosel.net>2009-11-10 21:34:04 +0100
committerGina Haeussge <osd@foosel.net>2009-11-10 21:34:04 +0100
commit4bf3df7c70a3260fd2d9d78b0fe37d3519ed7f65 (patch)
tree88c29f94e7c16a55809010639323bb42daa0d2e4 /feed.php
parentef457c67624460b5703178e7b11edc2f9fffda01 (diff)
downloadrpg-4bf3df7c70a3260fd2d9d78b0fe37d3519ed7f65.tar.gz
rpg-4bf3df7c70a3260fd2d9d78b0fe37d3519ed7f65.tar.bz2
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
Diffstat (limited to 'feed.php')
-rw-r--r--feed.php284
1 files changed, 154 insertions, 130 deletions
diff --git a/feed.php b/feed.php
index cc4b08442..26af0096f 100644
--- a/feed.php
+++ b/feed.php
@@ -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 :