Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.0.x will end 8 May 2023 (12 months).
  • Bug fixes for security issues in 4.0.x will end 13 November 2023 (18 months).
  • PHP version: minimum PHP 7.3.0 Note: the minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is also supported.
   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