xref: /dokuwiki/feed.php (revision f9aa73bff850a3d60a1f3df02e5e97741051bc60)
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>
7*f9aa73bfSAndreas Gohr *
8*f9aa73bfSAndreas Gohr * @global array $conf
915fae107Sandi */
1015fae107Sandi
11d0a27cb0SAndreas Gohrif(!defined('DOKU_INC')) define('DOKU_INC', dirname(__FILE__).'/');
12ed7b5f09Sandirequire_once(DOKU_INC.'inc/init.php');
13f3f0262cSandi
147131b668SAndreas Gohr//close session
158746e727Sandisession_write_close();
168746e727Sandi
174ab889eaSAndreas Gohr// get params
184ab889eaSAndreas Gohr$opt = rss_parseOptions();
19f3f0262cSandi
207131b668SAndreas Gohr// the feed is dynamic - we need a cache for each combo
217131b668SAndreas Gohr// (but most people just use the default feed so it's still effective)
222f1faf49SAndreas Gohr$cache = getCacheName(join('', array_values($opt)).$_SERVER['REMOTE_USER'], '.feed');
230d67055cSMichael Klier$key   = join('', array_values($opt)).$_SERVER['REMOTE_USER'];
240d67055cSMichael Klier$cache = new cache($key, '.feed');
250d67055cSMichael Klier
260d67055cSMichael Klier// prepare cache depends
270d67055cSMichael Klier$depends['files'] = getConfigFiles('main');
280d67055cSMichael Klier$depends['age']   = $conf['rss_update'];
29b5a0be43SAdrian Lang$depends['purge'] = isset($_REQUEST['purge']);
30f3f0262cSandi
317131b668SAndreas Gohr// check cacheage and deliver if nothing has changed since last
32fbf82939SBen Coburn// time or the update interval has not passed, also handles conditional requests
33fbf82939SBen Coburnheader('Cache-Control: must-revalidate, post-check=0, pre-check=0');
34fbf82939SBen Coburnheader('Pragma: public');
357131b668SAndreas Gohrheader('Content-Type: application/xml; charset=utf-8');
3650ddb617SAndreas Gohrheader('X-Robots-Tag: noindex');
370d67055cSMichael Klierif($cache->useCache($depends)) {
380d67055cSMichael Klier    http_conditionalRequest($cache->_time);
390d67055cSMichael Klier    if($conf['allowdebug']) header("X-CacheUsed: $cache->cache");
400d67055cSMichael Klier    print $cache->retrieveCache();
417131b668SAndreas Gohr    exit;
42fbf82939SBen Coburn} else {
43fbf82939SBen Coburn    http_conditionalRequest(time());
447131b668SAndreas Gohr}
457131b668SAndreas Gohr
467131b668SAndreas Gohr// create new feed
47f3f0262cSandi$rss                 = new DokuWikiFeedCreator();
484ab889eaSAndreas Gohr$rss->title          = $conf['title'].(($opt['namespace']) ? ' '.$opt['namespace'] : '');
49ed7b5f09Sandi$rss->link           = DOKU_URL;
50f62ea8a1Sandi$rss->syndicationURL = DOKU_URL.'feed.php';
51615960feSTom N Harris$rss->cssStyleSheet  = DOKU_URL.'lib/exe/css.php?s=feed';
52f3f0262cSandi
5379b608ceSandi$image        = new FeedImage();
5479b608ceSandi$image->title = $conf['title'];
5527833958SAnika Henke$image->url   = tpl_getMediaFile('favicon.ico', true);
5679b608ceSandi$image->link  = DOKU_URL;
5779b608ceSandi$rss->image   = $image;
5879b608ceSandi
594bf3df7cSGina Haeussge$data  = null;
60*f9aa73bfSAndreas Gohr$modes = array(
61*f9aa73bfSAndreas Gohr    'list'   => 'rssListNamespace',
62b5a0be43SAdrian Lang    'search' => 'rssSearch',
63*f9aa73bfSAndreas Gohr    'recent' => 'rssRecentChanges'
64*f9aa73bfSAndreas Gohr);
65b5a0be43SAdrian Langif(isset($modes[$opt['feed_mode']])) {
66b5a0be43SAdrian Lang    $data = $modes[$opt['feed_mode']]($opt);
67f3f0262cSandi} else {
684bf3df7cSGina Haeussge    $eventData = array(
694bf3df7cSGina Haeussge        'opt'  => &$opt,
704bf3df7cSGina Haeussge        'data' => &$data,
714bf3df7cSGina Haeussge    );
724bf3df7cSGina Haeussge    $event     = new Doku_Event('FEED_MODE_UNKNOWN', $eventData);
734bf3df7cSGina Haeussge    if($event->advise_before(true)) {
74b5a0be43SAdrian Lang        echo sprintf('<error>Unknown feed mode %s</error>', hsc($opt['feed_mode']));
75b5a0be43SAdrian Lang        exit;
764bf3df7cSGina Haeussge    }
774bf3df7cSGina Haeussge    $event->advise_after();
78f3f0262cSandi}
79f3f0262cSandi
804bf3df7cSGina Haeussgerss_buildItems($rss, $data, $opt);
814ab889eaSAndreas Gohr$feed = $rss->createFeed($opt['feed_type'], 'utf-8');
827131b668SAndreas Gohr
837131b668SAndreas Gohr// save cachefile
840d67055cSMichael Klier$cache->storeCache($feed);
857131b668SAndreas Gohr
867131b668SAndreas Gohr// finally deliver
877131b668SAndreas Gohrprint $feed;
88f3f0262cSandi
8915fae107Sandi// ---------------------------------------------------------------- //
90f3f0262cSandi
9115fae107Sandi/**
92b5a0be43SAdrian Lang * Get URL parameters and config options and return an initialized option array
9315fae107Sandi *
9415fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
9515fae107Sandi */
964ab889eaSAndreas Gohrfunction rss_parseOptions() {
97f62ea8a1Sandi    global $conf;
98c0f9af6dSNathan Neulinger
99b5a0be43SAdrian Lang    $opt = array();
100f62ea8a1Sandi
101b5a0be43SAdrian Lang    foreach(array(
102b5a0be43SAdrian Lang                // Basic feed properties
103b5a0be43SAdrian Lang                // Plugins may probably want to add new values to these
104b5a0be43SAdrian Lang                // properties for implementing own feeds
105b5a0be43SAdrian Lang
106b5a0be43SAdrian Lang                // One of: list, search, recent
107b5a0be43SAdrian Lang                'feed_mode'    => array('mode', 'recent'),
108b5a0be43SAdrian Lang                // One of: diff, page, rev, current
109b5a0be43SAdrian Lang                'link_to'      => array('linkto', $conf['rss_linkto']),
110b5a0be43SAdrian Lang                // One of: abstract, diff, htmldiff, html
111b5a0be43SAdrian Lang                'item_content' => array('content', $conf['rss_content']),
112b5a0be43SAdrian Lang
113b5a0be43SAdrian Lang                // Special feed properties
114b5a0be43SAdrian Lang                // These are only used by certain feed_modes
115b5a0be43SAdrian Lang
116b5a0be43SAdrian Lang                // String, used for feed title, in list and rc mode
117b5a0be43SAdrian Lang                'namespace'    => array('ns', null),
118b5a0be43SAdrian Lang                // Positive integer, only used in rc mode
119b5a0be43SAdrian Lang                'items'        => array('num', $conf['recent']),
120b5a0be43SAdrian Lang                // Boolean, only used in rc mode
121b5a0be43SAdrian Lang                'show_minor'   => array('minor', false),
122b5a0be43SAdrian Lang                // String, only used in search mode
123b5a0be43SAdrian Lang                'search_query' => array('q', null),
1246dd095f5SKate Arzamastseva                // One of: pages, media, both
125a7c93226SAndreas Gohr                'content_type' => array('view', $conf['rss_media'])
126b5a0be43SAdrian Lang
127b5a0be43SAdrian Lang            ) as $name => $val) {
128b5a0be43SAdrian Lang        $opt[$name] = (isset($_REQUEST[$val[0]]) && !empty($_REQUEST[$val[0]]))
129b5a0be43SAdrian Lang            ? $_REQUEST[$val[0]] : $val[1];
130b5a0be43SAdrian Lang    }
131b5a0be43SAdrian Lang
132b5a0be43SAdrian Lang    $opt['items']      = max(0, (int) $opt['items']);
133b5a0be43SAdrian Lang    $opt['show_minor'] = (bool) $opt['show_minor'];
134b5a0be43SAdrian Lang
1354ab889eaSAndreas Gohr    $opt['guardmail'] = ($conf['mailguard'] != '' && $conf['mailguard'] != 'none');
136b6912aeaSAndreas Gohr
137*f9aa73bfSAndreas Gohr    $type = valid_input_set(
138*f9aa73bfSAndreas Gohr        'type', array(
139*f9aa73bfSAndreas Gohr                     'rss', 'rss2', 'atom', 'atom1', 'rss1',
140*f9aa73bfSAndreas Gohr                     'default' => $conf['rss_type']
141*f9aa73bfSAndreas Gohr                ),
142*f9aa73bfSAndreas Gohr        $_REQUEST
143*f9aa73bfSAndreas Gohr    );
144b5a0be43SAdrian Lang    switch($type) {
1454ab889eaSAndreas Gohr        case 'rss':
1464ab889eaSAndreas Gohr            $opt['feed_type'] = 'RSS0.91';
1474ab889eaSAndreas Gohr            $opt['mime_type'] = 'text/xml';
1484ab889eaSAndreas Gohr            break;
1494ab889eaSAndreas Gohr        case 'rss2':
1504ab889eaSAndreas Gohr            $opt['feed_type'] = 'RSS2.0';
1514ab889eaSAndreas Gohr            $opt['mime_type'] = 'text/xml';
1524ab889eaSAndreas Gohr            break;
1534ab889eaSAndreas Gohr        case 'atom':
1544ab889eaSAndreas Gohr            $opt['feed_type'] = 'ATOM0.3';
1554ab889eaSAndreas Gohr            $opt['mime_type'] = 'application/xml';
1564ab889eaSAndreas Gohr            break;
1574ab889eaSAndreas Gohr        case 'atom1':
1584ab889eaSAndreas Gohr            $opt['feed_type'] = 'ATOM1.0';
1594ab889eaSAndreas Gohr            $opt['mime_type'] = 'application/atom+xml';
1604ab889eaSAndreas Gohr            break;
1614ab889eaSAndreas Gohr        default:
1624ab889eaSAndreas Gohr            $opt['feed_type'] = 'RSS1.0';
1634ab889eaSAndreas Gohr            $opt['mime_type'] = 'application/xml';
1644ab889eaSAndreas Gohr    }
1654bf3df7cSGina Haeussge
1664bf3df7cSGina Haeussge    $eventData = array(
1674bf3df7cSGina Haeussge        'opt' => &$opt,
1684bf3df7cSGina Haeussge    );
1694bf3df7cSGina Haeussge    trigger_event('FEED_OPTS_POSTPROCESS', $eventData);
1704ab889eaSAndreas Gohr    return $opt;
1714ab889eaSAndreas Gohr}
172b6912aeaSAndreas Gohr
1734ab889eaSAndreas Gohr/**
1744ab889eaSAndreas Gohr * Add recent changed pages to a feed object
1754ab889eaSAndreas Gohr *
1764ab889eaSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
177*f9aa73bfSAndreas Gohr * @param  FeedCreator $rss the FeedCreator Object
178*f9aa73bfSAndreas Gohr * @param  array       $data the items to add
179*f9aa73bfSAndreas Gohr * @param  array       $opt  the feed options
1804ab889eaSAndreas Gohr */
1814ab889eaSAndreas Gohrfunction rss_buildItems(&$rss, &$data, $opt) {
1824ab889eaSAndreas Gohr    global $conf;
1834ab889eaSAndreas Gohr    global $lang;
184*f9aa73bfSAndreas Gohr    /* @var auth_basic $auth */
1853d581c29SAndreas Gohr    global $auth;
186883480fbSAndreas Gohr
1874bf3df7cSGina Haeussge    $eventData = array(
1884bf3df7cSGina Haeussge        'rss'  => &$rss,
1894bf3df7cSGina Haeussge        'data' => &$data,
1904bf3df7cSGina Haeussge        'opt'  => &$opt,
1914bf3df7cSGina Haeussge    );
1924bf3df7cSGina Haeussge    $event     = new Doku_Event('FEED_DATA_PROCESS', $eventData);
1934bf3df7cSGina Haeussge    if($event->advise_before(false)) {
1944ab889eaSAndreas Gohr        foreach($data as $ditem) {
1954bb1b5aeSAndreas Gohr            if(!is_array($ditem)) {
1964bb1b5aeSAndreas Gohr                // not an array? then only a list of IDs was given
1974bb1b5aeSAndreas Gohr                $ditem = array('id' => $ditem);
1984bb1b5aeSAndreas Gohr            }
1994bb1b5aeSAndreas Gohr
200f3f0262cSandi            $item = new FeedItem();
2014ab889eaSAndreas Gohr            $id   = $ditem['id'];
2026dd095f5SKate Arzamastseva            if(!$ditem['media']) {
2034ab889eaSAndreas Gohr                $meta = p_get_metadata($id);
2046dd095f5SKate Arzamastseva            }
20503ee62cbSjoe.lapp
2064ab889eaSAndreas Gohr            // add date
2074ab889eaSAndreas Gohr            if($ditem['date']) {
2084ab889eaSAndreas Gohr                $date = $ditem['date'];
2094ab889eaSAndreas Gohr            } elseif($meta['date']['modified']) {
2104ab889eaSAndreas Gohr                $date = $meta['date']['modified'];
2114ab889eaSAndreas Gohr            } else {
2124ab889eaSAndreas Gohr                $date = @filemtime(wikiFN($id));
2134ab889eaSAndreas Gohr            }
2144ab889eaSAndreas Gohr            if($date) $item->date = date('r', $date);
2154ab889eaSAndreas Gohr
2164ab889eaSAndreas Gohr            // add title
2178716966dSAndreas Gohr            if($conf['useheading'] && $meta['title']) {
2188716966dSAndreas Gohr                $item->title = $meta['title'];
2198716966dSAndreas Gohr            } else {
2204ab889eaSAndreas Gohr                $item->title = $ditem['id'];
22103ee62cbSjoe.lapp            }
2224ab889eaSAndreas Gohr            if($conf['rss_show_summary'] && !empty($ditem['sum'])) {
2234ab889eaSAndreas Gohr                $item->title .= ' - '.strip_tags($ditem['sum']);
224b1a1915cSandi            }
2254d58bd99Sandi
2264ab889eaSAndreas Gohr            // add item link
2274ab889eaSAndreas Gohr            switch($opt['link_to']) {
2284d58bd99Sandi                case 'page':
2296dd095f5SKate Arzamastseva                    if($ditem['media']) {
230*f9aa73bfSAndreas Gohr                        $item->link = media_managerURL(
231*f9aa73bfSAndreas Gohr                            array(
232*f9aa73bfSAndreas Gohr                                 'image' => $id,
2336dd095f5SKate Arzamastseva                                 'ns'    => getNS($id),
234*f9aa73bfSAndreas Gohr                                 'rev'   => $date
235*f9aa73bfSAndreas Gohr                            ), '&', true
236*f9aa73bfSAndreas Gohr                        );
2376dd095f5SKate Arzamastseva                    } else {
2386dd095f5SKate Arzamastseva                        $item->link = wl($id, 'rev='.$date, true, '&', true);
2396dd095f5SKate Arzamastseva                    }
2404d58bd99Sandi                    break;
2414d58bd99Sandi                case 'rev':
2426dd095f5SKate Arzamastseva                    if($ditem['media']) {
243*f9aa73bfSAndreas Gohr                        $item->link = media_managerURL(
244*f9aa73bfSAndreas Gohr                            array(
245*f9aa73bfSAndreas Gohr                                 'image'       => $id,
2466dd095f5SKate Arzamastseva                                 'ns'          => getNS($id),
2476dd095f5SKate Arzamastseva                                 'rev'         => $date,
248*f9aa73bfSAndreas Gohr                                 'tab_details' => 'history'
249*f9aa73bfSAndreas Gohr                            ), '&', true
250*f9aa73bfSAndreas Gohr                        );
2516dd095f5SKate Arzamastseva                    } else {
2524ab889eaSAndreas Gohr                        $item->link = wl($id, 'do=revisions&rev='.$date, true, '&');
2536dd095f5SKate Arzamastseva                    }
2544d58bd99Sandi                    break;
25592e52d8dSjoe.lapp                case 'current':
2566dd095f5SKate Arzamastseva                    if($ditem['media']) {
257*f9aa73bfSAndreas Gohr                        $item->link = media_managerURL(
258*f9aa73bfSAndreas Gohr                            array(
259*f9aa73bfSAndreas Gohr                                 'image' => $id,
260*f9aa73bfSAndreas Gohr                                 'ns'    => getNS($id)
261*f9aa73bfSAndreas Gohr                            ), '&', true
262*f9aa73bfSAndreas Gohr                        );
2636dd095f5SKate Arzamastseva                    } else {
2644ab889eaSAndreas Gohr                        $item->link = wl($id, '', true, '&');
2656dd095f5SKate Arzamastseva                    }
26692e52d8dSjoe.lapp                    break;
26792e52d8dSjoe.lapp                case 'diff':
2684d58bd99Sandi                default:
2696dd095f5SKate Arzamastseva                    if($ditem['media']) {
270*f9aa73bfSAndreas Gohr                        $item->link = media_managerURL(
271*f9aa73bfSAndreas Gohr                            array(
272*f9aa73bfSAndreas Gohr                                 'image'       => $id,
2736dd095f5SKate Arzamastseva                                 'ns'          => getNS($id),
2746dd095f5SKate Arzamastseva                                 'rev'         => $date,
2756dd095f5SKate Arzamastseva                                 'tab_details' => 'history',
276*f9aa73bfSAndreas Gohr                                 'mediado'     => 'diff'
277*f9aa73bfSAndreas Gohr                            ), '&', true
278*f9aa73bfSAndreas Gohr                        );
2796dd095f5SKate Arzamastseva                    } else {
2804ab889eaSAndreas Gohr                        $item->link = wl($id, 'rev='.$date.'&do=diff', true, '&');
2814d58bd99Sandi                    }
2826dd095f5SKate Arzamastseva            }
2834d58bd99Sandi
2844ab889eaSAndreas Gohr            // add item content
2854ab889eaSAndreas Gohr            switch($opt['item_content']) {
2864ab889eaSAndreas Gohr                case 'diff':
2874ab889eaSAndreas Gohr                case 'htmldiff':
2886dd095f5SKate Arzamastseva                    if($ditem['media']) {
2896dd095f5SKate Arzamastseva                        $revs  = getRevisions($id, 0, 1, 8192, true);
2906dd095f5SKate Arzamastseva                        $rev   = $revs[0];
2916dd095f5SKate Arzamastseva                        $src_r = '';
2926dd095f5SKate Arzamastseva                        $src_l = '';
2936dd095f5SKate Arzamastseva
2946dd095f5SKate Arzamastseva                        if($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)), 300)) {
2956dd095f5SKate Arzamastseva                            $more  = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
2966dd095f5SKate Arzamastseva                            $src_r = ml($id, $more);
2976dd095f5SKate Arzamastseva                        }
2986dd095f5SKate Arzamastseva                        if($rev && $size = media_image_preview_size($id, $rev, new JpegMeta(mediaFN($id, $rev)), 300)) {
2996dd095f5SKate Arzamastseva                            $more  = 'rev='.$rev.'&w='.$size[0].'&h='.$size[1];
3006dd095f5SKate Arzamastseva                            $src_l = ml($id, $more);
3016dd095f5SKate Arzamastseva                        }
3026dd095f5SKate Arzamastseva                        $content = '';
3036dd095f5SKate Arzamastseva                        if($src_r) {
3046dd095f5SKate Arzamastseva                            $content = '<table>';
3056dd095f5SKate Arzamastseva                            $content .= '<tr><th width="50%">'.$rev.'</th>';
3066dd095f5SKate Arzamastseva                            $content .= '<th width="50%">'.$lang['current'].'</th></tr>';
3076dd095f5SKate Arzamastseva                            $content .= '<tr align="center"><td><img src="'.$src_l.'" alt="" /></td><td>';
3086dd095f5SKate Arzamastseva                            $content .= '<img src="'.$src_r.'" alt="'.$id.'" /></td></tr>';
3096dd095f5SKate Arzamastseva                            $content .= '</table>';
3106dd095f5SKate Arzamastseva                        }
3116dd095f5SKate Arzamastseva
3126dd095f5SKate Arzamastseva                    } else {
3134ab889eaSAndreas Gohr                        require_once(DOKU_INC.'inc/DifferenceEngine.php');
3144ab889eaSAndreas Gohr                        $revs = getRevisions($id, 0, 1);
3154ab889eaSAndreas Gohr                        $rev  = $revs[0];
3167a98db20Sjoe.lapp
3174ab889eaSAndreas Gohr                        if($rev) {
3184ab889eaSAndreas Gohr                            $df = new Diff(explode("\n", htmlspecialchars(rawWiki($id, $rev))),
3194ab889eaSAndreas Gohr                                           explode("\n", htmlspecialchars(rawWiki($id, ''))));
3204ab889eaSAndreas Gohr                        } else {
3214ab889eaSAndreas Gohr                            $df = new Diff(array(''),
3224ab889eaSAndreas Gohr                                           explode("\n", htmlspecialchars(rawWiki($id, ''))));
3234ab889eaSAndreas Gohr                        }
3244ab889eaSAndreas Gohr
3254ab889eaSAndreas Gohr                        if($opt['item_content'] == 'htmldiff') {
3264ab889eaSAndreas Gohr                            $tdf     = new TableDiffFormatter();
3274ab889eaSAndreas Gohr                            $content = '<table>';
3284ab889eaSAndreas Gohr                            $content .= '<tr><th colspan="2" width="50%">'.$rev.'</th>';
3294ab889eaSAndreas Gohr                            $content .= '<th colspan="2" width="50%">'.$lang['current'].'</th></tr>';
3304ab889eaSAndreas Gohr                            $content .= $tdf->format($df);
3314ab889eaSAndreas Gohr                            $content .= '</table>';
3324ab889eaSAndreas Gohr                        } else {
3334ab889eaSAndreas Gohr                            $udf     = new UnifiedDiffFormatter();
3344ab889eaSAndreas Gohr                            $content = "<pre>\n".$udf->format($df)."\n</pre>";
3354ab889eaSAndreas Gohr                        }
3366dd095f5SKate Arzamastseva                    }
3374ab889eaSAndreas Gohr                    break;
3384ab889eaSAndreas Gohr                case 'html':
3396dd095f5SKate Arzamastseva                    if($ditem['media']) {
3406dd095f5SKate Arzamastseva                        if($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
3416dd095f5SKate Arzamastseva                            $more    = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
3426dd095f5SKate Arzamastseva                            $src     = ml($id, $more);
3436dd095f5SKate Arzamastseva                            $content = '<img src="'.$src.'" alt="'.$id.'" />';
3446dd095f5SKate Arzamastseva                        } else {
3456dd095f5SKate Arzamastseva                            $content = '';
3466dd095f5SKate Arzamastseva                        }
3476dd095f5SKate Arzamastseva                    } else {
3484ab889eaSAndreas Gohr                        $content = p_wiki_xhtml($id, $date, false);
3494ab889eaSAndreas Gohr                        // no TOC in feeds
3504ab889eaSAndreas Gohr                        $content = preg_replace('/(<!-- TOC START -->).*(<!-- TOC END -->)/s', '', $content);
3514ab889eaSAndreas Gohr
3524ab889eaSAndreas Gohr                        // make URLs work when canonical is not set, regexp instead of rerendering!
3534ab889eaSAndreas Gohr                        if(!$conf['canonical']) {
3544ab889eaSAndreas Gohr                            $base    = preg_quote(DOKU_REL, '/');
3554ab889eaSAndreas Gohr                            $content = preg_replace('/(<a href|<img src)="('.$base.')/s', '$1="'.DOKU_URL, $content);
3564ab889eaSAndreas Gohr                        }
3576dd095f5SKate Arzamastseva                    }
3584ab889eaSAndreas Gohr
3594ab889eaSAndreas Gohr                    break;
3604ab889eaSAndreas Gohr                case 'abstract':
3614ab889eaSAndreas Gohr                default:
3626dd095f5SKate Arzamastseva                    if($ditem['media']) {
3636dd095f5SKate Arzamastseva                        if($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
3646dd095f5SKate Arzamastseva                            $more    = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
3656dd095f5SKate Arzamastseva                            $src     = ml($id, $more);
3666dd095f5SKate Arzamastseva                            $content = '<img src="'.$src.'" alt="'.$id.'" />';
3676dd095f5SKate Arzamastseva                        } else {
3686dd095f5SKate Arzamastseva                            $content = '';
3696dd095f5SKate Arzamastseva                        }
3706dd095f5SKate Arzamastseva                    } else {
3714ab889eaSAndreas Gohr                        $content = $meta['description']['abstract'];
3724ab889eaSAndreas Gohr                    }
3736dd095f5SKate Arzamastseva            }
3744ab889eaSAndreas Gohr            $item->description = $content; //FIXME a plugin hook here could be senseful
3754ab889eaSAndreas Gohr
3764ab889eaSAndreas Gohr            // add user
3774ab889eaSAndreas Gohr            # FIXME should the user be pulled from metadata as well?
3784ab889eaSAndreas Gohr            $user         = @$ditem['user']; // the @ spares time repeating lookup
3797a98db20Sjoe.lapp            $item->author = '';
3800f4f4adfSAndreas Gohr            if($user && $conf['useacl'] && $auth) {
381c0f9af6dSNathan Neulinger                $userInfo = $auth->getUserData($user);
382681a59b2SGina Haeussge                if($userInfo) {
383681a59b2SGina Haeussge                    switch($conf['showuseras']) {
384681a59b2SGina Haeussge                        case 'username':
3857a98db20Sjoe.lapp                            $item->author = $userInfo['name'];
386681a59b2SGina Haeussge                            break;
387681a59b2SGina Haeussge                        default:
388681a59b2SGina Haeussge                            $item->author = $user;
389681a59b2SGina Haeussge                            break;
390681a59b2SGina Haeussge                    }
391681a59b2SGina Haeussge                } else {
392681a59b2SGina Haeussge                    $item->author = $user;
393681a59b2SGina Haeussge                }
394c1791678SAndreas Gohr                if($userInfo && !$opt['guardmail']) {
395c1791678SAndreas Gohr                    $item->authorEmail = $userInfo['mail'];
396c1791678SAndreas Gohr                } else {
3977a98db20Sjoe.lapp                    //cannot obfuscate because some RSS readers may check validity
3980bda0363SAdrian Lang                    $item->authorEmail = $user.'@'.$ditem['ip'];
399f3f0262cSandi                }
400c5983034SAndreas Gohr            } elseif($user) {
401c5983034SAndreas Gohr                // this happens when no ACL but some Apache auth is used
402c5983034SAndreas Gohr                $item->author      = $user;
4030bda0363SAdrian Lang                $item->authorEmail = $user.'@'.$ditem['ip'];
4047a98db20Sjoe.lapp            } else {
4050bda0363SAdrian Lang                $item->authorEmail = 'anonymous@'.$ditem['ip'];
4067a98db20Sjoe.lapp            }
4074ab889eaSAndreas Gohr
4084ab889eaSAndreas Gohr            // add category
409b5a0be43SAdrian Lang            if(isset($meta['subject'])) {
4104ab889eaSAndreas Gohr                $item->category = $meta['subject'];
4114ab889eaSAndreas Gohr            } else {
4124ab889eaSAndreas Gohr                $cat = getNS($id);
4134ab889eaSAndreas Gohr                if($cat) $item->category = $cat;
4144ab889eaSAndreas Gohr            }
4154ab889eaSAndreas Gohr
416883480fbSAndreas Gohr            // finally add the item to the feed object, after handing it to registered plugins
417*f9aa73bfSAndreas Gohr            $evdata = array(
418*f9aa73bfSAndreas Gohr                'item'  => &$item,
419883480fbSAndreas Gohr                'opt'   => &$opt,
420883480fbSAndreas Gohr                'ditem' => &$ditem,
421*f9aa73bfSAndreas Gohr                'rss'   => &$rss
422*f9aa73bfSAndreas Gohr            );
423209cd8e1SAndreas Gohr            $evt    = new Doku_Event('FEED_ITEM_ADD', $evdata);
424883480fbSAndreas Gohr            if($evt->advise_before()) {
425f3f0262cSandi                $rss->addItem($item);
426f3f0262cSandi            }
427883480fbSAndreas Gohr            $evt->advise_after(); // for completeness
428883480fbSAndreas Gohr        }
429f3f0262cSandi    }
4304bf3df7cSGina Haeussge    $event->advise_after();
4314bf3df7cSGina Haeussge}
432f3f0262cSandi
4334ab889eaSAndreas Gohr/**
4344bb1b5aeSAndreas Gohr * Add recent changed pages to the feed object
4354ab889eaSAndreas Gohr *
4364ab889eaSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
4374ab889eaSAndreas Gohr */
4384bf3df7cSGina Haeussgefunction rssRecentChanges($opt) {
439e5d185e1SKate Arzamastseva    global $conf;
4404ab889eaSAndreas Gohr    $flags = RECENTS_SKIP_DELETED;
4414ab889eaSAndreas Gohr    if(!$opt['show_minor']) $flags += RECENTS_SKIP_MINORS;
442e5d185e1SKate Arzamastseva    if($opt['content_type'] == 'media' && $conf['mediarevisions']) $flags += RECENTS_MEDIA_CHANGES;
443e5d185e1SKate Arzamastseva    if($opt['content_type'] == 'both' && $conf['mediarevisions']) $flags += RECENTS_MEDIA_PAGES_MIXED;
4444ab889eaSAndreas Gohr
4454ab889eaSAndreas Gohr    $recents = getRecents(0, $opt['items'], $opt['namespace'], $flags);
4464bf3df7cSGina Haeussge    return $recents;
4474ab889eaSAndreas Gohr}
4484ab889eaSAndreas Gohr
44915fae107Sandi/**
4504bb1b5aeSAndreas Gohr * Add all pages of a namespace to the feed object
45115fae107Sandi *
45215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
45315fae107Sandi */
4544bf3df7cSGina Haeussgefunction rssListNamespace($opt) {
455f62ea8a1Sandi    require_once(DOKU_INC.'inc/search.php');
456f3f0262cSandi    global $conf;
457f3f0262cSandi
4584ab889eaSAndreas Gohr    $ns = ':'.cleanID($opt['namespace']);
459f3f0262cSandi    $ns = str_replace(':', '/', $ns);
460f3f0262cSandi
461f3f0262cSandi    $data = array();
462f3f0262cSandi    sort($data);
463f3f0262cSandi    search($data, $conf['datadir'], 'search_list', '', $ns);
46485cf8195SAndreas Gohr
4654bf3df7cSGina Haeussge    return $data;
46685cf8195SAndreas Gohr}
46785cf8195SAndreas Gohr
4684bb1b5aeSAndreas Gohr/**
4694bb1b5aeSAndreas Gohr * Add the result of a full text search to the feed object
4704bb1b5aeSAndreas Gohr *
4714bb1b5aeSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
4724bb1b5aeSAndreas Gohr */
4734bf3df7cSGina Haeussgefunction rssSearch($opt) {
474*f9aa73bfSAndreas Gohr    if(!$opt['search_query']) return array();
4754ab889eaSAndreas Gohr
4764bb1b5aeSAndreas Gohr    require_once(DOKU_INC.'inc/fulltext.php');
4774bb1b5aeSAndreas Gohr    $data = ft_pageSearch($opt['search_query'], $poswords);
4784bb1b5aeSAndreas Gohr    $data = array_keys($data);
4794bf3df7cSGina Haeussge
4804bf3df7cSGina Haeussge    return $data;
4814bb1b5aeSAndreas Gohr}
482f3f0262cSandi
483e3776c06SMichael Hamann//Setup VIM: ex: et ts=4 :
484