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  /**
   4   * Framework class for strings that involve multiple values.
   5   *
   6   * Certain CSS properties such as border-width and margin allow multiple
   7   * lengths to be specified.  This class can take a vanilla border-width
   8   * definition and multiply it, usually into a max of four.
   9   *
  10   * @note Even though the CSS specification isn't clear about it, inherit
  11   *       can only be used alone: it will never manifest as part of a multi
  12   *       shorthand declaration.  Thus, this class does not allow inherit.
  13   */
  14  class HTMLPurifier_AttrDef_CSS_Multiple extends HTMLPurifier_AttrDef
  15  {
  16      /**
  17       * Instance of component definition to defer validation to.
  18       * @type HTMLPurifier_AttrDef
  19       * @todo Make protected
  20       */
  21      public $single;
  22  
  23      /**
  24       * Max number of values allowed.
  25       * @todo Make protected
  26       */
  27      public $max;
  28  
  29      /**
  30       * @param HTMLPurifier_AttrDef $single HTMLPurifier_AttrDef to multiply
  31       * @param int $max Max number of values allowed (usually four)
  32       */
  33      public function __construct($single, $max = 4)
  34      {
  35          $this->single = $single;
  36          $this->max = $max;
  37      }
  38  
  39      /**
  40       * @param string $string
  41       * @param HTMLPurifier_Config $config
  42       * @param HTMLPurifier_Context $context
  43       * @return bool|string
  44       */
  45      public function validate($string, $config, $context)
  46      {
  47          $string = $this->mungeRgb($this->parseCDATA($string));
  48          if ($string === '') {
  49              return false;
  50          }
  51          $parts = explode(' ', $string); // parseCDATA replaced \r, \t and \n
  52          $length = count($parts);
  53          $final = '';
  54          for ($i = 0, $num = 0; $i < $length && $num < $this->max; $i++) {
  55              if (ctype_space($parts[$i])) {
  56                  continue;
  57              }
  58              $result = $this->single->validate($parts[$i], $config, $context);
  59              if ($result !== false) {
  60                  $final .= $result . ' ';
  61                  $num++;
  62              }
  63          }
  64          if ($final === '') {
  65              return false;
  66          }
  67          return rtrim($final);
  68      }
  69  }
  70  
  71  // vim: et sw=4 sts=4