0d1c8f5f397d8241a057a128429c8a7966e04b69
[yaffs-website] / vendor / ezyang / htmlpurifier / library / HTMLPurifier / ChildDef / Required.php
1 <?php
2
3 /**
4  * Definition that allows a set of elements, but disallows empty children.
5  */
6 class HTMLPurifier_ChildDef_Required extends HTMLPurifier_ChildDef
7 {
8     /**
9      * Lookup table of allowed elements.
10      * @type array
11      */
12     public $elements = array();
13
14     /**
15      * Whether or not the last passed node was all whitespace.
16      * @type bool
17      */
18     protected $whitespace = false;
19
20     /**
21      * @param array|string $elements List of allowed element names (lowercase).
22      */
23     public function __construct($elements)
24     {
25         if (is_string($elements)) {
26             $elements = str_replace(' ', '', $elements);
27             $elements = explode('|', $elements);
28         }
29         $keys = array_keys($elements);
30         if ($keys == array_keys($keys)) {
31             $elements = array_flip($elements);
32             foreach ($elements as $i => $x) {
33                 $elements[$i] = true;
34                 if (empty($i)) {
35                     unset($elements[$i]);
36                 } // remove blank
37             }
38         }
39         $this->elements = $elements;
40     }
41
42     /**
43      * @type bool
44      */
45     public $allow_empty = false;
46
47     /**
48      * @type string
49      */
50     public $type = 'required';
51
52     /**
53      * @param array $children
54      * @param HTMLPurifier_Config $config
55      * @param HTMLPurifier_Context $context
56      * @return array
57      */
58     public function validateChildren($children, $config, $context)
59     {
60         // Flag for subclasses
61         $this->whitespace = false;
62
63         // if there are no tokens, delete parent node
64         if (empty($children)) {
65             return false;
66         }
67
68         // the new set of children
69         $result = array();
70
71         // whether or not parsed character data is allowed
72         // this controls whether or not we silently drop a tag
73         // or generate escaped HTML from it
74         $pcdata_allowed = isset($this->elements['#PCDATA']);
75
76         // a little sanity check to make sure it's not ALL whitespace
77         $all_whitespace = true;
78
79         $stack = array_reverse($children);
80         while (!empty($stack)) {
81             $node = array_pop($stack);
82             if (!empty($node->is_whitespace)) {
83                 $result[] = $node;
84                 continue;
85             }
86             $all_whitespace = false; // phew, we're not talking about whitespace
87
88             if (!isset($this->elements[$node->name])) {
89                 // special case text
90                 // XXX One of these ought to be redundant or something
91                 if ($pcdata_allowed && $node instanceof HTMLPurifier_Node_Text) {
92                     $result[] = $node;
93                     continue;
94                 }
95                 // spill the child contents in
96                 // ToDo: Make configurable
97                 if ($node instanceof HTMLPurifier_Node_Element) {
98                     for ($i = count($node->children) - 1; $i >= 0; $i--) {
99                         $stack[] = $node->children[$i];
100                     }
101                     continue;
102                 }
103                 continue;
104             }
105             $result[] = $node;
106         }
107         if (empty($result)) {
108             return false;
109         }
110         if ($all_whitespace) {
111             $this->whitespace = true;
112             return false;
113         }
114         return $result;
115     }
116 }
117
118 // vim: et sw=4 sts=4