You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.1 KiB
106 lines
3.1 KiB
<?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
|
|
|