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