File indexing completed on 2024-05-12 06:02:31

0001 <?php
0002 /**
0003  * Zend Framework
0004  *
0005  * LICENSE
0006  *
0007  * This source file is subject to the new BSD license that is bundled
0008  * with this package in the file LICENSE.txt.
0009  * It is also available through the world-wide-web at this URL:
0010  * http://framework.zend.com/license/new-bsd
0011  * If you did not receive a copy of the license and are unable to
0012  * obtain it through the world-wide-web, please send an email
0013  * to license@zend.com so we can send you a copy immediately.
0014  *
0015  * @category   Zend
0016  * @package    Zend_Feed_Writer
0017  * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
0018  * @license    http://framework.zend.com/license/new-bsd     New BSD License
0019  * @version    $Id$
0020  */
0021 
0022 /**
0023  * @category   Zend
0024  * @package    Zend_Feed_Writer
0025  * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
0026  * @license    http://framework.zend.com/license/new-bsd     New BSD License
0027  */
0028 class Zend_Feed_Writer
0029 {
0030     /**
0031      * Namespace constants
0032      */
0033     const NAMESPACE_ATOM_03  = 'http://purl.org/atom/ns#';
0034     const NAMESPACE_ATOM_10  = 'http://www.w3.org/2005/Atom';
0035     const NAMESPACE_RDF      = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
0036     const NAMESPACE_RSS_090  = 'http://my.netscape.com/rdf/simple/0.9/';
0037     const NAMESPACE_RSS_10   = 'http://purl.org/rss/1.0/';
0038 
0039     /**
0040      * Feed type constants
0041      */
0042     const TYPE_ANY              = 'any';
0043     const TYPE_ATOM_03          = 'atom-03';
0044     const TYPE_ATOM_10          = 'atom-10';
0045     const TYPE_ATOM_ANY         = 'atom';
0046     const TYPE_RSS_090          = 'rss-090';
0047     const TYPE_RSS_091          = 'rss-091';
0048     const TYPE_RSS_091_NETSCAPE = 'rss-091n';
0049     const TYPE_RSS_091_USERLAND = 'rss-091u';
0050     const TYPE_RSS_092          = 'rss-092';
0051     const TYPE_RSS_093          = 'rss-093';
0052     const TYPE_RSS_094          = 'rss-094';
0053     const TYPE_RSS_10           = 'rss-10';
0054     const TYPE_RSS_20           = 'rss-20';
0055     const TYPE_RSS_ANY          = 'rss';
0056 
0057     /**
0058      * PluginLoader instance used by component
0059      *
0060      * @var Zend_Loader_PluginLoader_Interface
0061      */
0062     protected static $_pluginLoader = null;
0063 
0064     /**
0065      * Path on which to search for Extension classes
0066      *
0067      * @var array
0068      */
0069     protected static $_prefixPaths = array();
0070 
0071     /**
0072      * Array of registered extensions by class postfix (after the base class
0073      * name) across four categories - data containers and renderers for entry
0074      * and feed levels.
0075      *
0076      * @var array
0077      */
0078     protected static $_extensions = array(
0079         'entry'         => array(),
0080         'feed'          => array(),
0081         'entryRenderer' => array(),
0082         'feedRenderer'  => array(),
0083     );
0084 
0085     /**
0086      * Set plugin loader for use with Extensions
0087      *
0088      * @param  Zend_Loader_PluginLoader_Interface
0089      */
0090     public static function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader)
0091     {
0092         self::$_pluginLoader = $loader;
0093     }
0094 
0095     /**
0096      * Get plugin loader for use with Extensions
0097      *
0098      * @return  Zend_Loader_PluginLoader_Interface
0099      */
0100     public static function getPluginLoader()
0101     {
0102         if (!isset(self::$_pluginLoader)) {
0103             // require_once 'Zend/Loader/PluginLoader.php';
0104             self::$_pluginLoader = new Zend_Loader_PluginLoader(array(
0105                 'Zend_Feed_Writer_Extension_' => 'Zend/Feed/Writer/Extension/',
0106             ));
0107         }
0108         return self::$_pluginLoader;
0109     }
0110 
0111     /**
0112      * Add prefix path for loading Extensions
0113      *
0114      * @param  string $prefix
0115      * @param  string $path
0116      * @return void
0117      */
0118     public static function addPrefixPath($prefix, $path)
0119     {
0120         $prefix = rtrim($prefix, '_');
0121         $path   = rtrim($path, DIRECTORY_SEPARATOR);
0122         self::getPluginLoader()->addPrefixPath($prefix, $path);
0123     }
0124 
0125     /**
0126      * Add multiple Extension prefix paths at once
0127      *
0128      * @param  array $spec
0129      * @return void
0130      */
0131     public static function addPrefixPaths(array $spec)
0132     {
0133         if (isset($spec['prefix']) && isset($spec['path'])) {
0134             self::addPrefixPath($spec['prefix'], $spec['path']);
0135         }
0136         foreach ($spec as $prefixPath) {
0137             if (isset($prefixPath['prefix']) && isset($prefixPath['path'])) {
0138                 self::addPrefixPath($prefixPath['prefix'], $prefixPath['path']);
0139             }
0140         }
0141     }
0142 
0143     /**
0144      * Register an Extension by name
0145      *
0146      * @param  string $name
0147      * @return void
0148      * @throws Zend_Feed_Exception if unable to resolve Extension class
0149      */
0150     public static function registerExtension($name)
0151     {
0152         $feedName  = $name . '_Feed';
0153         $entryName = $name . '_Entry';
0154         $feedRendererName  = $name . '_Renderer_Feed';
0155         $entryRendererName = $name . '_Renderer_Entry';
0156         if (self::isRegistered($name)) {
0157             if (self::getPluginLoader()->isLoaded($feedName)
0158                 || self::getPluginLoader()->isLoaded($entryName)
0159                 || self::getPluginLoader()->isLoaded($feedRendererName)
0160                 || self::getPluginLoader()->isLoaded($entryRendererName)
0161             ) {
0162                 return;
0163             }
0164         }
0165         try {
0166             self::getPluginLoader()->load($feedName);
0167             self::$_extensions['feed'][] = $feedName;
0168         } catch (Zend_Loader_PluginLoader_Exception $e) {
0169         }
0170         try {
0171             self::getPluginLoader()->load($entryName);
0172             self::$_extensions['entry'][] = $entryName;
0173         } catch (Zend_Loader_PluginLoader_Exception $e) {
0174         }
0175         try {
0176             self::getPluginLoader()->load($feedRendererName);
0177             self::$_extensions['feedRenderer'][] = $feedRendererName;
0178         } catch (Zend_Loader_PluginLoader_Exception $e) {
0179         }
0180         try {
0181             self::getPluginLoader()->load($entryRendererName);
0182             self::$_extensions['entryRenderer'][] = $entryRendererName;
0183         } catch (Zend_Loader_PluginLoader_Exception $e) {
0184         }
0185         if (!self::getPluginLoader()->isLoaded($feedName)
0186             && !self::getPluginLoader()->isLoaded($entryName)
0187             && !self::getPluginLoader()->isLoaded($feedRendererName)
0188             && !self::getPluginLoader()->isLoaded($entryRendererName)
0189         ) {
0190             // require_once 'Zend/Feed/Exception.php';
0191             throw new Zend_Feed_Exception('Could not load extension: ' . $name
0192                 . 'using Plugin Loader. Check prefix paths are configured and extension exists.');
0193         }
0194     }
0195 
0196     /**
0197      * Is a given named Extension registered?
0198      *
0199      * @param  string $extensionName
0200      * @return boolean
0201      */
0202     public static function isRegistered($extensionName)
0203     {
0204         $feedName  = $extensionName . '_Feed';
0205         $entryName = $extensionName . '_Entry';
0206         $feedRendererName  = $extensionName . '_Renderer_Feed';
0207         $entryRendererName = $extensionName . '_Renderer_Entry';
0208         if (in_array($feedName, self::$_extensions['feed'])
0209             || in_array($entryName, self::$_extensions['entry'])
0210             || in_array($feedRendererName, self::$_extensions['feedRenderer'])
0211             || in_array($entryRendererName, self::$_extensions['entryRenderer'])
0212         ) {
0213             return true;
0214         }
0215         return false;
0216     }
0217 
0218     /**
0219      * Get a list of extensions
0220      *
0221      * @return array
0222      */
0223     public static function getExtensions()
0224     {
0225         return self::$_extensions;
0226     }
0227 
0228     /**
0229      * Reset class state to defaults
0230      *
0231      * @return void
0232      */
0233     public static function reset()
0234     {
0235         self::$_pluginLoader = null;
0236         self::$_prefixPaths  = array();
0237         self::$_extensions   = array(
0238             'entry'         => array(),
0239             'feed'          => array(),
0240             'entryRenderer' => array(),
0241             'feedRenderer'  => array(),
0242         );
0243     }
0244 
0245     /**
0246      * Register core (default) extensions
0247      *
0248      * @return void
0249      */
0250     public static function registerCoreExtensions()
0251     {
0252         self::registerExtension('DublinCore');
0253         self::registerExtension('Content');
0254         self::registerExtension('Atom');
0255         self::registerExtension('Slash');
0256         self::registerExtension('WellFormedWeb');
0257         self::registerExtension('Threading');
0258         self::registerExtension('ITunes');
0259     }
0260 
0261     public static function lcfirst($str)
0262     {
0263         $str[0] = strtolower($str[0]);
0264         return $str;
0265     }
0266 
0267 }