[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/se3master/var/www/se3/includes/library/HTMLPurifier/Injector/ -> RemoveEmpty.php (source)

   1  <?php
   2  
   3  class HTMLPurifier_Injector_RemoveEmpty extends HTMLPurifier_Injector
   4  {
   5      /**
   6       * @type HTMLPurifier_Context
   7       */
   8      private $context;
   9  
  10      /**
  11       * @type HTMLPurifier_Config
  12       */
  13      private $config;
  14  
  15      /**
  16       * @type HTMLPurifier_AttrValidator
  17       */
  18      private $attrValidator;
  19  
  20      /**
  21       * @type bool
  22       */
  23      private $removeNbsp;
  24  
  25      /**
  26       * @type bool
  27       */
  28      private $removeNbspExceptions;
  29  
  30      /**
  31       * @type array
  32       * TODO: make me configurable
  33       */
  34      private $_exclude = array('colgroup' => 1, 'th' => 1, 'td' => 1, 'iframe' => 1);
  35  
  36      /**
  37       * @param HTMLPurifier_Config $config
  38       * @param HTMLPurifier_Context $context
  39       * @return void
  40       */
  41      public function prepare($config, $context)
  42      {
  43          parent::prepare($config, $context);
  44          $this->config = $config;
  45          $this->context = $context;
  46          $this->removeNbsp = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp');
  47          $this->removeNbspExceptions = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions');
  48          $this->attrValidator = new HTMLPurifier_AttrValidator();
  49      }
  50  
  51      /**
  52       * @param HTMLPurifier_Token $token
  53       */
  54      public function handleElement(&$token)
  55      {
  56          if (!$token instanceof HTMLPurifier_Token_Start) {
  57              return;
  58          }
  59          $next = false;
  60          $deleted = 1; // the current tag
  61          for ($i = count($this->inputZipper->back) - 1; $i >= 0; $i--, $deleted++) {
  62              $next = $this->inputZipper->back[$i];
  63              if ($next instanceof HTMLPurifier_Token_Text) {
  64                  if ($next->is_whitespace) {
  65                      continue;
  66                  }
  67                  if ($this->removeNbsp && !isset($this->removeNbspExceptions[$token->name])) {
  68                      $plain = str_replace("\xC2\xA0", "", $next->data);
  69                      $isWsOrNbsp = $plain === '' || ctype_space($plain);
  70                      if ($isWsOrNbsp) {
  71                          continue;
  72                      }
  73                  }
  74              }
  75              break;
  76          }
  77          if (!$next || ($next instanceof HTMLPurifier_Token_End && $next->name == $token->name)) {
  78              if (isset($this->_exclude[$token->name])) {
  79                  return;
  80              }
  81              $this->attrValidator->validateToken($token, $this->config, $this->context);
  82              $token->armor['ValidateAttributes'] = true;
  83              if (isset($token->attr['id']) || isset($token->attr['name'])) {
  84                  return;
  85              }
  86              $token = $deleted + 1;
  87              for ($b = 0, $c = count($this->inputZipper->front); $b < $c; $b++) {
  88                  $prev = $this->inputZipper->front[$b];
  89                  if ($prev instanceof HTMLPurifier_Token_Text && $prev->is_whitespace) {
  90                      continue;
  91                  }
  92                  break;
  93              }
  94              // This is safe because we removed the token that triggered this.
  95              $this->rewindOffset($b+$deleted);
  96              return;
  97          }
  98      }
  99  }
 100  
 101  // vim: et sw=4 sts=4


Generated: Tue Mar 17 22:47:18 2015 Cross-referenced by PHPXref 0.7.1