level.
//
// Revision 2.5 2005/09/28 02:08:15 housley
// Fix the storage of pubDate at the feed level
//
// Revision 2.4 2005/09/12 18:56:31 housley
// Set a user agent for both fopen and curl transerfers
//
// Revision 2.3 2005/09/06 22:55:27 housley
// GUID doesn't need urlencode()
//
// Revision 2.2 2005/08/16 19:53:15 housley
// Add the ~~~ItemAuthor~~~ subsitution that uses first and then
// for its contents
//
// Revision 2.1 2005/08/15 14:49:24 housley
// Convert ' to ' since ' is not HTML
//
// Revision 2.0 2005/07/30 14:09:38 housley
// Allow "allow_url_fopen" to be sellected, incase CURL is not available.
//
// Revision 1.33 2005/07/20 00:53:35 housley
// Fix it so the this PHP script can be used as a PHP include many time on the same page
//
// Revision 1.32 2005/07/20 00:36:27 housley
// Don't set allow_url_fopen any more
//
// Revision 1.31 2005/07/20 00:35:28 housley
// Use CURL to open URLs instead of fopen()
//
// Revision 1.30 2005/05/08 01:47:27 housley
// Add NoFutureItems
//
// Revision 1.29 2005/05/06 01:04:56 housley
// Make sure FeedMaxItems is not larger then the number of items.
//
// Revision 1.28 2005/04/30 18:08:41 housley
// ~~~SortByPubDate~~~ will force the sorting of the items by pubDate, with the newest being first.
//
// Revision 1.27 2005/04/30 17:49:17 housley
// Allow FeedMaxItems to be negative. A negative number will grab the last
// items
//
// Revision 1.26 2005/03/28 14:48:45 housley
// * Remove debug print statement
// * Fix the creation of the putDate for cases when the feed didn't have them, bad feed...bad feed.
//
// Revision 1.25 2005/03/23 23:22:48 housley
// Handle dc:date in RSS 2.0 feeds. If both pubData and dc:date exist, pubDate has priority
//
// Revision 1.24 2005/03/11 12:44:44 housley
// Exit with short message if a file can't be opened.
//
// Revision 1.23 2005/03/09 15:15:41 housley
// Add copyright header
//
// Revision 1.22 2005/03/08 15:25:04 housley
// * Add ID for full version number
// * Add Log to show change logs
// * Add support for and ~~~FeedContentEncoded~~~ and ~~~ ItemContentEncoded~~~
//
//
//
// Set the following variable useFopenURL to one if you want/need to use fopen instead of CURL
$useFopenURL = 0;
if ($useFopenURL) {
ini_set("allow_url_fopen", "1");
ini_set("user_agent", 'FeedForAll rss2html.php v2');
}
if (function_exists("FeedForAll_rss2html_readFile") === FALSE) {
Function FeedForAll_rss2html_readFile($filename, $useFopenURL) {
$GLOBALS["ERRORSTRING"] = "";
$result = "";
if (stristr($filename, "://")) {
if ($useFopenURL) {
if (($fd = @fopen($filename, "rb")) === FALSE) {
return FALSE;
}
while (($data = fread($fd, 4096)) != "") {
$result .= $data;
}
fclose($fd);
} else {
// This is a URL so use CURL
$curlHandle = curl_init();
curl_setopt($curlHandle, CURLOPT_URL, $filename);
curl_setopt($curlHandle, CURLOPT_HEADER, 0);
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curlHandle, CURLOPT_USERAGENT, "FeedForAll rss2html.php v2");
// curl_setopt($curlHandle, CURLOPT_AUTOREFERER, 1);
curl_setopt($curlHandle, CURLOPT_REFERER, $filename);
curl_setopt($curlHandle, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curlHandle, CURLOPT_MAXREDIRS, 10);
$result = curl_exec($curlHandle);
if (curl_errno($curlHandle)) {
$GLOBALS["ERRORSTRING"] = curl_error($curlHandle);
curl_close($curlHandle);
return FALSE;
}
curl_close($curlHandle);
}
} else {
// This is a local file, so use fopen
if (($fd = @fopen($filename, "rb")) === FALSE) {
return FALSE;
}
while (($data = fread($fd, 4096)) != "") {
$result .= $data;
}
fclose($fd);
}
return $result;
}
}
if (!isset($_REQUEST["buildURL"])) {
//
// If XLMfile is passed as part of the REQUEST_URI, then it will be used
// otherwise the the file below is used.
//$XMLfilename = "http://examlple.com/sample.xml";
$XMLfilename = "http://www.tcfnet.org.au/pdfs/bulletin.xml";
if (isset($_REQUEST["XMLFILE"])) {
if (stristr($_REQUEST["XMLFILE"], "file://")) {
// Not allowed
;
}
elseif (stristr($_REQUEST["XMLFILE"], "://")) {
// URL files are allowed
$XMLfilename = $_REQUEST["XMLFILE"];
} else {
// It is local and must be in the same directory
$XMLfilename = basename($_REQUEST["XMLFILE"]);
}
}
//
// If TEMPLATE is passed as part of the REQUEST_URI, then it will be used
// otherwise the the file below is used.
$TEMPLATEfilename = "http://www.tcfnet.org.au/Resource/tcfnewslettertmplt.html";
if (isset($_REQUEST["TEMPLATE"])) {
if (stristr($_REQUEST["TEMPLATE"], "file://")) {
// Not allowed
;
}
elseif (stristr($_REQUEST["TEMPLATE"], "://")) {
// URL files are allowed
$TEMPLATEfilename = $_REQUEST["TEMPLATE"];
} else {
// It is local and must be in the same directory
$TEMPLATEfilename = basename($_REQUEST["TEMPLATE"]);
}
}
//
// date() function documented http://www.php.net/manual/en/function.date.php
//
$LongDateFormat = "F jS, Y"; // ie, "Jan 21st, 2004"
$ShortDateFormat = "m/d/Y"; // ie, "1/21/2004"
//$ShortDateFormat = "d/m/Y"; // ie, "21/1/2004"
$LongTimeFormat = "H:i:s T O"; // ie, "13:24:30 EDT -0400"
$ShortTimeFormat = "h:i A"; // ie, "1:24 PM"
//
// Maximum number of items to be displayed
//
$FeedMaxItems = 10000;
if (isset($_REQUEST["MAXITEMS"])) {
$FeedMaxItems = $_REQUEST["MAXITEMS"];
}
$NoFutureItems = FALSE;
if (isset($_REQUEST["NOFUTUREITEMS"])) {
$NoFutureItems = TRUE;
}
//
// As much as I hate globals, they are needed due to the
// recusive nature of the parser
$insidechannel = FALSE;
$level_channel = 0;
$insidechannelimage = FALSE;
$level_channelimage = 0;
$insideitem = FALSE;
$level_item = 0;
if (function_exists("FeedForAll_rss2html_getRFDdate") === FALSE) {
Function FeedForAll_rss2html_getRFDdate($datestring) {
$year = substr($datestring, 0, 4);
$month = substr($datestring, 5, 2);
$day = substr($datestring, 8, 2);
$hour = substr($datestring, 11, 2);
$minute = substr($datestring, 14, 2);
$second = substr($datestring, 17, 2);
if (substr($datestring, 19, 1) == "Z") {
$offset_hour = 0;
$offset_minute = 0;
} else {
if (substr($datestring, 19, 1) == "+") {
$offset_hour = substr($datestring, 20, 2);
$offset_minute = substr($datestring, 23, 2);
} else {
$offset_hour = -1*substr($datestring, 20, 2);
$offset_minute = -1*substr($datestring, 23, 2);
}
}
return gmmktime($hour+$offset_hour, $minute+$offset_minute, $second, $month, $day, $year);
}
class FeedForAll_rss2html_RSSParser {
var $gotROOT = 0;
var $feedTYPE = "RSS";
var $level = 0;
var $tag = "";
var $title = "";
var $description = "";
var $contentEncoded = "";
var $link = "";
var $guid = "";
var $enclosureURL = "";
var $pubdate = "";
var $pubdateDC = "";
var $fimageURL = "";
var $fimageTitle = "";
var $fimageLink = "";
var $author = "";
var $DcCreator = "";
var $FeedTitle = "";
var $FeedDescription = "";
var $FeedContentEncoded = "";
var $FeedLink = "";
var $FeedPubDate = "";
var $FeedPubDateDC = "";
var $FeedPubDate_t = "";
var $FeedLastBuildDate = "";
var $FeedImageURL = "";
var $FeedImageTitle = "";
var $FeedImageLink = "";
// When adding new Item elements, be sure to update the sort below
var $ItemTitle = "";
var $ItemDescription = "";
var $ItemContentEncoded = "";
var $ItemLink = "";
var $ItemGuid = "";
var $ItemPubDate = "";
var $ItemPubDate_t = "";
var $ItemEnclosureURL = "";
var $ItemAuthor = "";
function startElement($parser, $tagName, $attrs) {
GLOBAL $insidechannel;
GLOBAL $level_channel;
GLOBAL $insidechannelimage;
GLOBAL $level_channelimage;
GLOBAL $insideitem;
GLOBAL $level_item;
$this->level++;
$this->tag = $tagName;
if ($this->gotROOT == 0) {
$this->gotROOT = 1;
if (strstr($tagName, "RSS")) {
$this->feedTYPE = "RSS";
}
elseif (strstr($tagName, "RDF")) {
$this->feedTYPE = "RDF";
}
elseif (strstr($tagName, "FEE")) {
$this->feedTYPE = "FEE";
$insidechannel = TRUE;
$level_channel = 1;
}
}
elseif ((($tagName == "ITEM") && ($this->feedTYPE != "FEE")) || (($tagName == "ENTRY") && ($this->feedTYPE == "FEE"))) {
$insideitem = TRUE;
$level_item = $this->level;
}
elseif (($insideitem) && ($tagName == "ENCLOSURE")) {
$this->enclosureURL = $attrs["URL"];
}
elseif (($tagName == "LINK") && ($this->feedTYPE == "FEE")) {
$this->link = $attrs["HREF"];
}
elseif ($tagName == "CHANNEL") {
$insidechannel = TRUE;
$level_channel = $this->level;
}
elseif (($tagName == "IMAGE") && ($insidechannel = TRUE)) {
$insidechannelimage = TRUE;
$level_channelimage = $this->level;
}
if ($parser);
}
function endElement($parser, $tagName) {
GLOBAL $insidechannel;
GLOBAL $level_channel;
GLOBAL $insidechannelimage;
GLOBAL $level_channelimage;
GLOBAL $insideitem;
GLOBAL $level_item;
GLOBAL $NoFutureItems;
$this->level--;
if ((($tagName == "ITEM") && ($this->feedTYPE != "FEE")) || (($tagName == "ENTRY") && ($this->feedTYPE == "FEE"))) {
$UseItem = TRUE;
if ($NoFutureItems) {
$noon = strtotime("today at 12:00");
if (trim($this->pubdate) != "") {
$ItemPubDate = strtotime($this->pubdate);
}
else if (trim($this->pubdateDC) != "") {
$ItemPubDate = FeedForAll_rss2html_getRFDdate($this->pubdateDC);
} else {
$ItemPubDate = time();
}
if (($ItemPubDate - $noon) > 43200) {
$UseItem = FALSE;
}
}
if ($UseItem) {
$this->ItemTitle[] = trim($this->title);
$this->ItemDescription[] = trim($this->description);
$this->ItemContentEncoded[] = trim($this->contentEncoded);
if (trim($this->contentEncoded) == "") {
$this->ItemContentEncoded[] = $this->description;
}
$this->ItemLink[] = trim($this->link);
//
// Get the pubDate from pubDate first and then dc:date
if (trim($this->pubdate) != "") {
$this->ItemPubDate[] = trim($this->pubdate);
$this->ItemPubDate_t[] = strtotime($this->pubdate);
}
else if (trim($this->pubdateDC) != "") {
$this->ItemPubDate[] = trim($this->pubdateDC);
$this->ItemPubDate_t[] = FeedForAll_rss2html_getRFDdate($this->pubdateDC);
} else {
$this->ItemPubDate[] = date("D, d M Y H:i:s +0000");
$this->ItemPubDate_t[] = time();
}
$this->ItemGuid[] = trim($this->guid);
$this->ItemEnclosureURL[] = trim($this->enclosureURL);
if ($this->author == "") {
$this->ItemAuthor[] = $this->DcCreator;
} else {
$this->ItemAuthor[] = $this->author;
}
}
$this->title = "";
$this->description = "";
$this->contentEncoded = "";
$this->link = "";
$this->pubdate = "";
$this->pubdateDC = "";
$this->guid = "";
$this->enclosureURL = "";
$this->author = "";
$this->DcCreator = "";
$insideitem = FALSE;
$level_item = 0;
}
elseif (($tagName == "IMAGE") && ($insidechannelimage)) {
$this->FeedImageURL = trim($this->fimageURL);
$this->FeedImageTitle = trim($this->fimageTitle);
$this->FeedImageLink = trim($this->fimageLink);
$this->fimageURL = "";
$this->fimageTitle = "";
$this->fimageLink = "";
$insidechannelimage = FALSE;
$level_channelimage = 0;
}
elseif ($tagName == "CHANNEL") {
//
// Get the pubDate from pubDate first and then dc:date
if (trim($this->FeedPubDate) != "") {
$this->FeedPubDate_t = strtotime($this->FeedPubDate);
}
else if (trim($this->FeedPubDateDC) != "") {
$this->FeedPubDate_t = FeedForAll_rss2html_getRFDdate($this->FeedPubDateDC);
}
else if (trim($this->FeedLastBuildDate) != "") {
$this->FeedPubDate_t = strtotime($this->FeedLastBuildDate);
} else {
$this->FeedPubDate = date("D, d M Y H:i:s +0000");
$this->FeedPubDate_t = time();
}
$insidechannel = FALSE;
$level_channel = 0;
}
elseif ($this->level == $level_channel) {
if ($tagName == "TITLE") {
$this->FeedTitle = trim($this->title);
$this->title = "";
}
elseif (($tagName == "DESCRIPTION") || ($tagName == "TAGLINE")) {
$this->FeedDescription = trim($this->description);
$this->description = "";
}
elseif ($tagName == "CONTENT:ENCODED") {
$this->FeedContentEncoded = trim($this->contentEncoded);
$this->contentEncoded = "";
}
elseif ($tagName == "LINK") {
$this->FeedLink = trim($this->link);
$this->link = "";
}
}
if ($parser);
}
function characterData($parser, $data) {
GLOBAL $insidechannel;
GLOBAL $level_channel;
GLOBAL $insidechannelimage;
GLOBAL $level_channelimage;
GLOBAL $insideitem;
GLOBAL $level_item;
if (($data == "") || ($data == NULL)) {
} else {
if (($insideitem) && ($this->level == $level_item+1)) {
switch ($this->tag) {
case "TITLE":
$this->title .= $data;
break;
case "DESCRIPTION":
$this->description .= $data;
break;
case "CONTENT:ENCODED":
$this->contentEncoded .= $data;
break;
case "SUMMARY":
$this->description .= $data;
break;
case "LINK":
$this->link .= $data;
break;
case "PUBDATE":
$this->pubdate .= $data;
break;
case "DC:DATE":
$this->pubdateDC .= $data;
break;
case "MODIFIED":
$this->pubdateDC .= $data;
break;
case "GUID":
$this->guid .= $data;
break;
case "AUTHOR":
$this->author .= $data;
break;
case "DC:CREATOR":
$this->DcCreator .= $data;
break;
}
}
elseif ($insidechannelimage) {
switch ($this->tag) {
case "TITLE":
$this->fimageTitle .= $data;
break;
case "URL":
$this->fimageURL .= $data;
break;
case "LINK":
$this->fimageLink .= $data;
break;
}
}
elseif (($insidechannel) && ($this->level == $level_channel+1)) {
switch ($this->tag) {
case "TITLE":
$this->title .= $data;
break;
case "DESCRIPTION":
$this->description .= $data;
break;
case "CONTENT:ENCODED":
$this->contentEncoded .= $data;
break;
case "TAGLINE":
$this->description .= $data;
break;
case "LINK":
$this->link .= $data;
break;
case "PUBDATE":
$this->FeedPubDate .= $data;
break;
case "DC:DATE":
$this->FeedPubDateDC .= $data;
break;
case "MODIFIED":
$this->FeedPubDateDC .= $data;
break;
case "LASTBUILDDATE":
$this->FeedLastBuildDate .= $data;
break;
}
}
}
if ($parser);
}
}
}
if (($template = FeedForAll_rss2html_readFile($TEMPLATEfilename, $useFopenURL)) === FALSE) {
if ($GLOBALS["ERRORSTRING"] == "") {
echo "Unable to open template $TEMPLATEfilename, exiting\n";
} else {
echo "Unable to open template $TEMPLATEfilename with error $GLOBALS[ERRORSTRING], exiting\n";
}
exit -1;
}
if (strstr($template, "~~~NoFutureItems~~~")) {
$NoFutureItems = TRUE;
}
$xml_parser = xml_parser_create('');
$rss_parser = new FeedForAll_rss2html_RSSParser();
xml_set_object($xml_parser,$rss_parser);
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,1);
if (($XML = FeedForAll_rss2html_readFile($XMLfilename, $useFopenURL)) === FALSE) {
if ($GLOBALS["ERRORSTRING"] == "") {
echo "Unable to open RSS Feed $TEMPLATEfilename, exiting\n";
} else {
echo "Unable to open RSS Feed $TEMPLATEfilename with error $GLOBALS[ERRORSTRING], exiting\n";
}
exit -1;
}
xml_parse($xml_parser, $XML);
xml_parser_free($xml_parser);
// make sure the channel contentEncoded is not blank
if ($rss_parser->FeedContentEncoded == "") {
$rss_parser->FeedContentEncoded = $rss_parser->FeedDescription;
}
$template = str_replace("~~~FeedTitle~~~", $rss_parser->FeedTitle, $template);
$template = str_replace("~~~FeedDescription~~~", $rss_parser->FeedDescription, $template);
$template = str_replace("~~~FeedContentEncoded~~~", $rss_parser->FeedContentEncoded, $template);
$template = str_replace("~~~FeedLink~~~", $rss_parser->FeedLink, $template);
$template = str_replace("~~~FeedPubDate~~~", $rss_parser->FeedPubDate, $template);
$template = str_replace("~~~FeedPubLongDate~~~", date($LongDateFormat, $rss_parser->FeedPubDate_t), $template);
$template = str_replace("~~~FeedPubShortDate~~~", date($ShortDateFormat, $rss_parser->FeedPubDate_t), $template);
$template = str_replace("~~~FeedPubLongTime~~~", date($LongTimeFormat, $rss_parser->FeedPubDate_t), $template);
$template = str_replace("~~~FeedPubShortTime~~~", date($ShortTimeFormat, $rss_parser->FeedPubDate_t), $template);
$template = str_replace("~~~FeedImageUrl~~~", $rss_parser->FeedImageURL, $template);
$template = str_replace("~~~FeedImageTitle~~~", $rss_parser->FeedImageTitle, $template);
$template = str_replace("~~~FeedImageLink~~~", $rss_parser->FeedImageLink, $template);
$match = NULL;
$template = str_replace("~~~NoFutureItems~~~", "", $template);
// Sort by PubDate if requested
if (strstr($template, "~~~SortByPubDate~~~")) {
$template = str_replace("~~~SortByPubDate~~~", "", $template);
for ($x = 0; $x < count($rss_parser->ItemTitle)-1; $x++)
{
for ($y = $x+1; $y < count($rss_parser->ItemTitle); $y++)
{
if ($rss_parser->ItemPubDate_t[$x] < $rss_parser->ItemPubDate_t[$y])
{
// Swap them
$swapTemp = $rss_parser->ItemTitle[$x]; $rss_parser->ItemTitle[$x] = $rss_parser->ItemTitle[$y]; $rss_parser->ItemTitle[$y] = $swapTemp;
$swapTemp = $rss_parser->ItemDescription[$x]; $rss_parser->ItemDescription[$x] = $rss_parser->ItemDescription[$y]; $rss_parser->ItemDescription[$y] = $swapTemp;
$swapTemp = $rss_parser->ItemContentEncoded[$x]; $rss_parser->ItemContentEncoded[$x] = $rss_parser->ItemContentEncoded[$y]; $rss_parser->ItemContentEncoded[$y] = $swapTemp;
$swapTemp = $rss_parser->ItemLink[$x]; $rss_parser->ItemLink[$x] = $rss_parser->ItemLink[$y]; $rss_parser->ItemLink[$y] = $swapTemp;
$swapTemp = $rss_parser->ItemGuid[$x]; $rss_parser->ItemGuid[$x] = $rss_parser->ItemGuid[$y]; $rss_parser->ItemGuid[$y] = $swapTemp;
$swapTemp = $rss_parser->ItemPubDate[$x]; $rss_parser->ItemPubDate[$x] = $rss_parser->ItemPubDate[$y]; $rss_parser->ItemPubDate[$y] = $swapTemp;
$swapTemp = $rss_parser->ItemPubDate_t[$x]; $rss_parser->ItemPubDate_t[$x] = $rss_parser->ItemPubDate_t[$y]; $rss_parser->ItemPubDate_t[$y] = $swapTemp;
$swapTemp = $rss_parser->ItemEnclosureURL[$x]; $rss_parser->ItemEnclosureURL[$x] = $rss_parser->ItemEnclosureURL[$y]; $rss_parser->ItemEnclosureURL[$y] = $swapTemp;
$swapTemp = $rss_parser->ItemAuthor[$x]; $rss_parser->ItemAuthor[$x] = $rss_parser->ItemAuthor[$y]; $rss_parser->ItemAuthor[$y] = $swapTemp;
}
}
}
}
// The the maximum items requested
if (strstr($template, "~~~FeedMaxItems=")) {
// Limit the maximun number of items displayed
if (preg_match("/~~~FeedMaxItems=([0-9-]*)~~~/", $template, $match) !== FALSE) {
if (($match[0] != "") && ($match[1] != "")) {
$FeedMaxItems = $match[1];
$template = str_replace("~~~FeedMaxItems=$match[1]~~~", "", $template);
if (abs($FeedMaxItems) > count($rss_parser->ItemTitle)) {
if ($FeedMaxItems > 0) {
$FeedMaxItems = count($rss_parser->ItemTitle);
} else {
$FeedMaxItems = -count($rss_parser->ItemTitle);
}
}
}
}
}
//
// Find the string, if it exists, between the ~~~EndItemsRecord~~~ and ~~~BeginItemsRecord~~~
//
while ((strstr($template, "~~~BeginItemsRecord~~~")) !== FALSE) {
$match = NULL;
$allitems = NULL;
$loop_limit = min(abs($FeedMaxItems), count($rss_parser->ItemTitle));
if (($parts = split("~~~BeginItemsRecord~~~", $template)) !== FALSE) {
if (($parts = split("~~~EndItemsRecord~~~", $parts[1])) !== FALSE) {
$WholeBlock = $parts[0];
//
// Check for ~~~BeginAlternateItemsRecord~~~
//
if (strstr($WholeBlock, "~~~BeginAlternateItemsRecord~~~")) {
$parts = split("~~~BeginAlternateItemsRecord~~~", $WholeBlock);
$block1 = $parts[0];
$block2 = $parts[1];
} else {
$block1 = $WholeBlock;
$block2 = $WholeBlock;
}
if ($FeedMaxItems < 0) {
for ($x = count($rss_parser->ItemTitle)-1; $x >= count($rss_parser->ItemTitle) + $FeedMaxItems; $x--) {
$item = str_replace("~~~ItemTitle~~~", $rss_parser->ItemTitle[$x], $block1);
$item = str_replace("~~~ItemDescription~~~", $rss_parser->ItemDescription[$x], $item);
$item = str_replace("~~~ItemContentEncoded~~~", $rss_parser->ItemContentEncoded[$x], $item);
$item = str_replace("~~~ItemLink~~~", $rss_parser->ItemLink[$x], $item);
$item = str_replace("~~~ItemPubDate~~~", $rss_parser->ItemPubDate[$x], $item);
$item = str_replace("~~~ItemGuid~~~", $rss_parser->ItemGuid[$x], $item);
$item = str_replace("~~~ItemPubLongDate~~~", date($LongDateFormat, $rss_parser->ItemPubDate_t[$x]), $item);
$item = str_replace("~~~ItemPubShortDate~~~", date($ShortDateFormat, $rss_parser->ItemPubDate_t[$x]), $item);
$item = str_replace("~~~ItemPubLongTime~~~", date($LongTimeFormat, $rss_parser->ItemPubDate_t[$x]), $item);
$item = str_replace("~~~ItemPubShortTime~~~", date($ShortTimeFormat, $rss_parser->ItemPubDate_t[$x]), $item);
$item = str_replace("~~~ItemEnclosureUrl~~~", $rss_parser->ItemEnclosureURL[$x], $item);
$item = str_replace("~~~ItemAuthor~~~", $rss_parser->ItemAuthor[$x], $item);
$allitems .= "".$item;
$x--;
if ($x >= count($rss_parser->ItemTitle) + $FeedMaxItems) {
//
// This is at least one more item so use the Alternate definition
//
$item = str_replace("~~~ItemTitle~~~", $rss_parser->ItemTitle[$x], $block2);
$item = str_replace("~~~ItemDescription~~~", $rss_parser->ItemDescription[$x], $item);
$item = str_replace("~~~ItemContentEncoded~~~", $rss_parser->ItemContentEncoded[$x], $item);
$item = str_replace("~~~ItemLink~~~", $rss_parser->ItemLink[$x], $item);
$item = str_replace("~~~ItemPubDate~~~", $rss_parser->ItemPubDate[$x], $item);
$item = str_replace("~~~ItemGuid~~~", $rss_parser->ItemGuid[$x], $item);
$item = str_replace("~~~ItemPubLongDate~~~", date($LongDateFormat, $rss_parser->ItemPubDate_t[$x]), $item);
$item = str_replace("~~~ItemPubShortDate~~~", date($ShortDateFormat, $rss_parser->ItemPubDate_t[$x]), $item);
$item = str_replace("~~~ItemPubLongTime~~~", date($LongTimeFormat, $rss_parser->ItemPubDate_t[$x]), $item);
$item = str_replace("~~~ItemPubShortTime~~~", date($ShortTimeFormat, $rss_parser->ItemPubDate_t[$x]), $item);
$item = str_replace("~~~ItemEnclosureUrl~~~", $rss_parser->ItemEnclosureURL[$x], $item);
$item = str_replace("~~~ItemAuthor~~~", $rss_parser->ItemAuthor[$x], $item);
$allitems .= "".$item;
}
}
} else {
for ($x = 0; $x < $loop_limit; $x++) {
$item = str_replace("~~~ItemTitle~~~", $rss_parser->ItemTitle[$x], $block1);
$item = str_replace("~~~ItemDescription~~~", $rss_parser->ItemDescription[$x], $item);
$item = str_replace("~~~ItemContentEncoded~~~", $rss_parser->ItemContentEncoded[$x], $item);
$item = str_replace("~~~ItemLink~~~", $rss_parser->ItemLink[$x], $item);
$item = str_replace("~~~ItemPubDate~~~", $rss_parser->ItemPubDate[$x], $item);
$item = str_replace("~~~ItemGuid~~~", $rss_parser->ItemGuid[$x], $item);
$item = str_replace("~~~ItemPubLongDate~~~", date($LongDateFormat, $rss_parser->ItemPubDate_t[$x]), $item);
$item = str_replace("~~~ItemPubShortDate~~~", date($ShortDateFormat, $rss_parser->ItemPubDate_t[$x]), $item);
$item = str_replace("~~~ItemPubLongTime~~~", date($LongTimeFormat, $rss_parser->ItemPubDate_t[$x]), $item);
$item = str_replace("~~~ItemPubShortTime~~~", date($ShortTimeFormat, $rss_parser->ItemPubDate_t[$x]), $item);
$item = str_replace("~~~ItemEnclosureUrl~~~", $rss_parser->ItemEnclosureURL[$x], $item);
$item = str_replace("~~~ItemAuthor~~~", $rss_parser->ItemAuthor[$x], $item);
$allitems .= "".$item;
$x++;
if ($x < $loop_limit) {
//
// This is at least one more item so use the Alternate definition
//
$item = str_replace("~~~ItemTitle~~~", $rss_parser->ItemTitle[$x], $block2);
$item = str_replace("~~~ItemDescription~~~", $rss_parser->ItemDescription[$x], $item);
$item = str_replace("~~~ItemContentEncoded~~~", $rss_parser->ItemContentEncoded[$x], $item);
$item = str_replace("~~~ItemLink~~~", $rss_parser->ItemLink[$x], $item);
$item = str_replace("~~~ItemPubDate~~~", $rss_parser->ItemPubDate[$x], $item);
$item = str_replace("~~~ItemGuid~~~", $rss_parser->ItemGuid[$x], $item);
$item = str_replace("~~~ItemPubLongDate~~~", date($LongDateFormat, $rss_parser->ItemPubDate_t[$x]), $item);
$item = str_replace("~~~ItemPubShortDate~~~", date($ShortDateFormat, $rss_parser->ItemPubDate_t[$x]), $item);
$item = str_replace("~~~ItemPubLongTime~~~", date($LongTimeFormat, $rss_parser->ItemPubDate_t[$x]), $item);
$item = str_replace("~~~ItemPubShortTime~~~", date($ShortTimeFormat, $rss_parser->ItemPubDate_t[$x]), $item);
$item = str_replace("~~~ItemEnclosureUrl~~~", $rss_parser->ItemEnclosureURL[$x], $item);
$item = str_replace("~~~ItemAuthor~~~", $rss_parser->ItemAuthor[$x], $item);
$allitems .= "".$item;
}
}
}
$template = str_replace("~~~BeginItemsRecord~~~".$WholeBlock."~~~EndItemsRecord~~~", $allitems, $template);
}
}
}
// Since ' is not HTML, but is XML convert.
$template = str_replace("'", "'", $template);
echo "";
echo $template;
} else {
if (function_exists("FeedForAll_rss2html_encodeURL") === FALSE) {
Function FeedForAll_rss2html_encodeURL($URLstring) {
$result = "";
for ($x = 0; $x < strlen($URLstring); $x++) {
if ($URLstring[$x] == '%') {
$result = $result."%2525";
}
elseif ($URLstring[$x] == '?') {
$result = $result."%3f";
}
elseif ($URLstring[$x] == '&') {
$result = $result."%26";
}
elseif ($URLstring[$x] == '=') {
$result = $result."%3d";
}
elseif ($URLstring[$x] == '+') {
$result = $result."%2b";
}
elseif ($URLstring[$x] == ' ') {
$result = $result."%20";
}else {
$result = $result.$URLstring[$x];
}
}
return $result;
}
}
echo "rss2html.php URL tool\n";
//
// We are in "buildURL" mode to help create properly encoded URLs to pass to rss2html.php
$_xml = "";
if (isset($_POST["XML"])) {
$_xml = $_POST["XML"];
}
$_template = "";
if (isset($_POST["TEMPLATE"])) {
$_template = $_POST["TEMPLATE"];
}
$_maxitems = "";
if (isset($_POST["MAXITEMS"])) {
$_maxitems = $_POST["MAXITEMS"];
}
$_nofutureitems = "";
if (isset($_POST["NOFUTUREITEMS"])) {
$_nofutureitems = $_POST["NOFUTUREITEMS"];
}
// Display the entry form
echo "RSS2HTML.PHP LINK TOOL
\n";
echo "To assist with the with the creation of properly encoded URLs for use with rss2html.php this tool has been created. Fill in the URLs or file paths for both the XML file and your template file in the boxes below and then click "Submit". The program will then return the URLs properly encoded in a string that calls rss2html.php. You can click on this link to test the results. The program will also indicate if it was unable to open either of the URLs it was given.
\n";
echo "\n";
$xmlContents = "";
$templateContents = "";
if (isset($_POST["submit"])) {
if ($_SERVER["REQUEST_METHOD"] != "POST") {
exit;
}
echo "
\n";
$answer = "";
$ssi = "";
$xmlurl = "";
$templateurl = "";
if ((isset($_POST["XML"]) && $_POST["XML"] != "") || (isset($_POST["TEMPLATE"]) && $_POST["TEMPLATE"] != "")) {
$answer .= "http://$_SERVER[SERVER_NAME]$_SERVER[PHP_SELF]?";
}
if (isset($_POST["XML"]) && $_POST["XML"] != "") {
$answer .= "XMLFILE=".FeedForAll_rss2html_encodeURL($_POST["XML"]);
$ssi .= "XMLFILE=".FeedForAll_rss2html_encodeURL($_POST["XML"]);
$xmlurl = FeedForAll_rss2html_encodeURL($_POST["XML"]);
}
if ((isset($_POST["XML"]) && $_POST["XML"] != "") && (isset($_POST["TEMPLATE"]) && $_POST["TEMPLATE"] != "")) {
$answer .= "&";
$ssi .= "&";
}
if (isset($_POST["TEMPLATE"]) && $_POST["TEMPLATE"] != "") {
$answer .= "TEMPLATE=".FeedForAll_rss2html_encodeURL($_POST["TEMPLATE"]);
$ssi .= "TEMPLATE=".FeedForAll_rss2html_encodeURL($_POST["TEMPLATE"]);
$templateurl = FeedForAll_rss2html_encodeURL($_POST["TEMPLATE"]);
}
if (isset($_POST["MAXITEMS"]) && $_POST["MAXITEMS"] != "" && intval($_POST["MAXITEMS"] != 0)) {
$answer .= "&MAXITEMS=$_POST[MAXITEMS]";
$ssi .= "&MAXITEMS=$_POST[MAXITEMS]";
}
if (isset($_POST["NOFUTUREITEMS"]) && $_POST["NOFUTUREITEMS"] == "on") {
$answer .= "&NOFUTUREITEMS=1";
$ssi .= "&NOFUTUREITEMS=1";
}
echo "Results
\n";
if (isset($_POST["XML"]) && $_POST["XML"] != "") {
if (($xmlContents = FeedForAll_rss2html_readFile($_POST["XML"], $useFopenURL)) === FALSE) {
if ($GLOBALS["ERRORSTRING"] == "") {
echo "The XML file $_POST[XML] could not be opened.
\n";
} else {
echo "The XML file $_POST[XML] could not be opened with the error $GLOBALS[ERRORSTRING].
\n";
}
} else {
echo "The XML file $_POST[XML] was SUCCESSFULLY opened
\n";
}
}
if (isset($_POST["TEMPLATE"]) && $_POST["TEMPLATE"] != "") {
if (($templateContents = FeedForAll_rss2html_readFile($_POST["TEMPLATE"], $useFopenURL)) === FALSE) {
if ($GLOBALS["ERRORSTRING"] == "") {
echo "The template file $_POST[TEMPLATE] could not be opened.
\n";
} else {
echo "The template file $_POST[TEMPLATE] could not be opened with the error $GLOBALS[ERRORSTRING].
\n";
}
} else {
echo "The template file $_POST[TEMPLATE] was SUCCESSFULLY opened
\n";
}
}
if ($xmlurl != "") {
echo "URL for the XML file properly encoded:
$xmlurl
\n";
}
if ($templateurl != "") {
echo "URL for the template file properly encoded:
$templateurl
\n";
}
echo "Example Usage
\n";
echo "Click on link to view results: $answer
\n";
echo "Server Side Include:
<!-- #INCLUDE VIRTUAL="".basename($_SERVER["PHP_SELF"])."?$ssi" -->
\n";
echo "PHP Include:
<?php\ninclude("$answer");\n?>\n";
}
if ($xmlContents != "" || $templateContents != "") {
echo "
\n";
if ($xmlContents != "") {
echo "XML file
\n";
$xmlContents = str_replace("&", "&", $xmlContents);
$xmlContents = str_replace("<", "<", $xmlContents);
$xmlContents = str_replace(">", ">", $xmlContents);
echo "$xmlContents
\n";
}
if ($templateContents != "") {
echo "Template file
\n";
$templateContents = str_replace("&", "&", $templateContents);
$templateContents = str_replace("<", "<", $templateContents);
$templateContents = str_replace(">", ">", $templateContents);
echo "$templateContents
\n";
}
}
}
?>