107 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			107 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | 
 | ||
|  | /** | ||
|  |  * Responsible for creating definition caches. | ||
|  |  */ | ||
|  | class HTMLPurifier_DefinitionCacheFactory | ||
|  | { | ||
|  |     /** | ||
|  |      * @type array | ||
|  |      */ | ||
|  |     protected $caches = array('Serializer' => array()); | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @type array | ||
|  |      */ | ||
|  |     protected $implementations = array(); | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @type HTMLPurifier_DefinitionCache_Decorator[] | ||
|  |      */ | ||
|  |     protected $decorators = array(); | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Initialize default decorators | ||
|  |      */ | ||
|  |     public function setup() | ||
|  |     { | ||
|  |         $this->addDecorator('Cleanup'); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Retrieves an instance of global definition cache factory. | ||
|  |      * @param HTMLPurifier_DefinitionCacheFactory $prototype | ||
|  |      * @return HTMLPurifier_DefinitionCacheFactory | ||
|  |      */ | ||
|  |     public static function instance($prototype = null) | ||
|  |     { | ||
|  |         static $instance; | ||
|  |         if ($prototype !== null) { | ||
|  |             $instance = $prototype; | ||
|  |         } elseif ($instance === null || $prototype === true) { | ||
|  |             $instance = new HTMLPurifier_DefinitionCacheFactory(); | ||
|  |             $instance->setup(); | ||
|  |         } | ||
|  |         return $instance; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Registers a new definition cache object | ||
|  |      * @param string $short Short name of cache object, for reference | ||
|  |      * @param string $long Full class name of cache object, for construction | ||
|  |      */ | ||
|  |     public function register($short, $long) | ||
|  |     { | ||
|  |         $this->implementations[$short] = $long; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Factory method that creates a cache object based on configuration | ||
|  |      * @param string $type Name of definitions handled by cache | ||
|  |      * @param HTMLPurifier_Config $config Config instance | ||
|  |      * @return mixed | ||
|  |      */ | ||
|  |     public function create($type, $config) | ||
|  |     { | ||
|  |         $method = $config->get('Cache.DefinitionImpl'); | ||
|  |         if ($method === null) { | ||
|  |             return new HTMLPurifier_DefinitionCache_Null($type); | ||
|  |         } | ||
|  |         if (!empty($this->caches[$method][$type])) { | ||
|  |             return $this->caches[$method][$type]; | ||
|  |         } | ||
|  |         if (isset($this->implementations[$method]) && | ||
|  |             class_exists($class = $this->implementations[$method], false)) { | ||
|  |             $cache = new $class($type); | ||
|  |         } else { | ||
|  |             if ($method != 'Serializer') { | ||
|  |                 trigger_error("Unrecognized DefinitionCache $method, using Serializer instead", E_USER_WARNING); | ||
|  |             } | ||
|  |             $cache = new HTMLPurifier_DefinitionCache_Serializer($type); | ||
|  |         } | ||
|  |         foreach ($this->decorators as $decorator) { | ||
|  |             $new_cache = $decorator->decorate($cache); | ||
|  |             // prevent infinite recursion in PHP 4
 | ||
|  |             unset($cache); | ||
|  |             $cache = $new_cache; | ||
|  |         } | ||
|  |         $this->caches[$method][$type] = $cache; | ||
|  |         return $this->caches[$method][$type]; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Registers a decorator to add to all new cache objects | ||
|  |      * @param HTMLPurifier_DefinitionCache_Decorator|string $decorator An instance or the name of a decorator | ||
|  |      */ | ||
|  |     public function addDecorator($decorator) | ||
|  |     { | ||
|  |         if (is_string($decorator)) { | ||
|  |             $class = "HTMLPurifier_DefinitionCache_Decorator_$decorator"; | ||
|  |             $decorator = new $class; | ||
|  |         } | ||
|  |         $this->decorators[$decorator->name] = $decorator; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | // vim: et sw=4 sts=4
 |