xref: /dokuwiki/feed.php (revision 3c86b7ebf3316c3566a7f6fed683a484036d1c3b)
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'];
5327833958SAnika Henke$image->url = tpl_getMediaFile('favicon.ico', 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),
1206dd095f5SKate Arzamastseva                  // One of: pages, media, both
121a7c93226SAndreas Gohr                  'content_type' => array('view', $conf['rss_media'])
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'];
1936dd095f5SKate Arzamastseva            if(!$ditem['media']) {
1944ab889eaSAndreas Gohr                $meta = p_get_metadata($id);
1956dd095f5SKate 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':
2206dd095f5SKate Arzamastseva                    if ($ditem['media']) {
2216dd095f5SKate Arzamastseva                        $item->link = media_managerURL(array('image' => $id,
2226dd095f5SKate Arzamastseva                            'ns' => getNS($id),
2236dd095f5SKate Arzamastseva                            'rev' => $date), '&', true);
2246dd095f5SKate Arzamastseva                    } else {
2256dd095f5SKate Arzamastseva                        $item->link = wl($id,'rev='.$date,true,'&', true);
2266dd095f5SKate Arzamastseva                    }
2274d58bd99Sandi                    break;
2284d58bd99Sandi                case 'rev':
2296dd095f5SKate Arzamastseva                    if ($ditem['media']) {
2306dd095f5SKate Arzamastseva                        $item->link = media_managerURL(array('image' => $id,
2316dd095f5SKate Arzamastseva                            'ns' => getNS($id),
2326dd095f5SKate Arzamastseva                            'rev' => $date,
2336dd095f5SKate Arzamastseva                            'tab_details' => 'history'), '&', true);
2346dd095f5SKate Arzamastseva                    } else {
2354ab889eaSAndreas Gohr                        $item->link = wl($id,'do=revisions&rev='.$date,true,'&');
2366dd095f5SKate Arzamastseva                    }
2374d58bd99Sandi                    break;
23892e52d8dSjoe.lapp                case 'current':
2396dd095f5SKate Arzamastseva                    if ($ditem['media']) {
2406dd095f5SKate Arzamastseva                        $item->link = media_managerURL(array('image' => $id,
2416dd095f5SKate Arzamastseva                            'ns' => getNS($id)), '&', true);
2426dd095f5SKate Arzamastseva                    } else {
2434ab889eaSAndreas Gohr                        $item->link = wl($id, '', true,'&');
2446dd095f5SKate Arzamastseva                    }
24592e52d8dSjoe.lapp                    break;
24692e52d8dSjoe.lapp                case 'diff':
2474d58bd99Sandi                default:
2486dd095f5SKate Arzamastseva                    if ($ditem['media']) {
2496dd095f5SKate Arzamastseva                        $item->link = media_managerURL(array('image' => $id,
2506dd095f5SKate Arzamastseva                            'ns' => getNS($id),
2516dd095f5SKate Arzamastseva                            'rev' => $date,
2526dd095f5SKate Arzamastseva                            'tab_details' => 'history',
2536dd095f5SKate Arzamastseva                            'mediado' => 'diff'), '&', true);
2546dd095f5SKate Arzamastseva                    } else {
2554ab889eaSAndreas Gohr                        $item->link = wl($id,'rev='.$date.'&do=diff',true,'&');
2564d58bd99Sandi                    }
2576dd095f5SKate Arzamastseva            }
2584d58bd99Sandi
2594ab889eaSAndreas Gohr            // add item content
2604ab889eaSAndreas Gohr            switch ($opt['item_content']){
2614ab889eaSAndreas Gohr                case 'diff':
2624ab889eaSAndreas Gohr                case 'htmldiff':
2636dd095f5SKate Arzamastseva                    if ($ditem['media']) {
2646dd095f5SKate Arzamastseva                        $revs = getRevisions($id, 0, 1, 8192, true);
2656dd095f5SKate Arzamastseva                        $rev = $revs[0];
2666dd095f5SKate Arzamastseva                        $src_r = '';
2676dd095f5SKate Arzamastseva                        $src_l = '';
2686dd095f5SKate Arzamastseva
2696dd095f5SKate Arzamastseva                        if ($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)), 300)) {
2706dd095f5SKate Arzamastseva                            $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
2716dd095f5SKate Arzamastseva                            $src_r = ml($id, $more);
2726dd095f5SKate Arzamastseva                        }
2736dd095f5SKate Arzamastseva                        if ($rev && $size = media_image_preview_size($id, $rev, new JpegMeta(mediaFN($id, $rev)), 300)){
2746dd095f5SKate Arzamastseva                            $more = 'rev='.$rev.'&w='.$size[0].'&h='.$size[1];
2756dd095f5SKate Arzamastseva                            $src_l = ml($id, $more);
2766dd095f5SKate Arzamastseva                        }
2776dd095f5SKate Arzamastseva                        $content = '';
2786dd095f5SKate Arzamastseva                        if ($src_r) {
2796dd095f5SKate Arzamastseva                            $content  = '<table>';
2806dd095f5SKate Arzamastseva                            $content .= '<tr><th width="50%">'.$rev.'</th>';
2816dd095f5SKate Arzamastseva                            $content .= '<th width="50%">'.$lang['current'].'</th></tr>';
2826dd095f5SKate Arzamastseva                            $content .= '<tr align="center"><td><img src="'.$src_l.'" alt="" /></td><td>';
2836dd095f5SKate Arzamastseva                            $content .= '<img src="'.$src_r.'" alt="'.$id.'" /></td></tr>';
2846dd095f5SKate Arzamastseva                            $content .= '</table>';
2856dd095f5SKate Arzamastseva                        }
2866dd095f5SKate Arzamastseva
2876dd095f5SKate 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                        }
3116dd095f5SKate Arzamastseva                    }
3124ab889eaSAndreas Gohr                    break;
3134ab889eaSAndreas Gohr                case 'html':
3146dd095f5SKate Arzamastseva                    if ($ditem['media']) {
3156dd095f5SKate Arzamastseva                        if ($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
3166dd095f5SKate Arzamastseva                            $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
3176dd095f5SKate Arzamastseva                            $src = ml($id, $more);
3186dd095f5SKate Arzamastseva                            $content = '<img src="'.$src.'" alt="'.$id.'" />';
3196dd095f5SKate Arzamastseva                        } else {
3206dd095f5SKate Arzamastseva                            $content = '';
3216dd095f5SKate Arzamastseva                        }
3226dd095f5SKate 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
327*3c86b7ebSAnika Henke                        // add alignment for images
328*3c86b7ebSAnika Henke                        $content = preg_replace('/class="medialeft"/s', 'class="medialeft" align="left"', $content);
329*3c86b7ebSAnika Henke                        $content = preg_replace('/class="mediaright"/s', 'class="mediaright" align="right"', $content);
330*3c86b7ebSAnika Henke
3314ab889eaSAndreas Gohr                        // make URLs work when canonical is not set, regexp instead of rerendering!
3324ab889eaSAndreas Gohr                        if(!$conf['canonical']){
3334ab889eaSAndreas Gohr                            $base = preg_quote(DOKU_REL,'/');
3344ab889eaSAndreas Gohr                            $content = preg_replace('/(<a href|<img src)="('.$base.')/s','$1="'.DOKU_URL,$content);
3354ab889eaSAndreas Gohr                        }
3366dd095f5SKate Arzamastseva                    }
3374ab889eaSAndreas Gohr
3384ab889eaSAndreas Gohr                    break;
3394ab889eaSAndreas Gohr                case 'abstract':
3404ab889eaSAndreas Gohr                default:
3416dd095f5SKate Arzamastseva                    if ($ditem['media']) {
3426dd095f5SKate Arzamastseva                        if ($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
3436dd095f5SKate Arzamastseva                            $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
3446dd095f5SKate Arzamastseva                            $src = ml($id, $more);
3456dd095f5SKate Arzamastseva                            $content = '<img src="'.$src.'" alt="'.$id.'" />';
3466dd095f5SKate Arzamastseva                        } else {
3476dd095f5SKate Arzamastseva                            $content = '';
3486dd095f5SKate Arzamastseva                        }
3496dd095f5SKate Arzamastseva                    } else {
3504ab889eaSAndreas Gohr                        $content = $meta['description']['abstract'];
3514ab889eaSAndreas Gohr                    }
3526dd095f5SKate Arzamastseva            }
3534ab889eaSAndreas Gohr            $item->description = $content; //FIXME a plugin hook here could be senseful
3544ab889eaSAndreas Gohr
3554ab889eaSAndreas Gohr            // add user
3564ab889eaSAndreas Gohr            # FIXME should the user be pulled from metadata as well?
3574ab889eaSAndreas Gohr            $user = @$ditem['user']; // the @ spares time repeating lookup
3587a98db20Sjoe.lapp            $item->author = '';
3590f4f4adfSAndreas Gohr            if($user && $conf['useacl'] && $auth){
360c0f9af6dSNathan Neulinger                $userInfo = $auth->getUserData($user);
361681a59b2SGina Haeussge                if ($userInfo){
362681a59b2SGina Haeussge                    switch ($conf['showuseras']){
363681a59b2SGina Haeussge                        case 'username':
3647a98db20Sjoe.lapp                            $item->author = $userInfo['name'];
365681a59b2SGina Haeussge                            break;
366681a59b2SGina Haeussge                        default:
367681a59b2SGina Haeussge                            $item->author = $user;
368681a59b2SGina Haeussge                            break;
369681a59b2SGina Haeussge                    }
370681a59b2SGina Haeussge                } else {
371681a59b2SGina Haeussge                    $item->author = $user;
372681a59b2SGina Haeussge                }
373c1791678SAndreas Gohr                if($userInfo && !$opt['guardmail']){
374c1791678SAndreas Gohr                    $item->authorEmail = $userInfo['mail'];
375c1791678SAndreas Gohr                }else{
3767a98db20Sjoe.lapp                    //cannot obfuscate because some RSS readers may check validity
3770bda0363SAdrian Lang                    $item->authorEmail = $user.'@'.$ditem['ip'];
378f3f0262cSandi                }
379c5983034SAndreas Gohr            }elseif($user){
380c5983034SAndreas Gohr                // this happens when no ACL but some Apache auth is used
381c5983034SAndreas Gohr                $item->author      = $user;
3820bda0363SAdrian Lang                $item->authorEmail = $user.'@'.$ditem['ip'];
3837a98db20Sjoe.lapp            }else{
3840bda0363SAdrian Lang                $item->authorEmail = 'anonymous@'.$ditem['ip'];
3857a98db20Sjoe.lapp            }
3864ab889eaSAndreas Gohr
3874ab889eaSAndreas Gohr            // add category
388b5a0be43SAdrian Lang            if(isset($meta['subject'])) {
3894ab889eaSAndreas Gohr                $item->category = $meta['subject'];
3904ab889eaSAndreas Gohr            }else{
3914ab889eaSAndreas Gohr                $cat = getNS($id);
3924ab889eaSAndreas Gohr                if($cat) $item->category = $cat;
3934ab889eaSAndreas Gohr            }
3944ab889eaSAndreas Gohr
395883480fbSAndreas Gohr            // finally add the item to the feed object, after handing it to registered plugins
396883480fbSAndreas Gohr            $evdata = array('item'  => &$item,
397883480fbSAndreas Gohr                            'opt'   => &$opt,
398883480fbSAndreas Gohr                            'ditem' => &$ditem,
399883480fbSAndreas Gohr                            'rss'   => &$rss);
400209cd8e1SAndreas Gohr            $evt = new Doku_Event('FEED_ITEM_ADD', $evdata);
401883480fbSAndreas Gohr            if ($evt->advise_before()){
402f3f0262cSandi                $rss->addItem($item);
403f3f0262cSandi            }
404883480fbSAndreas Gohr            $evt->advise_after(); // for completeness
405883480fbSAndreas Gohr        }
406f3f0262cSandi    }
4074bf3df7cSGina Haeussge    $event->advise_after();
4084bf3df7cSGina Haeussge}
409f3f0262cSandi
4104ab889eaSAndreas Gohr
4114ab889eaSAndreas Gohr/**
4124bb1b5aeSAndreas Gohr * Add recent changed pages to the feed object
4134ab889eaSAndreas Gohr *
4144ab889eaSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
4154ab889eaSAndreas Gohr */
4164bf3df7cSGina Haeussgefunction rssRecentChanges($opt){
417e5d185e1SKate Arzamastseva    global $conf;
4184ab889eaSAndreas Gohr    $flags = RECENTS_SKIP_DELETED;
4194ab889eaSAndreas Gohr    if(!$opt['show_minor']) $flags += RECENTS_SKIP_MINORS;
420e5d185e1SKate Arzamastseva    if($opt['content_type'] == 'media' && $conf['mediarevisions']) $flags += RECENTS_MEDIA_CHANGES;
421e5d185e1SKate Arzamastseva    if($opt['content_type'] == 'both' && $conf['mediarevisions']) $flags += RECENTS_MEDIA_PAGES_MIXED;
4224ab889eaSAndreas Gohr
4234ab889eaSAndreas Gohr    $recents = getRecents(0,$opt['items'],$opt['namespace'],$flags);
4244bf3df7cSGina Haeussge    return $recents;
4254ab889eaSAndreas Gohr}
4264ab889eaSAndreas Gohr
42715fae107Sandi/**
4284bb1b5aeSAndreas Gohr * Add all pages of a namespace to the feed object
42915fae107Sandi *
43015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
43115fae107Sandi */
4324bf3df7cSGina Haeussgefunction rssListNamespace($opt){
433f62ea8a1Sandi    require_once(DOKU_INC.'inc/search.php');
434f3f0262cSandi    global $conf;
435f3f0262cSandi
4364ab889eaSAndreas Gohr    $ns=':'.cleanID($opt['namespace']);
437f3f0262cSandi    $ns=str_replace(':','/',$ns);
438f3f0262cSandi
439f3f0262cSandi    $data = array();
440f3f0262cSandi    sort($data);
441f3f0262cSandi    search($data,$conf['datadir'],'search_list','',$ns);
44285cf8195SAndreas Gohr
4434bf3df7cSGina Haeussge    return $data;
44485cf8195SAndreas Gohr}
44585cf8195SAndreas Gohr
4464bb1b5aeSAndreas Gohr/**
4474bb1b5aeSAndreas Gohr * Add the result of a full text search to the feed object
4484bb1b5aeSAndreas Gohr *
4494bb1b5aeSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
4504bb1b5aeSAndreas Gohr */
4514bf3df7cSGina Haeussgefunction rssSearch($opt){
4524bb1b5aeSAndreas Gohr    if(!$opt['search_query']) return;
4534ab889eaSAndreas Gohr
4544bb1b5aeSAndreas Gohr    require_once(DOKU_INC.'inc/fulltext.php');
4554bb1b5aeSAndreas Gohr    $data = ft_pageSearch($opt['search_query'],$poswords);
4564bb1b5aeSAndreas Gohr    $data = array_keys($data);
4574bf3df7cSGina Haeussge
4584bf3df7cSGina Haeussge    return $data;
4594bb1b5aeSAndreas Gohr}
460f3f0262cSandi
461e3776c06SMichael Hamann//Setup VIM: ex: et ts=4 :
462