ILIAS  Release_5_0_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
RemoveEmpty.php
Go to the documentation of this file.
1 <?php
2 
4 {
8  private $context;
9 
13  private $config;
14 
18  private $attrValidator;
19 
23  private $removeNbsp;
24 
29 
34  private $_exclude = array('colgroup' => 1, 'th' => 1, 'td' => 1, 'iframe' => 1);
35 
41  public function prepare($config, $context)
42  {
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 
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