aboutsummaryrefslogtreecommitdiff
path: root/lib/dokuwiki/feed.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dokuwiki/feed.php')
-rw-r--r--lib/dokuwiki/feed.php353
1 files changed, 0 insertions, 353 deletions
diff --git a/lib/dokuwiki/feed.php b/lib/dokuwiki/feed.php
deleted file mode 100644
index e7ea5808c..000000000
--- a/lib/dokuwiki/feed.php
+++ /dev/null
@@ -1,353 +0,0 @@
-<?php
-/**
- * XML feed export
- *
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-
-if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/');
-require_once(DOKU_INC.'inc/init.php');
-require_once(DOKU_INC.'inc/common.php');
-require_once(DOKU_INC.'inc/events.php');
-require_once(DOKU_INC.'inc/parserutils.php');
-require_once(DOKU_INC.'inc/feedcreator.class.php');
-require_once(DOKU_INC.'inc/auth.php');
-require_once(DOKU_INC.'inc/pageutils.php');
-require_once(DOKU_INC.'inc/httputils.php');
-
-//close session
-session_write_close();
-
-// get params
-$opt = rss_parseOptions();
-
-// the feed is dynamic - we need a cache for each combo
-// (but most people just use the default feed so it's still effective)
-$cache = getCacheName(join('',array_values($opt)).$_SERVER['REMOTE_USER'],'.feed');
-$key = join('', array_values($opt)) . $_SERVER['REMOTE_USER'];
-$cache = new cache($key, '.feed');
-
-// prepare cache depends
-$depends['files'] = getConfigFiles('main');
-$depends['age'] = $conf['rss_update'];
-$depends['purge'] = ($_REQUEST['purge']) ? true : false;
-
-// check cacheage and deliver if nothing has changed since last
-// time or the update interval has not passed, also handles conditional requests
-header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
-header('Pragma: public');
-header('Content-Type: application/xml; charset=utf-8');
-header('X-Robots-Tag: noindex');
-if($cache->useCache($depends)) {
- http_conditionalRequest($cache->_time);
- if($conf['allowdebug']) header("X-CacheUsed: $cache->cache");
- print $cache->retrieveCache();
- exit;
-} else {
- http_conditionalRequest(time());
- }
-
-// create new feed
-$rss = new DokuWikiFeedCreator();
-$rss->title = $conf['title'].(($opt['namespace']) ? ' '.$opt['namespace'] : '');
-$rss->link = DOKU_URL;
-$rss->syndicationURL = DOKU_URL.'feed.php';
-$rss->cssStyleSheet = DOKU_URL.'lib/exe/css.php?s=feed';
-
-$image = new FeedImage();
-$image->title = $conf['title'];
-$image->url = DOKU_URL."lib/images/favicon.ico";
-$image->link = DOKU_URL;
-$rss->image = $image;
-
-$data = null;
-if($opt['feed_mode'] == 'list'){
- $data = rssListNamespace($opt);
-}elseif($opt['feed_mode'] == 'search'){
- $data = rssSearch($opt);
-}else{
- $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
-$cache->storeCache($feed);
-
-// finally deliver
-print $feed;
-
-// ---------------------------------------------------------------- //
-
-/**
- * Get URL parameters and config options and return a initialized option array
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-function rss_parseOptions(){
- global $conf;
-
- $opt['items'] = (int) $_REQUEST['num'];
- $opt['feed_type'] = $_REQUEST['type'];
- $opt['feed_mode'] = $_REQUEST['mode'];
- $opt['show_minor'] = $_REQUEST['minor'];
- $opt['namespace'] = $_REQUEST['ns'];
- $opt['link_to'] = $_REQUEST['linkto'];
- $opt['item_content'] = $_REQUEST['content'];
- $opt['search_query'] = $_REQUEST['q'];
-
- if(!$opt['feed_type']) $opt['feed_type'] = $conf['rss_type'];
- if(!$opt['item_content']) $opt['item_content'] = $conf['rss_content'];
- if(!$opt['link_to']) $opt['link_to'] = $conf['rss_linkto'];
- if(!$opt['items']) $opt['items'] = $conf['recent'];
- $opt['guardmail'] = ($conf['mailguard'] != '' && $conf['mailguard'] != 'none');
-
- switch ($opt['feed_type']){
- case 'rss':
- $opt['feed_type'] = 'RSS0.91';
- $opt['mime_type'] = 'text/xml';
- break;
- case 'rss2':
- $opt['feed_type'] = 'RSS2.0';
- $opt['mime_type'] = 'text/xml';
- break;
- case 'atom':
- $opt['feed_type'] = 'ATOM0.3';
- $opt['mime_type'] = 'application/xml';
- break;
- case 'atom1':
- $opt['feed_type'] = 'ATOM1.0';
- $opt['mime_type'] = 'application/atom+xml';
- break;
- default:
- $opt['feed_type'] = 'RSS1.0';
- $opt['mime_type'] = 'application/xml';
- }
-
- $eventData = array(
- 'opt' => &$opt,
- );
- trigger_event('FEED_OPTS_POSTPROCESS', $eventData);
- return $opt;
-}
-
-/**
- * Add recent changed pages to a feed object
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @param object $rss - the FeedCreator Object
- * @param array $data - the items to add
- * @param array $opt - the feed options
- */
-function rss_buildItems(&$rss,&$data,$opt){
- global $conf;
- global $lang;
- global $auth;
-
- $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);
-
- // 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 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 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{
- //cannot obfuscate because some RSS readers may check validity
- $item->authorEmail = $user.'@'.$ditem['ip'];
- }
- }elseif($user){
- // this happens when no ACL but some Apache auth is used
- $item->author = $user;
- $item->authorEmail = $user.'@'.$ditem['ip'];
- }else{
- $item->authorEmail = 'anonymous@'.$ditem['ip'];
- }
-
- // 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);
- }
- $evt->advise_after(); // for completeness
- }
- }
- $event->advise_after();
-}
-
-
-/**
- * Add recent changed pages to the feed object
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-function rssRecentChanges($opt){
- global $conf;
- global $auth;
-
- $flags = RECENTS_SKIP_DELETED;
- if(!$opt['show_minor']) $flags += RECENTS_SKIP_MINORS;
-
- $recents = getRecents(0,$opt['items'],$opt['namespace'],$flags);
- return $recents;
-}
-
-/**
- * Add all pages of a namespace to the feed object
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-function rssListNamespace($opt){
- require_once(DOKU_INC.'inc/search.php');
- global $conf;
-
- $ns=':'.cleanID($opt['namespace']);
- $ns=str_replace(':','/',$ns);
-
- $data = array();
- sort($data);
- search($data,$conf['datadir'],'search_list','',$ns);
-
- return $data;
-}
-
-/**
- * Add the result of a full text search to the feed object
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-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);
-
- return $data;
-}
-
-//Setup VIM: ex: et ts=4 enc=utf-8 :