📄 feedcreator.php
字号:
case "PODCAST": $this->_feed = new RSSCreatorPodcast(); break; case "2.0": // fall through case "RSS2.0": $this->_feed = new RSSCreator20(); break; case "1.0": // fall through case "RSS1.0": $this->_feed = new RSSCreator10(); break; case "0.91": // fall through case "RSS0.91": $this->_feed = new RSSCreator091(); break; case "PIE0.1": $this->_feed = new PIECreator01(); break; case "MBOX": $this->_feed = new MBOXCreator(); break; case "OPML": $this->_feed = new OPMLCreator(); break; case "ATOM": // fall through: always the latest ATOM version case "ATOM1.0": $this->_feed = new AtomCreator10(); break; case "ATOM0.3": $this->_feed = new AtomCreator03(); break; case "HTML": $this->_feed = new HTMLCreator(); break; case "JS": // fall through case "JAVASCRIPT": $this->_feed = new JSCreator(); break; default: $this->_feed = new RSSCreator091(); break; } $vars = get_object_vars($this); foreach ($vars as $key => $value) { // prevent overwriting of properties "contentType", "encoding"; do not copy "_feed" itself if (!in_array($key, array("_feed", "contentType", "encoding"))) { $this->_feed->{$key} = $this->{$key}; } } } /** * Creates a syndication feed based on the items previously added. * * @see FeedCreator::addItem() * @param string format format the feed should comply to. Valid values are: * "PIE0.1", "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3", "HTML", "JS" * @return string the contents of the feed. */ function createFeed($format = "RSS0.91") { $this->_setFormat($format); return $this->_feed->createFeed(); } /** * Saves this feed as a file on the local disk. After the file is saved, an HTTP redirect * header may be sent to redirect the use to the newly created file. * @since 1.4 * * @param string format format the feed should comply to. Valid values are: * "PIE0.1" (deprecated), "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM", "ATOM0.3", "HTML", "JS" * @param string filename optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). * @param boolean displayContents optional send the content of the file or not. If true, the file will be sent in the body of the response. */ function saveFeed($format="RSS0.91", $filename="", $displayContents=true) { $this->_setFormat($format); $this->_feed->saveFeed($filename, $displayContents); } /** * Turns on caching and checks if there is a recent version of this feed in the cache. * If there is, an HTTP redirect header is sent. * To effectively use caching, you should create the FeedCreator object and call this method * before anything else, especially before you do the time consuming task to build the feed * (web fetching, for example). * * @param string format format the feed should comply to. Valid values are: * "PIE0.1" (deprecated), "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3". * @param filename string optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). * @param timeout int optional the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour) */ function useCached($format="RSS0.91", $filename="", $timeout=3600) { $this->_setFormat($format); $this->_feed->useCached($filename, $timeout); } /** * Outputs feed to the browser - needed for on-the-fly feed generation (like it is done in WordPress, etc.) * * @param format string format the feed should comply to. Valid values are: * "PIE0.1" (deprecated), "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3". */ function outputFeed($format='RSS0.91') { $this->_setFormat($format); $this->_setMIME($format); $this->_feed->outputFeed(); }}/** * FeedCreator is the abstract base implementation for concrete * implementations that implement a specific format of syndication. * * @abstract * @author Kai Blankenhorn <kaib@bitfolge.de> * @since 1.4 */class FeedCreator extends HtmlDescribable { /** * Mandatory attributes of a feed. */ var $title, $description, $link; /** * Optional attributes of a feed. */ var $syndicationURL, $image, $language, $copyright, $pubDate, $lastBuildDate, $editor, $editorEmail, $webmaster, $category, $docs, $ttl, $rating, $skipHours, $skipDays, $podcast; /** * The url of the external xsl stylesheet used to format the naked rss feed. * Ignored in the output when empty. */ var $xslStyleSheet = ""; /** * @access private */ var $items = Array(); /** * This feed's MIME content type. * @since 1.4 * @access private */ var $contentType = "application/xml"; /** * This feed's character encoding. * @since 1.6.1 **/ var $encoding = "UTF-8"; /** * Any additional elements to include as an assiciated array. All $key => $value pairs * will be included unencoded in the feed in the form * <$key>$value</$key> * Again: No encoding will be used! This means you can invalidate or enhance the feed * if $value contains markup. This may be abused to embed tags not implemented by * the FeedCreator class used. */ var $additionalElements = Array(); /** * Any additional markup to include as a string. This can be used in places where * $additionalElements isn't sufficient (for example, if you need to add elements with * attributes, eg: <element attribute="value" />). * @since 1.7.3 */ var $additionalMarkup = ""; /** * Determines whether or not error messages are displayed by this class. * @since 1.7.3 **/ var $verbose = true; /** * Specifies the generator of the feed. * @since 1.7.3 **/ var $generator = FEEDCREATOR_VERSION; /** * Adds an FeedItem to the feed. * * @param object FeedItem $item The FeedItem to add to the feed. * @access public */ function addItem($item) { $this->items[] = $item; } /** * Truncates a string to a certain length at the most sensible point. * First, if there's a '.' character near the end of the string, the string is truncated after this character. * If there is no '.', the string is truncated after the last ' ' character. * If the string is truncated, " ..." is appended. * If the string is already shorter than $length, it is returned unchanged. * * @static * @param string string A string to be truncated. * @param int length the maximum length the string should be truncated to * @return string the truncated string */ function iTrunc($string, $length) { if (strlen($string)<=$length) { return $string; } $pos = strrpos($string,"."); if ($pos>=$length-4) { $string = substr($string,0,$length-4); $pos = strrpos($string,"."); } if ($pos>=$length*0.4) { return substr($string,0,$pos+1)." ..."; } $pos = strrpos($string," "); if ($pos>=$length-4) { $string = substr($string,0,$length-4); $pos = strrpos($string," "); } if ($pos>=$length*0.4) { return substr($string,0,$pos)." ..."; } return substr($string,0,$length-4)." ..."; } /** * Creates a comment indicating the generator of this feed. * The format of this comment seems to be recognized by * Syndic8.com. */ function _createGeneratorComment() { return "<!-- generator=\"".$this->generator."\" -->\n"; } /** * Creates a string containing all additional elements specified in * $additionalElements. * @param elements array an associative array containing key => value pairs * @param indentString string a string that will be inserted before every generated line * @return string the XML tags corresponding to $additionalElements */ function _createAdditionalElements($elements, $indentString="") { $ae = ""; if (is_array($elements)) { foreach($elements AS $key => $value) { $ae.= $indentString."<$key>$value</$key>\n"; } } return $ae; } function _createStylesheetReferences() { $xml = ""; if ($this->cssStyleSheet) $xml .= "<?xml-stylesheet href=\"".$this->cssStyleSheet."\" type=\"text/css\"?>\n"; if ($this->xslStyleSheet) $xml .= "<?xml-stylesheet href=\"".$this->xslStyleSheet."\" type=\"text/xsl\"?>\n"; return $xml; } /** * Builds the feed's text. * @abstract * @return string the feed's complete text */ function createFeed() { } /** * Generate a filename for the feed cache file. The result will be $_SERVER["PHP_SELF"] with the extension changed to .xml. * For example: * * echo $_SERVER["PHP_SELF"]."\n"; * echo FeedCreator::_generateFilename(); * * would produce: * * /rss/latestnews.php * latestnews.xml * * @return string the feed cache filename * @since 1.4 * @access private */ function _generateFilename() { $fileInfo = pathinfo($_SERVER["PHP_SELF"]); return substr($fileInfo["basename"],0,-(strlen($fileInfo["extension"])+1)).".xml"; } /** * @since 1.4 * @access private */ function _redirect($filename) { // attention, heavily-commented-out-area // maybe use this in addition to file time checking //Header("Expires: ".date("r",time()+$this->_timeout)); /* no caching at all, doesn't seem to work as good: Header("Cache-Control: no-cache"); Header("Pragma: no-cache"); */ // HTTP redirect, some feed readers' simple HTTP implementations don't follow it //Header("Location: ".$filename); Header("Content-Type: ".$this->contentType."; charset=".$this->encoding."; filename=".basename($filename)); Header("Content-Disposition: inline; filename=".basename($filename)); readfile($filename, "r"); die(); } /** * Turns on caching and checks if there is a recent version of this feed in the cache. * If there is, an HTTP redirect header is sent. * To effectively use caching, you should create the FeedCreator object and call this method * before anything else, especially before you do the time consuming task to build the feed * (web fetching, for example). * @since 1.4 * @param filename string optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). * @param timeout int optional the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour) */ function useCached($filename="", $timeout=3600) { $this->_timeout = $timeout; if ($filename=="") { $filename = $this->_generateFilename(); } if (file_exists($filename) AND (time()-filemtime($filename) < $timeout)) { $this->_redirect($filename); } } /** * Saves this feed as a file on the local disk. After the file is saved, a redirect * header may be sent to redirect the user to the newly created file. * @since 1.4 * * @param filename string optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). * @param redirect boolean optional send an HTTP redirect header or not. If true, the user will be automatically redirected to the created file. */ function saveFeed($filename="", $displayContents=true) { if ($filename=="") { $filename = $this->_generateFilename(); } $feedFile = fopen($filename, "w+"); if ($feedFile) { fputs($feedFile,$this->createFeed()); fclose($feedFile); if ($displayContents) { $this->_redirect($filename); } return true; } else { echo "<br /><b>Error creating feed file, please check write permissions.</b><br />"; } } /** * Outputs this feed directly to the browser - for on-the-fly feed generation * @since 1.7.2-mod * * still missing: proper header output - currently you have to add it manually */ function outputFeed() { echo $this->createFeed(); }}/** * FeedDate is an internal class that stores a date for a feed or feed item. * Usually, you won't need to use this. */class FeedDate { var $unix; /** * Creates a new instance of FeedDate representing a given date. * Accepts RFC 822, ISO 8601 date formats as well as unix time stamps. * @param mixed $dateString optional the date this FeedDate will represent. If not specified, the current date and time is used. */ function FeedDate($dateString="") { if ($dateString=="") $dateString = date("r"); if (is_numeric($dateString)) { $this->unix = $dateString; return; } if (preg_match("~(?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s+)?(\\d{1,2})\\s+([a-zA-Z]{3})\\s+(\\d{4})\\s+(\\d{2}):(\\d{2}):(\\d{2})\\s+(.*)~",$dateString,$matches)) { $months = Array("Jan"=>1,"Feb"=>2,"Mar"=>3,"Apr"=>4,"May"=>5,"Jun"=>6,"Jul"=>7,"Aug"=>8,"Sep"=>9,"Oct"=>10,"Nov"=>11,"Dec"=>12); $this->unix = mktime($matches[4],$matches[5],$matches[6],$months[$matches[2]],$matches[1],$matches[3]); if (substr($matches[7],0,1)=='+' OR substr($matches[7],0,1)=='-') { $tzOffset = (substr($matches[7],0,3) * 60 + substr($matches[7],-2)) * 60; } else { if (strlen($matches[7])==1) { $oneHour = 3600; $ord = ord($matches[7]); if ($ord < ord("M")) { $tzOffset = (ord("A") - $ord - 1) * $oneHour; } elseif ($ord >= ord("M") AND $matches[7]!="Z") { $tzOffset = ($ord - ord("M")) * $oneHour; } elseif ($matches[7]=="Z") { $tzOffset = 0; } } switch ($matches[7]) { case "UT": case "GMT": $tzOffset = 0; } } $this->unix += $tzOffset; return; } if (preg_match("~(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(.*)~",$dateString,$matches)) { $this->unix = mktime($matches[4],$matches[5],$matches[6],$matches[2],$matches[3],$matches[1]); if (substr($matches[7],0,1)=='+' OR substr($matches[7],0,1)=='-') { $tzOffset = (substr($matches[7],0,3) * 60 + substr($matches[7],-2)) * 60; } else { if ($matches[7]=="Z") { $tzOffset = 0; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -