getHTMLDefinition ();
$parent = new HTMLPurifier_Token_Start ( $definition->info_parent );
$stack = array (
$parent->toNode ()
);
foreach ( $tokens as $token ) {
$token->skip = null; // [MUT]
$token->carryover = null; // [MUT]
if ($token instanceof HTMLPurifier_Token_End) {
$token->start = null; // [MUT]
$r = array_pop ( $stack );
assert ( $r->name === $token->name );
assert ( empty ( $token->attr ) );
$r->endCol = $token->col;
$r->endLine = $token->line;
$r->endArmor = $token->armor;
continue;
}
$node = $token->toNode ();
$stack [count ( $stack ) - 1]->children [] = $node;
if ($token instanceof HTMLPurifier_Token_Start) {
$stack [] = $node;
}
}
assert ( count ( $stack ) == 1 );
return $stack [0];
}
public static function flatten($node, $config, $context) {
$level = 0;
$nodes = array (
$level => new HTMLPurifier_Queue ( array (
$node
) )
);
$closingTokens = array ();
$tokens = array ();
do {
while ( ! $nodes [$level]->isEmpty () ) {
$node = $nodes [$level]->shift (); // FIFO
list ( $start, $end ) = $node->toTokenPair ();
if ($level > 0) {
$tokens [] = $start;
}
if ($end !== NULL) {
$closingTokens [$level] [] = $end;
}
if ($node instanceof HTMLPurifier_Node_Element) {
$level ++;
$nodes [$level] = new HTMLPurifier_Queue ();
foreach ( $node->children as $childNode ) {
$nodes [$level]->push ( $childNode );
}
}
}
$level --;
if ($level && isset ( $closingTokens [$level] )) {
while ( $token = array_pop ( $closingTokens [$level] ) ) {
$tokens [] = $token;
}
}
} while ( $level > 0 );
return $tokens;
}
}