Blame view

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