<?php
//
// ScarySoftware RSS parser 
// Copyright (c) 2006 Scary Software
// ( Generates HTML from a RSS feeds )
//    
// Licensed Under the Gnu Public License
//


class rssReader {
  
var 
$rssFeeds;

// Class constructor
function rssReader() {

    
// Here are the feeds - you can add to them or change them
    
$this->rssFeeds = array(
            
=> "http://www.site-reference.com/xml.php?c=all",
            
=> "http://rss.cnn.com/rss/cnn_topstories.rss",
            
=> "http://rss.slashdot.org/Slashdot/slashdot",
        );
}

function 
checkCache($rss_url) {

    
$ttl 60*60;// 60 secs/min for 60 minutes = 1 hour(360 secs)  
    
$cachefilename md5(md5($rss_url));

    if (
file_exists($cachefilename) && (time() - $ttl filemtime($cachefilename))) 
    {
        
$feed file_get_contents($cachefilename);
    }
    else
    {
        
$feed file_get_contents($rss_url);
        
$fp fopen($cachefilename'w'); 
        
fwrite($fp$feed); 
        
fclose($fp); 
    }

    return 
$feed;    

}

//
//  Creates HTML from a FeedID in the array
//  it makes $howmany entries
//
function createHtmlFromFeed($feedid$howmany) {

    
// Now we make sure that we have a feed selected to work with
    
$rss_url $this->rssFeeds[$feedid];
    if (!isset(
$rss_url)) $rss_url $this->rssFeeds[$feedid];
    
$howmany intval($howmany);

   
$this->createHtmlFromRSSUrl$rss_url$howmany );

}

//
// Create HTML from an RSS URL
// it makes $mowmany entires
//
function createHtmlFromRSSUrl$rss_url$howmany )
{
    
// Now we get the feed and cache it if necessary
    
$rss_feed $this->checkCache($rss_url);

    
// Now we replace a few things that may cause problems later
    
$rss_feed str_replace("<![CDATA["""$rss_feed);
    
$rss_feed str_replace("]]>"""$rss_feed);
    
$rss_feed str_replace("\n"""$rss_feed);

   
// If there is an image node remove it, we aren't going to use
    // it anyway and it often contains a <title> and <link>
    // that we don't want to match on later.
    
$rss_feed preg_replace('#<image>(.*?)</image>#'''$rss_feed);

    
// Now we get the nodes that we're interested in
    
preg_match_all('#<title>(.*?)</title>#'$rss_feed$titlePREG_SET_ORDER); 
    
preg_match_all('#<link>(.*?)</link>#'$rss_feed$linkPREG_SET_ORDER);
    
preg_match_all('#<description>(.*?)</description>#'$rss_feed$descriptionPREG_SET_ORDER); 

    
//
    // Now that the RSS/XML is parsed.. Lets Make HTML !
    //

    // If there is not at least one title, then the feed was empty
    // it happens sometimes, so lets be prepared and do something 
    // reasonable
    
if(count($title) <= 1)
    {
        echo 
"No news at present, please check back later.<br><br>";
    }
    else
    {
        
// OK Here we go, this is the fun part

        // Well do up the top 3 entries from the feed
        
for ($counter 1$counter <= $howmany$counter++ )
        {
            
// We do a reality check to make sure there is something we can show
            
if(!empty($title[$counter][1]))
            {
                
// Then we'll make a good faith effort to make the title
                // valid HTML
                
$title[$counter][1] = str_replace("&amp;""&"$title[$counter][1]);
                
$title[$counter][1] = str_replace("&apos;""'"$title[$counter][1]);     
                
$title[$counter][1] = str_replace("&pound;""£"$title[$counter][1]);     

                
// The description often has encoded HTML entities in it, and
                // we probably don't want these, so we'll decode them
                
$description[$counter][1] =  html_entity_decode$description[$counter][1]);     

                
// Now we make a pretty page bit from the data we retrieved from
                // the RSS feed.  Remember the function FormatRow from the 
                // beginning of the program ?  Here we put it to use.
                
$row $this->FormatEntry($title[$counter][1],$description[$counter][1],$link[$counter][1]);

                
// And now we'll output the new page bit!
                
echo $row;
            }
        }
    }
}

function 
FormatEntry($title$description$link) {
return <<<eof

<!-- RSS FEED ENTRY -->
<p class="feed_title">
{$title}</p>
<p class="feed_description">
{$description}</p>
<a class="feed_link" href="
{$link}" rel="nofollow" target="_blank">Read more...</a>
<p>&nbsp;</p>
<hr size=1>
<!-- END OF RSS FEED ENTRY -->


eof;
}


function 
GetrssFeeds() {
   return 
$this->rssFeeds;
}

function 
SetrssFeeds($rssFeeds) {
   
$this->rssFeeds $rssFeeds;
}


}
// END OF THE CLASS

?>