Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
   1  <?php
   2  
   3  class HTMLPurifier_DoctypeRegistry
   4  {
   5  
   6      /**
   7       * Hash of doctype names to doctype objects.
   8       * @type array
   9       */
  10      protected $doctypes;
  11  
  12      /**
  13       * Lookup table of aliases to real doctype names.
  14       * @type array
  15       */
  16      protected $aliases;
  17  
  18      /**
  19       * Registers a doctype to the registry
  20       * @note Accepts a fully-formed doctype object, or the
  21       *       parameters for constructing a doctype object
  22       * @param string $doctype Name of doctype or literal doctype object
  23       * @param bool $xml
  24       * @param array $modules Modules doctype will load
  25       * @param array $tidy_modules Modules doctype will load for certain modes
  26       * @param array $aliases Alias names for doctype
  27       * @param string $dtd_public
  28       * @param string $dtd_system
  29       * @return HTMLPurifier_Doctype Editable registered doctype
  30       */
  31      public function register(
  32          $doctype,
  33          $xml = true,
  34          $modules = array(),
  35          $tidy_modules = array(),
  36          $aliases = array(),
  37          $dtd_public = null,
  38          $dtd_system = null
  39      ) {
  40          if (!is_array($modules)) {
  41              $modules = array($modules);
  42          }
  43          if (!is_array($tidy_modules)) {
  44              $tidy_modules = array($tidy_modules);
  45          }
  46          if (!is_array($aliases)) {
  47              $aliases = array($aliases);
  48          }
  49          if (!is_object($doctype)) {
  50              $doctype = new HTMLPurifier_Doctype(
  51                  $doctype,
  52                  $xml,
  53                  $modules,
  54                  $tidy_modules,
  55                  $aliases,
  56                  $dtd_public,
  57                  $dtd_system
  58              );
  59          }
  60          $this->doctypes[$doctype->name] = $doctype;
  61          $name = $doctype->name;
  62          // hookup aliases
  63          foreach ($doctype->aliases as $alias) {
  64              if (isset($this->doctypes[$alias])) {
  65                  continue;
  66              }
  67              $this->aliases[$alias] = $name;
  68          }
  69          // remove old aliases
  70          if (isset($this->aliases[$name])) {
  71              unset($this->aliases[$name]);
  72          }
  73          return $doctype;
  74      }
  75  
  76      /**
  77       * Retrieves reference to a doctype of a certain name
  78       * @note This function resolves aliases
  79       * @note When possible, use the more fully-featured make()
  80       * @param string $doctype Name of doctype
  81       * @return HTMLPurifier_Doctype Editable doctype object
  82       */
  83      public function get($doctype)
  84      {
  85          if (isset($this->aliases[$doctype])) {
  86              $doctype = $this->aliases[$doctype];
  87          }
  88          if (!isset($this->doctypes[$doctype])) {
  89              trigger_error('Doctype ' . htmlspecialchars($doctype) . ' does not exist', E_USER_ERROR);
  90              $anon = new HTMLPurifier_Doctype($doctype);
  91              return $anon;
  92          }
  93          return $this->doctypes[$doctype];
  94      }
  95  
  96      /**
  97       * Creates a doctype based on a configuration object,
  98       * will perform initialization on the doctype
  99       * @note Use this function to get a copy of doctype that config
 100       *       can hold on to (this is necessary in order to tell
 101       *       Generator whether or not the current document is XML
 102       *       based or not).
 103       * @param HTMLPurifier_Config $config
 104       * @return HTMLPurifier_Doctype
 105       */
 106      public function make($config)
 107      {
 108          return clone $this->get($this->getDoctypeFromConfig($config));
 109      }
 110  
 111      /**
 112       * Retrieves the doctype from the configuration object
 113       * @param HTMLPurifier_Config $config
 114       * @return string
 115       */
 116      public function getDoctypeFromConfig($config)
 117      {
 118          // recommended test
 119          $doctype = $config->get('HTML.Doctype');
 120          if (!empty($doctype)) {
 121              return $doctype;
 122          }
 123          $doctype = $config->get('HTML.CustomDoctype');
 124          if (!empty($doctype)) {
 125              return $doctype;
 126          }
 127          // backwards-compatibility
 128          if ($config->get('HTML.XHTML')) {
 129              $doctype = 'XHTML 1.0';
 130          } else {
 131              $doctype = 'HTML 4.01';
 132          }
 133          if ($config->get('HTML.Strict')) {
 134              $doctype .= ' Strict';
 135          } else {
 136              $doctype .= ' Transitional';
 137          }
 138          return $doctype;
 139      }
 140  }
 141  
 142  // vim: et sw=4 sts=4