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.

Differences Between: [Versions 310 and 401] [Versions 311 and 401] [Versions 39 and 401] [Versions 400 and 401]

   1  <?php
   2  
   3  /**
   4   * Provides lookup array of attribute types to HTMLPurifier_AttrDef objects
   5   */
   6  class HTMLPurifier_AttrTypes
   7  {
   8      /**
   9       * Lookup array of attribute string identifiers to concrete implementations.
  10       * @type HTMLPurifier_AttrDef[]
  11       */
  12      protected $info = array();
  13  
  14      /**
  15       * Constructs the info array, supplying default implementations for attribute
  16       * types.
  17       */
  18      public function __construct()
  19      {
  20          // XXX This is kind of poor, since we don't actually /clone/
  21          // instances; instead, we use the supplied make() attribute. So,
  22          // the underlying class must know how to deal with arguments.
  23          // With the old implementation of Enum, that ignored its
  24          // arguments when handling a make dispatch, the IAlign
  25          // definition wouldn't work.
  26  
  27          // pseudo-types, must be instantiated via shorthand
  28          $this->info['Enum']    = new HTMLPurifier_AttrDef_Enum();
  29          $this->info['Bool']    = new HTMLPurifier_AttrDef_HTML_Bool();
  30  
  31          $this->info['CDATA']    = new HTMLPurifier_AttrDef_Text();
  32          $this->info['ID']       = new HTMLPurifier_AttrDef_HTML_ID();
  33          $this->info['Length']   = new HTMLPurifier_AttrDef_HTML_Length();
  34          $this->info['MultiLength'] = new HTMLPurifier_AttrDef_HTML_MultiLength();
  35          $this->info['NMTOKENS'] = new HTMLPurifier_AttrDef_HTML_Nmtokens();
  36          $this->info['Pixels']   = new HTMLPurifier_AttrDef_HTML_Pixels();
  37          $this->info['Text']     = new HTMLPurifier_AttrDef_Text();
  38          $this->info['URI']      = new HTMLPurifier_AttrDef_URI();
  39          $this->info['LanguageCode'] = new HTMLPurifier_AttrDef_Lang();
  40          $this->info['Color']    = new HTMLPurifier_AttrDef_HTML_Color();
  41          $this->info['IAlign']   = self::makeEnum('top,middle,bottom,left,right');
  42          $this->info['LAlign']   = self::makeEnum('top,bottom,left,right');
  43          $this->info['FrameTarget'] = new HTMLPurifier_AttrDef_HTML_FrameTarget();
  44          $this->info['ContentEditable'] = new HTMLPurifier_AttrDef_HTML_ContentEditable();
  45  
  46          // unimplemented aliases
  47          $this->info['ContentType'] = new HTMLPurifier_AttrDef_Text();
  48          $this->info['ContentTypes'] = new HTMLPurifier_AttrDef_Text();
  49          $this->info['Charsets'] = new HTMLPurifier_AttrDef_Text();
  50          $this->info['Character'] = new HTMLPurifier_AttrDef_Text();
  51  
  52          // "proprietary" types
  53          $this->info['Class'] = new HTMLPurifier_AttrDef_HTML_Class();
  54  
  55          // number is really a positive integer (one or more digits)
  56          // FIXME: ^^ not always, see start and value of list items
  57          $this->info['Number']   = new HTMLPurifier_AttrDef_Integer(false, false, true);
  58      }
  59  
  60      private static function makeEnum($in)
  61      {
  62          return new HTMLPurifier_AttrDef_Clone(new HTMLPurifier_AttrDef_Enum(explode(',', $in)));
  63      }
  64  
  65      /**
  66       * Retrieves a type
  67       * @param string $type String type name
  68       * @return HTMLPurifier_AttrDef Object AttrDef for type
  69       */
  70      public function get($type)
  71      {
  72          // determine if there is any extra info tacked on
  73          if (strpos($type, '#') !== false) {
  74              list($type, $string) = explode('#', $type, 2);
  75          } else {
  76              $string = '';
  77          }
  78  
  79          if (!isset($this->info[$type])) {
  80              trigger_error('Cannot retrieve undefined attribute type ' . $type, E_USER_ERROR);
  81              return;
  82          }
  83          return $this->info[$type]->make($string);
  84      }
  85  
  86      /**
  87       * Sets a new implementation for a type
  88       * @param string $type String type name
  89       * @param HTMLPurifier_AttrDef $impl Object AttrDef for type
  90       */
  91      public function set($type, $impl)
  92      {
  93          $this->info[$type] = $impl;
  94      }
  95  }
  96  
  97  // vim: et sw=4 sts=4