[ Index ]

PHP Cross Reference of vtigercrm-6.1.0

title

Body

[close]

/libraries/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ -> BackgroundPosition.php (source)

   1  <?php
   2  
   3  /* W3C says:
   4      [ // adjective and number must be in correct order, even if
   5        // you could switch them without introducing ambiguity.
   6        // some browsers support that syntax
   7          [
   8              <percentage> | <length> | left | center | right
   9          ]
  10          [
  11              <percentage> | <length> | top | center | bottom
  12          ]?
  13      ] |
  14      [ // this signifies that the vertical and horizontal adjectives
  15        // can be arbitrarily ordered, however, there can only be two,
  16        // one of each, or none at all
  17          [
  18              left | center | right
  19          ] ||
  20          [
  21              top | center | bottom
  22          ]
  23      ]
  24      top, left = 0%
  25      center, (none) = 50%
  26      bottom, right = 100%
  27  */
  28  
  29  /* QuirksMode says:
  30      keyword + length/percentage must be ordered correctly, as per W3C
  31  
  32      Internet Explorer and Opera, however, support arbitrary ordering. We
  33      should fix it up.
  34  
  35      Minor issue though, not strictly necessary.
  36  */
  37  
  38  // control freaks may appreciate the ability to convert these to
  39  // percentages or something, but it's not necessary
  40  
  41  /**
  42   * Validates the value of background-position.
  43   */
  44  class HTMLPurifier_AttrDef_CSS_BackgroundPosition extends HTMLPurifier_AttrDef
  45  {
  46  
  47      protected $length;
  48      protected $percentage;
  49  
  50      public function __construct() {
  51          $this->length     = new HTMLPurifier_AttrDef_CSS_Length();
  52          $this->percentage = new HTMLPurifier_AttrDef_CSS_Percentage();
  53      }
  54  
  55      public function validate($string, $config, $context) {
  56          $string = $this->parseCDATA($string);
  57          $bits = explode(' ', $string);
  58  
  59          $keywords = array();
  60          $keywords['h'] = false; // left, right
  61          $keywords['v'] = false; // top, bottom
  62          $keywords['c'] = false; // center
  63          $measures = array();
  64  
  65          $i = 0;
  66  
  67          $lookup = array(
  68              'top' => 'v',
  69              'bottom' => 'v',
  70              'left' => 'h',
  71              'right' => 'h',
  72              'center' => 'c'
  73          );
  74  
  75          foreach ($bits as $bit) {
  76              if ($bit === '') continue;
  77  
  78              // test for keyword
  79              $lbit = ctype_lower($bit) ? $bit : strtolower($bit);
  80              if (isset($lookup[$lbit])) {
  81                  $status = $lookup[$lbit];
  82                  $keywords[$status] = $lbit;
  83                  $i++;
  84              }
  85  
  86              // test for length
  87              $r = $this->length->validate($bit, $config, $context);
  88              if ($r !== false) {
  89                  $measures[] = $r;
  90                  $i++;
  91              }
  92  
  93              // test for percentage
  94              $r = $this->percentage->validate($bit, $config, $context);
  95              if ($r !== false) {
  96                  $measures[] = $r;
  97                  $i++;
  98              }
  99  
 100          }
 101  
 102          if (!$i) return false; // no valid values were caught
 103  
 104  
 105          $ret = array();
 106  
 107          // first keyword
 108          if     ($keywords['h'])     $ret[] = $keywords['h'];
 109          elseif (count($measures))   $ret[] = array_shift($measures);
 110          elseif ($keywords['c']) {
 111              $ret[] = $keywords['c'];
 112              $keywords['c'] = false; // prevent re-use: center = center center
 113          }
 114  
 115          if     ($keywords['v'])     $ret[] = $keywords['v'];
 116          elseif (count($measures))   $ret[] = array_shift($measures);
 117          elseif ($keywords['c'])     $ret[] = $keywords['c'];
 118  
 119          if (empty($ret)) return false;
 120          return implode(' ', $ret);
 121  
 122      }
 123  
 124  }
 125  
 126  // vim: et sw=4 sts=4


Generated: Fri Nov 28 20:08:37 2014 Cross-referenced by PHPXref 0.7.1