1f3f0262cSandi<?php 2*15fae107Sandi/** 3*15fae107Sandi * XML feed export 4*15fae107Sandi * 5*15fae107Sandi * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 6*15fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 7*15fae107Sandi */ 8*15fae107Sandi 9f3f0262cSandi ini_set('short_open_tag',"1"); 10f3f0262cSandi require_once("inc/common.php"); 11f3f0262cSandi require_once("inc/parser.php"); 12f3f0262cSandi require_once("inc/feedcreator.class.php"); 13f3f0262cSandi require_once("inc/auth.php"); 14f3f0262cSandi 15f3f0262cSandi //set auth header for login 16f3f0262cSandi if($_REQUEST['login'] && !isset($_SERVER['PHP_AUTH_USER'])){ 17f3f0262cSandi header('WWW-Authenticate: Basic realm="'.$conf['title'].'"'); 18f3f0262cSandi header('HTTP/1.0 401 Unauthorized'); 19f3f0262cSandi auth_logoff(); 20f3f0262cSandi } 21f3f0262cSandi 22f3f0262cSandi 23f3f0262cSandi $num = $_REQUEST['num']; 24f3f0262cSandi $type = $_REQUEST['type']; 25f3f0262cSandi $mode = $_REQUEST['mode']; 26f3f0262cSandi $ns = $_REQUEST['ns']; 27f3f0262cSandi 28f3f0262cSandi switch ($type){ 29f3f0262cSandi case 'rss': 30f3f0262cSandi $type = 'RSS0.9'; 31f3f0262cSandi break; 32f3f0262cSandi case 'rss2': 33f3f0262cSandi $type = 'RSS2.0'; 34f3f0262cSandi break; 35f3f0262cSandi case 'atom': 36f3f0262cSandi $type = 'ATOM0.3'; 37f3f0262cSandi break; 38f3f0262cSandi default: 39f3f0262cSandi $type = 'RSS1.0'; 40f3f0262cSandi } 41f3f0262cSandi 42f3f0262cSandi //some defaults for the feed 43f3f0262cSandi $CACHEGROUP = 'feed'; 44f3f0262cSandi $conf['typography'] = false; 45f3f0262cSandi $conf['canonical'] = true; 46f3f0262cSandi $parser['toc'] = false; 47f3f0262cSandi 48f3f0262cSandi $rss = new UniversalFeedCreator(); 49f3f0262cSandi $rss = new DokuWikiFeedCreator(); 50f3f0262cSandi $rss->title = $conf['title']; 51f3f0262cSandi $rss->link = wl(); 52f3f0262cSandi $rss->syndicationURL = getBaseURL().'/feed.php'; 53f3f0262cSandi $rss->cssStyleSheet = getBaseURL().'/feed.css'; 54f3f0262cSandi 55f3f0262cSandi if($mode == 'list'){ 56f3f0262cSandi rssListNamespace($rss,$ns); 57f3f0262cSandi }else{ 58f3f0262cSandi rssRecentChanges($rss,$num); 59f3f0262cSandi } 60f3f0262cSandi 61f3f0262cSandi header('Content-Type: application/xml; charset='.$lang['encoding']); 62f3f0262cSandi print $rss->createFeed($type,$lang['encoding']); 63f3f0262cSandi 64*15fae107Sandi// ---------------------------------------------------------------- // 65f3f0262cSandi 66*15fae107Sandi/** 67*15fae107Sandi * Add recent changed to a feed object 68*15fae107Sandi * 69*15fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 70*15fae107Sandi */ 71f3f0262cSandifunction rssRecentChanges(&$rss,$num){ 72f3f0262cSandi $recents = getRecents($num); 73f3f0262cSandi foreach(array_keys($recents) as $id){ 74f3f0262cSandi $desc = cleanDesc(parsedWiki($id)); 75f3f0262cSandi if(!empty($recents[$id]['sum'])){ 76f3f0262cSandi $desc = '['.strip_tags($recents[$id]['sum']).'] '.$desc; 77f3f0262cSandi } 78f3f0262cSandi $item = new FeedItem(); 79f3f0262cSandi $item->title = $id; 80f3f0262cSandi $item->link = wl($id,'rev='.$recents[$id]['date']); 81f3f0262cSandi $item->description = $desc; 82f3f0262cSandi $item->date = date('r',$recents[$id]['date']); 83f3f0262cSandi if(strpos($id,':')!==false){ 84f3f0262cSandi $item->category = substr($id,0,strrpos($id,':')); 85f3f0262cSandi } 86f3f0262cSandi if($recents[$id]['user']){ 87f3f0262cSandi $item->author = $recents[$id]['user'].'@'; 88f3f0262cSandi }else{ 89f3f0262cSandi $item->author = 'anonymous@'; 90f3f0262cSandi } 91f3f0262cSandi $item->author .= $recents[$id]['ip']; 92f3f0262cSandi 93f3f0262cSandi $rss->addItem($item); 94f3f0262cSandi } 95f3f0262cSandi} 96f3f0262cSandi 97*15fae107Sandi/** 98*15fae107Sandi * Add all pages of a namespace to a feedobject 99*15fae107Sandi * 100*15fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 101*15fae107Sandi */ 102f3f0262cSandifunction rssListNamespace(&$rss,$ns){ 103f3f0262cSandi require_once("inc/search.php"); 104f3f0262cSandi global $conf; 105f3f0262cSandi 106f3f0262cSandi $ns=':'.cleanID($ns); 107f3f0262cSandi $ns=str_replace(':','/',$ns); 108f3f0262cSandi 109f3f0262cSandi $data = array(); 110f3f0262cSandi sort($data); 111f3f0262cSandi search($data,$conf['datadir'],'search_list','',$ns); 112f3f0262cSandi foreach($data as $row){ 113f3f0262cSandi $id = $row['id']; 114f3f0262cSandi $date = filemtime(wikiFN($id)); 115f3f0262cSandi $desc = cleanDesc(parsedWiki($id)); 116f3f0262cSandi $item = new FeedItem(); 117f3f0262cSandi $item->title = $id; 118f3f0262cSandi $item->link = wl($id,'rev='.$date); 119f3f0262cSandi $item->description = $desc; 120f3f0262cSandi $item->date = date('r',$date); 121f3f0262cSandi $rss->addItem($item); 122f3f0262cSandi } 123f3f0262cSandi} 124f3f0262cSandi 125*15fae107Sandi/** 126*15fae107Sandi * Clean description for feed inclusion 127*15fae107Sandi * 128*15fae107Sandi * Removes HTML tags and line breaks and trims the text to 129*15fae107Sandi * 250 chars 130*15fae107Sandi * 131*15fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 132*15fae107Sandi */ 133f3f0262cSandifunction cleanDesc($desc){ 134f3f0262cSandi //remove TOC 135f3f0262cSandi $desc = strip_tags($desc); 136f3f0262cSandi $desc = preg_replace('/[\n\r\t]/',' ',$desc); 137f3f0262cSandi $desc = preg_replace('/ /',' ',$desc); 138f3f0262cSandi $desc = substr($desc,0,250); 139f3f0262cSandi $desc = $desc.'...'; 140f3f0262cSandi return $desc; 141f3f0262cSandi} 142f3f0262cSandi 143f3f0262cSandi?> 144