diff options
author | Bernhard Posselt <dev@bernhard-posselt.com> | 2014-10-21 22:53:36 +0200 |
---|---|---|
committer | Bernhard Posselt <dev@bernhard-posselt.com> | 2014-10-21 22:53:36 +0200 |
commit | fe030e7339f5fc9ec4e75d9655b2ced0900da5c2 (patch) | |
tree | d87fc2bc4504392550c3aea0abb18614d36f8abb /3rdparty/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php | |
parent | 8c2a1b242c1cd2f7bcb179facc524f3454e7a863 (diff) |
use composer for autoloading repos
Diffstat (limited to '3rdparty/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php')
-rw-r--r-- | 3rdparty/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/3rdparty/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php b/3rdparty/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php new file mode 100644 index 000000000..9e6617be5 --- /dev/null +++ b/3rdparty/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php @@ -0,0 +1,71 @@ +<?php + +/** + * Converts a stream of HTMLPurifier_Token into an HTMLPurifier_Node, + * and back again. + * + * @note This transformation is not an equivalence. We mutate the input + * token stream to make it so; see all [MUT] markers in code. + */ +class HTMLPurifier_Arborize +{ + public static function arborize($tokens, $config, $context) { + $definition = $config->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; + } +} |