Skip to content

Instantly share code, notes, and snippets.

@artlung
Created September 17, 2018 00:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save artlung/c16c4fde69fe090d0ee936ce3de20794 to your computer and use it in GitHub Desktop.
Save artlung/c16c4fde69fe090d0ee936ce3de20794 to your computer and use it in GitHub Desktop.
RSSWriter
<?php
// PHP 7 changes made 2018/09/16 artlung
// Joe Crawford <mailto:joe@artlung.com>
//
// $Id: rss10.inc,v 1.2 2006/05/08 03:13:40 arensb Exp $
//
// A convenience class to make it easy to write RSS classes
// Edd Dumbill <mailto:edd+rsswriter@usefulinc.com>
//
// $Log: rss10.inc,v $
// Revision 1.2 2006/05/08 03:13:40 arensb
// Cleaned up indentation, K&R style.
//
// Revision 1.1.1.1 2006/04/26 12:23:02 arensb
// Mirror of Subversion source, so I can keep track of my changes.
//
// Revision 1.3 2001/05/20 17:58:02 edmundd
// Final distribution tweaks.
//
// Revision 1.2 2001/05/20 17:41:30 edmundd
// Ready for distribution.
//
// Revision 1.1 2001/05/20 17:01:43 edmundd
// First functional draft of code working.
//
// Revision 1.1 2001/05/17 18:17:46 edmundd
// Start of a convenience library to help RSS1.0 creation
//
class RSSWriter {
var $chaninfo = [];
var $website;
var $items;
var $modules;
var $channelURI;
var $image;
/**
* RSSWriter constructor.
* @param $uri
* @param $title
* @param $description
* @param array $meta
*/
function __construct($uri, $title, $description, $meta=array()) {
$this->chaninfo=array();
$this->website=$uri;
$this->chaninfo["link"]=$uri;
$this->chaninfo["description"]=$description;
$this->chaninfo["title"]=$title;
$this->items=array();
$this->modules=array("dc" => "http://purl.org/dc/elements/1.1/");
// thanks James Mills for bugfix to this line
$this->channelURI=str_replace("&", "&amp;", "http://" . $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"]);
foreach ($meta as $key => $value) {
$this->chaninfo[$key]=$value;
}
}
/**
* @param $prefix
* @param $uri
*/
function useModule($prefix, $uri) {
$this->modules[$prefix]=$uri;
}
/**
* @param $imgURI
* @param $imgAlt
* @param int $imgWidth
* @param int $imgHeight
*/
function setImage($imgURI, $imgAlt, $imgWidth=88, $imgHeight=31) {
$this->image=array(
"uri" => $imgURI, "title" => $imgAlt, "width" => $imgWidth,
"height" => $imgHeight
);
}
/**
* @param $uri
* @param $title
* @param array $meta
*/
function addItem($uri, $title, $meta=array()) {
$item=array("uri" => $uri, "link" => $uri,
"title" => $this->deTag($title));
foreach ($meta as $key => $value)
{
if ($key == "description" || $key == "dc:description")
{
$value=$this->deTag($value);
}
$item[$key]=$value;
}
$this->items[]=$item;
}
/**
*
*/
function serialize() {
$this->preamble();
$this->channelinfo();
$this->image();
$this->items();
$this->postamble();
}
/**
* @param $in
* @return null|string|string[]
*/
function deTag($in) {
while(preg_match('/<[^>]+>/', $in)) {
$in = preg_replace('/<[^>]+>/', '', $in);
}
return $in;
}
/**
*
*/
function preamble() {
header("Content-type: text/xml");
print '<?xml version="1.0" encoding="utf-8"?>';
print '<rdf:RDF ';
print ' xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"';
print ' xmlns="http://purl.org/rss/1.0/"';
print "\n";
foreach ($this->modules as $prefix => $uri) {
print " xmlns:${prefix}=\"${uri}\"\n";
}
print ">\n\n";
}
/**
*
*/
function channelinfo() {
print ' <channel rdf:about="' . $this->channelURI . '">';
print "\n";
$i=$this->chaninfo;
foreach (array("title", "link", "dc:source", "description",
"dc:language", "dc:publisher",
"dc:creator", "dc:rights") as $f) {
if (isset($i[$f])) {
print " <${f}>" . htmlspecialchars($i[$f]) . "</${f}>\n";
}
}
if (isset($this->image)) {
print " <image rdf:resource=\"" . htmlspecialchars($this->image["uri"]) . "\" />\n";
}
print " <items>\n";
print " <rdf:Seq>\n";
foreach ($this->items as $i) {
print " <rdf:li rdf:resource=\"" . htmlspecialchars($i["uri"]) . "\" />\n";
}
print " </rdf:Seq>\n";
print " </items>\n";
print " </channel>\n\n";
}
/**
*
*/
function image() {
if (isset($this->image)) {
print " <image rdf:about=\"" . htmlspecialchars($this->image["uri"]) . "\">\n";
print " <title>" . htmlspecialchars($this->image["title"]) . "</title>\n";
print " <url>" . htmlspecialchars($this->image["uri"]) . "</url>\n";
print " <link>" . htmlspecialchars($this->website) . "</link>\n";
if ($this->chaninfo["description"])
print " <dc:description>" .
htmlspecialchars($this->chaninfo["description"]) .
"</dc:description>\n";
print " </image>\n\n";
}
}
/**
*
*/
function postamble() {
print '</rdf:RDF>';
}
/**
*
*/
function items() {
foreach ($this->items as $item) {
print " <item rdf:about=\"" . htmlspecialchars($item["uri"]) . "\">\n";
foreach ($item as $key => $value) {
if ($key!="uri") {
if (is_array($value)) {
foreach ($value as $v1) {
print " <${key}>" . htmlspecialchars($v1) . "</${key}>\n";
}
} else {
print " <${key}>" . htmlspecialchars($value) . "</${key}>\n";
}
}
}
print " </item>\n\n";
}
}
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment