1: <?php
2:
3: 4: 5:
6: class HTMLPurifier_ChildDef_Required extends HTMLPurifier_ChildDef
7: {
8: 9: 10: 11:
12: public $elements = array();
13: 14: 15:
16: protected $whitespace = false;
17: 18: 19:
20: public function __construct($elements) {
21: if (is_string($elements)) {
22: $elements = str_replace(' ', '', $elements);
23: $elements = explode('|', $elements);
24: }
25: $keys = array_keys($elements);
26: if ($keys == array_keys($keys)) {
27: $elements = array_flip($elements);
28: foreach ($elements as $i => $x) {
29: $elements[$i] = true;
30: if (empty($i)) unset($elements[$i]);
31: }
32: }
33: $this->elements = $elements;
34: }
35: public $allow_empty = false;
36: public $type = 'required';
37: public function validateChildren($tokens_of_children, $config, $context) {
38:
39: $this->whitespace = false;
40:
41:
42: if (empty($tokens_of_children)) return false;
43:
44:
45: $result = array();
46:
47:
48: $nesting = 0;
49:
50:
51: $is_deleting = false;
52:
53:
54:
55:
56: $pcdata_allowed = isset($this->elements['#PCDATA']);
57:
58:
59: $all_whitespace = true;
60:
61:
62: $escape_invalid_children = $config->get('Core.EscapeInvalidChildren');
63:
64:
65: $gen = new HTMLPurifier_Generator($config, $context);
66:
67: foreach ($tokens_of_children as $token) {
68: if (!empty($token->is_whitespace)) {
69: $result[] = $token;
70: continue;
71: }
72: $all_whitespace = false;
73:
74: $is_child = ($nesting == 0);
75:
76: if ($token instanceof HTMLPurifier_Token_Start) {
77: $nesting++;
78: } elseif ($token instanceof HTMLPurifier_Token_End) {
79: $nesting--;
80: }
81:
82: if ($is_child) {
83: $is_deleting = false;
84: if (!isset($this->elements[$token->name])) {
85: $is_deleting = true;
86: if ($pcdata_allowed && $token instanceof HTMLPurifier_Token_Text) {
87: $result[] = $token;
88: } elseif ($pcdata_allowed && $escape_invalid_children) {
89: $result[] = new HTMLPurifier_Token_Text(
90: $gen->generateFromToken($token)
91: );
92: }
93: continue;
94: }
95: }
96: if (!$is_deleting || ($pcdata_allowed && $token instanceof HTMLPurifier_Token_Text)) {
97: $result[] = $token;
98: } elseif ($pcdata_allowed && $escape_invalid_children) {
99: $result[] =
100: new HTMLPurifier_Token_Text(
101: $gen->generateFromToken($token)
102: );
103: } else {
104:
105: }
106: }
107: if (empty($result)) return false;
108: if ($all_whitespace) {
109: $this->whitespace = true;
110: return false;
111: }
112: if ($tokens_of_children == $result) return true;
113: return $result;
114: }
115: }
116:
117:
118: