119 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			119 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | 
 | ||
|  | /** | ||
|  |  * Definition that allows a set of elements, but disallows empty children. | ||
|  |  */ | ||
|  | class HTMLPurifier_ChildDef_Required extends HTMLPurifier_ChildDef | ||
|  | { | ||
|  |     /** | ||
|  |      * Lookup table of allowed elements. | ||
|  |      * @type array | ||
|  |      */ | ||
|  |     public $elements = array(); | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Whether or not the last passed node was all whitespace. | ||
|  |      * @type bool | ||
|  |      */ | ||
|  |     protected $whitespace = false; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @param array|string $elements List of allowed element names (lowercase). | ||
|  |      */ | ||
|  |     public function __construct($elements) | ||
|  |     { | ||
|  |         if (is_string($elements)) { | ||
|  |             $elements = str_replace(' ', '', $elements); | ||
|  |             $elements = explode('|', $elements); | ||
|  |         } | ||
|  |         $keys = array_keys($elements); | ||
|  |         if ($keys == array_keys($keys)) { | ||
|  |             $elements = array_flip($elements); | ||
|  |             foreach ($elements as $i => $x) { | ||
|  |                 $elements[$i] = true; | ||
|  |                 if (empty($i)) { | ||
|  |                     unset($elements[$i]); | ||
|  |                 } // remove blank
 | ||
|  |             } | ||
|  |         } | ||
|  |         $this->elements = $elements; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @type bool | ||
|  |      */ | ||
|  |     public $allow_empty = false; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @type string | ||
|  |      */ | ||
|  |     public $type = 'required'; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @param array $children | ||
|  |      * @param HTMLPurifier_Config $config | ||
|  |      * @param HTMLPurifier_Context $context | ||
|  |      * @return array | ||
|  |      */ | ||
|  |     public function validateChildren($children, $config, $context) | ||
|  |     { | ||
|  |         // Flag for subclasses
 | ||
|  |         $this->whitespace = false; | ||
|  | 
 | ||
|  |         // if there are no tokens, delete parent node
 | ||
|  |         if (empty($children)) { | ||
|  |             return false; | ||
|  |         } | ||
|  | 
 | ||
|  |         // the new set of children
 | ||
|  |         $result = array(); | ||
|  | 
 | ||
|  |         // whether or not parsed character data is allowed
 | ||
|  |         // this controls whether or not we silently drop a tag
 | ||
|  |         // or generate escaped HTML from it
 | ||
|  |         $pcdata_allowed = isset($this->elements['#PCDATA']); | ||
|  | 
 | ||
|  |         // a little sanity check to make sure it's not ALL whitespace
 | ||
|  |         $all_whitespace = true; | ||
|  | 
 | ||
|  |         $stack = array_reverse($children); | ||
|  |         while (!empty($stack)) { | ||
|  |             $node = array_pop($stack); | ||
|  |             if (!empty($node->is_whitespace)) { | ||
|  |                 $result[] = $node; | ||
|  |                 continue; | ||
|  |             } | ||
|  |             $all_whitespace = false; // phew, we're not talking about whitespace
 | ||
|  | 
 | ||
|  |             if (!isset($this->elements[$node->name])) { | ||
|  |                 // special case text
 | ||
|  |                 // XXX One of these ought to be redundant or something
 | ||
|  |                 if ($pcdata_allowed && $node instanceof HTMLPurifier_Node_Text) { | ||
|  |                     $result[] = $node; | ||
|  |                     continue; | ||
|  |                 } | ||
|  |                 // spill the child contents in
 | ||
|  |                 // ToDo: Make configurable
 | ||
|  |                 if ($node instanceof HTMLPurifier_Node_Element) { | ||
|  |                     for ($i = count($node->children) - 1; $i >= 0; $i--) { | ||
|  |                         $stack[] = $node->children[$i]; | ||
|  |                     } | ||
|  |                     continue; | ||
|  |                 } | ||
|  |                 continue; | ||
|  |             } | ||
|  |             $result[] = $node; | ||
|  |         } | ||
|  |         if (empty($result)) { | ||
|  |             return false; | ||
|  |         } | ||
|  |         if ($all_whitespace) { | ||
|  |             $this->whitespace = true; | ||
|  |             return false; | ||
|  |         } | ||
|  |         return $result; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | // vim: et sw=4 sts=4
 |