diff options
Diffstat (limited to 'library/HTMLPurifier/Injector.php')
-rw-r--r-- | library/HTMLPurifier/Injector.php | 198 |
1 files changed, 120 insertions, 78 deletions
diff --git a/library/HTMLPurifier/Injector.php b/library/HTMLPurifier/Injector.php index 5922f8130..5060eef9e 100644 --- a/library/HTMLPurifier/Injector.php +++ b/library/HTMLPurifier/Injector.php @@ -17,64 +17,71 @@ abstract class HTMLPurifier_Injector { /** - * Advisory name of injector, this is for friendly error messages + * Advisory name of injector, this is for friendly error messages. + * @type string */ public $name; /** - * Instance of HTMLPurifier_HTMLDefinition + * @type HTMLPurifier_HTMLDefinition */ protected $htmlDefinition; /** * Reference to CurrentNesting variable in Context. This is an array * list of tokens that we are currently "inside" + * @type array */ protected $currentNesting; /** - * Reference to InputTokens variable in Context. This is an array - * list of the input tokens that are being processed. + * Reference to current token. + * @type HTMLPurifier_Token */ - protected $inputTokens; + protected $currentToken; /** - * Reference to InputIndex variable in Context. This is an integer - * array index for $this->inputTokens that indicates what token - * is currently being processed. + * Reference to InputZipper variable in Context. + * @type HTMLPurifier_Zipper */ - protected $inputIndex; + protected $inputZipper; /** * Array of elements and attributes this injector creates and therefore * need to be allowed by the definition. Takes form of * array('element' => array('attr', 'attr2'), 'element2') + * @type array */ public $needed = array(); /** - * Index of inputTokens to rewind to. + * Number of elements to rewind backwards (relative). + * @type bool|int */ - protected $rewind = false; + protected $rewindOffset = false; /** * Rewind to a spot to re-perform processing. This is useful if you * deleted a node, and now need to see if this change affected any * earlier nodes. Rewinding does not affect other injectors, and can * result in infinite loops if not used carefully. + * @param bool|int $offset * @warning HTML Purifier will prevent you from fast-forwarding with this * function. */ - public function rewind($index) { - $this->rewind = $index; + public function rewindOffset($offset) + { + $this->rewindOffset = $offset; } /** - * Retrieves rewind, and then unsets it. + * Retrieves rewind offset, and then unsets it. + * @return bool|int */ - public function getRewind() { - $r = $this->rewind; - $this->rewind = false; + public function getRewindOffset() + { + $r = $this->rewindOffset; + $this->rewindOffset = false; return $r; } @@ -83,20 +90,23 @@ abstract class HTMLPurifier_Injector * this allows references to important variables to be made within * the injector. This function also checks if the HTML environment * will work with the Injector (see checkNeeded()). - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - * @return Boolean false if success, string of missing needed element/attribute if failure + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string Boolean false if success, string of missing needed element/attribute if failure */ - public function prepare($config, $context) { + public function prepare($config, $context) + { $this->htmlDefinition = $config->getHTMLDefinition(); // Even though this might fail, some unit tests ignore this and // still test checkNeeded, so be careful. Maybe get rid of that // dependency. $result = $this->checkNeeded($config); - if ($result !== false) return $result; + if ($result !== false) { + return $result; + } $this->currentNesting =& $context->get('CurrentNesting'); - $this->inputTokens =& $context->get('InputTokens'); - $this->inputIndex =& $context->get('InputIndex'); + $this->currentToken =& $context->get('CurrentToken'); + $this->inputZipper =& $context->get('InputZipper'); return false; } @@ -104,18 +114,26 @@ abstract class HTMLPurifier_Injector * This function checks if the HTML environment * will work with the Injector: if p tags are not allowed, the * Auto-Paragraphing injector should not be enabled. - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - * @return Boolean false if success, string of missing needed element/attribute if failure + * @param HTMLPurifier_Config $config + * @return bool|string Boolean false if success, string of missing needed element/attribute if failure */ - public function checkNeeded($config) { + public function checkNeeded($config) + { $def = $config->getHTMLDefinition(); foreach ($this->needed as $element => $attributes) { - if (is_int($element)) $element = $attributes; - if (!isset($def->info[$element])) return $element; - if (!is_array($attributes)) continue; + if (is_int($element)) { + $element = $attributes; + } + if (!isset($def->info[$element])) { + return $element; + } + if (!is_array($attributes)) { + continue; + } foreach ($attributes as $name) { - if (!isset($def->info[$element]->attr[$name])) return "$element.$name"; + if (!isset($def->info[$element]->attr[$name])) { + return "$element.$name"; + } } } return false; @@ -123,10 +141,11 @@ abstract class HTMLPurifier_Injector /** * Tests if the context node allows a certain element - * @param $name Name of element to test for - * @return True if element is allowed, false if it is not + * @param string $name Name of element to test for + * @return bool True if element is allowed, false if it is not */ - public function allowsElement($name) { + public function allowsElement($name) + { if (!empty($this->currentNesting)) { $parent_token = array_pop($this->currentNesting); $this->currentNesting[] = $parent_token; @@ -141,7 +160,9 @@ abstract class HTMLPurifier_Injector for ($i = count($this->currentNesting) - 2; $i >= 0; $i--) { $node = $this->currentNesting[$i]; $def = $this->htmlDefinition->info[$node->name]; - if (isset($def->excludes[$name])) return false; + if (isset($def->excludes[$name])) { + return false; + } } return true; } @@ -151,14 +172,22 @@ abstract class HTMLPurifier_Injector * you reach the end of the input tokens. * @warning Please prevent previous references from interfering with this * functions by setting $i = null beforehand! - * @param &$i Current integer index variable for inputTokens - * @param &$current Current token variable. Do NOT use $token, as that variable is also a reference - */ - protected function forward(&$i, &$current) { - if ($i === null) $i = $this->inputIndex + 1; - else $i++; - if (!isset($this->inputTokens[$i])) return false; - $current = $this->inputTokens[$i]; + * @param int $i Current integer index variable for inputTokens + * @param HTMLPurifier_Token $current Current token variable. + * Do NOT use $token, as that variable is also a reference + * @return bool + */ + protected function forward(&$i, &$current) + { + if ($i === null) { + $i = count($this->inputZipper->back) - 1; + } else { + $i--; + } + if ($i < 0) { + return false; + } + $current = $this->inputZipper->back[$i]; return true; } @@ -166,14 +195,27 @@ abstract class HTMLPurifier_Injector * Similar to _forward, but accepts a third parameter $nesting (which * should be initialized at 0) and stops when we hit the end tag * for the node $this->inputIndex starts in. + * @param int $i Current integer index variable for inputTokens + * @param HTMLPurifier_Token $current Current token variable. + * Do NOT use $token, as that variable is also a reference + * @param int $nesting + * @return bool */ - protected function forwardUntilEndToken(&$i, &$current, &$nesting) { + protected function forwardUntilEndToken(&$i, &$current, &$nesting) + { $result = $this->forward($i, $current); - if (!$result) return false; - if ($nesting === null) $nesting = 0; - if ($current instanceof HTMLPurifier_Token_Start) $nesting++; - elseif ($current instanceof HTMLPurifier_Token_End) { - if ($nesting <= 0) return false; + if (!$result) { + return false; + } + if ($nesting === null) { + $nesting = 0; + } + if ($current instanceof HTMLPurifier_Token_Start) { + $nesting++; + } elseif ($current instanceof HTMLPurifier_Token_End) { + if ($nesting <= 0) { + return false; + } $nesting--; } return true; @@ -184,56 +226,56 @@ abstract class HTMLPurifier_Injector * you reach the beginning of input tokens. * @warning Please prevent previous references from interfering with this * functions by setting $i = null beforehand! - * @param &$i Current integer index variable for inputTokens - * @param &$current Current token variable. Do NOT use $token, as that variable is also a reference - */ - protected function backward(&$i, &$current) { - if ($i === null) $i = $this->inputIndex - 1; - else $i--; - if ($i < 0) return false; - $current = $this->inputTokens[$i]; - return true; - } - - /** - * Initializes the iterator at the current position. Use in a do {} while; - * loop to force the _forward and _backward functions to start at the - * current location. - * @warning Please prevent previous references from interfering with this - * functions by setting $i = null beforehand! - * @param &$i Current integer index variable for inputTokens - * @param &$current Current token variable. Do NOT use $token, as that variable is also a reference + * @param int $i Current integer index variable for inputTokens + * @param HTMLPurifier_Token $current Current token variable. + * Do NOT use $token, as that variable is also a reference + * @return bool */ - protected function current(&$i, &$current) { - if ($i === null) $i = $this->inputIndex; - $current = $this->inputTokens[$i]; + protected function backward(&$i, &$current) + { + if ($i === null) { + $i = count($this->inputZipper->front) - 1; + } else { + $i--; + } + if ($i < 0) { + return false; + } + $current = $this->inputZipper->front[$i]; + return true; } /** * Handler that is called when a text token is processed */ - public function handleText(&$token) {} + public function handleText(&$token) + { + } /** * Handler that is called when a start or empty token is processed */ - public function handleElement(&$token) {} + public function handleElement(&$token) + { + } /** * Handler that is called when an end token is processed */ - public function handleEnd(&$token) { + public function handleEnd(&$token) + { $this->notifyEnd($token); } /** * Notifier that is called when an end token is processed + * @param HTMLPurifier_Token $token Current token variable. * @note This differs from handlers in that the token is read-only * @deprecated */ - public function notifyEnd($token) {} - - + public function notifyEnd($token) + { + } } // vim: et sw=4 sts=4 |