34 public function execute($tokens, $config, $context) {
39 $definition = $config->getHTMLDefinition();
43 $parent_name = $definition->info_parent;
51 $is_inline = $definition->info_parent_def->descendants_are_inline;
52 $context->register(
'IsInline', $is_inline);
55 $e =& $context->get(
'ErrorCollector',
true);
68 $exclude_stack = array();
73 $context->register(
'CurrentToken', $start_token);
80 for ($i = 0,
$size = count($tokens) ; $i <
$size; ) {
86 $child_tokens = array();
90 for ($j = $i, $depth = 0; ; $j++) {
95 if ($depth == 1)
continue;
100 if ($depth == 0)
break;
102 $child_tokens[] = $tokens[$j];
108 $start_token = $tokens[$i];
114 if ($count = count($stack)) {
115 $parent_index = $stack[$count-1];
116 $parent_name = $tokens[$parent_index]->name;
117 if ($parent_index == 0) {
118 $parent_def = $definition->info_parent_def;
120 $parent_def = $definition->info[$parent_name];
127 $parent_index = $parent_name = $parent_def = null;
131 if ($is_inline ===
false) {
133 if (!empty($parent_def) && $parent_def->descendants_are_inline) {
134 $is_inline = $count - 1;
138 if ($count === $is_inline) {
150 if (!empty($exclude_stack)) {
151 foreach ($exclude_stack as $lookup) {
152 if (isset($lookup[$tokens[$i]->name])) {
171 $def = $definition->info_parent_def;
173 $def = $definition->info[$tokens[$i]->name];
177 if (!empty($def->child)) {
179 $result = $def->child->validateChildren(
180 $child_tokens, $config, $context);
187 $excludes = $def->excludes;
202 if (!empty($excludes)) $exclude_stack[] = $excludes;
212 $e->send(E_ERROR,
'Strategy_FixNesting: Node excluded');
214 $e->send(E_ERROR,
'Strategy_FixNesting: Node removed');
219 $length = $j - $i + 1;
222 array_splice($tokens, $i, $length);
237 if (!$parent_def->child->allow_empty) {
250 $length = $j - $i - 1;
253 if (empty(
$result) && $length) {
254 $e->send(E_ERROR,
'Strategy_FixNesting: Node contents removed');
256 $e->send(E_WARNING,
'Strategy_FixNesting: Node reorganized');
261 array_splice($tokens, $i + 1, $length,
$result);
271 if (!empty($excludes)) $exclude_stack[] = $excludes;
286 $size = count($tokens);
293 if ($i == 0 || $i == $size - 1) {
295 $s_excludes = $definition->info_parent_def->excludes;
297 $s_excludes = $definition->info[$tokens[$i]->name]->excludes;
300 array_pop($exclude_stack);
312 array_shift($tokens);
316 $context->destroy(
'IsInline');
317 $context->destroy(
'CurrentToken');