mirror of
https://github.com/renbaoshuo/S2OJ.git
synced 2024-12-27 04:11:53 +00:00
96d4a3ecf7
Due to historical reasons, the code is in subfolder "1". With SVN removal, we place the code back and remove the annoying "1" folder.
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
|