Search:

CWIS Developers Documentation

  • Main Page
  • Classes
  • Files
  • File List
  • File Members

Axis--RSS.php

Go to the documentation of this file.
00001 <?PHP
00002 
00003 #
00004 #   Axis--RSS.php
00005 #   An Object to Support RSS 0.92 (Rich Site Summary) Output
00006 #
00007 #   Copyright 2002 Axis Data
00008 #   This code is free software that can be used or redistributed under the
00009 #   terms of Version 2 of the GNU General Public License, as published by the
00010 #   Free Software Foundation (http://www.fsf.org).
00011 #
00012 #   Author:  Edward Almasy (almasy@axisdata.com)
00013 #
00014 #   Part of the AxisPHP library v1.2.5
00015 #   For more information see http://www.axisdata.com/AxisPHP/
00016 #
00017 
00018 
00019 class RSS {
00020 
00021     # ---- PUBLIC INTERFACE --------------------------------------------------
00022 
00023     function RSS()
00024     {
00025         $this->ChannelCount = -1;
00026 
00027         # default encoding is UTF-8
00028         $this->Encoding = "UTF-8";
00029     }
00030 
00031     # required channel values
00032     function AddChannel($Title, $Link, $Description, $RssLink)
00033     {
00034         $this->ChannelCount++;
00035         $this->ItemCounts[$this->ChannelCount] = -1;
00036         $this->Channels[$this->ChannelCount]["Title"] = $Title;
00037         $this->Channels[$this->ChannelCount]["Link"] = $Link;
00038         $this->Channels[$this->ChannelCount]["Description"] = $Description;
00039         $this->Channels[$this->ChannelCount]["RssLink"] = $RssLink;
00040     }
00041     function SetImage($Url, $Height = NULL, $Width = NULL, $Description = NULL)
00042     {
00043         $this->Channels[$this->ChannelCount]["ImageUrl"] = $Url;
00044         $this->Channels[$this->ChannelCount]["ImageHeight"] = $Height;
00045         $this->Channels[$this->ChannelCount]["ImageWidth"] = $Width;
00046         $this->Channels[$this->ChannelCount]["ImageDescription"] = $Description;
00047     }
00048 
00049     # optional channel values
00050     function SetEncoding($Value) { $this->Encoding = $Value; }
00051     function SetLanguage($Value) {  $this->Channels[$this->ChannelCount]["Language"] = $Value;  }
00052     function SetCopyright($Value) {  $this->Channels[$this->ChannelCount]["Copyright"] = $Value;  }
00053     function SetManagingEditor($Value) {  $this->Channels[$this->ChannelCount]["ManagingEditor"] = $Value;  }
00054     function SetWebmaster($Value) {  $this->Channels[$this->ChannelCount]["Webmaster"] = $Value;  }
00055     function SetPicsRating($Value) {  $this->Channels[$this->ChannelCount]["PicsRating"] = $Value;  }
00056     function SetPublicationDate($Value) {  $this->Channels[$this->ChannelCount]["PublicationDate"] = $this->FormatDate($Value);  }
00057     function SetLastChangeDate($Value) {  $this->Channels[$this->ChannelCount]["LastChangeDate"] = $this->FormatDate($Value);  }
00058     function SetTextInput($Title, $Description, $Name)
00059     {
00060         $this->Channels[$this->ChannelCount]["TextInputTitle"] = $Title;
00061         $this->Channels[$this->ChannelCount]["TextInputDescription"] = $Description;
00062         $this->Channels[$this->ChannelCount]["TextInputName"] = $Name;
00063     }
00064     function SetSkipTimes($Days, $Hours)
00065     {
00066         # ???
00067     }
00068     function SetCloud($Domain, $Port, $Path, $Procedure, $Protocol)
00069     {
00070         # ???
00071     }
00072 
00073     # add item to channel
00074     function AddItem($Title = NULL, $Link = NULL, $Description = NULL, $Date = NULL)
00075     {
00076         $this->ItemCounts[$this->ChannelCount]++;
00077         $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["Title"] = $Title;
00078         $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["Link"] = $Link;
00079         $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["Description"] = $Description;
00080         $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["Date"] = $this->FormatDate($Date);
00081     }
00082     function AddItemCategory($Category, $Url)
00083     {
00084         $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["Category"] = $Category;
00085         $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["CategoryUrl"] = $Url;
00086     }
00087     function AddItemEnclosure($Url, $Length, $Type)
00088     {
00089         $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["EnclosureUrl"] = $Url;
00090         $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["EnclosureLength"] = $Length;
00091         $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["EnclosureType"] = $Type;
00092     }
00093     function AddItemSource($Source, $Url)
00094     {
00095         $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["Source"] = $Source;
00096         $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["SourceUrl"] = $Url;
00097     }
00098 
00099     # write out and RSS page
00100     function PrintRSS()
00101     {
00102         # print opening elements
00103         header("Content-type: application/rss+xml; charset=".$this->Encoding, TRUE);
00104         FTOut("<?xml version='1.0' encoding='".$this->Encoding."' ?>");
00105         FTOut("<rss version='2.0' xmlns:atom='http://www.w3.org/2005/Atom'>", 0);
00106 
00107         # for each channel
00108         for ($this->ChannelIndex = 0;  $this->ChannelIndex <= $this->ChannelCount;  $this->ChannelIndex++)
00109         {
00110             # open channel element
00111             FTOut("<channel>");
00112 
00113             # print required channel elements
00114             $this->PrintChannelElement("Title", "title");
00115             $this->PrintChannelElement("Link", "link");
00116             $this->PrintChannelElement("Description", "description");
00117             FTOut(
00118                 "<atom:link href='"
00119                 .$this->Channels[$this->ChannelCount]["RssLink"]
00120                 ."' rel='self' type='application/rss+xml' />");
00121 
00122             # print image element if set (url, title, link required)
00123             # title and link should be the same as those for the channel
00124             if ($this->IsChannelElementSet("ImageUrl"))
00125             {
00126                 FTOut("<image>");
00127                 $this->PrintChannelElement("ImageUrl", "url");
00128                 $this->PrintChannelElement("Title", "title");
00129                 $this->PrintChannelElement("Link", "link");
00130                 $this->PrintChannelElement("ImageWidth", "width");
00131                 $this->PrintChannelElement("ImageHeight", "height");
00132                 $this->PrintChannelElement("ImageDescription", "description");
00133                 FTOut("</image>");
00134             }
00135 
00136             # print optional channel elements
00137             $this->PrintChannelElement("Language", "language");
00138             $this->PrintChannelElement("Copyright", "copyright");
00139             $this->PrintChannelElement("ManagingEditor", "managingEditor");
00140             $this->PrintChannelElement("Webmaster", "webMaster");
00141             $this->PrintChannelElement("PicsRating", "rating");
00142             $this->PrintChannelElement("PublicationDate", "pubDate");
00143             $this->PrintChannelElement("LastChangeDate", "lastBuildDate");
00144             # ???  STILL TO DO:  SkipDays, SkipHours, Cloud
00145             FTOut("<docs>http://www.rssboard.org/rss-2-0-1</docs>");
00146 
00147             # for each item in this channel
00148             for ($this->ItemIndex = 0;  $this->ItemIndex <= $this->ItemCounts[$this->ChannelCount];  $this->ItemIndex++)
00149             {
00150                 # open item element
00151                 FTOut("<item>");
00152 
00153                 # print item elements
00154                 $this->PrintItemElement("Title", "title");
00155                 $this->PrintItemElement("Link", "link");
00156                 $this->PrintItemElement("Link", "guid");
00157                 $this->PrintItemElement("Description", "description");
00158                 $this->PrintItemElement("Date", "pubDate");
00159                 if (isset($this->Items[$this->ChannelIndex][$this->ItemIndex]["Category"])
00160                         && ($this->Items[$this->ChannelIndex][$this->ItemIndex]["Category"] != NULL))
00161                 {
00162                     FTOut("<category url='".$this->Items[$this->ChannelIndex][$this->ItemIndex]["CategoryUrl"]."'>");
00163                     FTOut($this->Items[$this->ChannelIndex][$this->ItemIndex]["Category"]);
00164                     FTOut("</category>");
00165                 }
00166                 if (isset($this->Items[$this->ChannelIndex][$this->ItemIndex]["EnclosureUrl"])
00167                         && ($this->Items[$this->ChannelIndex][$this->ItemIndex]["EnclosureUrl"] != NULL))
00168                 {
00169                     FTOut("<enclosure "
00170                         ."url='".$this->Items[$this->ChannelIndex][$this->ItemIndex]["EnclosureUrl"]."' "
00171                         ."length='".$this->Items[$this->ChannelIndex][$this->ItemIndex]["EnclosureLength"]."' "
00172                         ."type='".$this->Items[$this->ChannelIndex][$this->ItemIndex]["EnclosureType"]."' />");
00173                 }
00174                 if (isset($this->Items[$this->ChannelIndex][$this->ItemIndex]["Source"])
00175                         && ($this->Items[$this->ChannelIndex][$this->ItemIndex]["Source"] != NULL))
00176                 {
00177                     FTOut("<source url='".$this->Items[$this->ChannelIndex][$this->ItemIndex]["SourceUrl"]."'>");
00178                     FTOut($this->Items[$this->ChannelIndex][$this->ItemIndex]["Source"]);
00179                     FTOut("</source>");
00180                 }
00181 
00182                 # close item element
00183                 FTOut("</item>");
00184             }
00185 
00186             # close channel element
00187             FTOut("</channel>");
00188         }
00189 
00190         # print closing elements
00191         FTOut("</rss>");
00192     }
00193 
00194 
00195     # ---- PRIVATE INTERFACE -------------------------------------------------
00196 
00197     var $Encoding;
00198     var $Channels;
00199     var $Items;
00200     var $ChannelCount;
00201     var $ItemCounts;
00202     var $ChannelIndex;
00203     var $ItemIndex;
00204 
00210     private function IsChannelElementSet($VarName)
00211     {
00212         return (isset($this->Channels[$this->ChannelIndex][$VarName])
00213                 && $this->Channels[$this->ChannelIndex][$VarName] != NULL
00214                 && strlen($this->Channels[$this->ChannelIndex][$VarName]));
00215     }
00216 
00222     private function IsItemElementSet($VarName)
00223     {
00224         return (isset($this->Items[$this->ChannelIndex][$this->ItemIndex][$VarName])
00225                 && $this->Items[$this->ChannelIndex][$this->ItemIndex][$VarName] != NULL);
00226     }
00227 
00233     private function PrintChannelElement($VarName, $TagName)
00234     {
00235         # only print channel elements if set
00236         if (!$this->IsChannelElementSet($VarName))
00237         {
00238             return;
00239         }
00240 
00241         $InnerText = $this->EscapeInnerText(
00242             $this->Channels[$this->ChannelIndex][$VarName]);
00243 
00244         FTOut("<${TagName}>".$InnerText."</${TagName}>");
00245     }
00246 
00252     private function PrintItemElement($VarName, $TagName)
00253     {
00254         # only print elements that are set
00255         if (!$this->IsItemElementSet($VarName))
00256         {
00257             return;
00258         }
00259 
00260         $InnerText = $this->EscapeInnerText(
00261             $this->Items[$this->ChannelIndex][$this->ItemIndex][$VarName]);
00262 
00263         FTOut("<${TagName}>".$InnerText."</${TagName}>");
00264     }
00265 
00273     private function FormatDate($Value)
00274     {
00275         return date("D, j M Y h:i:s O", strtotime($Value));
00276     }
00277 
00284     private function EscapeInnerText($Text)
00285     {
00286         # remove control characters
00287         $Intermediate = preg_replace("/[\\x00-\\x1F]+/", "", $Text);
00288 
00289         # escape XML special characters for PHP version < 5.2.3
00290         if (version_compare(phpversion(), "5.2.3", "<"))
00291         {
00292             $Intermediate = htmlspecialchars(
00293                 $Intermediate, ENT_QUOTES, $this->Encoding);
00294         }
00295 
00296         # escape XML special characters for PHP version >= 5.2.3
00297         else
00298         {
00299             $Intermediate = htmlspecialchars(
00300                 $Intermediate, ENT_QUOTES, $this->Encoding, FALSE);
00301         }
00302 
00303         # map named entities to their hex references
00304         $Replacements = array(
00305             "&amp;" => "&#x26;",
00306             "&lt;" => "&#x3C;",
00307             "&gt;" => "&#x3E;",
00308             "&quot;" => "&#x22;",
00309             "&#039;" => "&#x27;");
00310 
00311         # replace named entities with hex references for compatibility as
00312         # specified by the RSS spec/best practices
00313         $Intermediate = str_replace(
00314             array_keys($Replacements),
00315             array_values($Replacements),
00316             $Intermediate);
00317 
00318         return $Intermediate;
00319     }
00320 
00321 }
00322 
00323 # (FTOut == Formatted Tag Output)
00324 function FTOut($String, $NewIndent = NULL)
00325 {
00326     static $Indent = 0;
00327 
00328     $IndentSize = 4;
00329 
00330     # decrease indent if string contains end tag and does not start with begin tag
00331     if (preg_match("/<\/[A-Za-z0-9]+>/", $String) && !preg_match("/^<[^\/]+/", $String)) {  $Indent--;  }
00332 
00333     # reset indent if value is supplied
00334     if ($NewIndent != NULL) {  $Indent = $NewIndent;  }
00335 
00336     # print string
00337     print(substr("                                                                                                                        ",
00338             0, ($Indent * $IndentSize)).$String."\n");
00339 
00340     # inrease indent if string starts with begin tag and does not contain end tag
00341     if (preg_match("/^<[^\/]+/", $String)
00342             && !preg_match("/<\/[A-Za-z0-9]+>/", $String)
00343             && !preg_match("/\/>$/", $String))
00344     {
00345         $Indent++;
00346     }
00347 }

CWIS logo doxygen
Copyright 2010 Internet Scout