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) 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 } 00040 function SetImage($Url, $Title, $Link, 00041 $Height = NULL, $Width = NULL, $Description = NULL) 00042 { 00043 $this->Channels[$this->ChannelCount]["ImageUrl"] = $Url; 00044 $this->Channels[$this->ChannelCount]["ImageTitle"] = $Title; 00045 $this->Channels[$this->ChannelCount]["ImageLink"] = $Link; 00046 $this->Channels[$this->ChannelCount]["ImageHeight"] = $Height; 00047 $this->Channels[$this->ChannelCount]["ImageWidth"] = $Width; 00048 $this->Channels[$this->ChannelCount]["ImageDescription"] = $Description; 00049 } 00050 00051 # optional channel values 00052 function SetEncoding($Value) { $this->Encoding = $Value; } 00053 function SetLanguage($Value) { $this->Channels[$this->ChannelCount]["Language"] = $Value; } 00054 function SetCopyright($Value) { $this->Channels[$this->ChannelCount]["Copyright"] = $Value; } 00055 function SetManagingEditor($Value) { $this->Channels[$this->ChannelCount]["ManagingEditor"] = $Value; } 00056 function SetWebmaster($Value) { $this->Channels[$this->ChannelCount]["Webmaster"] = $Value; } 00057 function SetPicsRating($Value) { $this->Channels[$this->ChannelCount]["PicsRating"] = $Value; } 00058 function SetPublicationDate($Value) { $this->Channels[$this->ChannelCount]["PublicationDate"] = $this->FormatDate($Value); } 00059 function SetLastChangeDate($Value) { $this->Channels[$this->ChannelCount]["LastChangeDate"] = $this->FormatDate($Value); } 00060 function SetTextInput($Title, $Description, $Name) 00061 { 00062 $this->Channels[$this->ChannelCount]["TextInputTitle"] = $Title; 00063 $this->Channels[$this->ChannelCount]["TextInputDescription"] = $Description; 00064 $this->Channels[$this->ChannelCount]["TextInputName"] = $Name; 00065 } 00066 function SetSkipTimes($Days, $Hours) 00067 { 00068 # ??? 00069 } 00070 function SetCloud($Domain, $Port, $Path, $Procedure, $Protocol) 00071 { 00072 # ??? 00073 } 00074 00075 # add item to channel 00076 function AddItem($Title = NULL, $Link = NULL, $Description = NULL, $Date = NULL) 00077 { 00078 $this->ItemCounts[$this->ChannelCount]++; 00079 $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["Title"] = $Title; 00080 $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["Link"] = $Link; 00081 $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["Description"] = $Description; 00082 $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["Date"] = $this->FormatDate($Date); 00083 } 00084 function AddItemCategory($Category, $Url) 00085 { 00086 $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["Category"] = $Category; 00087 $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["CategoryUrl"] = $Url; 00088 } 00089 function AddItemEnclosure($Url, $Length, $Type) 00090 { 00091 $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["EnclosureUrl"] = $Url; 00092 $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["EnclosureLength"] = $Length; 00093 $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["EnclosureType"] = $Type; 00094 } 00095 function AddItemSource($Source, $Url) 00096 { 00097 $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["Source"] = $Source; 00098 $this->Items[$this->ChannelCount][$this->ItemCounts[$this->ChannelCount]]["SourceUrl"] = $Url; 00099 } 00100 00101 # write out and RSS page 00102 function PrintRSS() 00103 { 00104 # print opening elements 00105 header("Content-type: text/xml; charset=".$this->Encoding, TRUE); 00106 FTOut("<?xml version='1.0' encoding='".$this->Encoding."' ?>"); 00107 FTOut("<rss version='0.92' encoding='".$this->Encoding."'>", 0); 00108 00109 # for each channel 00110 for ($this->ChannelIndex = 0; $this->ChannelIndex <= $this->ChannelCount; $this->ChannelIndex++) 00111 { 00112 # open channel element 00113 FTOut("<channel>"); 00114 00115 # print required channel elements 00116 $this->PrintChannelElement("Title", "title"); 00117 $this->PrintChannelElement("Link", "link"); 00118 $this->PrintChannelElement("Description", "description"); 00119 00120 # print image element (url, title, link required) 00121 FTOut("<image>"); 00122 $this->PrintChannelElement("ImageUrl", "url"); 00123 $this->PrintChannelElement("ImageTitle", "title"); 00124 $this->PrintChannelElement("ImageLink", "link"); 00125 $this->PrintChannelElement("ImageWidth", "width"); 00126 $this->PrintChannelElement("ImageHeight", "height"); 00127 $this->PrintChannelElement("ImageDescription", "description"); 00128 FTOut("</image>"); 00129 00130 # print optional channel elements 00131 $this->PrintChannelElement("Language", "language"); 00132 $this->PrintChannelElement("Copyright", "copyright"); 00133 $this->PrintChannelElement("ManagingEditor", "managingEditor"); 00134 $this->PrintChannelElement("Webmaster", "webMaster"); 00135 $this->PrintChannelElement("PicsRating", "rating"); 00136 $this->PrintChannelElement("PublicationDate", "pubDate"); 00137 $this->PrintChannelElement("LastChangeDate", "lastBuildDate"); 00138 # ??? STILL TO DO: SkipDays, SkipHours, Cloud 00139 FTOut("<docs>http://backend.userland.com/rss092</docs>"); 00140 00141 # for each item in this channel 00142 for ($this->ItemIndex = 0; $this->ItemIndex <= $this->ItemCounts[$this->ChannelCount]; $this->ItemIndex++) 00143 { 00144 # open item element 00145 FTOut("<item>"); 00146 00147 # print item elements 00148 $this->PrintItemElement("Title", "title"); 00149 $this->PrintItemElement("Link", "link"); 00150 $this->PrintItemElement("Description", "description"); 00151 $this->PrintItemElement("Date", "pubDate"); 00152 if (isset($this->Items[$this->ChannelIndex][$this->ItemIndex]["Category"]) 00153 && ($this->Items[$this->ChannelIndex][$this->ItemIndex]["Category"] != NULL)) 00154 { 00155 FTOut("<category url='".$this->Items[$this->ChannelIndex][$this->ItemIndex]["CategoryUrl"]."'>"); 00156 FTOut($this->Items[$this->ChannelIndex][$this->ItemIndex]["Category"]); 00157 FTOut("</category>"); 00158 } 00159 if (isset($this->Items[$this->ChannelIndex][$this->ItemIndex]["EnclosureUrl"]) 00160 && ($this->Items[$this->ChannelIndex][$this->ItemIndex]["EnclosureUrl"] != NULL)) 00161 { 00162 FTOut("<enclosure " 00163 ."url='".$this->Items[$this->ChannelIndex][$this->ItemIndex]["EnclosureUrl"]."' " 00164 ."length='".$this->Items[$this->ChannelIndex][$this->ItemIndex]["EnclosureLength"]."' " 00165 ."type='".$this->Items[$this->ChannelIndex][$this->ItemIndex]["EnclosureType"]."' />"); 00166 } 00167 if (isset($this->Items[$this->ChannelIndex][$this->ItemIndex]["Source"]) 00168 && ($this->Items[$this->ChannelIndex][$this->ItemIndex]["Source"] != NULL)) 00169 { 00170 FTOut("<source url='".$this->Items[$this->ChannelIndex][$this->ItemIndex]["SourceUrl"]."'>"); 00171 FTOut($this->Items[$this->ChannelIndex][$this->ItemIndex]["Source"]); 00172 FTOut("</source>"); 00173 } 00174 00175 # close item element 00176 FTOut("</item>"); 00177 } 00178 00179 # close channel element 00180 FTOut("</channel>"); 00181 } 00182 00183 # print closing elements 00184 FTOut("</rss>"); 00185 } 00186 00187 00188 # ---- PRIVATE INTERFACE ------------------------------------------------- 00189 00190 var $Encoding; 00191 var $Channels; 00192 var $Items; 00193 var $ChannelCount; 00194 var $ItemCounts; 00195 var $ChannelIndex; 00196 var $ItemIndex; 00197 00198 function PrintChannelElement($VarName, $TagName) 00199 { 00200 if (isset($this->Channels[$this->ChannelIndex][$VarName]) 00201 && ($this->Channels[$this->ChannelIndex][$VarName] != NULL) 00202 && (strlen($this->Channels[$this->ChannelIndex][$VarName]))) 00203 { 00204 FTOut("<${TagName}>" 00205 .htmlspecialchars(preg_replace("/[\\x00-\\x1F]+/", "", $this->Channels[$this->ChannelIndex][$VarName])) 00206 ."</${TagName}>"); 00207 } 00208 } 00209 function PrintItemElement($VarName, $TagName) 00210 { 00211 if (isset($this->Items[$this->ChannelIndex][$this->ItemIndex][$VarName]) 00212 && ($this->Items[$this->ChannelIndex][$this->ItemIndex][$VarName] != NULL)) 00213 { 00214 FTOut("<${TagName}>" 00215 .htmlspecialchars(preg_replace("/[\\x00-\\x1F]+/", "", $this->Items[$this->ChannelIndex][$this->ItemIndex][$VarName])) 00216 ."</${TagName}>"); 00217 } 00218 } 00219 00220 function FormatDate($DateValue) 00221 { 00222 # convert date to timestamp 00223 $TimeStamp = strtotime($DateValue); 00224 00225 # convert timestamp to properly-formatted date 00226 $DateString = date("r", $TimeStamp); 00227 00228 # return properly-formatted date to caller 00229 return $DateString; 00230 } 00231 } 00232 00233 # (FTOut == Formatted Tag Output) 00234 function FTOut($String, $NewIndent = NULL) 00235 { 00236 static $Indent = 0; 00237 00238 $IndentSize = 4; 00239 00240 # decrease indent if string contains end tag and does not start with begin tag 00241 if (preg_match("/<\/[A-Za-z0-9]+>/", $String) && !preg_match("/^<[^\/]+/", $String)) { $Indent--; } 00242 00243 # reset indent if value is supplied 00244 if ($NewIndent != NULL) { $Indent = $NewIndent; } 00245 00246 # print string 00247 print(substr(" ", 00248 0, ($Indent * $IndentSize)).$String."\n"); 00249 00250 # inrease indent if string starts with begin tag and does not contain end tag 00251 if (preg_match("/^<[^\/]+/", $String) 00252 && !preg_match("/<\/[A-Za-z0-9]+>/", $String) 00253 && !preg_match("/\/>$/", $String)) 00254 { 00255 $Indent++; 00256 } 00257 } 00258 00259 00260 ?>