%s at line %d
", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser)) ); } fclose($fp); # dismiss xml parser xml_parser_free($xml_parser); } function startElement($parser, $tagname, $attrs=array()) { # RSS 2.0 - ENCLOSURE if($tagname == "ENCLOSURE" && $attrs) { $this->startElement($parser, "ENCLOSURE"); foreach($attrs as $attr => $attrval) { $this->startElement($parser, $attr); $this->parseData($parser, $attrval); $this->endElement($parser, $attr); } $this->endElement($parser, "ENCLOSURE"); } # check if this element can contain others - list may be edited if(preg_match("/^(RDF|RSS|CHANNEL|IMAGE|ITEM)/", $tagname)) { if($this->tags) { $depth = count($this->tags); list($parent, $num) = each($tmp = end($this->tags)); if($parent) $this->tags[$depth-1][$parent][$tagname]++; } array_push($this->tags, array($tagname => array())); } else { if(!preg_match("/^(A|B|I)$/", $tagname)) { # add tag to tags array array_push($this->tags, $tagname); } } } function endElement($parser, $tagname) { if(!preg_match("/^(A|B|I)$/", $tagname)) { # remove tag from tags array array_pop($this->tags); } } function parseData($parser, $data) { # return if data contains no text if(!trim($data)) return; $evalcode = "\$this->output"; foreach($this->tags as $tag) { if(is_array($tag)) { list($tagname, $indexes) = each($tag); $evalcode .= "[\"$tagname\"]"; if(${$tagname}) $evalcode .= "[" . (${$tagname} - 1) . "]"; if($indexes) extract($indexes); } else { if(preg_match("/^([A-Z]+):([A-Z]+)$/", $tag, $matches)) { $evalcode .= "[\"$matches[1]\"][\"$matches[2]\"]"; } else { $evalcode .= "[\"$tag\"]"; } } } eval("$evalcode = $evalcode . '" . addslashes($data) . "';"); } # display a single channel as HTML function display_channel($data, $limit) { extract($data); if($IMAGE) { # display channel image(s) foreach($IMAGE as $image) $this->display_image($image); } if($TITLE) { # display channel information $this->retval .= "

"; if($LINK) $this->retval .= ""; $this->retval .= stripslashes($TITLE); if($LINK) $this->retval .= ""; $this->retval .= "

\n"; if($DESCRIPTION) $this->retval .= "

$DESCRIPTION

\n\n"; $tmp = array(); if($PUBDATE) $tmp[] = "Published: $PUBDATE"; if($COPYRIGHT) $tmp[] = "Copyright: $COPYRIGHT"; if($tmp) $this->retval .= "

" . implode("
\n", $tmp) . "

\n\n"; $this->retval .= "
\n\n"; } if($ITEM) { # display channel item(s) foreach($ITEM as $item) { $this->display_item($item, "CHANNEL"); if(is_int($limit) && --$limit <= 0) break; } } } # display a single image as HTML function display_image($data, $parent="") { extract($data); if(!$URL) return; $this->retval .= "

"; if($LINK) $this->retval .= ""; $this->retval .= "retval .= " width=\"$WIDTH\" height=\"$HEIGHT\""; $this->retval .= " border=\"0\" alt=\"$TITLE\">"; if($LINK) $this->retval .= ""; $this->retval .= "

\n\n"; } # display a single item as HTML function display_item($data, $parent) { extract($data); if(!$TITLE) return; $this->retval .= "

"; if($LINK) $this->retval .= ""; $this->retval .= stripslashes($TITLE); if($LINK) $this->retval .= ""; $this->retval .= ""; if(!$PUBDATE && $DC["DATE"]) $PUBDATE = $DC["DATE"]; if($PUBDATE) $this->retval .= " ($PUBDATE)"; $this->retval .= "

\n"; # use feed-formatted HTML if provided if($CONTENT["ENCODED"]) { $this->retval .= "

" . stripslashes($CONTENT["ENCODED"]) . "

\n"; } elseif($DESCRIPTION) { $this->retval .= "

" . stripslashes($DESCRIPTION) . "

\n\n"; } # RSS 2.0 - ENCLOSURE if($ENCLOSURE) { $this->retval .= "

Media: "; $this->retval .= $ENCLOSURE['TYPE']; $this->retval .= " ({$ENCLOSURE['LENGTH']} bytes)

\n\n"; } if($COMMENTS) { $this->retval .= "

"; $this->retval .= "Comments"; $this->retval .= "

\n\n"; } } function fixEncoding($input, $output_encoding) { if(!function_exists('mb_detect_encoding')) return $input; $encoding = mb_detect_encoding($input); switch($encoding) { case 'ASCII': case $output_encoding: return $input; case '': return mb_convert_encoding($input, $output_encoding); default: return mb_convert_encoding($input, $output_encoding, $encoding); } } # display entire feed as HTML function getOutput($limit=false, $output_encoding='UTF-8') { $this->retval = ""; $start_tag = key($this->output); switch($start_tag) { case "RSS": # new format - channel contains all foreach($this->output[$start_tag]["CHANNEL"] as $channel) { $this->display_channel($channel, $limit); } break; case "RDF:RDF": # old format - channel and items are separate if(isset($this->output[$start_tag]['IMAGE'])) { foreach($this->output[$start_tag]['IMAGE'] as $image) { $this->display_image($image); } } foreach($this->output[$start_tag]['CHANNEL'] as $channel) { $this->display_channel($channel, $limit); } foreach($this->output[$start_tag]['ITEM'] as $item) { $this->display_item($item, $start_tag); } break; case "HTML": die("Error: cannot parse HTML document as RSS"); default: die("Error: unrecognized start tag '$start_tag' in getOutput()"); } return $this->fixEncoding($this->retval, $output_encoding); } # return raw data as array function getRawOutput($output_encoding='UTF-8') { return $this->fixEncoding($this->output, $output_encoding); } } ?>