error){ print "

Error:

n

$rss->error

"; }else{ $rss->parse(); $rss->showHeading("h1"); if($rss->link){ print "

Provided courtesy of:
n"; print "$rss->linkn"; } $rss->image->show("middle"); $rss->showDescription(); $rss->showStories(); } rssFeed: object Purpose: Creates an rssFeed class that allows easy display of RSS data. Public Methods: parse Parses the XML and populates properties with the resulting data showHeading Displays the title showImage Displays the image associated with the feed showLink Displays a link to the RSS provider showDescription Displays the feed description showStories Displays the feed items Public Properties: title: The title of the RSS feed copyright: The copyright information included in the RSS feed description: The description included in the RSS feed image An instance of an rssImage object (see below) stories An array of newsStory objects (see below) url The URI of the RSS feed xml The raw XML data obtained from the feed error A text description of the most recent error encountered maxstories The maximum number of stories to show (zero = no limit) rssImage: object Purpose: Creates a class to store information about an image for an RSS feed Public Methods: show Displays the image Public Properties: title The image title, used for ALT attribute url The URL of the image link The URL that the image should link to width The image width in pixels height The image height in pixels newsStory: object Purpose: Creates a class to store an news story in an RSS feed Public Methods: show Displays the story Public Properties: show Displays the story title The headline associated with the story link The link to the full story description A short description, or teaser, of the story pubdate Date/Time the story was published */ //classes follow // Generic container for the complete RSS feed class rssFeed{ var $title=""; var $copyright=""; var $description=""; var $image; var $stories=array(); var $url=""; var $xml=""; var $link=""; var $error=""; var $maxstories=0; // public methods function parse(){ $parser=xml_parser_create(); xml_set_element_handler($parser, "startElement", "endElement"); xml_set_character_data_handler($parser, "characterData"); xml_parse($parser, $this->xml, true) or die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser))); xml_parser_free($parser); } function showHeading($tag=""){ $tag=$tag?$tag:"h1"; if($this->title) print "<$tag>$this->titlen"; } function showImage($align=""){ $this->image->show($align); } function showLink(){ if($this->link) print "$this->linkn"; } function showDescription(){ if($this->description) print "

$this->description

n"; } function showStories(){ echo "
n"; $n=0; foreach($this->stories as $story){ $n++; if ($this->maxstories && $n>$this->maxstories) break; $story->show(); } echo "
n"; } // Methods used internally // Constructor: Expects one string parameter that is the URI of the RSS feed function rssFeed($uri=''){ $this->image=new rssImage(); if($uri){ $this->url=$uri; $this->getFeed(); } else { $this->error="No URL for RSS feed"; } } // Retrieves the XML from the RSS supplier function getFeed(){ // if we have a URL if ($this->url){ if (extension_loaded('curl')) { $this->xml=$this->getRemoteFile($this->url); } } } function getRemoteFile($url){ $s=new gwSocket(); if($s->getUrl($url)){ if(is_array($s->headers)){ $h=array_change_key_case($s->headers, CASE_LOWER); if($s->error) // failed to connect with host $buffer=$this->errorReturn($s->error); elseif(preg_match("/404/",$h['status'])) // page not found $buffer=$this->errorReturn("Page Not Found"); elseif(preg_match("/xml/i",$h['content-type'])) // got XML back $buffer=$s->page; else // got a page, but wrong content type $buffer=$this->errorReturn("The server did not return XML. The content type returned was ".$h['content-type']); } else { $buffer=$this->errorReturn("An unknown error occurred."); } }else{ $buffer=$this->errorReturn("An unknown error occurred."); } return $buffer; } function errorReturn($error){ $retVal="n". "n". "tn". "ttFailed to Get RSS Datan". "ttAn error was ecnountered attempting to get the RSS data: $errorn". "tt".date("D, d F Y H:i:s T")."n". "tt".date("D, d F Y H:i:s T")."n". "tn". "n"; return $retVal; } function addStory($o){ if(is_object($o)) $this->stories[]=$o; else $this->error="Type mismatach: expected object"; } } class rssImage{ var $title=""; var $url=""; var $link=""; var $width=0; var $height=0; function show($align=""){ if($this->url){ if($this->link) print "link">"; //print "link">"; print "url" style="border:none;""; if($this->title) print " alt="$this->title""; if($this->width) print " width="$this->width" height="$this->height""; if($align) print " align="$align""; print ">"; if($this->link) print ""; } } } class newsStory{ var $title=""; var $link=""; var $description=""; var $pubdate=""; function show(){ if($this->title){ if($this->link){ echo "
link">$this->title
n"; //echo "
link">$this->title
n"; }elseif($this->title){ echo "
$this->title
n"; } echo "
"; if($this->pubdate) echo "$this->pubdate - "; if($this->description) echo "$this->description"; echo "
n"; } } } class gwSocket{ var $Name="gwSocket"; var $Version="0.1"; var $userAgent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"; var $headers; var $page=""; var $result=""; var $redirects=0; var $maxRedirects=3; var $error=""; function getUrl( $url ) { $retVal=""; $url_parsed = parse_url($url); $scheme = $url_parsed["scheme"]; $host = $url_parsed["host"]; $port = $url_parsed["port"]?$url_parsed["port"]:"80"; $user = $url_parsed["user"]; $pass = $url_parsed["pass"]; $path = $url_parsed["path"]?$url_parsed["path"]:"/"; $query = $url_parsed["query"]; $anchor = $url_parsed["fragment"]; if (!empty($host)){ // attempt to open the socket if($fp = fsockopen($host, $port, $errno, $errstr, 2)){ $path .= $query?"?$query":""; $path .= $anchor?"$anchor":""; // this is the request we send to the host $out = "GET $path ". "HTTP/1.0rn". "Host: $hostrn". "Connection: Closern". "User-Agent: $this->userAgentrn"; if($user) $out .= "Authorization: Basic ". base64_encode("$user:$pass")."rn"; $out .= "rn"; fputs($fp, $out); while (!feof($fp)) { $retVal.=fgets($fp, 128); } fclose($fp); } else { $this->error="Failed to make connection to host.";//$errstr; } $this->result=$retVal; $this->headers=$this->parseHeaders(trim(substr($retVal,0,strpos($retVal,"rnrn")))); $this->page=trim(stristr($retVal,"rnrn"))."n"; if(isset($this->headers['Location'])){ $this->redirects++; if($this->redirects<$this->maxRedirects){ $location=$this->headers['Location']; $this->headers=array(); $this->result=""; $this->page=""; $this->getUrl($location); } } } return (!$retVal=""); } function parseHeaders($s){ $h=preg_split("/[rn]/",$s); foreach($h as $i){ $i=trim($i); if(strstr($i,":")){ list($k,$v)=explode(":",$i); $hdr[$k]=substr(stristr($i,":"),2); }else{ if(strlen($i)>3) $hdr[]=$i; } } if(isset($hdr[0])){ $hdr['Status']=$hdr[0]; unset($hdr[0]); } return $hdr; } } /* end of classes - global functions follow */ function startElement($parser, $name, $attrs) { global $insideitem, $tag, $isimage; $tag = $name; if($name=="IMAGE") $isimage=true; if ($name == "ITEM") { $insideitem = true; } } function endElement($parser, $name) { global $insideitem, $title, $description, $link, $pubdate, $stories, $rss, $globaldata, $isimage; $globaldata=trim($globaldata); // if we're finishing a news item if ($name == "ITEM") { // create a new news story object $story=new newsStory(); // assign the title, link, description and publication date $story->title=trim($title); $story->link=trim($link); $story->description=trim($description); $story->pubdate=trim($pubdate); // add it to our array of stories $rss->addStory($story); // reset our global variables $title = ""; $description = ""; $link = ""; $pubdate = ""; $insideitem = false; } else { switch($name){ case "TITLE": if(!$isimage) if(!$insideitem) $rss->title=$globaldata; break; case "LINK": if(!$insideitem) $rss->link=$globaldata; break; case "COPYRIGHT": if(!$insideitem) $rss->copyright=$globaldata; break; case "DESCRIPTION": if(!$insideitem) $rss->description=$globaldata; break; } } if($isimage){ switch($name){ case "TITLE": $rss->image->title=$globaldata;break; case "URL": $rss->image->url=$globaldata;break; case "LINK": $rss->image->link=$globaldata;break; case "WIDTH": $rss->image->width=$globaldata;break; case "HEIGHT": $rss->image->height=$globaldata;break; } } if($name=="IMAGE") $isimage=false; $globaldata=""; } function characterData($parser, $data) { global $insideitem, $tag, $title, $description, $link, $pubdate, $globaldata; if ($insideitem) { switch ($tag) { case "TITLE": $title .= $data; break; case "DESCRIPTION": $description .= $data; break; case "LINK": $link .= $data; break; case "PUBDATE": case "DC:DATE": $pubdate .= $data; break; } } else { $globaldata.=$data; } } ?>