xref: /dokuwiki/feed.php (revision 6dd095f599ed20044f98d324cda37bedd57b3d3e)
1f3f0262cSandi<?php
215fae107Sandi/**
315fae107Sandi * XML feed export
415fae107Sandi *
515fae107Sandi * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
615fae107Sandi * @author     Andreas Gohr <andi@splitbrain.org>
715fae107Sandi */
815fae107Sandi
9d0a27cb0SAndreas Gohrif(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/');
10ed7b5f09Sandirequire_once(DOKU_INC.'inc/init.php');
11f3f0262cSandi
127131b668SAndreas Gohr//close session
138746e727Sandisession_write_close();
148746e727Sandi
154ab889eaSAndreas Gohr// get params
164ab889eaSAndreas Gohr$opt = rss_parseOptions();
17f3f0262cSandi
187131b668SAndreas Gohr// the feed is dynamic - we need a cache for each combo
197131b668SAndreas Gohr// (but most people just use the default feed so it's still effective)
202f1faf49SAndreas Gohr$cache = getCacheName(join('',array_values($opt)).$_SERVER['REMOTE_USER'],'.feed');
210d67055cSMichael Klier$key   = join('', array_values($opt)) . $_SERVER['REMOTE_USER'];
220d67055cSMichael Klier$cache = new cache($key, '.feed');
230d67055cSMichael Klier
240d67055cSMichael Klier// prepare cache depends
250d67055cSMichael Klier$depends['files'] = getConfigFiles('main');
260d67055cSMichael Klier$depends['age']   = $conf['rss_update'];
27b5a0be43SAdrian Lang$depends['purge'] = isset($_REQUEST['purge']);
28f3f0262cSandi
297131b668SAndreas Gohr// check cacheage and deliver if nothing has changed since last
30fbf82939SBen Coburn// time or the update interval has not passed, also handles conditional requests
31fbf82939SBen Coburnheader('Cache-Control: must-revalidate, post-check=0, pre-check=0');
32fbf82939SBen Coburnheader('Pragma: public');
337131b668SAndreas Gohrheader('Content-Type: application/xml; charset=utf-8');
3450ddb617SAndreas Gohrheader('X-Robots-Tag: noindex');
350d67055cSMichael Klierif($cache->useCache($depends)) {
360d67055cSMichael Klier    http_conditionalRequest($cache->_time);
370d67055cSMichael Klier    if($conf['allowdebug']) header("X-CacheUsed: $cache->cache");
380d67055cSMichael Klier    print $cache->retrieveCache();
397131b668SAndreas Gohr    exit;
40fbf82939SBen Coburn} else {
41fbf82939SBen Coburn    http_conditionalRequest(time());
427131b668SAndreas Gohr }
437131b668SAndreas Gohr
447131b668SAndreas Gohr// create new feed
45f3f0262cSandi$rss = new DokuWikiFeedCreator();
464ab889eaSAndreas Gohr$rss->title = $conf['title'].(($opt['namespace']) ? ' '.$opt['namespace'] : '');
47ed7b5f09Sandi$rss->link  = DOKU_URL;
48f62ea8a1Sandi$rss->syndicationURL = DOKU_URL.'feed.php';
49615960feSTom N Harris$rss->cssStyleSheet  = DOKU_URL.'lib/exe/css.php?s=feed';
50f3f0262cSandi
5179b608ceSandi$image = new FeedImage();
5279b608ceSandi$image->title = $conf['title'];
53d6b643faSMatthias Schulte$image->url = tpl_getFavicon(true);
5479b608ceSandi$image->link = DOKU_URL;
5579b608ceSandi$rss->image = $image;
5679b608ceSandi
574bf3df7cSGina Haeussge$data = null;
58b5a0be43SAdrian Lang$modes = array('list'   => 'rssListNamespace',
59b5a0be43SAdrian Lang               'search' => 'rssSearch',
60b5a0be43SAdrian Lang               'recent' => 'rssRecentChanges');
61b5a0be43SAdrian Langif (isset($modes[$opt['feed_mode']])) {
62b5a0be43SAdrian Lang    $data = $modes[$opt['feed_mode']]($opt);
63f3f0262cSandi} else {
644bf3df7cSGina Haeussge    $eventData = array(
654bf3df7cSGina Haeussge        'opt'  => &$opt,
664bf3df7cSGina Haeussge        'data' => &$data,
674bf3df7cSGina Haeussge    );
684bf3df7cSGina Haeussge    $event = new Doku_Event('FEED_MODE_UNKNOWN', $eventData);
694bf3df7cSGina Haeussge    if ($event->advise_before(true)) {
70b5a0be43SAdrian Lang        echo sprintf('<error>Unknown feed mode %s</error>', hsc($opt['feed_mode']));
71b5a0be43SAdrian Lang        exit;
724bf3df7cSGina Haeussge    }
734bf3df7cSGina Haeussge    $event->advise_after();
74f3f0262cSandi}
75f3f0262cSandi
764bf3df7cSGina Haeussgerss_buildItems($rss, $data, $opt);
774ab889eaSAndreas Gohr$feed = $rss->createFeed($opt['feed_type'],'utf-8');
787131b668SAndreas Gohr
797131b668SAndreas Gohr// save cachefile
800d67055cSMichael Klier$cache->storeCache($feed);
817131b668SAndreas Gohr
827131b668SAndreas Gohr// finally deliver
837131b668SAndreas Gohrprint $feed;
84f3f0262cSandi
8515fae107Sandi// ---------------------------------------------------------------- //
86f3f0262cSandi
8715fae107Sandi/**
88b5a0be43SAdrian Lang * Get URL parameters and config options and return an initialized option array
8915fae107Sandi *
9015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
9115fae107Sandi */
924ab889eaSAndreas Gohrfunction rss_parseOptions(){
93f62ea8a1Sandi    global $conf;
94c0f9af6dSNathan Neulinger
95b5a0be43SAdrian Lang    $opt = array();
96f62ea8a1Sandi
97b5a0be43SAdrian Lang    foreach(array(
98b5a0be43SAdrian Lang                  // Basic feed properties
99b5a0be43SAdrian Lang                  // Plugins may probably want to add new values to these
100b5a0be43SAdrian Lang                  // properties for implementing own feeds
101b5a0be43SAdrian Lang
102b5a0be43SAdrian Lang                  // One of: list, search, recent
103b5a0be43SAdrian Lang                  'feed_mode'    => array('mode', 'recent'),
104b5a0be43SAdrian Lang                  // One of: diff, page, rev, current
105b5a0be43SAdrian Lang                  'link_to'      => array('linkto', $conf['rss_linkto']),
106b5a0be43SAdrian Lang                  // One of: abstract, diff, htmldiff, html
107b5a0be43SAdrian Lang                  'item_content' => array('content', $conf['rss_content']),
108b5a0be43SAdrian Lang
109b5a0be43SAdrian Lang                  // Special feed properties
110b5a0be43SAdrian Lang                  // These are only used by certain feed_modes
111b5a0be43SAdrian Lang
112b5a0be43SAdrian Lang                  // String, used for feed title, in list and rc mode
113b5a0be43SAdrian Lang                  'namespace'    => array('ns', null),
114b5a0be43SAdrian Lang                  // Positive integer, only used in rc mode
115b5a0be43SAdrian Lang                  'items'        => array('num', $conf['recent']),
116b5a0be43SAdrian Lang                  // Boolean, only used in rc mode
117b5a0be43SAdrian Lang                  'show_minor'   => array('minor', false),
118b5a0be43SAdrian Lang                  // String, only used in search mode
119b5a0be43SAdrian Lang                  'search_query' => array('q', null),
120*6dd095f5SKate Arzamastseva                // One of: pages, media, both
121*6dd095f5SKate Arzamastseva                  'content_type' => array('view', 'both')
122b5a0be43SAdrian Lang
123b5a0be43SAdrian Lang                 ) as $name => $val) {
124b5a0be43SAdrian Lang        $opt[$name] = (isset($_REQUEST[$val[0]]) && !empty($_REQUEST[$val[0]]))
125b5a0be43SAdrian Lang                      ? $_REQUEST[$val[0]] : $val[1];
126b5a0be43SAdrian Lang    }
127b5a0be43SAdrian Lang
128b5a0be43SAdrian Lang    $opt['items']        = max(0, (int)  $opt['items']);
129b5a0be43SAdrian Lang    $opt['show_minor']   = (bool) $opt['show_minor'];
130b5a0be43SAdrian Lang
1314ab889eaSAndreas Gohr    $opt['guardmail']  = ($conf['mailguard'] != '' && $conf['mailguard'] != 'none');
132b6912aeaSAndreas Gohr
133b5a0be43SAdrian Lang    $type = valid_input_set('type', array('rss','rss2','atom','atom1','rss1',
134b5a0be43SAdrian Lang                                          'default' => $conf['rss_type']),
135b5a0be43SAdrian Lang                            $_REQUEST);
136b5a0be43SAdrian Lang    switch ($type){
1374ab889eaSAndreas Gohr        case 'rss':
1384ab889eaSAndreas Gohr            $opt['feed_type'] = 'RSS0.91';
1394ab889eaSAndreas Gohr            $opt['mime_type'] = 'text/xml';
1404ab889eaSAndreas Gohr            break;
1414ab889eaSAndreas Gohr        case 'rss2':
1424ab889eaSAndreas Gohr            $opt['feed_type'] = 'RSS2.0';
1434ab889eaSAndreas Gohr            $opt['mime_type'] = 'text/xml';
1444ab889eaSAndreas Gohr            break;
1454ab889eaSAndreas Gohr        case 'atom':
1464ab889eaSAndreas Gohr            $opt['feed_type'] = 'ATOM0.3';
1474ab889eaSAndreas Gohr            $opt['mime_type'] = 'application/xml';
1484ab889eaSAndreas Gohr            break;
1494ab889eaSAndreas Gohr        case 'atom1':
1504ab889eaSAndreas Gohr            $opt['feed_type'] = 'ATOM1.0';
1514ab889eaSAndreas Gohr            $opt['mime_type'] = 'application/atom+xml';
1524ab889eaSAndreas Gohr            break;
1534ab889eaSAndreas Gohr        default:
1544ab889eaSAndreas Gohr            $opt['feed_type'] = 'RSS1.0';
1554ab889eaSAndreas Gohr            $opt['mime_type'] = 'application/xml';
1564ab889eaSAndreas Gohr    }
1574bf3df7cSGina Haeussge
1584bf3df7cSGina Haeussge    $eventData = array(
1594bf3df7cSGina Haeussge        'opt' => &$opt,
1604bf3df7cSGina Haeussge    );
1614bf3df7cSGina Haeussge    trigger_event('FEED_OPTS_POSTPROCESS', $eventData);
1624ab889eaSAndreas Gohr    return $opt;
1634ab889eaSAndreas Gohr}
164b6912aeaSAndreas Gohr
1654ab889eaSAndreas Gohr/**
1664ab889eaSAndreas Gohr * Add recent changed pages to a feed object
1674ab889eaSAndreas Gohr *
1684ab889eaSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
1694ab889eaSAndreas Gohr * @param  object $rss - the FeedCreator Object
1704ab889eaSAndreas Gohr * @param  array $data - the items to add
1714ab889eaSAndreas Gohr * @param  array $opt  - the feed options
1724ab889eaSAndreas Gohr */
1734ab889eaSAndreas Gohrfunction rss_buildItems(&$rss,&$data,$opt){
1744ab889eaSAndreas Gohr    global $conf;
1754ab889eaSAndreas Gohr    global $lang;
1763d581c29SAndreas Gohr    global $auth;
177883480fbSAndreas Gohr
1784bf3df7cSGina Haeussge    $eventData = array(
1794bf3df7cSGina Haeussge        'rss' => &$rss,
1804bf3df7cSGina Haeussge        'data' => &$data,
1814bf3df7cSGina Haeussge        'opt' => &$opt,
1824bf3df7cSGina Haeussge    );
1834bf3df7cSGina Haeussge    $event = new Doku_Event('FEED_DATA_PROCESS', $eventData);
1844bf3df7cSGina Haeussge    if ($event->advise_before(false)){
1854ab889eaSAndreas Gohr        foreach($data as $ditem){
1864bb1b5aeSAndreas Gohr            if(!is_array($ditem)){
1874bb1b5aeSAndreas Gohr                // not an array? then only a list of IDs was given
1884bb1b5aeSAndreas Gohr                $ditem = array( 'id' => $ditem );
1894bb1b5aeSAndreas Gohr            }
1904bb1b5aeSAndreas Gohr
191f3f0262cSandi            $item = new FeedItem();
1924ab889eaSAndreas Gohr            $id   = $ditem['id'];
193*6dd095f5SKate Arzamastseva            if(!$ditem['media']) {
1944ab889eaSAndreas Gohr                $meta = p_get_metadata($id);
195*6dd095f5SKate Arzamastseva            }
19603ee62cbSjoe.lapp
1974ab889eaSAndreas Gohr            // add date
1984ab889eaSAndreas Gohr            if($ditem['date']){
1994ab889eaSAndreas Gohr                $date = $ditem['date'];
2004ab889eaSAndreas Gohr            }elseif($meta['date']['modified']){
2014ab889eaSAndreas Gohr                $date = $meta['date']['modified'];
2024ab889eaSAndreas Gohr            }else{
2034ab889eaSAndreas Gohr                $date = @filemtime(wikiFN($id));
2044ab889eaSAndreas Gohr            }
2054ab889eaSAndreas Gohr            if($date) $item->date = date('r',$date);
2064ab889eaSAndreas Gohr
2074ab889eaSAndreas Gohr            // add title
2088716966dSAndreas Gohr            if($conf['useheading'] && $meta['title']){
2098716966dSAndreas Gohr                $item->title = $meta['title'];
2108716966dSAndreas Gohr            }else{
2114ab889eaSAndreas Gohr                $item->title = $ditem['id'];
21203ee62cbSjoe.lapp            }
2134ab889eaSAndreas Gohr            if($conf['rss_show_summary'] && !empty($ditem['sum'])){
2144ab889eaSAndreas Gohr                $item->title .= ' - '.strip_tags($ditem['sum']);
215b1a1915cSandi            }
2164d58bd99Sandi
2174ab889eaSAndreas Gohr            // add item link
2184ab889eaSAndreas Gohr            switch ($opt['link_to']){
2194d58bd99Sandi                case 'page':
220*6dd095f5SKate Arzamastseva                    if ($ditem['media']) {
221*6dd095f5SKate Arzamastseva                        $item->link = media_managerURL(array('image' => $id,
222*6dd095f5SKate Arzamastseva                            'ns' => getNS($id),
223*6dd095f5SKate Arzamastseva                            'rev' => $date), '&', true);
224*6dd095f5SKate Arzamastseva                    } else {
225*6dd095f5SKate Arzamastseva                        $item->link = wl($id,'rev='.$date,true,'&', true);
226*6dd095f5SKate Arzamastseva                    }
2274d58bd99Sandi                    break;
2284d58bd99Sandi                case 'rev':
229*6dd095f5SKate Arzamastseva                    if ($ditem['media']) {
230*6dd095f5SKate Arzamastseva                        $item->link = media_managerURL(array('image' => $id,
231*6dd095f5SKate Arzamastseva                            'ns' => getNS($id),
232*6dd095f5SKate Arzamastseva                            'rev' => $date,
233*6dd095f5SKate Arzamastseva                            'tab_details' => 'history'), '&', true);
234*6dd095f5SKate Arzamastseva                    } else {
2354ab889eaSAndreas Gohr                        $item->link = wl($id,'do=revisions&rev='.$date,true,'&');
236*6dd095f5SKate Arzamastseva                    }
2374d58bd99Sandi                    break;
23892e52d8dSjoe.lapp                case 'current':
239*6dd095f5SKate Arzamastseva                    if ($ditem['media']) {
240*6dd095f5SKate Arzamastseva                        $item->link = media_managerURL(array('image' => $id,
241*6dd095f5SKate Arzamastseva                            'ns' => getNS($id)), '&', true);
242*6dd095f5SKate Arzamastseva                    } else {
2434ab889eaSAndreas Gohr                        $item->link = wl($id, '', true,'&');
244*6dd095f5SKate Arzamastseva                    }
24592e52d8dSjoe.lapp                    break;
24692e52d8dSjoe.lapp                case 'diff':
2474d58bd99Sandi                default:
248*6dd095f5SKate Arzamastseva                    if ($ditem['media']) {
249*6dd095f5SKate Arzamastseva                        $item->link = media_managerURL(array('image' => $id,
250*6dd095f5SKate Arzamastseva                            'ns' => getNS($id),
251*6dd095f5SKate Arzamastseva                            'rev' => $date,
252*6dd095f5SKate Arzamastseva                            'tab_details' => 'history',
253*6dd095f5SKate Arzamastseva                            'mediado' => 'diff'), '&', true);
254*6dd095f5SKate Arzamastseva                    } else {
2554ab889eaSAndreas Gohr                        $item->link = wl($id,'rev='.$date.'&do=diff',true,'&');
2564d58bd99Sandi                    }
257*6dd095f5SKate Arzamastseva            }
2584d58bd99Sandi
2594ab889eaSAndreas Gohr            // add item content
2604ab889eaSAndreas Gohr            switch ($opt['item_content']){
2614ab889eaSAndreas Gohr                case 'diff':
2624ab889eaSAndreas Gohr                case 'htmldiff':
263*6dd095f5SKate Arzamastseva                    if ($ditem['media']) {
264*6dd095f5SKate Arzamastseva                        $revs = getRevisions($id, 0, 1, 8192, true);
265*6dd095f5SKate Arzamastseva                        $rev = $revs[0];
266*6dd095f5SKate Arzamastseva                        $src_r = '';
267*6dd095f5SKate Arzamastseva                        $src_l = '';
268*6dd095f5SKate Arzamastseva
269*6dd095f5SKate Arzamastseva                        if ($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)), 300)) {
270*6dd095f5SKate Arzamastseva                            $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
271*6dd095f5SKate Arzamastseva                            $src_r = ml($id, $more);
272*6dd095f5SKate Arzamastseva                        }
273*6dd095f5SKate Arzamastseva                        if ($rev && $size = media_image_preview_size($id, $rev, new JpegMeta(mediaFN($id, $rev)), 300)){
274*6dd095f5SKate Arzamastseva                            $more = 'rev='.$rev.'&w='.$size[0].'&h='.$size[1];
275*6dd095f5SKate Arzamastseva                            $src_l = ml($id, $more);
276*6dd095f5SKate Arzamastseva                        }
277*6dd095f5SKate Arzamastseva                        $content = '';
278*6dd095f5SKate Arzamastseva                        if ($src_r) {
279*6dd095f5SKate Arzamastseva                            $content  = '<table>';
280*6dd095f5SKate Arzamastseva                            $content .= '<tr><th width="50%">'.$rev.'</th>';
281*6dd095f5SKate Arzamastseva                            $content .= '<th width="50%">'.$lang['current'].'</th></tr>';
282*6dd095f5SKate Arzamastseva                            $content .= '<tr align="center"><td><img src="'.$src_l.'" alt="" /></td><td>';
283*6dd095f5SKate Arzamastseva                            $content .= '<img src="'.$src_r.'" alt="'.$id.'" /></td></tr>';
284*6dd095f5SKate Arzamastseva                            $content .= '</table>';
285*6dd095f5SKate Arzamastseva                        }
286*6dd095f5SKate Arzamastseva
287*6dd095f5SKate Arzamastseva                    } else {
2884ab889eaSAndreas Gohr                        require_once(DOKU_INC.'inc/DifferenceEngine.php');
2894ab889eaSAndreas Gohr                        $revs = getRevisions($id, 0, 1);
2904ab889eaSAndreas Gohr                        $rev = $revs[0];
2917a98db20Sjoe.lapp
2924ab889eaSAndreas Gohr                        if($rev){
2934ab889eaSAndreas Gohr                            $df  = new Diff(explode("\n",htmlspecialchars(rawWiki($id,$rev))),
2944ab889eaSAndreas Gohr                                            explode("\n",htmlspecialchars(rawWiki($id,''))));
2954ab889eaSAndreas Gohr                        }else{
2964ab889eaSAndreas Gohr                            $df  = new Diff(array(''),
2974ab889eaSAndreas Gohr                                            explode("\n",htmlspecialchars(rawWiki($id,''))));
2984ab889eaSAndreas Gohr                        }
2994ab889eaSAndreas Gohr
3004ab889eaSAndreas Gohr                        if($opt['item_content'] == 'htmldiff'){
3014ab889eaSAndreas Gohr                            $tdf = new TableDiffFormatter();
3024ab889eaSAndreas Gohr                            $content  = '<table>';
3034ab889eaSAndreas Gohr                            $content .= '<tr><th colspan="2" width="50%">'.$rev.'</th>';
3044ab889eaSAndreas Gohr                            $content .= '<th colspan="2" width="50%">'.$lang['current'].'</th></tr>';
3054ab889eaSAndreas Gohr                            $content .= $tdf->format($df);
3064ab889eaSAndreas Gohr                            $content .= '</table>';
3074ab889eaSAndreas Gohr                        }else{
3084ab889eaSAndreas Gohr                            $udf = new UnifiedDiffFormatter();
3094ab889eaSAndreas Gohr                            $content = "<pre>\n".$udf->format($df)."\n</pre>";
3104ab889eaSAndreas Gohr                        }
311*6dd095f5SKate Arzamastseva                    }
3124ab889eaSAndreas Gohr                    break;
3134ab889eaSAndreas Gohr                case 'html':
314*6dd095f5SKate Arzamastseva                    if ($ditem['media']) {
315*6dd095f5SKate Arzamastseva                        if ($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
316*6dd095f5SKate Arzamastseva                            $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
317*6dd095f5SKate Arzamastseva                            $src = ml($id, $more);
318*6dd095f5SKate Arzamastseva                            $content = '<img src="'.$src.'" alt="'.$id.'" />';
319*6dd095f5SKate Arzamastseva                        } else {
320*6dd095f5SKate Arzamastseva                            $content = '';
321*6dd095f5SKate Arzamastseva                        }
322*6dd095f5SKate Arzamastseva                    } else {
3234ab889eaSAndreas Gohr                        $content = p_wiki_xhtml($id,$date,false);
3244ab889eaSAndreas Gohr                        // no TOC in feeds
3254ab889eaSAndreas Gohr                        $content = preg_replace('/(<!-- TOC START -->).*(<!-- TOC END -->)/s','',$content);
3264ab889eaSAndreas Gohr
3274ab889eaSAndreas Gohr                        // make URLs work when canonical is not set, regexp instead of rerendering!
3284ab889eaSAndreas Gohr                        if(!$conf['canonical']){
3294ab889eaSAndreas Gohr                            $base = preg_quote(DOKU_REL,'/');
3304ab889eaSAndreas Gohr                            $content = preg_replace('/(<a href|<img src)="('.$base.')/s','$1="'.DOKU_URL,$content);
3314ab889eaSAndreas Gohr                        }
332*6dd095f5SKate Arzamastseva                    }
3334ab889eaSAndreas Gohr
3344ab889eaSAndreas Gohr                    break;
3354ab889eaSAndreas Gohr                case 'abstract':
3364ab889eaSAndreas Gohr                default:
337*6dd095f5SKate Arzamastseva                    if ($ditem['media']) {
338*6dd095f5SKate Arzamastseva                        if ($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
339*6dd095f5SKate Arzamastseva                            $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
340*6dd095f5SKate Arzamastseva                            $src = ml($id, $more);
341*6dd095f5SKate Arzamastseva                            $content = '<img src="'.$src.'" alt="'.$id.'" />';
342*6dd095f5SKate Arzamastseva                        } else {
343*6dd095f5SKate Arzamastseva                            $content = '';
344*6dd095f5SKate Arzamastseva                        }
345*6dd095f5SKate Arzamastseva                    } else {
3464ab889eaSAndreas Gohr                        $content = $meta['description']['abstract'];
3474ab889eaSAndreas Gohr                    }
348*6dd095f5SKate Arzamastseva            }
3494ab889eaSAndreas Gohr            $item->description = $content; //FIXME a plugin hook here could be senseful
3504ab889eaSAndreas Gohr
3514ab889eaSAndreas Gohr            // add user
3524ab889eaSAndreas Gohr            # FIXME should the user be pulled from metadata as well?
3534ab889eaSAndreas Gohr            $user = @$ditem['user']; // the @ spares time repeating lookup
3547a98db20Sjoe.lapp            $item->author = '';
3550f4f4adfSAndreas Gohr            if($user && $conf['useacl'] && $auth){
356c0f9af6dSNathan Neulinger                $userInfo = $auth->getUserData($user);
357681a59b2SGina Haeussge                if ($userInfo){
358681a59b2SGina Haeussge                    switch ($conf['showuseras']){
359681a59b2SGina Haeussge                        case 'username':
3607a98db20Sjoe.lapp                            $item->author = $userInfo['name'];
361681a59b2SGina Haeussge                            break;
362681a59b2SGina Haeussge                        default:
363681a59b2SGina Haeussge                            $item->author = $user;
364681a59b2SGina Haeussge                            break;
365681a59b2SGina Haeussge                    }
366681a59b2SGina Haeussge                } else {
367681a59b2SGina Haeussge                    $item->author = $user;
368681a59b2SGina Haeussge                }
369c1791678SAndreas Gohr                if($userInfo && !$opt['guardmail']){
370c1791678SAndreas Gohr                    $item->authorEmail = $userInfo['mail'];
371c1791678SAndreas Gohr                }else{
3727a98db20Sjoe.lapp                    //cannot obfuscate because some RSS readers may check validity
3730bda0363SAdrian Lang                    $item->authorEmail = $user.'@'.$ditem['ip'];
374f3f0262cSandi                }
375c5983034SAndreas Gohr            }elseif($user){
376c5983034SAndreas Gohr                // this happens when no ACL but some Apache auth is used
377c5983034SAndreas Gohr                $item->author      = $user;
3780bda0363SAdrian Lang                $item->authorEmail = $user.'@'.$ditem['ip'];
3797a98db20Sjoe.lapp            }else{
3800bda0363SAdrian Lang                $item->authorEmail = 'anonymous@'.$ditem['ip'];
3817a98db20Sjoe.lapp            }
3824ab889eaSAndreas Gohr
3834ab889eaSAndreas Gohr            // add category
384b5a0be43SAdrian Lang            if(isset($meta['subject'])) {
3854ab889eaSAndreas Gohr                $item->category = $meta['subject'];
3864ab889eaSAndreas Gohr            }else{
3874ab889eaSAndreas Gohr                $cat = getNS($id);
3884ab889eaSAndreas Gohr                if($cat) $item->category = $cat;
3894ab889eaSAndreas Gohr            }
3904ab889eaSAndreas Gohr
391883480fbSAndreas Gohr            // finally add the item to the feed object, after handing it to registered plugins
392883480fbSAndreas Gohr            $evdata = array('item'  => &$item,
393883480fbSAndreas Gohr                            'opt'   => &$opt,
394883480fbSAndreas Gohr                            'ditem' => &$ditem,
395883480fbSAndreas Gohr                            'rss'   => &$rss);
396209cd8e1SAndreas Gohr            $evt = new Doku_Event('FEED_ITEM_ADD', $evdata);
397883480fbSAndreas Gohr            if ($evt->advise_before()){
398f3f0262cSandi                $rss->addItem($item);
399f3f0262cSandi            }
400883480fbSAndreas Gohr            $evt->advise_after(); // for completeness
401883480fbSAndreas Gohr        }
402f3f0262cSandi    }
4034bf3df7cSGina Haeussge    $event->advise_after();
4044bf3df7cSGina Haeussge}
405f3f0262cSandi
4064ab889eaSAndreas Gohr
4074ab889eaSAndreas Gohr/**
4084bb1b5aeSAndreas Gohr * Add recent changed pages to the feed object
4094ab889eaSAndreas Gohr *
4104ab889eaSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
4114ab889eaSAndreas Gohr */
4124bf3df7cSGina Haeussgefunction rssRecentChanges($opt){
4134ab889eaSAndreas Gohr    $flags = RECENTS_SKIP_DELETED;
4144ab889eaSAndreas Gohr    if(!$opt['show_minor']) $flags += RECENTS_SKIP_MINORS;
415*6dd095f5SKate Arzamastseva    if($opt['content_type'] == 'media') $flags += RECENTS_MEDIA_CHANGES;
416*6dd095f5SKate Arzamastseva    if($opt['content_type'] == 'both') $flags += RECENTS_MEDIA_PAGES_MIXED;
4174ab889eaSAndreas Gohr
4184ab889eaSAndreas Gohr    $recents = getRecents(0,$opt['items'],$opt['namespace'],$flags);
4194bf3df7cSGina Haeussge    return $recents;
4204ab889eaSAndreas Gohr}
4214ab889eaSAndreas Gohr
42215fae107Sandi/**
4234bb1b5aeSAndreas Gohr * Add all pages of a namespace to the feed object
42415fae107Sandi *
42515fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
42615fae107Sandi */
4274bf3df7cSGina Haeussgefunction rssListNamespace($opt){
428f62ea8a1Sandi    require_once(DOKU_INC.'inc/search.php');
429f3f0262cSandi    global $conf;
430f3f0262cSandi
4314ab889eaSAndreas Gohr    $ns=':'.cleanID($opt['namespace']);
432f3f0262cSandi    $ns=str_replace(':','/',$ns);
433f3f0262cSandi
434f3f0262cSandi    $data = array();
435f3f0262cSandi    sort($data);
436f3f0262cSandi    search($data,$conf['datadir'],'search_list','',$ns);
43785cf8195SAndreas Gohr
4384bf3df7cSGina Haeussge    return $data;
43985cf8195SAndreas Gohr}
44085cf8195SAndreas Gohr
4414bb1b5aeSAndreas Gohr/**
4424bb1b5aeSAndreas Gohr * Add the result of a full text search to the feed object
4434bb1b5aeSAndreas Gohr *
4444bb1b5aeSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
4454bb1b5aeSAndreas Gohr */
4464bf3df7cSGina Haeussgefunction rssSearch($opt){
4474bb1b5aeSAndreas Gohr    if(!$opt['search_query']) return;
4484ab889eaSAndreas Gohr
4494bb1b5aeSAndreas Gohr    require_once(DOKU_INC.'inc/fulltext.php');
4504bb1b5aeSAndreas Gohr    $data = ft_pageSearch($opt['search_query'],$poswords);
4514bb1b5aeSAndreas Gohr    $data = array_keys($data);
4524bf3df7cSGina Haeussge
4534bf3df7cSGina Haeussge    return $data;
4544bb1b5aeSAndreas Gohr}
455f3f0262cSandi
456e3776c06SMichael Hamann//Setup VIM: ex: et ts=4 :
457