113 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			113 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?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; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Cached contents of %AutoFormat.RemoveEmpty.Predicate | ||
|  |      * @type array | ||
|  |      */ | ||
|  |     private $exclude; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @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->exclude = $config->get('AutoFormat.RemoveEmpty.Predicate'); | ||
|  |         foreach ($this->exclude as $key => $attrs) { | ||
|  |             if (!is_array($attrs)) { | ||
|  |                 // HACK, see HTMLPurifier/Printer/ConfigForm.php
 | ||
|  |                 $this->exclude[$key] = explode(';', $attrs); | ||
|  |             } | ||
|  |         } | ||
|  |         $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)) { | ||
|  |             $this->attrValidator->validateToken($token, $this->config, $this->context); | ||
|  |             $token->armor['ValidateAttributes'] = true; | ||
|  |             if (isset($this->exclude[$token->name])) { | ||
|  |                 $r = true; | ||
|  |                 foreach ($this->exclude[$token->name] as $elem) { | ||
|  |                     if (!isset($token->attr[$elem])) $r = false; | ||
|  |                 } | ||
|  |                 if ($r) return; | ||
|  |             } | ||
|  |             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
 |