diff options
author | Gina Haeussge <osd@foosel.net> | 2009-11-10 21:34:04 +0100 |
---|---|---|
committer | Gina Haeussge <osd@foosel.net> | 2009-11-10 21:34:04 +0100 |
commit | 4bf3df7c70a3260fd2d9d78b0fe37d3519ed7f65 (patch) | |
tree | 88c29f94e7c16a55809010639323bb42daa0d2e4 | |
parent | ef457c67624460b5703178e7b11edc2f9fffda01 (diff) | |
download | rpg-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
-rw-r--r-- | feed.php | 284 |
1 files changed, 154 insertions, 130 deletions
@@ -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 : |