Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
 
3
/**
4
 * Responsible for creating definition caches.
5
 */
6
class HTMLPurifier_DefinitionCacheFactory
7
{
8
    /**
9
     * @type array
10
     */
11
    protected $caches = array('Serializer' => array());
12
 
13
    /**
14
     * @type array
15
     */
16
    protected $implementations = array();
17
 
18
    /**
19
     * @type HTMLPurifier_DefinitionCache_Decorator[]
20
     */
21
    protected $decorators = array();
22
 
23
    /**
24
     * Initialize default decorators
25
     */
26
    public function setup()
27
    {
28
        $this->addDecorator('Cleanup');
29
    }
30
 
31
    /**
32
     * Retrieves an instance of global definition cache factory.
33
     * @param HTMLPurifier_DefinitionCacheFactory $prototype
34
     * @return HTMLPurifier_DefinitionCacheFactory
35
     */
36
    public static function instance($prototype = null)
37
    {
38
        static $instance;
39
        if ($prototype !== null) {
40
            $instance = $prototype;
41
        } elseif ($instance === null || $prototype === true) {
42
            $instance = new HTMLPurifier_DefinitionCacheFactory();
43
            $instance->setup();
44
        }
45
        return $instance;
46
    }
47
 
48
    /**
49
     * Registers a new definition cache object
50
     * @param string $short Short name of cache object, for reference
51
     * @param string $long Full class name of cache object, for construction
52
     */
53
    public function register($short, $long)
54
    {
55
        $this->implementations[$short] = $long;
56
    }
57
 
58
    /**
59
     * Factory method that creates a cache object based on configuration
60
     * @param string $type Name of definitions handled by cache
61
     * @param HTMLPurifier_Config $config Config instance
62
     * @return mixed
63
     */
64
    public function create($type, $config)
65
    {
66
        $method = $config->get('Cache.DefinitionImpl');
67
        if ($method === null) {
68
            return new HTMLPurifier_DefinitionCache_Null($type);
69
        }
70
        if (!empty($this->caches[$method][$type])) {
71
            return $this->caches[$method][$type];
72
        }
73
        if (isset($this->implementations[$method]) &&
74
            class_exists($class = $this->implementations[$method])) {
75
            $cache = new $class($type);
76
        } else {
77
            if ($method != 'Serializer') {
78
                trigger_error("Unrecognized DefinitionCache $method, using Serializer instead", E_USER_WARNING);
79
            }
80
            $cache = new HTMLPurifier_DefinitionCache_Serializer($type);
81
        }
82
        foreach ($this->decorators as $decorator) {
83
            $new_cache = $decorator->decorate($cache);
84
            // prevent infinite recursion in PHP 4
85
            unset($cache);
86
            $cache = $new_cache;
87
        }
88
        $this->caches[$method][$type] = $cache;
89
        return $this->caches[$method][$type];
90
    }
91
 
92
    /**
93
     * Registers a decorator to add to all new cache objects
94
     * @param HTMLPurifier_DefinitionCache_Decorator|string $decorator An instance or the name of a decorator
95
     */
96
    public function addDecorator($decorator)
97
    {
98
        if (is_string($decorator)) {
99
            $class = "HTMLPurifier_DefinitionCache_Decorator_$decorator";
100
            $decorator = new $class;
101
        }
102
        $this->decorators[$decorator->name] = $decorator;
103
    }
104
}
105
 
106
// vim: et sw=4 sts=4