Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).
  • Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).
  • PHP version: minimum PHP 7.3.0 Note: minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is supported too.
   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], false)) {
  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