From 2a28e60bb702af9d6c8fdb1df7f6be82a20aee64 Mon Sep 17 00:00:00 2001 From: Thomas Gelf Date: Fri, 9 May 2014 10:13:49 +0000 Subject: [PATCH 01/14] Do not change browser title on autorefresh fixes #6168 --- public/js/icinga/loader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/js/icinga/loader.js b/public/js/icinga/loader.js index 3d33aa6d7..20e8fa661 100644 --- a/public/js/icinga/loader.js +++ b/public/js/icinga/loader.js @@ -325,7 +325,7 @@ } var title = req.getResponseHeader('X-Icinga-Title'); - if (title && req.$target.closest('.dashboard').length === 0) { + if (title && ! req.autorefresh && req.$target.closest('.dashboard').length === 0) { this.icinga.ui.setTitle(title); } From 681cdee68d25c1c7cc258ca5d1466c9ebfd3d572 Mon Sep 17 00:00:00 2001 From: Thomas Gelf Date: Fri, 9 May 2014 10:15:00 +0000 Subject: [PATCH 02/14] Move hover menu downward fixes #6169 --- public/css/icinga/menu.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/css/icinga/menu.less b/public/css/icinga/menu.less index 6b7d73ed0..206f23601 100644 --- a/public/css/icinga/menu.less +++ b/public/css/icinga/menu.less @@ -127,7 +127,7 @@ display: block; left: 13em; right: 0; - top: -2em; + top: -0.5em; padding-top: 1em; padding-bottom: 0.5em; height: auto; From 64dd91e457ef21a1a680316b3e2ed1bf80c874a0 Mon Sep 17 00:00:00 2001 From: Thomas Gelf Date: Fri, 9 May 2014 10:37:38 +0000 Subject: [PATCH 03/14] Upgrade JShrink to 1.0 refs #6165 --- library/vendor/JShrink/Minifier.php | 330 ++++++++++++++++++---------- library/vendor/JShrink/SOURCE | 3 +- 2 files changed, 212 insertions(+), 121 deletions(-) diff --git a/library/vendor/JShrink/Minifier.php b/library/vendor/JShrink/Minifier.php index e76ae162a..c8f17d93e 100644 --- a/library/vendor/JShrink/Minifier.php +++ b/library/vendor/JShrink/Minifier.php @@ -84,22 +84,37 @@ class Minifier protected static $defaultOptions = array('flaggedComments' => true); /** - * Minifier::minify takes a string containing javascript and removes - * unneeded characters in order to shrink the code without altering it's - * functionality. + * Contains lock ids which are used to replace certain code patterns and + * prevent them from being minified + * + * @var array + */ + protected $locks = array(); + + /** + * Takes a string containing javascript and removes unneeded characters in + * order to shrink the code without altering it's functionality. + * + * @param string $js The raw javascript to be minified + * @param array $options Various runtime options in an associative array + * @throws \Exception + * @return bool|string */ public static function minify($js, $options = array()) { try { ob_start(); - $currentOptions = array_merge(static::$defaultOptions, $options); $jshrink = new Minifier(); - $jshrink->breakdownScript($js, $currentOptions); - unset($jshrink); + $js = $jshrink->lock($js); + $jshrink->minifyDirectToOutput($js, $options); // Sometimes there's a leading new line, so we trim that out here. - return ltrim(ob_get_clean()); + $js = ltrim(ob_get_clean()); + $js = $jshrink->unlock($js); + unset($jshrink); + + return $js; } catch (\Exception $e) { @@ -120,13 +135,25 @@ class Minifier * Processes a javascript string and outputs only the required characters, * stripping out all unneeded characters. * - * @param string $js The raw javascript to be minified - * @param array $currentOptions Various runtime options in an associative array + * @param string $js The raw javascript to be minified + * @param array $options Various runtime options in an associative array */ - protected function breakdownScript($js, $currentOptions) + protected function minifyDirectToOutput($js, $options) { - $this->options = $currentOptions; + $this->initialize($js, $options); + $this->loop(); + $this->clean(); + } + /** + * Initializes internal variables, normalizes new lines, + * + * @param string $js The raw javascript to be minified + * @param array $options Various runtime options in an associative array + */ + protected function initialize($js, $options) + { + $this->options = array_merge(static::$defaultOptions, $options); $js = str_replace("\r\n", "\n", $js); $this->input = str_replace("\r", "\n", $js); @@ -135,46 +162,36 @@ class Minifier // comment error that can otherwise occur. $this->input .= PHP_EOL; - - $this->a = $this->getReal(); - - // the only time the length can be higher than 1 is if a conditional - // comment needs to be displayed and the only time that can happen for - // $a is on the very first run - while (strlen($this->a) > 1) { - echo $this->a; - $this->a = $this->getReal(); - } - + // Populate "a" with a new line, "b" with the first character, before + // entering the loop + $this->a = "\n"; $this->b = $this->getReal(); + } + /** + * The primary action occurs here. This function loops through the input string, + * outputting anything that's relevant and discarding anything that is not. + */ + protected function loop() + { while ($this->a !== false && !is_null($this->a) && $this->a !== '') { - // now we give $b the same check for conditional comments we gave $a - // before we began looping - if (strlen($this->b) > 1) { - echo $this->a . $this->b; - $this->a = $this->getReal(); - $this->b = $this->getReal(); - continue; - } - switch ($this->a) { // new lines case "\n": - // if the next line is something that can't stand alone - // preserve the newline + // if the next line is something that can't stand alone preserve the newline if (strpos('(-+{[@', $this->b) !== false) { echo $this->a; $this->saveString(); break; } - // if its a space we move down to the string test below + // if B is a space we skip the rest of the switch block and go down to the + // string/regex check below, resetting $this->b with getReal if($this->b === ' ') break; - // otherwise we treat the newline like a space + // otherwise we treat the newline like a space case ' ': if(static::isAlphaNumeric($this->b)) @@ -221,7 +238,20 @@ class Minifier if(($this->b == '/' && strpos('(,=:[!&|?', $this->a) !== false)) $this->saveRegex(); } - $this->clean(); + } + + /** + * Resets attributes that do not need to be stored between requests so that + * the next request is ready to go. Another reason for this is to make sure + * the variables are cleared and are not taking up memory. + */ + protected function clean() + { + unset($this->input); + $this->index = 0; + $this->a = $this->b = ''; + unset($this->c); + unset($this->options); } /** @@ -264,76 +294,112 @@ class Minifier * performance benefits as the skipping is done using native functions (ie, * c code) rather than in script php. * - * @throws \RuntimeException + * * @return string Next 'real' character to be processed. + * @throws \RuntimeException */ protected function getReal() { $startIndex = $this->index; $char = $this->getChar(); - // Check to see if we're potentially in a comment - if ($char == '/') { - $this->c = $this->getChar(); - - if ($this->c == '/') { - $thirdCommentString = substr($this->input, $this->index, 1); - - // kill rest of line - $char = $this->getNext("\n"); - - if ($thirdCommentString == '@') { - $endPoint = ($this->index) - $startIndex; - unset($this->c); - $char = "\n" . substr($this->input, $startIndex, $endPoint); - } else { - $char = $this->getChar(); - $char = $this->getChar(); - } - - } elseif ($this->c == '*') { - - $this->getChar(); // current C - $thirdCommentString = $this->getChar(); - - if ($thirdCommentString == '@') { - // conditional comment - - // we're gonna back up a bit and and send the comment back, - // where the first char will be echoed and the rest will be - // treated like a string - $this->index = $this->index-2; - - return '/'; - - } elseif ($this->getNext('*/')) { - // kill everything up to the next */ - - $this->getChar(); // get * - $this->getChar(); // get / - - $char = $this->getChar(); // get next real character - - // if YUI-style comments are enabled we reinsert it into the stream - if ($this->options['flaggedComments'] && $thirdCommentString == '!') { - $endPoint = ($this->index - 1) - $startIndex; - echo "\n" . substr($this->input, $startIndex, $endPoint) . "\n"; - } - - } else { - $char = false; - } - - if($char === false) - throw new \RuntimeException('Unclosed multiline comment at position: ' . ($this->index - 2)); - - // if we're here c is part of the comment and therefore tossed - if(isset($this->c)) - unset($this->c); - } + if ($char !== '/') { + return $char; } + $this->c = $this->getChar(); + + if ($this->c == '/') { + return $this->processOneLineComments($startIndex); + + } elseif ($this->c == '*') { + return $this->processMultiLineComments($startIndex); + } + + return $char; + } + + /** + * Removed one line comments, with the exception of some very specific types of + * conditional comments. + * + * @param int $startIndex The index point where "getReal" function started + * @return string + */ + protected function processOneLineComments($startIndex) + { + $thirdCommentString = substr($this->input, $this->index, 1); + + // kill rest of line + $this->getNext("\n"); + + if ($thirdCommentString == '@') { + $endPoint = ($this->index) - $startIndex; + unset($this->c); + $char = "\n" . substr($this->input, $startIndex, $endPoint); + } else { + // first one is contents of $this->c + $this->getChar(); + $char = $this->getChar(); + } + + return $char; + } + + /** + * Skips multiline comments where appropriate, and includes them where needed. + * Conditional comments and "license" style blocks are preserved. + * + * @param int $startIndex The index point where "getReal" function started + * @return bool|string False if there's no character + * @throws \RuntimeException Unclosed comments will throw an error + */ + protected function processMultiLineComments($startIndex) + { + $this->getChar(); // current C + $thirdCommentString = $this->getChar(); + + // kill everything up to the next */ if it's there + if ($this->getNext('*/')) { + + $this->getChar(); // get * + $this->getChar(); // get / + $char = $this->getChar(); // get next real character + + // Now we reinsert conditional comments and YUI-style licensing comments + if (($this->options['flaggedComments'] && $thirdCommentString == '!') + || ($thirdCommentString == '@') ) { + + // If conditional comments or flagged comments are not the first thing in the script + // we need to echo a and fill it with a space before moving on. + if ($startIndex > 0) { + echo $this->a; + $this->a = " "; + + // If the comment started on a new line we let it stay on the new line + if ($this->input[($startIndex - 1)] == "\n") { + echo "\n"; + } + } + + $endPoint = ($this->index - 1) - $startIndex; + echo substr($this->input, $startIndex, $endPoint); + + return $char; + } + + } else { + $char = false; + } + + if($char === false) + throw new \RuntimeException('Unclosed multiline comment at position: ' . ($this->index - 2)); + + // if we're here c is part of the comment and therefore tossed + if(isset($this->c)) + unset($this->c); + return $char; } @@ -342,7 +408,7 @@ class Minifier * is found the first character of the string is returned and the index is set * to it's position. * - * @param $string + * @param string $string * @return string|false Returns the first character of the string or false. */ protected function getNext($string) @@ -366,6 +432,7 @@ class Minifier * When a javascript string is detected this function crawls for the end of * it and saves the whole string. * + * @throws \RuntimeException Unclosed strings will throw an error */ protected function saveString() { @@ -386,7 +453,6 @@ class Minifier // Echo out that starting quote echo $this->a; - // Loop until the string is done while (1) { @@ -401,8 +467,6 @@ class Minifier case $stringType: break 2; - - // New lines in strings without line delimiters are bad- actual // new lines will be represented by the string \n and not the actual // character, so those will be treated just fine using the switch @@ -411,7 +475,6 @@ class Minifier throw new \RuntimeException('Unclosed string at position: ' . $startpos ); break; - // Escaped characters get picked up here. If it's an escaped new line it's not really needed case '\\': @@ -435,15 +498,14 @@ class Minifier default: echo $this->a; } - - // Echo a- it'll be set to the next char at the start of the loop - // echo $this->a; } } /** * When a regular expression is detected this function crawls for the end of * it and saves the whole regex. + * + * @throws \RuntimeException Unclosed regex will throw an error */ protected function saveRegex() { @@ -466,24 +528,10 @@ class Minifier $this->b = $this->getReal(); } - /** - * Resets attributes that do not need to be stored between requests so that - * the next request is ready to go. Another reason for this is to make sure - * the variables are cleared and are not taking up memory. - */ - protected function clean() - { - unset($this->input); - $this->index = 0; - $this->a = $this->b = ''; - unset($this->c); - unset($this->options); - } - /** * Checks to see if a character is alphanumeric. * - * @param $char string Just one character + * @param string $char Just one character * @return bool */ protected static function isAlphaNumeric($char) @@ -491,4 +539,48 @@ class Minifier return preg_match('/^[\w\$]$/', $char) === 1 || $char == '/'; } + /** + * Replace patterns in the given string and store the replacement + * + * @param string $js The string to lock + * @return bool + */ + protected function lock($js) + { + /* lock things like "asd" + ++x; */ + $lock = '"LOCK---' . crc32(time()) . '"'; + + $matches = array(); + preg_match('/([+-])(\s+)([+-])/', $js, $matches); + if (empty($matches)) { + return $js; + } + + $this->locks[$lock] = $matches[2]; + + $js = preg_replace('/([+-])\s+([+-])/', "$1{$lock}$2", $js); + /* -- */ + + return $js; + } + + /** + * Replace "locks" with the original characters + * + * @param string $js The string to unlock + * @return bool + */ + protected function unlock($js) + { + if (!count($this->locks)) { + return $js; + } + + foreach ($this->locks as $lock => $replacement) { + $js = str_replace($lock, $replacement, $js); + } + + return $js; + } + } diff --git a/library/vendor/JShrink/SOURCE b/library/vendor/JShrink/SOURCE index e01b72fe0..721d70182 100644 --- a/library/vendor/JShrink/SOURCE +++ b/library/vendor/JShrink/SOURCE @@ -1,2 +1 @@ -https://github.com/tedivm/JShrink.git -d9238750fdf763dc4f38631be64866fd84fe5ec8 +https://github.com/tedivm/JShrink/releases/tag/v1.0.0 From d93c060e6a29223aac050d0e240a98ff2453fca8 Mon Sep 17 00:00:00 2001 From: Thomas Gelf Date: Fri, 9 May 2014 10:41:20 +0000 Subject: [PATCH 04/14] Upgrade htmlpurifier to 4.6.0 refs #6165 --- .../HTMLPurifier/AttrDef/CSS/AlphaValue.php | 21 - .../AttrDef/CSS/DenyElementDecorator.php | 28 - .../HTMLPurifier/AttrDef/CSS/Ident.php | 24 - .../HTMLPurifier/AttrDef/CSS/Length.php | 47 - .../HTMLPurifier/AttrDef/CSS/ListStyle.php | 78 - .../HTMLPurifier/AttrDef/CSS/Percentage.php | 40 - .../library/HTMLPurifier/AttrDef/Clone.php | 28 - .../HTMLPurifier/AttrDef/HTML/Bool.php | 28 - .../HTMLPurifier/AttrDef/HTML/Color.php | 33 - .../HTMLPurifier/AttrDef/HTML/FrameTarget.php | 21 - .../HTMLPurifier/AttrDef/HTML/Length.php | 41 - .../HTMLPurifier/AttrDef/HTML/MultiLength.php | 41 - .../HTMLPurifier/AttrDef/HTML/Pixels.php | 48 - .../library/HTMLPurifier/AttrDef/Text.php | 15 - .../library/HTMLPurifier/AttrDef/URI/IPv6.php | 99 - .../HTMLPurifier/AttrTransform/BoolToCSS.php | 36 - .../HTMLPurifier/AttrTransform/EnumToCSS.php | 58 - .../HTMLPurifier/AttrTransform/Length.php | 27 - .../HTMLPurifier/AttrTransform/Name.php | 21 - .../HTMLPurifier/AttrTransform/NameSync.php | 27 - .../HTMLPurifier/AttrTransform/SafeObject.php | 16 - .../HTMLPurifier/AttrTransform/Textarea.php | 18 - .../library/HTMLPurifier/CSSDefinition.php | 328 -- .../library/HTMLPurifier/ChildDef/List.php | 120 - .../HTMLPurifier/ChildDef/Optional.php | 26 - .../HTMLPurifier/ChildDef/Required.php | 117 - .../ChildDef/StrictBlockquote.php | 88 - .../library/HTMLPurifier/ChildDef/Table.php | 227 - .../ConfigSchema/ValidatorAtom.php | 66 - .../HTMLPurifier/ConfigSchema/schema.ser | Bin 14880 -> 0 bytes .../library/HTMLPurifier/Context.php | 82 - .../DefinitionCache/Decorator.php | 62 - .../DefinitionCache/Decorator/Cleanup.php | 43 - .../DefinitionCache/Decorator/Memory.php | 46 - .../DefinitionCache/Decorator/Template.php.in | 47 - .../HTMLPurifier/DefinitionCache/Null.php | 39 - .../library/HTMLPurifier/Filter/YouTube.php | 39 - .../library/HTMLPurifier/HTMLModule/Forms.php | 119 - .../HTMLPurifier/HTMLModule/Tidy/Strict.php | 21 - .../HTMLPurifier/Injector/RemoveEmpty.php | 54 - .../HTMLPurifier/Language/messages/en.php | 63 - .../library/HTMLPurifier/Lexer/PH5P.php | 3904 -------------- .../HTMLPurifier/Strategy/FixNesting.php | 346 -- .../library/HTMLPurifier/Token.php | 57 - .../library/HTMLPurifier/Token/Comment.php | 22 - .../library/HTMLPurifier/TokenFactory.php | 94 - .../URIFilter/DisableExternal.php | 23 - .../URIFilter/DisableExternalResources.php | 12 - .../URIFilter/DisableResources.php | 11 - .../library/HTMLPurifier/URIFilter/Munge.php | 53 - .../HTMLPurifier/URIFilter/SafeIframe.php | 35 - .../library/HTMLPurifier/URIScheme/file.php | 32 - .../library/HTMLPurifier/URIScheme/news.php | 22 - .../library/HTMLPurifier/URIScheme/nntp.php | 19 - .../library/HTMLPurifier/VarParser.php | 154 - .../CREDITS | 0 .../INSTALL | 0 .../LICENSE | 0 .../NEWS | 26 +- .../library/HTMLPurifier.auto.php | 0 .../library/HTMLPurifier.autoload.php | 3 +- .../library/HTMLPurifier.composer.php | 0 .../library/HTMLPurifier.func.php | 8 +- .../library/HTMLPurifier.includes.php | 9 +- .../library/HTMLPurifier.kses.php | 4 +- .../library/HTMLPurifier.path.php | 0 .../library/HTMLPurifier.php | 153 +- .../library/HTMLPurifier.safe-includes.php | 7 + .../library/HTMLPurifier/Arborize.php | 71 + .../library/HTMLPurifier/AttrCollections.php | 53 +- .../library/HTMLPurifier/AttrDef.php | 51 +- .../library/HTMLPurifier/AttrDef/CSS.php | 39 +- .../HTMLPurifier/AttrDef/CSS/AlphaValue.php | 34 + .../HTMLPurifier/AttrDef/CSS/Background.php | 58 +- .../AttrDef/CSS/BackgroundPosition.php | 54 +- .../HTMLPurifier/AttrDef/CSS/Border.php | 21 +- .../HTMLPurifier/AttrDef/CSS/Color.php | 67 +- .../HTMLPurifier/AttrDef/CSS/Composite.php | 22 +- .../AttrDef/CSS/DenyElementDecorator.php | 44 + .../HTMLPurifier/AttrDef/CSS/Filter.php | 49 +- .../library/HTMLPurifier/AttrDef/CSS/Font.php | 89 +- .../HTMLPurifier/AttrDef/CSS/FontFamily.php | 42 +- .../HTMLPurifier/AttrDef/CSS/Ident.php | 32 + .../AttrDef/CSS/ImportantDecorator.php | 28 +- .../HTMLPurifier/AttrDef/CSS/Length.php | 77 + .../HTMLPurifier/AttrDef/CSS/ListStyle.php | 112 + .../HTMLPurifier/AttrDef/CSS/Multiple.php | 31 +- .../HTMLPurifier/AttrDef/CSS/Number.php | 45 +- .../HTMLPurifier/AttrDef/CSS/Percentage.php | 54 + .../AttrDef/CSS/TextDecoration.php | 20 +- .../library/HTMLPurifier/AttrDef/CSS/URI.php | 31 +- .../library/HTMLPurifier/AttrDef/Clone.php | 44 + .../library/HTMLPurifier/AttrDef/Enum.php | 28 +- .../HTMLPurifier/AttrDef/HTML/Bool.php | 51 + .../HTMLPurifier/AttrDef/HTML/Class.php | 22 +- .../HTMLPurifier/AttrDef/HTML/Color.php | 51 + .../HTMLPurifier/AttrDef/HTML/FrameTarget.php | 38 + .../library/HTMLPurifier/AttrDef/HTML/ID.php | 55 +- .../HTMLPurifier/AttrDef/HTML/Length.php | 56 + .../HTMLPurifier/AttrDef/HTML/LinkTypes.php | 43 +- .../HTMLPurifier/AttrDef/HTML/MultiLength.php | 60 + .../HTMLPurifier/AttrDef/HTML/Nmtokens.php | 40 +- .../HTMLPurifier/AttrDef/HTML/Pixels.php | 76 + .../library/HTMLPurifier/AttrDef/Integer.php | 56 +- .../library/HTMLPurifier/AttrDef/Lang.php | 39 +- .../library/HTMLPurifier/AttrDef/Switch.php | 27 +- .../library/HTMLPurifier/AttrDef/Text.php | 21 + .../library/HTMLPurifier/AttrDef/URI.php | 70 +- .../HTMLPurifier/AttrDef/URI/Email.php | 5 +- .../AttrDef/URI/Email/SimpleCheck.php | 14 +- .../library/HTMLPurifier/AttrDef/URI/Host.php | 55 +- .../library/HTMLPurifier/AttrDef/URI/IPv4.php | 28 +- .../library/HTMLPurifier/AttrDef/URI/IPv6.php | 89 + .../library/HTMLPurifier/AttrTransform.php | 28 +- .../HTMLPurifier/AttrTransform/Background.php | 21 +- .../HTMLPurifier/AttrTransform/BdoDir.php | 14 +- .../HTMLPurifier/AttrTransform/BgColor.php | 21 +- .../HTMLPurifier/AttrTransform/BoolToCSS.php | 47 + .../HTMLPurifier/AttrTransform/Border.php | 18 +- .../HTMLPurifier/AttrTransform/EnumToCSS.php | 68 + .../AttrTransform/ImgRequired.php | 19 +- .../HTMLPurifier/AttrTransform/ImgSpace.php | 39 +- .../HTMLPurifier/AttrTransform/Input.php | 34 +- .../HTMLPurifier/AttrTransform/Lang.php | 15 +- .../HTMLPurifier/AttrTransform/Length.php | 45 + .../HTMLPurifier/AttrTransform/Name.php | 33 + .../HTMLPurifier/AttrTransform/NameSync.php | 41 + .../HTMLPurifier/AttrTransform/Nofollow.php | 19 +- .../HTMLPurifier/AttrTransform/SafeEmbed.php | 12 +- .../HTMLPurifier/AttrTransform/SafeObject.php | 28 + .../HTMLPurifier/AttrTransform/SafeParam.php | 19 +- .../AttrTransform/ScriptRequired.php | 9 +- .../AttrTransform/TargetBlank.php | 19 +- .../HTMLPurifier/AttrTransform/Textarea.php | 27 + .../library/HTMLPurifier/AttrTypes.php | 33 +- .../library/HTMLPurifier/AttrValidator.php | 66 +- .../library/HTMLPurifier/Bootstrap.php | 45 +- .../library/HTMLPurifier/CSSDefinition.php | 474 ++ .../library/HTMLPurifier/ChildDef.php | 26 +- .../HTMLPurifier/ChildDef/Chameleon.php | 33 +- .../library/HTMLPurifier/ChildDef/Custom.php | 60 +- .../library/HTMLPurifier/ChildDef/Empty.php | 22 +- .../library/HTMLPurifier/ChildDef/List.php | 86 + .../HTMLPurifier/ChildDef/Optional.php | 45 + .../HTMLPurifier/ChildDef/Required.php | 118 + .../ChildDef/StrictBlockquote.php | 110 + .../library/HTMLPurifier/ChildDef/Table.php | 224 + .../library/HTMLPurifier/Config.php | 475 +- .../library/HTMLPurifier/ConfigSchema.php | 70 +- .../ConfigSchema/Builder/ConfigSchema.php | 8 +- .../HTMLPurifier/ConfigSchema/Builder/Xml.php | 94 +- .../HTMLPurifier/ConfigSchema/Exception.php | 0 .../HTMLPurifier/ConfigSchema/Interchange.php | 11 +- .../ConfigSchema/Interchange/Directive.php | 28 +- .../ConfigSchema/Interchange/Id.php | 33 +- .../ConfigSchema/InterchangeBuilder.php | 90 +- .../HTMLPurifier/ConfigSchema/Validator.php | 90 +- .../ConfigSchema/ValidatorAtom.php | 130 + .../HTMLPurifier/ConfigSchema/schema.ser | Bin 0 -> 15000 bytes .../schema/Attr.AllowedClasses.txt | 0 .../schema/Attr.AllowedFrameTargets.txt | 0 .../ConfigSchema/schema/Attr.AllowedRel.txt | 0 .../ConfigSchema/schema/Attr.AllowedRev.txt | 0 .../schema/Attr.ClassUseCDATA.txt | 0 .../schema/Attr.DefaultImageAlt.txt | 0 .../schema/Attr.DefaultInvalidImage.txt | 0 .../schema/Attr.DefaultInvalidImageAlt.txt | 0 .../schema/Attr.DefaultTextDir.txt | 0 .../ConfigSchema/schema/Attr.EnableID.txt | 0 .../schema/Attr.ForbiddenClasses.txt | 0 .../ConfigSchema/schema/Attr.IDBlacklist.txt | 0 .../schema/Attr.IDBlacklistRegexp.txt | 0 .../ConfigSchema/schema/Attr.IDPrefix.txt | 0 .../schema/Attr.IDPrefixLocal.txt | 0 .../schema/AutoFormat.AutoParagraph.txt | 0 .../ConfigSchema/schema/AutoFormat.Custom.txt | 0 .../schema/AutoFormat.DisplayLinkURI.txt | 0 .../schema/AutoFormat.Linkify.txt | 0 .../AutoFormat.PurifierLinkify.DocURL.txt | 0 .../schema/AutoFormat.PurifierLinkify.txt | 0 ...rmat.RemoveEmpty.RemoveNbsp.Exceptions.txt | 0 .../AutoFormat.RemoveEmpty.RemoveNbsp.txt | 0 .../schema/AutoFormat.RemoveEmpty.txt | 0 ...utoFormat.RemoveSpansWithoutAttributes.txt | 0 .../schema/CSS.AllowImportant.txt | 0 .../ConfigSchema/schema/CSS.AllowTricky.txt | 0 .../ConfigSchema/schema/CSS.AllowedFonts.txt | 0 .../schema/CSS.AllowedProperties.txt | 0 .../ConfigSchema/schema/CSS.DefinitionRev.txt | 0 .../schema/CSS.ForbiddenProperties.txt | 0 .../ConfigSchema/schema/CSS.MaxImgLength.txt | 0 .../ConfigSchema/schema/CSS.Proprietary.txt | 0 .../ConfigSchema/schema/CSS.Trusted.txt | 0 .../schema/Cache.DefinitionImpl.txt | 0 .../schema/Cache.SerializerPath.txt | 0 .../schema/Cache.SerializerPermissions.txt | 0 .../schema/Core.AggressivelyFixLt.txt | 0 .../schema/Core.AllowHostnameUnderscore.txt | 16 + .../schema/Core.CollectErrors.txt | 0 .../schema/Core.ColorKeywords.txt | 0 .../schema/Core.ConvertDocumentToFragment.txt | 0 .../Core.DirectLexLineNumberSyncInterval.txt | 0 .../schema/Core.DisableExcludes.txt | 0 .../ConfigSchema/schema/Core.EnableIDNA.txt | 0 .../ConfigSchema/schema/Core.Encoding.txt | 0 .../schema/Core.EscapeInvalidChildren.txt | 6 +- .../schema/Core.EscapeInvalidTags.txt | 0 .../schema/Core.EscapeNonASCIICharacters.txt | 0 .../schema/Core.HiddenElements.txt | 0 .../ConfigSchema/schema/Core.Language.txt | 0 .../ConfigSchema/schema/Core.LexerImpl.txt | 0 .../schema/Core.MaintainLineNumbers.txt | 0 .../schema/Core.NormalizeNewlines.txt | 0 .../schema/Core.RemoveInvalidImg.txt | 0 .../Core.RemoveProcessingInstructions.txt | 0 .../schema/Core.RemoveScriptContents.txt | 0 .../ConfigSchema/schema/Filter.Custom.txt | 0 .../Filter.ExtractStyleBlocks.Escaping.txt | 0 .../Filter.ExtractStyleBlocks.Scope.txt | 0 .../Filter.ExtractStyleBlocks.TidyImpl.txt | 0 .../schema/Filter.ExtractStyleBlocks.txt | 0 .../ConfigSchema/schema/Filter.YouTube.txt | 0 .../ConfigSchema/schema/HTML.Allowed.txt | 0 .../schema/HTML.AllowedAttributes.txt | 0 .../schema/HTML.AllowedComments.txt | 0 .../schema/HTML.AllowedCommentsRegexp.txt | 0 .../schema/HTML.AllowedElements.txt | 0 .../schema/HTML.AllowedModules.txt | 0 .../schema/HTML.Attr.Name.UseCDATA.txt | 0 .../ConfigSchema/schema/HTML.BlockWrapper.txt | 0 .../ConfigSchema/schema/HTML.CoreModules.txt | 0 .../schema/HTML.CustomDoctype.txt | 0 .../ConfigSchema/schema/HTML.DefinitionID.txt | 0 .../schema/HTML.DefinitionRev.txt | 0 .../ConfigSchema/schema/HTML.Doctype.txt | 0 .../schema/HTML.FlashAllowFullScreen.txt | 0 .../schema/HTML.ForbiddenAttributes.txt | 0 .../schema/HTML.ForbiddenElements.txt | 0 .../ConfigSchema/schema/HTML.MaxImgLength.txt | 0 .../ConfigSchema/schema/HTML.Nofollow.txt | 0 .../ConfigSchema/schema/HTML.Parent.txt | 0 .../ConfigSchema/schema/HTML.Proprietary.txt | 0 .../ConfigSchema/schema/HTML.SafeEmbed.txt | 0 .../ConfigSchema/schema/HTML.SafeIframe.txt | 0 .../ConfigSchema/schema/HTML.SafeObject.txt | 0 .../schema/HTML.SafeScripting.txt | 0 .../ConfigSchema/schema/HTML.Strict.txt | 0 .../ConfigSchema/schema/HTML.TargetBlank.txt | 0 .../ConfigSchema/schema/HTML.TidyAdd.txt | 0 .../ConfigSchema/schema/HTML.TidyLevel.txt | 0 .../ConfigSchema/schema/HTML.TidyRemove.txt | 0 .../ConfigSchema/schema/HTML.Trusted.txt | 0 .../ConfigSchema/schema/HTML.XHTML.txt | 0 .../schema/Output.CommentScriptContents.txt | 0 .../schema/Output.FixInnerHTML.txt | 0 .../schema/Output.FlashCompat.txt | 0 .../ConfigSchema/schema/Output.Newline.txt | 0 .../ConfigSchema/schema/Output.SortAttr.txt | 0 .../ConfigSchema/schema/Output.TidyFormat.txt | 0 .../ConfigSchema/schema/Test.ForceNoIconv.txt | 0 .../schema/URI.AllowedSchemes.txt | 0 .../ConfigSchema/schema/URI.Base.txt | 0 .../ConfigSchema/schema/URI.DefaultScheme.txt | 0 .../ConfigSchema/schema/URI.DefinitionID.txt | 0 .../ConfigSchema/schema/URI.DefinitionRev.txt | 0 .../ConfigSchema/schema/URI.Disable.txt | 0 .../schema/URI.DisableExternal.txt | 0 .../schema/URI.DisableExternalResources.txt | 0 .../schema/URI.DisableResources.txt | 0 .../ConfigSchema/schema/URI.Host.txt | 0 .../ConfigSchema/schema/URI.HostBlacklist.txt | 0 .../ConfigSchema/schema/URI.MakeAbsolute.txt | 0 .../ConfigSchema/schema/URI.Munge.txt | 0 .../schema/URI.MungeResources.txt | 0 .../schema/URI.MungeSecretKey.txt | 2 +- .../schema/URI.OverrideAllowedSchemes.txt | 0 .../schema/URI.SafeIframeRegexp.txt | 0 .../HTMLPurifier/ConfigSchema/schema/info.ini | 0 .../library/HTMLPurifier/ContentSets.php | 55 +- .../library/HTMLPurifier/Context.php | 95 + .../library/HTMLPurifier/Definition.php | 15 +- .../library/HTMLPurifier/DefinitionCache.php | 57 +- .../DefinitionCache/Decorator.php | 112 + .../DefinitionCache/Decorator/Cleanup.php | 78 + .../DefinitionCache/Decorator/Memory.php | 85 + .../DefinitionCache/Decorator/Template.php.in | 82 + .../HTMLPurifier/DefinitionCache/Null.php | 76 + .../DefinitionCache/Serializer.php | 202 +- .../DefinitionCache/Serializer/README | 0 .../HTMLPurifier/DefinitionCacheFactory.php | 47 +- .../library/HTMLPurifier/Doctype.php | 17 +- .../library/HTMLPurifier/DoctypeRegistry.php | 87 +- .../library/HTMLPurifier/ElementDef.php | 69 +- .../library/HTMLPurifier/Encoder.php | 158 +- .../library/HTMLPurifier/EntityLookup.php | 16 +- .../HTMLPurifier/EntityLookup/entities.ser | 0 .../library/HTMLPurifier/EntityParser.php | 53 +- .../library/HTMLPurifier/ErrorCollector.php | 87 +- .../library/HTMLPurifier/ErrorStruct.php | 20 +- .../library/HTMLPurifier/Exception.php | 0 .../library/HTMLPurifier/Filter.php | 18 +- .../Filter/ExtractStyleBlocks.php | 91 +- .../library/HTMLPurifier/Filter/YouTube.php | 65 + .../library/HTMLPurifier/Generator.php | 110 +- .../library/HTMLPurifier/HTMLDefinition.php | 204 +- .../library/HTMLPurifier/HTMLModule.php | 122 +- .../library/HTMLPurifier/HTMLModule/Bdo.php | 19 +- .../HTMLModule/CommonAttributes.php | 7 +- .../library/HTMLPurifier/HTMLModule/Edit.php | 25 +- .../library/HTMLPurifier/HTMLModule/Forms.php | 190 + .../HTMLPurifier/HTMLModule/Hypertext.php | 15 +- .../HTMLPurifier/HTMLModule/Iframe.php | 19 +- .../library/HTMLPurifier/HTMLModule/Image.php | 17 +- .../HTMLPurifier/HTMLModule/Legacy.php | 73 +- .../library/HTMLPurifier/HTMLModule/List.php | 14 +- .../library/HTMLPurifier/HTMLModule/Name.php | 11 +- .../HTMLPurifier/HTMLModule/Nofollow.php | 10 +- .../HTMLModule/NonXMLCommonAttributes.php | 6 + .../HTMLPurifier/HTMLModule/Object.php | 31 +- .../HTMLPurifier/HTMLModule/Presentation.php | 26 +- .../HTMLPurifier/HTMLModule/Proprietary.php | 19 +- .../library/HTMLPurifier/HTMLModule/Ruby.php | 17 +- .../HTMLPurifier/HTMLModule/SafeEmbed.php | 18 +- .../HTMLPurifier/HTMLModule/SafeObject.php | 32 +- .../HTMLPurifier/HTMLModule/SafeScripting.php | 15 +- .../HTMLPurifier/HTMLModule/Scripting.php | 27 +- .../HTMLModule/StyleAttribute.php | 15 +- .../HTMLPurifier/HTMLModule/Tables.php | 28 +- .../HTMLPurifier/HTMLModule/Target.php | 11 +- .../HTMLPurifier/HTMLModule/TargetBlank.php | 11 +- .../library/HTMLPurifier/HTMLModule/Text.php | 56 +- .../library/HTMLPurifier/HTMLModule/Tidy.php | 85 +- .../HTMLPurifier/HTMLModule/Tidy/Name.php | 15 +- .../HTMLModule/Tidy/Proprietary.php | 14 +- .../HTMLPurifier/HTMLModule/Tidy/Strict.php | 43 + .../HTMLModule/Tidy/Transitional.php | 7 + .../HTMLPurifier/HTMLModule/Tidy/XHTML.php | 15 +- .../HTMLModule/Tidy/XHTMLAndHTML4.php | 146 +- .../HTMLModule/XMLCommonAttributes.php | 6 + .../HTMLPurifier/HTMLModuleManager.php | 137 +- .../library/HTMLPurifier/IDAccumulator.php | 24 +- .../library/HTMLPurifier/Injector.php | 194 +- .../HTMLPurifier/Injector/AutoParagraph.php | 99 +- .../HTMLPurifier/Injector/DisplayLinkURI.php | 22 +- .../library/HTMLPurifier/Injector/Linkify.php | 27 +- .../HTMLPurifier/Injector/PurifierLinkify.php | 46 +- .../HTMLPurifier/Injector/RemoveEmpty.php | 101 + .../Injector/RemoveSpansWithoutAttributes.php | 36 +- .../HTMLPurifier/Injector/SafeObject.php | 52 +- .../library/HTMLPurifier/Language.php | 97 +- .../Language/classes/en-x-test.php | 3 - .../Language/messages/en-x-test.php | 0 .../Language/messages/en-x-testmini.php | 0 .../HTMLPurifier/Language/messages/en.php | 55 + .../library/HTMLPurifier/LanguageFactory.php | 81 +- .../library/HTMLPurifier/Length.php | 91 +- .../library/HTMLPurifier/Lexer.php | 167 +- .../library/HTMLPurifier/Lexer/DOMLex.php | 115 +- .../library/HTMLPurifier/Lexer/DirectLex.php | 217 +- .../library/HTMLPurifier/Lexer/PH5P.php | 4788 +++++++++++++++++ .../library/HTMLPurifier/Node.php | 49 + .../library/HTMLPurifier/Node/Comment.php | 36 + .../library/HTMLPurifier/Node/Element.php | 59 + .../library/HTMLPurifier/Node/Text.php | 54 + .../library/HTMLPurifier/PercentEncoder.php | 37 +- .../library/HTMLPurifier/Printer.php | 134 +- .../HTMLPurifier/Printer/CSSDefinition.php | 12 +- .../HTMLPurifier/Printer/ConfigForm.css | 0 .../HTMLPurifier/Printer/ConfigForm.js | 0 .../HTMLPurifier/Printer/ConfigForm.php | 255 +- .../HTMLPurifier/Printer/HTMLDefinition.php | 208 +- .../library/HTMLPurifier/PropertyList.php | 68 +- .../HTMLPurifier/PropertyListIterator.php | 22 +- .../library/HTMLPurifier/Queue.php | 56 + .../library/HTMLPurifier/Strategy.php | 8 +- .../HTMLPurifier/Strategy/Composite.php | 11 +- .../library/HTMLPurifier/Strategy/Core.php | 5 +- .../HTMLPurifier/Strategy/FixNesting.php | 181 + .../HTMLPurifier/Strategy/MakeWellFormed.php | 312 +- .../Strategy/RemoveForeignElements.php | 67 +- .../Strategy/ValidateAttributes.php | 22 +- .../library/HTMLPurifier/StringHash.php | 16 +- .../library/HTMLPurifier/StringHashParser.php | 52 +- .../library/HTMLPurifier/TagTransform.php | 15 +- .../HTMLPurifier/TagTransform/Font.php | 36 +- .../HTMLPurifier/TagTransform/Simple.php | 21 +- .../library/HTMLPurifier/Token.php | 100 + .../library/HTMLPurifier/Token/Comment.php | 38 + .../library/HTMLPurifier/Token/Empty.php | 6 +- .../library/HTMLPurifier/Token/End.php | 9 +- .../library/HTMLPurifier/Token/Start.php | 1 - .../library/HTMLPurifier/Token/Tag.php | 21 +- .../library/HTMLPurifier/Token/Text.php | 34 +- .../library/HTMLPurifier/TokenFactory.php | 118 + .../library/HTMLPurifier/URI.php | 140 +- .../library/HTMLPurifier/URIDefinition.php | 27 +- .../library/HTMLPurifier/URIFilter.php | 25 +- .../URIFilter/DisableExternal.php | 54 + .../URIFilter/DisableExternalResources.php | 25 + .../URIFilter/DisableResources.php | 22 + .../HTMLPurifier/URIFilter/HostBlacklist.php | 27 +- .../HTMLPurifier/URIFilter/MakeAbsolute.php | 74 +- .../library/HTMLPurifier/URIFilter/Munge.php | 115 + .../HTMLPurifier/URIFilter/SafeIframe.php | 68 + .../library/HTMLPurifier/URIParser.php | 9 +- .../library/HTMLPurifier/URIScheme.php | 37 +- .../library/HTMLPurifier/URIScheme/data.php | 53 +- .../library/HTMLPurifier/URIScheme/file.php | 44 + .../library/HTMLPurifier/URIScheme/ftp.php | 28 +- .../library/HTMLPurifier/URIScheme/http.php | 25 +- .../library/HTMLPurifier/URIScheme/https.php | 11 +- .../library/HTMLPurifier/URIScheme/mailto.php | 21 +- .../library/HTMLPurifier/URIScheme/news.php | 35 + .../library/HTMLPurifier/URIScheme/nntp.php | 32 + .../HTMLPurifier/URISchemeRegistry.php | 41 +- .../library/HTMLPurifier/UnitConverter.php | 117 +- .../library/HTMLPurifier/VarParser.php | 198 + .../HTMLPurifier/VarParser/Flexible.php | 81 +- .../library/HTMLPurifier/VarParser/Native.php | 18 +- .../HTMLPurifier/VarParserException.php | 0 .../library/HTMLPurifier/Zipper.php | 157 + .../views/helpers/PluginOutput.php | 3 +- 422 files changed, 15547 insertions(+), 9858 deletions(-) delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Ident.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Length.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/ListStyle.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Percentage.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Clone.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/Bool.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/Color.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/Length.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/MultiLength.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/Pixels.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Text.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/URI/IPv6.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/BoolToCSS.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/EnumToCSS.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Length.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Name.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/NameSync.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/SafeObject.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Textarea.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/CSSDefinition.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/List.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Optional.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Required.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/StrictBlockquote.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Table.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema.ser delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Context.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCache/Decorator.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCache/Null.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Filter/YouTube.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/HTMLModule/Forms.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/HTMLModule/Tidy/Strict.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Injector/RemoveEmpty.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Language/messages/en.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Lexer/PH5P.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy/FixNesting.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token/Comment.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/TokenFactory.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/DisableExternal.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/DisableExternalResources.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/DisableResources.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/Munge.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/SafeIframe.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/file.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/news.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/nntp.php delete mode 100644 library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/VarParser.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/CREDITS (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/INSTALL (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/LICENSE (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/NEWS (97%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier.auto.php (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier.autoload.php (95%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier.composer.php (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier.func.php (67%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier.includes.php (97%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier.kses.php (96%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier.path.php (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier.php (66%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier.safe-includes.php (97%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Arborize.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrCollections.php (74%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef.php (74%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/CSS.php (77%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/CSS/Background.php (65%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php (73%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/CSS/Border.php (71%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/CSS/Color.php (54%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/CSS/Composite.php (61%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/CSS/Filter.php (62%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/CSS/Font.php (67%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/CSS/FontFamily.php (90%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Ident.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php (62%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Length.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/ListStyle.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/CSS/Multiple.php (67%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/CSS/Number.php (55%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Percentage.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php (69%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/CSS/URI.php (76%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Clone.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/Enum.php (70%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/Bool.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/HTML/Class.php (66%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/Color.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/HTML/ID.php (63%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/Length.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php (56%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/MultiLength.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php (55%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/Pixels.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/Integer.php (55%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/Lang.php (67%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/Switch.php (62%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Text.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/URI.php (55%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/URI/Email.php (73%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php (65%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/URI/Host.php (65%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrDef/URI/IPv4.php (51%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/URI/IPv6.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrTransform.php (63%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrTransform/Background.php (55%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrTransform/BdoDir.php (55%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrTransform/BgColor.php (55%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/BoolToCSS.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrTransform/Border.php (55%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/EnumToCSS.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrTransform/ImgRequired.php (77%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrTransform/ImgSpace.php (60%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrTransform/Input.php (61%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrTransform/Lang.php (68%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Length.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Name.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/NameSync.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrTransform/Nofollow.php (76%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrTransform/SafeEmbed.php (56%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/SafeObject.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrTransform/SafeParam.php (86%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrTransform/ScriptRequired.php (59%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrTransform/TargetBlank.php (72%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Textarea.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrTypes.php (83%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/AttrValidator.php (74%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Bootstrap.php (77%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/CSSDefinition.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ChildDef.php (52%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ChildDef/Chameleon.php (57%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ChildDef/Custom.php (71%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ChildDef/Empty.php (58%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/List.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Optional.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Required.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/StrictBlockquote.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Table.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Config.php (61%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema.php (75%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php (86%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/Builder/Xml.php (52%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/Exception.php (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/Interchange.php (76%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php (65%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/Interchange/Id.php (54%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php (67%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/Validator.php (73%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema.ser rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt (100%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt (62%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt (93%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ConfigSchema/schema/info.ini (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ContentSets.php (76%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Context.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Definition.php (82%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/DefinitionCache.php (66%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCache/Decorator.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCache/Null.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/DefinitionCache/Serializer.php (51%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/DefinitionCache/Serializer/README (100%) mode change 100644 => 100755 rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/DefinitionCacheFactory.php (67%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Doctype.php (77%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/DoctypeRegistry.php (51%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ElementDef.php (83%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Encoder.php (85%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/EntityLookup.php (75%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/EntityLookup/entities.ser (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/EntityParser.php (75%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ErrorCollector.php (82%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/ErrorStruct.php (81%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Exception.php (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Filter.php (71%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Filter/ExtractStyleBlocks.php (87%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Filter/YouTube.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Generator.php (76%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLDefinition.php (71%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule.php (71%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Bdo.php (73%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/CommonAttributes.php (89%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Edit.php (71%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/HTMLModule/Forms.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Hypertext.php (78%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Iframe.php (78%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Image.php (80%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Legacy.php (78%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/List.php (91%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Name.php (79%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Nofollow.php (73%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php (79%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Object.php (71%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Presentation.php (52%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Proprietary.php (74%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Ruby.php (77%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/SafeEmbed.php (79%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/SafeObject.php (67%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/SafeScripting.php (80%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Scripting.php (80%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/StyleAttribute.php (78%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Tables.php (79%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Target.php (77%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/TargetBlank.php (74%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Text.php (58%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Tidy.php (78%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Tidy/Name.php (80%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php (85%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/HTMLModule/Tidy/Strict.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php (74%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php (66%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php (50%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php (79%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/HTMLModuleManager.php (82%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/IDAccumulator.php (66%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Injector.php (55%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Injector/AutoParagraph.php (88%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Injector/DisplayLinkURI.php (64%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Injector/Linkify.php (72%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Injector/PurifierLinkify.php (58%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Injector/RemoveEmpty.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php (74%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Injector/SafeObject.php (80%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Language.php (67%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Language/classes/en-x-test.php (97%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Language/messages/en-x-test.php (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Language/messages/en-x-testmini.php (100%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Language/messages/en.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/LanguageFactory.php (75%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Length.php (56%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Lexer.php (68%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Lexer/DOMLex.php (71%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Lexer/DirectLex.php (76%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Lexer/PH5P.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Node.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Node/Comment.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Node/Element.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Node/Text.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/PercentEncoder.php (78%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Printer.php (54%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Printer/CSSDefinition.php (85%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Printer/ConfigForm.css (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Printer/ConfigForm.js (100%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Printer/ConfigForm.php (60%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Printer/HTMLDefinition.php (53%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/PropertyList.php (50%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/PropertyListIterator.php (60%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Queue.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Strategy.php (66%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Strategy/Composite.php (61%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Strategy/Core.php (92%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy/FixNesting.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Strategy/MakeWellFormed.php (69%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Strategy/RemoveForeignElements.php (76%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Strategy/ValidateAttributes.php (65%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/StringHash.php (75%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/StringHashParser.php (73%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/TagTransform.php (62%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/TagTransform/Font.php (76%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/TagTransform/Simple.php (61%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token/Comment.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Token/Empty.php (54%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Token/End.php (58%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Token/Start.php (99%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Token/Tag.php (74%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/Token/Text.php (54%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/TokenFactory.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/URI.php (73%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/URIDefinition.php (85%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/URIFilter.php (77%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/DisableExternal.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/DisableExternalResources.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/DisableResources.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/URIFilter/HostBlacklist.php (58%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/URIFilter/MakeAbsolute.php (71%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/Munge.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/SafeIframe.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/URIParser.php (94%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/URIScheme.php (74%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/URIScheme/data.php (78%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/file.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/URIScheme/ftp.php (74%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/URIScheme/http.php (50%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/URIScheme/https.php (74%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/URIScheme/mailto.php (67%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/news.php create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/nntp.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/URISchemeRegistry.php (58%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/UnitConverter.php (75%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/VarParser.php rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/VarParser/Flexible.php (63%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/VarParser/Native.php (67%) rename library/vendor/{htmlpurifier-4.5.0-lite => htmlpurifier-4.6.0-lite}/library/HTMLPurifier/VarParserException.php (100%) create mode 100644 library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Zipper.php diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php deleted file mode 100644 index 292c040d4..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php +++ /dev/null @@ -1,21 +0,0 @@ - 1.0) $result = '1'; - return $result; - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php deleted file mode 100644 index 6599c5b2d..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php +++ /dev/null @@ -1,28 +0,0 @@ -def = $def; - $this->element = $element; - } - /** - * Checks if CurrentToken is set and equal to $this->element - */ - public function validate($string, $config, $context) { - $token = $context->get('CurrentToken', true); - if ($token && $token->name == $this->element) return false; - return $this->def->validate($string, $config, $context); - } -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Ident.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Ident.php deleted file mode 100644 index 779794a0b..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Ident.php +++ /dev/null @@ -1,24 +0,0 @@ -min = $min !== null ? HTMLPurifier_Length::make($min) : null; - $this->max = $max !== null ? HTMLPurifier_Length::make($max) : null; - } - - public function validate($string, $config, $context) { - $string = $this->parseCDATA($string); - - // Optimizations - if ($string === '') return false; - if ($string === '0') return '0'; - if (strlen($string) === 1) return false; - - $length = HTMLPurifier_Length::make($string); - if (!$length->isValid()) return false; - - if ($this->min) { - $c = $length->compareTo($this->min); - if ($c === false) return false; - if ($c < 0) return false; - } - if ($this->max) { - $c = $length->compareTo($this->max); - if ($c === false) return false; - if ($c > 0) return false; - } - - return $length->toString(); - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/ListStyle.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/ListStyle.php deleted file mode 100644 index 4406868c0..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/ListStyle.php +++ /dev/null @@ -1,78 +0,0 @@ -getCSSDefinition(); - $this->info['list-style-type'] = $def->info['list-style-type']; - $this->info['list-style-position'] = $def->info['list-style-position']; - $this->info['list-style-image'] = $def->info['list-style-image']; - } - - public function validate($string, $config, $context) { - - // regular pre-processing - $string = $this->parseCDATA($string); - if ($string === '') return false; - - // assumes URI doesn't have spaces in it - $bits = explode(' ', strtolower($string)); // bits to process - - $caught = array(); - $caught['type'] = false; - $caught['position'] = false; - $caught['image'] = false; - - $i = 0; // number of catches - $none = false; - - foreach ($bits as $bit) { - if ($i >= 3) return; // optimization bit - if ($bit === '') continue; - foreach ($caught as $key => $status) { - if ($status !== false) continue; - $r = $this->info['list-style-' . $key]->validate($bit, $config, $context); - if ($r === false) continue; - if ($r === 'none') { - if ($none) continue; - else $none = true; - if ($key == 'image') continue; - } - $caught[$key] = $r; - $i++; - break; - } - } - - if (!$i) return false; - - $ret = array(); - - // construct type - if ($caught['type']) $ret[] = $caught['type']; - - // construct image - if ($caught['image']) $ret[] = $caught['image']; - - // construct position - if ($caught['position']) $ret[] = $caught['position']; - - if (empty($ret)) return false; - return implode(' ', $ret); - - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Percentage.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Percentage.php deleted file mode 100644 index c34b8fc3c..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Percentage.php +++ /dev/null @@ -1,40 +0,0 @@ -number_def = new HTMLPurifier_AttrDef_CSS_Number($non_negative); - } - - public function validate($string, $config, $context) { - - $string = $this->parseCDATA($string); - - if ($string === '') return false; - $length = strlen($string); - if ($length === 1) return false; - if ($string[$length - 1] !== '%') return false; - - $number = substr($string, 0, $length - 1); - $number = $this->number_def->validate($number, $config, $context); - - if ($number === false) return false; - return "$number%"; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Clone.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Clone.php deleted file mode 100644 index ce68dbd54..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Clone.php +++ /dev/null @@ -1,28 +0,0 @@ -clone = $clone; - } - - public function validate($v, $config, $context) { - return $this->clone->validate($v, $config, $context); - } - - public function make($string) { - return clone $this->clone; - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/Bool.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/Bool.php deleted file mode 100644 index e06987eb8..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/Bool.php +++ /dev/null @@ -1,28 +0,0 @@ -name = $name;} - - public function validate($string, $config, $context) { - if (empty($string)) return false; - return $this->name; - } - - /** - * @param $string Name of attribute - */ - public function make($string) { - return new HTMLPurifier_AttrDef_HTML_Bool($string); - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/Color.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/Color.php deleted file mode 100644 index e02abb075..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/Color.php +++ /dev/null @@ -1,33 +0,0 @@ -get('Core.ColorKeywords'); - - $string = trim($string); - - if (empty($string)) return false; - $lower = strtolower($string); - if (isset($colors[$lower])) return $colors[$lower]; - if ($string[0] === '#') $hex = substr($string, 1); - else $hex = $string; - - $length = strlen($hex); - if ($length !== 3 && $length !== 6) return false; - if (!ctype_xdigit($hex)) return false; - if ($length === 3) $hex = $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2]; - - return "#$hex"; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php deleted file mode 100644 index ae6ea7c01..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php +++ /dev/null @@ -1,21 +0,0 @@ -valid_values === false) $this->valid_values = $config->get('Attr.AllowedFrameTargets'); - return parent::validate($string, $config, $context); - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/Length.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/Length.php deleted file mode 100644 index a242f9c23..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/Length.php +++ /dev/null @@ -1,41 +0,0 @@ - 100) return '100%'; - - return ((string) $points) . '%'; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/MultiLength.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/MultiLength.php deleted file mode 100644 index c72fc76e4..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/MultiLength.php +++ /dev/null @@ -1,41 +0,0 @@ -max = $max; - } - - public function validate($string, $config, $context) { - - $string = trim($string); - if ($string === '0') return $string; - if ($string === '') return false; - $length = strlen($string); - if (substr($string, $length - 2) == 'px') { - $string = substr($string, 0, $length - 2); - } - if (!is_numeric($string)) return false; - $int = (int) $string; - - if ($int < 0) return '0'; - - // upper-bound value, extremely high values can - // crash operating systems, see - // WARNING, above link WILL crash you if you're using Windows - - if ($this->max !== null && $int > $this->max) return (string) $this->max; - - return (string) $int; - - } - - public function make($string) { - if ($string === '') $max = null; - else $max = (int) $string; - $class = get_class($this); - return new $class($max); - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Text.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Text.php deleted file mode 100644 index c6216cc53..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Text.php +++ /dev/null @@ -1,15 +0,0 @@ -parseCDATA($string); - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/URI/IPv6.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/URI/IPv6.php deleted file mode 100644 index 9454e9be5..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/URI/IPv6.php +++ /dev/null @@ -1,99 +0,0 @@ -ip4) $this->_loadRegex(); - - $original = $aIP; - - $hex = '[0-9a-fA-F]'; - $blk = '(?:' . $hex . '{1,4})'; - $pre = '(?:/(?:12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))'; // /0 - /128 - - // prefix check - if (strpos($aIP, '/') !== false) - { - if (preg_match('#' . $pre . '$#s', $aIP, $find)) - { - $aIP = substr($aIP, 0, 0-strlen($find[0])); - unset($find); - } - else - { - return false; - } - } - - // IPv4-compatiblity check - if (preg_match('#(?<=:'.')' . $this->ip4 . '$#s', $aIP, $find)) - { - $aIP = substr($aIP, 0, 0-strlen($find[0])); - $ip = explode('.', $find[0]); - $ip = array_map('dechex', $ip); - $aIP .= $ip[0] . $ip[1] . ':' . $ip[2] . $ip[3]; - unset($find, $ip); - } - - // compression check - $aIP = explode('::', $aIP); - $c = count($aIP); - if ($c > 2) - { - return false; - } - elseif ($c == 2) - { - list($first, $second) = $aIP; - $first = explode(':', $first); - $second = explode(':', $second); - - if (count($first) + count($second) > 8) - { - return false; - } - - while(count($first) < 8) - { - array_push($first, '0'); - } - - array_splice($first, 8 - count($second), 8, $second); - $aIP = $first; - unset($first,$second); - } - else - { - $aIP = explode(':', $aIP[0]); - } - $c = count($aIP); - - if ($c != 8) - { - return false; - } - - // All the pieces should be 16-bit hex strings. Are they? - foreach ($aIP as $piece) - { - if (!preg_match('#^[0-9a-fA-F]{4}$#s', sprintf('%04s', $piece))) - { - return false; - } - } - - return $original; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/BoolToCSS.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/BoolToCSS.php deleted file mode 100644 index 51159b671..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/BoolToCSS.php +++ /dev/null @@ -1,36 +0,0 @@ -attr = $attr; - $this->css = $css; - } - - public function transform($attr, $config, $context) { - if (!isset($attr[$this->attr])) return $attr; - unset($attr[$this->attr]); - $this->prependCSS($attr, $this->css); - return $attr; - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/EnumToCSS.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/EnumToCSS.php deleted file mode 100644 index 2a5b4514a..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/EnumToCSS.php +++ /dev/null @@ -1,58 +0,0 @@ -attr = $attr; - $this->enumToCSS = $enum_to_css; - $this->caseSensitive = (bool) $case_sensitive; - } - - public function transform($attr, $config, $context) { - - if (!isset($attr[$this->attr])) return $attr; - - $value = trim($attr[$this->attr]); - unset($attr[$this->attr]); - - if (!$this->caseSensitive) $value = strtolower($value); - - if (!isset($this->enumToCSS[$value])) { - return $attr; - } - - $this->prependCSS($attr, $this->enumToCSS[$value]); - - return $attr; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Length.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Length.php deleted file mode 100644 index ea2f30473..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Length.php +++ /dev/null @@ -1,27 +0,0 @@ -name = $name; - $this->cssName = $css_name ? $css_name : $name; - } - - public function transform($attr, $config, $context) { - if (!isset($attr[$this->name])) return $attr; - $length = $this->confiscateAttr($attr, $this->name); - if(ctype_digit($length)) $length .= 'px'; - $this->prependCSS($attr, $this->cssName . ":$length;"); - return $attr; - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Name.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Name.php deleted file mode 100644 index 15315bc73..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Name.php +++ /dev/null @@ -1,21 +0,0 @@ -get('HTML.Attr.Name.UseCDATA')) return $attr; - if (!isset($attr['name'])) return $attr; - $id = $this->confiscateAttr($attr, 'name'); - if ( isset($attr['id'])) return $attr; - $attr['id'] = $id; - return $attr; - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/NameSync.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/NameSync.php deleted file mode 100644 index a95638c14..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/NameSync.php +++ /dev/null @@ -1,27 +0,0 @@ -idDef = new HTMLPurifier_AttrDef_HTML_ID(); - } - - public function transform($attr, $config, $context) { - if (!isset($attr['name'])) return $attr; - $name = $attr['name']; - if (isset($attr['id']) && $attr['id'] === $name) return $attr; - $result = $this->idDef->validate($name, $config, $context); - if ($result === false) unset($attr['name']); - else $attr['name'] = $result; - return $attr; - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/SafeObject.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/SafeObject.php deleted file mode 100644 index 1ed74898b..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/SafeObject.php +++ /dev/null @@ -1,16 +0,0 @@ - - */ -class HTMLPurifier_AttrTransform_Textarea extends HTMLPurifier_AttrTransform -{ - - public function transform($attr, $config, $context) { - // Calculated from Firefox - if (!isset($attr['cols'])) $attr['cols'] = '22'; - if (!isset($attr['rows'])) $attr['rows'] = '3'; - return $attr; - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/CSSDefinition.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/CSSDefinition.php deleted file mode 100644 index 8c4c3127b..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/CSSDefinition.php +++ /dev/null @@ -1,328 +0,0 @@ -info['text-align'] = new HTMLPurifier_AttrDef_Enum( - array('left', 'right', 'center', 'justify'), false); - - $border_style = - $this->info['border-bottom-style'] = - $this->info['border-right-style'] = - $this->info['border-left-style'] = - $this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum( - array('none', 'hidden', 'dotted', 'dashed', 'solid', 'double', - 'groove', 'ridge', 'inset', 'outset'), false); - - $this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style); - - $this->info['clear'] = new HTMLPurifier_AttrDef_Enum( - array('none', 'left', 'right', 'both'), false); - $this->info['float'] = new HTMLPurifier_AttrDef_Enum( - array('none', 'left', 'right'), false); - $this->info['font-style'] = new HTMLPurifier_AttrDef_Enum( - array('normal', 'italic', 'oblique'), false); - $this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum( - array('normal', 'small-caps'), false); - - $uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_Enum(array('none')), - new HTMLPurifier_AttrDef_CSS_URI() - ) - ); - - $this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum( - array('inside', 'outside'), false); - $this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum( - array('disc', 'circle', 'square', 'decimal', 'lower-roman', - 'upper-roman', 'lower-alpha', 'upper-alpha', 'none'), false); - $this->info['list-style-image'] = $uri_or_none; - - $this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config); - - $this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum( - array('capitalize', 'uppercase', 'lowercase', 'none'), false); - $this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color(); - - $this->info['background-image'] = $uri_or_none; - $this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum( - array('repeat', 'repeat-x', 'repeat-y', 'no-repeat') - ); - $this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum( - array('scroll', 'fixed') - ); - $this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition(); - - $border_color = - $this->info['border-top-color'] = - $this->info['border-bottom-color'] = - $this->info['border-left-color'] = - $this->info['border-right-color'] = - $this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('transparent')), - new HTMLPurifier_AttrDef_CSS_Color() - )); - - $this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config); - - $this->info['border-color'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_color); - - $border_width = - $this->info['border-top-width'] = - $this->info['border-bottom-width'] = - $this->info['border-left-width'] = - $this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('thin', 'medium', 'thick')), - new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative - )); - - $this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width); - - $this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('normal')), - new HTMLPurifier_AttrDef_CSS_Length() - )); - - $this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('normal')), - new HTMLPurifier_AttrDef_CSS_Length() - )); - - $this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('xx-small', 'x-small', - 'small', 'medium', 'large', 'x-large', 'xx-large', - 'larger', 'smaller')), - new HTMLPurifier_AttrDef_CSS_Percentage(), - new HTMLPurifier_AttrDef_CSS_Length() - )); - - $this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('normal')), - new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives - new HTMLPurifier_AttrDef_CSS_Length('0'), - new HTMLPurifier_AttrDef_CSS_Percentage(true) - )); - - $margin = - $this->info['margin-top'] = - $this->info['margin-bottom'] = - $this->info['margin-left'] = - $this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_CSS_Length(), - new HTMLPurifier_AttrDef_CSS_Percentage(), - new HTMLPurifier_AttrDef_Enum(array('auto')) - )); - - $this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin); - - // non-negative - $padding = - $this->info['padding-top'] = - $this->info['padding-bottom'] = - $this->info['padding-left'] = - $this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_CSS_Length('0'), - new HTMLPurifier_AttrDef_CSS_Percentage(true) - )); - - $this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding); - - $this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_CSS_Length(), - new HTMLPurifier_AttrDef_CSS_Percentage() - )); - - $trusted_wh = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_CSS_Length('0'), - new HTMLPurifier_AttrDef_CSS_Percentage(true), - new HTMLPurifier_AttrDef_Enum(array('auto')) - )); - $max = $config->get('CSS.MaxImgLength'); - - $this->info['width'] = - $this->info['height'] = - $max === null ? - $trusted_wh : - new HTMLPurifier_AttrDef_Switch('img', - // For img tags: - new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_CSS_Length('0', $max), - new HTMLPurifier_AttrDef_Enum(array('auto')) - )), - // For everyone else: - $trusted_wh - ); - - $this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration(); - - $this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily(); - - // this could use specialized code - $this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum( - array('normal', 'bold', 'bolder', 'lighter', '100', '200', '300', - '400', '500', '600', '700', '800', '900'), false); - - // MUST be called after other font properties, as it references - // a CSSDefinition object - $this->info['font'] = new HTMLPurifier_AttrDef_CSS_Font($config); - - // same here - $this->info['border'] = - $this->info['border-bottom'] = - $this->info['border-top'] = - $this->info['border-left'] = - $this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config); - - $this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum(array( - 'collapse', 'separate')); - - $this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum(array( - 'top', 'bottom')); - - $this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum(array( - 'auto', 'fixed')); - - $this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('baseline', 'sub', 'super', - 'top', 'text-top', 'middle', 'bottom', 'text-bottom')), - new HTMLPurifier_AttrDef_CSS_Length(), - new HTMLPurifier_AttrDef_CSS_Percentage() - )); - - $this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2); - - // These CSS properties don't work on many browsers, but we live - // in THE FUTURE! - $this->info['white-space'] = new HTMLPurifier_AttrDef_Enum(array('nowrap', 'normal', 'pre', 'pre-wrap', 'pre-line')); - - if ($config->get('CSS.Proprietary')) { - $this->doSetupProprietary($config); - } - - if ($config->get('CSS.AllowTricky')) { - $this->doSetupTricky($config); - } - - if ($config->get('CSS.Trusted')) { - $this->doSetupTrusted($config); - } - - $allow_important = $config->get('CSS.AllowImportant'); - // wrap all attr-defs with decorator that handles !important - foreach ($this->info as $k => $v) { - $this->info[$k] = new HTMLPurifier_AttrDef_CSS_ImportantDecorator($v, $allow_important); - } - - $this->setupConfigStuff($config); - } - - protected function doSetupProprietary($config) { - // Internet Explorer only scrollbar colors - $this->info['scrollbar-arrow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-base-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-darkshadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-face-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-highlight-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-shadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - - // technically not proprietary, but CSS3, and no one supports it - $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); - $this->info['-moz-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); - $this->info['-khtml-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); - - // only opacity, for now - $this->info['filter'] = new HTMLPurifier_AttrDef_CSS_Filter(); - - // more CSS3 - $this->info['page-break-after'] = - $this->info['page-break-before'] = new HTMLPurifier_AttrDef_Enum(array('auto','always','avoid','left','right')); - $this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(array('auto','avoid')); - - } - - protected function doSetupTricky($config) { - $this->info['display'] = new HTMLPurifier_AttrDef_Enum(array( - 'inline', 'block', 'list-item', 'run-in', 'compact', - 'marker', 'table', 'inline-block', 'inline-table', 'table-row-group', - 'table-header-group', 'table-footer-group', 'table-row', - 'table-column-group', 'table-column', 'table-cell', 'table-caption', 'none' - )); - $this->info['visibility'] = new HTMLPurifier_AttrDef_Enum(array( - 'visible', 'hidden', 'collapse' - )); - $this->info['overflow'] = new HTMLPurifier_AttrDef_Enum(array('visible', 'hidden', 'auto', 'scroll')); - } - - protected function doSetupTrusted($config) { - $this->info['position'] = new HTMLPurifier_AttrDef_Enum(array( - 'static', 'relative', 'absolute', 'fixed' - )); - $this->info['top'] = - $this->info['left'] = - $this->info['right'] = - $this->info['bottom'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_CSS_Length(), - new HTMLPurifier_AttrDef_CSS_Percentage(), - new HTMLPurifier_AttrDef_Enum(array('auto')), - )); - $this->info['z-index'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Integer(), - new HTMLPurifier_AttrDef_Enum(array('auto')), - )); - } - - /** - * Performs extra config-based processing. Based off of - * HTMLPurifier_HTMLDefinition. - * @todo Refactor duplicate elements into common class (probably using - * composition, not inheritance). - */ - protected function setupConfigStuff($config) { - - // setup allowed elements - $support = "(for information on implementing this, see the ". - "support forums) "; - $allowed_properties = $config->get('CSS.AllowedProperties'); - if ($allowed_properties !== null) { - foreach ($this->info as $name => $d) { - if(!isset($allowed_properties[$name])) unset($this->info[$name]); - unset($allowed_properties[$name]); - } - // emit errors - foreach ($allowed_properties as $name => $d) { - // :TODO: Is this htmlspecialchars() call really necessary? - $name = htmlspecialchars($name); - trigger_error("Style attribute '$name' is not supported $support", E_USER_WARNING); - } - } - - $forbidden_properties = $config->get('CSS.ForbiddenProperties'); - if ($forbidden_properties !== null) { - foreach ($this->info as $name => $d) { - if (isset($forbidden_properties[$name])) { - unset($this->info[$name]); - } - } - } - - } -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/List.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/List.php deleted file mode 100644 index cdaa2893a..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/List.php +++ /dev/null @@ -1,120 +0,0 @@ - true, 'ul' => true, 'ol' => true); - public function validateChildren($tokens_of_children, $config, $context) { - // Flag for subclasses - $this->whitespace = false; - - // if there are no tokens, delete parent node - if (empty($tokens_of_children)) return false; - - // the new set of children - $result = array(); - - // current depth into the nest - $nesting = 0; - - // a little sanity check to make sure it's not ALL whitespace - $all_whitespace = true; - - $seen_li = false; - $need_close_li = false; - - foreach ($tokens_of_children as $token) { - if (!empty($token->is_whitespace)) { - $result[] = $token; - continue; - } - $all_whitespace = false; // phew, we're not talking about whitespace - - if ($nesting == 1 && $need_close_li) { - $result[] = new HTMLPurifier_Token_End('li'); - $nesting--; - $need_close_li = false; - } - - $is_child = ($nesting == 0); - - if ($token instanceof HTMLPurifier_Token_Start) { - $nesting++; - } elseif ($token instanceof HTMLPurifier_Token_End) { - $nesting--; - } - - if ($is_child) { - if ($token->name === 'li') { - // good - $seen_li = true; - } elseif ($token->name === 'ul' || $token->name === 'ol') { - // we want to tuck this into the previous li - $need_close_li = true; - $nesting++; - if (!$seen_li) { - // create a new li element - $result[] = new HTMLPurifier_Token_Start('li'); - } else { - // backtrack until found - while(true) { - $t = array_pop($result); - if ($t instanceof HTMLPurifier_Token_End) { - // XXX actually, these invariants could very plausibly be violated - // if we are doing silly things with modifying the set of allowed elements. - // FORTUNATELY, it doesn't make a difference, since the allowed - // elements are hard-coded here! - if ($t->name !== 'li') { - trigger_error("Only li present invariant violated in List ChildDef", E_USER_ERROR); - return false; - } - break; - } elseif ($t instanceof HTMLPurifier_Token_Empty) { // bleagh - if ($t->name !== 'li') { - trigger_error("Only li present invariant violated in List ChildDef", E_USER_ERROR); - return false; - } - // XXX this should have a helper for it... - $result[] = new HTMLPurifier_Token_Start('li', $t->attr, $t->line, $t->col, $t->armor); - break; - } else { - if (!$t->is_whitespace) { - trigger_error("Only whitespace present invariant violated in List ChildDef", E_USER_ERROR); - return false; - } - } - } - } - } else { - // start wrapping (this doesn't precisely mimic - // browser behavior, but what browsers do is kind of - // hard to mimic in a standards compliant way - // XXX Actually, this has no impact in practice, - // because this gets handled earlier. Arguably, - // we should rip out all of that processing - $result[] = new HTMLPurifier_Token_Start('li'); - $nesting++; - $seen_li = true; - $need_close_li = true; - } - } - $result[] = $token; - } - if ($need_close_li) { - $result[] = new HTMLPurifier_Token_End('li'); - } - if (empty($result)) return false; - if ($all_whitespace) { - return false; - } - if ($tokens_of_children == $result) return true; - return $result; - } -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Optional.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Optional.php deleted file mode 100644 index 32bcb9898..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Optional.php +++ /dev/null @@ -1,26 +0,0 @@ -whitespace) return $tokens_of_children; - else return array(); - } - return $result; - } -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Required.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Required.php deleted file mode 100644 index 4889f249b..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Required.php +++ /dev/null @@ -1,117 +0,0 @@ - $x) { - $elements[$i] = true; - if (empty($i)) unset($elements[$i]); // remove blank - } - } - $this->elements = $elements; - } - public $allow_empty = false; - public $type = 'required'; - public function validateChildren($tokens_of_children, $config, $context) { - // Flag for subclasses - $this->whitespace = false; - - // if there are no tokens, delete parent node - if (empty($tokens_of_children)) return false; - - // the new set of children - $result = array(); - - // current depth into the nest - $nesting = 0; - - // whether or not we're deleting a node - $is_deleting = false; - - // whether or not parsed character data is allowed - // this controls whether or not we silently drop a tag - // or generate escaped HTML from it - $pcdata_allowed = isset($this->elements['#PCDATA']); - - // a little sanity check to make sure it's not ALL whitespace - $all_whitespace = true; - - // some configuration - $escape_invalid_children = $config->get('Core.EscapeInvalidChildren'); - - // generator - $gen = new HTMLPurifier_Generator($config, $context); - - foreach ($tokens_of_children as $token) { - if (!empty($token->is_whitespace)) { - $result[] = $token; - continue; - } - $all_whitespace = false; // phew, we're not talking about whitespace - - $is_child = ($nesting == 0); - - if ($token instanceof HTMLPurifier_Token_Start) { - $nesting++; - } elseif ($token instanceof HTMLPurifier_Token_End) { - $nesting--; - } - - if ($is_child) { - $is_deleting = false; - if (!isset($this->elements[$token->name])) { - $is_deleting = true; - if ($pcdata_allowed && $token instanceof HTMLPurifier_Token_Text) { - $result[] = $token; - } elseif ($pcdata_allowed && $escape_invalid_children) { - $result[] = new HTMLPurifier_Token_Text( - $gen->generateFromToken($token) - ); - } - continue; - } - } - if (!$is_deleting || ($pcdata_allowed && $token instanceof HTMLPurifier_Token_Text)) { - $result[] = $token; - } elseif ($pcdata_allowed && $escape_invalid_children) { - $result[] = - new HTMLPurifier_Token_Text( - $gen->generateFromToken($token) - ); - } else { - // drop silently - } - } - if (empty($result)) return false; - if ($all_whitespace) { - $this->whitespace = true; - return false; - } - if ($tokens_of_children == $result) return true; - return $result; - } -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/StrictBlockquote.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/StrictBlockquote.php deleted file mode 100644 index dfae8a6e5..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/StrictBlockquote.php +++ /dev/null @@ -1,88 +0,0 @@ -init($config); - return $this->fake_elements; - } - - public function validateChildren($tokens_of_children, $config, $context) { - - $this->init($config); - - // trick the parent class into thinking it allows more - $this->elements = $this->fake_elements; - $result = parent::validateChildren($tokens_of_children, $config, $context); - $this->elements = $this->real_elements; - - if ($result === false) return array(); - if ($result === true) $result = $tokens_of_children; - - $def = $config->getHTMLDefinition(); - $block_wrap_start = new HTMLPurifier_Token_Start($def->info_block_wrapper); - $block_wrap_end = new HTMLPurifier_Token_End( $def->info_block_wrapper); - $is_inline = false; - $depth = 0; - $ret = array(); - - // assuming that there are no comment tokens - foreach ($result as $i => $token) { - $token = $result[$i]; - // ifs are nested for readability - if (!$is_inline) { - if (!$depth) { - if ( - ($token instanceof HTMLPurifier_Token_Text && !$token->is_whitespace) || - (!$token instanceof HTMLPurifier_Token_Text && !isset($this->elements[$token->name])) - ) { - $is_inline = true; - $ret[] = $block_wrap_start; - } - } - } else { - if (!$depth) { - // starting tokens have been inline text / empty - if ($token instanceof HTMLPurifier_Token_Start || $token instanceof HTMLPurifier_Token_Empty) { - if (isset($this->elements[$token->name])) { - // ended - $ret[] = $block_wrap_end; - $is_inline = false; - } - } - } - } - $ret[] = $token; - if ($token instanceof HTMLPurifier_Token_Start) $depth++; - if ($token instanceof HTMLPurifier_Token_End) $depth--; - } - if ($is_inline) $ret[] = $block_wrap_end; - return $ret; - } - - private function init($config) { - if (!$this->init) { - $def = $config->getHTMLDefinition(); - // allow all inline elements - $this->real_elements = $this->elements; - $this->fake_elements = $def->info_content_sets['Flow']; - $this->fake_elements['#PCDATA'] = true; - $this->init = true; - } - } -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Table.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Table.php deleted file mode 100644 index 9a93421a1..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Table.php +++ /dev/null @@ -1,227 +0,0 @@ - true, 'tbody' => true, 'thead' => true, - 'tfoot' => true, 'caption' => true, 'colgroup' => true, 'col' => true); - public function __construct() {} - public function validateChildren($tokens_of_children, $config, $context) { - if (empty($tokens_of_children)) return false; - - // this ensures that the loop gets run one last time before closing - // up. It's a little bit of a hack, but it works! Just make sure you - // get rid of the token later. - $tokens_of_children[] = false; - - // only one of these elements is allowed in a table - $caption = false; - $thead = false; - $tfoot = false; - - // as many of these as you want - $cols = array(); - $content = array(); - - $nesting = 0; // current depth so we can determine nodes - $is_collecting = false; // are we globbing together tokens to package - // into one of the collectors? - $collection = array(); // collected nodes - $tag_index = 0; // the first node might be whitespace, - // so this tells us where the start tag is - $tbody_mode = false; // if true, then we need to wrap any stray - // s with a . - - foreach ($tokens_of_children as $token) { - $is_child = ($nesting == 0); - - if ($token === false) { - // terminating sequence started - } elseif ($token instanceof HTMLPurifier_Token_Start) { - $nesting++; - } elseif ($token instanceof HTMLPurifier_Token_End) { - $nesting--; - } - - // handle node collection - if ($is_collecting) { - if ($is_child) { - // okay, let's stash the tokens away - // first token tells us the type of the collection - switch ($collection[$tag_index]->name) { - case 'tbody': - $tbody_mode = true; - case 'tr': - $content[] = $collection; - break; - case 'caption': - if ($caption !== false) break; - $caption = $collection; - break; - case 'thead': - case 'tfoot': - $tbody_mode = true; - // XXX This breaks rendering properties with - // Firefox, which never floats a to - // the top. Ever. (Our scheme will float the - // first to the top.) So maybe - // s that are not first should be - // turned into ? Very tricky, indeed. - - // access the appropriate variable, $thead or $tfoot - $var = $collection[$tag_index]->name; - if ($$var === false) { - $$var = $collection; - } else { - // Oops, there's a second one! What - // should we do? Current behavior is to - // transmutate the first and last entries into - // tbody tags, and then put into content. - // Maybe a better idea is to *attach - // it* to the existing thead or tfoot? - // We don't do this, because Firefox - // doesn't float an extra tfoot to the - // bottom like it does for the first one. - $collection[$tag_index]->name = 'tbody'; - $collection[count($collection)-1]->name = 'tbody'; - $content[] = $collection; - } - break; - case 'colgroup': - $cols[] = $collection; - break; - } - $collection = array(); - $is_collecting = false; - $tag_index = 0; - } else { - // add the node to the collection - $collection[] = $token; - } - } - - // terminate - if ($token === false) break; - - if ($is_child) { - // determine what we're dealing with - if ($token->name == 'col') { - // the only empty tag in the possie, we can handle it - // immediately - $cols[] = array_merge($collection, array($token)); - $collection = array(); - $tag_index = 0; - continue; - } - switch($token->name) { - case 'caption': - case 'colgroup': - case 'thead': - case 'tfoot': - case 'tbody': - case 'tr': - $is_collecting = true; - $collection[] = $token; - continue; - default: - if (!empty($token->is_whitespace)) { - $collection[] = $token; - $tag_index++; - } - continue; - } - } - } - - if (empty($content)) return false; - - $ret = array(); - if ($caption !== false) $ret = array_merge($ret, $caption); - if ($cols !== false) foreach ($cols as $token_array) $ret = array_merge($ret, $token_array); - if ($thead !== false) $ret = array_merge($ret, $thead); - if ($tfoot !== false) $ret = array_merge($ret, $tfoot); - - if ($tbody_mode) { - // a little tricky, since the start of the collection may be - // whitespace - $inside_tbody = false; - foreach ($content as $token_array) { - // find the starting token - foreach ($token_array as $t) { - if ($t->name === 'tr' || $t->name === 'tbody') { - break; - } - } // iterator variable carries over - if ($t->name === 'tr') { - if ($inside_tbody) { - $ret = array_merge($ret, $token_array); - } else { - $ret[] = new HTMLPurifier_Token_Start('tbody'); - $ret = array_merge($ret, $token_array); - $inside_tbody = true; - } - } elseif ($t->name === 'tbody') { - if ($inside_tbody) { - $ret[] = new HTMLPurifier_Token_End('tbody'); - $inside_tbody = false; - $ret = array_merge($ret, $token_array); - } else { - $ret = array_merge($ret, $token_array); - } - } else { - trigger_error("tr/tbody in content invariant failed in Table ChildDef", E_USER_ERROR); - } - } - if ($inside_tbody) { - $ret[] = new HTMLPurifier_Token_End('tbody'); - } - } else { - foreach ($content as $token_array) { - // invariant: everything in here is s - $ret = array_merge($ret, $token_array); - } - } - - if (!empty($collection) && $is_collecting == false){ - // grab the trailing space - $ret = array_merge($ret, $collection); - } - - array_pop($tokens_of_children); // remove phantom token - - return ($ret === $tokens_of_children) ? true : $ret; - - } -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php deleted file mode 100644 index b95aea18c..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php +++ /dev/null @@ -1,66 +0,0 @@ -context = $context; - $this->obj = $obj; - $this->member = $member; - $this->contents =& $obj->$member; - } - - public function assertIsString() { - if (!is_string($this->contents)) $this->error('must be a string'); - return $this; - } - - public function assertIsBool() { - if (!is_bool($this->contents)) $this->error('must be a boolean'); - return $this; - } - - public function assertIsArray() { - if (!is_array($this->contents)) $this->error('must be an array'); - return $this; - } - - public function assertNotNull() { - if ($this->contents === null) $this->error('must not be null'); - return $this; - } - - public function assertAlnum() { - $this->assertIsString(); - if (!ctype_alnum($this->contents)) $this->error('must be alphanumeric'); - return $this; - } - - public function assertNotEmpty() { - if (empty($this->contents)) $this->error('must not be empty'); - return $this; - } - - public function assertIsLookup() { - $this->assertIsArray(); - foreach ($this->contents as $v) { - if ($v !== true) $this->error('must be a lookup array'); - } - return $this; - } - - protected function error($msg) { - throw new HTMLPurifier_ConfigSchema_Exception(ucfirst($this->member) . ' in ' . $this->context . ' ' . $msg); - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema.ser b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema.ser deleted file mode 100644 index fa0bacb9476cab9e69889141969c6fefd2b4419c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14880 zcmeHOQEwZ`4Zfce_|TUEXIOU9(gN^jpc1tyXx*Lu^Zff@Aq-Y znbB%xB@gXGp#+JgC5OWyIUEl6^M~Q_o8iH)cUPA;t2%$kUH!*dRX*hN$@I}JvV-Bt z@M|-CH$0fRhip}}&B6O@I2gR;)4|WfgVVOH4^NAt`r>A1Mbv-8utQ=R)rY3E+)@gkeM)1vKY zX4LX?R^&5bI)LUF%pb>ZJ33P3oZ+}v+#+ia`SB*Jvw58@A8iGQjg;qX)wIS!BRp{rKLtAvV6;GTvr$!Y>&oUvlqQs$x>~xr&28^91W3jX$jh9jx^>vPxi=5I zM`8%@bhJgWO?{O;jTiGvSI%kDW(bW2$45s?iCQKPN}_-|cWqWj)m6c}8sX=}HL|;~ zx6d+UwnQ~pL_&N3+Qij4a>2iyY|`Vv9iQK1R77mRMT)G1>gq+_G(I-+;p?AI7!L@D zv#NH7r}KI3K>h5B=TZK2DL!Dth=<5=RuzStwik6>)$9IKYE}Q;J%6d{nZ%w?!?4LB ztE;M{fuPin?~eFKH$ctR`{$#PJ;#u$&Pt!KIAkJla6r%jMs#7V zoW@fyq|81e0{mjRRIdRD_r)raWz&O@{c9EU;$yED2(9ypkH(=OFA56ZGv%g}1Pe5I z@!1Cs2b~@9udW3NGAKq_l*Zh^0P~(LF|j)=lsN7$_P1ug@qF*2?FHO zJt5n<>(%1k)syFPIxbsR;~3*63xQ6_$gezLkh6-_EXfJnI;7kAbB&`@69V_ACrzta zUe37&u&>&OpWg8^bE#)&rrFZz0eJS97qgm<(SyvQ{vzeN%jO}jkCDm}IoDNrIyoDU z&mM82OtGB6$P-l;TEW(5IQ!`7&4w+BWSoqmkBQnPF?XM9{DFpoW4z zjt20z$cI^7?el?^F!KB=%gYx3qRlb6aM&WRc_1=zT)Qs?JR`cxVZcO0Yx-QS#zIaD zo;B4x19I7vIij48%ciYYQ$1+ZsOC1$JdstSUTeKQs1lbt$_v=TY!}j$~L5 zU~kr{R&hozq)*c$P`rd~meS9vMF=2YX)>hyIMTw2r$NdS!%)nQ7)_~H)ofMRd3X$; zcp|IiYZStVv0&9*hnyiS;*H->P~k-7Zi5$=^3zmgGzIAy68_g_h{-1sEUQ|BUQ#Ga zPm43^_sml|c?LUQO7W`1{o*Erjj3R!Yc01t~9)B{TF50SHNFL>OGFlY{wu_t`x|gtenKKk3>3XdY z;o-f`75#2JLHqS;1?3J(72T2|^C_;iTQ=XJdhiZt+g{Xy_Pdy|7 zV`(2&?Q+$kx{`h0&6=K%hm7)}HXE0vt5Y$IUL!N8AZwXL`(a5+)dN6-7wgdH6O`Qy zuwWmAypp&`f1^r?cdlt!Bv0LSHJ(-_fb~e;Y+{}Im#j&4E|t;Cu2+UGgdnemk7VW1>p`{YjVo2tMS%yd$XuU1lVTUHZpKH8X@!4{|!hqTqA?DuN$s3PqH z3dTC0p{*gkmk|T1DvN<>dpqh3NO-eI*)<0pQYw{p7=+ z-tln95OzAPLAj3n$%o`&5=wal_p^;8&;c0*^<-2B^Mi@sa$+>SgsjcT2>Stp^ny(@ zV@M!90iJ*!*P4)oM_@l5#So03q5{h218vx}9t?GWmH;eS#>b6VtC?Df6? zMN&_p6)9@10g>|I&-4XO0}MXy)J8bb(Vg$x9$7Z~X59IYoa3L{b8BQYu^?s0MOU5)2ba0pw(< z46h&(qISdu=cF9mf#ldIOW$x4VAGKp-Y~8Ukd&s=cV8V!zG9Z-__a5Hsi`lqXar-deClNhV{0YSP*GM)a}7esUfgY zg`Ljv5wO$15@=`j4-Zv1tXZgN(Uj-9ykbpnk+! zHc@!_WvCyu2IGlc2s=lJ`cV=?)sqbMlMjy>!wgU%qz#;i_EGbgpL*In%7J1dk<*9v zQB91oi}uk&#}tiF9-n6WP&^DaJNRYtUL+5=q+7u$5O?cUbIOX6rW>qT^+A{kIi((b>c-#Dj%<>}02Z&+;xpEaJ?3>e_`e)2Qo;iGU-Whj))u z$AAViJ&=Vwowu+K+)S5=<5yVL;bxjik@AJeRF(+0E10JVu0QnKRQGTpiRA?^Bt}Ju z$lyrTCLT|(O)OU@OypNl5F6=Til864O#M;fNM?_Vv53_rH>@|jgPH$cy*@k|yt)JW zxe;W#M~-li0j@kpL^{a<0`Ci~=+)rxXzS?6u|699GSa}S$Xnfx_M~?dFVkYOP(!W< zp2VGnX5dLfM!aV3-Y7H0@D?u-pQcfQ>?M;UV+%g56CZtbsp-q^q9W5&7!sNYieULUH&yA4T8$5 z6z~s22Wu_J@&{-$aM^$q-{%fdbo>nivyK9zbz zpY|;X&bP)uM@D~sg+mm#wgpe;rw(=F7Ot07Io>%-uX0;Kd}@v;Rgj?u;!`Rd*9Gxe z;(|jqaC|xnTdN1hr$mes`_qxwo%p4xU6%!B&>ngH%LQ)_OfW8%5HLN+0zk~i5iCKX z2lCk}A&w7`o%ySNhUJT!UWo~aZ*%1OFZ@V)!6ucFhU1I2kuHy3R=~2;HeE^mRzbQ= z=8FJ9KQBY8hn#@$ln=Wh;oG3A7!MHa*r9_F^aXoALeNj9Dl0_storage[$name])) { - trigger_error("Name $name produces collision, cannot re-register", - E_USER_ERROR); - return; - } - $this->_storage[$name] =& $ref; - } - - /** - * Retrieves a variable reference from the context. - * @param $name String name - * @param $ignore_error Boolean whether or not to ignore error - */ - public function &get($name, $ignore_error = false) { - if (!isset($this->_storage[$name])) { - if (!$ignore_error) { - trigger_error("Attempted to retrieve non-existent variable $name", - E_USER_ERROR); - } - $var = null; // so we can return by reference - return $var; - } - return $this->_storage[$name]; - } - - /** - * Destorys a variable in the context. - * @param $name String name - */ - public function destroy($name) { - if (!isset($this->_storage[$name])) { - trigger_error("Attempted to destroy non-existent variable $name", - E_USER_ERROR); - return; - } - unset($this->_storage[$name]); - } - - /** - * Checks whether or not the variable exists. - * @param $name String name - */ - public function exists($name) { - return isset($this->_storage[$name]); - } - - /** - * Loads a series of variables from an associative array - * @param $context_array Assoc array of variables to load - */ - public function loadArray($context_array) { - foreach ($context_array as $key => $discard) { - $this->register($key, $context_array[$key]); - } - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCache/Decorator.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCache/Decorator.php deleted file mode 100644 index b0fb6d0cd..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCache/Decorator.php +++ /dev/null @@ -1,62 +0,0 @@ -copy(); - // reference is necessary for mocks in PHP 4 - $decorator->cache =& $cache; - $decorator->type = $cache->type; - return $decorator; - } - - /** - * Cross-compatible clone substitute - */ - public function copy() { - return new HTMLPurifier_DefinitionCache_Decorator(); - } - - public function add($def, $config) { - return $this->cache->add($def, $config); - } - - public function set($def, $config) { - return $this->cache->set($def, $config); - } - - public function replace($def, $config) { - return $this->cache->replace($def, $config); - } - - public function get($config) { - return $this->cache->get($config); - } - - public function remove($config) { - return $this->cache->remove($config); - } - - public function flush($config) { - return $this->cache->flush($config); - } - - public function cleanup($config) { - return $this->cache->cleanup($config); - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php deleted file mode 100644 index d4cc35c4b..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php +++ /dev/null @@ -1,43 +0,0 @@ -definitions[$this->generateKey($config)] = $def; - return $status; - } - - public function set($def, $config) { - $status = parent::set($def, $config); - if ($status) $this->definitions[$this->generateKey($config)] = $def; - return $status; - } - - public function replace($def, $config) { - $status = parent::replace($def, $config); - if ($status) $this->definitions[$this->generateKey($config)] = $def; - return $status; - } - - public function get($config) { - $key = $this->generateKey($config); - if (isset($this->definitions[$key])) return $this->definitions[$key]; - $this->definitions[$key] = parent::get($config); - return $this->definitions[$key]; - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in deleted file mode 100644 index 21a8fcfda..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in +++ /dev/null @@ -1,47 +0,0 @@ -]+>.+?'. - 'http://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?#s'; - $pre_replace = '\1'; - return preg_replace($pre_regex, $pre_replace, $html); - } - - public function postFilter($html, $config, $context) { - $post_regex = '#((?:v|cp)/[A-Za-z0-9\-_=]+)#'; - return preg_replace_callback($post_regex, array($this, 'postFilterCallback'), $html); - } - - protected function armorUrl($url) { - return str_replace('--', '--', $url); - } - - protected function postFilterCallback($matches) { - $url = $this->armorUrl($matches[1]); - return ''. - ''. - ''. - ''; - - } -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/HTMLModule/Forms.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/HTMLModule/Forms.php deleted file mode 100644 index b963529a7..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/HTMLModule/Forms.php +++ /dev/null @@ -1,119 +0,0 @@ - 'Form', - 'Inline' => 'Formctrl', - ); - - public function setup($config) { - $form = $this->addElement('form', 'Form', - 'Required: Heading | List | Block | fieldset', 'Common', array( - 'accept' => 'ContentTypes', - 'accept-charset' => 'Charsets', - 'action*' => 'URI', - 'method' => 'Enum#get,post', - // really ContentType, but these two are the only ones used today - 'enctype' => 'Enum#application/x-www-form-urlencoded,multipart/form-data', - )); - $form->excludes = array('form' => true); - - $input = $this->addElement('input', 'Formctrl', 'Empty', 'Common', array( - 'accept' => 'ContentTypes', - 'accesskey' => 'Character', - 'alt' => 'Text', - 'checked' => 'Bool#checked', - 'disabled' => 'Bool#disabled', - 'maxlength' => 'Number', - 'name' => 'CDATA', - 'readonly' => 'Bool#readonly', - 'size' => 'Number', - 'src' => 'URI#embedded', - 'tabindex' => 'Number', - 'type' => 'Enum#text,password,checkbox,button,radio,submit,reset,file,hidden,image', - 'value' => 'CDATA', - )); - $input->attr_transform_post[] = new HTMLPurifier_AttrTransform_Input(); - - $this->addElement('select', 'Formctrl', 'Required: optgroup | option', 'Common', array( - 'disabled' => 'Bool#disabled', - 'multiple' => 'Bool#multiple', - 'name' => 'CDATA', - 'size' => 'Number', - 'tabindex' => 'Number', - )); - - $this->addElement('option', false, 'Optional: #PCDATA', 'Common', array( - 'disabled' => 'Bool#disabled', - 'label' => 'Text', - 'selected' => 'Bool#selected', - 'value' => 'CDATA', - )); - // It's illegal for there to be more than one selected, but not - // be multiple. Also, no selected means undefined behavior. This might - // be difficult to implement; perhaps an injector, or a context variable. - - $textarea = $this->addElement('textarea', 'Formctrl', 'Optional: #PCDATA', 'Common', array( - 'accesskey' => 'Character', - 'cols*' => 'Number', - 'disabled' => 'Bool#disabled', - 'name' => 'CDATA', - 'readonly' => 'Bool#readonly', - 'rows*' => 'Number', - 'tabindex' => 'Number', - )); - $textarea->attr_transform_pre[] = new HTMLPurifier_AttrTransform_Textarea(); - - $button = $this->addElement('button', 'Formctrl', 'Optional: #PCDATA | Heading | List | Block | Inline', 'Common', array( - 'accesskey' => 'Character', - 'disabled' => 'Bool#disabled', - 'name' => 'CDATA', - 'tabindex' => 'Number', - 'type' => 'Enum#button,submit,reset', - 'value' => 'CDATA', - )); - - // For exclusions, ideally we'd specify content sets, not literal elements - $button->excludes = $this->makeLookup( - 'form', 'fieldset', // Form - 'input', 'select', 'textarea', 'label', 'button', // Formctrl - 'a', // as per HTML 4.01 spec, this is omitted by modularization - 'isindex', 'iframe' // legacy items - ); - - // Extra exclusion: img usemap="" is not permitted within this element. - // We'll omit this for now, since we don't have any good way of - // indicating it yet. - - // This is HIGHLY user-unfriendly; we need a custom child-def for this - $this->addElement('fieldset', 'Form', 'Custom: (#WS?,legend,(Flow|#PCDATA)*)', 'Common'); - - $label = $this->addElement('label', 'Formctrl', 'Optional: #PCDATA | Inline', 'Common', array( - 'accesskey' => 'Character', - // 'for' => 'IDREF', // IDREF not implemented, cannot allow - )); - $label->excludes = array('label' => true); - - $this->addElement('legend', false, 'Optional: #PCDATA | Inline', 'Common', array( - 'accesskey' => 'Character', - )); - - $this->addElement('optgroup', false, 'Required: option', 'Common', array( - 'disabled' => 'Bool#disabled', - 'label*' => 'Text', - )); - - // Don't forget an injector for . This one's a little complex - // because it maps to multiple elements. - - } -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/HTMLModule/Tidy/Strict.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/HTMLModule/Tidy/Strict.php deleted file mode 100644 index c73dc3c4d..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/HTMLModule/Tidy/Strict.php +++ /dev/null @@ -1,21 +0,0 @@ -content_model_type != 'strictblockquote') return parent::getChildDef($def); - return new HTMLPurifier_ChildDef_StrictBlockquote($def->content_model); - } -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Injector/RemoveEmpty.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Injector/RemoveEmpty.php deleted file mode 100644 index 423f079eb..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Injector/RemoveEmpty.php +++ /dev/null @@ -1,54 +0,0 @@ - 1, 'th' => 1, 'td' => 1, 'iframe' => 1); - - public function prepare($config, $context) { - parent::prepare($config, $context); - $this->config = $config; - $this->context = $context; - $this->removeNbsp = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp'); - $this->removeNbspExceptions = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions'); - $this->attrValidator = new HTMLPurifier_AttrValidator(); - } - - public function handleElement(&$token) { - if (!$token instanceof HTMLPurifier_Token_Start) return; - $next = false; - for ($i = $this->inputIndex + 1, $c = count($this->inputTokens); $i < $c; $i++) { - $next = $this->inputTokens[$i]; - if ($next instanceof HTMLPurifier_Token_Text) { - if ($next->is_whitespace) continue; - if ($this->removeNbsp && !isset($this->removeNbspExceptions[$token->name])) { - $plain = str_replace("\xC2\xA0", "", $next->data); - $isWsOrNbsp = $plain === '' || ctype_space($plain); - if ($isWsOrNbsp) continue; - } - } - break; - } - if (!$next || ($next instanceof HTMLPurifier_Token_End && $next->name == $token->name)) { - if (isset($this->_exclude[$token->name])) return; - $this->attrValidator->validateToken($token, $this->config, $this->context); - $token->armor['ValidateAttributes'] = true; - if (isset($token->attr['id']) || isset($token->attr['name'])) return; - $token = $i - $this->inputIndex + 1; - for ($b = $this->inputIndex - 1; $b > 0; $b--) { - $prev = $this->inputTokens[$b]; - if ($prev instanceof HTMLPurifier_Token_Text && $prev->is_whitespace) continue; - break; - } - // This is safe because we removed the token that triggered this. - $this->rewind($b - 1); - return; - } - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Language/messages/en.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Language/messages/en.php deleted file mode 100644 index 8d7b5736b..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Language/messages/en.php +++ /dev/null @@ -1,63 +0,0 @@ - 'HTML Purifier', - -// for unit testing purposes -'LanguageFactoryTest: Pizza' => 'Pizza', -'LanguageTest: List' => '$1', -'LanguageTest: Hash' => '$1.Keys; $1.Values', - -'Item separator' => ', ', -'Item separator last' => ' and ', // non-Harvard style - -'ErrorCollector: No errors' => 'No errors detected. However, because error reporting is still incomplete, there may have been errors that the error collector was not notified of; please inspect the output HTML carefully.', -'ErrorCollector: At line' => ' at line $line', -'ErrorCollector: Incidental errors' => 'Incidental errors', - -'Lexer: Unclosed comment' => 'Unclosed comment', -'Lexer: Unescaped lt' => 'Unescaped less-than sign (<) should be <', -'Lexer: Missing gt' => 'Missing greater-than sign (>), previous less-than sign (<) should be escaped', -'Lexer: Missing attribute key' => 'Attribute declaration has no key', -'Lexer: Missing end quote' => 'Attribute declaration has no end quote', -'Lexer: Extracted body' => 'Removed document metadata tags', - -'Strategy_RemoveForeignElements: Tag transform' => '<$1> element transformed into $CurrentToken.Serialized', -'Strategy_RemoveForeignElements: Missing required attribute' => '$CurrentToken.Compact element missing required attribute $1', -'Strategy_RemoveForeignElements: Foreign element to text' => 'Unrecognized $CurrentToken.Serialized tag converted to text', -'Strategy_RemoveForeignElements: Foreign element removed' => 'Unrecognized $CurrentToken.Serialized tag removed', -'Strategy_RemoveForeignElements: Comment removed' => 'Comment containing "$CurrentToken.Data" removed', -'Strategy_RemoveForeignElements: Foreign meta element removed' => 'Unrecognized $CurrentToken.Serialized meta tag and all descendants removed', -'Strategy_RemoveForeignElements: Token removed to end' => 'Tags and text starting from $1 element where removed to end', -'Strategy_RemoveForeignElements: Trailing hyphen in comment removed' => 'Trailing hyphen(s) in comment removed', -'Strategy_RemoveForeignElements: Hyphens in comment collapsed' => 'Double hyphens in comments are not allowed, and were collapsed into single hyphens', - -'Strategy_MakeWellFormed: Unnecessary end tag removed' => 'Unnecessary $CurrentToken.Serialized tag removed', -'Strategy_MakeWellFormed: Unnecessary end tag to text' => 'Unnecessary $CurrentToken.Serialized tag converted to text', -'Strategy_MakeWellFormed: Tag auto closed' => '$1.Compact started on line $1.Line auto-closed by $CurrentToken.Compact', -'Strategy_MakeWellFormed: Tag carryover' => '$1.Compact started on line $1.Line auto-continued into $CurrentToken.Compact', -'Strategy_MakeWellFormed: Stray end tag removed' => 'Stray $CurrentToken.Serialized tag removed', -'Strategy_MakeWellFormed: Stray end tag to text' => 'Stray $CurrentToken.Serialized tag converted to text', -'Strategy_MakeWellFormed: Tag closed by element end' => '$1.Compact tag started on line $1.Line closed by end of $CurrentToken.Serialized', -'Strategy_MakeWellFormed: Tag closed by document end' => '$1.Compact tag started on line $1.Line closed by end of document', - -'Strategy_FixNesting: Node removed' => '$CurrentToken.Compact node removed', -'Strategy_FixNesting: Node excluded' => '$CurrentToken.Compact node removed due to descendant exclusion by ancestor element', -'Strategy_FixNesting: Node reorganized' => 'Contents of $CurrentToken.Compact node reorganized to enforce its content model', -'Strategy_FixNesting: Node contents removed' => 'Contents of $CurrentToken.Compact node removed', - -'AttrValidator: Attributes transformed' => 'Attributes on $CurrentToken.Compact transformed from $1.Keys to $2.Keys', -'AttrValidator: Attribute removed' => '$CurrentAttr.Name attribute on $CurrentToken.Compact removed', - -); - -$errorNames = array( - E_ERROR => 'Error', - E_WARNING => 'Warning', - E_NOTICE => 'Notice' -); - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Lexer/PH5P.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Lexer/PH5P.php deleted file mode 100644 index 811732260..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Lexer/PH5P.php +++ /dev/null @@ -1,3904 +0,0 @@ -normalize($html, $config, $context); - $new_html = $this->wrapHTML($new_html, $config, $context); - try { - $parser = new HTML5($new_html); - $doc = $parser->save(); - } catch (DOMException $e) { - // Uh oh, it failed. Punt to DirectLex. - $lexer = new HTMLPurifier_Lexer_DirectLex(); - $context->register('PH5PError', $e); // save the error, so we can detect it - return $lexer->tokenizeHTML($html, $config, $context); // use original HTML - } - $tokens = array(); - $this->tokenizeDOM( - $doc->getElementsByTagName('html')->item(0)-> // - getElementsByTagName('body')->item(0)-> // - getElementsByTagName('div')->item(0) //
- , $tokens); - return $tokens; - } - -} - -/* - -Copyright 2007 Jeroen van der Meer - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -*/ - -class HTML5 { - private $data; - private $char; - private $EOF; - private $state; - private $tree; - private $token; - private $content_model; - private $escape = false; - private $entities = array('AElig;','AElig','AMP;','AMP','Aacute;','Aacute', - 'Acirc;','Acirc','Agrave;','Agrave','Alpha;','Aring;','Aring','Atilde;', - 'Atilde','Auml;','Auml','Beta;','COPY;','COPY','Ccedil;','Ccedil','Chi;', - 'Dagger;','Delta;','ETH;','ETH','Eacute;','Eacute','Ecirc;','Ecirc','Egrave;', - 'Egrave','Epsilon;','Eta;','Euml;','Euml','GT;','GT','Gamma;','Iacute;', - 'Iacute','Icirc;','Icirc','Igrave;','Igrave','Iota;','Iuml;','Iuml','Kappa;', - 'LT;','LT','Lambda;','Mu;','Ntilde;','Ntilde','Nu;','OElig;','Oacute;', - 'Oacute','Ocirc;','Ocirc','Ograve;','Ograve','Omega;','Omicron;','Oslash;', - 'Oslash','Otilde;','Otilde','Ouml;','Ouml','Phi;','Pi;','Prime;','Psi;', - 'QUOT;','QUOT','REG;','REG','Rho;','Scaron;','Sigma;','THORN;','THORN', - 'TRADE;','Tau;','Theta;','Uacute;','Uacute','Ucirc;','Ucirc','Ugrave;', - 'Ugrave','Upsilon;','Uuml;','Uuml','Xi;','Yacute;','Yacute','Yuml;','Zeta;', - 'aacute;','aacute','acirc;','acirc','acute;','acute','aelig;','aelig', - 'agrave;','agrave','alefsym;','alpha;','amp;','amp','and;','ang;','apos;', - 'aring;','aring','asymp;','atilde;','atilde','auml;','auml','bdquo;','beta;', - 'brvbar;','brvbar','bull;','cap;','ccedil;','ccedil','cedil;','cedil', - 'cent;','cent','chi;','circ;','clubs;','cong;','copy;','copy','crarr;', - 'cup;','curren;','curren','dArr;','dagger;','darr;','deg;','deg','delta;', - 'diams;','divide;','divide','eacute;','eacute','ecirc;','ecirc','egrave;', - 'egrave','empty;','emsp;','ensp;','epsilon;','equiv;','eta;','eth;','eth', - 'euml;','euml','euro;','exist;','fnof;','forall;','frac12;','frac12', - 'frac14;','frac14','frac34;','frac34','frasl;','gamma;','ge;','gt;','gt', - 'hArr;','harr;','hearts;','hellip;','iacute;','iacute','icirc;','icirc', - 'iexcl;','iexcl','igrave;','igrave','image;','infin;','int;','iota;', - 'iquest;','iquest','isin;','iuml;','iuml','kappa;','lArr;','lambda;','lang;', - 'laquo;','laquo','larr;','lceil;','ldquo;','le;','lfloor;','lowast;','loz;', - 'lrm;','lsaquo;','lsquo;','lt;','lt','macr;','macr','mdash;','micro;','micro', - 'middot;','middot','minus;','mu;','nabla;','nbsp;','nbsp','ndash;','ne;', - 'ni;','not;','not','notin;','nsub;','ntilde;','ntilde','nu;','oacute;', - 'oacute','ocirc;','ocirc','oelig;','ograve;','ograve','oline;','omega;', - 'omicron;','oplus;','or;','ordf;','ordf','ordm;','ordm','oslash;','oslash', - 'otilde;','otilde','otimes;','ouml;','ouml','para;','para','part;','permil;', - 'perp;','phi;','pi;','piv;','plusmn;','plusmn','pound;','pound','prime;', - 'prod;','prop;','psi;','quot;','quot','rArr;','radic;','rang;','raquo;', - 'raquo','rarr;','rceil;','rdquo;','real;','reg;','reg','rfloor;','rho;', - 'rlm;','rsaquo;','rsquo;','sbquo;','scaron;','sdot;','sect;','sect','shy;', - 'shy','sigma;','sigmaf;','sim;','spades;','sub;','sube;','sum;','sup1;', - 'sup1','sup2;','sup2','sup3;','sup3','sup;','supe;','szlig;','szlig','tau;', - 'there4;','theta;','thetasym;','thinsp;','thorn;','thorn','tilde;','times;', - 'times','trade;','uArr;','uacute;','uacute','uarr;','ucirc;','ucirc', - 'ugrave;','ugrave','uml;','uml','upsih;','upsilon;','uuml;','uuml','weierp;', - 'xi;','yacute;','yacute','yen;','yen','yuml;','yuml','zeta;','zwj;','zwnj;'); - - const PCDATA = 0; - const RCDATA = 1; - const CDATA = 2; - const PLAINTEXT = 3; - - const DOCTYPE = 0; - const STARTTAG = 1; - const ENDTAG = 2; - const COMMENT = 3; - const CHARACTR = 4; - const EOF = 5; - - public function __construct($data) { - - $this->data = $data; - $this->char = -1; - $this->EOF = strlen($data); - $this->tree = new HTML5TreeConstructer; - $this->content_model = self::PCDATA; - - $this->state = 'data'; - - while($this->state !== null) { - $this->{$this->state.'State'}(); - } - } - - public function save() { - return $this->tree->save(); - } - - private function char() { - return ($this->char < $this->EOF) - ? $this->data[$this->char] - : false; - } - - private function character($s, $l = 0) { - if($s + $l < $this->EOF) { - if($l === 0) { - return $this->data[$s]; - } else { - return substr($this->data, $s, $l); - } - } - } - - private function characters($char_class, $start) { - return preg_replace('#^(['.$char_class.']+).*#s', '\\1', substr($this->data, $start)); - } - - private function dataState() { - // Consume the next input character - $this->char++; - $char = $this->char(); - - if($char === '&' && ($this->content_model === self::PCDATA || $this->content_model === self::RCDATA)) { - /* U+0026 AMPERSAND (&) - When the content model flag is set to one of the PCDATA or RCDATA - states: switch to the entity data state. Otherwise: treat it as per - the "anything else" entry below. */ - $this->state = 'entityData'; - - } elseif($char === '-') { - /* If the content model flag is set to either the RCDATA state or - the CDATA state, and the escape flag is false, and there are at - least three characters before this one in the input stream, and the - last four characters in the input stream, including this one, are - U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS, - and U+002D HYPHEN-MINUS (""), - set the escape flag to false. */ - if(($this->content_model === self::RCDATA || - $this->content_model === self::CDATA) && $this->escape === true && - $this->character($this->char, 3) === '-->') { - $this->escape = false; - } - - /* In any case, emit the input character as a character token. - Stay in the data state. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => $char - )); - - } elseif($this->char === $this->EOF) { - /* EOF - Emit an end-of-file token. */ - $this->EOF(); - - } elseif($this->content_model === self::PLAINTEXT) { - /* When the content model flag is set to the PLAINTEXT state - THIS DIFFERS GREATLY FROM THE SPEC: Get the remaining characters of - the text and emit it as a character token. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => substr($this->data, $this->char) - )); - - $this->EOF(); - - } else { - /* Anything else - THIS DIFFERS GREATLY FROM THE SPEC: Get as many character that - otherwise would also be treated as a character token and emit it - as a single character token. Stay in the data state. */ - $len = strcspn($this->data, '<&', $this->char); - $char = substr($this->data, $this->char, $len); - $this->char += $len - 1; - - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => $char - )); - - $this->state = 'data'; - } - } - - private function entityDataState() { - // Attempt to consume an entity. - $entity = $this->entity(); - - // If nothing is returned, emit a U+0026 AMPERSAND character token. - // Otherwise, emit the character token that was returned. - $char = (!$entity) ? '&' : $entity; - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => $char - )); - - // Finally, switch to the data state. - $this->state = 'data'; - } - - private function tagOpenState() { - switch($this->content_model) { - case self::RCDATA: - case self::CDATA: - /* If the next input character is a U+002F SOLIDUS (/) character, - consume it and switch to the close tag open state. If the next - input character is not a U+002F SOLIDUS (/) character, emit a - U+003C LESS-THAN SIGN character token and switch to the data - state to process the next input character. */ - if($this->character($this->char + 1) === '/') { - $this->char++; - $this->state = 'closeTagOpen'; - - } else { - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => '<' - )); - - $this->state = 'data'; - } - break; - - case self::PCDATA: - // If the content model flag is set to the PCDATA state - // Consume the next input character: - $this->char++; - $char = $this->char(); - - if($char === '!') { - /* U+0021 EXCLAMATION MARK (!) - Switch to the markup declaration open state. */ - $this->state = 'markupDeclarationOpen'; - - } elseif($char === '/') { - /* U+002F SOLIDUS (/) - Switch to the close tag open state. */ - $this->state = 'closeTagOpen'; - - } elseif(preg_match('/^[A-Za-z]$/', $char)) { - /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z - Create a new start tag token, set its tag name to the lowercase - version of the input character (add 0x0020 to the character's code - point), then switch to the tag name state. (Don't emit the token - yet; further details will be filled in before it is emitted.) */ - $this->token = array( - 'name' => strtolower($char), - 'type' => self::STARTTAG, - 'attr' => array() - ); - - $this->state = 'tagName'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Emit a U+003C LESS-THAN SIGN character token and a - U+003E GREATER-THAN SIGN character token. Switch to the data state. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => '<>' - )); - - $this->state = 'data'; - - } elseif($char === '?') { - /* U+003F QUESTION MARK (?) - Parse error. Switch to the bogus comment state. */ - $this->state = 'bogusComment'; - - } else { - /* Anything else - Parse error. Emit a U+003C LESS-THAN SIGN character token and - reconsume the current input character in the data state. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => '<' - )); - - $this->char--; - $this->state = 'data'; - } - break; - } - } - - private function closeTagOpenState() { - $next_node = strtolower($this->characters('A-Za-z', $this->char + 1)); - $the_same = count($this->tree->stack) > 0 && $next_node === end($this->tree->stack)->nodeName; - - if(($this->content_model === self::RCDATA || $this->content_model === self::CDATA) && - (!$the_same || ($the_same && (!preg_match('/[\t\n\x0b\x0c >\/]/', - $this->character($this->char + 1 + strlen($next_node))) || $this->EOF === $this->char)))) { - /* If the content model flag is set to the RCDATA or CDATA states then - examine the next few characters. If they do not match the tag name of - the last start tag token emitted (case insensitively), or if they do but - they are not immediately followed by one of the following characters: - * U+0009 CHARACTER TABULATION - * U+000A LINE FEED (LF) - * U+000B LINE TABULATION - * U+000C FORM FEED (FF) - * U+0020 SPACE - * U+003E GREATER-THAN SIGN (>) - * U+002F SOLIDUS (/) - * EOF - ...then there is a parse error. Emit a U+003C LESS-THAN SIGN character - token, a U+002F SOLIDUS character token, and switch to the data state - to process the next input character. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => 'state = 'data'; - - } else { - /* Otherwise, if the content model flag is set to the PCDATA state, - or if the next few characters do match that tag name, consume the - next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[A-Za-z]$/', $char)) { - /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z - Create a new end tag token, set its tag name to the lowercase version - of the input character (add 0x0020 to the character's code point), then - switch to the tag name state. (Don't emit the token yet; further details - will be filled in before it is emitted.) */ - $this->token = array( - 'name' => strtolower($char), - 'type' => self::ENDTAG - ); - - $this->state = 'tagName'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Switch to the data state. */ - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F - SOLIDUS character token. Reconsume the EOF character in the data state. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => 'char--; - $this->state = 'data'; - - } else { - /* Parse error. Switch to the bogus comment state. */ - $this->state = 'bogusComment'; - } - } - } - - private function tagNameState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } elseif($char === '/') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Switch to the before - attribute name state. */ - $this->state = 'beforeAttributeName'; - - } else { - /* Anything else - Append the current input character to the current tag token's tag name. - Stay in the tag name state. */ - $this->token['name'] .= strtolower($char); - $this->state = 'tagName'; - } - } - - private function beforeAttributeNameState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($char === '/') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Stay in the before - attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Start a new attribute in the current tag token. Set that attribute's - name to the current input character, and its value to the empty string. - Switch to the attribute name state. */ - $this->token['attr'][] = array( - 'name' => strtolower($char), - 'value' => null - ); - - $this->state = 'attributeName'; - } - } - - private function attributeNameState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before attribute name state. */ - $this->state = 'afterAttributeName'; - - } elseif($char === '=') { - /* U+003D EQUALS SIGN (=) - Switch to the before attribute value state. */ - $this->state = 'beforeAttributeValue'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($char === '/' && $this->character($this->char + 1) !== '>') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Switch to the before - attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's name. - Stay in the attribute name state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['name'] .= strtolower($char); - - $this->state = 'attributeName'; - } - } - - private function afterAttributeNameState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the after attribute name state. */ - $this->state = 'afterAttributeName'; - - } elseif($char === '=') { - /* U+003D EQUALS SIGN (=) - Switch to the before attribute value state. */ - $this->state = 'beforeAttributeValue'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($char === '/' && $this->character($this->char + 1) !== '>') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Switch to the - before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Start a new attribute in the current tag token. Set that attribute's - name to the current input character, and its value to the empty string. - Switch to the attribute name state. */ - $this->token['attr'][] = array( - 'name' => strtolower($char), - 'value' => null - ); - - $this->state = 'attributeName'; - } - } - - private function beforeAttributeValueState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before attribute value state. */ - $this->state = 'beforeAttributeValue'; - - } elseif($char === '"') { - /* U+0022 QUOTATION MARK (") - Switch to the attribute value (double-quoted) state. */ - $this->state = 'attributeValueDoubleQuoted'; - - } elseif($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the attribute value (unquoted) state and reconsume - this input character. */ - $this->char--; - $this->state = 'attributeValueUnquoted'; - - } elseif($char === '\'') { - /* U+0027 APOSTROPHE (') - Switch to the attribute value (single-quoted) state. */ - $this->state = 'attributeValueSingleQuoted'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Switch to the attribute value (unquoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueUnquoted'; - } - } - - private function attributeValueDoubleQuotedState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if($char === '"') { - /* U+0022 QUOTATION MARK (") - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the entity in attribute value state. */ - $this->entityInAttributeValueState('double'); - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the character - in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Stay in the attribute value (double-quoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueDoubleQuoted'; - } - } - - private function attributeValueSingleQuotedState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if($char === '\'') { - /* U+0022 QUOTATION MARK (') - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the entity in attribute value state. */ - $this->entityInAttributeValueState('single'); - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the character - in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Stay in the attribute value (single-quoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueSingleQuoted'; - } - } - - private function attributeValueUnquotedState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the entity in attribute value state. */ - $this->entityInAttributeValueState(); - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Stay in the attribute value (unquoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueUnquoted'; - } - } - - private function entityInAttributeValueState() { - // Attempt to consume an entity. - $entity = $this->entity(); - - // If nothing is returned, append a U+0026 AMPERSAND character to the - // current attribute's value. Otherwise, emit the character token that - // was returned. - $char = (!$entity) - ? '&' - : $entity; - - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - } - - private function bogusCommentState() { - /* Consume every character up to the first U+003E GREATER-THAN SIGN - character (>) or the end of the file (EOF), whichever comes first. Emit - a comment token whose data is the concatenation of all the characters - starting from and including the character that caused the state machine - to switch into the bogus comment state, up to and including the last - consumed character before the U+003E character, if any, or up to the - end of the file otherwise. (If the comment was started by the end of - the file (EOF), the token is empty.) */ - $data = $this->characters('^>', $this->char); - $this->emitToken(array( - 'data' => $data, - 'type' => self::COMMENT - )); - - $this->char += strlen($data); - - /* Switch to the data state. */ - $this->state = 'data'; - - /* If the end of the file was reached, reconsume the EOF character. */ - if($this->char === $this->EOF) { - $this->char = $this->EOF - 1; - } - } - - private function markupDeclarationOpenState() { - /* If the next two characters are both U+002D HYPHEN-MINUS (-) - characters, consume those two characters, create a comment token whose - data is the empty string, and switch to the comment state. */ - if($this->character($this->char + 1, 2) === '--') { - $this->char += 2; - $this->state = 'comment'; - $this->token = array( - 'data' => null, - 'type' => self::COMMENT - ); - - /* Otherwise if the next seven chacacters are a case-insensitive match - for the word "DOCTYPE", then consume those characters and switch to the - DOCTYPE state. */ - } elseif(strtolower($this->character($this->char + 1, 7)) === 'doctype') { - $this->char += 7; - $this->state = 'doctype'; - - /* Otherwise, is is a parse error. Switch to the bogus comment state. - The next character that is consumed, if any, is the first character - that will be in the comment. */ - } else { - $this->char++; - $this->state = 'bogusComment'; - } - } - - private function commentState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - /* U+002D HYPHEN-MINUS (-) */ - if($char === '-') { - /* Switch to the comment dash state */ - $this->state = 'commentDash'; - - /* EOF */ - } elseif($this->char === $this->EOF) { - /* Parse error. Emit the comment token. Reconsume the EOF character - in the data state. */ - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - /* Anything else */ - } else { - /* Append the input character to the comment token's data. Stay in - the comment state. */ - $this->token['data'] .= $char; - } - } - - private function commentDashState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - /* U+002D HYPHEN-MINUS (-) */ - if($char === '-') { - /* Switch to the comment end state */ - $this->state = 'commentEnd'; - - /* EOF */ - } elseif($this->char === $this->EOF) { - /* Parse error. Emit the comment token. Reconsume the EOF character - in the data state. */ - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - /* Anything else */ - } else { - /* Append a U+002D HYPHEN-MINUS (-) character and the input - character to the comment token's data. Switch to the comment state. */ - $this->token['data'] .= '-'.$char; - $this->state = 'comment'; - } - } - - private function commentEndState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($char === '-') { - $this->token['data'] .= '-'; - - } elseif($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - $this->token['data'] .= '--'.$char; - $this->state = 'comment'; - } - } - - private function doctypeState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - $this->state = 'beforeDoctypeName'; - - } else { - $this->char--; - $this->state = 'beforeDoctypeName'; - } - } - - private function beforeDoctypeNameState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - // Stay in the before DOCTYPE name state. - - } elseif(preg_match('/^[a-z]$/', $char)) { - $this->token = array( - 'name' => strtoupper($char), - 'type' => self::DOCTYPE, - 'error' => true - ); - - $this->state = 'doctypeName'; - - } elseif($char === '>') { - $this->emitToken(array( - 'name' => null, - 'type' => self::DOCTYPE, - 'error' => true - )); - - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - $this->emitToken(array( - 'name' => null, - 'type' => self::DOCTYPE, - 'error' => true - )); - - $this->char--; - $this->state = 'data'; - - } else { - $this->token = array( - 'name' => $char, - 'type' => self::DOCTYPE, - 'error' => true - ); - - $this->state = 'doctypeName'; - } - } - - private function doctypeNameState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - $this->state = 'AfterDoctypeName'; - - } elseif($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif(preg_match('/^[a-z]$/', $char)) { - $this->token['name'] .= strtoupper($char); - - } elseif($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - $this->token['name'] .= $char; - } - - $this->token['error'] = ($this->token['name'] === 'HTML') - ? false - : true; - } - - private function afterDoctypeNameState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - // Stay in the DOCTYPE name state. - - } elseif($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - $this->token['error'] = true; - $this->state = 'bogusDoctype'; - } - } - - private function bogusDoctypeState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - // Stay in the bogus DOCTYPE state. - } - } - - private function entity() { - $start = $this->char; - - // This section defines how to consume an entity. This definition is - // used when parsing entities in text and in attributes. - - // The behaviour depends on the identity of the next character (the - // one immediately after the U+0026 AMPERSAND character): - - switch($this->character($this->char + 1)) { - // U+0023 NUMBER SIGN (#) - case '#': - - // The behaviour further depends on the character after the - // U+0023 NUMBER SIGN: - switch($this->character($this->char + 1)) { - // U+0078 LATIN SMALL LETTER X - // U+0058 LATIN CAPITAL LETTER X - case 'x': - case 'X': - // Follow the steps below, but using the range of - // characters U+0030 DIGIT ZERO through to U+0039 DIGIT - // NINE, U+0061 LATIN SMALL LETTER A through to U+0066 - // LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER - // A, through to U+0046 LATIN CAPITAL LETTER F (in other - // words, 0-9, A-F, a-f). - $char = 1; - $char_class = '0-9A-Fa-f'; - break; - - // Anything else - default: - // Follow the steps below, but using the range of - // characters U+0030 DIGIT ZERO through to U+0039 DIGIT - // NINE (i.e. just 0-9). - $char = 0; - $char_class = '0-9'; - break; - } - - // Consume as many characters as match the range of characters - // given above. - $this->char++; - $e_name = $this->characters($char_class, $this->char + $char + 1); - $entity = $this->character($start, $this->char); - $cond = strlen($e_name) > 0; - - // The rest of the parsing happens bellow. - break; - - // Anything else - default: - // Consume the maximum number of characters possible, with the - // consumed characters case-sensitively matching one of the - // identifiers in the first column of the entities table. - $e_name = $this->characters('0-9A-Za-z;', $this->char + 1); - $len = strlen($e_name); - - for($c = 1; $c <= $len; $c++) { - $id = substr($e_name, 0, $c); - $this->char++; - - if(in_array($id, $this->entities)) { - if ($e_name[$c-1] !== ';') { - if ($c < $len && $e_name[$c] == ';') { - $this->char++; // consume extra semicolon - } - } - $entity = $id; - break; - } - } - - $cond = isset($entity); - // The rest of the parsing happens bellow. - break; - } - - if(!$cond) { - // If no match can be made, then this is a parse error. No - // characters are consumed, and nothing is returned. - $this->char = $start; - return false; - } - - // Return a character token for the character corresponding to the - // entity name (as given by the second column of the entities table). - return html_entity_decode('&'.$entity.';', ENT_QUOTES, 'UTF-8'); - } - - private function emitToken($token) { - $emit = $this->tree->emitToken($token); - - if(is_int($emit)) { - $this->content_model = $emit; - - } elseif($token['type'] === self::ENDTAG) { - $this->content_model = self::PCDATA; - } - } - - private function EOF() { - $this->state = null; - $this->tree->emitToken(array( - 'type' => self::EOF - )); - } -} - -class HTML5TreeConstructer { - public $stack = array(); - - private $phase; - private $mode; - private $dom; - private $foster_parent = null; - private $a_formatting = array(); - - private $head_pointer = null; - private $form_pointer = null; - - private $scoping = array('button','caption','html','marquee','object','table','td','th'); - private $formatting = array('a','b','big','em','font','i','nobr','s','small','strike','strong','tt','u'); - private $special = array('address','area','base','basefont','bgsound', - 'blockquote','body','br','center','col','colgroup','dd','dir','div','dl', - 'dt','embed','fieldset','form','frame','frameset','h1','h2','h3','h4','h5', - 'h6','head','hr','iframe','image','img','input','isindex','li','link', - 'listing','menu','meta','noembed','noframes','noscript','ol','optgroup', - 'option','p','param','plaintext','pre','script','select','spacer','style', - 'tbody','textarea','tfoot','thead','title','tr','ul','wbr'); - - // The different phases. - const INIT_PHASE = 0; - const ROOT_PHASE = 1; - const MAIN_PHASE = 2; - const END_PHASE = 3; - - // The different insertion modes for the main phase. - const BEFOR_HEAD = 0; - const IN_HEAD = 1; - const AFTER_HEAD = 2; - const IN_BODY = 3; - const IN_TABLE = 4; - const IN_CAPTION = 5; - const IN_CGROUP = 6; - const IN_TBODY = 7; - const IN_ROW = 8; - const IN_CELL = 9; - const IN_SELECT = 10; - const AFTER_BODY = 11; - const IN_FRAME = 12; - const AFTR_FRAME = 13; - - // The different types of elements. - const SPECIAL = 0; - const SCOPING = 1; - const FORMATTING = 2; - const PHRASING = 3; - - const MARKER = 0; - - public function __construct() { - $this->phase = self::INIT_PHASE; - $this->mode = self::BEFOR_HEAD; - $this->dom = new DOMDocument; - - $this->dom->encoding = 'UTF-8'; - $this->dom->preserveWhiteSpace = true; - $this->dom->substituteEntities = true; - $this->dom->strictErrorChecking = false; - } - - // Process tag tokens - public function emitToken($token) { - switch($this->phase) { - case self::INIT_PHASE: return $this->initPhase($token); break; - case self::ROOT_PHASE: return $this->rootElementPhase($token); break; - case self::MAIN_PHASE: return $this->mainPhase($token); break; - case self::END_PHASE : return $this->trailingEndPhase($token); break; - } - } - - private function initPhase($token) { - /* Initially, the tree construction stage must handle each token - emitted from the tokenisation stage as follows: */ - - /* A DOCTYPE token that is marked as being in error - A comment token - A start tag token - An end tag token - A character token that is not one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE - An end-of-file token */ - if((isset($token['error']) && $token['error']) || - $token['type'] === HTML5::COMMENT || - $token['type'] === HTML5::STARTTAG || - $token['type'] === HTML5::ENDTAG || - $token['type'] === HTML5::EOF || - ($token['type'] === HTML5::CHARACTR && isset($token['data']) && - !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']))) { - /* This specification does not define how to handle this case. In - particular, user agents may ignore the entirety of this specification - altogether for such documents, and instead invoke special parse modes - with a greater emphasis on backwards compatibility. */ - - $this->phase = self::ROOT_PHASE; - return $this->rootElementPhase($token); - - /* A DOCTYPE token marked as being correct */ - } elseif(isset($token['error']) && !$token['error']) { - /* Append a DocumentType node to the Document node, with the name - attribute set to the name given in the DOCTYPE token (which will be - "HTML"), and the other attributes specific to DocumentType objects - set to null, empty lists, or the empty string as appropriate. */ - $doctype = new DOMDocumentType(null, null, 'HTML'); - - /* Then, switch to the root element phase of the tree construction - stage. */ - $this->phase = self::ROOT_PHASE; - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - } elseif(isset($token['data']) && preg_match('/^[\t\n\x0b\x0c ]+$/', - $token['data'])) { - /* Append that character to the Document node. */ - $text = $this->dom->createTextNode($token['data']); - $this->dom->appendChild($text); - } - } - - private function rootElementPhase($token) { - /* After the initial phase, as each token is emitted from the tokenisation - stage, it must be processed as described in this section. */ - - /* A DOCTYPE token */ - if($token['type'] === HTML5::DOCTYPE) { - // Parse error. Ignore the token. - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the Document object with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - $this->dom->appendChild($comment); - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - } elseif($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append that character to the Document node. */ - $text = $this->dom->createTextNode($token['data']); - $this->dom->appendChild($text); - - /* A character token that is not one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED - (FF), or U+0020 SPACE - A start tag token - An end tag token - An end-of-file token */ - } elseif(($token['type'] === HTML5::CHARACTR && - !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || - $token['type'] === HTML5::STARTTAG || - $token['type'] === HTML5::ENDTAG || - $token['type'] === HTML5::EOF) { - /* Create an HTMLElement node with the tag name html, in the HTML - namespace. Append it to the Document object. Switch to the main - phase and reprocess the current token. */ - $html = $this->dom->createElement('html'); - $this->dom->appendChild($html); - $this->stack[] = $html; - - $this->phase = self::MAIN_PHASE; - return $this->mainPhase($token); - } - } - - private function mainPhase($token) { - /* Tokens in the main phase must be handled as follows: */ - - /* A DOCTYPE token */ - if($token['type'] === HTML5::DOCTYPE) { - // Parse error. Ignore the token. - - /* A start tag token with the tag name "html" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'html') { - /* If this start tag token was not the first start tag token, then - it is a parse error. */ - - /* For each attribute on the token, check to see if the attribute - is already present on the top element of the stack of open elements. - If it is not, add the attribute and its corresponding value to that - element. */ - foreach($token['attr'] as $attr) { - if(!$this->stack[0]->hasAttribute($attr['name'])) { - $this->stack[0]->setAttribute($attr['name'], $attr['value']); - } - } - - /* An end-of-file token */ - } elseif($token['type'] === HTML5::EOF) { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* Anything else. */ - } else { - /* Depends on the insertion mode: */ - switch($this->mode) { - case self::BEFOR_HEAD: return $this->beforeHead($token); break; - case self::IN_HEAD: return $this->inHead($token); break; - case self::AFTER_HEAD: return $this->afterHead($token); break; - case self::IN_BODY: return $this->inBody($token); break; - case self::IN_TABLE: return $this->inTable($token); break; - case self::IN_CAPTION: return $this->inCaption($token); break; - case self::IN_CGROUP: return $this->inColumnGroup($token); break; - case self::IN_TBODY: return $this->inTableBody($token); break; - case self::IN_ROW: return $this->inRow($token); break; - case self::IN_CELL: return $this->inCell($token); break; - case self::IN_SELECT: return $this->inSelect($token); break; - case self::AFTER_BODY: return $this->afterBody($token); break; - case self::IN_FRAME: return $this->inFrameset($token); break; - case self::AFTR_FRAME: return $this->afterFrameset($token); break; - case self::END_PHASE: return $this->trailingEndPhase($token); break; - } - } - } - - private function beforeHead($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data attribute - set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag token with the tag name "head" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') { - /* Create an element for the token, append the new element to the - current node and push it onto the stack of open elements. */ - $element = $this->insertElement($token); - - /* Set the head element pointer to this new element node. */ - $this->head_pointer = $element; - - /* Change the insertion mode to "in head". */ - $this->mode = self::IN_HEAD; - - /* A start tag token whose tag name is one of: "base", "link", "meta", - "script", "style", "title". Or an end tag with the tag name "html". - Or a character token that is not one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE. Or any other start tag token */ - } elseif($token['type'] === HTML5::STARTTAG || - ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') || - ($token['type'] === HTML5::CHARACTR && !preg_match('/^[\t\n\x0b\x0c ]$/', - $token['data']))) { - /* Act as if a start tag token with the tag name "head" and no - attributes had been seen, then reprocess the current token. */ - $this->beforeHead(array( - 'name' => 'head', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - return $this->inHead($token); - - /* Any other end tag */ - } elseif($token['type'] === HTML5::ENDTAG) { - /* Parse error. Ignore the token. */ - } - } - - private function inHead($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE. - - THIS DIFFERS FROM THE SPEC: If the current node is either a title, style - or script element, append the character to the current node regardless - of its content. */ - if(($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || ( - $token['type'] === HTML5::CHARACTR && in_array(end($this->stack)->nodeName, - array('title', 'style', 'script')))) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data attribute - set to the data given in the comment token. */ - $this->insertComment($token['data']); - - } elseif($token['type'] === HTML5::ENDTAG && - in_array($token['name'], array('title', 'style', 'script'))) { - array_pop($this->stack); - return HTML5::PCDATA; - - /* A start tag with the tag name "title" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'title') { - /* Create an element for the token and append the new element to the - node pointed to by the head element pointer, or, if that is null - (innerHTML case), to the current node. */ - if($this->head_pointer !== null) { - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - - } else { - $element = $this->insertElement($token); - } - - /* Switch the tokeniser's content model flag to the RCDATA state. */ - return HTML5::RCDATA; - - /* A start tag with the tag name "style" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'style') { - /* Create an element for the token and append the new element to the - node pointed to by the head element pointer, or, if that is null - (innerHTML case), to the current node. */ - if($this->head_pointer !== null) { - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - - } else { - $this->insertElement($token); - } - - /* Switch the tokeniser's content model flag to the CDATA state. */ - return HTML5::CDATA; - - /* A start tag with the tag name "script" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'script') { - /* Create an element for the token. */ - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - - /* Switch the tokeniser's content model flag to the CDATA state. */ - return HTML5::CDATA; - - /* A start tag with the tag name "base", "link", or "meta" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('base', 'link', 'meta'))) { - /* Create an element for the token and append the new element to the - node pointed to by the head element pointer, or, if that is null - (innerHTML case), to the current node. */ - if($this->head_pointer !== null) { - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - array_pop($this->stack); - - } else { - $this->insertElement($token); - } - - /* An end tag with the tag name "head" */ - } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'head') { - /* If the current node is a head element, pop the current node off - the stack of open elements. */ - if($this->head_pointer->isSameNode(end($this->stack))) { - array_pop($this->stack); - - /* Otherwise, this is a parse error. */ - } else { - // k - } - - /* Change the insertion mode to "after head". */ - $this->mode = self::AFTER_HEAD; - - /* A start tag with the tag name "head" or an end tag except "html". */ - } elseif(($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') || - ($token['type'] === HTML5::ENDTAG && $token['name'] !== 'html')) { - // Parse error. Ignore the token. - - /* Anything else */ - } else { - /* If the current node is a head element, act as if an end tag - token with the tag name "head" had been seen. */ - if($this->head_pointer->isSameNode(end($this->stack))) { - $this->inHead(array( - 'name' => 'head', - 'type' => HTML5::ENDTAG - )); - - /* Otherwise, change the insertion mode to "after head". */ - } else { - $this->mode = self::AFTER_HEAD; - } - - /* Then, reprocess the current token. */ - return $this->afterHead($token); - } - } - - private function afterHead($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data attribute - set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag token with the tag name "body" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'body') { - /* Insert a body element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in body". */ - $this->mode = self::IN_BODY; - - /* A start tag token with the tag name "frameset" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'frameset') { - /* Insert a frameset element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in frameset". */ - $this->mode = self::IN_FRAME; - - /* A start tag token whose tag name is one of: "base", "link", "meta", - "script", "style", "title" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('base', 'link', 'meta', 'script', 'style', 'title'))) { - /* Parse error. Switch the insertion mode back to "in head" and - reprocess the token. */ - $this->mode = self::IN_HEAD; - return $this->inHead($token); - - /* Anything else */ - } else { - /* Act as if a start tag token with the tag name "body" and no - attributes had been seen, and then reprocess the current token. */ - $this->afterHead(array( - 'name' => 'body', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - return $this->inBody($token); - } - } - - private function inBody($token) { - /* Handle the token as follows: */ - - switch($token['type']) { - /* A character token */ - case HTML5::CHARACTR: - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Append the token's character to the current node. */ - $this->insertText($token['data']); - break; - - /* A comment token */ - case HTML5::COMMENT: - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - break; - - case HTML5::STARTTAG: - switch($token['name']) { - /* A start tag token whose tag name is one of: "script", - "style" */ - case 'script': case 'style': - /* Process the token as if the insertion mode had been "in - head". */ - return $this->inHead($token); - break; - - /* A start tag token whose tag name is one of: "base", "link", - "meta", "title" */ - case 'base': case 'link': case 'meta': case 'title': - /* Parse error. Process the token as if the insertion mode - had been "in head". */ - return $this->inHead($token); - break; - - /* A start tag token with the tag name "body" */ - case 'body': - /* Parse error. If the second element on the stack of open - elements is not a body element, or, if the stack of open - elements has only one node on it, then ignore the token. - (innerHTML case) */ - if(count($this->stack) === 1 || $this->stack[1]->nodeName !== 'body') { - // Ignore - - /* Otherwise, for each attribute on the token, check to see - if the attribute is already present on the body element (the - second element) on the stack of open elements. If it is not, - add the attribute and its corresponding value to that - element. */ - } else { - foreach($token['attr'] as $attr) { - if(!$this->stack[1]->hasAttribute($attr['name'])) { - $this->stack[1]->setAttribute($attr['name'], $attr['value']); - } - } - } - break; - - /* A start tag whose tag name is one of: "address", - "blockquote", "center", "dir", "div", "dl", "fieldset", - "listing", "menu", "ol", "p", "ul" */ - case 'address': case 'blockquote': case 'center': case 'dir': - case 'div': case 'dl': case 'fieldset': case 'listing': - case 'menu': case 'ol': case 'p': case 'ul': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been - seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - break; - - /* A start tag whose tag name is "form" */ - case 'form': - /* If the form element pointer is not null, ignore the - token with a parse error. */ - if($this->form_pointer !== null) { - // Ignore. - - /* Otherwise: */ - } else { - /* If the stack of open elements has a p element in - scope, then act as if an end tag with the tag name p - had been seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token, and set the - form element pointer to point to the element created. */ - $element = $this->insertElement($token); - $this->form_pointer = $element; - } - break; - - /* A start tag whose tag name is "li", "dd" or "dt" */ - case 'li': case 'dd': case 'dt': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been - seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - $stack_length = count($this->stack) - 1; - - for($n = $stack_length; 0 <= $n; $n--) { - /* 1. Initialise node to be the current node (the - bottommost node of the stack). */ - $stop = false; - $node = $this->stack[$n]; - $cat = $this->getElementCategory($node->tagName); - - /* 2. If node is an li, dd or dt element, then pop all - the nodes from the current node up to node, including - node, then stop this algorithm. */ - if($token['name'] === $node->tagName || ($token['name'] !== 'li' - && ($node->tagName === 'dd' || $node->tagName === 'dt'))) { - for($x = $stack_length; $x >= $n ; $x--) { - array_pop($this->stack); - } - - break; - } - - /* 3. If node is not in the formatting category, and is - not in the phrasing category, and is not an address or - div element, then stop this algorithm. */ - if($cat !== self::FORMATTING && $cat !== self::PHRASING && - $node->tagName !== 'address' && $node->tagName !== 'div') { - break; - } - } - - /* Finally, insert an HTML element with the same tag - name as the token's. */ - $this->insertElement($token); - break; - - /* A start tag token whose tag name is "plaintext" */ - case 'plaintext': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been - seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - return HTML5::PLAINTEXT; - break; - - /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4", - "h5", "h6" */ - case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* If the stack of open elements has in scope an element whose - tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then - this is a parse error; pop elements from the stack until an - element with one of those tag names has been popped from the - stack. */ - while($this->elementInScope(array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) { - array_pop($this->stack); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - break; - - /* A start tag whose tag name is "a" */ - case 'a': - /* If the list of active formatting elements contains - an element whose tag name is "a" between the end of the - list and the last marker on the list (or the start of - the list if there is no marker on the list), then this - is a parse error; act as if an end tag with the tag name - "a" had been seen, then remove that element from the list - of active formatting elements and the stack of open - elements if the end tag didn't already remove it (it - might not have if the element is not in table scope). */ - $leng = count($this->a_formatting); - - for($n = $leng - 1; $n >= 0; $n--) { - if($this->a_formatting[$n] === self::MARKER) { - break; - - } elseif($this->a_formatting[$n]->nodeName === 'a') { - $this->emitToken(array( - 'name' => 'a', - 'type' => HTML5::ENDTAG - )); - break; - } - } - - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $el = $this->insertElement($token); - - /* Add that element to the list of active formatting - elements. */ - $this->a_formatting[] = $el; - break; - - /* A start tag whose tag name is one of: "b", "big", "em", "font", - "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ - case 'b': case 'big': case 'em': case 'font': case 'i': - case 'nobr': case 's': case 'small': case 'strike': - case 'strong': case 'tt': case 'u': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $el = $this->insertElement($token); - - /* Add that element to the list of active formatting - elements. */ - $this->a_formatting[] = $el; - break; - - /* A start tag token whose tag name is "button" */ - case 'button': - /* If the stack of open elements has a button element in scope, - then this is a parse error; act as if an end tag with the tag - name "button" had been seen, then reprocess the token. (We don't - do that. Unnecessary.) */ - if($this->elementInScope('button')) { - $this->inBody(array( - 'name' => 'button', - 'type' => HTML5::ENDTAG - )); - } - - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Insert a marker at the end of the list of active - formatting elements. */ - $this->a_formatting[] = self::MARKER; - break; - - /* A start tag token whose tag name is one of: "marquee", "object" */ - case 'marquee': case 'object': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Insert a marker at the end of the list of active - formatting elements. */ - $this->a_formatting[] = self::MARKER; - break; - - /* A start tag token whose tag name is "xmp" */ - case 'xmp': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Switch the content model flag to the CDATA state. */ - return HTML5::CDATA; - break; - - /* A start tag whose tag name is "table" */ - case 'table': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in table". */ - $this->mode = self::IN_TABLE; - break; - - /* A start tag whose tag name is one of: "area", "basefont", - "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */ - case 'area': case 'basefont': case 'bgsound': case 'br': - case 'embed': case 'img': case 'param': case 'spacer': - case 'wbr': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Immediately pop the current node off the stack of open elements. */ - array_pop($this->stack); - break; - - /* A start tag whose tag name is "hr" */ - case 'hr': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Immediately pop the current node off the stack of open elements. */ - array_pop($this->stack); - break; - - /* A start tag whose tag name is "image" */ - case 'image': - /* Parse error. Change the token's tag name to "img" and - reprocess it. (Don't ask.) */ - $token['name'] = 'img'; - return $this->inBody($token); - break; - - /* A start tag whose tag name is "input" */ - case 'input': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an input element for the token. */ - $element = $this->insertElement($token, false); - - /* If the form element pointer is not null, then associate the - input element with the form element pointed to by the form - element pointer. */ - $this->form_pointer !== null - ? $this->form_pointer->appendChild($element) - : end($this->stack)->appendChild($element); - - /* Pop that input element off the stack of open elements. */ - array_pop($this->stack); - break; - - /* A start tag whose tag name is "isindex" */ - case 'isindex': - /* Parse error. */ - // w/e - - /* If the form element pointer is not null, - then ignore the token. */ - if($this->form_pointer === null) { - /* Act as if a start tag token with the tag name "form" had - been seen. */ - $this->inBody(array( - 'name' => 'body', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - /* Act as if a start tag token with the tag name "hr" had - been seen. */ - $this->inBody(array( - 'name' => 'hr', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - /* Act as if a start tag token with the tag name "p" had - been seen. */ - $this->inBody(array( - 'name' => 'p', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - /* Act as if a start tag token with the tag name "label" - had been seen. */ - $this->inBody(array( - 'name' => 'label', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - /* Act as if a stream of character tokens had been seen. */ - $this->insertText('This is a searchable index. '. - 'Insert your search keywords here: '); - - /* Act as if a start tag token with the tag name "input" - had been seen, with all the attributes from the "isindex" - token, except with the "name" attribute set to the value - "isindex" (ignoring any explicit "name" attribute). */ - $attr = $token['attr']; - $attr[] = array('name' => 'name', 'value' => 'isindex'); - - $this->inBody(array( - 'name' => 'input', - 'type' => HTML5::STARTTAG, - 'attr' => $attr - )); - - /* Act as if a stream of character tokens had been seen - (see below for what they should say). */ - $this->insertText('This is a searchable index. '. - 'Insert your search keywords here: '); - - /* Act as if an end tag token with the tag name "label" - had been seen. */ - $this->inBody(array( - 'name' => 'label', - 'type' => HTML5::ENDTAG - )); - - /* Act as if an end tag token with the tag name "p" had - been seen. */ - $this->inBody(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - - /* Act as if a start tag token with the tag name "hr" had - been seen. */ - $this->inBody(array( - 'name' => 'hr', - 'type' => HTML5::ENDTAG - )); - - /* Act as if an end tag token with the tag name "form" had - been seen. */ - $this->inBody(array( - 'name' => 'form', - 'type' => HTML5::ENDTAG - )); - } - break; - - /* A start tag whose tag name is "textarea" */ - case 'textarea': - $this->insertElement($token); - - /* Switch the tokeniser's content model flag to the - RCDATA state. */ - return HTML5::RCDATA; - break; - - /* A start tag whose tag name is one of: "iframe", "noembed", - "noframes" */ - case 'iframe': case 'noembed': case 'noframes': - $this->insertElement($token); - - /* Switch the tokeniser's content model flag to the CDATA state. */ - return HTML5::CDATA; - break; - - /* A start tag whose tag name is "select" */ - case 'select': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in select". */ - $this->mode = self::IN_SELECT; - break; - - /* A start or end tag whose tag name is one of: "caption", "col", - "colgroup", "frame", "frameset", "head", "option", "optgroup", - "tbody", "td", "tfoot", "th", "thead", "tr". */ - case 'caption': case 'col': case 'colgroup': case 'frame': - case 'frameset': case 'head': case 'option': case 'optgroup': - case 'tbody': case 'td': case 'tfoot': case 'th': case 'thead': - case 'tr': - // Parse error. Ignore the token. - break; - - /* A start or end tag whose tag name is one of: "event-source", - "section", "nav", "article", "aside", "header", "footer", - "datagrid", "command" */ - case 'event-source': case 'section': case 'nav': case 'article': - case 'aside': case 'header': case 'footer': case 'datagrid': - case 'command': - // Work in progress! - break; - - /* A start tag token not covered by the previous entries */ - default: - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - $this->insertElement($token, true, true); - break; - } - break; - - case HTML5::ENDTAG: - switch($token['name']) { - /* An end tag with the tag name "body" */ - case 'body': - /* If the second element in the stack of open elements is - not a body element, this is a parse error. Ignore the token. - (innerHTML case) */ - if(count($this->stack) < 2 || $this->stack[1]->nodeName !== 'body') { - // Ignore. - - /* If the current node is not the body element, then this - is a parse error. */ - } elseif(end($this->stack)->nodeName !== 'body') { - // Parse error. - } - - /* Change the insertion mode to "after body". */ - $this->mode = self::AFTER_BODY; - break; - - /* An end tag with the tag name "html" */ - case 'html': - /* Act as if an end tag with tag name "body" had been seen, - then, if that token wasn't ignored, reprocess the current - token. */ - $this->inBody(array( - 'name' => 'body', - 'type' => HTML5::ENDTAG - )); - - return $this->afterBody($token); - break; - - /* An end tag whose tag name is one of: "address", "blockquote", - "center", "dir", "div", "dl", "fieldset", "listing", "menu", - "ol", "pre", "ul" */ - case 'address': case 'blockquote': case 'center': case 'dir': - case 'div': case 'dl': case 'fieldset': case 'listing': - case 'menu': case 'ol': case 'pre': case 'ul': - /* If the stack of open elements has an element in scope - with the same tag name as that of the token, then generate - implied end tags. */ - if($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(); - - /* Now, if the current node is not an element with - the same tag name as that of the token, then this - is a parse error. */ - // w/e - - /* If the stack of open elements has an element in - scope with the same tag name as that of the token, - then pop elements from this stack until an element - with that tag name has been popped from the stack. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === $token['name']) { - $n = -1; - } - - array_pop($this->stack); - } - } - break; - - /* An end tag whose tag name is "form" */ - case 'form': - /* If the stack of open elements has an element in scope - with the same tag name as that of the token, then generate - implied end tags. */ - if($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(); - - } - - if(end($this->stack)->nodeName !== $token['name']) { - /* Now, if the current node is not an element with the - same tag name as that of the token, then this is a parse - error. */ - // w/e - - } else { - /* Otherwise, if the current node is an element with - the same tag name as that of the token pop that element - from the stack. */ - array_pop($this->stack); - } - - /* In any case, set the form element pointer to null. */ - $this->form_pointer = null; - break; - - /* An end tag whose tag name is "p" */ - case 'p': - /* If the stack of open elements has a p element in scope, - then generate implied end tags, except for p elements. */ - if($this->elementInScope('p')) { - $this->generateImpliedEndTags(array('p')); - - /* If the current node is not a p element, then this is - a parse error. */ - // k - - /* If the stack of open elements has a p element in - scope, then pop elements from this stack until the stack - no longer has a p element in scope. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->elementInScope('p')) { - array_pop($this->stack); - - } else { - break; - } - } - } - break; - - /* An end tag whose tag name is "dd", "dt", or "li" */ - case 'dd': case 'dt': case 'li': - /* If the stack of open elements has an element in scope - whose tag name matches the tag name of the token, then - generate implied end tags, except for elements with the - same tag name as the token. */ - if($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(array($token['name'])); - - /* If the current node is not an element with the same - tag name as the token, then this is a parse error. */ - // w/e - - /* If the stack of open elements has an element in scope - whose tag name matches the tag name of the token, then - pop elements from this stack until an element with that - tag name has been popped from the stack. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === $token['name']) { - $n = -1; - } - - array_pop($this->stack); - } - } - break; - - /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4", - "h5", "h6" */ - case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': - $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'); - - /* If the stack of open elements has in scope an element whose - tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then - generate implied end tags. */ - if($this->elementInScope($elements)) { - $this->generateImpliedEndTags(); - - /* Now, if the current node is not an element with the same - tag name as that of the token, then this is a parse error. */ - // w/e - - /* If the stack of open elements has in scope an element - whose tag name is one of "h1", "h2", "h3", "h4", "h5", or - "h6", then pop elements from the stack until an element - with one of those tag names has been popped from the stack. */ - while($this->elementInScope($elements)) { - array_pop($this->stack); - } - } - break; - - /* An end tag whose tag name is one of: "a", "b", "big", "em", - "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ - case 'a': case 'b': case 'big': case 'em': case 'font': - case 'i': case 'nobr': case 's': case 'small': case 'strike': - case 'strong': case 'tt': case 'u': - /* 1. Let the formatting element be the last element in - the list of active formatting elements that: - * is between the end of the list and the last scope - marker in the list, if any, or the start of the list - otherwise, and - * has the same tag name as the token. - */ - while(true) { - for($a = count($this->a_formatting) - 1; $a >= 0; $a--) { - if($this->a_formatting[$a] === self::MARKER) { - break; - - } elseif($this->a_formatting[$a]->tagName === $token['name']) { - $formatting_element = $this->a_formatting[$a]; - $in_stack = in_array($formatting_element, $this->stack, true); - $fe_af_pos = $a; - break; - } - } - - /* If there is no such node, or, if that node is - also in the stack of open elements but the element - is not in scope, then this is a parse error. Abort - these steps. The token is ignored. */ - if(!isset($formatting_element) || ($in_stack && - !$this->elementInScope($token['name']))) { - break; - - /* Otherwise, if there is such a node, but that node - is not in the stack of open elements, then this is a - parse error; remove the element from the list, and - abort these steps. */ - } elseif(isset($formatting_element) && !$in_stack) { - unset($this->a_formatting[$fe_af_pos]); - $this->a_formatting = array_merge($this->a_formatting); - break; - } - - /* 2. Let the furthest block be the topmost node in the - stack of open elements that is lower in the stack - than the formatting element, and is not an element in - the phrasing or formatting categories. There might - not be one. */ - $fe_s_pos = array_search($formatting_element, $this->stack, true); - $length = count($this->stack); - - for($s = $fe_s_pos + 1; $s < $length; $s++) { - $category = $this->getElementCategory($this->stack[$s]->nodeName); - - if($category !== self::PHRASING && $category !== self::FORMATTING) { - $furthest_block = $this->stack[$s]; - } - } - - /* 3. If there is no furthest block, then the UA must - skip the subsequent steps and instead just pop all - the nodes from the bottom of the stack of open - elements, from the current node up to the formatting - element, and remove the formatting element from the - list of active formatting elements. */ - if(!isset($furthest_block)) { - for($n = $length - 1; $n >= $fe_s_pos; $n--) { - array_pop($this->stack); - } - - unset($this->a_formatting[$fe_af_pos]); - $this->a_formatting = array_merge($this->a_formatting); - break; - } - - /* 4. Let the common ancestor be the element - immediately above the formatting element in the stack - of open elements. */ - $common_ancestor = $this->stack[$fe_s_pos - 1]; - - /* 5. If the furthest block has a parent node, then - remove the furthest block from its parent node. */ - if($furthest_block->parentNode !== null) { - $furthest_block->parentNode->removeChild($furthest_block); - } - - /* 6. Let a bookmark note the position of the - formatting element in the list of active formatting - elements relative to the elements on either side - of it in the list. */ - $bookmark = $fe_af_pos; - - /* 7. Let node and last node be the furthest block. - Follow these steps: */ - $node = $furthest_block; - $last_node = $furthest_block; - - while(true) { - for($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) { - /* 7.1 Let node be the element immediately - prior to node in the stack of open elements. */ - $node = $this->stack[$n]; - - /* 7.2 If node is not in the list of active - formatting elements, then remove node from - the stack of open elements and then go back - to step 1. */ - if(!in_array($node, $this->a_formatting, true)) { - unset($this->stack[$n]); - $this->stack = array_merge($this->stack); - - } else { - break; - } - } - - /* 7.3 Otherwise, if node is the formatting - element, then go to the next step in the overall - algorithm. */ - if($node === $formatting_element) { - break; - - /* 7.4 Otherwise, if last node is the furthest - block, then move the aforementioned bookmark to - be immediately after the node in the list of - active formatting elements. */ - } elseif($last_node === $furthest_block) { - $bookmark = array_search($node, $this->a_formatting, true) + 1; - } - - /* 7.5 If node has any children, perform a - shallow clone of node, replace the entry for - node in the list of active formatting elements - with an entry for the clone, replace the entry - for node in the stack of open elements with an - entry for the clone, and let node be the clone. */ - if($node->hasChildNodes()) { - $clone = $node->cloneNode(); - $s_pos = array_search($node, $this->stack, true); - $a_pos = array_search($node, $this->a_formatting, true); - - $this->stack[$s_pos] = $clone; - $this->a_formatting[$a_pos] = $clone; - $node = $clone; - } - - /* 7.6 Insert last node into node, first removing - it from its previous parent node if any. */ - if($last_node->parentNode !== null) { - $last_node->parentNode->removeChild($last_node); - } - - $node->appendChild($last_node); - - /* 7.7 Let last node be node. */ - $last_node = $node; - } - - /* 8. Insert whatever last node ended up being in - the previous step into the common ancestor node, - first removing it from its previous parent node if - any. */ - if($last_node->parentNode !== null) { - $last_node->parentNode->removeChild($last_node); - } - - $common_ancestor->appendChild($last_node); - - /* 9. Perform a shallow clone of the formatting - element. */ - $clone = $formatting_element->cloneNode(); - - /* 10. Take all of the child nodes of the furthest - block and append them to the clone created in the - last step. */ - while($furthest_block->hasChildNodes()) { - $child = $furthest_block->firstChild; - $furthest_block->removeChild($child); - $clone->appendChild($child); - } - - /* 11. Append that clone to the furthest block. */ - $furthest_block->appendChild($clone); - - /* 12. Remove the formatting element from the list - of active formatting elements, and insert the clone - into the list of active formatting elements at the - position of the aforementioned bookmark. */ - $fe_af_pos = array_search($formatting_element, $this->a_formatting, true); - unset($this->a_formatting[$fe_af_pos]); - $this->a_formatting = array_merge($this->a_formatting); - - $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1); - $af_part2 = array_slice($this->a_formatting, $bookmark, count($this->a_formatting)); - $this->a_formatting = array_merge($af_part1, array($clone), $af_part2); - - /* 13. Remove the formatting element from the stack - of open elements, and insert the clone into the stack - of open elements immediately after (i.e. in a more - deeply nested position than) the position of the - furthest block in that stack. */ - $fe_s_pos = array_search($formatting_element, $this->stack, true); - $fb_s_pos = array_search($furthest_block, $this->stack, true); - unset($this->stack[$fe_s_pos]); - - $s_part1 = array_slice($this->stack, 0, $fb_s_pos); - $s_part2 = array_slice($this->stack, $fb_s_pos + 1, count($this->stack)); - $this->stack = array_merge($s_part1, array($clone), $s_part2); - - /* 14. Jump back to step 1 in this series of steps. */ - unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block); - } - break; - - /* An end tag token whose tag name is one of: "button", - "marquee", "object" */ - case 'button': case 'marquee': case 'object': - /* If the stack of open elements has an element in scope whose - tag name matches the tag name of the token, then generate implied - tags. */ - if($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(); - - /* Now, if the current node is not an element with the same - tag name as the token, then this is a parse error. */ - // k - - /* Now, if the stack of open elements has an element in scope - whose tag name matches the tag name of the token, then pop - elements from the stack until that element has been popped from - the stack, and clear the list of active formatting elements up - to the last marker. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === $token['name']) { - $n = -1; - } - - array_pop($this->stack); - } - - $marker = end(array_keys($this->a_formatting, self::MARKER, true)); - - for($n = count($this->a_formatting) - 1; $n > $marker; $n--) { - array_pop($this->a_formatting); - } - } - break; - - /* Or an end tag whose tag name is one of: "area", "basefont", - "bgsound", "br", "embed", "hr", "iframe", "image", "img", - "input", "isindex", "noembed", "noframes", "param", "select", - "spacer", "table", "textarea", "wbr" */ - case 'area': case 'basefont': case 'bgsound': case 'br': - case 'embed': case 'hr': case 'iframe': case 'image': - case 'img': case 'input': case 'isindex': case 'noembed': - case 'noframes': case 'param': case 'select': case 'spacer': - case 'table': case 'textarea': case 'wbr': - // Parse error. Ignore the token. - break; - - /* An end tag token not covered by the previous entries */ - default: - for($n = count($this->stack) - 1; $n >= 0; $n--) { - /* Initialise node to be the current node (the bottommost - node of the stack). */ - $node = end($this->stack); - - /* If node has the same tag name as the end tag token, - then: */ - if($token['name'] === $node->nodeName) { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* If the tag name of the end tag token does not - match the tag name of the current node, this is a - parse error. */ - // k - - /* Pop all the nodes from the current node up to - node, including node, then stop this algorithm. */ - for($x = count($this->stack) - $n; $x >= $n; $x--) { - array_pop($this->stack); - } - - } else { - $category = $this->getElementCategory($node); - - if($category !== self::SPECIAL && $category !== self::SCOPING) { - /* Otherwise, if node is in neither the formatting - category nor the phrasing category, then this is a - parse error. Stop this algorithm. The end tag token - is ignored. */ - return false; - } - } - } - break; - } - break; - } - } - - private function inTable($token) { - $clear = array('html', 'table'); - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $text = $this->dom->createTextNode($token['data']); - end($this->stack)->appendChild($text); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - end($this->stack)->appendChild($comment); - - /* A start tag whose tag name is "caption" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'caption') { - /* Clear the stack back to a table context. */ - $this->clearStackToTableContext($clear); - - /* Insert a marker at the end of the list of active - formatting elements. */ - $this->a_formatting[] = self::MARKER; - - /* Insert an HTML element for the token, then switch the - insertion mode to "in caption". */ - $this->insertElement($token); - $this->mode = self::IN_CAPTION; - - /* A start tag whose tag name is "colgroup" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'colgroup') { - /* Clear the stack back to a table context. */ - $this->clearStackToTableContext($clear); - - /* Insert an HTML element for the token, then switch the - insertion mode to "in column group". */ - $this->insertElement($token); - $this->mode = self::IN_CGROUP; - - /* A start tag whose tag name is "col" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'col') { - $this->inTable(array( - 'name' => 'colgroup', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - $this->inColumnGroup($token); - - /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('tbody', 'tfoot', 'thead'))) { - /* Clear the stack back to a table context. */ - $this->clearStackToTableContext($clear); - - /* Insert an HTML element for the token, then switch the insertion - mode to "in table body". */ - $this->insertElement($token); - $this->mode = self::IN_TBODY; - - /* A start tag whose tag name is one of: "td", "th", "tr" */ - } elseif($token['type'] === HTML5::STARTTAG && - in_array($token['name'], array('td', 'th', 'tr'))) { - /* Act as if a start tag token with the tag name "tbody" had been - seen, then reprocess the current token. */ - $this->inTable(array( - 'name' => 'tbody', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - return $this->inTableBody($token); - - /* A start tag whose tag name is "table" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'table') { - /* Parse error. Act as if an end tag token with the tag name "table" - had been seen, then, if that token wasn't ignored, reprocess the - current token. */ - $this->inTable(array( - 'name' => 'table', - 'type' => HTML5::ENDTAG - )); - - return $this->mainPhase($token); - - /* An end tag whose tag name is "table" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'table') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if(!$this->elementInScope($token['name'], true)) { - return false; - - /* Otherwise: */ - } else { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* Now, if the current node is not a table element, then this - is a parse error. */ - // w/e - - /* Pop elements from this stack until a table element has been - popped from the stack. */ - while(true) { - $current = end($this->stack)->nodeName; - array_pop($this->stack); - - if($current === 'table') { - break; - } - } - - /* Reset the insertion mode appropriately. */ - $this->resetInsertionMode(); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html', 'tbody', 'td', - 'tfoot', 'th', 'thead', 'tr'))) { - // Parse error. Ignore the token. - - /* Anything else */ - } else { - /* Parse error. Process the token as if the insertion mode was "in - body", with the following exception: */ - - /* If the current node is a table, tbody, tfoot, thead, or tr - element, then, whenever a node would be inserted into the current - node, it must instead be inserted into the foster parent element. */ - if(in_array(end($this->stack)->nodeName, - array('table', 'tbody', 'tfoot', 'thead', 'tr'))) { - /* The foster parent element is the parent element of the last - table element in the stack of open elements, if there is a - table element and it has such a parent element. If there is no - table element in the stack of open elements (innerHTML case), - then the foster parent element is the first element in the - stack of open elements (the html element). Otherwise, if there - is a table element in the stack of open elements, but the last - table element in the stack of open elements has no parent, or - its parent node is not an element, then the foster parent - element is the element before the last table element in the - stack of open elements. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === 'table') { - $table = $this->stack[$n]; - break; - } - } - - if(isset($table) && $table->parentNode !== null) { - $this->foster_parent = $table->parentNode; - - } elseif(!isset($table)) { - $this->foster_parent = $this->stack[0]; - - } elseif(isset($table) && ($table->parentNode === null || - $table->parentNode->nodeType !== XML_ELEMENT_NODE)) { - $this->foster_parent = $this->stack[$n - 1]; - } - } - - $this->inBody($token); - } - } - - private function inCaption($token) { - /* An end tag whose tag name is "caption" */ - if($token['type'] === HTML5::ENDTAG && $token['name'] === 'caption') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore - - /* Otherwise: */ - } else { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* Now, if the current node is not a caption element, then this - is a parse error. */ - // w/e - - /* Pop elements from this stack until a caption element has - been popped from the stack. */ - while(true) { - $node = end($this->stack)->nodeName; - array_pop($this->stack); - - if($node === 'caption') { - break; - } - } - - /* Clear the list of active formatting elements up to the last - marker. */ - $this->clearTheActiveFormattingElementsUpToTheLastMarker(); - - /* Switch the insertion mode to "in table". */ - $this->mode = self::IN_TABLE; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag - name is "table" */ - } elseif(($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', - 'thead', 'tr'))) || ($token['type'] === HTML5::ENDTAG && - $token['name'] === 'table')) { - /* Parse error. Act as if an end tag with the tag name "caption" - had been seen, then, if that token wasn't ignored, reprocess the - current token. */ - $this->inCaption(array( - 'name' => 'caption', - 'type' => HTML5::ENDTAG - )); - - return $this->inTable($token); - - /* An end tag whose tag name is one of: "body", "col", "colgroup", - "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'col', 'colgroup', 'html', 'tbody', 'tfoot', 'th', - 'thead', 'tr'))) { - // Parse error. Ignore the token. - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in body". */ - $this->inBody($token); - } - } - - private function inColumnGroup($token) { - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $text = $this->dom->createTextNode($token['data']); - end($this->stack)->appendChild($text); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - end($this->stack)->appendChild($comment); - - /* A start tag whose tag name is "col" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'col') { - /* Insert a col element for the token. Immediately pop the current - node off the stack of open elements. */ - $this->insertElement($token); - array_pop($this->stack); - - /* An end tag whose tag name is "colgroup" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'colgroup') { - /* If the current node is the root html element, then this is a - parse error, ignore the token. (innerHTML case) */ - if(end($this->stack)->nodeName === 'html') { - // Ignore - - /* Otherwise, pop the current node (which will be a colgroup - element) from the stack of open elements. Switch the insertion - mode to "in table". */ - } else { - array_pop($this->stack); - $this->mode = self::IN_TABLE; - } - - /* An end tag whose tag name is "col" */ - } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'col') { - /* Parse error. Ignore the token. */ - - /* Anything else */ - } else { - /* Act as if an end tag with the tag name "colgroup" had been seen, - and then, if that token wasn't ignored, reprocess the current token. */ - $this->inColumnGroup(array( - 'name' => 'colgroup', - 'type' => HTML5::ENDTAG - )); - - return $this->inTable($token); - } - } - - private function inTableBody($token) { - $clear = array('tbody', 'tfoot', 'thead', 'html'); - - /* A start tag whose tag name is "tr" */ - if($token['type'] === HTML5::STARTTAG && $token['name'] === 'tr') { - /* Clear the stack back to a table body context. */ - $this->clearStackToTableContext($clear); - - /* Insert a tr element for the token, then switch the insertion - mode to "in row". */ - $this->insertElement($token); - $this->mode = self::IN_ROW; - - /* A start tag whose tag name is one of: "th", "td" */ - } elseif($token['type'] === HTML5::STARTTAG && - ($token['name'] === 'th' || $token['name'] === 'td')) { - /* Parse error. Act as if a start tag with the tag name "tr" had - been seen, then reprocess the current token. */ - $this->inTableBody(array( - 'name' => 'tr', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - return $this->inRow($token); - - /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ - } elseif($token['type'] === HTML5::ENDTAG && - in_array($token['name'], array('tbody', 'tfoot', 'thead'))) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore - - /* Otherwise: */ - } else { - /* Clear the stack back to a table body context. */ - $this->clearStackToTableContext($clear); - - /* Pop the current node from the stack of open elements. Switch - the insertion mode to "in table". */ - array_pop($this->stack); - $this->mode = self::IN_TABLE; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */ - } elseif(($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'tfoor', 'thead'))) || - ($token['type'] === HTML5::STARTTAG && $token['name'] === 'table')) { - /* If the stack of open elements does not have a tbody, thead, or - tfoot element in table scope, this is a parse error. Ignore the - token. (innerHTML case) */ - if(!$this->elementInScope(array('tbody', 'thead', 'tfoot'), true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Clear the stack back to a table body context. */ - $this->clearStackToTableContext($clear); - - /* Act as if an end tag with the same tag name as the current - node ("tbody", "tfoot", or "thead") had been seen, then - reprocess the current token. */ - $this->inTableBody(array( - 'name' => end($this->stack)->nodeName, - 'type' => HTML5::ENDTAG - )); - - return $this->mainPhase($token); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html", "td", "th", "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) { - /* Parse error. Ignore the token. */ - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in table". */ - $this->inTable($token); - } - } - - private function inRow($token) { - $clear = array('tr', 'html'); - - /* A start tag whose tag name is one of: "th", "td" */ - if($token['type'] === HTML5::STARTTAG && - ($token['name'] === 'th' || $token['name'] === 'td')) { - /* Clear the stack back to a table row context. */ - $this->clearStackToTableContext($clear); - - /* Insert an HTML element for the token, then switch the insertion - mode to "in cell". */ - $this->insertElement($token); - $this->mode = self::IN_CELL; - - /* Insert a marker at the end of the list of active formatting - elements. */ - $this->a_formatting[] = self::MARKER; - - /* An end tag whose tag name is "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'tr') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Clear the stack back to a table row context. */ - $this->clearStackToTableContext($clear); - - /* Pop the current node (which will be a tr element) from the - stack of open elements. Switch the insertion mode to "in table - body". */ - array_pop($this->stack); - $this->mode = self::IN_TBODY; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr'))) { - /* Act as if an end tag with the tag name "tr" had been seen, then, - if that token wasn't ignored, reprocess the current token. */ - $this->inRow(array( - 'name' => 'tr', - 'type' => HTML5::ENDTAG - )); - - return $this->inCell($token); - - /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ - } elseif($token['type'] === HTML5::ENDTAG && - in_array($token['name'], array('tbody', 'tfoot', 'thead'))) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Otherwise, act as if an end tag with the tag name "tr" had - been seen, then reprocess the current token. */ - $this->inRow(array( - 'name' => 'tr', - 'type' => HTML5::ENDTAG - )); - - return $this->inCell($token); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html", "td", "th" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) { - /* Parse error. Ignore the token. */ - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in table". */ - $this->inTable($token); - } - } - - private function inCell($token) { - /* An end tag whose tag name is one of: "td", "th" */ - if($token['type'] === HTML5::ENDTAG && - ($token['name'] === 'td' || $token['name'] === 'th')) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as that of the token, then this is a - parse error and the token must be ignored. */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Generate implied end tags, except for elements with the same - tag name as the token. */ - $this->generateImpliedEndTags(array($token['name'])); - - /* Now, if the current node is not an element with the same tag - name as the token, then this is a parse error. */ - // k - - /* Pop elements from this stack until an element with the same - tag name as the token has been popped from the stack. */ - while(true) { - $node = end($this->stack)->nodeName; - array_pop($this->stack); - - if($node === $token['name']) { - break; - } - } - - /* Clear the list of active formatting elements up to the last - marker. */ - $this->clearTheActiveFormattingElementsUpToTheLastMarker(); - - /* Switch the insertion mode to "in row". (The current node - will be a tr element at this point.) */ - $this->mode = self::IN_ROW; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', - 'thead', 'tr'))) { - /* If the stack of open elements does not have a td or th element - in table scope, then this is a parse error; ignore the token. - (innerHTML case) */ - if(!$this->elementInScope(array('td', 'th'), true)) { - // Ignore. - - /* Otherwise, close the cell (see below) and reprocess the current - token. */ - } else { - $this->closeCell(); - return $this->inRow($token); - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', - 'thead', 'tr'))) { - /* If the stack of open elements does not have a td or th element - in table scope, then this is a parse error; ignore the token. - (innerHTML case) */ - if(!$this->elementInScope(array('td', 'th'), true)) { - // Ignore. - - /* Otherwise, close the cell (see below) and reprocess the current - token. */ - } else { - $this->closeCell(); - return $this->inRow($token); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html'))) { - /* Parse error. Ignore the token. */ - - /* An end tag whose tag name is one of: "table", "tbody", "tfoot", - "thead", "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('table', 'tbody', 'tfoot', 'thead', 'tr'))) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as that of the token (which can only - happen for "tbody", "tfoot" and "thead", or, in the innerHTML case), - then this is a parse error and the token must be ignored. */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise, close the cell (see below) and reprocess the current - token. */ - } else { - $this->closeCell(); - return $this->inRow($token); - } - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in body". */ - $this->inBody($token); - } - } - - private function inSelect($token) { - /* Handle the token as follows: */ - - /* A character token */ - if($token['type'] === HTML5::CHARACTR) { - /* Append the token's character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag token whose tag name is "option" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'option') { - /* If the current node is an option element, act as if an end tag - with the tag name "option" had been seen. */ - if(end($this->stack)->nodeName === 'option') { - $this->inSelect(array( - 'name' => 'option', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* A start tag token whose tag name is "optgroup" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'optgroup') { - /* If the current node is an option element, act as if an end tag - with the tag name "option" had been seen. */ - if(end($this->stack)->nodeName === 'option') { - $this->inSelect(array( - 'name' => 'option', - 'type' => HTML5::ENDTAG - )); - } - - /* If the current node is an optgroup element, act as if an end tag - with the tag name "optgroup" had been seen. */ - if(end($this->stack)->nodeName === 'optgroup') { - $this->inSelect(array( - 'name' => 'optgroup', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* An end tag token whose tag name is "optgroup" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'optgroup') { - /* First, if the current node is an option element, and the node - immediately before it in the stack of open elements is an optgroup - element, then act as if an end tag with the tag name "option" had - been seen. */ - $elements_in_stack = count($this->stack); - - if($this->stack[$elements_in_stack - 1]->nodeName === 'option' && - $this->stack[$elements_in_stack - 2]->nodeName === 'optgroup') { - $this->inSelect(array( - 'name' => 'option', - 'type' => HTML5::ENDTAG - )); - } - - /* If the current node is an optgroup element, then pop that node - from the stack of open elements. Otherwise, this is a parse error, - ignore the token. */ - if($this->stack[$elements_in_stack - 1] === 'optgroup') { - array_pop($this->stack); - } - - /* An end tag token whose tag name is "option" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'option') { - /* If the current node is an option element, then pop that node - from the stack of open elements. Otherwise, this is a parse error, - ignore the token. */ - if(end($this->stack)->nodeName === 'option') { - array_pop($this->stack); - } - - /* An end tag whose tag name is "select" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'select') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if(!$this->elementInScope($token['name'], true)) { - // w/e - - /* Otherwise: */ - } else { - /* Pop elements from the stack of open elements until a select - element has been popped from the stack. */ - while(true) { - $current = end($this->stack)->nodeName; - array_pop($this->stack); - - if($current === 'select') { - break; - } - } - - /* Reset the insertion mode appropriately. */ - $this->resetInsertionMode(); - } - - /* A start tag whose tag name is "select" */ - } elseif($token['name'] === 'select' && - $token['type'] === HTML5::STARTTAG) { - /* Parse error. Act as if the token had been an end tag with the - tag name "select" instead. */ - $this->inSelect(array( - 'name' => 'select', - 'type' => HTML5::ENDTAG - )); - - /* An end tag whose tag name is one of: "caption", "table", "tbody", - "tfoot", "thead", "tr", "td", "th" */ - } elseif(in_array($token['name'], array('caption', 'table', 'tbody', - 'tfoot', 'thead', 'tr', 'td', 'th')) && $token['type'] === HTML5::ENDTAG) { - /* Parse error. */ - // w/e - - /* If the stack of open elements has an element in table scope with - the same tag name as that of the token, then act as if an end tag - with the tag name "select" had been seen, and reprocess the token. - Otherwise, ignore the token. */ - if($this->elementInScope($token['name'], true)) { - $this->inSelect(array( - 'name' => 'select', - 'type' => HTML5::ENDTAG - )); - - $this->mainPhase($token); - } - - /* Anything else */ - } else { - /* Parse error. Ignore the token. */ - } - } - - private function afterBody($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Process the token as it would be processed if the insertion mode - was "in body". */ - $this->inBody($token); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the first element in the stack of open - elements (the html element), with the data attribute set to the - data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - $this->stack[0]->appendChild($comment); - - /* An end tag with the tag name "html" */ - } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') { - /* If the parser was originally created in order to handle the - setting of an element's innerHTML attribute, this is a parse error; - ignore the token. (The element will be an html element in this - case.) (innerHTML case) */ - - /* Otherwise, switch to the trailing end phase. */ - $this->phase = self::END_PHASE; - - /* Anything else */ - } else { - /* Parse error. Set the insertion mode to "in body" and reprocess - the token. */ - $this->mode = self::IN_BODY; - return $this->inBody($token); - } - } - - private function inFrameset($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag with the tag name "frameset" */ - } elseif($token['name'] === 'frameset' && - $token['type'] === HTML5::STARTTAG) { - $this->insertElement($token); - - /* An end tag with the tag name "frameset" */ - } elseif($token['name'] === 'frameset' && - $token['type'] === HTML5::ENDTAG) { - /* If the current node is the root html element, then this is a - parse error; ignore the token. (innerHTML case) */ - if(end($this->stack)->nodeName === 'html') { - // Ignore - - } else { - /* Otherwise, pop the current node from the stack of open - elements. */ - array_pop($this->stack); - - /* If the parser was not originally created in order to handle - the setting of an element's innerHTML attribute (innerHTML case), - and the current node is no longer a frameset element, then change - the insertion mode to "after frameset". */ - $this->mode = self::AFTR_FRAME; - } - - /* A start tag with the tag name "frame" */ - } elseif($token['name'] === 'frame' && - $token['type'] === HTML5::STARTTAG) { - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Immediately pop the current node off the stack of open elements. */ - array_pop($this->stack); - - /* A start tag with the tag name "noframes" */ - } elseif($token['name'] === 'noframes' && - $token['type'] === HTML5::STARTTAG) { - /* Process the token as if the insertion mode had been "in body". */ - $this->inBody($token); - - /* Anything else */ - } else { - /* Parse error. Ignore the token. */ - } - } - - private function afterFrameset($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* An end tag with the tag name "html" */ - } elseif($token['name'] === 'html' && - $token['type'] === HTML5::ENDTAG) { - /* Switch to the trailing end phase. */ - $this->phase = self::END_PHASE; - - /* A start tag with the tag name "noframes" */ - } elseif($token['name'] === 'noframes' && - $token['type'] === HTML5::STARTTAG) { - /* Process the token as if the insertion mode had been "in body". */ - $this->inBody($token); - - /* Anything else */ - } else { - /* Parse error. Ignore the token. */ - } - } - - private function trailingEndPhase($token) { - /* After the main phase, as each token is emitted from the tokenisation - stage, it must be processed as described in this section. */ - - /* A DOCTYPE token */ - if($token['type'] === HTML5::DOCTYPE) { - // Parse error. Ignore the token. - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the Document object with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - $this->dom->appendChild($comment); - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - } elseif($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Process the token as it would be processed in the main phase. */ - $this->mainPhase($token); - - /* A character token that is not one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE. Or a start tag token. Or an end tag token. */ - } elseif(($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || - $token['type'] === HTML5::STARTTAG || $token['type'] === HTML5::ENDTAG) { - /* Parse error. Switch back to the main phase and reprocess the - token. */ - $this->phase = self::MAIN_PHASE; - return $this->mainPhase($token); - - /* An end-of-file token */ - } elseif($token['type'] === HTML5::EOF) { - /* OMG DONE!! */ - } - } - - private function insertElement($token, $append = true, $check = false) { - // Proprietary workaround for libxml2's limitations with tag names - if ($check) { - // Slightly modified HTML5 tag-name modification, - // removing anything that's not an ASCII letter, digit, or hyphen - $token['name'] = preg_replace('/[^a-z0-9-]/i', '', $token['name']); - // Remove leading hyphens and numbers - $token['name'] = ltrim($token['name'], '-0..9'); - // In theory, this should ever be needed, but just in case - if ($token['name'] === '') $token['name'] = 'span'; // arbitrary generic choice - } - - $el = $this->dom->createElement($token['name']); - - foreach($token['attr'] as $attr) { - if(!$el->hasAttribute($attr['name'])) { - $el->setAttribute($attr['name'], $attr['value']); - } - } - - $this->appendToRealParent($el); - $this->stack[] = $el; - - return $el; - } - - private function insertText($data) { - $text = $this->dom->createTextNode($data); - $this->appendToRealParent($text); - } - - private function insertComment($data) { - $comment = $this->dom->createComment($data); - $this->appendToRealParent($comment); - } - - private function appendToRealParent($node) { - if($this->foster_parent === null) { - end($this->stack)->appendChild($node); - - } elseif($this->foster_parent !== null) { - /* If the foster parent element is the parent element of the - last table element in the stack of open elements, then the new - node must be inserted immediately before the last table element - in the stack of open elements in the foster parent element; - otherwise, the new node must be appended to the foster parent - element. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === 'table' && - $this->stack[$n]->parentNode !== null) { - $table = $this->stack[$n]; - break; - } - } - - if(isset($table) && $this->foster_parent->isSameNode($table->parentNode)) - $this->foster_parent->insertBefore($node, $table); - else - $this->foster_parent->appendChild($node); - - $this->foster_parent = null; - } - } - - private function elementInScope($el, $table = false) { - if(is_array($el)) { - foreach($el as $element) { - if($this->elementInScope($element, $table)) { - return true; - } - } - - return false; - } - - $leng = count($this->stack); - - for($n = 0; $n < $leng; $n++) { - /* 1. Initialise node to be the current node (the bottommost node of - the stack). */ - $node = $this->stack[$leng - 1 - $n]; - - if($node->tagName === $el) { - /* 2. If node is the target node, terminate in a match state. */ - return true; - - } elseif($node->tagName === 'table') { - /* 3. Otherwise, if node is a table element, terminate in a failure - state. */ - return false; - - } elseif($table === true && in_array($node->tagName, array('caption', 'td', - 'th', 'button', 'marquee', 'object'))) { - /* 4. Otherwise, if the algorithm is the "has an element in scope" - variant (rather than the "has an element in table scope" variant), - and node is one of the following, terminate in a failure state. */ - return false; - - } elseif($node === $node->ownerDocument->documentElement) { - /* 5. Otherwise, if node is an html element (root element), terminate - in a failure state. (This can only happen if the node is the topmost - node of the stack of open elements, and prevents the next step from - being invoked if there are no more elements in the stack.) */ - return false; - } - - /* Otherwise, set node to the previous entry in the stack of open - elements and return to step 2. (This will never fail, since the loop - will always terminate in the previous step if the top of the stack - is reached.) */ - } - } - - private function reconstructActiveFormattingElements() { - /* 1. If there are no entries in the list of active formatting elements, - then there is nothing to reconstruct; stop this algorithm. */ - $formatting_elements = count($this->a_formatting); - - if($formatting_elements === 0) { - return false; - } - - /* 3. Let entry be the last (most recently added) element in the list - of active formatting elements. */ - $entry = end($this->a_formatting); - - /* 2. If the last (most recently added) entry in the list of active - formatting elements is a marker, or if it is an element that is in the - stack of open elements, then there is nothing to reconstruct; stop this - algorithm. */ - if($entry === self::MARKER || in_array($entry, $this->stack, true)) { - return false; - } - - for($a = $formatting_elements - 1; $a >= 0; true) { - /* 4. If there are no entries before entry in the list of active - formatting elements, then jump to step 8. */ - if($a === 0) { - $step_seven = false; - break; - } - - /* 5. Let entry be the entry one earlier than entry in the list of - active formatting elements. */ - $a--; - $entry = $this->a_formatting[$a]; - - /* 6. If entry is neither a marker nor an element that is also in - thetack of open elements, go to step 4. */ - if($entry === self::MARKER || in_array($entry, $this->stack, true)) { - break; - } - } - - while(true) { - /* 7. Let entry be the element one later than entry in the list of - active formatting elements. */ - if(isset($step_seven) && $step_seven === true) { - $a++; - $entry = $this->a_formatting[$a]; - } - - /* 8. Perform a shallow clone of the element entry to obtain clone. */ - $clone = $entry->cloneNode(); - - /* 9. Append clone to the current node and push it onto the stack - of open elements so that it is the new current node. */ - end($this->stack)->appendChild($clone); - $this->stack[] = $clone; - - /* 10. Replace the entry for entry in the list with an entry for - clone. */ - $this->a_formatting[$a] = $clone; - - /* 11. If the entry for clone in the list of active formatting - elements is not the last entry in the list, return to step 7. */ - if(end($this->a_formatting) !== $clone) { - $step_seven = true; - } else { - break; - } - } - } - - private function clearTheActiveFormattingElementsUpToTheLastMarker() { - /* When the steps below require the UA to clear the list of active - formatting elements up to the last marker, the UA must perform the - following steps: */ - - while(true) { - /* 1. Let entry be the last (most recently added) entry in the list - of active formatting elements. */ - $entry = end($this->a_formatting); - - /* 2. Remove entry from the list of active formatting elements. */ - array_pop($this->a_formatting); - - /* 3. If entry was a marker, then stop the algorithm at this point. - The list has been cleared up to the last marker. */ - if($entry === self::MARKER) { - break; - } - } - } - - private function generateImpliedEndTags($exclude = array()) { - /* When the steps below require the UA to generate implied end tags, - then, if the current node is a dd element, a dt element, an li element, - a p element, a td element, a th element, or a tr element, the UA must - act as if an end tag with the respective tag name had been seen and - then generate implied end tags again. */ - $node = end($this->stack); - $elements = array_diff(array('dd', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude); - - while(in_array(end($this->stack)->nodeName, $elements)) { - array_pop($this->stack); - } - } - - private function getElementCategory($node) { - $name = $node->tagName; - if(in_array($name, $this->special)) - return self::SPECIAL; - - elseif(in_array($name, $this->scoping)) - return self::SCOPING; - - elseif(in_array($name, $this->formatting)) - return self::FORMATTING; - - else - return self::PHRASING; - } - - private function clearStackToTableContext($elements) { - /* When the steps above require the UA to clear the stack back to a - table context, it means that the UA must, while the current node is not - a table element or an html element, pop elements from the stack of open - elements. If this causes any elements to be popped from the stack, then - this is a parse error. */ - while(true) { - $node = end($this->stack)->nodeName; - - if(in_array($node, $elements)) { - break; - } else { - array_pop($this->stack); - } - } - } - - private function resetInsertionMode() { - /* 1. Let last be false. */ - $last = false; - $leng = count($this->stack); - - for($n = $leng - 1; $n >= 0; $n--) { - /* 2. Let node be the last node in the stack of open elements. */ - $node = $this->stack[$n]; - - /* 3. If node is the first node in the stack of open elements, then - set last to true. If the element whose innerHTML attribute is being - set is neither a td element nor a th element, then set node to the - element whose innerHTML attribute is being set. (innerHTML case) */ - if($this->stack[0]->isSameNode($node)) { - $last = true; - } - - /* 4. If node is a select element, then switch the insertion mode to - "in select" and abort these steps. (innerHTML case) */ - if($node->nodeName === 'select') { - $this->mode = self::IN_SELECT; - break; - - /* 5. If node is a td or th element, then switch the insertion mode - to "in cell" and abort these steps. */ - } elseif($node->nodeName === 'td' || $node->nodeName === 'th') { - $this->mode = self::IN_CELL; - break; - - /* 6. If node is a tr element, then switch the insertion mode to - "in row" and abort these steps. */ - } elseif($node->nodeName === 'tr') { - $this->mode = self::IN_ROW; - break; - - /* 7. If node is a tbody, thead, or tfoot element, then switch the - insertion mode to "in table body" and abort these steps. */ - } elseif(in_array($node->nodeName, array('tbody', 'thead', 'tfoot'))) { - $this->mode = self::IN_TBODY; - break; - - /* 8. If node is a caption element, then switch the insertion mode - to "in caption" and abort these steps. */ - } elseif($node->nodeName === 'caption') { - $this->mode = self::IN_CAPTION; - break; - - /* 9. If node is a colgroup element, then switch the insertion mode - to "in column group" and abort these steps. (innerHTML case) */ - } elseif($node->nodeName === 'colgroup') { - $this->mode = self::IN_CGROUP; - break; - - /* 10. If node is a table element, then switch the insertion mode - to "in table" and abort these steps. */ - } elseif($node->nodeName === 'table') { - $this->mode = self::IN_TABLE; - break; - - /* 11. If node is a head element, then switch the insertion mode - to "in body" ("in body"! not "in head"!) and abort these steps. - (innerHTML case) */ - } elseif($node->nodeName === 'head') { - $this->mode = self::IN_BODY; - break; - - /* 12. If node is a body element, then switch the insertion mode to - "in body" and abort these steps. */ - } elseif($node->nodeName === 'body') { - $this->mode = self::IN_BODY; - break; - - /* 13. If node is a frameset element, then switch the insertion - mode to "in frameset" and abort these steps. (innerHTML case) */ - } elseif($node->nodeName === 'frameset') { - $this->mode = self::IN_FRAME; - break; - - /* 14. If node is an html element, then: if the head element - pointer is null, switch the insertion mode to "before head", - otherwise, switch the insertion mode to "after head". In either - case, abort these steps. (innerHTML case) */ - } elseif($node->nodeName === 'html') { - $this->mode = ($this->head_pointer === null) - ? self::BEFOR_HEAD - : self::AFTER_HEAD; - - break; - - /* 15. If last is true, then set the insertion mode to "in body" - and abort these steps. (innerHTML case) */ - } elseif($last) { - $this->mode = self::IN_BODY; - break; - } - } - } - - private function closeCell() { - /* If the stack of open elements has a td or th element in table scope, - then act as if an end tag token with that tag name had been seen. */ - foreach(array('td', 'th') as $cell) { - if($this->elementInScope($cell, true)) { - $this->inCell(array( - 'name' => $cell, - 'type' => HTML5::ENDTAG - )); - - break; - } - } - } - - public function save() { - return $this->dom; - } -} -?> diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy/FixNesting.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy/FixNesting.php deleted file mode 100644 index d1588b938..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy/FixNesting.php +++ /dev/null @@ -1,346 +0,0 @@ -getHTMLDefinition(); - - $excludes_enabled = !$config->get('Core.DisableExcludes'); - - // insert implicit "parent" node, will be removed at end. - // DEFINITION CALL - $parent_name = $definition->info_parent; - array_unshift($tokens, new HTMLPurifier_Token_Start($parent_name)); - $tokens[] = new HTMLPurifier_Token_End($parent_name); - - // setup the context variable 'IsInline', for chameleon processing - // is 'false' when we are not inline, 'true' when it must always - // be inline, and an integer when it is inline for a certain - // branch of the document tree - $is_inline = $definition->info_parent_def->descendants_are_inline; - $context->register('IsInline', $is_inline); - - // setup error collector - $e =& $context->get('ErrorCollector', true); - - //####################################################################// - // Loop initialization - - // stack that contains the indexes of all parents, - // $stack[count($stack)-1] being the current parent - $stack = array(); - - // stack that contains all elements that are excluded - // it is organized by parent elements, similar to $stack, - // but it is only populated when an element with exclusions is - // processed, i.e. there won't be empty exclusions. - $exclude_stack = array(); - - // variable that contains the start token while we are processing - // nodes. This enables error reporting to do its job - $start_token = false; - $context->register('CurrentToken', $start_token); - - //####################################################################// - // Loop - - // iterate through all start nodes. Determining the start node - // is complicated so it has been omitted from the loop construct - for ($i = 0, $size = count($tokens) ; $i < $size; ) { - - //################################################################// - // Gather information on children - - // child token accumulator - $child_tokens = array(); - - // scroll to the end of this node, report number, and collect - // all children - for ($j = $i, $depth = 0; ; $j++) { - if ($tokens[$j] instanceof HTMLPurifier_Token_Start) { - $depth++; - // skip token assignment on first iteration, this is the - // token we currently are on - if ($depth == 1) continue; - } elseif ($tokens[$j] instanceof HTMLPurifier_Token_End) { - $depth--; - // skip token assignment on last iteration, this is the - // end token of the token we're currently on - if ($depth == 0) break; - } - $child_tokens[] = $tokens[$j]; - } - - // $i is index of start token - // $j is index of end token - - $start_token = $tokens[$i]; // to make token available via CurrentToken - - //################################################################// - // Gather information on parent - - // calculate parent information - if ($count = count($stack)) { - $parent_index = $stack[$count-1]; - $parent_name = $tokens[$parent_index]->name; - if ($parent_index == 0) { - $parent_def = $definition->info_parent_def; - } else { - $parent_def = $definition->info[$parent_name]; - } - } else { - // processing as if the parent were the "root" node - // unknown info, it won't be used anyway, in the future, - // we may want to enforce one element only (this is - // necessary for HTML Purifier to clean entire documents - $parent_index = $parent_name = $parent_def = null; - } - - // calculate context - if ($is_inline === false) { - // check if conditions make it inline - if (!empty($parent_def) && $parent_def->descendants_are_inline) { - $is_inline = $count - 1; - } - } else { - // check if we're out of inline - if ($count === $is_inline) { - $is_inline = false; - } - } - - //################################################################// - // Determine whether element is explicitly excluded SGML-style - - // determine whether or not element is excluded by checking all - // parent exclusions. The array should not be very large, two - // elements at most. - $excluded = false; - if (!empty($exclude_stack) && $excludes_enabled) { - foreach ($exclude_stack as $lookup) { - if (isset($lookup[$tokens[$i]->name])) { - $excluded = true; - // no need to continue processing - break; - } - } - } - - //################################################################// - // Perform child validation - - if ($excluded) { - // there is an exclusion, remove the entire node - $result = false; - $excludes = array(); // not used, but good to initialize anyway - } else { - // DEFINITION CALL - if ($i === 0) { - // special processing for the first node - $def = $definition->info_parent_def; - } else { - $def = $definition->info[$tokens[$i]->name]; - - } - - if (!empty($def->child)) { - // have DTD child def validate children - $result = $def->child->validateChildren( - $child_tokens, $config, $context); - } else { - // weird, no child definition, get rid of everything - $result = false; - } - - // determine whether or not this element has any exclusions - $excludes = $def->excludes; - } - - // $result is now a bool or array - - //################################################################// - // Process result by interpreting $result - - if ($result === true || $child_tokens === $result) { - // leave the node as is - - // register start token as a parental node start - $stack[] = $i; - - // register exclusions if there are any - if (!empty($excludes)) $exclude_stack[] = $excludes; - - // move cursor to next possible start node - $i++; - - } elseif($result === false) { - // remove entire node - - if ($e) { - if ($excluded) { - $e->send(E_ERROR, 'Strategy_FixNesting: Node excluded'); - } else { - $e->send(E_ERROR, 'Strategy_FixNesting: Node removed'); - } - } - - // calculate length of inner tokens and current tokens - $length = $j - $i + 1; - - // perform removal - array_splice($tokens, $i, $length); - - // update size - $size -= $length; - - // there is no start token to register, - // current node is now the next possible start node - // unless it turns out that we need to do a double-check - - // this is a rought heuristic that covers 100% of HTML's - // cases and 99% of all other cases. A child definition - // that would be tricked by this would be something like: - // ( | a b c) where it's all or nothing. Fortunately, - // our current implementation claims that that case would - // not allow empty, even if it did - if (!$parent_def->child->allow_empty) { - // we need to do a double-check [BACKTRACK] - $i = $parent_index; - array_pop($stack); - } - - // PROJECTED OPTIMIZATION: Process all children elements before - // reprocessing parent node. - - } else { - // replace node with $result - - // calculate length of inner tokens - $length = $j - $i - 1; - - if ($e) { - if (empty($result) && $length) { - $e->send(E_ERROR, 'Strategy_FixNesting: Node contents removed'); - } else { - $e->send(E_WARNING, 'Strategy_FixNesting: Node reorganized'); - } - } - - // perform replacement - array_splice($tokens, $i + 1, $length, $result); - - // update size - $size -= $length; - $size += count($result); - - // register start token as a parental node start - $stack[] = $i; - - // register exclusions if there are any - if (!empty($excludes)) $exclude_stack[] = $excludes; - - // move cursor to next possible start node - $i++; - - } - - //################################################################// - // Scroll to next start node - - // We assume, at this point, that $i is the index of the token - // that is the first possible new start point for a node. - - // Test if the token indeed is a start tag, if not, move forward - // and test again. - $size = count($tokens); - while ($i < $size and !$tokens[$i] instanceof HTMLPurifier_Token_Start) { - if ($tokens[$i] instanceof HTMLPurifier_Token_End) { - // pop a token index off the stack if we ended a node - array_pop($stack); - // pop an exclusion lookup off exclusion stack if - // we ended node and that node had exclusions - if ($i == 0 || $i == $size - 1) { - // use specialized var if it's the super-parent - $s_excludes = $definition->info_parent_def->excludes; - } else { - $s_excludes = $definition->info[$tokens[$i]->name]->excludes; - } - if ($s_excludes) { - array_pop($exclude_stack); - } - } - $i++; - } - - } - - //####################################################################// - // Post-processing - - // remove implicit parent tokens at the beginning and end - array_shift($tokens); - array_pop($tokens); - - // remove context variables - $context->destroy('IsInline'); - $context->destroy('CurrentToken'); - - //####################################################################// - // Return - - return $tokens; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token.php deleted file mode 100644 index 7900e6cb1..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token.php +++ /dev/null @@ -1,57 +0,0 @@ -line = $l; - $this->col = $c; - } - - /** - * Convenience function for DirectLex settings line/col position. - */ - public function rawPosition($l, $c) { - if ($c === -1) $l++; - $this->line = $l; - $this->col = $c; - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token/Comment.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token/Comment.php deleted file mode 100644 index dc6bdcabb..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token/Comment.php +++ /dev/null @@ -1,22 +0,0 @@ -data = $data; - $this->line = $line; - $this->col = $col; - } -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/TokenFactory.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/TokenFactory.php deleted file mode 100644 index 7cf48fb41..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/TokenFactory.php +++ /dev/null @@ -1,94 +0,0 @@ -p_start = new HTMLPurifier_Token_Start('', array()); - $this->p_end = new HTMLPurifier_Token_End(''); - $this->p_empty = new HTMLPurifier_Token_Empty('', array()); - $this->p_text = new HTMLPurifier_Token_Text(''); - $this->p_comment= new HTMLPurifier_Token_Comment(''); - } - - /** - * Creates a HTMLPurifier_Token_Start. - * @param $name Tag name - * @param $attr Associative array of attributes - * @return Generated HTMLPurifier_Token_Start - */ - public function createStart($name, $attr = array()) { - $p = clone $this->p_start; - $p->__construct($name, $attr); - return $p; - } - - /** - * Creates a HTMLPurifier_Token_End. - * @param $name Tag name - * @return Generated HTMLPurifier_Token_End - */ - public function createEnd($name) { - $p = clone $this->p_end; - $p->__construct($name); - return $p; - } - - /** - * Creates a HTMLPurifier_Token_Empty. - * @param $name Tag name - * @param $attr Associative array of attributes - * @return Generated HTMLPurifier_Token_Empty - */ - public function createEmpty($name, $attr = array()) { - $p = clone $this->p_empty; - $p->__construct($name, $attr); - return $p; - } - - /** - * Creates a HTMLPurifier_Token_Text. - * @param $data Data of text token - * @return Generated HTMLPurifier_Token_Text - */ - public function createText($data) { - $p = clone $this->p_text; - $p->__construct($data); - return $p; - } - - /** - * Creates a HTMLPurifier_Token_Comment. - * @param $data Data of comment token - * @return Generated HTMLPurifier_Token_Comment - */ - public function createComment($data) { - $p = clone $this->p_comment; - $p->__construct($data); - return $p; - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/DisableExternal.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/DisableExternal.php deleted file mode 100644 index d8a39a501..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/DisableExternal.php +++ /dev/null @@ -1,23 +0,0 @@ -getDefinition('URI')->host; - if ($our_host !== null) $this->ourHostParts = array_reverse(explode('.', $our_host)); - } - public function filter(&$uri, $config, $context) { - if (is_null($uri->host)) return true; - if ($this->ourHostParts === false) return false; - $host_parts = array_reverse(explode('.', $uri->host)); - foreach ($this->ourHostParts as $i => $x) { - if (!isset($host_parts[$i])) return false; - if ($host_parts[$i] != $this->ourHostParts[$i]) return false; - } - return true; - } -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/DisableExternalResources.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/DisableExternalResources.php deleted file mode 100644 index 881abc43c..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/DisableExternalResources.php +++ /dev/null @@ -1,12 +0,0 @@ -get('EmbeddedURI', true)) return true; - return parent::filter($uri, $config, $context); - } -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/DisableResources.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/DisableResources.php deleted file mode 100644 index 67538c7bb..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/DisableResources.php +++ /dev/null @@ -1,11 +0,0 @@ -get('EmbeddedURI', true); - } -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/Munge.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/Munge.php deleted file mode 100644 index de695df14..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/Munge.php +++ /dev/null @@ -1,53 +0,0 @@ -target = $config->get('URI.' . $this->name); - $this->parser = new HTMLPurifier_URIParser(); - $this->doEmbed = $config->get('URI.MungeResources'); - $this->secretKey = $config->get('URI.MungeSecretKey'); - return true; - } - public function filter(&$uri, $config, $context) { - if ($context->get('EmbeddedURI', true) && !$this->doEmbed) return true; - - $scheme_obj = $uri->getSchemeObj($config, $context); - if (!$scheme_obj) return true; // ignore unknown schemes, maybe another postfilter did it - if (!$scheme_obj->browsable) return true; // ignore non-browseable schemes, since we can't munge those in a reasonable way - if ($uri->isBenign($config, $context)) return true; // don't redirect if a benign URL - - $this->makeReplace($uri, $config, $context); - $this->replace = array_map('rawurlencode', $this->replace); - - $new_uri = strtr($this->target, $this->replace); - $new_uri = $this->parser->parse($new_uri); - // don't redirect if the target host is the same as the - // starting host - if ($uri->host === $new_uri->host) return true; - $uri = $new_uri; // overwrite - return true; - } - - protected function makeReplace($uri, $config, $context) { - $string = $uri->toString(); - // always available - $this->replace['%s'] = $string; - $this->replace['%r'] = $context->get('EmbeddedURI', true); - $token = $context->get('CurrentToken', true); - $this->replace['%n'] = $token ? $token->name : null; - $this->replace['%m'] = $context->get('CurrentAttr', true); - $this->replace['%p'] = $context->get('CurrentCSSProperty', true); - // not always available - if ($this->secretKey) $this->replace['%t'] = sha1($this->secretKey . ':' . $string); - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/SafeIframe.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/SafeIframe.php deleted file mode 100644 index 284bb13de..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/SafeIframe.php +++ /dev/null @@ -1,35 +0,0 @@ -regexp = $config->get('URI.SafeIframeRegexp'); - return true; - } - public function filter(&$uri, $config, $context) { - // check if filter not applicable - if (!$config->get('HTML.SafeIframe')) return true; - // check if the filter should actually trigger - if (!$context->get('EmbeddedURI', true)) return true; - $token = $context->get('CurrentToken', true); - if (!($token && $token->name == 'iframe')) return true; - // check if we actually have some whitelists enabled - if ($this->regexp === null) return false; - // actually check the whitelists - return preg_match($this->regexp, $uri->toString()); - } -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/file.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/file.php deleted file mode 100644 index d74a3f198..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/file.php +++ /dev/null @@ -1,32 +0,0 @@ -userinfo = null; - // file:// makes no provisions for accessing the resource - $uri->port = null; - // While it seems to work on Firefox, the querystring has - // no possible effect and is thus stripped. - $uri->query = null; - return true; - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/news.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/news.php deleted file mode 100644 index 84a6748d8..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/news.php +++ /dev/null @@ -1,22 +0,0 @@ -userinfo = null; - $uri->host = null; - $uri->port = null; - $uri->query = null; - // typecode check needed on path - return true; - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/nntp.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/nntp.php deleted file mode 100644 index 4ccea0dfc..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/nntp.php +++ /dev/null @@ -1,19 +0,0 @@ -userinfo = null; - $uri->query = null; - return true; - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/VarParser.php b/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/VarParser.php deleted file mode 100644 index 68e72ae86..000000000 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/VarParser.php +++ /dev/null @@ -1,154 +0,0 @@ - self::STRING, - 'istring' => self::ISTRING, - 'text' => self::TEXT, - 'itext' => self::ITEXT, - 'int' => self::INT, - 'float' => self::FLOAT, - 'bool' => self::BOOL, - 'lookup' => self::LOOKUP, - 'list' => self::ALIST, - 'hash' => self::HASH, - 'mixed' => self::MIXED - ); - - /** - * Lookup table of types that are string, and can have aliases or - * allowed value lists. - */ - static public $stringTypes = array( - self::STRING => true, - self::ISTRING => true, - self::TEXT => true, - self::ITEXT => true, - ); - - /** - * Validate a variable according to type. Throws - * HTMLPurifier_VarParserException if invalid. - * It may return NULL as a valid type if $allow_null is true. - * - * @param $var Variable to validate - * @param $type Type of variable, see HTMLPurifier_VarParser->types - * @param $allow_null Whether or not to permit null as a value - * @return Validated and type-coerced variable - */ - final public function parse($var, $type, $allow_null = false) { - if (is_string($type)) { - if (!isset(HTMLPurifier_VarParser::$types[$type])) { - throw new HTMLPurifier_VarParserException("Invalid type '$type'"); - } else { - $type = HTMLPurifier_VarParser::$types[$type]; - } - } - $var = $this->parseImplementation($var, $type, $allow_null); - if ($allow_null && $var === null) return null; - // These are basic checks, to make sure nothing horribly wrong - // happened in our implementations. - switch ($type) { - case (self::STRING): - case (self::ISTRING): - case (self::TEXT): - case (self::ITEXT): - if (!is_string($var)) break; - if ($type == self::ISTRING || $type == self::ITEXT) $var = strtolower($var); - return $var; - case (self::INT): - if (!is_int($var)) break; - return $var; - case (self::FLOAT): - if (!is_float($var)) break; - return $var; - case (self::BOOL): - if (!is_bool($var)) break; - return $var; - case (self::LOOKUP): - case (self::ALIST): - case (self::HASH): - if (!is_array($var)) break; - if ($type === self::LOOKUP) { - foreach ($var as $k) if ($k !== true) $this->error('Lookup table contains value other than true'); - } elseif ($type === self::ALIST) { - $keys = array_keys($var); - if (array_keys($keys) !== $keys) $this->error('Indices for list are not uniform'); - } - return $var; - case (self::MIXED): - return $var; - default: - $this->errorInconsistent(get_class($this), $type); - } - $this->errorGeneric($var, $type); - } - - /** - * Actually implements the parsing. Base implementation is to not - * do anything to $var. Subclasses should overload this! - */ - protected function parseImplementation($var, $type, $allow_null) { - return $var; - } - - /** - * Throws an exception. - */ - protected function error($msg) { - throw new HTMLPurifier_VarParserException($msg); - } - - /** - * Throws an inconsistency exception. - * @note This should not ever be called. It would be called if we - * extend the allowed values of HTMLPurifier_VarParser without - * updating subclasses. - */ - protected function errorInconsistent($class, $type) { - throw new HTMLPurifier_Exception("Inconsistency in $class: ".HTMLPurifier_VarParser::getTypeName($type)." not implemented"); - } - - /** - * Generic error for if a type didn't work. - */ - protected function errorGeneric($var, $type) { - $vtype = gettype($var); - $this->error("Expected type ".HTMLPurifier_VarParser::getTypeName($type).", got $vtype"); - } - - static public function getTypeName($type) { - static $lookup; - if (!$lookup) { - // Lazy load the alternative lookup table - $lookup = array_flip(HTMLPurifier_VarParser::$types); - } - if (!isset($lookup[$type])) return 'unknown'; - return $lookup[$type]; - } - -} - -// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/CREDITS b/library/vendor/htmlpurifier-4.6.0-lite/CREDITS similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/CREDITS rename to library/vendor/htmlpurifier-4.6.0-lite/CREDITS diff --git a/library/vendor/htmlpurifier-4.5.0-lite/INSTALL b/library/vendor/htmlpurifier-4.6.0-lite/INSTALL similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/INSTALL rename to library/vendor/htmlpurifier-4.6.0-lite/INSTALL diff --git a/library/vendor/htmlpurifier-4.5.0-lite/LICENSE b/library/vendor/htmlpurifier-4.6.0-lite/LICENSE similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/LICENSE rename to library/vendor/htmlpurifier-4.6.0-lite/LICENSE diff --git a/library/vendor/htmlpurifier-4.5.0-lite/NEWS b/library/vendor/htmlpurifier-4.6.0-lite/NEWS similarity index 97% rename from library/vendor/htmlpurifier-4.5.0-lite/NEWS rename to library/vendor/htmlpurifier-4.6.0-lite/NEWS index 2b2f0e664..90a054620 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/NEWS +++ b/library/vendor/htmlpurifier-4.6.0-lite/NEWS @@ -9,6 +9,28 @@ NEWS ( CHANGELOG and HISTORY ) HTMLPurifier . Internal change ========================== +4.6.0, released 2013-11-30 +# Secure URI munge hashing algorithm has changed to hash_hmac("sha256", $url, $secret). + Please update any verification scripts you may have. +# URI parsing algorithm was made more strict, so only prefixes which + looks like schemes will actually be schemes. Thanks + Michael Gusev for fixing. +# %Core.EscapeInvalidChildren is no longer supported, and no longer does + anything. +! New directive %Core.AllowHostnameUnderscore which allows underscores + in hostnames. +- Eliminate quadratic behavior in DOMLex by using a proper queue. + Thanks Ole Laursen for noticing this. +- Rewritten MakeWellFormed/FixNesting implementation eliminates quadratic + behavior in the rest of the purificaiton pipeline. Thanks Chedburn + Networks for sponsoring this work. +- Made Linkify URL parser a bit less permissive, so that non-breaking + spaces and commas are not included as part of URL. Thanks nAS for fixing. +- Fix some bad interactions with %HTML.Allowed and injectors. Thanks + David Hirtz for reporting. +- Fix infinite loop in DirectLex. Thanks Ashar Javed (@soaj1664ashar) + for reporting. + 4.5.0, released 2013-02-17 # Fix bug where stacked attribute transforms clobber each other; this also means it's no longer possible to override attribute @@ -20,10 +42,10 @@ NEWS ( CHANGELOG and HISTORY ) HTMLPurifier ! Permit underscores in font families ! Support for page-break-* CSS3 properties when proprietary properties are enabled. -! New directive %Core.EnableExcludes; can be set to 'false' to turn off +! New directive %Core.DisableExcludes; can be set to 'true' to turn off SGML excludes checking. If HTML Purifier is removing too much text and you don't care about full standards compliance, try setting this to - 'false'. + 'true'. - Use prepend for SPL autoloading on PHP 5.3 and later. - Fix bug with nofollow transform when pre-existing rel exists. - Fix bug where background:url() always gets lower-cased diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.auto.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.auto.php similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.auto.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.auto.php diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.autoload.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.autoload.php similarity index 95% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.autoload.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.autoload.php index 62da5b60d..c3ea67e81 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.autoload.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.autoload.php @@ -14,7 +14,8 @@ if (function_exists('spl_autoload_register') && function_exists('spl_autoload_un spl_autoload_register('__autoload'); } } elseif (!function_exists('__autoload')) { - function __autoload($class) { + function __autoload($class) + { return HTMLPurifier_Bootstrap::autoload($class); } } diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.composer.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.composer.php similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.composer.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.composer.php diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.func.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.func.php similarity index 67% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.func.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.func.php index 56a55b2fe..64b140bec 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.func.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.func.php @@ -8,11 +8,13 @@ /** * Purify HTML. - * @param $html String HTML to purify - * @param $config Configuration to use, can be any value accepted by + * @param string $html String HTML to purify + * @param mixed $config Configuration to use, can be any value accepted by * HTMLPurifier_Config::create() + * @return string */ -function HTMLPurifier($html, $config = null) { +function HTMLPurifier($html, $config = null) +{ static $purifier = false; if (!$purifier) { $purifier = new HTMLPurifier(); diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.includes.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.includes.php similarity index 97% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.includes.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.includes.php index 18cb00130..9b7b88a87 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.includes.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.includes.php @@ -7,7 +7,7 @@ * primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS * FILE, changes will be overwritten the next time the script is run. * - * @version 4.5.0 + * @version 4.6.0 * * @warning * You must *not* include any other HTML Purifier files before this file, @@ -19,6 +19,7 @@ */ require 'HTMLPurifier.php'; +require 'HTMLPurifier/Arborize.php'; require 'HTMLPurifier/AttrCollections.php'; require 'HTMLPurifier/AttrDef.php'; require 'HTMLPurifier/AttrTransform.php'; @@ -54,9 +55,11 @@ require 'HTMLPurifier/Language.php'; require 'HTMLPurifier/LanguageFactory.php'; require 'HTMLPurifier/Length.php'; require 'HTMLPurifier/Lexer.php'; +require 'HTMLPurifier/Node.php'; require 'HTMLPurifier/PercentEncoder.php'; require 'HTMLPurifier/PropertyList.php'; require 'HTMLPurifier/PropertyListIterator.php'; +require 'HTMLPurifier/Queue.php'; require 'HTMLPurifier/Strategy.php'; require 'HTMLPurifier/StringHash.php'; require 'HTMLPurifier/StringHashParser.php'; @@ -72,6 +75,7 @@ require 'HTMLPurifier/URISchemeRegistry.php'; require 'HTMLPurifier/UnitConverter.php'; require 'HTMLPurifier/VarParser.php'; require 'HTMLPurifier/VarParserException.php'; +require 'HTMLPurifier/Zipper.php'; require 'HTMLPurifier/AttrDef/CSS.php'; require 'HTMLPurifier/AttrDef/Clone.php'; require 'HTMLPurifier/AttrDef/Enum.php'; @@ -189,6 +193,9 @@ require 'HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php'; require 'HTMLPurifier/Injector/SafeObject.php'; require 'HTMLPurifier/Lexer/DOMLex.php'; require 'HTMLPurifier/Lexer/DirectLex.php'; +require 'HTMLPurifier/Node/Comment.php'; +require 'HTMLPurifier/Node/Element.php'; +require 'HTMLPurifier/Node/Text.php'; require 'HTMLPurifier/Strategy/Composite.php'; require 'HTMLPurifier/Strategy/Core.php'; require 'HTMLPurifier/Strategy/FixNesting.php'; diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.kses.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.kses.php similarity index 96% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.kses.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.kses.php index 3143feb17..752290077 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.kses.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.kses.php @@ -7,7 +7,8 @@ require_once dirname(__FILE__) . '/HTMLPurifier.auto.php'; -function kses($string, $allowed_html, $allowed_protocols = null) { +function kses($string, $allowed_html, $allowed_protocols = null) +{ $config = HTMLPurifier_Config::createDefault(); $allowed_elements = array(); $allowed_attributes = array(); @@ -19,7 +20,6 @@ function kses($string, $allowed_html, $allowed_protocols = null) { } $config->set('HTML.AllowedElements', $allowed_elements); $config->set('HTML.AllowedAttributes', $allowed_attributes); - $allowed_schemes = array(); if ($allowed_protocols !== null) { $config->set('URI.AllowedSchemes', $allowed_protocols); } diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.path.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.path.php similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.path.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.path.php diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.php similarity index 66% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.php index fe5a9d506..6f654fde5 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.php @@ -19,7 +19,7 @@ */ /* - HTML Purifier 4.5.0 - Standards Compliant HTML Filtering + HTML Purifier 4.6.0 - Standards Compliant HTML Filtering Copyright (C) 2006-2008 Edward Z. Yang This library is free software; you can redistribute it and/or @@ -54,66 +54,97 @@ class HTMLPurifier { - /** Version of HTML Purifier */ - public $version = '4.5.0'; - - /** Constant with version of HTML Purifier */ - const VERSION = '4.5.0'; - - /** Global configuration object */ - public $config; - - /** Array of extra HTMLPurifier_Filter objects to run on HTML, for backwards compatibility */ - private $filters = array(); - - /** Single instance of HTML Purifier */ - private static $instance; - - protected $strategy, $generator; + /** + * Version of HTML Purifier. + * @type string + */ + public $version = '4.6.0'; /** - * Resultant HTMLPurifier_Context of last run purification. Is an array - * of contexts if the last called method was purifyArray(). + * Constant with version of HTML Purifier. + */ + const VERSION = '4.6.0'; + + /** + * Global configuration object. + * @type HTMLPurifier_Config + */ + public $config; + + /** + * Array of extra filter objects to run on HTML, + * for backwards compatibility. + * @type HTMLPurifier_Filter[] + */ + private $filters = array(); + + /** + * Single instance of HTML Purifier. + * @type HTMLPurifier + */ + private static $instance; + + /** + * @type HTMLPurifier_Strategy_Core + */ + protected $strategy; + + /** + * @type HTMLPurifier_Generator + */ + protected $generator; + + /** + * Resultant context of last run purification. + * Is an array of contexts if the last called method was purifyArray(). + * @type HTMLPurifier_Context */ public $context; /** * Initializes the purifier. - * @param $config Optional HTMLPurifier_Config object for all instances of - * the purifier, if omitted, a default configuration is - * supplied (which can be overridden on a per-use basis). + * + * @param HTMLPurifier_Config $config Optional HTMLPurifier_Config object + * for all instances of the purifier, if omitted, a default + * configuration is supplied (which can be overridden on a + * per-use basis). * The parameter can also be any type that * HTMLPurifier_Config::create() supports. */ - public function __construct($config = null) { - + public function __construct($config = null) + { $this->config = HTMLPurifier_Config::create($config); - - $this->strategy = new HTMLPurifier_Strategy_Core(); - + $this->strategy = new HTMLPurifier_Strategy_Core(); } /** * Adds a filter to process the output. First come first serve - * @param $filter HTMLPurifier_Filter object + * + * @param HTMLPurifier_Filter $filter HTMLPurifier_Filter object */ - public function addFilter($filter) { - trigger_error('HTMLPurifier->addFilter() is deprecated, use configuration directives in the Filter namespace or Filter.Custom', E_USER_WARNING); + public function addFilter($filter) + { + trigger_error( + 'HTMLPurifier->addFilter() is deprecated, use configuration directives' . + ' in the Filter namespace or Filter.Custom', + E_USER_WARNING + ); $this->filters[] = $filter; } /** * Filters an HTML snippet/document to be XSS-free and standards-compliant. * - * @param $html String of HTML to purify - * @param $config HTMLPurifier_Config object for this operation, if omitted, - * defaults to the config object specified during this + * @param string $html String of HTML to purify + * @param HTMLPurifier_Config $config Config object for this operation, + * if omitted, defaults to the config object specified during this * object's construction. The parameter can also be any type * that HTMLPurifier_Config::create() supports. - * @return Purified HTML + * + * @return string Purified HTML */ - public function purify($html, $config = null) { - + public function purify($html, $config = null) + { // :TODO: make the config merge in, instead of replace $config = $config ? HTMLPurifier_Config::create($config) : $this->config; @@ -151,8 +182,12 @@ class HTMLPurifier unset($filter_flags['Custom']); $filters = array(); foreach ($filter_flags as $filter => $flag) { - if (!$flag) continue; - if (strpos($filter, '.') !== false) continue; + if (!$flag) { + continue; + } + if (strpos($filter, '.') !== false) { + continue; + } $class = "HTMLPurifier_Filter_$filter"; $filters[] = new $class; } @@ -175,9 +210,12 @@ class HTMLPurifier // list of un-purified tokens $lexer->tokenizeHTML( // un-purified HTML - $html, $config, $context + $html, + $config, + $context ), - $config, $context + $config, + $context ) ); @@ -192,11 +230,15 @@ class HTMLPurifier /** * Filters an array of HTML snippets - * @param $config Optional HTMLPurifier_Config object for this operation. + * + * @param string[] $array_of_html Array of html snippets + * @param HTMLPurifier_Config $config Optional config object for this operation. * See HTMLPurifier::purify() for more details. - * @return Array of purified HTML + * + * @return string[] Array of purified HTML */ - public function purifyArray($array_of_html, $config = null) { + public function purifyArray($array_of_html, $config = null) + { $context_array = array(); foreach ($array_of_html as $key => $html) { $array_of_html[$key] = $this->purify($html, $config); @@ -208,11 +250,16 @@ class HTMLPurifier /** * Singleton for enforcing just one HTML Purifier in your system - * @param $prototype Optional prototype HTMLPurifier instance to - * overload singleton with, or HTMLPurifier_Config - * instance to configure the generated version with. + * + * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype + * HTMLPurifier instance to overload singleton with, + * or HTMLPurifier_Config instance to configure the + * generated version with. + * + * @return HTMLPurifier */ - public static function instance($prototype = null) { + public static function instance($prototype = null) + { if (!self::$instance || $prototype) { if ($prototype instanceof HTMLPurifier) { self::$instance = $prototype; @@ -226,12 +273,20 @@ class HTMLPurifier } /** + * Singleton for enforcing just one HTML Purifier in your system + * + * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype + * HTMLPurifier instance to overload singleton with, + * or HTMLPurifier_Config instance to configure the + * generated version with. + * + * @return HTMLPurifier * @note Backwards compatibility, see instance() */ - public static function getInstance($prototype = null) { + public static function getInstance($prototype = null) + { return HTMLPurifier::instance($prototype); } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.safe-includes.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.safe-includes.php similarity index 97% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.safe-includes.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.safe-includes.php index e23a81a71..9dea6d1ed 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.safe-includes.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.safe-includes.php @@ -13,6 +13,7 @@ $__dir = dirname(__FILE__); require_once $__dir . '/HTMLPurifier.php'; +require_once $__dir . '/HTMLPurifier/Arborize.php'; require_once $__dir . '/HTMLPurifier/AttrCollections.php'; require_once $__dir . '/HTMLPurifier/AttrDef.php'; require_once $__dir . '/HTMLPurifier/AttrTransform.php'; @@ -48,9 +49,11 @@ require_once $__dir . '/HTMLPurifier/Language.php'; require_once $__dir . '/HTMLPurifier/LanguageFactory.php'; require_once $__dir . '/HTMLPurifier/Length.php'; require_once $__dir . '/HTMLPurifier/Lexer.php'; +require_once $__dir . '/HTMLPurifier/Node.php'; require_once $__dir . '/HTMLPurifier/PercentEncoder.php'; require_once $__dir . '/HTMLPurifier/PropertyList.php'; require_once $__dir . '/HTMLPurifier/PropertyListIterator.php'; +require_once $__dir . '/HTMLPurifier/Queue.php'; require_once $__dir . '/HTMLPurifier/Strategy.php'; require_once $__dir . '/HTMLPurifier/StringHash.php'; require_once $__dir . '/HTMLPurifier/StringHashParser.php'; @@ -66,6 +69,7 @@ require_once $__dir . '/HTMLPurifier/URISchemeRegistry.php'; require_once $__dir . '/HTMLPurifier/UnitConverter.php'; require_once $__dir . '/HTMLPurifier/VarParser.php'; require_once $__dir . '/HTMLPurifier/VarParserException.php'; +require_once $__dir . '/HTMLPurifier/Zipper.php'; require_once $__dir . '/HTMLPurifier/AttrDef/CSS.php'; require_once $__dir . '/HTMLPurifier/AttrDef/Clone.php'; require_once $__dir . '/HTMLPurifier/AttrDef/Enum.php'; @@ -183,6 +187,9 @@ require_once $__dir . '/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php'; require_once $__dir . '/HTMLPurifier/Injector/SafeObject.php'; require_once $__dir . '/HTMLPurifier/Lexer/DOMLex.php'; require_once $__dir . '/HTMLPurifier/Lexer/DirectLex.php'; +require_once $__dir . '/HTMLPurifier/Node/Comment.php'; +require_once $__dir . '/HTMLPurifier/Node/Element.php'; +require_once $__dir . '/HTMLPurifier/Node/Text.php'; require_once $__dir . '/HTMLPurifier/Strategy/Composite.php'; require_once $__dir . '/HTMLPurifier/Strategy/Core.php'; require_once $__dir . '/HTMLPurifier/Strategy/FixNesting.php'; diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Arborize.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Arborize.php new file mode 100644 index 000000000..9e6617be5 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Arborize.php @@ -0,0 +1,71 @@ +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; + } +} diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrCollections.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrCollections.php similarity index 74% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrCollections.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrCollections.php index 555b86d04..4f6c2e39a 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrCollections.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrCollections.php @@ -8,7 +8,8 @@ class HTMLPurifier_AttrCollections { /** - * Associative array of attribute collections, indexed by name + * Associative array of attribute collections, indexed by name. + * @type array */ public $info = array(); @@ -16,10 +17,11 @@ class HTMLPurifier_AttrCollections * Performs all expansions on internal data for use by other inclusions * It also collects all attribute collection extensions from * modules - * @param $attr_types HTMLPurifier_AttrTypes instance - * @param $modules Hash array of HTMLPurifier_HTMLModule members + * @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance + * @param HTMLPurifier_HTMLModule[] $modules Hash array of HTMLPurifier_HTMLModule members */ - public function __construct($attr_types, $modules) { + public function __construct($attr_types, $modules) + { // load extensions from the modules foreach ($modules as $module) { foreach ($module->attr_collections as $coll_i => $coll) { @@ -30,7 +32,9 @@ class HTMLPurifier_AttrCollections if ($attr_i === 0 && isset($this->info[$coll_i][$attr_i])) { // merge in includes $this->info[$coll_i][$attr_i] = array_merge( - $this->info[$coll_i][$attr_i], $attr); + $this->info[$coll_i][$attr_i], + $attr + ); continue; } $this->info[$coll_i][$attr_i] = $attr; @@ -49,20 +53,29 @@ class HTMLPurifier_AttrCollections /** * Takes a reference to an attribute associative array and performs * all inclusions specified by the zero index. - * @param &$attr Reference to attribute array + * @param array &$attr Reference to attribute array */ - public function performInclusions(&$attr) { - if (!isset($attr[0])) return; + public function performInclusions(&$attr) + { + if (!isset($attr[0])) { + return; + } $merge = $attr[0]; $seen = array(); // recursion guard // loop through all the inclusions for ($i = 0; isset($merge[$i]); $i++) { - if (isset($seen[$merge[$i]])) continue; + if (isset($seen[$merge[$i]])) { + continue; + } $seen[$merge[$i]] = true; // foreach attribute of the inclusion, copy it over - if (!isset($this->info[$merge[$i]])) continue; + if (!isset($this->info[$merge[$i]])) { + continue; + } foreach ($this->info[$merge[$i]] as $key => $value) { - if (isset($attr[$key])) continue; // also catches more inclusions + if (isset($attr[$key])) { + continue; + } // also catches more inclusions $attr[$key] = $value; } if (isset($this->info[$merge[$i]][0])) { @@ -76,20 +89,24 @@ class HTMLPurifier_AttrCollections /** * Expands all string identifiers in an attribute array by replacing * them with the appropriate values inside HTMLPurifier_AttrTypes - * @param &$attr Reference to attribute array - * @param $attr_types HTMLPurifier_AttrTypes instance + * @param array &$attr Reference to attribute array + * @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance */ - public function expandIdentifiers(&$attr, $attr_types) { - + public function expandIdentifiers(&$attr, $attr_types) + { // because foreach will process new elements we add, make sure we // skip duplicates $processed = array(); foreach ($attr as $def_i => $def) { // skip inclusions - if ($def_i === 0) continue; + if ($def_i === 0) { + continue; + } - if (isset($processed[$def_i])) continue; + if (isset($processed[$def_i])) { + continue; + } // determine whether or not attribute is required if ($required = (strpos($def_i, '*') !== false)) { @@ -120,9 +137,7 @@ class HTMLPurifier_AttrCollections unset($attr[$def_i]); } } - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef.php similarity index 74% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef.php index 25eb0ed3c..5ac06522b 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef.php @@ -14,23 +14,25 @@ abstract class HTMLPurifier_AttrDef { /** - * Tells us whether or not an HTML attribute is minimized. Has no - * meaning in other contexts. + * Tells us whether or not an HTML attribute is minimized. + * Has no meaning in other contexts. + * @type bool */ public $minimized = false; /** - * Tells us whether or not an HTML attribute is required. Has no - * meaning in other contexts + * Tells us whether or not an HTML attribute is required. + * Has no meaning in other contexts + * @type bool */ public $required = false; /** * Validates and cleans passed string according to a definition. * - * @param $string String to be validated and cleaned. - * @param $config Mandatory HTMLPurifier_Config object. - * @param $context Mandatory HTMLPurifier_AttrContext object. + * @param string $string String to be validated and cleaned. + * @param HTMLPurifier_Config $config Mandatory HTMLPurifier_Config object. + * @param HTMLPurifier_Context $context Mandatory HTMLPurifier_Context object. */ abstract public function validate($string, $config, $context); @@ -55,7 +57,8 @@ abstract class HTMLPurifier_AttrDef * parsing XML, thus, this behavior may still be correct. We * assume that newlines have been normalized. */ - public function parseCDATA($string) { + public function parseCDATA($string) + { $string = trim($string); $string = str_replace(array("\n", "\t", "\r"), ' ', $string); return $string; @@ -63,10 +66,11 @@ abstract class HTMLPurifier_AttrDef /** * Factory method for creating this class from a string. - * @param $string String construction info - * @return Created AttrDef object corresponding to $string + * @param string $string String construction info + * @return HTMLPurifier_AttrDef Created AttrDef object corresponding to $string */ - public function make($string) { + public function make($string) + { // default implementation, return a flyweight of this object. // If $string has an effect on the returned object (i.e. you // need to overload this method), it is best @@ -77,8 +81,11 @@ abstract class HTMLPurifier_AttrDef /** * Removes spaces from rgb(0, 0, 0) so that shorthand CSS properties work * properly. THIS IS A HACK! + * @param string $string a CSS colour definition + * @return string */ - protected function mungeRgb($string) { + protected function mungeRgb($string) + { return preg_replace('/rgb\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\)/', 'rgb(\1,\2,\3)', $string); } @@ -86,7 +93,8 @@ abstract class HTMLPurifier_AttrDef * Parses a possibly escaped CSS string and returns the "pure" * version of it. */ - protected function expandCSSEscape($string) { + protected function expandCSSEscape($string) + { // flexibly parse it $ret = ''; for ($i = 0, $c = strlen($string); $i < $c; $i++) { @@ -99,25 +107,32 @@ abstract class HTMLPurifier_AttrDef if (ctype_xdigit($string[$i])) { $code = $string[$i]; for ($a = 1, $i++; $i < $c && $a < 6; $i++, $a++) { - if (!ctype_xdigit($string[$i])) break; + if (!ctype_xdigit($string[$i])) { + break; + } $code .= $string[$i]; } // We have to be extremely careful when adding // new characters, to make sure we're not breaking // the encoding. $char = HTMLPurifier_Encoder::unichr(hexdec($code)); - if (HTMLPurifier_Encoder::cleanUTF8($char) === '') continue; + if (HTMLPurifier_Encoder::cleanUTF8($char) === '') { + continue; + } $ret .= $char; - if ($i < $c && trim($string[$i]) !== '') $i--; + if ($i < $c && trim($string[$i]) !== '') { + $i--; + } + continue; + } + if ($string[$i] === "\n") { continue; } - if ($string[$i] === "\n") continue; } $ret .= $string[$i]; } return $ret; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS.php similarity index 77% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS.php index 953e70675..02c1641fb 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS.php @@ -14,8 +14,14 @@ class HTMLPurifier_AttrDef_CSS extends HTMLPurifier_AttrDef { - public function validate($css, $config, $context) { - + /** + * @param string $css + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($css, $config, $context) + { $css = $this->parseCDATA($css); $definition = $config->getCSSDefinition(); @@ -36,34 +42,47 @@ class HTMLPurifier_AttrDef_CSS extends HTMLPurifier_AttrDef $context->register('CurrentCSSProperty', $property); foreach ($declarations as $declaration) { - if (!$declaration) continue; - if (!strpos($declaration, ':')) continue; + if (!$declaration) { + continue; + } + if (!strpos($declaration, ':')) { + continue; + } list($property, $value) = explode(':', $declaration, 2); $property = trim($property); - $value = trim($value); + $value = trim($value); $ok = false; do { if (isset($definition->info[$property])) { $ok = true; break; } - if (ctype_lower($property)) break; + if (ctype_lower($property)) { + break; + } $property = strtolower($property); if (isset($definition->info[$property])) { $ok = true; break; } - } while(0); - if (!$ok) continue; + } while (0); + if (!$ok) { + continue; + } // inefficient call, since the validator will do this again if (strtolower(trim($value)) !== 'inherit') { // inherit works for everything (but only on the base property) $result = $definition->info[$property]->validate( - $value, $config, $context ); + $value, + $config, + $context + ); } else { $result = 'inherit'; } - if ($result === false) continue; + if ($result === false) { + continue; + } $propvalues[$property] = $result; } diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php new file mode 100644 index 000000000..af2b83dff --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php @@ -0,0 +1,34 @@ + 1.0) { + $result = '1'; + } + return $result; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Background.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Background.php similarity index 65% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Background.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Background.php index e5b7438c2..7f1ea3b0f 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Background.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Background.php @@ -9,11 +9,16 @@ class HTMLPurifier_AttrDef_CSS_Background extends HTMLPurifier_AttrDef /** * Local copy of component validators. + * @type HTMLPurifier_AttrDef[] * @note See HTMLPurifier_AttrDef_Font::$info for a similar impl. */ protected $info; - public function __construct($config) { + /** + * @param HTMLPurifier_Config $config + */ + public function __construct($config) + { $def = $config->getCSSDefinition(); $this->info['background-color'] = $def->info['background-color']; $this->info['background-image'] = $def->info['background-image']; @@ -22,11 +27,19 @@ class HTMLPurifier_AttrDef_CSS_Background extends HTMLPurifier_AttrDef $this->info['background-position'] = $def->info['background-position']; } - public function validate($string, $config, $context) { - + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { // regular pre-processing $string = $this->parseCDATA($string); - if ($string === '') return false; + if ($string === '') { + return false; + } // munge rgb() decl if necessary $string = $this->mungeRgb($string); @@ -35,27 +48,34 @@ class HTMLPurifier_AttrDef_CSS_Background extends HTMLPurifier_AttrDef $bits = explode(' ', $string); // bits to process $caught = array(); - $caught['color'] = false; - $caught['image'] = false; - $caught['repeat'] = false; + $caught['color'] = false; + $caught['image'] = false; + $caught['repeat'] = false; $caught['attachment'] = false; $caught['position'] = false; $i = 0; // number of catches - $none = false; foreach ($bits as $bit) { - if ($bit === '') continue; + if ($bit === '') { + continue; + } foreach ($caught as $key => $status) { if ($key != 'position') { - if ($status !== false) continue; + if ($status !== false) { + continue; + } $r = $this->info['background-' . $key]->validate($bit, $config, $context); } else { $r = $bit; } - if ($r === false) continue; + if ($r === false) { + continue; + } if ($key == 'position') { - if ($caught[$key] === false) $caught[$key] = ''; + if ($caught[$key] === false) { + $caught[$key] = ''; + } $caught[$key] .= $r . ' '; } else { $caught[$key] = $r; @@ -65,7 +85,9 @@ class HTMLPurifier_AttrDef_CSS_Background extends HTMLPurifier_AttrDef } } - if (!$i) return false; + if (!$i) { + return false; + } if ($caught['position'] !== false) { $caught['position'] = $this->info['background-position']-> validate($caught['position'], $config, $context); @@ -73,15 +95,17 @@ class HTMLPurifier_AttrDef_CSS_Background extends HTMLPurifier_AttrDef $ret = array(); foreach ($caught as $value) { - if ($value === false) continue; + if ($value === false) { + continue; + } $ret[] = $value; } - if (empty($ret)) return false; + if (empty($ret)) { + return false; + } return implode(' ', $ret); - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php similarity index 73% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php index fae82eaec..4580ef5a9 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php @@ -44,15 +44,30 @@ class HTMLPurifier_AttrDef_CSS_BackgroundPosition extends HTMLPurifier_AttrDef { + /** + * @type HTMLPurifier_AttrDef_CSS_Length + */ protected $length; + + /** + * @type HTMLPurifier_AttrDef_CSS_Percentage + */ protected $percentage; - public function __construct() { - $this->length = new HTMLPurifier_AttrDef_CSS_Length(); + public function __construct() + { + $this->length = new HTMLPurifier_AttrDef_CSS_Length(); $this->percentage = new HTMLPurifier_AttrDef_CSS_Percentage(); } - public function validate($string, $config, $context) { + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { $string = $this->parseCDATA($string); $bits = explode(' ', $string); @@ -74,7 +89,9 @@ class HTMLPurifier_AttrDef_CSS_BackgroundPosition extends HTMLPurifier_AttrDef ); foreach ($bits as $bit) { - if ($bit === '') continue; + if ($bit === '') { + continue; + } // test for keyword $lbit = ctype_lower($bit) ? $bit : strtolower($bit); @@ -104,30 +121,37 @@ class HTMLPurifier_AttrDef_CSS_BackgroundPosition extends HTMLPurifier_AttrDef $measures[] = $r; $i++; } - } - if (!$i) return false; // no valid values were caught + if (!$i) { + return false; + } // no valid values were caught $ret = array(); // first keyword - if ($keywords['h']) $ret[] = $keywords['h']; - elseif ($keywords['ch']) { + if ($keywords['h']) { + $ret[] = $keywords['h']; + } elseif ($keywords['ch']) { $ret[] = $keywords['ch']; $keywords['cv'] = false; // prevent re-use: center = center center + } elseif (count($measures)) { + $ret[] = array_shift($measures); } - elseif (count($measures)) $ret[] = array_shift($measures); - if ($keywords['v']) $ret[] = $keywords['v']; - elseif ($keywords['cv']) $ret[] = $keywords['cv']; - elseif (count($measures)) $ret[] = array_shift($measures); + if ($keywords['v']) { + $ret[] = $keywords['v']; + } elseif ($keywords['cv']) { + $ret[] = $keywords['cv']; + } elseif (count($measures)) { + $ret[] = array_shift($measures); + } - if (empty($ret)) return false; + if (empty($ret)) { + return false; + } return implode(' ', $ret); - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Border.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Border.php similarity index 71% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Border.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Border.php index 42a1d1b4a..16243ba1e 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Border.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Border.php @@ -8,17 +8,29 @@ class HTMLPurifier_AttrDef_CSS_Border extends HTMLPurifier_AttrDef /** * Local copy of properties this property is shorthand for. + * @type HTMLPurifier_AttrDef[] */ protected $info = array(); - public function __construct($config) { + /** + * @param HTMLPurifier_Config $config + */ + public function __construct($config) + { $def = $config->getCSSDefinition(); $this->info['border-width'] = $def->info['border-width']; $this->info['border-style'] = $def->info['border-style']; $this->info['border-top-color'] = $def->info['border-top-color']; } - public function validate($string, $config, $context) { + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { $string = $this->parseCDATA($string); $string = $this->mungeRgb($string); $bits = explode(' ', $string); @@ -26,7 +38,9 @@ class HTMLPurifier_AttrDef_CSS_Border extends HTMLPurifier_AttrDef $ret = ''; // return value foreach ($bits as $bit) { foreach ($this->info as $propname => $validator) { - if (isset($done[$propname])) continue; + if (isset($done[$propname])) { + continue; + } $r = $validator->validate($bit, $config, $context); if ($r !== false) { $ret .= $r . ' '; @@ -37,7 +51,6 @@ class HTMLPurifier_AttrDef_CSS_Border extends HTMLPurifier_AttrDef } return rtrim($ret); } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Color.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Color.php similarity index 54% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Color.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Color.php index 07f95a671..16d2a6b98 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Color.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Color.php @@ -6,29 +6,47 @@ class HTMLPurifier_AttrDef_CSS_Color extends HTMLPurifier_AttrDef { - public function validate($color, $config, $context) { - + /** + * @param string $color + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($color, $config, $context) + { static $colors = null; - if ($colors === null) $colors = $config->get('Core.ColorKeywords'); + if ($colors === null) { + $colors = $config->get('Core.ColorKeywords'); + } $color = trim($color); - if ($color === '') return false; + if ($color === '') { + return false; + } $lower = strtolower($color); - if (isset($colors[$lower])) return $colors[$lower]; + if (isset($colors[$lower])) { + return $colors[$lower]; + } if (strpos($color, 'rgb(') !== false) { // rgb literal handling $length = strlen($color); - if (strpos($color, ')') !== $length - 1) return false; + if (strpos($color, ')') !== $length - 1) { + return false; + } $triad = substr($color, 4, $length - 4 - 1); $parts = explode(',', $triad); - if (count($parts) !== 3) return false; + if (count($parts) !== 3) { + return false; + } $type = false; // to ensure that they're all the same type $new_parts = array(); foreach ($parts as $part) { $part = trim($part); - if ($part === '') return false; + if ($part === '') { + return false; + } $length = strlen($part); if ($part[$length - 1] === '%') { // handle percents @@ -37,9 +55,13 @@ class HTMLPurifier_AttrDef_CSS_Color extends HTMLPurifier_AttrDef } elseif ($type !== 'percentage') { return false; } - $num = (float) substr($part, 0, $length - 1); - if ($num < 0) $num = 0; - if ($num > 100) $num = 100; + $num = (float)substr($part, 0, $length - 1); + if ($num < 0) { + $num = 0; + } + if ($num > 100) { + $num = 100; + } $new_parts[] = "$num%"; } else { // handle integers @@ -48,10 +70,14 @@ class HTMLPurifier_AttrDef_CSS_Color extends HTMLPurifier_AttrDef } elseif ($type !== 'integer') { return false; } - $num = (int) $part; - if ($num < 0) $num = 0; - if ($num > 255) $num = 255; - $new_parts[] = (string) $num; + $num = (int)$part; + if ($num < 0) { + $num = 0; + } + if ($num > 255) { + $num = 255; + } + $new_parts[] = (string)$num; } } $new_triad = implode(',', $new_parts); @@ -65,14 +91,15 @@ class HTMLPurifier_AttrDef_CSS_Color extends HTMLPurifier_AttrDef $color = '#' . $color; } $length = strlen($hex); - if ($length !== 3 && $length !== 6) return false; - if (!ctype_xdigit($hex)) return false; + if ($length !== 3 && $length !== 6) { + return false; + } + if (!ctype_xdigit($hex)) { + return false; + } } - return $color; - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Composite.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Composite.php similarity index 61% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Composite.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Composite.php index de1289cba..9c1750554 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Composite.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Composite.php @@ -13,26 +13,36 @@ class HTMLPurifier_AttrDef_CSS_Composite extends HTMLPurifier_AttrDef { /** - * List of HTMLPurifier_AttrDef objects that may process strings + * List of objects that may process strings. + * @type HTMLPurifier_AttrDef[] * @todo Make protected */ public $defs; /** - * @param $defs List of HTMLPurifier_AttrDef objects + * @param HTMLPurifier_AttrDef[] $defs List of HTMLPurifier_AttrDef objects */ - public function __construct($defs) { + public function __construct($defs) + { $this->defs = $defs; } - public function validate($string, $config, $context) { + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { foreach ($this->defs as $i => $def) { $result = $this->defs[$i]->validate($string, $config, $context); - if ($result !== false) return $result; + if ($result !== false) { + return $result; + } } return false; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php new file mode 100644 index 000000000..9d77cc9aa --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php @@ -0,0 +1,44 @@ +def = $def; + $this->element = $element; + } + + /** + * Checks if CurrentToken is set and equal to $this->element + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $token = $context->get('CurrentToken', true); + if ($token && $token->name == $this->element) { + return false; + } + return $this->def->validate($string, $config, $context); + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Filter.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Filter.php similarity index 62% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Filter.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Filter.php index 147894b86..bde4c3301 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Filter.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Filter.php @@ -7,23 +7,37 @@ */ class HTMLPurifier_AttrDef_CSS_Filter extends HTMLPurifier_AttrDef { - + /** + * @type HTMLPurifier_AttrDef_Integer + */ protected $intValidator; - public function __construct() { + public function __construct() + { $this->intValidator = new HTMLPurifier_AttrDef_Integer(); } - public function validate($value, $config, $context) { + /** + * @param string $value + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($value, $config, $context) + { $value = $this->parseCDATA($value); - if ($value === 'none') return $value; + if ($value === 'none') { + return $value; + } // if we looped this we could support multiple filters $function_length = strcspn($value, '('); $function = trim(substr($value, 0, $function_length)); if ($function !== 'alpha' && $function !== 'Alpha' && $function !== 'progid:DXImageTransform.Microsoft.Alpha' - ) return false; + ) { + return false; + } $cursor = $function_length + 1; $parameters_length = strcspn($value, ')', $cursor); $parameters = substr($value, $cursor, $parameters_length); @@ -32,15 +46,25 @@ class HTMLPurifier_AttrDef_CSS_Filter extends HTMLPurifier_AttrDef $lookup = array(); foreach ($params as $param) { list($key, $value) = explode('=', $param); - $key = trim($key); + $key = trim($key); $value = trim($value); - if (isset($lookup[$key])) continue; - if ($key !== 'opacity') continue; + if (isset($lookup[$key])) { + continue; + } + if ($key !== 'opacity') { + continue; + } $value = $this->intValidator->validate($value, $config, $context); - if ($value === false) continue; - $int = (int) $value; - if ($int > 100) $value = '100'; - if ($int < 0) $value = '0'; + if ($value === false) { + continue; + } + $int = (int)$value; + if ($int > 100) { + $value = '100'; + } + if ($int < 0) { + $value = '0'; + } $ret_params[] = "$key=$value"; $lookup[$key] = true; } @@ -48,7 +72,6 @@ class HTMLPurifier_AttrDef_CSS_Filter extends HTMLPurifier_AttrDef $ret_function = "$function($ret_parameters)"; return $ret_function; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Font.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Font.php similarity index 67% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Font.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Font.php index 699ee0b70..579b97ef1 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Font.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Font.php @@ -7,8 +7,8 @@ class HTMLPurifier_AttrDef_CSS_Font extends HTMLPurifier_AttrDef { /** - * Local copy of component validators. - * + * Local copy of validators + * @type HTMLPurifier_AttrDef[] * @note If we moved specific CSS property definitions to their own * classes instead of having them be assembled at run time by * CSSDefinition, this wouldn't be necessary. We'd instantiate @@ -16,18 +16,28 @@ class HTMLPurifier_AttrDef_CSS_Font extends HTMLPurifier_AttrDef */ protected $info = array(); - public function __construct($config) { + /** + * @param HTMLPurifier_Config $config + */ + public function __construct($config) + { $def = $config->getCSSDefinition(); - $this->info['font-style'] = $def->info['font-style']; + $this->info['font-style'] = $def->info['font-style']; $this->info['font-variant'] = $def->info['font-variant']; - $this->info['font-weight'] = $def->info['font-weight']; - $this->info['font-size'] = $def->info['font-size']; - $this->info['line-height'] = $def->info['line-height']; - $this->info['font-family'] = $def->info['font-family']; + $this->info['font-weight'] = $def->info['font-weight']; + $this->info['font-size'] = $def->info['font-size']; + $this->info['line-height'] = $def->info['line-height']; + $this->info['font-family'] = $def->info['font-family']; } - public function validate($string, $config, $context) { - + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { static $system_fonts = array( 'caption' => true, 'icon' => true, @@ -39,7 +49,9 @@ class HTMLPurifier_AttrDef_CSS_Font extends HTMLPurifier_AttrDef // regular pre-processing $string = $this->parseCDATA($string); - if ($string === '') return false; + if ($string === '') { + return false; + } // check if it's one of the keywords $lowercase_string = strtolower($string); @@ -54,15 +66,20 @@ class HTMLPurifier_AttrDef_CSS_Font extends HTMLPurifier_AttrDef $final = ''; // output for ($i = 0, $size = count($bits); $i < $size; $i++) { - if ($bits[$i] === '') continue; + if ($bits[$i] === '') { + continue; + } switch ($stage) { - - // attempting to catch font-style, font-variant or font-weight - case 0: + case 0: // attempting to catch font-style, font-variant or font-weight foreach ($stage_1 as $validator_name) { - if (isset($caught[$validator_name])) continue; + if (isset($caught[$validator_name])) { + continue; + } $r = $this->info[$validator_name]->validate( - $bits[$i], $config, $context); + $bits[$i], + $config, + $context + ); if ($r !== false) { $final .= $r . ' '; $caught[$validator_name] = true; @@ -70,15 +87,17 @@ class HTMLPurifier_AttrDef_CSS_Font extends HTMLPurifier_AttrDef } } // all three caught, continue on - if (count($caught) >= 3) $stage = 1; - if ($r !== false) break; - - // attempting to catch font-size and perhaps line-height - case 1: + if (count($caught) >= 3) { + $stage = 1; + } + if ($r !== false) { + break; + } + case 1: // attempting to catch font-size and perhaps line-height $found_slash = false; if (strpos($bits[$i], '/') !== false) { list($font_size, $line_height) = - explode('/', $bits[$i]); + explode('/', $bits[$i]); if ($line_height === '') { // ooh, there's a space after the slash! $line_height = false; @@ -89,14 +108,19 @@ class HTMLPurifier_AttrDef_CSS_Font extends HTMLPurifier_AttrDef $line_height = false; } $r = $this->info['font-size']->validate( - $font_size, $config, $context); + $font_size, + $config, + $context + ); if ($r !== false) { $final .= $r; // attempt to catch line-height if ($line_height === false) { // we need to scroll forward for ($j = $i + 1; $j < $size; $j++) { - if ($bits[$j] === '') continue; + if ($bits[$j] === '') { + continue; + } if ($bits[$j] === '/') { if ($found_slash) { return false; @@ -116,7 +140,10 @@ class HTMLPurifier_AttrDef_CSS_Font extends HTMLPurifier_AttrDef if ($found_slash) { $i = $j; $r = $this->info['line-height']->validate( - $line_height, $config, $context); + $line_height, + $config, + $context + ); if ($r !== false) { $final .= '/' . $r; } @@ -126,13 +153,14 @@ class HTMLPurifier_AttrDef_CSS_Font extends HTMLPurifier_AttrDef break; } return false; - - // attempting to catch font-family - case 2: + case 2: // attempting to catch font-family $font_family = implode(' ', array_slice($bits, $i, $size - $i)); $r = $this->info['font-family']->validate( - $font_family, $config, $context); + $font_family, + $config, + $context + ); if ($r !== false) { $final .= $r . ' '; // processing completed successfully @@ -143,7 +171,6 @@ class HTMLPurifier_AttrDef_CSS_Font extends HTMLPurifier_AttrDef } return false; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/FontFamily.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/FontFamily.php similarity index 90% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/FontFamily.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/FontFamily.php index 98dcf820d..74e24c881 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/FontFamily.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/FontFamily.php @@ -8,11 +8,18 @@ class HTMLPurifier_AttrDef_CSS_FontFamily extends HTMLPurifier_AttrDef protected $mask = null; - public function __construct() { + public function __construct() + { $this->mask = '_- '; - for ($c = 'a'; $c <= 'z'; $c++) $this->mask .= $c; - for ($c = 'A'; $c <= 'Z'; $c++) $this->mask .= $c; - for ($c = '0'; $c <= '9'; $c++) $this->mask .= $c; // cast-y, but should be fine + for ($c = 'a'; $c <= 'z'; $c++) { + $this->mask .= $c; + } + for ($c = 'A'; $c <= 'Z'; $c++) { + $this->mask .= $c; + } + for ($c = '0'; $c <= '9'; $c++) { + $this->mask .= $c; + } // cast-y, but should be fine // special bytes used by UTF-8 for ($i = 0x80; $i <= 0xFF; $i++) { // We don't bother excluding invalid bytes in this range, @@ -39,7 +46,14 @@ class HTMLPurifier_AttrDef_CSS_FontFamily extends HTMLPurifier_AttrDef // possible optimization: invert the mask. } - public function validate($string, $config, $context) { + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { static $generic_names = array( 'serif' => true, 'sans-serif' => true, @@ -52,9 +66,11 @@ class HTMLPurifier_AttrDef_CSS_FontFamily extends HTMLPurifier_AttrDef // assume that no font names contain commas in them $fonts = explode(',', $string); $final = ''; - foreach($fonts as $font) { + foreach ($fonts as $font) { $font = trim($font); - if ($font === '') continue; + if ($font === '') { + continue; + } // match a generic name if (isset($generic_names[$font])) { if ($allowed_fonts === null || isset($allowed_fonts[$font])) { @@ -65,9 +81,13 @@ class HTMLPurifier_AttrDef_CSS_FontFamily extends HTMLPurifier_AttrDef // match a quoted name if ($font[0] === '"' || $font[0] === "'") { $length = strlen($font); - if ($length <= 2) continue; + if ($length <= 2) { + continue; + } $quote = $font[0]; - if ($font[$length - 1] !== $quote) continue; + if ($font[$length - 1] !== $quote) { + continue; + } $font = substr($font, 1, $length - 2); } @@ -188,7 +208,9 @@ class HTMLPurifier_AttrDef_CSS_FontFamily extends HTMLPurifier_AttrDef $final .= "'$font', "; } $final = rtrim($final, ', '); - if ($final === '') return false; + if ($final === '') { + return false; + } return $final; } diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Ident.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Ident.php new file mode 100644 index 000000000..973002c17 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Ident.php @@ -0,0 +1,32 @@ +def = $def; $this->allow = $allow; } + /** * Intercepts and removes !important if necessary + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string */ - public function validate($string, $config, $context) { + public function validate($string, $config, $context) + { // test for ! and important tokens $string = trim($string); $is_important = false; @@ -32,7 +46,9 @@ class HTMLPurifier_AttrDef_CSS_ImportantDecorator extends HTMLPurifier_AttrDef } } $string = $this->def->validate($string, $config, $context); - if ($this->allow && $is_important) $string .= ' !important'; + if ($this->allow && $is_important) { + $string .= ' !important'; + } return $string; } } diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Length.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Length.php new file mode 100644 index 000000000..f12453a04 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Length.php @@ -0,0 +1,77 @@ +min = $min !== null ? HTMLPurifier_Length::make($min) : null; + $this->max = $max !== null ? HTMLPurifier_Length::make($max) : null; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $string = $this->parseCDATA($string); + + // Optimizations + if ($string === '') { + return false; + } + if ($string === '0') { + return '0'; + } + if (strlen($string) === 1) { + return false; + } + + $length = HTMLPurifier_Length::make($string); + if (!$length->isValid()) { + return false; + } + + if ($this->min) { + $c = $length->compareTo($this->min); + if ($c === false) { + return false; + } + if ($c < 0) { + return false; + } + } + if ($this->max) { + $c = $length->compareTo($this->max); + if ($c === false) { + return false; + } + if ($c > 0) { + return false; + } + } + return $length->toString(); + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/ListStyle.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/ListStyle.php new file mode 100644 index 000000000..e74d42654 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/ListStyle.php @@ -0,0 +1,112 @@ +getCSSDefinition(); + $this->info['list-style-type'] = $def->info['list-style-type']; + $this->info['list-style-position'] = $def->info['list-style-position']; + $this->info['list-style-image'] = $def->info['list-style-image']; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + // regular pre-processing + $string = $this->parseCDATA($string); + if ($string === '') { + return false; + } + + // assumes URI doesn't have spaces in it + $bits = explode(' ', strtolower($string)); // bits to process + + $caught = array(); + $caught['type'] = false; + $caught['position'] = false; + $caught['image'] = false; + + $i = 0; // number of catches + $none = false; + + foreach ($bits as $bit) { + if ($i >= 3) { + return; + } // optimization bit + if ($bit === '') { + continue; + } + foreach ($caught as $key => $status) { + if ($status !== false) { + continue; + } + $r = $this->info['list-style-' . $key]->validate($bit, $config, $context); + if ($r === false) { + continue; + } + if ($r === 'none') { + if ($none) { + continue; + } else { + $none = true; + } + if ($key == 'image') { + continue; + } + } + $caught[$key] = $r; + $i++; + break; + } + } + + if (!$i) { + return false; + } + + $ret = array(); + + // construct type + if ($caught['type']) { + $ret[] = $caught['type']; + } + + // construct image + if ($caught['image']) { + $ret[] = $caught['image']; + } + + // construct position + if ($caught['position']) { + $ret[] = $caught['position']; + } + + if (empty($ret)) { + return false; + } + return implode(' ', $ret); + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Multiple.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Multiple.php similarity index 67% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Multiple.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Multiple.php index 4d62a40d7..9f266cdd1 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Multiple.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Multiple.php @@ -13,9 +13,9 @@ */ class HTMLPurifier_AttrDef_CSS_Multiple extends HTMLPurifier_AttrDef { - /** * Instance of component definition to defer validation to. + * @type HTMLPurifier_AttrDef * @todo Make protected */ public $single; @@ -27,32 +27,45 @@ class HTMLPurifier_AttrDef_CSS_Multiple extends HTMLPurifier_AttrDef public $max; /** - * @param $single HTMLPurifier_AttrDef to multiply - * @param $max Max number of values allowed (usually four) + * @param HTMLPurifier_AttrDef $single HTMLPurifier_AttrDef to multiply + * @param int $max Max number of values allowed (usually four) */ - public function __construct($single, $max = 4) { + public function __construct($single, $max = 4) + { $this->single = $single; $this->max = $max; } - public function validate($string, $config, $context) { + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { $string = $this->parseCDATA($string); - if ($string === '') return false; + if ($string === '') { + return false; + } $parts = explode(' ', $string); // parseCDATA replaced \r, \t and \n $length = count($parts); $final = ''; for ($i = 0, $num = 0; $i < $length && $num < $this->max; $i++) { - if (ctype_space($parts[$i])) continue; + if (ctype_space($parts[$i])) { + continue; + } $result = $this->single->validate($parts[$i], $config, $context); if ($result !== false) { $final .= $result . ' '; $num++; } } - if ($final === '') return false; + if ($final === '') { + return false; + } return rtrim($final); } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Number.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Number.php similarity index 55% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Number.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Number.php index 3f99e12ec..8edc159e7 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/Number.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Number.php @@ -7,32 +7,44 @@ class HTMLPurifier_AttrDef_CSS_Number extends HTMLPurifier_AttrDef { /** - * Bool indicating whether or not only positive values allowed. + * Indicates whether or not only positive values are allowed. + * @type bool */ protected $non_negative = false; /** - * @param $non_negative Bool indicating whether negatives are forbidden + * @param bool $non_negative indicates whether negatives are forbidden */ - public function __construct($non_negative = false) { + public function __construct($non_negative = false) + { $this->non_negative = $non_negative; } /** + * @param string $number + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string|bool * @warning Some contexts do not pass $config, $context. These * variables should not be used without checking HTMLPurifier_Length */ - public function validate($number, $config, $context) { - + public function validate($number, $config, $context) + { $number = $this->parseCDATA($number); - if ($number === '') return false; - if ($number === '0') return '0'; + if ($number === '') { + return false; + } + if ($number === '0') { + return '0'; + } $sign = ''; switch ($number[0]) { case '-': - if ($this->non_negative) return false; + if ($this->non_negative) { + return false; + } $sign = '-'; case '+': $number = substr($number, 1); @@ -44,14 +56,20 @@ class HTMLPurifier_AttrDef_CSS_Number extends HTMLPurifier_AttrDef } // Period is the only non-numeric character allowed - if (strpos($number, '.') === false) return false; + if (strpos($number, '.') === false) { + return false; + } list($left, $right) = explode('.', $number, 2); - if ($left === '' && $right === '') return false; - if ($left !== '' && !ctype_digit($left)) return false; + if ($left === '' && $right === '') { + return false; + } + if ($left !== '' && !ctype_digit($left)) { + return false; + } - $left = ltrim($left, '0'); + $left = ltrim($left, '0'); $right = rtrim($right, '0'); if ($right === '') { @@ -59,11 +77,8 @@ class HTMLPurifier_AttrDef_CSS_Number extends HTMLPurifier_AttrDef } elseif (!ctype_digit($right)) { return false; } - return $sign . $left . '.' . $right; - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Percentage.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Percentage.php new file mode 100644 index 000000000..f0f25c50a --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/Percentage.php @@ -0,0 +1,54 @@ +number_def = new HTMLPurifier_AttrDef_CSS_Number($non_negative); + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $string = $this->parseCDATA($string); + + if ($string === '') { + return false; + } + $length = strlen($string); + if ($length === 1) { + return false; + } + if ($string[$length - 1] !== '%') { + return false; + } + + $number = substr($string, 0, $length - 1); + $number = $this->number_def->validate($number, $config, $context); + + if ($number === false) { + return false; + } + return "$number%"; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php similarity index 69% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php index 772c922d8..5fd4b7f7b 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php @@ -8,8 +8,14 @@ class HTMLPurifier_AttrDef_CSS_TextDecoration extends HTMLPurifier_AttrDef { - public function validate($string, $config, $context) { - + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { static $allowed_values = array( 'line-through' => true, 'overline' => true, @@ -18,7 +24,9 @@ class HTMLPurifier_AttrDef_CSS_TextDecoration extends HTMLPurifier_AttrDef $string = strtolower($this->parseCDATA($string)); - if ($string === 'none') return $string; + if ($string === 'none') { + return $string; + } $parts = explode(' ', $string); $final = ''; @@ -28,11 +36,11 @@ class HTMLPurifier_AttrDef_CSS_TextDecoration extends HTMLPurifier_AttrDef } } $final = rtrim($final); - if ($final === '') return false; + if ($final === '') { + return false; + } return $final; - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/URI.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/URI.php similarity index 76% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/URI.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/URI.php index c2f767e57..f9434230e 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/CSS/URI.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/CSS/URI.php @@ -12,25 +12,39 @@ class HTMLPurifier_AttrDef_CSS_URI extends HTMLPurifier_AttrDef_URI { - public function __construct() { + public function __construct() + { parent::__construct(true); // always embedded } - public function validate($uri_string, $config, $context) { + /** + * @param string $uri_string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($uri_string, $config, $context) + { // parse the URI out of the string and then pass it onto // the parent object $uri_string = $this->parseCDATA($uri_string); - if (strpos($uri_string, 'url(') !== 0) return false; + if (strpos($uri_string, 'url(') !== 0) { + return false; + } $uri_string = substr($uri_string, 4); $new_length = strlen($uri_string) - 1; - if ($uri_string[$new_length] != ')') return false; + if ($uri_string[$new_length] != ')') { + return false; + } $uri = trim(substr($uri_string, 0, $new_length)); if (!empty($uri) && ($uri[0] == "'" || $uri[0] == '"')) { $quote = $uri[0]; $new_length = strlen($uri) - 1; - if ($uri[$new_length] !== $quote) return false; + if ($uri[$new_length] !== $quote) { + return false; + } $uri = substr($uri, 1, $new_length - 1); } @@ -38,7 +52,9 @@ class HTMLPurifier_AttrDef_CSS_URI extends HTMLPurifier_AttrDef_URI $result = parent::validate($uri, $config, $context); - if ($result === false) return false; + if ($result === false) { + return false; + } // extra sanity check; should have been done by URI $result = str_replace(array('"', "\\", "\n", "\x0c", "\r"), "", $result); @@ -51,11 +67,8 @@ class HTMLPurifier_AttrDef_CSS_URI extends HTMLPurifier_AttrDef_URI // an innerHTML cycle, so a very unlucky query parameter could // then change the meaning of the URL. Unfortunately, there's // not much we can do about that... - return "url(\"$result\")"; - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Clone.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Clone.php new file mode 100644 index 000000000..6698a00c0 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Clone.php @@ -0,0 +1,44 @@ +clone = $clone; + } + + /** + * @param string $v + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($v, $config, $context) + { + return $this->clone->validate($v, $config, $context); + } + + /** + * @param string $string + * @return HTMLPurifier_AttrDef + */ + public function make($string) + { + return clone $this->clone; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Enum.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Enum.php similarity index 70% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Enum.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Enum.php index 5d603ebcc..8abda7f6e 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Enum.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Enum.php @@ -12,9 +12,10 @@ class HTMLPurifier_AttrDef_Enum extends HTMLPurifier_AttrDef /** * Lookup table of valid values. + * @type array * @todo Make protected */ - public $valid_values = array(); + public $valid_values = array(); /** * Bool indicating whether or not enumeration is case sensitive. @@ -23,17 +24,23 @@ class HTMLPurifier_AttrDef_Enum extends HTMLPurifier_AttrDef protected $case_sensitive = false; // values according to W3C spec /** - * @param $valid_values List of valid values - * @param $case_sensitive Bool indicating whether or not case sensitive + * @param array $valid_values List of valid values + * @param bool $case_sensitive Whether or not case sensitive */ - public function __construct( - $valid_values = array(), $case_sensitive = false - ) { + public function __construct($valid_values = array(), $case_sensitive = false) + { $this->valid_values = array_flip($valid_values); $this->case_sensitive = $case_sensitive; } - public function validate($string, $config, $context) { + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { $string = trim($string); if (!$this->case_sensitive) { // we may want to do full case-insensitive libraries @@ -45,11 +52,13 @@ class HTMLPurifier_AttrDef_Enum extends HTMLPurifier_AttrDef } /** - * @param $string In form of comma-delimited list of case-insensitive + * @param string $string In form of comma-delimited list of case-insensitive * valid values. Example: "foo,bar,baz". Prepend "s:" to make * case sensitive + * @return HTMLPurifier_AttrDef_Enum */ - public function make($string) { + public function make($string) + { if (strlen($string) > 2 && $string[0] == 's' && $string[1] == ':') { $string = substr($string, 2); $sensitive = true; @@ -59,7 +68,6 @@ class HTMLPurifier_AttrDef_Enum extends HTMLPurifier_AttrDef $values = explode(',', $string); return new HTMLPurifier_AttrDef_Enum($values, $sensitive); } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/Bool.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/Bool.php new file mode 100644 index 000000000..036a240e1 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/Bool.php @@ -0,0 +1,51 @@ +name = $name; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + if (empty($string)) { + return false; + } + return $this->name; + } + + /** + * @param string $string Name of attribute + * @return HTMLPurifier_AttrDef_HTML_Bool + */ + public function make($string) + { + return new HTMLPurifier_AttrDef_HTML_Bool($string); + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/Class.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/Class.php similarity index 66% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/Class.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/Class.php index 370068d97..d5013488f 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/Class.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/Class.php @@ -5,7 +5,14 @@ */ class HTMLPurifier_AttrDef_HTML_Class extends HTMLPurifier_AttrDef_HTML_Nmtokens { - protected function split($string, $config, $context) { + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + protected function split($string, $config, $context) + { // really, this twiddle should be lazy loaded $name = $config->getDefinition('HTML')->doctype->name; if ($name == "XHTML 1.1" || $name == "XHTML 2.0") { @@ -14,13 +21,20 @@ class HTMLPurifier_AttrDef_HTML_Class extends HTMLPurifier_AttrDef_HTML_Nmtokens return preg_split('/\s+/', $string); } } - protected function filter($tokens, $config, $context) { + + /** + * @param array $tokens + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + protected function filter($tokens, $config, $context) + { $allowed = $config->get('Attr.AllowedClasses'); $forbidden = $config->get('Attr.ForbiddenClasses'); $ret = array(); foreach ($tokens as $token) { - if ( - ($allowed === null || isset($allowed[$token])) && + if (($allowed === null || isset($allowed[$token])) && !isset($forbidden[$token]) && // We need this O(n) check because of PHP's array // implementation that casts -0 to 0. diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/Color.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/Color.php new file mode 100644 index 000000000..946ebb782 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/Color.php @@ -0,0 +1,51 @@ +get('Core.ColorKeywords'); + } + + $string = trim($string); + + if (empty($string)) { + return false; + } + $lower = strtolower($string); + if (isset($colors[$lower])) { + return $colors[$lower]; + } + if ($string[0] === '#') { + $hex = substr($string, 1); + } else { + $hex = $string; + } + + $length = strlen($hex); + if ($length !== 3 && $length !== 6) { + return false; + } + if (!ctype_xdigit($hex)) { + return false; + } + if ($length === 3) { + $hex = $hex[0] . $hex[0] . $hex[1] . $hex[1] . $hex[2] . $hex[2]; + } + return "#$hex"; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php new file mode 100644 index 000000000..d79ba12b3 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php @@ -0,0 +1,38 @@ +valid_values === false) { + $this->valid_values = $config->get('Attr.AllowedFrameTargets'); + } + return parent::validate($string, $config, $context); + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/ID.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/ID.php similarity index 63% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/ID.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/ID.php index 0015fa1eb..3d86efb44 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/ID.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/ID.php @@ -18,34 +18,56 @@ class HTMLPurifier_AttrDef_HTML_ID extends HTMLPurifier_AttrDef /** * Determines whether or not we're validating an ID in a CSS * selector context. + * @type bool */ protected $selector; - public function __construct($selector = false) { + /** + * @param bool $selector + */ + public function __construct($selector = false) + { $this->selector = $selector; } - public function validate($id, $config, $context) { - - if (!$this->selector && !$config->get('Attr.EnableID')) return false; + /** + * @param string $id + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($id, $config, $context) + { + if (!$this->selector && !$config->get('Attr.EnableID')) { + return false; + } $id = trim($id); // trim it first - if ($id === '') return false; + if ($id === '') { + return false; + } $prefix = $config->get('Attr.IDPrefix'); if ($prefix !== '') { $prefix .= $config->get('Attr.IDPrefixLocal'); // prevent re-appending the prefix - if (strpos($id, $prefix) !== 0) $id = $prefix . $id; + if (strpos($id, $prefix) !== 0) { + $id = $prefix . $id; + } } elseif ($config->get('Attr.IDPrefixLocal') !== '') { - trigger_error('%Attr.IDPrefixLocal cannot be used unless '. - '%Attr.IDPrefix is set', E_USER_WARNING); + trigger_error( + '%Attr.IDPrefixLocal cannot be used unless ' . + '%Attr.IDPrefix is set', + E_USER_WARNING + ); } if (!$this->selector) { $id_accumulator =& $context->get('IDAccumulator'); - if (isset($id_accumulator->ids[$id])) return false; + if (isset($id_accumulator->ids[$id])) { + return false; + } } // we purposely avoid using regex, hopefully this is faster @@ -53,11 +75,14 @@ class HTMLPurifier_AttrDef_HTML_ID extends HTMLPurifier_AttrDef if (ctype_alpha($id)) { $result = true; } else { - if (!ctype_alpha(@$id[0])) return false; - $trim = trim( // primitive style of regexps, I suppose + if (!ctype_alpha(@$id[0])) { + return false; + } + // primitive style of regexps, I suppose + $trim = trim( $id, 'A..Za..z0..9:-._' - ); + ); $result = ($trim === ''); } @@ -66,15 +91,15 @@ class HTMLPurifier_AttrDef_HTML_ID extends HTMLPurifier_AttrDef return false; } - if (!$this->selector && $result) $id_accumulator->add($id); + if (!$this->selector && $result) { + $id_accumulator->add($id); + } // if no change was made to the ID, return the result // else, return the new id if stripping whitespace made it // valid, or return false. return $result ? $id : false; - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/Length.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/Length.php new file mode 100644 index 000000000..1c4006fbb --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/Length.php @@ -0,0 +1,56 @@ + 100) { + return '100%'; + } + return ((string)$points) . '%'; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php similarity index 56% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php index 76d25ed08..63fa04c15 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php @@ -9,26 +9,44 @@ class HTMLPurifier_AttrDef_HTML_LinkTypes extends HTMLPurifier_AttrDef { - /** Name config attribute to pull. */ + /** + * Name config attribute to pull. + * @type string + */ protected $name; - public function __construct($name) { + /** + * @param string $name + */ + public function __construct($name) + { $configLookup = array( 'rel' => 'AllowedRel', 'rev' => 'AllowedRev' ); if (!isset($configLookup[$name])) { - trigger_error('Unrecognized attribute name for link '. - 'relationship.', E_USER_ERROR); + trigger_error( + 'Unrecognized attribute name for link ' . + 'relationship.', + E_USER_ERROR + ); return; } $this->name = $configLookup[$name]; } - public function validate($string, $config, $context) { - + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { $allowed = $config->get('Attr.' . $this->name); - if (empty($allowed)) return false; + if (empty($allowed)) { + return false; + } $string = $this->parseCDATA($string); $parts = explode(' ', $string); @@ -37,17 +55,18 @@ class HTMLPurifier_AttrDef_HTML_LinkTypes extends HTMLPurifier_AttrDef $ret_lookup = array(); foreach ($parts as $part) { $part = strtolower(trim($part)); - if (!isset($allowed[$part])) continue; + if (!isset($allowed[$part])) { + continue; + } $ret_lookup[$part] = true; } - if (empty($ret_lookup)) return false; + if (empty($ret_lookup)) { + return false; + } $string = implode(' ', array_keys($ret_lookup)); - return $string; - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/MultiLength.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/MultiLength.php new file mode 100644 index 000000000..bbb20f2f8 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/MultiLength.php @@ -0,0 +1,60 @@ +split($string, $config, $context); $tokens = $this->filter($tokens, $config, $context); - if (empty($tokens)) return false; + if (empty($tokens)) { + return false; + } return implode(' ', $tokens); - } /** * Splits a space separated list of tokens into its constituent parts. + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array */ - protected function split($string, $config, $context) { + protected function split($string, $config, $context) + { // OPTIMIZABLE! // do the preg_match, capture all subpatterns for reformulation @@ -31,9 +45,9 @@ class HTMLPurifier_AttrDef_HTML_Nmtokens extends HTMLPurifier_AttrDef // escaping because I don't know how to do that with regexps // and plus it would complicate optimization efforts (you never // see that anyway). - $pattern = '/(?:(?<=\s)|\A)'. // look behind for space or string start - '((?:--|-?[A-Za-z_])[A-Za-z_\-0-9]*)'. - '(?:(?=\s)|\z)/'; // look ahead for space or string end + $pattern = '/(?:(?<=\s)|\A)' . // look behind for space or string start + '((?:--|-?[A-Za-z_])[A-Za-z_\-0-9]*)' . + '(?:(?=\s)|\z)/'; // look ahead for space or string end preg_match_all($pattern, $string, $matches); return $matches[1]; } @@ -42,11 +56,15 @@ class HTMLPurifier_AttrDef_HTML_Nmtokens extends HTMLPurifier_AttrDef * Template method for removing certain tokens based on arbitrary criteria. * @note If we wanted to be really functional, we'd do an array_filter * with a callback. But... we're not. + * @param array $tokens + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array */ - protected function filter($tokens, $config, $context) { + protected function filter($tokens, $config, $context) + { return $tokens; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/Pixels.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/Pixels.php new file mode 100644 index 000000000..a1d019e09 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/HTML/Pixels.php @@ -0,0 +1,76 @@ +max = $max; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $string = trim($string); + if ($string === '0') { + return $string; + } + if ($string === '') { + return false; + } + $length = strlen($string); + if (substr($string, $length - 2) == 'px') { + $string = substr($string, 0, $length - 2); + } + if (!is_numeric($string)) { + return false; + } + $int = (int)$string; + + if ($int < 0) { + return '0'; + } + + // upper-bound value, extremely high values can + // crash operating systems, see + // WARNING, above link WILL crash you if you're using Windows + + if ($this->max !== null && $int > $this->max) { + return (string)$this->max; + } + return (string)$int; + } + + /** + * @param string $string + * @return HTMLPurifier_AttrDef + */ + public function make($string) + { + if ($string === '') { + $max = null; + } else { + $max = (int)$string; + } + $class = get_class($this); + return new $class($max); + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Integer.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Integer.php similarity index 55% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Integer.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Integer.php index d59738d2a..400e707d2 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Integer.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Integer.php @@ -11,17 +11,20 @@ class HTMLPurifier_AttrDef_Integer extends HTMLPurifier_AttrDef { /** - * Bool indicating whether or not negative values are allowed + * Whether or not negative values are allowed. + * @type bool */ protected $negative = true; /** - * Bool indicating whether or not zero is allowed + * Whether or not zero is allowed. + * @type bool */ protected $zero = true; /** - * Bool indicating whether or not positive values are allowed + * Whether or not positive values are allowed. + * @type bool */ protected $positive = true; @@ -30,44 +33,59 @@ class HTMLPurifier_AttrDef_Integer extends HTMLPurifier_AttrDef * @param $zero Bool indicating whether or not zero is allowed * @param $positive Bool indicating whether or not positive values are allowed */ - public function __construct( - $negative = true, $zero = true, $positive = true - ) { + public function __construct($negative = true, $zero = true, $positive = true) + { $this->negative = $negative; - $this->zero = $zero; + $this->zero = $zero; $this->positive = $positive; } - public function validate($integer, $config, $context) { - + /** + * @param string $integer + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($integer, $config, $context) + { $integer = $this->parseCDATA($integer); - if ($integer === '') return false; + if ($integer === '') { + return false; + } // we could possibly simply typecast it to integer, but there are // certain fringe cases that must not return an integer. // clip leading sign - if ( $this->negative && $integer[0] === '-' ) { + if ($this->negative && $integer[0] === '-') { $digits = substr($integer, 1); - if ($digits === '0') $integer = '0'; // rm minus sign for zero - } elseif( $this->positive && $integer[0] === '+' ) { + if ($digits === '0') { + $integer = '0'; + } // rm minus sign for zero + } elseif ($this->positive && $integer[0] === '+') { $digits = $integer = substr($integer, 1); // rm unnecessary plus } else { $digits = $integer; } // test if it's numeric - if (!ctype_digit($digits)) return false; + if (!ctype_digit($digits)) { + return false; + } // perform scope tests - if (!$this->zero && $integer == 0) return false; - if (!$this->positive && $integer > 0) return false; - if (!$this->negative && $integer < 0) return false; + if (!$this->zero && $integer == 0) { + return false; + } + if (!$this->positive && $integer > 0) { + return false; + } + if (!$this->negative && $integer < 0) { + return false; + } return $integer; - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Lang.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Lang.php similarity index 67% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Lang.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Lang.php index 10e6da56d..2a55cea64 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Lang.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Lang.php @@ -7,15 +7,25 @@ class HTMLPurifier_AttrDef_Lang extends HTMLPurifier_AttrDef { - public function validate($string, $config, $context) { - + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { $string = trim($string); - if (!$string) return false; + if (!$string) { + return false; + } $subtags = explode('-', $string); $num_subtags = count($subtags); - if ($num_subtags == 0) return false; // sanity check + if ($num_subtags == 0) { // sanity check + return false; + } // process primary subtag : $subtags[0] $length = strlen($subtags[0]); @@ -23,15 +33,15 @@ class HTMLPurifier_AttrDef_Lang extends HTMLPurifier_AttrDef case 0: return false; case 1: - if (! ($subtags[0] == 'x' || $subtags[0] == 'i') ) { + if (!($subtags[0] == 'x' || $subtags[0] == 'i')) { return false; } break; case 2: case 3: - if (! ctype_alpha($subtags[0]) ) { + if (!ctype_alpha($subtags[0])) { return false; - } elseif (! ctype_lower($subtags[0]) ) { + } elseif (!ctype_lower($subtags[0])) { $subtags[0] = strtolower($subtags[0]); } break; @@ -40,17 +50,23 @@ class HTMLPurifier_AttrDef_Lang extends HTMLPurifier_AttrDef } $new_string = $subtags[0]; - if ($num_subtags == 1) return $new_string; + if ($num_subtags == 1) { + return $new_string; + } // process second subtag : $subtags[1] $length = strlen($subtags[1]); if ($length == 0 || ($length == 1 && $subtags[1] != 'x') || $length > 8 || !ctype_alnum($subtags[1])) { return $new_string; } - if (!ctype_lower($subtags[1])) $subtags[1] = strtolower($subtags[1]); + if (!ctype_lower($subtags[1])) { + $subtags[1] = strtolower($subtags[1]); + } $new_string .= '-' . $subtags[1]; - if ($num_subtags == 2) return $new_string; + if ($num_subtags == 2) { + return $new_string; + } // process all other subtags, index 2 and up for ($i = 2; $i < $num_subtags; $i++) { @@ -63,11 +79,8 @@ class HTMLPurifier_AttrDef_Lang extends HTMLPurifier_AttrDef } $new_string .= '-' . $subtags[$i]; } - return $new_string; - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Switch.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Switch.php similarity index 62% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Switch.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Switch.php index c9e3ed193..c7eb3199a 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/Switch.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Switch.php @@ -6,21 +6,41 @@ class HTMLPurifier_AttrDef_Switch { + /** + * @type string + */ protected $tag; - protected $withTag, $withoutTag; + + /** + * @type HTMLPurifier_AttrDef + */ + protected $withTag; + + /** + * @type HTMLPurifier_AttrDef + */ + protected $withoutTag; /** * @param string $tag Tag name to switch upon * @param HTMLPurifier_AttrDef $with_tag Call if token matches tag * @param HTMLPurifier_AttrDef $without_tag Call if token doesn't match, or there is no token */ - public function __construct($tag, $with_tag, $without_tag) { + public function __construct($tag, $with_tag, $without_tag) + { $this->tag = $tag; $this->withTag = $with_tag; $this->withoutTag = $without_tag; } - public function validate($string, $config, $context) { + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { $token = $context->get('CurrentToken', true); if (!$token || $token->name !== $this->tag) { return $this->withoutTag->validate($string, $config, $context); @@ -28,7 +48,6 @@ class HTMLPurifier_AttrDef_Switch return $this->withTag->validate($string, $config, $context); } } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Text.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Text.php new file mode 100644 index 000000000..4553a4ea9 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/Text.php @@ -0,0 +1,21 @@ +parseCDATA($string); + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/URI.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/URI.php similarity index 55% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/URI.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/URI.php index c2b684671..c1cd89772 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/URI.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/URI.php @@ -7,31 +7,54 @@ class HTMLPurifier_AttrDef_URI extends HTMLPurifier_AttrDef { + /** + * @type HTMLPurifier_URIParser + */ protected $parser; + + /** + * @type bool + */ protected $embedsResource; /** - * @param $embeds_resource_resource Does the URI here result in an extra HTTP request? + * @param bool $embeds_resource Does the URI here result in an extra HTTP request? */ - public function __construct($embeds_resource = false) { + public function __construct($embeds_resource = false) + { $this->parser = new HTMLPurifier_URIParser(); - $this->embedsResource = (bool) $embeds_resource; + $this->embedsResource = (bool)$embeds_resource; } - public function make($string) { + /** + * @param string $string + * @return HTMLPurifier_AttrDef_URI + */ + public function make($string) + { $embeds = ($string === 'embedded'); return new HTMLPurifier_AttrDef_URI($embeds); } - public function validate($uri, $config, $context) { - - if ($config->get('URI.Disable')) return false; + /** + * @param string $uri + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($uri, $config, $context) + { + if ($config->get('URI.Disable')) { + return false; + } $uri = $this->parseCDATA($uri); // parse the URI $uri = $this->parser->parse($uri); - if ($uri === false) return false; + if ($uri === false) { + return false; + } // add embedded flag to context for validators $context->register('EmbeddedURI', $this->embedsResource); @@ -41,23 +64,35 @@ class HTMLPurifier_AttrDef_URI extends HTMLPurifier_AttrDef // generic validation $result = $uri->validate($config, $context); - if (!$result) break; + if (!$result) { + break; + } // chained filtering $uri_def = $config->getDefinition('URI'); $result = $uri_def->filter($uri, $config, $context); - if (!$result) break; + if (!$result) { + break; + } // scheme-specific validation $scheme_obj = $uri->getSchemeObj($config, $context); - if (!$scheme_obj) break; - if ($this->embedsResource && !$scheme_obj->browsable) break; + if (!$scheme_obj) { + break; + } + if ($this->embedsResource && !$scheme_obj->browsable) { + break; + } $result = $scheme_obj->validate($uri, $config, $context); - if (!$result) break; + if (!$result) { + break; + } // Post chained filtering $result = $uri_def->postFilter($uri, $config, $context); - if (!$result) break; + if (!$result) { + break; + } // survived gauntlet $ok = true; @@ -65,13 +100,12 @@ class HTMLPurifier_AttrDef_URI extends HTMLPurifier_AttrDef } while (false); $context->destroy('EmbeddedURI'); - if (!$ok) return false; - + if (!$ok) { + return false; + } // back to string return $uri->toString(); - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/URI/Email.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/URI/Email.php similarity index 73% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/URI/Email.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/URI/Email.php index bfee9d166..daf32b764 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/URI/Email.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/URI/Email.php @@ -5,8 +5,11 @@ abstract class HTMLPurifier_AttrDef_URI_Email extends HTMLPurifier_AttrDef /** * Unpacks a mailbox into its display-name and address + * @param string $string + * @return mixed */ - function unpack($string) { + public function unpack($string) + { // needs to be implemented } diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php similarity index 65% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php index 94c715ab4..52c0d5968 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php @@ -7,15 +7,23 @@ class HTMLPurifier_AttrDef_URI_Email_SimpleCheck extends HTMLPurifier_AttrDef_URI_Email { - public function validate($string, $config, $context) { + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { // no support for named mailboxes i.e. "Bob " // that needs more percent encoding to be done - if ($string == '') return false; + if ($string == '') { + return false; + } $string = trim($string); $result = preg_match('/^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i', $string); return $result ? $string : false; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/URI/Host.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/URI/Host.php similarity index 65% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/URI/Host.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/URI/Host.php index 125decb2d..e7df800b1 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/URI/Host.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/URI/Host.php @@ -7,21 +7,31 @@ class HTMLPurifier_AttrDef_URI_Host extends HTMLPurifier_AttrDef { /** - * Instance of HTMLPurifier_AttrDef_URI_IPv4 sub-validator + * IPv4 sub-validator. + * @type HTMLPurifier_AttrDef_URI_IPv4 */ protected $ipv4; /** - * Instance of HTMLPurifier_AttrDef_URI_IPv6 sub-validator + * IPv6 sub-validator. + * @type HTMLPurifier_AttrDef_URI_IPv6 */ protected $ipv6; - public function __construct() { + public function __construct() + { $this->ipv4 = new HTMLPurifier_AttrDef_URI_IPv4(); $this->ipv6 = new HTMLPurifier_AttrDef_URI_IPv6(); } - public function validate($string, $config, $context) { + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { $length = strlen($string); // empty hostname is OK; it's usually semantically equivalent: // the default host as defined by a URI scheme is used: @@ -29,32 +39,51 @@ class HTMLPurifier_AttrDef_URI_Host extends HTMLPurifier_AttrDef // If the URI scheme defines a default for host, then that // default applies when the host subcomponent is undefined // or when the registered name is empty (zero length). - if ($string === '') return ''; - if ($length > 1 && $string[0] === '[' && $string[$length-1] === ']') { + if ($string === '') { + return ''; + } + if ($length > 1 && $string[0] === '[' && $string[$length - 1] === ']') { //IPv6 $ip = substr($string, 1, $length - 2); $valid = $this->ipv6->validate($ip, $config, $context); - if ($valid === false) return false; - return '['. $valid . ']'; + if ($valid === false) { + return false; + } + return '[' . $valid . ']'; } // need to do checks on unusual encodings too $ipv4 = $this->ipv4->validate($string, $config, $context); - if ($ipv4 !== false) return $ipv4; + if ($ipv4 !== false) { + return $ipv4; + } // A regular domain name. // This doesn't match I18N domain names, but we don't have proper IRI support, // so force users to insert Punycode. + // There is not a good sense in which underscores should be + // allowed, since it's technically not! (And if you go as + // far to allow everything as specified by the DNS spec... + // well, that's literally everything, modulo some space limits + // for the components and the overall name (which, by the way, + // we are NOT checking!). So we (arbitrarily) decide this: + // let's allow underscores wherever we would have allowed + // hyphens, if they are enabled. This is a pretty good match + // for browser behavior, for example, a large number of browsers + // cannot handle foo_.example.com, but foo_bar.example.com is + // fairly well supported. + $underscore = $config->get('Core.AllowHostnameUnderscore') ? '_' : ''; + // The productions describing this are: $a = '[a-z]'; // alpha $an = '[a-z0-9]'; // alphanum - $and = '[a-z0-9-]'; // alphanum | "-" + $and = "[a-z0-9-$underscore]"; // alphanum | "-" // domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum - $domainlabel = "$an($and*$an)?"; + $domainlabel = "$an($and*$an)?"; // toplabel = alpha | alpha *( alphanum | "-" ) alphanum - $toplabel = "$a($and*$an)?"; + $toplabel = "$a($and*$an)?"; // hostname = *( domainlabel "." ) toplabel [ "." ] if (preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string)) { return $string; @@ -92,10 +121,8 @@ class HTMLPurifier_AttrDef_URI_Host extends HTMLPurifier_AttrDef // XXX error reporting } } - return false; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/URI/IPv4.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/URI/IPv4.php similarity index 51% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/URI/IPv4.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/URI/IPv4.php index ec4cf591b..30ac16c9e 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrDef/URI/IPv4.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/URI/IPv4.php @@ -8,32 +8,38 @@ class HTMLPurifier_AttrDef_URI_IPv4 extends HTMLPurifier_AttrDef { /** - * IPv4 regex, protected so that IPv6 can reuse it + * IPv4 regex, protected so that IPv6 can reuse it. + * @type string */ protected $ip4; - public function validate($aIP, $config, $context) { - - if (!$this->ip4) $this->_loadRegex(); - - if (preg_match('#^' . $this->ip4 . '$#s', $aIP)) - { - return $aIP; + /** + * @param string $aIP + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($aIP, $config, $context) + { + if (!$this->ip4) { + $this->_loadRegex(); } + if (preg_match('#^' . $this->ip4 . '$#s', $aIP)) { + return $aIP; + } return false; - } /** * Lazy load function to prevent regex from being stuffed in * cache. */ - protected function _loadRegex() { + protected function _loadRegex() + { $oct = '(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])'; // 0-255 $this->ip4 = "(?:{$oct}\\.{$oct}\\.{$oct}\\.{$oct})"; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/URI/IPv6.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/URI/IPv6.php new file mode 100644 index 000000000..f243793ee --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrDef/URI/IPv6.php @@ -0,0 +1,89 @@ +ip4) { + $this->_loadRegex(); + } + + $original = $aIP; + + $hex = '[0-9a-fA-F]'; + $blk = '(?:' . $hex . '{1,4})'; + $pre = '(?:/(?:12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))'; // /0 - /128 + + // prefix check + if (strpos($aIP, '/') !== false) { + if (preg_match('#' . $pre . '$#s', $aIP, $find)) { + $aIP = substr($aIP, 0, 0 - strlen($find[0])); + unset($find); + } else { + return false; + } + } + + // IPv4-compatiblity check + if (preg_match('#(?<=:' . ')' . $this->ip4 . '$#s', $aIP, $find)) { + $aIP = substr($aIP, 0, 0 - strlen($find[0])); + $ip = explode('.', $find[0]); + $ip = array_map('dechex', $ip); + $aIP .= $ip[0] . $ip[1] . ':' . $ip[2] . $ip[3]; + unset($find, $ip); + } + + // compression check + $aIP = explode('::', $aIP); + $c = count($aIP); + if ($c > 2) { + return false; + } elseif ($c == 2) { + list($first, $second) = $aIP; + $first = explode(':', $first); + $second = explode(':', $second); + + if (count($first) + count($second) > 8) { + return false; + } + + while (count($first) < 8) { + array_push($first, '0'); + } + + array_splice($first, 8 - count($second), 8, $second); + $aIP = $first; + unset($first, $second); + } else { + $aIP = explode(':', $aIP[0]); + } + $c = count($aIP); + + if ($c != 8) { + return false; + } + + // All the pieces should be 16-bit hex strings. Are they? + foreach ($aIP as $piece) { + if (!preg_match('#^[0-9a-fA-F]{4}$#s', sprintf('%04s', $piece))) { + return false; + } + } + return $original; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform.php similarity index 63% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform.php index e61d3e01b..b428331f1 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform.php @@ -20,37 +20,41 @@ abstract class HTMLPurifier_AttrTransform /** * Abstract: makes changes to the attributes dependent on multiple values. * - * @param $attr Assoc array of attributes, usually from + * @param array $attr Assoc array of attributes, usually from * HTMLPurifier_Token_Tag::$attr - * @param $config Mandatory HTMLPurifier_Config object. - * @param $context Mandatory HTMLPurifier_Context object - * @returns Processed attribute array. + * @param HTMLPurifier_Config $config Mandatory HTMLPurifier_Config object. + * @param HTMLPurifier_Context $context Mandatory HTMLPurifier_Context object + * @return array Processed attribute array. */ abstract public function transform($attr, $config, $context); /** * Prepends CSS properties to the style attribute, creating the * attribute if it doesn't exist. - * @param $attr Attribute array to process (passed by reference) - * @param $css CSS to prepend + * @param array &$attr Attribute array to process (passed by reference) + * @param string $css CSS to prepend */ - public function prependCSS(&$attr, $css) { + public function prependCSS(&$attr, $css) + { $attr['style'] = isset($attr['style']) ? $attr['style'] : ''; $attr['style'] = $css . $attr['style']; } /** * Retrieves and removes an attribute - * @param $attr Attribute array to process (passed by reference) - * @param $key Key of attribute to confiscate + * @param array &$attr Attribute array to process (passed by reference) + * @param mixed $key Key of attribute to confiscate + * @return mixed */ - public function confiscateAttr(&$attr, $key) { - if (!isset($attr[$key])) return null; + public function confiscateAttr(&$attr, $key) + { + if (!isset($attr[$key])) { + return null; + } $value = $attr[$key]; unset($attr[$key]); return $value; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Background.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Background.php similarity index 55% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Background.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Background.php index 0e1ff24a3..2f72869a5 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Background.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Background.php @@ -3,21 +3,26 @@ /** * Pre-transform that changes proprietary background attribute to CSS. */ -class HTMLPurifier_AttrTransform_Background extends HTMLPurifier_AttrTransform { - - public function transform($attr, $config, $context) { - - if (!isset($attr['background'])) return $attr; +class HTMLPurifier_AttrTransform_Background extends HTMLPurifier_AttrTransform +{ + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr['background'])) { + return $attr; + } $background = $this->confiscateAttr($attr, 'background'); // some validation should happen here $this->prependCSS($attr, "background-image:url($background);"); - return $attr; - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/BdoDir.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/BdoDir.php similarity index 55% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/BdoDir.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/BdoDir.php index 4d1a05665..d66c04a5b 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/BdoDir.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/BdoDir.php @@ -8,12 +8,20 @@ class HTMLPurifier_AttrTransform_BdoDir extends HTMLPurifier_AttrTransform { - public function transform($attr, $config, $context) { - if (isset($attr['dir'])) return $attr; + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (isset($attr['dir'])) { + return $attr; + } $attr['dir'] = $config->get('Attr.DefaultTextDir'); return $attr; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/BgColor.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/BgColor.php similarity index 55% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/BgColor.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/BgColor.php index ad3916bb9..0f51fd2ce 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/BgColor.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/BgColor.php @@ -3,21 +3,26 @@ /** * Pre-transform that changes deprecated bgcolor attribute to CSS. */ -class HTMLPurifier_AttrTransform_BgColor extends HTMLPurifier_AttrTransform { - - public function transform($attr, $config, $context) { - - if (!isset($attr['bgcolor'])) return $attr; +class HTMLPurifier_AttrTransform_BgColor extends HTMLPurifier_AttrTransform +{ + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr['bgcolor'])) { + return $attr; + } $bgcolor = $this->confiscateAttr($attr, 'bgcolor'); // some validation should happen here $this->prependCSS($attr, "background-color:$bgcolor;"); - return $attr; - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/BoolToCSS.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/BoolToCSS.php new file mode 100644 index 000000000..f25cd0195 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/BoolToCSS.php @@ -0,0 +1,47 @@ +attr = $attr; + $this->css = $css; + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr[$this->attr])) { + return $attr; + } + unset($attr[$this->attr]); + $this->prependCSS($attr, $this->css); + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Border.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Border.php similarity index 55% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Border.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Border.php index 476b0b079..057dc017f 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Border.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Border.php @@ -3,16 +3,24 @@ /** * Pre-transform that changes deprecated border attribute to CSS. */ -class HTMLPurifier_AttrTransform_Border extends HTMLPurifier_AttrTransform { - - public function transform($attr, $config, $context) { - if (!isset($attr['border'])) return $attr; +class HTMLPurifier_AttrTransform_Border extends HTMLPurifier_AttrTransform +{ + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr['border'])) { + return $attr; + } $border_width = $this->confiscateAttr($attr, 'border'); // some validation should happen here $this->prependCSS($attr, "border:{$border_width}px solid;"); return $attr; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/EnumToCSS.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/EnumToCSS.php new file mode 100644 index 000000000..7ccd0e3fb --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/EnumToCSS.php @@ -0,0 +1,68 @@ +attr = $attr; + $this->enumToCSS = $enum_to_css; + $this->caseSensitive = (bool)$case_sensitive; + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr[$this->attr])) { + return $attr; + } + + $value = trim($attr[$this->attr]); + unset($attr[$this->attr]); + + if (!$this->caseSensitive) { + $value = strtolower($value); + } + + if (!isset($this->enumToCSS[$value])) { + return $attr; + } + $this->prependCSS($attr, $this->enumToCSS[$value]); + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/ImgRequired.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/ImgRequired.php similarity index 77% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/ImgRequired.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/ImgRequired.php index 7f0e4b7a5..7df6cb3e1 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/ImgRequired.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/ImgRequired.php @@ -11,11 +11,19 @@ class HTMLPurifier_AttrTransform_ImgRequired extends HTMLPurifier_AttrTransform { - public function transform($attr, $config, $context) { - + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { $src = true; if (!isset($attr['src'])) { - if ($config->get('Core.RemoveInvalidImg')) return $attr; + if ($config->get('Core.RemoveInvalidImg')) { + return $attr; + } $attr['src'] = $config->get('Attr.DefaultInvalidImage'); $src = false; } @@ -25,7 +33,7 @@ class HTMLPurifier_AttrTransform_ImgRequired extends HTMLPurifier_AttrTransform $alt = $config->get('Attr.DefaultImageAlt'); if ($alt === null) { // truncate if the alt is too long - $attr['alt'] = substr(basename($attr['src']),0,40); + $attr['alt'] = substr(basename($attr['src']), 0, 40); } else { $attr['alt'] = $alt; } @@ -33,11 +41,8 @@ class HTMLPurifier_AttrTransform_ImgRequired extends HTMLPurifier_AttrTransform $attr['alt'] = $config->get('Attr.DefaultInvalidImageAlt'); } } - return $attr; - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/ImgSpace.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/ImgSpace.php similarity index 60% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/ImgSpace.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/ImgSpace.php index fd84c10c3..350b3358f 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/ImgSpace.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/ImgSpace.php @@ -3,42 +3,59 @@ /** * Pre-transform that changes deprecated hspace and vspace attributes to CSS */ -class HTMLPurifier_AttrTransform_ImgSpace extends HTMLPurifier_AttrTransform { - +class HTMLPurifier_AttrTransform_ImgSpace extends HTMLPurifier_AttrTransform +{ + /** + * @type string + */ protected $attr; + + /** + * @type array + */ protected $css = array( 'hspace' => array('left', 'right'), 'vspace' => array('top', 'bottom') ); - public function __construct($attr) { + /** + * @param string $attr + */ + public function __construct($attr) + { $this->attr = $attr; if (!isset($this->css[$attr])) { trigger_error(htmlspecialchars($attr) . ' is not valid space attribute'); } } - public function transform($attr, $config, $context) { - - if (!isset($attr[$this->attr])) return $attr; + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr[$this->attr])) { + return $attr; + } $width = $this->confiscateAttr($attr, $this->attr); // some validation could happen here - if (!isset($this->css[$this->attr])) return $attr; + if (!isset($this->css[$this->attr])) { + return $attr; + } $style = ''; foreach ($this->css[$this->attr] as $suffix) { $property = "margin-$suffix"; $style .= "$property:{$width}px;"; } - $this->prependCSS($attr, $style); - return $attr; - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Input.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Input.php similarity index 61% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Input.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Input.php index 16829552d..3ab47ed8c 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Input.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Input.php @@ -4,17 +4,31 @@ * Performs miscellaneous cross attribute validation and filtering for * input elements. This is meant to be a post-transform. */ -class HTMLPurifier_AttrTransform_Input extends HTMLPurifier_AttrTransform { - +class HTMLPurifier_AttrTransform_Input extends HTMLPurifier_AttrTransform +{ + /** + * @type HTMLPurifier_AttrDef_HTML_Pixels + */ protected $pixels; - public function __construct() { + public function __construct() + { $this->pixels = new HTMLPurifier_AttrDef_HTML_Pixels(); } - public function transform($attr, $config, $context) { - if (!isset($attr['type'])) $t = 'text'; - else $t = strtolower($attr['type']); + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr['type'])) { + $t = 'text'; + } else { + $t = strtolower($attr['type']); + } if (isset($attr['checked']) && $t !== 'radio' && $t !== 'checkbox') { unset($attr['checked']); } @@ -23,8 +37,11 @@ class HTMLPurifier_AttrTransform_Input extends HTMLPurifier_AttrTransform { } if (isset($attr['size']) && $t !== 'text' && $t !== 'password') { $result = $this->pixels->validate($attr['size'], $config, $context); - if ($result === false) unset($attr['size']); - else $attr['size'] = $result; + if ($result === false) { + unset($attr['size']); + } else { + $attr['size'] = $result; + } } if (isset($attr['src']) && $t !== 'image') { unset($attr['src']); @@ -34,7 +51,6 @@ class HTMLPurifier_AttrTransform_Input extends HTMLPurifier_AttrTransform { } return $attr; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Lang.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Lang.php similarity index 68% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Lang.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Lang.php index 5869e7f82..5b0aff0e4 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Lang.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Lang.php @@ -8,9 +8,15 @@ class HTMLPurifier_AttrTransform_Lang extends HTMLPurifier_AttrTransform { - public function transform($attr, $config, $context) { - - $lang = isset($attr['lang']) ? $attr['lang'] : false; + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + $lang = isset($attr['lang']) ? $attr['lang'] : false; $xml_lang = isset($attr['xml:lang']) ? $attr['xml:lang'] : false; if ($lang !== false && $xml_lang === false) { @@ -18,11 +24,8 @@ class HTMLPurifier_AttrTransform_Lang extends HTMLPurifier_AttrTransform } elseif ($xml_lang !== false) { $attr['lang'] = $xml_lang; } - return $attr; - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Length.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Length.php new file mode 100644 index 000000000..853f33549 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Length.php @@ -0,0 +1,45 @@ +name = $name; + $this->cssName = $css_name ? $css_name : $name; + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr[$this->name])) { + return $attr; + } + $length = $this->confiscateAttr($attr, $this->name); + if (ctype_digit($length)) { + $length .= 'px'; + } + $this->prependCSS($attr, $this->cssName . ":$length;"); + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Name.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Name.php new file mode 100644 index 000000000..63cce6837 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Name.php @@ -0,0 +1,33 @@ +get('HTML.Attr.Name.UseCDATA')) { + return $attr; + } + if (!isset($attr['name'])) { + return $attr; + } + $id = $this->confiscateAttr($attr, 'name'); + if (isset($attr['id'])) { + return $attr; + } + $attr['id'] = $id; + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/NameSync.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/NameSync.php new file mode 100644 index 000000000..36079b786 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/NameSync.php @@ -0,0 +1,41 @@ +idDef = new HTMLPurifier_AttrDef_HTML_ID(); + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr['name'])) { + return $attr; + } + $name = $attr['name']; + if (isset($attr['id']) && $attr['id'] === $name) { + return $attr; + } + $result = $this->idDef->validate($name, $config, $context); + if ($result === false) { + unset($attr['name']); + } else { + $attr['name'] = $result; + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Nofollow.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Nofollow.php similarity index 76% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Nofollow.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Nofollow.php index e699c79a8..1057ebee1 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/Nofollow.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Nofollow.php @@ -8,14 +8,24 @@ */ class HTMLPurifier_AttrTransform_Nofollow extends HTMLPurifier_AttrTransform { + /** + * @type HTMLPurifier_URIParser + */ private $parser; - public function __construct() { + public function __construct() + { $this->parser = new HTMLPurifier_URIParser(); } - public function transform($attr, $config, $context) { - + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { if (!isset($attr['href'])) { return $attr; } @@ -35,11 +45,8 @@ class HTMLPurifier_AttrTransform_Nofollow extends HTMLPurifier_AttrTransform $attr['rel'] = 'nofollow'; } } - return $attr; - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/SafeEmbed.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/SafeEmbed.php similarity index 56% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/SafeEmbed.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/SafeEmbed.php index 4da449981..231c81a3f 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/SafeEmbed.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/SafeEmbed.php @@ -2,9 +2,19 @@ class HTMLPurifier_AttrTransform_SafeEmbed extends HTMLPurifier_AttrTransform { + /** + * @type string + */ public $name = "SafeEmbed"; - public function transform($attr, $config, $context) { + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { $attr['allowscriptaccess'] = 'never'; $attr['allownetworking'] = 'internal'; $attr['type'] = 'application/x-shockwave-flash'; diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/SafeObject.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/SafeObject.php new file mode 100644 index 000000000..d1f3a4d2e --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/SafeObject.php @@ -0,0 +1,28 @@ +uri = new HTMLPurifier_AttrDef_URI(true); // embedded $this->wmode = new HTMLPurifier_AttrDef_Enum(array('window', 'opaque', 'transparent')); } - public function transform($attr, $config, $context) { + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { // If we add support for other objects, we'll need to alter the // transforms. switch ($attr['name']) { diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/ScriptRequired.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/ScriptRequired.php similarity index 59% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/ScriptRequired.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/ScriptRequired.php index 4499050a2..b7057bbf8 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/ScriptRequired.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/ScriptRequired.php @@ -5,7 +5,14 @@ */ class HTMLPurifier_AttrTransform_ScriptRequired extends HTMLPurifier_AttrTransform { - public function transform($attr, $config, $context) { + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { if (!isset($attr['type'])) { $attr['type'] = 'text/javascript'; } diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/TargetBlank.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/TargetBlank.php similarity index 72% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/TargetBlank.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/TargetBlank.php index deba8b40f..dd63ea89c 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTransform/TargetBlank.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/TargetBlank.php @@ -9,14 +9,24 @@ */ class HTMLPurifier_AttrTransform_TargetBlank extends HTMLPurifier_AttrTransform { + /** + * @type HTMLPurifier_URIParser + */ private $parser; - public function __construct() { + public function __construct() + { $this->parser = new HTMLPurifier_URIParser(); } - public function transform($attr, $config, $context) { - + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { if (!isset($attr['href'])) { return $attr; } @@ -28,11 +38,8 @@ class HTMLPurifier_AttrTransform_TargetBlank extends HTMLPurifier_AttrTransform if ($scheme->browsable && !$url->isBenign($config, $context)) { $attr['target'] = '_blank'; } - return $attr; - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Textarea.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Textarea.php new file mode 100644 index 000000000..6a9f33a0c --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTransform/Textarea.php @@ -0,0 +1,27 @@ + + */ +class HTMLPurifier_AttrTransform_Textarea extends HTMLPurifier_AttrTransform +{ + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + // Calculated from Firefox + if (!isset($attr['cols'])) { + $attr['cols'] = '22'; + } + if (!isset($attr['rows'])) { + $attr['rows'] = '3'; + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTypes.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTypes.php similarity index 83% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTypes.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTypes.php index 6f985ff93..3b70520b6 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrTypes.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrTypes.php @@ -6,7 +6,8 @@ class HTMLPurifier_AttrTypes { /** - * Lookup array of attribute string identifiers to concrete implementations + * Lookup array of attribute string identifiers to concrete implementations. + * @type HTMLPurifier_AttrDef[] */ protected $info = array(); @@ -14,7 +15,8 @@ class HTMLPurifier_AttrTypes * Constructs the info array, supplying default implementations for attribute * types. */ - public function __construct() { + public function __construct() + { // XXX This is kind of poor, since we don't actually /clone/ // instances; instead, we use the supplied make() attribute. So, // the underlying class must know how to deal with arguments. @@ -54,36 +56,39 @@ class HTMLPurifier_AttrTypes $this->info['Number'] = new HTMLPurifier_AttrDef_Integer(false, false, true); } - private static function makeEnum($in) { + private static function makeEnum($in) + { return new HTMLPurifier_AttrDef_Clone(new HTMLPurifier_AttrDef_Enum(explode(',', $in))); } /** * Retrieves a type - * @param $type String type name - * @return Object AttrDef for type + * @param string $type String type name + * @return HTMLPurifier_AttrDef Object AttrDef for type */ - public function get($type) { - + public function get($type) + { // determine if there is any extra info tacked on - if (strpos($type, '#') !== false) list($type, $string) = explode('#', $type, 2); - else $string = ''; + if (strpos($type, '#') !== false) { + list($type, $string) = explode('#', $type, 2); + } else { + $string = ''; + } if (!isset($this->info[$type])) { trigger_error('Cannot retrieve undefined attribute type ' . $type, E_USER_ERROR); return; } - return $this->info[$type]->make($string); - } /** * Sets a new implementation for a type - * @param $type String type name - * @param $impl Object AttrDef for type + * @param string $type String type name + * @param HTMLPurifier_AttrDef $impl Object AttrDef for type */ - public function set($type, $impl) { + public function set($type, $impl) + { $this->info[$type] = $impl; } } diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrValidator.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrValidator.php similarity index 74% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrValidator.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrValidator.php index 829a0f8f2..f97dc93ed 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/AttrValidator.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/AttrValidator.php @@ -9,17 +9,14 @@ class HTMLPurifier_AttrValidator { /** - * Validates the attributes of a token, returning a modified token + * Validates the attributes of a token, mutating it as necessary. * that has valid tokens - * @param $token Reference to token to validate. We require a reference - * because the operation this class performs on the token are - * not atomic, so the context CurrentToken to be updated - * throughout - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context + * @param HTMLPurifier_Token $token Token to validate. + * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config + * @param HTMLPurifier_Context $context Instance of HTMLPurifier_Context */ - public function validateToken(&$token, &$config, $context) { - + public function validateToken($token, $config, $context) + { $definition = $config->getHTMLDefinition(); $e =& $context->get('ErrorCollector', true); @@ -32,12 +29,15 @@ class HTMLPurifier_AttrValidator // initialize CurrentToken if necessary $current_token =& $context->get('CurrentToken', true); - if (!$current_token) $context->register('CurrentToken', $token); + if (!$current_token) { + $context->register('CurrentToken', $token); + } - if ( - !$token instanceof HTMLPurifier_Token_Start && + if (!$token instanceof HTMLPurifier_Token_Start && !$token instanceof HTMLPurifier_Token_Empty - ) return $token; + ) { + return; + } // create alias to global definition array, see also $defs // DEFINITION CALL @@ -51,7 +51,9 @@ class HTMLPurifier_AttrValidator foreach ($definition->info_attr_transform_pre as $transform) { $attr = $transform->transform($o = $attr, $config, $context); if ($e) { - if ($attr != $o) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + if ($attr != $o) { + $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + } } } @@ -60,7 +62,9 @@ class HTMLPurifier_AttrValidator foreach ($definition->info[$token->name]->attr_transform_pre as $transform) { $attr = $transform->transform($o = $attr, $config, $context); if ($e) { - if ($attr != $o) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + if ($attr != $o) { + $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + } } } @@ -77,7 +81,7 @@ class HTMLPurifier_AttrValidator foreach ($attr as $attr_key => $value) { // call the definition - if ( isset($defs[$attr_key]) ) { + if (isset($defs[$attr_key])) { // there is a local definition defined if ($defs[$attr_key] === false) { // We've explicitly been told not to allow this element. @@ -89,15 +93,19 @@ class HTMLPurifier_AttrValidator } else { // validate according to the element's definition $result = $defs[$attr_key]->validate( - $value, $config, $context - ); + $value, + $config, + $context + ); } - } elseif ( isset($d_defs[$attr_key]) ) { + } elseif (isset($d_defs[$attr_key])) { // there is a global definition defined, validate according // to the global definition $result = $d_defs[$attr_key]->validate( - $value, $config, $context - ); + $value, + $config, + $context + ); } else { // system never heard of the attribute? DELETE! $result = false; @@ -107,7 +115,9 @@ class HTMLPurifier_AttrValidator if ($result === false || $result === null) { // this is a generic error message that should replaced // with more specific ones when possible - if ($e) $e->send(E_ERROR, 'AttrValidator: Attribute removed'); + if ($e) { + $e->send(E_ERROR, 'AttrValidator: Attribute removed'); + } // remove the attribute unset($attr[$attr_key]); @@ -137,7 +147,9 @@ class HTMLPurifier_AttrValidator foreach ($definition->info_attr_transform_post as $transform) { $attr = $transform->transform($o = $attr, $config, $context); if ($e) { - if ($attr != $o) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + if ($attr != $o) { + $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + } } } @@ -145,14 +157,18 @@ class HTMLPurifier_AttrValidator foreach ($definition->info[$token->name]->attr_transform_post as $transform) { $attr = $transform->transform($o = $attr, $config, $context); if ($e) { - if ($attr != $o) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + if ($attr != $o) { + $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + } } } $token->attr = $attr; // destroy CurrentToken if we made it ourselves - if (!$current_token) $context->destroy('CurrentToken'); + if (!$current_token) { + $context->destroy('CurrentToken'); + } } diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Bootstrap.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Bootstrap.php similarity index 77% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Bootstrap.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Bootstrap.php index ae5033203..707122bb2 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Bootstrap.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Bootstrap.php @@ -32,11 +32,15 @@ class HTMLPurifier_Bootstrap /** * Autoload function for HTML Purifier - * @param $class Class to load + * @param string $class Class to load + * @return bool */ - public static function autoload($class) { + public static function autoload($class) + { $file = HTMLPurifier_Bootstrap::getPath($class); - if (!$file) return false; + if (!$file) { + return false; + } // Technically speaking, it should be ok and more efficient to // just do 'require', but Antonio Parraga reports that with // Zend extensions such as Zend debugger and APC, this invariant @@ -48,9 +52,14 @@ class HTMLPurifier_Bootstrap /** * Returns the path for a specific class. + * @param string $class Class path to get + * @return string */ - public static function getPath($class) { - if (strncmp('HTMLPurifier', $class, 12) !== 0) return false; + public static function getPath($class) + { + if (strncmp('HTMLPurifier', $class, 12) !== 0) { + return false; + } // Custom implementations if (strncmp('HTMLPurifier_Language_', $class, 22) === 0) { $code = str_replace('_', '-', substr($class, 22)); @@ -58,16 +67,19 @@ class HTMLPurifier_Bootstrap } else { $file = str_replace('_', '/', $class) . '.php'; } - if (!file_exists(HTMLPURIFIER_PREFIX . '/' . $file)) return false; + if (!file_exists(HTMLPURIFIER_PREFIX . '/' . $file)) { + return false; + } return $file; } /** * "Pre-registers" our autoloader on the SPL stack. */ - public static function registerAutoload() { + public static function registerAutoload() + { $autoload = array('HTMLPurifier_Bootstrap', 'autoload'); - if ( ($funcs = spl_autoload_functions()) === false ) { + if (($funcs = spl_autoload_functions()) === false) { spl_autoload_register($autoload); } elseif (function_exists('spl_autoload_unregister')) { if (version_compare(PHP_VERSION, '5.3.0', '>=')) { @@ -83,27 +95,30 @@ class HTMLPurifier_Bootstrap // places where we need to error out $reflector = new ReflectionMethod($func[0], $func[1]); if (!$reflector->isStatic()) { - throw new Exception(' - HTML Purifier autoloader registrar is not compatible + throw new Exception( + 'HTML Purifier autoloader registrar is not compatible with non-static object methods due to PHP Bug #44144; Please do not use HTMLPurifier.autoload.php (or any file that includes this file); instead, place the code: spl_autoload_register(array(\'HTMLPurifier_Bootstrap\', \'autoload\')) - after your own autoloaders. - '); + after your own autoloaders.' + ); } // Suprisingly, spl_autoload_register supports the // Class::staticMethod callback format, although call_user_func doesn't - if ($compat) $func = implode('::', $func); + if ($compat) { + $func = implode('::', $func); + } } spl_autoload_unregister($func); } spl_autoload_register($autoload); - foreach ($funcs as $func) spl_autoload_register($func); + foreach ($funcs as $func) { + spl_autoload_register($func); + } } } } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/CSSDefinition.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/CSSDefinition.php new file mode 100644 index 000000000..0acdee2d9 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/CSSDefinition.php @@ -0,0 +1,474 @@ +info['text-align'] = new HTMLPurifier_AttrDef_Enum( + array('left', 'right', 'center', 'justify'), + false + ); + + $border_style = + $this->info['border-bottom-style'] = + $this->info['border-right-style'] = + $this->info['border-left-style'] = + $this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum( + array( + 'none', + 'hidden', + 'dotted', + 'dashed', + 'solid', + 'double', + 'groove', + 'ridge', + 'inset', + 'outset' + ), + false + ); + + $this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style); + + $this->info['clear'] = new HTMLPurifier_AttrDef_Enum( + array('none', 'left', 'right', 'both'), + false + ); + $this->info['float'] = new HTMLPurifier_AttrDef_Enum( + array('none', 'left', 'right'), + false + ); + $this->info['font-style'] = new HTMLPurifier_AttrDef_Enum( + array('normal', 'italic', 'oblique'), + false + ); + $this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum( + array('normal', 'small-caps'), + false + ); + + $uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_Enum(array('none')), + new HTMLPurifier_AttrDef_CSS_URI() + ) + ); + + $this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum( + array('inside', 'outside'), + false + ); + $this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum( + array( + 'disc', + 'circle', + 'square', + 'decimal', + 'lower-roman', + 'upper-roman', + 'lower-alpha', + 'upper-alpha', + 'none' + ), + false + ); + $this->info['list-style-image'] = $uri_or_none; + + $this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config); + + $this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum( + array('capitalize', 'uppercase', 'lowercase', 'none'), + false + ); + $this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color(); + + $this->info['background-image'] = $uri_or_none; + $this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum( + array('repeat', 'repeat-x', 'repeat-y', 'no-repeat') + ); + $this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum( + array('scroll', 'fixed') + ); + $this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition(); + + $border_color = + $this->info['border-top-color'] = + $this->info['border-bottom-color'] = + $this->info['border-left-color'] = + $this->info['border-right-color'] = + $this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_Enum(array('transparent')), + new HTMLPurifier_AttrDef_CSS_Color() + ) + ); + + $this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config); + + $this->info['border-color'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_color); + + $border_width = + $this->info['border-top-width'] = + $this->info['border-bottom-width'] = + $this->info['border-left-width'] = + $this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_Enum(array('thin', 'medium', 'thick')), + new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative + ) + ); + + $this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width); + + $this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_Enum(array('normal')), + new HTMLPurifier_AttrDef_CSS_Length() + ) + ); + + $this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_Enum(array('normal')), + new HTMLPurifier_AttrDef_CSS_Length() + ) + ); + + $this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_Enum( + array( + 'xx-small', + 'x-small', + 'small', + 'medium', + 'large', + 'x-large', + 'xx-large', + 'larger', + 'smaller' + ) + ), + new HTMLPurifier_AttrDef_CSS_Percentage(), + new HTMLPurifier_AttrDef_CSS_Length() + ) + ); + + $this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_Enum(array('normal')), + new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives + new HTMLPurifier_AttrDef_CSS_Length('0'), + new HTMLPurifier_AttrDef_CSS_Percentage(true) + ) + ); + + $margin = + $this->info['margin-top'] = + $this->info['margin-bottom'] = + $this->info['margin-left'] = + $this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_CSS_Length(), + new HTMLPurifier_AttrDef_CSS_Percentage(), + new HTMLPurifier_AttrDef_Enum(array('auto')) + ) + ); + + $this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin); + + // non-negative + $padding = + $this->info['padding-top'] = + $this->info['padding-bottom'] = + $this->info['padding-left'] = + $this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_CSS_Length('0'), + new HTMLPurifier_AttrDef_CSS_Percentage(true) + ) + ); + + $this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding); + + $this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_CSS_Length(), + new HTMLPurifier_AttrDef_CSS_Percentage() + ) + ); + + $trusted_wh = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_CSS_Length('0'), + new HTMLPurifier_AttrDef_CSS_Percentage(true), + new HTMLPurifier_AttrDef_Enum(array('auto')) + ) + ); + $max = $config->get('CSS.MaxImgLength'); + + $this->info['width'] = + $this->info['height'] = + $max === null ? + $trusted_wh : + new HTMLPurifier_AttrDef_Switch( + 'img', + // For img tags: + new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_CSS_Length('0', $max), + new HTMLPurifier_AttrDef_Enum(array('auto')) + ) + ), + // For everyone else: + $trusted_wh + ); + + $this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration(); + + $this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily(); + + // this could use specialized code + $this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum( + array( + 'normal', + 'bold', + 'bolder', + 'lighter', + '100', + '200', + '300', + '400', + '500', + '600', + '700', + '800', + '900' + ), + false + ); + + // MUST be called after other font properties, as it references + // a CSSDefinition object + $this->info['font'] = new HTMLPurifier_AttrDef_CSS_Font($config); + + // same here + $this->info['border'] = + $this->info['border-bottom'] = + $this->info['border-top'] = + $this->info['border-left'] = + $this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config); + + $this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum( + array('collapse', 'separate') + ); + + $this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum( + array('top', 'bottom') + ); + + $this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum( + array('auto', 'fixed') + ); + + $this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_Enum( + array( + 'baseline', + 'sub', + 'super', + 'top', + 'text-top', + 'middle', + 'bottom', + 'text-bottom' + ) + ), + new HTMLPurifier_AttrDef_CSS_Length(), + new HTMLPurifier_AttrDef_CSS_Percentage() + ) + ); + + $this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2); + + // These CSS properties don't work on many browsers, but we live + // in THE FUTURE! + $this->info['white-space'] = new HTMLPurifier_AttrDef_Enum( + array('nowrap', 'normal', 'pre', 'pre-wrap', 'pre-line') + ); + + if ($config->get('CSS.Proprietary')) { + $this->doSetupProprietary($config); + } + + if ($config->get('CSS.AllowTricky')) { + $this->doSetupTricky($config); + } + + if ($config->get('CSS.Trusted')) { + $this->doSetupTrusted($config); + } + + $allow_important = $config->get('CSS.AllowImportant'); + // wrap all attr-defs with decorator that handles !important + foreach ($this->info as $k => $v) { + $this->info[$k] = new HTMLPurifier_AttrDef_CSS_ImportantDecorator($v, $allow_important); + } + + $this->setupConfigStuff($config); + } + + /** + * @param HTMLPurifier_Config $config + */ + protected function doSetupProprietary($config) + { + // Internet Explorer only scrollbar colors + $this->info['scrollbar-arrow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-base-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-darkshadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-face-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-highlight-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-shadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + + // technically not proprietary, but CSS3, and no one supports it + $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); + $this->info['-moz-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); + $this->info['-khtml-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); + + // only opacity, for now + $this->info['filter'] = new HTMLPurifier_AttrDef_CSS_Filter(); + + // more CSS3 + $this->info['page-break-after'] = + $this->info['page-break-before'] = new HTMLPurifier_AttrDef_Enum( + array( + 'auto', + 'always', + 'avoid', + 'left', + 'right' + ) + ); + $this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(array('auto', 'avoid')); + + } + + /** + * @param HTMLPurifier_Config $config + */ + protected function doSetupTricky($config) + { + $this->info['display'] = new HTMLPurifier_AttrDef_Enum( + array( + 'inline', + 'block', + 'list-item', + 'run-in', + 'compact', + 'marker', + 'table', + 'inline-block', + 'inline-table', + 'table-row-group', + 'table-header-group', + 'table-footer-group', + 'table-row', + 'table-column-group', + 'table-column', + 'table-cell', + 'table-caption', + 'none' + ) + ); + $this->info['visibility'] = new HTMLPurifier_AttrDef_Enum( + array('visible', 'hidden', 'collapse') + ); + $this->info['overflow'] = new HTMLPurifier_AttrDef_Enum(array('visible', 'hidden', 'auto', 'scroll')); + } + + /** + * @param HTMLPurifier_Config $config + */ + protected function doSetupTrusted($config) + { + $this->info['position'] = new HTMLPurifier_AttrDef_Enum( + array('static', 'relative', 'absolute', 'fixed') + ); + $this->info['top'] = + $this->info['left'] = + $this->info['right'] = + $this->info['bottom'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_CSS_Length(), + new HTMLPurifier_AttrDef_CSS_Percentage(), + new HTMLPurifier_AttrDef_Enum(array('auto')), + ) + ); + $this->info['z-index'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_Integer(), + new HTMLPurifier_AttrDef_Enum(array('auto')), + ) + ); + } + + /** + * Performs extra config-based processing. Based off of + * HTMLPurifier_HTMLDefinition. + * @param HTMLPurifier_Config $config + * @todo Refactor duplicate elements into common class (probably using + * composition, not inheritance). + */ + protected function setupConfigStuff($config) + { + // setup allowed elements + $support = "(for information on implementing this, see the " . + "support forums) "; + $allowed_properties = $config->get('CSS.AllowedProperties'); + if ($allowed_properties !== null) { + foreach ($this->info as $name => $d) { + if (!isset($allowed_properties[$name])) { + unset($this->info[$name]); + } + unset($allowed_properties[$name]); + } + // emit errors + foreach ($allowed_properties as $name => $d) { + // :TODO: Is this htmlspecialchars() call really necessary? + $name = htmlspecialchars($name); + trigger_error("Style attribute '$name' is not supported $support", E_USER_WARNING); + } + } + + $forbidden_properties = $config->get('CSS.ForbiddenProperties'); + if ($forbidden_properties !== null) { + foreach ($this->info as $name => $d) { + if (isset($forbidden_properties[$name])) { + unset($this->info[$name]); + } + } + } + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef.php similarity index 52% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef.php index c5d5216da..8eb17b82e 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef.php @@ -1,48 +1,52 @@ elements; } /** * Validates nodes according to definition and returns modification. * - * @param $tokens_of_children Array of HTMLPurifier_Token - * @param $config HTMLPurifier_Config object - * @param $context HTMLPurifier_Context object - * @return bool true to leave nodes as is - * @return bool false to remove parent node - * @return array of replacement child tokens + * @param HTMLPurifier_Node[] $children Array of HTMLPurifier_Node + * @param HTMLPurifier_Config $config HTMLPurifier_Config object + * @param HTMLPurifier_Context $context HTMLPurifier_Context object + * @return bool|array true to leave nodes as is, false to remove parent node, array of replacement children */ - abstract public function validateChildren($tokens_of_children, $config, $context); + abstract public function validateChildren($children, $config, $context); } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Chameleon.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Chameleon.php similarity index 57% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Chameleon.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Chameleon.php index 15c364ee3..7439be26b 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Chameleon.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Chameleon.php @@ -14,33 +14,52 @@ class HTMLPurifier_ChildDef_Chameleon extends HTMLPurifier_ChildDef /** * Instance of the definition object to use when inline. Usually stricter. + * @type HTMLPurifier_ChildDef_Optional */ public $inline; /** * Instance of the definition object to use when block. + * @type HTMLPurifier_ChildDef_Optional */ public $block; + /** + * @type string + */ public $type = 'chameleon'; /** - * @param $inline List of elements to allow when inline. - * @param $block List of elements to allow when block. + * @param array $inline List of elements to allow when inline. + * @param array $block List of elements to allow when block. */ - public function __construct($inline, $block) { + public function __construct($inline, $block) + { $this->inline = new HTMLPurifier_ChildDef_Optional($inline); - $this->block = new HTMLPurifier_ChildDef_Optional($block); + $this->block = new HTMLPurifier_ChildDef_Optional($block); $this->elements = $this->block->elements; } - public function validateChildren($tokens_of_children, $config, $context) { + /** + * @param HTMLPurifier_Node[] $children + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function validateChildren($children, $config, $context) + { if ($context->get('IsInline') === false) { return $this->block->validateChildren( - $tokens_of_children, $config, $context); + $children, + $config, + $context + ); } else { return $this->inline->validateChildren( - $tokens_of_children, $config, $context); + $children, + $config, + $context + ); } } } diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Custom.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Custom.php similarity index 71% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Custom.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Custom.php index b68047b4b..128132e96 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Custom.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Custom.php @@ -8,28 +8,42 @@ */ class HTMLPurifier_ChildDef_Custom extends HTMLPurifier_ChildDef { - public $type = 'custom'; - public $allow_empty = false; /** - * Allowed child pattern as defined by the DTD + * @type string + */ + public $type = 'custom'; + + /** + * @type bool + */ + public $allow_empty = false; + + /** + * Allowed child pattern as defined by the DTD. + * @type string */ public $dtd_regex; + /** - * PCRE regex derived from $dtd_regex - * @private + * PCRE regex derived from $dtd_regex. + * @type string */ private $_pcre_regex; + /** * @param $dtd_regex Allowed child pattern from the DTD */ - public function __construct($dtd_regex) { + public function __construct($dtd_regex) + { $this->dtd_regex = $dtd_regex; $this->_compileRegex(); } + /** * Compiles the PCRE regex from a DTD regex ($dtd_regex to $_pcre_regex) */ - protected function _compileRegex() { + protected function _compileRegex() + { $raw = str_replace(' ', '', $this->dtd_regex); if ($raw{0} != '(') { $raw = "($raw)"; @@ -57,33 +71,31 @@ class HTMLPurifier_ChildDef_Custom extends HTMLPurifier_ChildDef $this->_pcre_regex = $reg; } - public function validateChildren($tokens_of_children, $config, $context) { + + /** + * @param HTMLPurifier_Node[] $children + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function validateChildren($children, $config, $context) + { $list_of_children = ''; $nesting = 0; // depth into the nest - foreach ($tokens_of_children as $token) { - if (!empty($token->is_whitespace)) continue; - - $is_child = ($nesting == 0); // direct - - if ($token instanceof HTMLPurifier_Token_Start) { - $nesting++; - } elseif ($token instanceof HTMLPurifier_Token_End) { - $nesting--; - } - - if ($is_child) { - $list_of_children .= $token->name . ','; + foreach ($children as $node) { + if (!empty($node->is_whitespace)) { + continue; } + $list_of_children .= $node->name . ','; } // add leading comma to deal with stray comma declarations $list_of_children = ',' . rtrim($list_of_children, ','); $okay = preg_match( - '/^,?'.$this->_pcre_regex.'$/', + '/^,?' . $this->_pcre_regex . '$/', $list_of_children ); - - return (bool) $okay; + return (bool)$okay; } } diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Empty.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Empty.php similarity index 58% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Empty.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Empty.php index 13171f665..a8a6cbdd2 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ChildDef/Empty.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Empty.php @@ -9,10 +9,28 @@ */ class HTMLPurifier_ChildDef_Empty extends HTMLPurifier_ChildDef { + /** + * @type bool + */ public $allow_empty = true; + + /** + * @type string + */ public $type = 'empty'; - public function __construct() {} - public function validateChildren($tokens_of_children, $config, $context) { + + public function __construct() + { + } + + /** + * @param HTMLPurifier_Node[] $children + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function validateChildren($children, $config, $context) + { return array(); } } diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/List.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/List.php new file mode 100644 index 000000000..891b9f6f5 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/List.php @@ -0,0 +1,86 @@ + true, 'ul' => true, 'ol' => true); + + /** + * @param array $children + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function validateChildren($children, $config, $context) + { + // Flag for subclasses + $this->whitespace = false; + + // if there are no tokens, delete parent node + if (empty($children)) { + return false; + } + + // the new set of children + $result = array(); + + // a little sanity check to make sure it's not ALL whitespace + $all_whitespace = true; + + $current_li = false; + + foreach ($children as $node) { + if (!empty($node->is_whitespace)) { + $result[] = $node; + continue; + } + $all_whitespace = false; // phew, we're not talking about whitespace + + if ($node->name === 'li') { + // good + $current_li = $node; + $result[] = $node; + } else { + // we want to tuck this into the previous li + // Invariant: we expect the node to be ol/ul + // ToDo: Make this more robust in the case of not ol/ul + // by distinguishing between existing li and li created + // to handle non-list elements; non-list elements should + // not be appended to an existing li; only li created + // for non-list. This distinction is not currently made. + if ($current_li === false) { + $current_li = new HTMLPurifier_Node_Element('li'); + $result[] = $current_li; + } + $current_li->children[] = $node; + $current_li->empty = false; // XXX fascinating! Check for this error elsewhere ToDo + } + } + if (empty($result)) { + return false; + } + if ($all_whitespace) { + return false; + } + return $result; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Optional.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Optional.php new file mode 100644 index 000000000..b9468063b --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Optional.php @@ -0,0 +1,45 @@ +whitespace) { + return $children; + } else { + return array(); + } + } + return $result; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Required.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Required.php new file mode 100644 index 000000000..0d1c8f5f3 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Required.php @@ -0,0 +1,118 @@ + $x) { + $elements[$i] = true; + if (empty($i)) { + unset($elements[$i]); + } // remove blank + } + } + $this->elements = $elements; + } + + /** + * @type bool + */ + public $allow_empty = false; + + /** + * @type string + */ + public $type = 'required'; + + /** + * @param array $children + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function validateChildren($children, $config, $context) + { + // Flag for subclasses + $this->whitespace = false; + + // if there are no tokens, delete parent node + if (empty($children)) { + return false; + } + + // the new set of children + $result = array(); + + // whether or not parsed character data is allowed + // this controls whether or not we silently drop a tag + // or generate escaped HTML from it + $pcdata_allowed = isset($this->elements['#PCDATA']); + + // a little sanity check to make sure it's not ALL whitespace + $all_whitespace = true; + + $stack = array_reverse($children); + while (!empty($stack)) { + $node = array_pop($stack); + if (!empty($node->is_whitespace)) { + $result[] = $node; + continue; + } + $all_whitespace = false; // phew, we're not talking about whitespace + + if (!isset($this->elements[$node->name])) { + // special case text + // XXX One of these ought to be redundant or something + if ($pcdata_allowed && $node instanceof HTMLPurifier_Node_Text) { + $result[] = $node; + continue; + } + // spill the child contents in + // ToDo: Make configurable + if ($node instanceof HTMLPurifier_Node_Element) { + for ($i = count($node->children) - 1; $i >= 0; $i--) { + $stack[] = $node->children[$i]; + } + continue; + } + continue; + } + $result[] = $node; + } + if (empty($result)) { + return false; + } + if ($all_whitespace) { + $this->whitespace = true; + return false; + } + return $result; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/StrictBlockquote.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/StrictBlockquote.php new file mode 100644 index 000000000..3270a46e1 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/StrictBlockquote.php @@ -0,0 +1,110 @@ +init($config); + return $this->fake_elements; + } + + /** + * @param array $children + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function validateChildren($children, $config, $context) + { + $this->init($config); + + // trick the parent class into thinking it allows more + $this->elements = $this->fake_elements; + $result = parent::validateChildren($children, $config, $context); + $this->elements = $this->real_elements; + + if ($result === false) { + return array(); + } + if ($result === true) { + $result = $children; + } + + $def = $config->getHTMLDefinition(); + $block_wrap_name = $def->info_block_wrapper; + $block_wrap = false; + $ret = array(); + + foreach ($result as $node) { + if ($block_wrap === false) { + if (($node instanceof HTMLPurifier_Node_Text && !$node->is_whitespace) || + ($node instanceof HTMLPurifier_Node_Element && !isset($this->elements[$node->name]))) { + $block_wrap = new HTMLPurifier_Node_Element($def->info_block_wrapper); + $ret[] = $block_wrap; + } + } else { + if ($node instanceof HTMLPurifier_Node_Element && isset($this->elements[$node->name])) { + $block_wrap = false; + + } + } + if ($block_wrap) { + $block_wrap->children[] = $node; + } else { + $ret[] = $node; + } + } + return $ret; + } + + /** + * @param HTMLPurifier_Config $config + */ + private function init($config) + { + if (!$this->init) { + $def = $config->getHTMLDefinition(); + // allow all inline elements + $this->real_elements = $this->elements; + $this->fake_elements = $def->info_content_sets['Flow']; + $this->fake_elements['#PCDATA'] = true; + $this->init = true; + } + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Table.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Table.php new file mode 100644 index 000000000..3e4a0f218 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ChildDef/Table.php @@ -0,0 +1,224 @@ + true, + 'tbody' => true, + 'thead' => true, + 'tfoot' => true, + 'caption' => true, + 'colgroup' => true, + 'col' => true + ); + + public function __construct() + { + } + + /** + * @param array $children + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function validateChildren($children, $config, $context) + { + if (empty($children)) { + return false; + } + + // only one of these elements is allowed in a table + $caption = false; + $thead = false; + $tfoot = false; + + // whitespace + $initial_ws = array(); + $after_caption_ws = array(); + $after_thead_ws = array(); + $after_tfoot_ws = array(); + + // as many of these as you want + $cols = array(); + $content = array(); + + $tbody_mode = false; // if true, then we need to wrap any stray + // s with a . + + $ws_accum =& $initial_ws; + + foreach ($children as $node) { + if ($node instanceof HTMLPurifier_Node_Comment) { + $ws_accum[] = $node; + continue; + } + switch ($node->name) { + case 'tbody': + $tbody_mode = true; + // fall through + case 'tr': + $content[] = $node; + $ws_accum =& $content; + break; + case 'caption': + // there can only be one caption! + if ($caption !== false) break; + $caption = $node; + $ws_accum =& $after_caption_ws; + break; + case 'thead': + $tbody_mode = true; + // XXX This breaks rendering properties with + // Firefox, which never floats a to + // the top. Ever. (Our scheme will float the + // first to the top.) So maybe + // s that are not first should be + // turned into ? Very tricky, indeed. + if ($thead === false) { + $thead = $node; + $ws_accum =& $after_thead_ws; + } else { + // Oops, there's a second one! What + // should we do? Current behavior is to + // transmutate the first and last entries into + // tbody tags, and then put into content. + // Maybe a better idea is to *attach + // it* to the existing thead or tfoot? + // We don't do this, because Firefox + // doesn't float an extra tfoot to the + // bottom like it does for the first one. + $node->name = 'tbody'; + $content[] = $node; + $ws_accum =& $content; + } + break; + case 'tfoot': + // see above for some aveats + $tbody_mode = true; + if ($tfoot === false) { + $tfoot = $node; + $ws_accum =& $after_tfoot_ws; + } else { + $node->name = 'tbody'; + $content[] = $node; + $ws_accum =& $content; + } + break; + case 'colgroup': + case 'col': + $cols[] = $node; + $ws_accum =& $cols; + break; + case '#PCDATA': + // How is whitespace handled? We treat is as sticky to + // the *end* of the previous element. So all of the + // nonsense we have worked on is to keep things + // together. + if (!empty($node->is_whitespace)) { + $ws_accum[] = $node; + } + break; + } + } + + if (empty($content)) { + return false; + } + + $ret = $initial_ws; + if ($caption !== false) { + $ret[] = $caption; + $ret = array_merge($ret, $after_caption_ws); + } + if ($cols !== false) { + $ret = array_merge($ret, $cols); + } + if ($thead !== false) { + $ret[] = $thead; + $ret = array_merge($ret, $after_thead_ws); + } + if ($tfoot !== false) { + $ret[] = $tfoot; + $ret = array_merge($ret, $after_tfoot_ws); + } + + if ($tbody_mode) { + // we have to shuffle tr into tbody + $current_tr_tbody = null; + + foreach($content as $node) { + switch ($node->name) { + case 'tbody': + $current_tr_tbody = null; + $ret[] = $node; + break; + case 'tr': + if ($current_tr_tbody === null) { + $current_tr_tbody = new HTMLPurifier_Node_Element('tbody'); + $ret[] = $current_tr_tbody; + } + $current_tr_tbody->children[] = $node; + break; + case '#PCDATA': + assert($node->is_whitespace); + if ($current_tr_tbody === null) { + $ret[] = $node; + } else { + $current_tr_tbody->children[] = $node; + } + break; + } + } + } else { + $ret = array_merge($ret, $content); + } + + return $ret; + + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Config.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Config.php similarity index 61% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Config.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Config.php index 489ea0464..7ada59b94 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Config.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Config.php @@ -19,78 +19,92 @@ class HTMLPurifier_Config /** * HTML Purifier's version + * @type string */ - public $version = '4.5.0'; + public $version = '4.6.0'; /** - * Bool indicator whether or not to automatically finalize - * the object if a read operation is done + * Whether or not to automatically finalize + * the object if a read operation is done. + * @type bool */ public $autoFinalize = true; // protected member variables /** - * Namespace indexed array of serials for specific namespaces (see - * getSerial() for more info). + * Namespace indexed array of serials for specific namespaces. + * @see getSerial() for more info. + * @type string[] */ protected $serials = array(); /** - * Serial for entire configuration object + * Serial for entire configuration object. + * @type string */ protected $serial; /** - * Parser for variables + * Parser for variables. + * @type HTMLPurifier_VarParser_Flexible */ protected $parser = null; /** - * Reference HTMLPurifier_ConfigSchema for value checking + * Reference HTMLPurifier_ConfigSchema for value checking. + * @type HTMLPurifier_ConfigSchema * @note This is public for introspective purposes. Please don't * abuse! */ public $def; /** - * Indexed array of definitions + * Indexed array of definitions. + * @type HTMLPurifier_Definition[] */ protected $definitions; /** - * Bool indicator whether or not config is finalized + * Whether or not config is finalized. + * @type bool */ protected $finalized = false; /** * Property list containing configuration directives. + * @type array */ protected $plist; /** - * Whether or not a set is taking place due to an - * alias lookup. + * Whether or not a set is taking place due to an alias lookup. + * @type bool */ private $aliasMode; /** - * Set to false if you do not want line and file numbers in errors + * Set to false if you do not want line and file numbers in errors. * (useful when unit testing). This will also compress some errors * and exceptions. + * @type bool */ public $chatty = true; /** * Current lock; only gets to this namespace are allowed. + * @type string */ private $lock; /** - * @param $definition HTMLPurifier_ConfigSchema that defines what directives - * are allowed. + * Constructor + * @param HTMLPurifier_ConfigSchema $definition ConfigSchema that defines + * what directives are allowed. + * @param HTMLPurifier_PropertyList $parent */ - public function __construct($definition, $parent = null) { + public function __construct($definition, $parent = null) + { $parent = $parent ? $parent : $definition->defaultPlist; $this->plist = new HTMLPurifier_PropertyList($parent); $this->def = $definition; // keep a copy around for checking @@ -103,10 +117,11 @@ class HTMLPurifier_Config * object. Can be: a HTMLPurifier_Config() object, * an array of directives based on loadArray(), * or a string filename of an ini file. - * @param HTMLPurifier_ConfigSchema Schema object - * @return Configured HTMLPurifier_Config object + * @param HTMLPurifier_ConfigSchema $schema Schema object + * @return HTMLPurifier_Config Configured object */ - public static function create($config, $schema = null) { + public static function create($config, $schema = null) + { if ($config instanceof HTMLPurifier_Config) { // pass-through return $config; @@ -116,57 +131,79 @@ class HTMLPurifier_Config } else { $ret = new HTMLPurifier_Config($schema); } - if (is_string($config)) $ret->loadIni($config); - elseif (is_array($config)) $ret->loadArray($config); + if (is_string($config)) { + $ret->loadIni($config); + } elseif (is_array($config)) $ret->loadArray($config); return $ret; } /** * Creates a new config object that inherits from a previous one. - * @param HTMLPurifier_Config $config Configuration object to inherit - * from. + * @param HTMLPurifier_Config $config Configuration object to inherit from. * @return HTMLPurifier_Config object with $config as its parent. */ - public static function inherit(HTMLPurifier_Config $config) { + public static function inherit(HTMLPurifier_Config $config) + { return new HTMLPurifier_Config($config->def, $config->plist); } /** * Convenience constructor that creates a default configuration object. - * @return Default HTMLPurifier_Config object. + * @return HTMLPurifier_Config default object. */ - public static function createDefault() { + public static function createDefault() + { $definition = HTMLPurifier_ConfigSchema::instance(); $config = new HTMLPurifier_Config($definition); return $config; } /** - * Retreives a value from the configuration. - * @param $key String key + * Retrieves a value from the configuration. + * + * @param string $key String key + * @param mixed $a + * + * @return mixed */ - public function get($key, $a = null) { + public function get($key, $a = null) + { if ($a !== null) { - $this->triggerError("Using deprecated API: use \$config->get('$key.$a') instead", E_USER_WARNING); + $this->triggerError( + "Using deprecated API: use \$config->get('$key.$a') instead", + E_USER_WARNING + ); $key = "$key.$a"; } - if (!$this->finalized) $this->autoFinalize(); + if (!$this->finalized) { + $this->autoFinalize(); + } if (!isset($this->def->info[$key])) { // can't add % due to SimpleTest bug - $this->triggerError('Cannot retrieve value of undefined directive ' . htmlspecialchars($key), - E_USER_WARNING); + $this->triggerError( + 'Cannot retrieve value of undefined directive ' . htmlspecialchars($key), + E_USER_WARNING + ); return; } if (isset($this->def->info[$key]->isAlias)) { $d = $this->def->info[$key]; - $this->triggerError('Cannot get value from aliased directive, use real name ' . $d->key, - E_USER_ERROR); + $this->triggerError( + 'Cannot get value from aliased directive, use real name ' . $d->key, + E_USER_ERROR + ); return; } if ($this->lock) { list($ns) = explode('.', $key); if ($ns !== $this->lock) { - $this->triggerError('Cannot get value of namespace ' . $ns . ' when lock for ' . $this->lock . ' is active, this probably indicates a Definition setup method is accessing directives that are not within its namespace', E_USER_ERROR); + $this->triggerError( + 'Cannot get value of namespace ' . $ns . ' when lock for ' . + $this->lock . + ' is active, this probably indicates a Definition setup method ' . + 'is accessing directives that are not within its namespace', + E_USER_ERROR + ); return; } } @@ -174,15 +211,24 @@ class HTMLPurifier_Config } /** - * Retreives an array of directives to values from a given namespace - * @param $namespace String namespace + * Retrieves an array of directives to values from a given namespace + * + * @param string $namespace String namespace + * + * @return array */ - public function getBatch($namespace) { - if (!$this->finalized) $this->autoFinalize(); + public function getBatch($namespace) + { + if (!$this->finalized) { + $this->autoFinalize(); + } $full = $this->getAll(); if (!isset($full[$namespace])) { - $this->triggerError('Cannot retrieve undefined namespace ' . htmlspecialchars($namespace), - E_USER_WARNING); + $this->triggerError( + 'Cannot retrieve undefined namespace ' . + htmlspecialchars($namespace), + E_USER_WARNING + ); return; } return $full[$namespace]; @@ -191,11 +237,15 @@ class HTMLPurifier_Config /** * Returns a SHA-1 signature of a segment of the configuration object * that uniquely identifies that particular configuration + * + * @param string $namespace Namespace to get serial for + * + * @return string * @note Revision is handled specially and is removed from the batch * before processing! - * @param $namespace Namespace to get serial for */ - public function getBatchSerial($namespace) { + public function getBatchSerial($namespace) + { if (empty($this->serials[$namespace])) { $batch = $this->getBatch($namespace); unset($batch['DefinitionRev']); @@ -207,8 +257,11 @@ class HTMLPurifier_Config /** * Returns a SHA-1 signature for the entire configuration object * that uniquely identifies that particular configuration + * + * @return string */ - public function getSerial() { + public function getSerial() + { if (empty($this->serial)) { $this->serial = sha1(serialize($this->getAll())); } @@ -217,10 +270,14 @@ class HTMLPurifier_Config /** * Retrieves all directives, organized by namespace + * * @warning This is a pretty inefficient function, avoid if you can */ - public function getAll() { - if (!$this->finalized) $this->autoFinalize(); + public function getAll() + { + if (!$this->finalized) { + $this->autoFinalize(); + } $ret = array(); foreach ($this->plist->squash() as $name => $value) { list($ns, $key) = explode('.', $name, 2); @@ -231,10 +288,13 @@ class HTMLPurifier_Config /** * Sets a value to configuration. - * @param $key String key - * @param $value Mixed value + * + * @param string $key key + * @param mixed $value value + * @param mixed $a */ - public function set($key, $value, $a = null) { + public function set($key, $value, $a = null) + { if (strpos($key, '.') === false) { $namespace = $key; $directive = $value; @@ -244,18 +304,25 @@ class HTMLPurifier_Config } else { list($namespace) = explode('.', $key); } - if ($this->isFinalized('Cannot set directive after finalization')) return; + if ($this->isFinalized('Cannot set directive after finalization')) { + return; + } if (!isset($this->def->info[$key])) { - $this->triggerError('Cannot set undefined directive ' . htmlspecialchars($key) . ' to value', - E_USER_WARNING); + $this->triggerError( + 'Cannot set undefined directive ' . htmlspecialchars($key) . ' to value', + E_USER_WARNING + ); return; } $def = $this->def->info[$key]; if (isset($def->isAlias)) { if ($this->aliasMode) { - $this->triggerError('Double-aliases not allowed, please fix '. - 'ConfigSchema bug with' . $key, E_USER_ERROR); + $this->triggerError( + 'Double-aliases not allowed, please fix '. + 'ConfigSchema bug with' . $key, + E_USER_ERROR + ); return; } $this->aliasMode = true; @@ -279,7 +346,11 @@ class HTMLPurifier_Config try { $value = $this->parser->parse($value, $type, $allow_null); } catch (HTMLPurifier_VarParserException $e) { - $this->triggerError('Value for ' . $key . ' is of invalid type, should be ' . HTMLPurifier_VarParser::getTypeName($type), E_USER_WARNING); + $this->triggerError( + 'Value for ' . $key . ' is of invalid type, should be ' . + HTMLPurifier_VarParser::getTypeName($type), + E_USER_WARNING + ); return; } if (is_string($value) && is_object($def)) { @@ -289,8 +360,11 @@ class HTMLPurifier_Config } // check to see if the value is allowed if (isset($def->allowed) && !isset($def->allowed[$value])) { - $this->triggerError('Value not supported, valid values are: ' . - $this->_listify($def->allowed), E_USER_WARNING); + $this->triggerError( + 'Value not supported, valid values are: ' . + $this->_listify($def->allowed), + E_USER_WARNING + ); return; } } @@ -308,63 +382,83 @@ class HTMLPurifier_Config /** * Convenience function for error reporting + * + * @param array $lookup + * + * @return string */ - private function _listify($lookup) { + private function _listify($lookup) + { $list = array(); - foreach ($lookup as $name => $b) $list[] = $name; + foreach ($lookup as $name => $b) { + $list[] = $name; + } return implode(', ', $list); } /** * Retrieves object reference to the HTML definition. - * @param $raw Return a copy that has not been setup yet. Must be + * + * @param bool $raw Return a copy that has not been setup yet. Must be * called before it's been setup, otherwise won't work. - * @param $optimized If true, this method may return null, to + * @param bool $optimized If true, this method may return null, to * indicate that a cached version of the modified * definition object is available and no further edits * are necessary. Consider using * maybeGetRawHTMLDefinition, which is more explicitly * named, instead. + * + * @return HTMLPurifier_HTMLDefinition */ - public function getHTMLDefinition($raw = false, $optimized = false) { + public function getHTMLDefinition($raw = false, $optimized = false) + { return $this->getDefinition('HTML', $raw, $optimized); } /** * Retrieves object reference to the CSS definition - * @param $raw Return a copy that has not been setup yet. Must be + * + * @param bool $raw Return a copy that has not been setup yet. Must be * called before it's been setup, otherwise won't work. - * @param $optimized If true, this method may return null, to + * @param bool $optimized If true, this method may return null, to * indicate that a cached version of the modified * definition object is available and no further edits * are necessary. Consider using * maybeGetRawCSSDefinition, which is more explicitly * named, instead. + * + * @return HTMLPurifier_CSSDefinition */ - public function getCSSDefinition($raw = false, $optimized = false) { + public function getCSSDefinition($raw = false, $optimized = false) + { return $this->getDefinition('CSS', $raw, $optimized); } /** * Retrieves object reference to the URI definition - * @param $raw Return a copy that has not been setup yet. Must be + * + * @param bool $raw Return a copy that has not been setup yet. Must be * called before it's been setup, otherwise won't work. - * @param $optimized If true, this method may return null, to + * @param bool $optimized If true, this method may return null, to * indicate that a cached version of the modified * definition object is available and no further edits * are necessary. Consider using * maybeGetRawURIDefinition, which is more explicitly * named, instead. + * + * @return HTMLPurifier_URIDefinition */ - public function getURIDefinition($raw = false, $optimized = false) { + public function getURIDefinition($raw = false, $optimized = false) + { return $this->getDefinition('URI', $raw, $optimized); } /** * Retrieves a definition - * @param $type Type of definition: HTML, CSS, etc - * @param $raw Whether or not definition should be returned raw - * @param $optimized Only has an effect when $raw is true. Whether + * + * @param string $type Type of definition: HTML, CSS, etc + * @param bool $raw Whether or not definition should be returned raw + * @param bool $optimized Only has an effect when $raw is true. Whether * or not to return null if the result is already present in * the cache. This is off by default for backwards * compatibility reasons, but you need to do things this @@ -372,12 +466,18 @@ class HTMLPurifier_Config * Check out enduser-customize.html for more details. * We probably won't ever change this default, as much as the * maybe semantics is the "right thing to do." + * + * @throws HTMLPurifier_Exception + * @return HTMLPurifier_Definition */ - public function getDefinition($type, $raw = false, $optimized = false) { + public function getDefinition($type, $raw = false, $optimized = false) + { if ($optimized && !$raw) { throw new HTMLPurifier_Exception("Cannot set optimized = true when raw = false"); } - if (!$this->finalized) $this->autoFinalize(); + if (!$this->finalized) { + $this->autoFinalize(); + } // temporarily suspend locks, so we can handle recursive definition calls $lock = $this->lock; $this->lock = null; @@ -395,7 +495,9 @@ class HTMLPurifier_Config return $def; } else { $def->setup($this); - if ($def->optimized) $cache->add($def, $this); + if ($def->optimized) { + $cache->add($def, $this); + } return $def; } } @@ -424,23 +526,36 @@ class HTMLPurifier_Config if ($optimized) { if (is_null($this->get($type . '.DefinitionID'))) { // fatally error out if definition ID not set - throw new HTMLPurifier_Exception("Cannot retrieve raw version without specifying %$type.DefinitionID"); + throw new HTMLPurifier_Exception( + "Cannot retrieve raw version without specifying %$type.DefinitionID" + ); } } if (!empty($this->definitions[$type])) { $def = $this->definitions[$type]; if ($def->setup && !$optimized) { - $extra = $this->chatty ? " (try moving this code block earlier in your initialization)" : ""; - throw new HTMLPurifier_Exception("Cannot retrieve raw definition after it has already been setup" . $extra); + $extra = $this->chatty ? + " (try moving this code block earlier in your initialization)" : + ""; + throw new HTMLPurifier_Exception( + "Cannot retrieve raw definition after it has already been setup" . + $extra + ); } if ($def->optimized === null) { $extra = $this->chatty ? " (try flushing your cache)" : ""; - throw new HTMLPurifier_Exception("Optimization status of definition is unknown" . $extra); + throw new HTMLPurifier_Exception( + "Optimization status of definition is unknown" . $extra + ); } if ($def->optimized !== $optimized) { $msg = $optimized ? "optimized" : "unoptimized"; - $extra = $this->chatty ? " (this backtrace is for the first inconsistent call, which was for a $msg raw definition)" : ""; - throw new HTMLPurifier_Exception("Inconsistent use of optimized and unoptimized raw definition retrievals" . $extra); + $extra = $this->chatty ? + " (this backtrace is for the first inconsistent call, which was for a $msg raw definition)" + : ""; + throw new HTMLPurifier_Exception( + "Inconsistent use of optimized and unoptimized raw definition retrievals" . $extra + ); } } // check if definition was in memory @@ -473,9 +588,22 @@ class HTMLPurifier_Config if (!$optimized) { if (!is_null($this->get($type . '.DefinitionID'))) { if ($this->chatty) { - $this->triggerError("Due to a documentation error in previous version of HTML Purifier, your definitions are not being cached. If this is OK, you can remove the %$type.DefinitionRev and %$type.DefinitionID declaration. Otherwise, modify your code to use maybeGetRawDefinition, and test if the returned value is null before making any edits (if it is null, that means that a cached version is available, and no raw operations are necessary). See Customize for more details", E_USER_WARNING); + $this->triggerError( + 'Due to a documentation error in previous version of HTML Purifier, your ' . + 'definitions are not being cached. If this is OK, you can remove the ' . + '%$type.DefinitionRev and %$type.DefinitionID declaration. Otherwise, ' . + 'modify your code to use maybeGetRawDefinition, and test if the returned ' . + 'value is null before making any edits (if it is null, that means that a ' . + 'cached version is available, and no raw operations are necessary). See ' . + '' . + 'Customize for more details', + E_USER_WARNING + ); } else { - $this->triggerError("Useless DefinitionID declaration", E_USER_WARNING); + $this->triggerError( + "Useless DefinitionID declaration", + E_USER_WARNING + ); } } } @@ -487,7 +615,16 @@ class HTMLPurifier_Config throw new HTMLPurifier_Exception("The impossible happened!"); } - private function initDefinition($type) { + /** + * Initialise definition + * + * @param string $type What type of definition to create + * + * @return HTMLPurifier_CSSDefinition|HTMLPurifier_HTMLDefinition|HTMLPurifier_URIDefinition + * @throws HTMLPurifier_Exception + */ + private function initDefinition($type) + { // quick checks failed, let's create the object if ($type == 'HTML') { $def = new HTMLPurifier_HTMLDefinition(); @@ -496,35 +633,45 @@ class HTMLPurifier_Config } elseif ($type == 'URI') { $def = new HTMLPurifier_URIDefinition(); } else { - throw new HTMLPurifier_Exception("Definition of $type type not supported"); + throw new HTMLPurifier_Exception( + "Definition of $type type not supported" + ); } $this->definitions[$type] = $def; return $def; } - public function maybeGetRawDefinition($name) { + public function maybeGetRawDefinition($name) + { return $this->getDefinition($name, true, true); } - public function maybeGetRawHTMLDefinition() { + public function maybeGetRawHTMLDefinition() + { return $this->getDefinition('HTML', true, true); } - public function maybeGetRawCSSDefinition() { + public function maybeGetRawCSSDefinition() + { return $this->getDefinition('CSS', true, true); } - public function maybeGetRawURIDefinition() { + public function maybeGetRawURIDefinition() + { return $this->getDefinition('URI', true, true); } /** * Loads configuration values from an array with the following structure: * Namespace.Directive => Value - * @param $config_array Configuration associative array + * + * @param array $config_array Configuration associative array */ - public function loadArray($config_array) { - if ($this->isFinalized('Cannot load directives after finalization')) return; + public function loadArray($config_array) + { + if ($this->isFinalized('Cannot load directives after finalization')) { + return; + } foreach ($config_array as $key => $value) { $key = str_replace('_', '.', $key); if (strpos($key, '.') !== false) { @@ -532,8 +679,8 @@ class HTMLPurifier_Config } else { $namespace = $key; $namespace_values = $value; - foreach ($namespace_values as $directive => $value) { - $this->set($namespace .'.'. $directive, $value); + foreach ($namespace_values as $directive => $value2) { + $this->set($namespace .'.'. $directive, $value2); } } } @@ -543,40 +690,55 @@ class HTMLPurifier_Config * Returns a list of array(namespace, directive) for all directives * that are allowed in a web-form context as per an allowed * namespaces/directives list. - * @param $allowed List of allowed namespaces/directives + * + * @param array $allowed List of allowed namespaces/directives + * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy + * + * @return array */ - public static function getAllowedDirectivesForForm($allowed, $schema = null) { + public static function getAllowedDirectivesForForm($allowed, $schema = null) + { if (!$schema) { $schema = HTMLPurifier_ConfigSchema::instance(); } if ($allowed !== true) { - if (is_string($allowed)) $allowed = array($allowed); - $allowed_ns = array(); - $allowed_directives = array(); - $blacklisted_directives = array(); - foreach ($allowed as $ns_or_directive) { - if (strpos($ns_or_directive, '.') !== false) { - // directive - if ($ns_or_directive[0] == '-') { - $blacklisted_directives[substr($ns_or_directive, 1)] = true; - } else { - $allowed_directives[$ns_or_directive] = true; - } - } else { - // namespace - $allowed_ns[$ns_or_directive] = true; - } - } + if (is_string($allowed)) { + $allowed = array($allowed); + } + $allowed_ns = array(); + $allowed_directives = array(); + $blacklisted_directives = array(); + foreach ($allowed as $ns_or_directive) { + if (strpos($ns_or_directive, '.') !== false) { + // directive + if ($ns_or_directive[0] == '-') { + $blacklisted_directives[substr($ns_or_directive, 1)] = true; + } else { + $allowed_directives[$ns_or_directive] = true; + } + } else { + // namespace + $allowed_ns[$ns_or_directive] = true; + } + } } $ret = array(); foreach ($schema->info as $key => $def) { list($ns, $directive) = explode('.', $key, 2); if ($allowed !== true) { - if (isset($blacklisted_directives["$ns.$directive"])) continue; - if (!isset($allowed_directives["$ns.$directive"]) && !isset($allowed_ns[$ns])) continue; + if (isset($blacklisted_directives["$ns.$directive"])) { + continue; + } + if (!isset($allowed_directives["$ns.$directive"]) && !isset($allowed_ns[$ns])) { + continue; + } + } + if (isset($def->isAlias)) { + continue; + } + if ($directive == 'DefinitionID' || $directive == 'DefinitionRev') { + continue; } - if (isset($def->isAlias)) continue; - if ($directive == 'DefinitionID' || $directive == 'DefinitionRev') continue; $ret[] = array($ns, $directive); } return $ret; @@ -585,13 +747,17 @@ class HTMLPurifier_Config /** * Loads configuration values from $_GET/$_POST that were posted * via ConfigForm - * @param $array $_GET or $_POST array to import - * @param $index Index/name that the config variables are in - * @param $allowed List of allowed namespaces/directives - * @param $mq_fix Boolean whether or not to enable magic quotes fix - * @param $schema Instance of HTMLPurifier_ConfigSchema to use, if not global copy + * + * @param array $array $_GET or $_POST array to import + * @param string|bool $index Index/name that the config variables are in + * @param array|bool $allowed List of allowed namespaces/directives + * @param bool $mq_fix Boolean whether or not to enable magic quotes fix + * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy + * + * @return mixed */ - public static function loadArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null) { + public static function loadArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null) + { $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $schema); $config = HTMLPurifier_Config::create($ret, $schema); return $config; @@ -599,9 +765,14 @@ class HTMLPurifier_Config /** * Merges in configuration values from $_GET/$_POST to object. NOT STATIC. - * @note Same parameters as loadArrayFromForm + * + * @param array $array $_GET or $_POST array to import + * @param string|bool $index Index/name that the config variables are in + * @param array|bool $allowed List of allowed namespaces/directives + * @param bool $mq_fix Boolean whether or not to enable magic quotes fix */ - public function mergeArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true) { + public function mergeArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true) + { $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $this->def); $this->loadArray($ret); } @@ -609,9 +780,20 @@ class HTMLPurifier_Config /** * Prepares an array from a form into something usable for the more * strict parts of HTMLPurifier_Config + * + * @param array $array $_GET or $_POST array to import + * @param string|bool $index Index/name that the config variables are in + * @param array|bool $allowed List of allowed namespaces/directives + * @param bool $mq_fix Boolean whether or not to enable magic quotes fix + * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy + * + * @return array */ - public static function prepareArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null) { - if ($index !== false) $array = (isset($array[$index]) && is_array($array[$index])) ? $array[$index] : array(); + public static function prepareArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null) + { + if ($index !== false) { + $array = (isset($array[$index]) && is_array($array[$index])) ? $array[$index] : array(); + } $mq = $mq_fix && function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc(); $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $schema); @@ -623,7 +805,9 @@ class HTMLPurifier_Config $ret[$ns][$directive] = null; continue; } - if (!isset($array[$skey])) continue; + if (!isset($array[$skey])) { + continue; + } $value = $mq ? stripslashes($array[$skey]) : $array[$skey]; $ret[$ns][$directive] = $value; } @@ -632,19 +816,27 @@ class HTMLPurifier_Config /** * Loads configuration values from an ini file - * @param $filename Name of ini file + * + * @param string $filename Name of ini file */ - public function loadIni($filename) { - if ($this->isFinalized('Cannot load directives after finalization')) return; + public function loadIni($filename) + { + if ($this->isFinalized('Cannot load directives after finalization')) { + return; + } $array = parse_ini_file($filename, true); $this->loadArray($array); } /** * Checks whether or not the configuration object is finalized. - * @param $error String error message, or false for no error + * + * @param string|bool $error String error message, or false for no error + * + * @return bool */ - public function isFinalized($error = false) { + public function isFinalized($error = false) + { if ($this->finalized && $error) { $this->triggerError($error, E_USER_ERROR); } @@ -655,7 +847,8 @@ class HTMLPurifier_Config * Finalizes configuration only if auto finalize is on and not * already finalized */ - public function autoFinalize() { + public function autoFinalize() + { if ($this->autoFinalize) { $this->finalize(); } else { @@ -666,7 +859,8 @@ class HTMLPurifier_Config /** * Finalizes a configuration object, prohibiting further change */ - public function finalize() { + public function finalize() + { $this->finalized = true; $this->parser = null; } @@ -674,8 +868,12 @@ class HTMLPurifier_Config /** * Produces a nicely formatted error message by supplying the * stack frame information OUTSIDE of HTMLPurifier_Config. + * + * @param string $msg An error message + * @param int $no An error number */ - protected function triggerError($msg, $no) { + protected function triggerError($msg, $no) + { // determine previous stack frame $extra = ''; if ($this->chatty) { @@ -697,8 +895,11 @@ class HTMLPurifier_Config /** * Returns a serialized form of the configuration object that can * be reconstituted. + * + * @return string */ - public function serialize() { + public function serialize() + { $this->getDefinition('HTML'); $this->getDefinition('CSS'); $this->getDefinition('URI'); diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema.php similarity index 75% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema.php index fadf7a589..bfbb0f92f 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema.php @@ -3,21 +3,24 @@ /** * Configuration definition, defines directives and their defaults. */ -class HTMLPurifier_ConfigSchema { - +class HTMLPurifier_ConfigSchema +{ /** * Defaults of the directives and namespaces. + * @type array * @note This shares the exact same structure as HTMLPurifier_Config::$conf */ public $defaults = array(); /** * The default property list. Do not edit this property list. + * @type array */ public $defaultPlist; /** - * Definition of the directives. The structure of this is: + * Definition of the directives. + * The structure of this is: * * array( * 'Namespace' => array( @@ -44,22 +47,27 @@ class HTMLPurifier_ConfigSchema { * This class is friendly with HTMLPurifier_Config. If you need introspection * about the schema, you're better of using the ConfigSchema_Interchange, * which uses more memory but has much richer information. + * @type array */ public $info = array(); /** * Application-wide singleton + * @type HTMLPurifier_ConfigSchema */ - static protected $singleton; + protected static $singleton; - public function __construct() { + public function __construct() + { $this->defaultPlist = new HTMLPurifier_PropertyList(); } /** * Unserializes the default ConfigSchema. + * @return HTMLPurifier_ConfigSchema */ - public static function makeFromSerial() { + public static function makeFromSerial() + { $contents = file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema.ser'); $r = unserialize($contents); if (!$r) { @@ -71,8 +79,11 @@ class HTMLPurifier_ConfigSchema { /** * Retrieves an instance of the application-wide configuration definition. + * @param HTMLPurifier_ConfigSchema $prototype + * @return HTMLPurifier_ConfigSchema */ - public static function instance($prototype = null) { + public static function instance($prototype = null) + { if ($prototype !== null) { HTMLPurifier_ConfigSchema::$singleton = $prototype; } elseif (HTMLPurifier_ConfigSchema::$singleton === null || $prototype === true) { @@ -86,17 +97,19 @@ class HTMLPurifier_ConfigSchema { * @warning Will fail of directive's namespace is defined. * @warning This method's signature is slightly different from the legacy * define() static method! Beware! - * @param $namespace Namespace the directive is in - * @param $name Key of directive - * @param $default Default value of directive - * @param $type Allowed type of the directive. See + * @param string $key Name of directive + * @param mixed $default Default value of directive + * @param string $type Allowed type of the directive. See * HTMLPurifier_DirectiveDef::$type for allowed values - * @param $allow_null Whether or not to allow null values + * @param bool $allow_null Whether or not to allow null values */ - public function add($key, $default, $type, $allow_null) { + public function add($key, $default, $type, $allow_null) + { $obj = new stdclass(); $obj->type = is_int($type) ? $type : HTMLPurifier_VarParser::$types[$type]; - if ($allow_null) $obj->allow_null = true; + if ($allow_null) { + $obj->allow_null = true; + } $this->info[$key] = $obj; $this->defaults[$key] = $default; $this->defaultPlist->set($key, $default); @@ -107,11 +120,11 @@ class HTMLPurifier_ConfigSchema { * * Directive value aliases are convenient for developers because it lets * them set a directive to several values and get the same result. - * @param $namespace Directive's namespace - * @param $name Name of Directive - * @param $aliases Hash of aliased values to the real alias + * @param string $key Name of Directive + * @param array $aliases Hash of aliased values to the real alias */ - public function addValueAliases($key, $aliases) { + public function addValueAliases($key, $aliases) + { if (!isset($this->info[$key]->aliases)) { $this->info[$key]->aliases = array(); } @@ -124,22 +137,21 @@ class HTMLPurifier_ConfigSchema { * Defines a set of allowed values for a directive. * @warning This is slightly different from the corresponding static * method definition. - * @param $namespace Namespace of directive - * @param $name Name of directive - * @param $allowed Lookup array of allowed values + * @param string $key Name of directive + * @param array $allowed Lookup array of allowed values */ - public function addAllowedValues($key, $allowed) { + public function addAllowedValues($key, $allowed) + { $this->info[$key]->allowed = $allowed; } /** * Defines a directive alias for backwards compatibility - * @param $namespace - * @param $name Directive that will be aliased - * @param $new_namespace - * @param $new_name Directive that the alias will be to + * @param string $key Directive that will be aliased + * @param string $new_key Directive that the alias will be to */ - public function addAlias($key, $new_key) { + public function addAlias($key, $new_key) + { $obj = new stdclass; $obj->key = $new_key; $obj->isAlias = true; @@ -149,7 +161,8 @@ class HTMLPurifier_ConfigSchema { /** * Replaces any stdclass that only has the type property with type integer. */ - public function postProcess() { + public function postProcess() + { foreach ($this->info as $key => $v) { if (count((array) $v) == 1) { $this->info[$key] = $v->type; @@ -158,7 +171,6 @@ class HTMLPurifier_ConfigSchema { } } } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php similarity index 86% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php index c05668a70..d5906cd46 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php @@ -7,7 +7,12 @@ class HTMLPurifier_ConfigSchema_Builder_ConfigSchema { - public function build($interchange) { + /** + * @param HTMLPurifier_ConfigSchema_Interchange $interchange + * @return HTMLPurifier_ConfigSchema + */ + public function build($interchange) + { $schema = new HTMLPurifier_ConfigSchema(); foreach ($interchange->directives as $d) { $schema->add( @@ -38,7 +43,6 @@ class HTMLPurifier_ConfigSchema_Builder_ConfigSchema $schema->postProcess(); return $schema; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Builder/Xml.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Builder/Xml.php similarity index 52% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Builder/Xml.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Builder/Xml.php index 244561a37..5fa56f7dd 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Builder/Xml.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Builder/Xml.php @@ -7,10 +7,21 @@ class HTMLPurifier_ConfigSchema_Builder_Xml extends XMLWriter { + /** + * @type HTMLPurifier_ConfigSchema_Interchange + */ protected $interchange; + + /** + * @type string + */ private $namespace; - protected function writeHTMLDiv($html) { + /** + * @param string $html + */ + protected function writeHTMLDiv($html) + { $this->startElement('div'); $purifier = HTMLPurifier::getInstance(); @@ -21,12 +32,23 @@ class HTMLPurifier_ConfigSchema_Builder_Xml extends XMLWriter $this->endElement(); // div } - protected function export($var) { - if ($var === array()) return 'array()'; + /** + * @param mixed $var + * @return string + */ + protected function export($var) + { + if ($var === array()) { + return 'array()'; + } return var_export($var, true); } - public function build($interchange) { + /** + * @param HTMLPurifier_ConfigSchema_Interchange $interchange + */ + public function build($interchange) + { // global access, only use as last resort $this->interchange = $interchange; @@ -39,19 +61,26 @@ class HTMLPurifier_ConfigSchema_Builder_Xml extends XMLWriter $this->buildDirective($directive); } - if ($this->namespace) $this->endElement(); // namespace + if ($this->namespace) { + $this->endElement(); + } // namespace $this->endElement(); // configdoc $this->flush(); } - public function buildDirective($directive) { - + /** + * @param HTMLPurifier_ConfigSchema_Interchange_Directive $directive + */ + public function buildDirective($directive) + { // Kludge, although I suppose having a notion of a "root namespace" // certainly makes things look nicer when documentation is built. // Depends on things being sorted. if (!$this->namespace || $this->namespace !== $directive->id->getRootNamespace()) { - if ($this->namespace) $this->endElement(); // namespace + if ($this->namespace) { + $this->endElement(); + } // namespace $this->namespace = $directive->id->getRootNamespace(); $this->startElement('namespace'); $this->writeAttribute('id', $this->namespace); @@ -64,43 +93,52 @@ class HTMLPurifier_ConfigSchema_Builder_Xml extends XMLWriter $this->writeElement('name', $directive->id->getDirective()); $this->startElement('aliases'); - foreach ($directive->aliases as $alias) $this->writeElement('alias', $alias->toString()); + foreach ($directive->aliases as $alias) { + $this->writeElement('alias', $alias->toString()); + } $this->endElement(); // aliases $this->startElement('constraints'); - if ($directive->version) $this->writeElement('version', $directive->version); - $this->startElement('type'); - if ($directive->typeAllowsNull) $this->writeAttribute('allow-null', 'yes'); - $this->text($directive->type); - $this->endElement(); // type - if ($directive->allowed) { - $this->startElement('allowed'); - foreach ($directive->allowed as $value => $x) $this->writeElement('value', $value); - $this->endElement(); // allowed + if ($directive->version) { + $this->writeElement('version', $directive->version); + } + $this->startElement('type'); + if ($directive->typeAllowsNull) { + $this->writeAttribute('allow-null', 'yes'); + } + $this->text($directive->type); + $this->endElement(); // type + if ($directive->allowed) { + $this->startElement('allowed'); + foreach ($directive->allowed as $value => $x) { + $this->writeElement('value', $value); } - $this->writeElement('default', $this->export($directive->default)); - $this->writeAttribute('xml:space', 'preserve'); - if ($directive->external) { - $this->startElement('external'); - foreach ($directive->external as $project) $this->writeElement('project', $project); - $this->endElement(); + $this->endElement(); // allowed + } + $this->writeElement('default', $this->export($directive->default)); + $this->writeAttribute('xml:space', 'preserve'); + if ($directive->external) { + $this->startElement('external'); + foreach ($directive->external as $project) { + $this->writeElement('project', $project); } + $this->endElement(); + } $this->endElement(); // constraints if ($directive->deprecatedVersion) { $this->startElement('deprecated'); - $this->writeElement('version', $directive->deprecatedVersion); - $this->writeElement('use', $directive->deprecatedUse->toString()); + $this->writeElement('version', $directive->deprecatedVersion); + $this->writeElement('use', $directive->deprecatedUse->toString()); $this->endElement(); // deprecated } $this->startElement('description'); - $this->writeHTMLDiv($directive->description); + $this->writeHTMLDiv($directive->description); $this->endElement(); // description $this->endElement(); // directive } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Exception.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Exception.php similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Exception.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Exception.php diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Interchange.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Interchange.php similarity index 76% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Interchange.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Interchange.php index 91a5aa730..0e08ae8fe 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Interchange.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Interchange.php @@ -10,18 +10,23 @@ class HTMLPurifier_ConfigSchema_Interchange /** * Name of the application this schema is describing. + * @type string */ public $name; /** * Array of Directive ID => array(directive info) + * @type HTMLPurifier_ConfigSchema_Interchange_Directive[] */ public $directives = array(); /** * Adds a directive array to $directives + * @param HTMLPurifier_ConfigSchema_Interchange_Directive $directive + * @throws HTMLPurifier_ConfigSchema_Exception */ - public function addDirective($directive) { + public function addDirective($directive) + { if (isset($this->directives[$i = $directive->id->toString()])) { throw new HTMLPurifier_ConfigSchema_Exception("Cannot redefine directive '$i'"); } @@ -32,11 +37,11 @@ class HTMLPurifier_ConfigSchema_Interchange * Convenience function to perform standard validation. Throws exception * on failed validation. */ - public function validate() { + public function validate() + { $validator = new HTMLPurifier_ConfigSchema_Validator(); return $validator->validate($this); } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php similarity index 65% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php index ac8be0d97..127a39a67 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php @@ -7,71 +7,83 @@ class HTMLPurifier_ConfigSchema_Interchange_Directive { /** - * ID of directive, instance of HTMLPurifier_ConfigSchema_Interchange_Id. + * ID of directive. + * @type HTMLPurifier_ConfigSchema_Interchange_Id */ public $id; /** - * String type, e.g. 'integer' or 'istring'. + * Type, e.g. 'integer' or 'istring'. + * @type string */ public $type; /** * Default value, e.g. 3 or 'DefaultVal'. + * @type mixed */ public $default; /** * HTML description. + * @type string */ public $description; /** - * Boolean whether or not null is allowed as a value. + * Whether or not null is allowed as a value. + * @type bool */ public $typeAllowsNull = false; /** - * Lookup table of allowed scalar values, e.g. array('allowed' => true). + * Lookup table of allowed scalar values. + * e.g. array('allowed' => true). * Null if all values are allowed. + * @type array */ public $allowed; /** - * List of aliases for the directive, + * List of aliases for the directive. * e.g. array(new HTMLPurifier_ConfigSchema_Interchange_Id('Ns', 'Dir'))). + * @type HTMLPurifier_ConfigSchema_Interchange_Id[] */ public $aliases = array(); /** * Hash of value aliases, e.g. array('alt' => 'real'). Null if value * aliasing is disabled (necessary for non-scalar types). + * @type array */ public $valueAliases; /** * Version of HTML Purifier the directive was introduced, e.g. '1.3.1'. * Null if the directive has always existed. + * @type string */ public $version; /** - * ID of directive that supercedes this old directive, is an instance - * of HTMLPurifier_ConfigSchema_Interchange_Id. Null if not deprecated. + * ID of directive that supercedes this old directive. + * Null if not deprecated. + * @type HTMLPurifier_ConfigSchema_Interchange_Id */ public $deprecatedUse; /** * Version of HTML Purifier this directive was deprecated. Null if not * deprecated. + * @type string */ public $deprecatedVersion; /** * List of external projects this directive depends on, e.g. array('CSSTidy'). + * @type array */ public $external = array(); - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Interchange/Id.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Interchange/Id.php similarity index 54% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Interchange/Id.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Interchange/Id.php index b9b3c6f5c..126f09d95 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Interchange/Id.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Interchange/Id.php @@ -6,32 +6,53 @@ class HTMLPurifier_ConfigSchema_Interchange_Id { + /** + * @type string + */ public $key; - public function __construct($key) { + /** + * @param string $key + */ + public function __construct($key) + { $this->key = $key; } /** + * @return string * @warning This is NOT magic, to ensure that people don't abuse SPL and * cause problems for PHP 5.0 support. */ - public function toString() { + public function toString() + { return $this->key; } - public function getRootNamespace() { + /** + * @return string + */ + public function getRootNamespace() + { return substr($this->key, 0, strpos($this->key, ".")); } - public function getDirective() { + /** + * @return string + */ + public function getDirective() + { return substr($this->key, strpos($this->key, ".") + 1); } - public static function make($id) { + /** + * @param string $id + * @return HTMLPurifier_ConfigSchema_Interchange_Id + */ + public static function make($id) + { return new HTMLPurifier_ConfigSchema_Interchange_Id($id); } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php similarity index 67% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php index 785b72ce8..655e6dd1b 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php @@ -5,21 +5,39 @@ class HTMLPurifier_ConfigSchema_InterchangeBuilder /** * Used for processing DEFAULT, nothing else. + * @type HTMLPurifier_VarParser */ protected $varParser; - public function __construct($varParser = null) { + /** + * @param HTMLPurifier_VarParser $varParser + */ + public function __construct($varParser = null) + { $this->varParser = $varParser ? $varParser : new HTMLPurifier_VarParser_Native(); } - public static function buildFromDirectory($dir = null) { - $builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder(); + /** + * @param string $dir + * @return HTMLPurifier_ConfigSchema_Interchange + */ + public static function buildFromDirectory($dir = null) + { + $builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder(); $interchange = new HTMLPurifier_ConfigSchema_Interchange(); return $builder->buildDir($interchange, $dir); } - public function buildDir($interchange, $dir = null) { - if (!$dir) $dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema'; + /** + * @param HTMLPurifier_ConfigSchema_Interchange $interchange + * @param string $dir + * @return HTMLPurifier_ConfigSchema_Interchange + */ + public function buildDir($interchange, $dir = null) + { + if (!$dir) { + $dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema'; + } if (file_exists($dir . '/info.ini')) { $info = parse_ini_file($dir . '/info.ini'); $interchange->name = $info['name']; @@ -39,24 +57,30 @@ class HTMLPurifier_ConfigSchema_InterchangeBuilder foreach ($files as $file) { $this->buildFile($interchange, $dir . '/' . $file); } - return $interchange; } - public function buildFile($interchange, $file) { + /** + * @param HTMLPurifier_ConfigSchema_Interchange $interchange + * @param string $file + */ + public function buildFile($interchange, $file) + { $parser = new HTMLPurifier_StringHashParser(); $this->build( $interchange, - new HTMLPurifier_StringHash( $parser->parseFile($file) ) + new HTMLPurifier_StringHash($parser->parseFile($file)) ); } /** * Builds an interchange object based on a hash. - * @param $interchange HTMLPurifier_ConfigSchema_Interchange object to build - * @param $hash HTMLPurifier_ConfigSchema_StringHash source data + * @param HTMLPurifier_ConfigSchema_Interchange $interchange HTMLPurifier_ConfigSchema_Interchange object to build + * @param HTMLPurifier_StringHash $hash source data + * @throws HTMLPurifier_ConfigSchema_Exception */ - public function build($interchange, $hash) { + public function build($interchange, $hash) + { if (!$hash instanceof HTMLPurifier_StringHash) { $hash = new HTMLPurifier_StringHash($hash); } @@ -75,7 +99,13 @@ class HTMLPurifier_ConfigSchema_InterchangeBuilder $this->_findUnused($hash); } - public function buildDirective($interchange, $hash) { + /** + * @param HTMLPurifier_ConfigSchema_Interchange $interchange + * @param HTMLPurifier_StringHash $hash + * @throws HTMLPurifier_ConfigSchema_Exception + */ + public function buildDirective($interchange, $hash) + { $directive = new HTMLPurifier_ConfigSchema_Interchange_Directive(); // These are required elements: @@ -84,7 +114,9 @@ class HTMLPurifier_ConfigSchema_InterchangeBuilder if (isset($hash['TYPE'])) { $type = explode('/', $hash->offsetGet('TYPE')); - if (isset($type[1])) $directive->typeAllowsNull = true; + if (isset($type[1])) { + $directive->typeAllowsNull = true; + } $directive->type = $type[0]; } else { throw new HTMLPurifier_ConfigSchema_Exception("TYPE in directive hash '$id' not defined"); @@ -92,7 +124,11 @@ class HTMLPurifier_ConfigSchema_InterchangeBuilder if (isset($hash['DEFAULT'])) { try { - $directive->default = $this->varParser->parse($hash->offsetGet('DEFAULT'), $directive->type, $directive->typeAllowsNull); + $directive->default = $this->varParser->parse( + $hash->offsetGet('DEFAULT'), + $directive->type, + $directive->typeAllowsNull + ); } catch (HTMLPurifier_VarParserException $e) { throw new HTMLPurifier_ConfigSchema_Exception($e->getMessage() . " in DEFAULT in directive hash '$id'"); } @@ -139,34 +175,45 @@ class HTMLPurifier_ConfigSchema_InterchangeBuilder /** * Evaluates an array PHP code string without array() wrapper + * @param string $contents */ - protected function evalArray($contents) { - return eval('return array('. $contents .');'); + protected function evalArray($contents) + { + return eval('return array(' . $contents . ');'); } /** * Converts an array list into a lookup array. + * @param array $array + * @return array */ - protected function lookup($array) { + protected function lookup($array) + { $ret = array(); - foreach ($array as $val) $ret[$val] = true; + foreach ($array as $val) { + $ret[$val] = true; + } return $ret; } /** * Convenience function that creates an HTMLPurifier_ConfigSchema_Interchange_Id * object based on a string Id. + * @param string $id + * @return HTMLPurifier_ConfigSchema_Interchange_Id */ - protected function id($id) { + protected function id($id) + { return HTMLPurifier_ConfigSchema_Interchange_Id::make($id); } /** * Triggers errors for any unused keys passed in the hash; such keys * may indicate typos, missing values, etc. - * @param $hash Instance of ConfigSchema_StringHash to check. + * @param HTMLPurifier_StringHash $hash Hash to check. */ - protected function _findUnused($hash) { + protected function _findUnused($hash) + { $accessed = $hash->getAccessed(); foreach ($hash as $k => $v) { if (!isset($accessed[$k])) { @@ -174,7 +221,6 @@ class HTMLPurifier_ConfigSchema_InterchangeBuilder } } } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Validator.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Validator.php similarity index 73% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Validator.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Validator.php index f374f6a02..fb3127788 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/Validator.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/Validator.php @@ -12,36 +12,48 @@ class HTMLPurifier_ConfigSchema_Validator { /** - * Easy to access global objects. + * @type HTMLPurifier_ConfigSchema_Interchange */ - protected $interchange, $aliases; + protected $interchange; + + /** + * @type array + */ + protected $aliases; /** * Context-stack to provide easy to read error messages. + * @type array */ protected $context = array(); /** - * HTMLPurifier_VarParser to test default's type. + * to test default's type. + * @type HTMLPurifier_VarParser */ protected $parser; - public function __construct() { + public function __construct() + { $this->parser = new HTMLPurifier_VarParser(); } /** - * Validates a fully-formed interchange object. Throws an - * HTMLPurifier_ConfigSchema_Exception if there's a problem. + * Validates a fully-formed interchange object. + * @param HTMLPurifier_ConfigSchema_Interchange $interchange + * @return bool */ - public function validate($interchange) { + public function validate($interchange) + { $this->interchange = $interchange; $this->aliases = array(); // PHP is a bit lax with integer <=> string conversions in // arrays, so we don't use the identical !== comparison foreach ($interchange->directives as $i => $directive) { $id = $directive->id->toString(); - if ($i != $id) $this->error(false, "Integrity violation: key '$i' does not match internal id '$id'"); + if ($i != $id) { + $this->error(false, "Integrity violation: key '$i' does not match internal id '$id'"); + } $this->validateDirective($directive); } return true; @@ -49,8 +61,10 @@ class HTMLPurifier_ConfigSchema_Validator /** * Validates a HTMLPurifier_ConfigSchema_Interchange_Id object. + * @param HTMLPurifier_ConfigSchema_Interchange_Id $id */ - public function validateId($id) { + public function validateId($id) + { $id_string = $id->toString(); $this->context[] = "id '$id_string'"; if (!$id instanceof HTMLPurifier_ConfigSchema_Interchange_Id) { @@ -67,8 +81,10 @@ class HTMLPurifier_ConfigSchema_Validator /** * Validates a HTMLPurifier_ConfigSchema_Interchange_Directive object. + * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d */ - public function validateDirective($d) { + public function validateDirective($d) + { $id = $d->id->toString(); $this->context[] = "directive '$id'"; $this->validateId($d->id); @@ -108,9 +124,13 @@ class HTMLPurifier_ConfigSchema_Validator /** * Extra validation if $allowed member variable of * HTMLPurifier_ConfigSchema_Interchange_Directive is defined. + * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d */ - public function validateDirectiveAllowed($d) { - if (is_null($d->allowed)) return; + public function validateDirectiveAllowed($d) + { + if (is_null($d->allowed)) { + return; + } $this->with($d, 'allowed') ->assertNotEmpty() ->assertIsLookup(); // handled by InterchangeBuilder @@ -119,7 +139,9 @@ class HTMLPurifier_ConfigSchema_Validator } $this->context[] = 'allowed'; foreach ($d->allowed as $val => $x) { - if (!is_string($val)) $this->error("value $val", 'must be a string'); + if (!is_string($val)) { + $this->error("value $val", 'must be a string'); + } } array_pop($this->context); } @@ -127,15 +149,23 @@ class HTMLPurifier_ConfigSchema_Validator /** * Extra validation if $valueAliases member variable of * HTMLPurifier_ConfigSchema_Interchange_Directive is defined. + * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d */ - public function validateDirectiveValueAliases($d) { - if (is_null($d->valueAliases)) return; + public function validateDirectiveValueAliases($d) + { + if (is_null($d->valueAliases)) { + return; + } $this->with($d, 'valueAliases') ->assertIsArray(); // handled by InterchangeBuilder $this->context[] = 'valueAliases'; foreach ($d->valueAliases as $alias => $real) { - if (!is_string($alias)) $this->error("alias $alias", 'must be a string'); - if (!is_string($real)) $this->error("alias target $real from alias '$alias'", 'must be a string'); + if (!is_string($alias)) { + $this->error("alias $alias", 'must be a string'); + } + if (!is_string($real)) { + $this->error("alias target $real from alias '$alias'", 'must be a string'); + } if ($alias === $real) { $this->error("alias '$alias'", "must not be an alias to itself"); } @@ -155,8 +185,10 @@ class HTMLPurifier_ConfigSchema_Validator /** * Extra validation if $aliases member variable of * HTMLPurifier_ConfigSchema_Interchange_Directive is defined. + * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d */ - public function validateDirectiveAliases($d) { + public function validateDirectiveAliases($d) + { $this->with($d, 'aliases') ->assertIsArray(); // handled by InterchangeBuilder $this->context[] = 'aliases'; @@ -180,27 +212,37 @@ class HTMLPurifier_ConfigSchema_Validator /** * Convenience function for generating HTMLPurifier_ConfigSchema_ValidatorAtom * for validating simple member variables of objects. + * @param $obj + * @param $member + * @return HTMLPurifier_ConfigSchema_ValidatorAtom */ - protected function with($obj, $member) { + protected function with($obj, $member) + { return new HTMLPurifier_ConfigSchema_ValidatorAtom($this->getFormattedContext(), $obj, $member); } /** * Emits an error, providing helpful context. + * @throws HTMLPurifier_ConfigSchema_Exception */ - protected function error($target, $msg) { - if ($target !== false) $prefix = ucfirst($target) . ' in ' . $this->getFormattedContext(); - else $prefix = ucfirst($this->getFormattedContext()); + protected function error($target, $msg) + { + if ($target !== false) { + $prefix = ucfirst($target) . ' in ' . $this->getFormattedContext(); + } else { + $prefix = ucfirst($this->getFormattedContext()); + } throw new HTMLPurifier_ConfigSchema_Exception(trim($prefix . ' ' . $msg)); } /** * Returns a formatted context string. + * @return string */ - protected function getFormattedContext() { + protected function getFormattedContext() + { return implode(' in ', array_reverse($this->context)); } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php new file mode 100644 index 000000000..c9aa3644a --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php @@ -0,0 +1,130 @@ +context = $context; + $this->obj = $obj; + $this->member = $member; + $this->contents =& $obj->$member; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertIsString() + { + if (!is_string($this->contents)) { + $this->error('must be a string'); + } + return $this; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertIsBool() + { + if (!is_bool($this->contents)) { + $this->error('must be a boolean'); + } + return $this; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertIsArray() + { + if (!is_array($this->contents)) { + $this->error('must be an array'); + } + return $this; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertNotNull() + { + if ($this->contents === null) { + $this->error('must not be null'); + } + return $this; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertAlnum() + { + $this->assertIsString(); + if (!ctype_alnum($this->contents)) { + $this->error('must be alphanumeric'); + } + return $this; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertNotEmpty() + { + if (empty($this->contents)) { + $this->error('must not be empty'); + } + return $this; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertIsLookup() + { + $this->assertIsArray(); + foreach ($this->contents as $v) { + if ($v !== true) { + $this->error('must be a lookup array'); + } + } + return $this; + } + + /** + * @param string $msg + * @throws HTMLPurifier_ConfigSchema_Exception + */ + protected function error($msg) + { + throw new HTMLPurifier_ConfigSchema_Exception(ucfirst($this->member) . ' in ' . $this->context . ' ' . $msg); + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema.ser b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema.ser new file mode 100644 index 0000000000000000000000000000000000000000..22ea32185db63b19d525f509ebe431f593e92271 GIT binary patch literal 15000 zcmeHOQE%Hw4&I+qWN|MCY!D~i+phbRCNXMUk_K^#-FsRn_QcUumVA=jCRg;o-}iCI znUNwV-G{q}gIlz*MGl8UayT67%ZKsd&*Q!KHy7tun>xSCUH!*NRo>;x+5FzEvc2)q z_-iwMGu~UcyKGam&EDH=JQ}^>)6uWvz2mm6_m7LB`r;NRMbzkY)VOrDCkb_FNcM*N%*p_7c1SwA-JTFqO>w8-#rn+|6y16$G zyhmaP@N~3Au}yuEJxo{2b5|~D(q;^eMu!InYl&JW4@#ndI(KbWN7Yrqn;PNg#5J#SVTg61lr8iIdZ|joov#>z#X4oWmH6Lz(tCzgzD;5-ZVZo^6~3mj~EXK zh?A;z`^U>=?LhtPipNR*a4tTOh@ppsgNgKg)wCs&<;Qa2>Sm7T!B@t2QWb@pw`X-- z)m=YR3aC~6clY?EsuvQY@CSkvwp(R&Rh2X(l>hO~0srVmsc9wud@`};7*f?)=@T1= zOeV)a`yn7bI;tB-aU8$FEmeV48s*IaXW};uT5sxgk&q5RRK~l_{JzOE8%A-H3BN($ zm;1a8qbBl)6l~ZcUj+gO1RY>(7uL#YJOx9_>@y<8FP2O78h~(HY!X>EJqX#qHbE~w z_IiQPI-ekE918NHpztkIb2>?|K$91reSmS$$pQcBT98PCVw6Q`%pnX!@7WSVTV%M+ z%9ZU+g;RCOPmB;o(h)2yoH%h1Am{D@S=4L>vIdWL46t(_i}C--@=sOcCz z@N9RSrCc}JGQ{;EQeGnGvMP^fC)4T4Jx-oEmJ=9x@(Sa7IXKS>N7Kj-kSq;-nt7eC zgSDV-(>^j9X+4%Bwx)9g{YDRTDCpy81b>TsnAO!jZ&;}#&o8pPZ1FGJ9Fq%&E%K5F zClk!2`%=I&qPwI3CM;Uh=X^C5a$oSQspc7w^XAMY<#Jj!ZM~W6fuu$?w|VB7tQvJ) z>+M06xYS8rz<&GvBl-yIRMOc)OC!%{rFTU&|J3Y@pTyl7a?pG`_iT=%!5iUuu{ZhR zF)=9?uvMsq4*j7_|EM-Mn_F=t!+HdJv!=DmG_vBhJqzsuN5pjJA4yk5+X$ zoGZdnY)i72tHdHlO@&eB@S!rubf0B+C}eMACB)iEM3OSSmW3*~ zQ&|p_3q3PU1{;2reShD!$QgcJ(12gVfkZoJI3FrwKycngb}XbUyI^MtNqShU9+#Q}UWa6jjECHW%z!1H*DjJ5jh+5ZXt>0lP`FXz z>Lg8oNJ_7i);j2j+qH|%lZ&EVT0;+pcgS74C^Xr3?V??~=xNL5|GHg-{uSCjYi&}q zlEHHEWX{**Y)he~gnnOM-l40AzR=N#jmQ9)>BETf@lS6c<9Q@eJ|+*7keq@lLvTdf zNCHKWQBY4t^)N)3_!mx$=9rMRX>eV33|M7Smx!AVLA|fL_=(9)S^gR75a>&J|EY zA85m-_28;Kv<_e~OzYo?__3HF^W8mKRXEUT5~Pt&Likp<()q+&PPX;%KyS}c z4hNiM_@_Y4U14Z;p#Ri#_3IpiSy2v@Auf4zMX7|4LurMDEk9RjJ+x zt1|SGxqxj_9qS=a3Tsk43Y{1cHT;-hnxb729(!S`sxkJWfIgy0B~XXRq*x`hdk-YE z4bkKkK4L@#QPg#{-y4ClMIcbmJMKGY9d;&t6_n`DZ|nN=fGQseJPL8=u` zQw7&_kGtn#JP{ofHQNg0iOeqqGB&|hAqgO9IGC|f{a}AoK5ZubZ`6Pfx358AQku+| z9=7r->kAh9p4o=Yh3I(RT>otao^^KY``I2ldeOge%nL^Q&Y1`8#^%sgpM`7}X9$Qj zzfS@{NiQ%Q@zZN9e5FyP1QxP}?*s$N*fPBO<5d0KwTHFr`8+>&3@V{c8HM3#mvq6^4x|!Xm~cY{!&j ztxFwcA;VD#(oKs2Q_$?KgDikMI5(x4v6zhn=cb}eaXwd+TQB}zzVp9kq(M+wl>#PW z=wNL{zPt~>PUvR9IUlTGxOakt=XdD~m_4YA!Rb`ZpuU0WbXnL3VqFE(#ivq_=+mJE z!THue=*bw)uW*Rs;I`oN{M4at+`{#|Du*x5GN{~EP@tM4N)@E3fdZ8Z$Mr#hmbl=M zC%8Zzg{?J!3sfS;iT&wFgA6{ua%Rv0dBe*E?*QyDE|!ooJ+A`b%*PQdL81o++A1NA z50RbuD~5&*jGJDG2`KRC$nGy1NqWI1m63)EjJA<(kX}~6^3p|W)R#1D6{Oo_z6dz< z^D?vs$O))V`LG)jz9)1Q;{k^~JM=JzzCSgLIP{aL%8EENX*z{GeKP+x(4h|I{-gTa QaEIMR#+=+~=6(D2AIX)%zyJUM literal 0 HcmV?d00001 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt new file mode 100644 index 000000000..2c910cc7d --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt @@ -0,0 +1,16 @@ +Core.AllowHostnameUnderscore +TYPE: bool +VERSION: 4.6.0 +DEFAULT: false +--DESCRIPTION-- +

+ By RFC 1123, underscores are not permitted in host names. + (This is in contrast to the specification for DNS, RFC + 2181, which allows underscores.) + However, most browsers do the right thing when faced with + an underscore in the host name, and so some poorly written + websites are written with the expectation this should work. + Setting this parameter to true relaxes our allowed character + check so that underscores are permitted. +

+--# vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt similarity index 62% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt index 4d5b5055c..a3881be75 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt @@ -2,9 +2,11 @@ Core.EscapeInvalidChildren TYPE: bool DEFAULT: false --DESCRIPTION-- -When true, a child is found that is not allowed in the context of the +

Warning: this configuration option is no longer does anything as of 4.6.0.

+ +

When true, a child is found that is not allowed in the context of the parent element will be transformed into text as if it were ASCII. When false, that element and all internal tags will be dropped, though text will be preserved. There is no option for dropping the element but preserving -child nodes. +child nodes.

--# vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt similarity index 93% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt index 0d00f62ea..1e17c1d46 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt @@ -11,7 +11,7 @@ DEFAULT: NULL to check if a URI has passed through HTML Purifier with this line:

-
$checksum === sha1($secret_key . ':' . $url)
+
$checksum === hash_hmac("sha256", $url, $secret_key)

If the output is TRUE, the redirector script should accept the URI. diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/info.ini b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/info.ini similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ConfigSchema/schema/info.ini rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ConfigSchema/schema/info.ini diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ContentSets.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ContentSets.php similarity index 76% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ContentSets.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ContentSets.php index 3b6e96f5f..543e3f8f1 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ContentSets.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ContentSets.php @@ -7,35 +7,42 @@ class HTMLPurifier_ContentSets { /** - * List of content set strings (pipe seperators) indexed by name. + * List of content set strings (pipe separators) indexed by name. + * @type array */ public $info = array(); /** * List of content set lookups (element => true) indexed by name. + * @type array * @note This is in HTMLPurifier_HTMLDefinition->info_content_sets */ public $lookup = array(); /** - * Synchronized list of defined content sets (keys of info) + * Synchronized list of defined content sets (keys of info). + * @type array */ protected $keys = array(); /** - * Synchronized list of defined content values (values of info) + * Synchronized list of defined content values (values of info). + * @type array */ protected $values = array(); /** * Merges in module's content sets, expands identifiers in the content * sets and populates the keys, values and lookup member variables. - * @param $modules List of HTMLPurifier_HTMLModule + * @param HTMLPurifier_HTMLModule[] $modules List of HTMLPurifier_HTMLModule */ - public function __construct($modules) { - if (!is_array($modules)) $modules = array($modules); + public function __construct($modules) + { + if (!is_array($modules)) { + $modules = array($modules); + } // populate content_sets based on module hints // sorry, no way of overloading - foreach ($modules as $module_i => $module) { + foreach ($modules as $module) { foreach ($module->content_sets as $key => $value) { $temp = $this->convertToLookup($value); if (isset($this->lookup[$key])) { @@ -70,11 +77,14 @@ class HTMLPurifier_ContentSets /** * Accepts a definition; generates and assigns a ChildDef for it - * @param $def HTMLPurifier_ElementDef reference - * @param $module Module that defined the ElementDef + * @param HTMLPurifier_ElementDef $def HTMLPurifier_ElementDef reference + * @param HTMLPurifier_HTMLModule $module Module that defined the ElementDef */ - public function generateChildDef(&$def, $module) { - if (!empty($def->child)) return; // already done! + public function generateChildDef(&$def, $module) + { + if (!empty($def->child)) { // already done! + return; + } $content_model = $def->content_model; if (is_string($content_model)) { // Assume that $this->keys is alphanumeric @@ -89,7 +99,8 @@ class HTMLPurifier_ContentSets $def->child = $this->getChildDef($def, $module); } - public function generateChildDefCallback($matches) { + public function generateChildDefCallback($matches) + { return $this->info[$matches[0]]; } @@ -98,10 +109,12 @@ class HTMLPurifier_ContentSets * member variables in HTMLPurifier_ElementDef * @note This will also defer to modules for custom HTMLPurifier_ChildDef * subclasses that need content set expansion - * @param $def HTMLPurifier_ElementDef to have ChildDef extracted + * @param HTMLPurifier_ElementDef $def HTMLPurifier_ElementDef to have ChildDef extracted + * @param HTMLPurifier_HTMLModule $module Module that defined the ElementDef * @return HTMLPurifier_ChildDef corresponding to ElementDef */ - public function getChildDef($def, $module) { + public function getChildDef($def, $module) + { $value = $def->content_model; if (is_object($value)) { trigger_error( @@ -126,7 +139,9 @@ class HTMLPurifier_ContentSets if ($module->defines_child_def) { // save a func call $return = $module->getChildDef($def); } - if ($return !== false) return $return; + if ($return !== false) { + return $return; + } // error-out trigger_error( 'Could not determine which ChildDef class to instantiate', @@ -138,18 +153,18 @@ class HTMLPurifier_ContentSets /** * Converts a string list of elements separated by pipes into * a lookup array. - * @param $string List of elements - * @return Lookup array of elements + * @param string $string List of elements + * @return array Lookup array of elements */ - protected function convertToLookup($string) { + protected function convertToLookup($string) + { $array = explode('|', str_replace(' ', '', $string)); $ret = array(); - foreach ($array as $i => $k) { + foreach ($array as $k) { $ret[$k] = true; } return $ret; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Context.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Context.php new file mode 100644 index 000000000..00e509c85 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Context.php @@ -0,0 +1,95 @@ +_storage)) { + trigger_error( + "Name $name produces collision, cannot re-register", + E_USER_ERROR + ); + return; + } + $this->_storage[$name] =& $ref; + } + + /** + * Retrieves a variable reference from the context. + * @param string $name String name + * @param bool $ignore_error Boolean whether or not to ignore error + * @return mixed + */ + public function &get($name, $ignore_error = false) + { + if (!array_key_exists($name, $this->_storage)) { + if (!$ignore_error) { + trigger_error( + "Attempted to retrieve non-existent variable $name", + E_USER_ERROR + ); + } + $var = null; // so we can return by reference + return $var; + } + return $this->_storage[$name]; + } + + /** + * Destroys a variable in the context. + * @param string $name String name + */ + public function destroy($name) + { + if (!array_key_exists($name, $this->_storage)) { + trigger_error( + "Attempted to destroy non-existent variable $name", + E_USER_ERROR + ); + return; + } + unset($this->_storage[$name]); + } + + /** + * Checks whether or not the variable exists. + * @param string $name String name + * @return bool + */ + public function exists($name) + { + return array_key_exists($name, $this->_storage); + } + + /** + * Loads a series of variables from an associative array + * @param array $context_array Assoc array of variables to load + */ + public function loadArray($context_array) + { + foreach ($context_array as $key => $discard) { + $this->register($key, $context_array[$key]); + } + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Definition.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Definition.php similarity index 82% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Definition.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Definition.php index c7f82eba4..bc6d43364 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Definition.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Definition.php @@ -9,6 +9,7 @@ abstract class HTMLPurifier_Definition /** * Has setup() been called yet? + * @type bool */ public $setup = false; @@ -20,31 +21,35 @@ abstract class HTMLPurifier_Definition * is used and any writes to the raw definition object are short * circuited. See enduser-customize.html for the high-level * picture. + * @type bool */ public $optimized = null; /** * What type of definition is it? + * @type string */ public $type; /** * Sets up the definition object into the final form, something * not done by the constructor - * @param $config HTMLPurifier_Config instance + * @param HTMLPurifier_Config $config */ abstract protected function doSetup($config); /** * Setup function that aborts if already setup - * @param $config HTMLPurifier_Config instance + * @param HTMLPurifier_Config $config */ - public function setup($config) { - if ($this->setup) return; + public function setup($config) + { + if ($this->setup) { + return; + } $this->setup = true; $this->doSetup($config); } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCache.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCache.php similarity index 66% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCache.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCache.php index c6e1e388c..67bb5b1e6 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCache.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCache.php @@ -10,22 +10,27 @@ */ abstract class HTMLPurifier_DefinitionCache { - + /** + * @type string + */ public $type; /** - * @param $name Type of definition objects this instance of the + * @param string $type Type of definition objects this instance of the * cache will handle. */ - public function __construct($type) { + public function __construct($type) + { $this->type = $type; } /** * Generates a unique identifier for a particular configuration - * @param Instance of HTMLPurifier_Config + * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config + * @return string */ - public function generateKey($config) { + public function generateKey($config) + { return $config->version . ',' . // possibly replace with function calls $config->getBatchSerial($this->type) . ',' . $config->get($this->type . '.DefinitionRev'); @@ -34,30 +39,37 @@ abstract class HTMLPurifier_DefinitionCache /** * Tests whether or not a key is old with respect to the configuration's * version and revision number. - * @param $key Key to test - * @param $config Instance of HTMLPurifier_Config to test against + * @param string $key Key to test + * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config to test against + * @return bool */ - public function isOld($key, $config) { - if (substr_count($key, ',') < 2) return true; + public function isOld($key, $config) + { + if (substr_count($key, ',') < 2) { + return true; + } list($version, $hash, $revision) = explode(',', $key, 3); $compare = version_compare($version, $config->version); // version mismatch, is always old - if ($compare != 0) return true; + if ($compare != 0) { + return true; + } // versions match, ids match, check revision number - if ( - $hash == $config->getBatchSerial($this->type) && - $revision < $config->get($this->type . '.DefinitionRev') - ) return true; + if ($hash == $config->getBatchSerial($this->type) && + $revision < $config->get($this->type . '.DefinitionRev')) { + return true; + } return false; } /** * Checks if a definition's type jives with the cache's type * @note Throws an error on failure - * @param $def Definition object to check - * @return Boolean true if good, false if not + * @param HTMLPurifier_Definition $def Definition object to check + * @return bool true if good, false if not */ - public function checkDefType($def) { + public function checkDefType($def) + { if ($def->type !== $this->type) { trigger_error("Cannot use definition of type {$def->type} in cache for {$this->type}"); return false; @@ -67,31 +79,40 @@ abstract class HTMLPurifier_DefinitionCache /** * Adds a definition object to the cache + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config */ abstract public function add($def, $config); /** * Unconditionally saves a definition object to the cache + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config */ abstract public function set($def, $config); /** * Replace an object in the cache + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config */ abstract public function replace($def, $config); /** * Retrieves a definition object from the cache + * @param HTMLPurifier_Config $config */ abstract public function get($config); /** * Removes a definition object to the cache + * @param HTMLPurifier_Config $config */ abstract public function remove($config); /** * Clears all objects from cache + * @param HTMLPurifier_Config $config */ abstract public function flush($config); @@ -100,9 +121,9 @@ abstract class HTMLPurifier_DefinitionCache * @note Be carefuly implementing this method as flush. Flush must * not interfere with other Definition types, and cleanup() * should not be repeatedly called by userland code. + * @param HTMLPurifier_Config $config */ abstract public function cleanup($config); - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCache/Decorator.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCache/Decorator.php new file mode 100644 index 000000000..b57a51b6c --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCache/Decorator.php @@ -0,0 +1,112 @@ +copy(); + // reference is necessary for mocks in PHP 4 + $decorator->cache =& $cache; + $decorator->type = $cache->type; + return $decorator; + } + + /** + * Cross-compatible clone substitute + * @return HTMLPurifier_DefinitionCache_Decorator + */ + public function copy() + { + return new HTMLPurifier_DefinitionCache_Decorator(); + } + + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function add($def, $config) + { + return $this->cache->add($def, $config); + } + + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function set($def, $config) + { + return $this->cache->set($def, $config); + } + + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function replace($def, $config) + { + return $this->cache->replace($def, $config); + } + + /** + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function get($config) + { + return $this->cache->get($config); + } + + /** + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function remove($config) + { + return $this->cache->remove($config); + } + + /** + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function flush($config) + { + return $this->cache->flush($config); + } + + /** + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function cleanup($config) + { + return $this->cache->cleanup($config); + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php new file mode 100644 index 000000000..4991777ce --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php @@ -0,0 +1,78 @@ +definitions[$this->generateKey($config)] = $def; + } + return $status; + } + + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function set($def, $config) + { + $status = parent::set($def, $config); + if ($status) { + $this->definitions[$this->generateKey($config)] = $def; + } + return $status; + } + + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function replace($def, $config) + { + $status = parent::replace($def, $config); + if ($status) { + $this->definitions[$this->generateKey($config)] = $def; + } + return $status; + } + + /** + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function get($config) + { + $key = $this->generateKey($config); + if (isset($this->definitions[$key])) { + return $this->definitions[$key]; + } + $this->definitions[$key] = parent::get($config); + return $this->definitions[$key]; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in new file mode 100644 index 000000000..b1fec8d36 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in @@ -0,0 +1,82 @@ +checkDefType($def)) return; + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return int|bool + */ + public function add($def, $config) + { + if (!$this->checkDefType($def)) { + return; + } $file = $this->generateFilePath($config); - if (file_exists($file)) return false; - if (!$this->_prepareDir($config)) return false; + if (file_exists($file)) { + return false; + } + if (!$this->_prepareDir($config)) { + return false; + } return $this->_write($file, serialize($def), $config); } - public function set($def, $config) { - if (!$this->checkDefType($def)) return; + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return int|bool + */ + public function set($def, $config) + { + if (!$this->checkDefType($def)) { + return; + } $file = $this->generateFilePath($config); - if (!$this->_prepareDir($config)) return false; + if (!$this->_prepareDir($config)) { + return false; + } return $this->_write($file, serialize($def), $config); } - public function replace($def, $config) { - if (!$this->checkDefType($def)) return; + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return int|bool + */ + public function replace($def, $config) + { + if (!$this->checkDefType($def)) { + return; + } $file = $this->generateFilePath($config); - if (!file_exists($file)) return false; - if (!$this->_prepareDir($config)) return false; + if (!file_exists($file)) { + return false; + } + if (!$this->_prepareDir($config)) { + return false; + } return $this->_write($file, serialize($def), $config); } - public function get($config) { + /** + * @param HTMLPurifier_Config $config + * @return bool|HTMLPurifier_Config + */ + public function get($config) + { $file = $this->generateFilePath($config); - if (!file_exists($file)) return false; + if (!file_exists($file)) { + return false; + } return unserialize(file_get_contents($file)); } - public function remove($config) { + /** + * @param HTMLPurifier_Config $config + * @return bool + */ + public function remove($config) + { $file = $this->generateFilePath($config); - if (!file_exists($file)) return false; + if (!file_exists($file)) { + return false; + } return unlink($file); } - public function flush($config) { - if (!$this->_prepareDir($config)) return false; + /** + * @param HTMLPurifier_Config $config + * @return bool + */ + public function flush($config) + { + if (!$this->_prepareDir($config)) { + return false; + } $dir = $this->generateDirectoryPath($config); - $dh = opendir($dir); + $dh = opendir($dir); while (false !== ($filename = readdir($dh))) { - if (empty($filename)) continue; - if ($filename[0] === '.') continue; + if (empty($filename)) { + continue; + } + if ($filename[0] === '.') { + continue; + } unlink($dir . '/' . $filename); } } - public function cleanup($config) { - if (!$this->_prepareDir($config)) return false; + /** + * @param HTMLPurifier_Config $config + * @return bool + */ + public function cleanup($config) + { + if (!$this->_prepareDir($config)) { + return false; + } $dir = $this->generateDirectoryPath($config); - $dh = opendir($dir); + $dh = opendir($dir); while (false !== ($filename = readdir($dh))) { - if (empty($filename)) continue; - if ($filename[0] === '.') continue; + if (empty($filename)) { + continue; + } + if ($filename[0] === '.') { + continue; + } $key = substr($filename, 0, strlen($filename) - 4); - if ($this->isOld($key, $config)) unlink($dir . '/' . $filename); + if ($this->isOld($key, $config)) { + unlink($dir . '/' . $filename); + } } } /** * Generates the file path to the serial file corresponding to * the configuration and definition name + * @param HTMLPurifier_Config $config + * @return string * @todo Make protected */ - public function generateFilePath($config) { + public function generateFilePath($config) + { $key = $this->generateKey($config); return $this->generateDirectoryPath($config) . '/' . $key . '.ser'; } /** * Generates the path to the directory contain this cache's serial files + * @param HTMLPurifier_Config $config + * @return string * @note No trailing slash * @todo Make protected */ - public function generateDirectoryPath($config) { + public function generateDirectoryPath($config) + { $base = $this->generateBaseDirectoryPath($config); return $base . '/' . $this->type; } @@ -85,9 +162,12 @@ class HTMLPurifier_DefinitionCache_Serializer extends /** * Generates path to base directory that contains all definition type * serials + * @param HTMLPurifier_Config $config + * @return mixed|string * @todo Make protected */ - public function generateBaseDirectoryPath($config) { + public function generateBaseDirectoryPath($config) + { $base = $config->get('Cache.SerializerPath'); $base = is_null($base) ? HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer' : $base; return $base; @@ -95,12 +175,13 @@ class HTMLPurifier_DefinitionCache_Serializer extends /** * Convenience wrapper function for file_put_contents - * @param $file File name to write to - * @param $data Data to write into file - * @param $config Config object - * @return Number of bytes written if success, or false if failure. + * @param string $file File name to write to + * @param string $data Data to write into file + * @param HTMLPurifier_Config $config + * @return int|bool Number of bytes written if success, or false if failure. */ - private function _write($file, $data, $config) { + private function _write($file, $data, $config) + { $result = file_put_contents($file, $data); if ($result !== false) { // set permissions of the new file (no execute) @@ -116,10 +197,11 @@ class HTMLPurifier_DefinitionCache_Serializer extends /** * Prepares the directory that this type stores the serials in - * @param $config Config object - * @return True if successful + * @param HTMLPurifier_Config $config + * @return bool True if successful */ - private function _prepareDir($config) { + private function _prepareDir($config) + { $directory = $this->generateDirectoryPath($config); $chmod = $config->get('Cache.SerializerPermissions'); if (!$chmod) { @@ -128,9 +210,11 @@ class HTMLPurifier_DefinitionCache_Serializer extends if (!is_dir($directory)) { $base = $this->generateBaseDirectoryPath($config); if (!is_dir($base)) { - trigger_error('Base directory '.$base.' does not exist, + trigger_error( + 'Base directory ' . $base . ' does not exist, please create or change using %Cache.SerializerPath', - E_USER_WARNING); + E_USER_WARNING + ); return false; } elseif (!$this->_testPermissions($base, $chmod)) { return false; @@ -147,18 +231,23 @@ class HTMLPurifier_DefinitionCache_Serializer extends /** * Tests permissions on a directory and throws out friendly * error messages and attempts to chmod it itself if possible - * @param $dir Directory path - * @param $chmod Permissions - * @return True if directory writable + * @param string $dir Directory path + * @param int $chmod Permissions + * @return bool True if directory is writable */ - private function _testPermissions($dir, $chmod) { + private function _testPermissions($dir, $chmod) + { // early abort, if it is writable, everything is hunky-dory - if (is_writable($dir)) return true; + if (is_writable($dir)) { + return true; + } if (!is_dir($dir)) { // generally, you'll want to handle this beforehand // so a more specific error message can be given - trigger_error('Directory '.$dir.' does not exist', - E_USER_WARNING); + trigger_error( + 'Directory ' . $dir . ' does not exist', + E_USER_WARNING + ); return false; } if (function_exists('posix_getuid')) { @@ -166,7 +255,9 @@ class HTMLPurifier_DefinitionCache_Serializer extends if (fileowner($dir) === posix_getuid()) { // we can chmod it ourselves $chmod = $chmod | 0700; - if (chmod($dir, $chmod)) return true; + if (chmod($dir, $chmod)) { + return true; + } } elseif (filegroup($dir) === posix_getgid()) { $chmod = $chmod | 0070; } else { @@ -174,18 +265,21 @@ class HTMLPurifier_DefinitionCache_Serializer extends // need to give global permissions $chmod = $chmod | 0777; } - trigger_error('Directory '.$dir.' not writable, '. + trigger_error( + 'Directory ' . $dir . ' not writable, ' . 'please chmod to ' . decoct($chmod), - E_USER_WARNING); + E_USER_WARNING + ); } else { // generic error message - trigger_error('Directory '.$dir.' not writable, '. + trigger_error( + 'Directory ' . $dir . ' not writable, ' . 'please alter file permissions', - E_USER_WARNING); + E_USER_WARNING + ); } return false; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCache/Serializer/README b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCache/Serializer/README old mode 100644 new mode 100755 similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCache/Serializer/README rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCache/Serializer/README diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCacheFactory.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCacheFactory.php similarity index 67% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCacheFactory.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCacheFactory.php index a6ead6281..fd1cc9be4 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DefinitionCacheFactory.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DefinitionCacheFactory.php @@ -5,22 +5,36 @@ */ class HTMLPurifier_DefinitionCacheFactory { - + /** + * @type array + */ protected $caches = array('Serializer' => array()); + + /** + * @type array + */ protected $implementations = array(); + + /** + * @type HTMLPurifier_DefinitionCache_Decorator[] + */ protected $decorators = array(); /** * Initialize default decorators */ - public function setup() { + public function setup() + { $this->addDecorator('Cleanup'); } /** * Retrieves an instance of global definition cache factory. + * @param HTMLPurifier_DefinitionCacheFactory $prototype + * @return HTMLPurifier_DefinitionCacheFactory */ - public static function instance($prototype = null) { + public static function instance($prototype = null) + { static $instance; if ($prototype !== null) { $instance = $prototype; @@ -33,19 +47,22 @@ class HTMLPurifier_DefinitionCacheFactory /** * Registers a new definition cache object - * @param $short Short name of cache object, for reference - * @param $long Full class name of cache object, for construction + * @param string $short Short name of cache object, for reference + * @param string $long Full class name of cache object, for construction */ - public function register($short, $long) { + public function register($short, $long) + { $this->implementations[$short] = $long; } /** * Factory method that creates a cache object based on configuration - * @param $name Name of definitions handled by cache - * @param $config Instance of HTMLPurifier_Config + * @param string $type Name of definitions handled by cache + * @param HTMLPurifier_Config $config Config instance + * @return mixed */ - public function create($type, $config) { + public function create($type, $config) + { $method = $config->get('Cache.DefinitionImpl'); if ($method === null) { return new HTMLPurifier_DefinitionCache_Null($type); @@ -53,10 +70,8 @@ class HTMLPurifier_DefinitionCacheFactory if (!empty($this->caches[$method][$type])) { return $this->caches[$method][$type]; } - if ( - isset($this->implementations[$method]) && - class_exists($class = $this->implementations[$method], false) - ) { + if (isset($this->implementations[$method]) && + class_exists($class = $this->implementations[$method], false)) { $cache = new $class($type); } else { if ($method != 'Serializer') { @@ -76,16 +91,16 @@ class HTMLPurifier_DefinitionCacheFactory /** * Registers a decorator to add to all new cache objects - * @param + * @param HTMLPurifier_DefinitionCache_Decorator|string $decorator An instance or the name of a decorator */ - public function addDecorator($decorator) { + public function addDecorator($decorator) + { if (is_string($decorator)) { $class = "HTMLPurifier_DefinitionCache_Decorator_$decorator"; $decorator = new $class; } $this->decorators[$decorator->name] = $decorator; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Doctype.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Doctype.php similarity index 77% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Doctype.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Doctype.php index 1e3c574c0..4acd06e5b 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Doctype.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Doctype.php @@ -10,42 +10,55 @@ class HTMLPurifier_Doctype { /** * Full name of doctype + * @type string */ public $name; /** * List of standard modules (string identifiers or literal objects) * that this doctype uses + * @type array */ public $modules = array(); /** * List of modules to use for tidying up code + * @type array */ public $tidyModules = array(); /** * Is the language derived from XML (i.e. XHTML)? + * @type bool */ public $xml = true; /** * List of aliases for this doctype + * @type array */ public $aliases = array(); /** * Public DTD identifier + * @type string */ public $dtdPublic; /** * System DTD identifier + * @type string */ public $dtdSystem; - public function __construct($name = null, $xml = true, $modules = array(), - $tidyModules = array(), $aliases = array(), $dtd_public = null, $dtd_system = null + public function __construct( + $name = null, + $xml = true, + $modules = array(), + $tidyModules = array(), + $aliases = array(), + $dtd_public = null, + $dtd_system = null ) { $this->name = $name; $this->xml = $xml; diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DoctypeRegistry.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DoctypeRegistry.php similarity index 51% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DoctypeRegistry.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DoctypeRegistry.php index 86049e939..acc1d64a6 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/DoctypeRegistry.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/DoctypeRegistry.php @@ -4,12 +4,14 @@ class HTMLPurifier_DoctypeRegistry { /** - * Hash of doctype names to doctype objects + * Hash of doctype names to doctype objects. + * @type array */ protected $doctypes; /** - * Lookup table of aliases to real doctype names + * Lookup table of aliases to real doctype names. + * @type array */ protected $aliases; @@ -17,32 +19,57 @@ class HTMLPurifier_DoctypeRegistry * Registers a doctype to the registry * @note Accepts a fully-formed doctype object, or the * parameters for constructing a doctype object - * @param $doctype Name of doctype or literal doctype object - * @param $modules Modules doctype will load - * @param $modules_for_modes Modules doctype will load for certain modes - * @param $aliases Alias names for doctype - * @return Editable registered doctype + * @param string $doctype Name of doctype or literal doctype object + * @param bool $xml + * @param array $modules Modules doctype will load + * @param array $tidy_modules Modules doctype will load for certain modes + * @param array $aliases Alias names for doctype + * @param string $dtd_public + * @param string $dtd_system + * @return HTMLPurifier_Doctype Editable registered doctype */ - public function register($doctype, $xml = true, $modules = array(), - $tidy_modules = array(), $aliases = array(), $dtd_public = null, $dtd_system = null + public function register( + $doctype, + $xml = true, + $modules = array(), + $tidy_modules = array(), + $aliases = array(), + $dtd_public = null, + $dtd_system = null ) { - if (!is_array($modules)) $modules = array($modules); - if (!is_array($tidy_modules)) $tidy_modules = array($tidy_modules); - if (!is_array($aliases)) $aliases = array($aliases); + if (!is_array($modules)) { + $modules = array($modules); + } + if (!is_array($tidy_modules)) { + $tidy_modules = array($tidy_modules); + } + if (!is_array($aliases)) { + $aliases = array($aliases); + } if (!is_object($doctype)) { $doctype = new HTMLPurifier_Doctype( - $doctype, $xml, $modules, $tidy_modules, $aliases, $dtd_public, $dtd_system + $doctype, + $xml, + $modules, + $tidy_modules, + $aliases, + $dtd_public, + $dtd_system ); } $this->doctypes[$doctype->name] = $doctype; $name = $doctype->name; // hookup aliases foreach ($doctype->aliases as $alias) { - if (isset($this->doctypes[$alias])) continue; + if (isset($this->doctypes[$alias])) { + continue; + } $this->aliases[$alias] = $name; } // remove old aliases - if (isset($this->aliases[$name])) unset($this->aliases[$name]); + if (isset($this->aliases[$name])) { + unset($this->aliases[$name]); + } return $doctype; } @@ -50,11 +77,14 @@ class HTMLPurifier_DoctypeRegistry * Retrieves reference to a doctype of a certain name * @note This function resolves aliases * @note When possible, use the more fully-featured make() - * @param $doctype Name of doctype - * @return Editable doctype object + * @param string $doctype Name of doctype + * @return HTMLPurifier_Doctype Editable doctype object */ - public function get($doctype) { - if (isset($this->aliases[$doctype])) $doctype = $this->aliases[$doctype]; + public function get($doctype) + { + if (isset($this->aliases[$doctype])) { + $doctype = $this->aliases[$doctype]; + } if (!isset($this->doctypes[$doctype])) { trigger_error('Doctype ' . htmlspecialchars($doctype) . ' does not exist', E_USER_ERROR); $anon = new HTMLPurifier_Doctype($doctype); @@ -70,20 +100,30 @@ class HTMLPurifier_DoctypeRegistry * can hold on to (this is necessary in order to tell * Generator whether or not the current document is XML * based or not). + * @param HTMLPurifier_Config $config + * @return HTMLPurifier_Doctype */ - public function make($config) { + public function make($config) + { return clone $this->get($this->getDoctypeFromConfig($config)); } /** * Retrieves the doctype from the configuration object + * @param HTMLPurifier_Config $config + * @return string */ - public function getDoctypeFromConfig($config) { + public function getDoctypeFromConfig($config) + { // recommended test $doctype = $config->get('HTML.Doctype'); - if (!empty($doctype)) return $doctype; + if (!empty($doctype)) { + return $doctype; + } $doctype = $config->get('HTML.CustomDoctype'); - if (!empty($doctype)) return $doctype; + if (!empty($doctype)) { + return $doctype; + } // backwards-compatibility if ($config->get('HTML.XHTML')) { $doctype = 'XHTML 1.0'; @@ -97,7 +137,6 @@ class HTMLPurifier_DoctypeRegistry } return $doctype; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ElementDef.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ElementDef.php similarity index 83% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ElementDef.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ElementDef.php index 10f7ab7f8..d5311cedc 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ElementDef.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ElementDef.php @@ -10,15 +10,16 @@ */ class HTMLPurifier_ElementDef { - /** * Does the definition work by itself, or is it created solely * for the purpose of merging into another definition? + * @type bool */ public $standalone = true; /** - * Associative array of attribute name to HTMLPurifier_AttrDef + * Associative array of attribute name to HTMLPurifier_AttrDef. + * @type array * @note Before being processed by HTMLPurifier_AttrCollections * when modules are finalized during * HTMLPurifier_HTMLDefinition->setup(), this array may also @@ -43,26 +44,30 @@ class HTMLPurifier_ElementDef // nuking. /** - * List of tags HTMLPurifier_AttrTransform to be done before validation + * List of tags HTMLPurifier_AttrTransform to be done before validation. + * @type array */ public $attr_transform_pre = array(); /** - * List of tags HTMLPurifier_AttrTransform to be done after validation + * List of tags HTMLPurifier_AttrTransform to be done after validation. + * @type array */ public $attr_transform_post = array(); /** * HTMLPurifier_ChildDef of this tag. + * @type HTMLPurifier_ChildDef */ public $child; /** - * Abstract string representation of internal ChildDef rules. See - * HTMLPurifier_ContentSets for how this is parsed and then transformed + * Abstract string representation of internal ChildDef rules. + * @see HTMLPurifier_ContentSets for how this is parsed and then transformed * into an HTMLPurifier_ChildDef. * @warning This is a temporary variable that is not available after * being processed by HTMLDefinition + * @type string */ public $content_model; @@ -72,27 +77,29 @@ class HTMLPurifier_ElementDef * @warning This must be lowercase * @warning This is a temporary variable that is not available after * being processed by HTMLDefinition + * @type string */ public $content_model_type; - - /** * Does the element have a content model (#PCDATA | Inline)*? This * is important for chameleon ins and del processing in * HTMLPurifier_ChildDef_Chameleon. Dynamically set: modules don't * have to worry about this one. + * @type bool */ public $descendants_are_inline = false; /** - * List of the names of required attributes this element has. Dynamically - * populated by HTMLPurifier_HTMLDefinition::getElement + * List of the names of required attributes this element has. + * Dynamically populated by HTMLPurifier_HTMLDefinition::getElement() + * @type array */ public $required_attr = array(); /** * Lookup table of tags excluded from all descendants of this tag. + * @type array * @note SGML permits exclusions for all descendants, but this is * not possible with DTDs or XML Schemas. W3C has elected to * use complicated compositions of content_models to simulate @@ -106,6 +113,7 @@ class HTMLPurifier_ElementDef /** * This tag is explicitly auto-closed by the following tags. + * @type array */ public $autoclose = array(); @@ -113,19 +121,22 @@ class HTMLPurifier_ElementDef * If a foreign element is found in this element, test if it is * allowed by this sub-element; if it is, instead of closing the * current element, place it inside this element. + * @type string */ public $wrap; /** * Whether or not this is a formatting element affected by the * "Active Formatting Elements" algorithm. + * @type bool */ public $formatting; /** * Low-level factory constructor for creating new standalone element defs */ - public static function create($content_model, $content_model_type, $attr) { + public static function create($content_model, $content_model_type, $attr) + { $def = new HTMLPurifier_ElementDef(); $def->content_model = $content_model; $def->content_model_type = $content_model_type; @@ -137,11 +148,12 @@ class HTMLPurifier_ElementDef * Merges the values of another element definition into this one. * Values from the new element def take precedence if a value is * not mergeable. + * @param HTMLPurifier_ElementDef $def */ - public function mergeIn($def) { - + public function mergeIn($def) + { // later keys takes precedence - foreach($def->attr as $k => $v) { + foreach ($def->attr as $k => $v) { if ($k === 0) { // merge in the includes // sorry, no way to override an include @@ -151,7 +163,9 @@ class HTMLPurifier_ElementDef continue; } if ($v === false) { - if (isset($this->attr[$k])) unset($this->attr[$k]); + if (isset($this->attr[$k])) { + unset($this->attr[$k]); + } continue; } $this->attr[$k] = $v; @@ -160,19 +174,24 @@ class HTMLPurifier_ElementDef $this->attr_transform_pre = array_merge($this->attr_transform_pre, $def->attr_transform_pre); $this->attr_transform_post = array_merge($this->attr_transform_post, $def->attr_transform_post); - if(!empty($def->content_model)) { + if (!empty($def->content_model)) { $this->content_model = str_replace("#SUPER", $this->content_model, $def->content_model); $this->child = false; } - if(!empty($def->content_model_type)) { + if (!empty($def->content_model_type)) { $this->content_model_type = $def->content_model_type; $this->child = false; } - if(!is_null($def->child)) $this->child = $def->child; - if(!is_null($def->formatting)) $this->formatting = $def->formatting; - if($def->descendants_are_inline) $this->descendants_are_inline = $def->descendants_are_inline; - + if (!is_null($def->child)) { + $this->child = $def->child; + } + if (!is_null($def->formatting)) { + $this->formatting = $def->formatting; + } + if ($def->descendants_are_inline) { + $this->descendants_are_inline = $def->descendants_are_inline; + } } /** @@ -180,16 +199,18 @@ class HTMLPurifier_ElementDef * @param $a1 Array by reference that is merged into * @param $a2 Array that merges into $a1 */ - private function _mergeAssocArray(&$a1, $a2) { + private function _mergeAssocArray(&$a1, $a2) + { foreach ($a2 as $k => $v) { if ($v === false) { - if (isset($a1[$k])) unset($a1[$k]); + if (isset($a1[$k])) { + unset($a1[$k]); + } continue; } $a1[$k] = $v; } } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Encoder.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Encoder.php similarity index 85% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Encoder.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Encoder.php index 77988a192..fef9b5890 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Encoder.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Encoder.php @@ -10,19 +10,27 @@ class HTMLPurifier_Encoder /** * Constructor throws fatal error if you attempt to instantiate class */ - private function __construct() { + private function __construct() + { trigger_error('Cannot instantiate encoder, call methods statically', E_USER_ERROR); } /** * Error-handler that mutes errors, alternative to shut-up operator. */ - public static function muteErrorHandler() {} + public static function muteErrorHandler() + { + } /** * iconv wrapper which mutes errors, but doesn't work around bugs. + * @param string $in Input encoding + * @param string $out Output encoding + * @param string $text The text to convert + * @return string */ - public static function unsafeIconv($in, $out, $text) { + public static function unsafeIconv($in, $out, $text) + { set_error_handler(array('HTMLPurifier_Encoder', 'muteErrorHandler')); $r = iconv($in, $out, $text); restore_error_handler(); @@ -31,8 +39,14 @@ class HTMLPurifier_Encoder /** * iconv wrapper which mutes errors and works around bugs. + * @param string $in Input encoding + * @param string $out Output encoding + * @param string $text The text to convert + * @param int $max_chunk_size + * @return string */ - public static function iconv($in, $out, $text, $max_chunk_size = 8000) { + public static function iconv($in, $out, $text, $max_chunk_size = 8000) + { $code = self::testIconvTruncateBug(); if ($code == self::ICONV_OK) { return self::unsafeIconv($in, $out, $text); @@ -87,6 +101,10 @@ class HTMLPurifier_Encoder * It will parse according to UTF-8 and return a valid UTF8 string, with * non-SGML codepoints excluded. * + * @param string $str The string to clean + * @param bool $force_php + * @return string + * * @note Just for reference, the non-SGML code points are 0 to 31 and * 127 to 159, inclusive. However, we allow code points 9, 10 * and 13, which are the tab, line feed and carriage return @@ -106,14 +124,17 @@ class HTMLPurifier_Encoder * would need that, and I'm probably not going to implement them. * Once again, PHP 6 should solve all our problems. */ - public static function cleanUTF8($str, $force_php = false) { - + public static function cleanUTF8($str, $force_php = false) + { // UTF-8 validity is checked since PHP 4.3.5 // This is an optimization: if the string is already valid UTF-8, no // need to do PHP stuff. 99% of the time, this will be the case. // The regexp matches the XML char production, as well as well as excluding // non-SGML codepoints U+007F to U+009F - if (preg_match('/^[\x{9}\x{A}\x{D}\x{20}-\x{7E}\x{A0}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]*$/Du', $str)) { + if (preg_match( + '/^[\x{9}\x{A}\x{D}\x{20}-\x{7E}\x{A0}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]*$/Du', + $str + )) { return $str; } @@ -132,7 +153,7 @@ class HTMLPurifier_Encoder $char = ''; $len = strlen($str); - for($i = 0; $i < $len; $i++) { + for ($i = 0; $i < $len; $i++) { $in = ord($str{$i}); $char .= $str[$i]; // append byte to char if (0 == $mState) { @@ -285,8 +306,9 @@ class HTMLPurifier_Encoder // | 00000000 | 00010000 | 11111111 | 11111111 | Defined upper limit of legal scalar codes // +----------+----------+----------+----------+ - public static function unichr($code) { - if($code > 1114111 or $code < 0 or + public static function unichr($code) + { + if ($code > 1114111 or $code < 0 or ($code >= 55296 and $code <= 57343) ) { // bits are set outside the "valid" range as defined // by UNICODE 4.1.0 @@ -304,7 +326,7 @@ class HTMLPurifier_Encoder $y = (($code & 2047) >> 6) | 192; } else { $y = (($code & 4032) >> 6) | 128; - if($code < 65536) { + if ($code < 65536) { $z = (($code >> 12) & 15) | 224; } else { $z = (($code >> 12) & 63) | 128; @@ -314,15 +336,25 @@ class HTMLPurifier_Encoder } // set up the actual character $ret = ''; - if($w) $ret .= chr($w); - if($z) $ret .= chr($z); - if($y) $ret .= chr($y); + if ($w) { + $ret .= chr($w); + } + if ($z) { + $ret .= chr($z); + } + if ($y) { + $ret .= chr($y); + } $ret .= chr($x); return $ret; } - public static function iconvAvailable() { + /** + * @return bool + */ + public static function iconvAvailable() + { static $iconv = null; if ($iconv === null) { $iconv = function_exists('iconv') && self::testIconvTruncateBug() != self::ICONV_UNUSABLE; @@ -331,13 +363,22 @@ class HTMLPurifier_Encoder } /** - * Converts a string to UTF-8 based on configuration. + * Convert a string to UTF-8 based on configuration. + * @param string $str The string to convert + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string */ - public static function convertToUTF8($str, $config, $context) { + public static function convertToUTF8($str, $config, $context) + { $encoding = $config->get('Core.Encoding'); - if ($encoding === 'utf-8') return $str; + if ($encoding === 'utf-8') { + return $str; + } static $iconv = null; - if ($iconv === null) $iconv = self::iconvAvailable(); + if ($iconv === null) { + $iconv = self::iconvAvailable(); + } if ($iconv && !$config->get('Test.ForceNoIconv')) { // unaffected by bugs, since UTF-8 support all characters $str = self::unsafeIconv($encoding, 'utf-8//IGNORE', $str); @@ -359,29 +400,44 @@ class HTMLPurifier_Encoder if ($bug == self::ICONV_OK) { trigger_error('Encoding not supported, please install iconv', E_USER_ERROR); } else { - trigger_error('You have a buggy version of iconv, see https://bugs.php.net/bug.php?id=48147 and http://sourceware.org/bugzilla/show_bug.cgi?id=13541', E_USER_ERROR); + trigger_error( + 'You have a buggy version of iconv, see https://bugs.php.net/bug.php?id=48147 ' . + 'and http://sourceware.org/bugzilla/show_bug.cgi?id=13541', + E_USER_ERROR + ); } } /** * Converts a string from UTF-8 based on configuration. + * @param string $str The string to convert + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string * @note Currently, this is a lossy conversion, with unexpressable * characters being omitted. */ - public static function convertFromUTF8($str, $config, $context) { + public static function convertFromUTF8($str, $config, $context) + { $encoding = $config->get('Core.Encoding'); if ($escape = $config->get('Core.EscapeNonASCIICharacters')) { $str = self::convertToASCIIDumbLossless($str); } - if ($encoding === 'utf-8') return $str; + if ($encoding === 'utf-8') { + return $str; + } static $iconv = null; - if ($iconv === null) $iconv = self::iconvAvailable(); + if ($iconv === null) { + $iconv = self::iconvAvailable(); + } if ($iconv && !$config->get('Test.ForceNoIconv')) { // Undo our previous fix in convertToUTF8, otherwise iconv will barf $ascii_fix = self::testEncodingSupportsASCII($encoding); if (!$escape && !empty($ascii_fix)) { $clear_fix = array(); - foreach ($ascii_fix as $utf8 => $native) $clear_fix[$utf8] = ''; + foreach ($ascii_fix as $utf8 => $native) { + $clear_fix[$utf8] = ''; + } $str = strtr($str, $clear_fix); } $str = strtr($str, array_flip($ascii_fix)); @@ -401,8 +457,8 @@ class HTMLPurifier_Encoder /** * Lossless (character-wise) conversion of HTML to ASCII - * @param $str UTF-8 string to be converted to ASCII - * @returns ASCII encoded string with non-ASCII character entity-ized + * @param string $str UTF-8 string to be converted to ASCII + * @return string ASCII encoded string with non-ASCII character entity-ized * @warning Adapted from MediaWiki, claiming fair use: this is a common * algorithm. If you disagree with this license fudgery, * implement it yourself. @@ -415,27 +471,28 @@ class HTMLPurifier_Encoder * @note Sort of with cleanUTF8() but it assumes that $str is * well-formed UTF-8 */ - public static function convertToASCIIDumbLossless($str) { + public static function convertToASCIIDumbLossless($str) + { $bytesleft = 0; $result = ''; $working = 0; $len = strlen($str); - for( $i = 0; $i < $len; $i++ ) { - $bytevalue = ord( $str[$i] ); - if( $bytevalue <= 0x7F ) { //0xxx xxxx - $result .= chr( $bytevalue ); + for ($i = 0; $i < $len; $i++) { + $bytevalue = ord($str[$i]); + if ($bytevalue <= 0x7F) { //0xxx xxxx + $result .= chr($bytevalue); $bytesleft = 0; - } elseif( $bytevalue <= 0xBF ) { //10xx xxxx + } elseif ($bytevalue <= 0xBF) { //10xx xxxx $working = $working << 6; $working += ($bytevalue & 0x3F); $bytesleft--; - if( $bytesleft <= 0 ) { + if ($bytesleft <= 0) { $result .= "&#" . $working . ";"; } - } elseif( $bytevalue <= 0xDF ) { //110x xxxx + } elseif ($bytevalue <= 0xDF) { //110x xxxx $working = $bytevalue & 0x1F; $bytesleft = 1; - } elseif( $bytevalue <= 0xEF ) { //1110 xxxx + } elseif ($bytevalue <= 0xEF) { //1110 xxxx $working = $bytevalue & 0x0F; $bytesleft = 2; } else { //1111 0xxx @@ -469,9 +526,10 @@ class HTMLPurifier_Encoder * characters, as long as PHP ignores the error code. If PHP starts * paying attention to the error code, iconv becomes unusable. * - * @returns Error code indicating severity of bug. + * @return int Error code indicating severity of bug. */ - public static function testIconvTruncateBug() { + public static function testIconvTruncateBug() + { static $code = null; if ($code === null) { // better not use iconv, otherwise infinite loop! @@ -481,7 +539,11 @@ class HTMLPurifier_Encoder } elseif (($c = strlen($r)) < 9000) { $code = self::ICONV_TRUNCATES; } elseif ($c > 9000) { - trigger_error('Your copy of iconv is extremely buggy. Please notify HTML Purifier maintainers: include your iconv version as per phpversion()', E_USER_ERROR); + trigger_error( + 'Your copy of iconv is extremely buggy. Please notify HTML Purifier maintainers: ' . + 'include your iconv version as per phpversion()', + E_USER_ERROR + ); } else { $code = self::ICONV_OK; } @@ -500,7 +562,8 @@ class HTMLPurifier_Encoder * @return Array of UTF-8 characters to their corresponding ASCII, * which can be used to "undo" any overzealous iconv action. */ - public static function testEncodingSupportsASCII($encoding, $bypass = false) { + public static function testEncodingSupportsASCII($encoding, $bypass = false) + { // All calls to iconv here are unsafe, proof by case analysis: // If ICONV_OK, no difference. // If ICONV_TRUNCATE, all calls involve one character inputs, @@ -508,7 +571,9 @@ class HTMLPurifier_Encoder // If ICONV_UNUSABLE, this call is irrelevant static $encodings = array(); if (!$bypass) { - if (isset($encodings[$encoding])) return $encodings[$encoding]; + if (isset($encodings[$encoding])) { + return $encodings[$encoding]; + } $lenc = strtolower($encoding); switch ($lenc) { case 'shift_jis': @@ -516,15 +581,18 @@ class HTMLPurifier_Encoder case 'johab': return array("\xE2\x82\xA9" => '\\'); } - if (strpos($lenc, 'iso-8859-') === 0) return array(); + if (strpos($lenc, 'iso-8859-') === 0) { + return array(); + } } $ret = array(); - if (self::unsafeIconv('UTF-8', $encoding, 'a') === false) return false; + if (self::unsafeIconv('UTF-8', $encoding, 'a') === false) { + return false; + } for ($i = 0x20; $i <= 0x7E; $i++) { // all printable ASCII chars $c = chr($i); // UTF-8 char $r = self::unsafeIconv('UTF-8', "$encoding//IGNORE", $c); // initial conversion - if ( - $r === '' || + if ($r === '' || // This line is needed for iconv implementations that do not // omit characters that do not exist in the target character set ($r === $c && self::unsafeIconv($encoding, 'UTF-8//IGNORE', $r) !== $c) @@ -538,8 +606,6 @@ class HTMLPurifier_Encoder $encodings[$encoding] = $ret; return $ret; } - - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/EntityLookup.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/EntityLookup.php similarity index 75% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/EntityLookup.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/EntityLookup.php index b4dfce94c..f12ff13a3 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/EntityLookup.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/EntityLookup.php @@ -3,20 +3,23 @@ /** * Object that provides entity lookup table from entity name to character */ -class HTMLPurifier_EntityLookup { - +class HTMLPurifier_EntityLookup +{ /** * Assoc array of entity name to character represented. + * @type array */ public $table; /** * Sets up the entity lookup table from the serialized file contents. + * @param bool $file * @note The serialized contents are versioned, but were generated * using the maintenance script generate_entity_file.php * @warning This is not in constructor to help enforce the Singleton */ - public function setup($file = false) { + public function setup($file = false) + { if (!$file) { $file = HTMLPURIFIER_PREFIX . '/HTMLPurifier/EntityLookup/entities.ser'; } @@ -25,9 +28,11 @@ class HTMLPurifier_EntityLookup { /** * Retrieves sole instance of the object. - * @param Optional prototype of custom lookup table to overload with. + * @param bool|HTMLPurifier_EntityLookup $prototype Optional prototype of custom lookup table to overload with. + * @return HTMLPurifier_EntityLookup */ - public static function instance($prototype = false) { + public static function instance($prototype = false) + { // no references, since PHP doesn't copy unless modified static $instance = null; if ($prototype) { @@ -38,7 +43,6 @@ class HTMLPurifier_EntityLookup { } return $instance; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/EntityLookup/entities.ser b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/EntityLookup/entities.ser similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/EntityLookup/entities.ser rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/EntityLookup/entities.ser diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/EntityParser.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/EntityParser.php similarity index 75% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/EntityParser.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/EntityParser.php index 8c384472d..61529dcd9 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/EntityParser.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/EntityParser.php @@ -12,19 +12,21 @@ class HTMLPurifier_EntityParser /** * Reference to entity lookup table. + * @type HTMLPurifier_EntityLookup */ protected $_entity_lookup; /** * Callback regex string for parsing entities. + * @type string */ protected $_substituteEntitiesRegex = -'/&(?:[#]x([a-fA-F0-9]+)|[#]0*(\d+)|([A-Za-z_:][A-Za-z0-9.\-_:]*));?/'; -// 1. hex 2. dec 3. string (XML style) - + '/&(?:[#]x([a-fA-F0-9]+)|[#]0*(\d+)|([A-Za-z_:][A-Za-z0-9.\-_:]*));?/'; + // 1. hex 2. dec 3. string (XML style) /** * Decimal to parsed string conversion table for special entities. + * @type array */ protected $_special_dec2str = array( @@ -37,6 +39,7 @@ class HTMLPurifier_EntityParser /** * Stripped entity names to decimal conversion table for special entities. + * @type array */ protected $_special_ent2dec = array( @@ -51,41 +54,45 @@ class HTMLPurifier_EntityParser * running this whenever you have parsed character is t3h 5uck, we run * it before everything else. * - * @param $string String to have non-special entities parsed. - * @returns Parsed string. + * @param string $string String to have non-special entities parsed. + * @return string Parsed string. */ - public function substituteNonSpecialEntities($string) { + public function substituteNonSpecialEntities($string) + { // it will try to detect missing semicolons, but don't rely on it return preg_replace_callback( $this->_substituteEntitiesRegex, array($this, 'nonSpecialEntityCallback'), $string - ); + ); } /** * Callback function for substituteNonSpecialEntities() that does the work. * - * @param $matches PCRE matches array, with 0 the entire match, and + * @param array $matches PCRE matches array, with 0 the entire match, and * either index 1, 2 or 3 set with a hex value, dec value, * or string (respectively). - * @returns Replacement string. + * @return string Replacement string. */ - protected function nonSpecialEntityCallback($matches) { + protected function nonSpecialEntityCallback($matches) + { // replaces all but big five $entity = $matches[0]; $is_num = (@$matches[0][1] === '#'); if ($is_num) { $is_hex = (@$entity[2] === 'x'); $code = $is_hex ? hexdec($matches[1]) : (int) $matches[2]; - // abort for special characters - if (isset($this->_special_dec2str[$code])) return $entity; - + if (isset($this->_special_dec2str[$code])) { + return $entity; + } return HTMLPurifier_Encoder::unichr($code); } else { - if (isset($this->_special_ent2dec[$matches[3]])) return $entity; + if (isset($this->_special_ent2dec[$matches[3]])) { + return $entity; + } if (!$this->_entity_lookup) { $this->_entity_lookup = HTMLPurifier_EntityLookup::instance(); } @@ -103,14 +110,16 @@ class HTMLPurifier_EntityParser * @notice We try to avoid calling this function because otherwise, it * would have to be called a lot (for every parsed section). * - * @param $string String to have non-special entities parsed. - * @returns Parsed string. + * @param string $string String to have non-special entities parsed. + * @return string Parsed string. */ - public function substituteSpecialEntities($string) { + public function substituteSpecialEntities($string) + { return preg_replace_callback( $this->_substituteEntitiesRegex, array($this, 'specialEntityCallback'), - $string); + $string + ); } /** @@ -118,12 +127,13 @@ class HTMLPurifier_EntityParser * * This callback has same syntax as nonSpecialEntityCallback(). * - * @param $matches PCRE-style matches array, with 0 the entire match, and + * @param array $matches PCRE-style matches array, with 0 the entire match, and * either index 1, 2 or 3 set with a hex value, dec value, * or string (respectively). - * @returns Replacement string. + * @return string Replacement string. */ - protected function specialEntityCallback($matches) { + protected function specialEntityCallback($matches) + { $entity = $matches[0]; $is_num = (@$matches[0][1] === '#'); if ($is_num) { @@ -138,7 +148,6 @@ class HTMLPurifier_EntityParser $entity; } } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ErrorCollector.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ErrorCollector.php similarity index 82% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ErrorCollector.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ErrorCollector.php index 6713eaf77..d47e3f2e2 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ErrorCollector.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ErrorCollector.php @@ -16,16 +16,46 @@ class HTMLPurifier_ErrorCollector const MESSAGE = 2; const CHILDREN = 3; + /** + * @type array + */ protected $errors; + + /** + * @type array + */ protected $_current; + + /** + * @type array + */ protected $_stacks = array(array()); + + /** + * @type HTMLPurifier_Language + */ protected $locale; + + /** + * @type HTMLPurifier_Generator + */ protected $generator; + + /** + * @type HTMLPurifier_Context + */ protected $context; + /** + * @type array + */ protected $lines = array(); - public function __construct($context) { + /** + * @param HTMLPurifier_Context $context + */ + public function __construct($context) + { $this->locale =& $context->get('Locale'); $this->context = $context; $this->_current =& $this->_stacks[0]; @@ -34,13 +64,11 @@ class HTMLPurifier_ErrorCollector /** * Sends an error message to the collector for later use - * @param $severity int Error severity, PHP error style (don't use E_USER_) - * @param $msg string Error message text - * @param $subst1 string First substitution for $msg - * @param $subst2 string ... + * @param int $severity Error severity, PHP error style (don't use E_USER_) + * @param string $msg Error message text */ - public function send($severity, $msg) { - + public function send($severity, $msg) + { $args = array(); if (func_num_args() > 2) { $args = func_get_args(); @@ -50,7 +78,7 @@ class HTMLPurifier_ErrorCollector $token = $this->context->get('CurrentToken', true); $line = $token ? $token->line : $this->context->get('CurrentLine', true); - $col = $token ? $token->col : $this->context->get('CurrentCol', true); + $col = $token ? $token->col : $this->context->get('CurrentCol', true); $attr = $this->context->get('CurrentAttr', true); // perform special substitutions, also add custom parameters @@ -60,7 +88,9 @@ class HTMLPurifier_ErrorCollector } if (!is_null($attr)) { $subst['$CurrentAttr.Name'] = $attr; - if (isset($token->attr[$attr])) $subst['$CurrentAttr.Value'] = $token->attr[$attr]; + if (isset($token->attr[$attr])) { + $subst['$CurrentAttr.Value'] = $token->attr[$attr]; + } } if (empty($args)) { @@ -69,7 +99,9 @@ class HTMLPurifier_ErrorCollector $msg = $this->locale->formatMessage($msg, $args); } - if (!empty($subst)) $msg = strtr($msg, $subst); + if (!empty($subst)) { + $msg = strtr($msg, $subst); + } // (numerically indexed) $error = array( @@ -80,16 +112,15 @@ class HTMLPurifier_ErrorCollector ); $this->_current[] = $error; - // NEW CODE BELOW ... - - $struct = null; // Top-level errors are either: // TOKEN type, if $value is set appropriately, or // "syntax" type, if $value is null $new_struct = new HTMLPurifier_ErrorStruct(); $new_struct->type = HTMLPurifier_ErrorStruct::TOKEN; - if ($token) $new_struct->value = clone $token; + if ($token) { + $new_struct->value = clone $token; + } if (is_int($line) && is_int($col)) { if (isset($this->lines[$line][$col])) { $struct = $this->lines[$line][$col]; @@ -128,30 +159,34 @@ class HTMLPurifier_ErrorCollector /** * Retrieves raw error data for custom formatter to use - * @param List of arrays in format of array(line of error, - * error severity, error message, - * recursive sub-errors array) */ - public function getRaw() { + public function getRaw() + { return $this->errors; } /** * Default HTML formatting implementation for error messages - * @param $config Configuration array, vital for HTML output nature - * @param $errors Errors array to display; used for recursion. + * @param HTMLPurifier_Config $config Configuration, vital for HTML output nature + * @param array $errors Errors array to display; used for recursion. + * @return string */ - public function getHTMLFormatted($config, $errors = null) { + public function getHTMLFormatted($config, $errors = null) + { $ret = array(); $this->generator = new HTMLPurifier_Generator($config, $this->context); - if ($errors === null) $errors = $this->errors; + if ($errors === null) { + $errors = $this->errors; + } // 'At line' message needs to be removed // generation code for new structure goes here. It needs to be recursive. foreach ($this->lines as $line => $col_array) { - if ($line == -1) continue; + if ($line == -1) { + continue; + } foreach ($col_array as $col => $struct) { $this->_renderStruct($ret, $struct, $line, $col); } @@ -168,7 +203,8 @@ class HTMLPurifier_ErrorCollector } - private function _renderStruct(&$ret, $struct, $line = null, $col = null) { + private function _renderStruct(&$ret, $struct, $line = null, $col = null) + { $stack = array($struct); $context_stack = array(array()); while ($current = array_pop($stack)) { @@ -194,7 +230,7 @@ class HTMLPurifier_ErrorCollector //$string .= ''; $ret[] = $string; } - foreach ($current->children as $type => $array) { + foreach ($current->children as $array) { $context[] = $current; $stack = array_merge($stack, array_reverse($array, true)); for ($i = count($array); $i > 0; $i--) { @@ -203,7 +239,6 @@ class HTMLPurifier_ErrorCollector } } } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ErrorStruct.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ErrorStruct.php similarity index 81% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ErrorStruct.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ErrorStruct.php index 9bc8996ec..cf869d321 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/ErrorStruct.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/ErrorStruct.php @@ -19,6 +19,7 @@ class HTMLPurifier_ErrorStruct /** * Type of this struct. + * @type string */ public $type; @@ -28,11 +29,13 @@ class HTMLPurifier_ErrorStruct * - TOKEN: Instance of HTMLPurifier_Token * - ATTR: array('attr-name', 'value') * - CSSPROP: array('prop-name', 'value') + * @type mixed */ public $value; /** * Errors registered for this structure. + * @type array */ public $errors = array(); @@ -40,10 +43,17 @@ class HTMLPurifier_ErrorStruct * Child ErrorStructs that are from this structure. For example, a TOKEN * ErrorStruct would contain ATTR ErrorStructs. This is a multi-dimensional * array in structure: [TYPE]['identifier'] + * @type array */ public $children = array(); - public function getChild($type, $id) { + /** + * @param string $type + * @param string $id + * @return mixed + */ + public function getChild($type, $id) + { if (!isset($this->children[$type][$id])) { $this->children[$type][$id] = new HTMLPurifier_ErrorStruct(); $this->children[$type][$id]->type = $type; @@ -51,10 +61,14 @@ class HTMLPurifier_ErrorStruct return $this->children[$type][$id]; } - public function addError($severity, $message) { + /** + * @param int $severity + * @param string $message + */ + public function addError($severity, $message) + { $this->errors[] = array($severity, $message); } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Exception.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Exception.php similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Exception.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Exception.php diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Filter.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Filter.php similarity index 71% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Filter.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Filter.php index 9a0e7b09f..c1f41ee16 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Filter.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Filter.php @@ -23,24 +23,34 @@ class HTMLPurifier_Filter { /** - * Name of the filter for identification purposes + * Name of the filter for identification purposes. + * @type string */ public $name; /** * Pre-processor function, handles HTML before HTML Purifier + * @param string $html + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string */ - public function preFilter($html, $config, $context) { + public function preFilter($html, $config, $context) + { return $html; } /** * Post-processor function, handles HTML after HTML Purifier + * @param string $html + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string */ - public function postFilter($html, $config, $context) { + public function postFilter($html, $config, $context) + { return $html; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Filter/ExtractStyleBlocks.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Filter/ExtractStyleBlocks.php similarity index 87% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Filter/ExtractStyleBlocks.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Filter/ExtractStyleBlocks.php index df937ace7..08e62c16b 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Filter/ExtractStyleBlocks.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Filter/ExtractStyleBlocks.php @@ -4,7 +4,9 @@ // understand how to interpret this filter if it's a static method. // It's all really silly, but if we go this route it might be reasonable // to coalesce all of these methods into one. -function htmlpurifier_filter_extractstyleblocks_muteerrorhandler() {} +function htmlpurifier_filter_extractstyleblocks_muteerrorhandler() +{ +} /** * This filter extracts #isU', array($this, 'styleCallback'), $html); $style_blocks = $this->_styleMatches; $this->_styleMatches = array(); // reset @@ -69,12 +110,14 @@ class HTMLPurifier_Filter_ExtractStyleBlocks extends HTMLPurifier_Filter /** * Takes CSS (the stuff found in in a font-family prop). if ($config->get('Filter.ExtractStyleBlocks.Escaping')) { $css = str_replace( - array('<', '>', '&'), + array('<', '>', '&'), array('\3C ', '\3E ', '\26 '), $css ); } return $css; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Filter/YouTube.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Filter/YouTube.php new file mode 100644 index 000000000..411519ad6 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Filter/YouTube.php @@ -0,0 +1,65 @@ +]+>.+?' . + 'http://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?#s'; + $pre_replace = '\1'; + return preg_replace($pre_regex, $pre_replace, $html); + } + + /** + * @param string $html + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string + */ + public function postFilter($html, $config, $context) + { + $post_regex = '#((?:v|cp)/[A-Za-z0-9\-_=]+)#'; + return preg_replace_callback($post_regex, array($this, 'postFilterCallback'), $html); + } + + /** + * @param $url + * @return string + */ + protected function armorUrl($url) + { + return str_replace('--', '--', $url); + } + + /** + * @param array $matches + * @return string + */ + protected function postFilterCallback($matches) + { + $url = $this->armorUrl($matches[1]); + return '' . + '' . + '' . + ''; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Generator.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Generator.php similarity index 76% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Generator.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Generator.php index fee1a5f84..6fb568714 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Generator.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Generator.php @@ -11,52 +11,61 @@ class HTMLPurifier_Generator { /** - * Whether or not generator should produce XML output + * Whether or not generator should produce XML output. + * @type bool */ private $_xhtml = true; /** - * :HACK: Whether or not generator should comment the insides of )#si', - array($this, 'scriptCallback'), $html); + $html = preg_replace_callback( + '#(]*>)(\s*[^<].+?)()#si', + array($this, 'scriptCallback'), + $html + ); } $html = $this->normalize($html, $config, $context); @@ -55,15 +69,15 @@ class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer if ($maintain_line_numbers) { $current_line = 1; - $current_col = 0; + $current_col = 0; $length = strlen($html); } else { $current_line = false; - $current_col = false; + $current_col = false; $length = false; } $context->register('CurrentLine', $current_line); - $context->register('CurrentCol', $current_col); + $context->register('CurrentCol', $current_col); $nl = "\n"; // how often to manually recalculate. This will ALWAYS be right, // but it's pretty wasteful. Set to 0 to turn off @@ -77,16 +91,14 @@ class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer // for testing synchronization $loops = 0; - while(++$loops) { - + while (++$loops) { // $cursor is either at the start of a token, or inside of // a tag (i.e. there was a < immediately before it), as indicated // by $inside_tag if ($maintain_line_numbers) { - // $rcursor, however, is always at the start of a token. - $rcursor = $cursor - (int) $inside_tag; + $rcursor = $cursor - (int)$inside_tag; // Column number is cheap, so we calculate it every round. // We're interested at the *end* of the newline string, so @@ -96,14 +108,11 @@ class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer $current_col = $rcursor - (is_bool($nl_pos) ? 0 : $nl_pos + 1); // recalculate lines - if ( - $synchronize_interval && // synchronization is on - $cursor > 0 && // cursor is further than zero - $loops % $synchronize_interval === 0 // time to synchronize! - ) { + if ($synchronize_interval && // synchronization is on + $cursor > 0 && // cursor is further than zero + $loops % $synchronize_interval === 0) { // time to synchronize! $current_line = 1 + $this->substrCount($html, $nl, 0, $cursor); } - } $position_next_lt = strpos($html, '<', $cursor); @@ -119,35 +128,42 @@ class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer if (!$inside_tag && $position_next_lt !== false) { // We are not inside tag and there still is another tag to parse $token = new - HTMLPurifier_Token_Text( - $this->parseData( - substr( - $html, $cursor, $position_next_lt - $cursor - ) + HTMLPurifier_Token_Text( + $this->parseData( + substr( + $html, + $cursor, + $position_next_lt - $cursor ) - ); + ) + ); if ($maintain_line_numbers) { $token->rawPosition($current_line, $current_col); $current_line += $this->substrCount($html, $nl, $cursor, $position_next_lt - $cursor); } $array[] = $token; - $cursor = $position_next_lt + 1; + $cursor = $position_next_lt + 1; $inside_tag = true; continue; } elseif (!$inside_tag) { // We are not inside tag but there are no more tags // If we're already at the end, break - if ($cursor === strlen($html)) break; + if ($cursor === strlen($html)) { + break; + } // Create Text of rest of string $token = new - HTMLPurifier_Token_Text( - $this->parseData( - substr( - $html, $cursor - ) + HTMLPurifier_Token_Text( + $this->parseData( + substr( + $html, + $cursor ) - ); - if ($maintain_line_numbers) $token->rawPosition($current_line, $current_col); + ) + ); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + } $array[] = $token; break; } elseif ($inside_tag && $position_next_gt !== false) { @@ -171,16 +187,16 @@ class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer } // Check if it's a comment - if ( - substr($segment, 0, 3) === '!--' - ) { + if (substr($segment, 0, 3) === '!--') { // re-determine segment length, looking for --> $position_comment_end = strpos($html, '-->', $cursor); if ($position_comment_end === false) { // uh oh, we have a comment that extends to // infinity. Can't be helped: set comment // end position to end of string - if ($e) $e->send(E_WARNING, 'Lexer: Unclosed comment'); + if ($e) { + $e->send(E_WARNING, 'Lexer: Unclosed comment'); + } $position_comment_end = strlen($html); $end = true; } else { @@ -189,11 +205,13 @@ class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer $strlen_segment = $position_comment_end - $cursor; $segment = substr($html, $cursor, $strlen_segment); $token = new - HTMLPurifier_Token_Comment( - substr( - $segment, 3, $strlen_segment - 3 - ) - ); + HTMLPurifier_Token_Comment( + substr( + $segment, + 3, + $strlen_segment - 3 + ) + ); if ($maintain_line_numbers) { $token->rawPosition($current_line, $current_col); $current_line += $this->substrCount($html, $nl, $cursor, $strlen_segment); @@ -205,7 +223,7 @@ class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer } // Check if it's an end tag - $is_end_tag = (strpos($segment,'/') === 0); + $is_end_tag = (strpos($segment, '/') === 0); if ($is_end_tag) { $type = substr($segment, 1); $token = new HTMLPurifier_Token_End($type); @@ -224,7 +242,9 @@ class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer // text and go our merry way if (!ctype_alpha($segment[0])) { // XML: $segment[0] !== '_' && $segment[0] !== ':' - if ($e) $e->send(E_NOTICE, 'Lexer: Unescaped lt'); + if ($e) { + $e->send(E_NOTICE, 'Lexer: Unescaped lt'); + } $token = new HTMLPurifier_Token_Text('<'); if ($maintain_line_numbers) { $token->rawPosition($current_line, $current_col); @@ -239,7 +259,7 @@ class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer // trailing slash. Remember, we could have a tag like
, so // any later token processing scripts must convert improperly // classified EmptyTags from StartTags. - $is_self_closing = (strrpos($segment,'/') === $strlen_segment-1); + $is_self_closing = (strrpos($segment, '/') === $strlen_segment - 1); if ($is_self_closing) { $strlen_segment--; $segment = substr($segment, 0, $strlen_segment); @@ -269,14 +289,16 @@ class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer $attribute_string = trim( substr( - $segment, $position_first_space + $segment, + $position_first_space ) ); if ($attribute_string) { $attr = $this->parseAttributeString( - $attribute_string - , $config, $context - ); + $attribute_string, + $config, + $context + ); } else { $attr = array(); } @@ -296,15 +318,19 @@ class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer continue; } else { // inside tag, but there's no ending > sign - if ($e) $e->send(E_WARNING, 'Lexer: Missing gt'); + if ($e) { + $e->send(E_WARNING, 'Lexer: Missing gt'); + } $token = new - HTMLPurifier_Token_Text( - '<' . - $this->parseData( - substr($html, $cursor) - ) - ); - if ($maintain_line_numbers) $token->rawPosition($current_line, $current_col); + HTMLPurifier_Token_Text( + '<' . + $this->parseData( + substr($html, $cursor) + ) + ); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + } // no cursor scroll? Hmm... $array[] = $token; break; @@ -319,8 +345,14 @@ class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer /** * PHP 5.0.x compatible substr_count that implements offset and length + * @param string $haystack + * @param string $needle + * @param int $offset + * @param int $length + * @return int */ - protected function substrCount($haystack, $needle, $offset, $length) { + protected function substrCount($haystack, $needle, $offset, $length) + { static $oldVersion; if ($oldVersion === null) { $oldVersion = version_compare(PHP_VERSION, '5.1', '<'); @@ -336,13 +368,18 @@ class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer /** * Takes the inside of an HTML tag and makes an assoc array of attributes. * - * @param $string Inside of tag excluding name. - * @returns Assoc array of attributes. + * @param string $string Inside of tag excluding name. + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array Assoc array of attributes. */ - public function parseAttributeString($string, $config, $context) { - $string = (string) $string; // quick typecast + public function parseAttributeString($string, $config, $context) + { + $string = (string)$string; // quick typecast - if ($string == '') return array(); // no attributes + if ($string == '') { + return array(); + } // no attributes $e = false; if ($config->get('Core.CollectErrors')) { @@ -361,46 +398,55 @@ class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer list($key, $quoted_value) = explode('=', $string); $quoted_value = trim($quoted_value); if (!$key) { - if ($e) $e->send(E_ERROR, 'Lexer: Missing attribute key'); + if ($e) { + $e->send(E_ERROR, 'Lexer: Missing attribute key'); + } return array(); } - if (!$quoted_value) return array($key => ''); + if (!$quoted_value) { + return array($key => ''); + } $first_char = @$quoted_value[0]; - $last_char = @$quoted_value[strlen($quoted_value)-1]; + $last_char = @$quoted_value[strlen($quoted_value) - 1]; $same_quote = ($first_char == $last_char); $open_quote = ($first_char == '"' || $first_char == "'"); - if ( $same_quote && $open_quote) { + if ($same_quote && $open_quote) { // well behaved $value = substr($quoted_value, 1, strlen($quoted_value) - 2); } else { // not well behaved if ($open_quote) { - if ($e) $e->send(E_ERROR, 'Lexer: Missing end quote'); + if ($e) { + $e->send(E_ERROR, 'Lexer: Missing end quote'); + } $value = substr($quoted_value, 1); } else { $value = $quoted_value; } } - if ($value === false) $value = ''; + if ($value === false) { + $value = ''; + } return array($key => $this->parseData($value)); } // setup loop environment - $array = array(); // return assoc array of attributes + $array = array(); // return assoc array of attributes $cursor = 0; // current position in string (moves forward) - $size = strlen($string); // size of the string (stays the same) + $size = strlen($string); // size of the string (stays the same) // if we have unquoted attributes, the parser expects a terminating // space, so let's guarantee that there's always a terminating space. $string .= ' '; - while(true) { - - if ($cursor >= $size) { - break; + $old_cursor = -1; + while ($cursor < $size) { + if ($old_cursor >= $cursor) { + throw new Exception("Infinite loop detected"); } + $old_cursor = $cursor; $cursor += ($value = strspn($string, $this->_whitespace, $cursor)); // grab the key @@ -415,8 +461,10 @@ class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer $key = substr($string, $key_begin, $key_end - $key_begin); if (!$key) { - if ($e) $e->send(E_ERROR, 'Lexer: Missing attribute key'); - $cursor += strcspn($string, $this->_whitespace, $cursor + 1); // prevent infinite loop + if ($e) { + $e->send(E_ERROR, 'Lexer: Missing attribute key'); + } + $cursor += 1 + strcspn($string, $this->_whitespace, $cursor + 1); // prevent infinite loop continue; // empty key } @@ -467,24 +515,25 @@ class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer } $value = substr($string, $value_begin, $value_end - $value_begin); - if ($value === false) $value = ''; + if ($value === false) { + $value = ''; + } $array[$key] = $this->parseData($value); $cursor++; - } else { // boolattr if ($key !== '') { $array[$key] = $key; } else { // purely theoretical - if ($e) $e->send(E_ERROR, 'Lexer: Missing attribute key'); + if ($e) { + $e->send(E_ERROR, 'Lexer: Missing attribute key'); + } } - } } return $array; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Lexer/PH5P.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Lexer/PH5P.php new file mode 100644 index 000000000..a4587e4cd --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Lexer/PH5P.php @@ -0,0 +1,4788 @@ +normalize($html, $config, $context); + $new_html = $this->wrapHTML($new_html, $config, $context); + try { + $parser = new HTML5($new_html); + $doc = $parser->save(); + } catch (DOMException $e) { + // Uh oh, it failed. Punt to DirectLex. + $lexer = new HTMLPurifier_Lexer_DirectLex(); + $context->register('PH5PError', $e); // save the error, so we can detect it + return $lexer->tokenizeHTML($html, $config, $context); // use original HTML + } + $tokens = array(); + $this->tokenizeDOM( + $doc->getElementsByTagName('html')->item(0)-> // + getElementsByTagName('body')->item(0)-> // + getElementsByTagName('div')->item(0) //

+ , + $tokens + ); + return $tokens; + } +} + +/* + +Copyright 2007 Jeroen van der Meer + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*/ + +class HTML5 +{ + private $data; + private $char; + private $EOF; + private $state; + private $tree; + private $token; + private $content_model; + private $escape = false; + private $entities = array( + 'AElig;', + 'AElig', + 'AMP;', + 'AMP', + 'Aacute;', + 'Aacute', + 'Acirc;', + 'Acirc', + 'Agrave;', + 'Agrave', + 'Alpha;', + 'Aring;', + 'Aring', + 'Atilde;', + 'Atilde', + 'Auml;', + 'Auml', + 'Beta;', + 'COPY;', + 'COPY', + 'Ccedil;', + 'Ccedil', + 'Chi;', + 'Dagger;', + 'Delta;', + 'ETH;', + 'ETH', + 'Eacute;', + 'Eacute', + 'Ecirc;', + 'Ecirc', + 'Egrave;', + 'Egrave', + 'Epsilon;', + 'Eta;', + 'Euml;', + 'Euml', + 'GT;', + 'GT', + 'Gamma;', + 'Iacute;', + 'Iacute', + 'Icirc;', + 'Icirc', + 'Igrave;', + 'Igrave', + 'Iota;', + 'Iuml;', + 'Iuml', + 'Kappa;', + 'LT;', + 'LT', + 'Lambda;', + 'Mu;', + 'Ntilde;', + 'Ntilde', + 'Nu;', + 'OElig;', + 'Oacute;', + 'Oacute', + 'Ocirc;', + 'Ocirc', + 'Ograve;', + 'Ograve', + 'Omega;', + 'Omicron;', + 'Oslash;', + 'Oslash', + 'Otilde;', + 'Otilde', + 'Ouml;', + 'Ouml', + 'Phi;', + 'Pi;', + 'Prime;', + 'Psi;', + 'QUOT;', + 'QUOT', + 'REG;', + 'REG', + 'Rho;', + 'Scaron;', + 'Sigma;', + 'THORN;', + 'THORN', + 'TRADE;', + 'Tau;', + 'Theta;', + 'Uacute;', + 'Uacute', + 'Ucirc;', + 'Ucirc', + 'Ugrave;', + 'Ugrave', + 'Upsilon;', + 'Uuml;', + 'Uuml', + 'Xi;', + 'Yacute;', + 'Yacute', + 'Yuml;', + 'Zeta;', + 'aacute;', + 'aacute', + 'acirc;', + 'acirc', + 'acute;', + 'acute', + 'aelig;', + 'aelig', + 'agrave;', + 'agrave', + 'alefsym;', + 'alpha;', + 'amp;', + 'amp', + 'and;', + 'ang;', + 'apos;', + 'aring;', + 'aring', + 'asymp;', + 'atilde;', + 'atilde', + 'auml;', + 'auml', + 'bdquo;', + 'beta;', + 'brvbar;', + 'brvbar', + 'bull;', + 'cap;', + 'ccedil;', + 'ccedil', + 'cedil;', + 'cedil', + 'cent;', + 'cent', + 'chi;', + 'circ;', + 'clubs;', + 'cong;', + 'copy;', + 'copy', + 'crarr;', + 'cup;', + 'curren;', + 'curren', + 'dArr;', + 'dagger;', + 'darr;', + 'deg;', + 'deg', + 'delta;', + 'diams;', + 'divide;', + 'divide', + 'eacute;', + 'eacute', + 'ecirc;', + 'ecirc', + 'egrave;', + 'egrave', + 'empty;', + 'emsp;', + 'ensp;', + 'epsilon;', + 'equiv;', + 'eta;', + 'eth;', + 'eth', + 'euml;', + 'euml', + 'euro;', + 'exist;', + 'fnof;', + 'forall;', + 'frac12;', + 'frac12', + 'frac14;', + 'frac14', + 'frac34;', + 'frac34', + 'frasl;', + 'gamma;', + 'ge;', + 'gt;', + 'gt', + 'hArr;', + 'harr;', + 'hearts;', + 'hellip;', + 'iacute;', + 'iacute', + 'icirc;', + 'icirc', + 'iexcl;', + 'iexcl', + 'igrave;', + 'igrave', + 'image;', + 'infin;', + 'int;', + 'iota;', + 'iquest;', + 'iquest', + 'isin;', + 'iuml;', + 'iuml', + 'kappa;', + 'lArr;', + 'lambda;', + 'lang;', + 'laquo;', + 'laquo', + 'larr;', + 'lceil;', + 'ldquo;', + 'le;', + 'lfloor;', + 'lowast;', + 'loz;', + 'lrm;', + 'lsaquo;', + 'lsquo;', + 'lt;', + 'lt', + 'macr;', + 'macr', + 'mdash;', + 'micro;', + 'micro', + 'middot;', + 'middot', + 'minus;', + 'mu;', + 'nabla;', + 'nbsp;', + 'nbsp', + 'ndash;', + 'ne;', + 'ni;', + 'not;', + 'not', + 'notin;', + 'nsub;', + 'ntilde;', + 'ntilde', + 'nu;', + 'oacute;', + 'oacute', + 'ocirc;', + 'ocirc', + 'oelig;', + 'ograve;', + 'ograve', + 'oline;', + 'omega;', + 'omicron;', + 'oplus;', + 'or;', + 'ordf;', + 'ordf', + 'ordm;', + 'ordm', + 'oslash;', + 'oslash', + 'otilde;', + 'otilde', + 'otimes;', + 'ouml;', + 'ouml', + 'para;', + 'para', + 'part;', + 'permil;', + 'perp;', + 'phi;', + 'pi;', + 'piv;', + 'plusmn;', + 'plusmn', + 'pound;', + 'pound', + 'prime;', + 'prod;', + 'prop;', + 'psi;', + 'quot;', + 'quot', + 'rArr;', + 'radic;', + 'rang;', + 'raquo;', + 'raquo', + 'rarr;', + 'rceil;', + 'rdquo;', + 'real;', + 'reg;', + 'reg', + 'rfloor;', + 'rho;', + 'rlm;', + 'rsaquo;', + 'rsquo;', + 'sbquo;', + 'scaron;', + 'sdot;', + 'sect;', + 'sect', + 'shy;', + 'shy', + 'sigma;', + 'sigmaf;', + 'sim;', + 'spades;', + 'sub;', + 'sube;', + 'sum;', + 'sup1;', + 'sup1', + 'sup2;', + 'sup2', + 'sup3;', + 'sup3', + 'sup;', + 'supe;', + 'szlig;', + 'szlig', + 'tau;', + 'there4;', + 'theta;', + 'thetasym;', + 'thinsp;', + 'thorn;', + 'thorn', + 'tilde;', + 'times;', + 'times', + 'trade;', + 'uArr;', + 'uacute;', + 'uacute', + 'uarr;', + 'ucirc;', + 'ucirc', + 'ugrave;', + 'ugrave', + 'uml;', + 'uml', + 'upsih;', + 'upsilon;', + 'uuml;', + 'uuml', + 'weierp;', + 'xi;', + 'yacute;', + 'yacute', + 'yen;', + 'yen', + 'yuml;', + 'yuml', + 'zeta;', + 'zwj;', + 'zwnj;' + ); + + const PCDATA = 0; + const RCDATA = 1; + const CDATA = 2; + const PLAINTEXT = 3; + + const DOCTYPE = 0; + const STARTTAG = 1; + const ENDTAG = 2; + const COMMENT = 3; + const CHARACTR = 4; + const EOF = 5; + + public function __construct($data) + { + $this->data = $data; + $this->char = -1; + $this->EOF = strlen($data); + $this->tree = new HTML5TreeConstructer; + $this->content_model = self::PCDATA; + + $this->state = 'data'; + + while ($this->state !== null) { + $this->{$this->state . 'State'}(); + } + } + + public function save() + { + return $this->tree->save(); + } + + private function char() + { + return ($this->char < $this->EOF) + ? $this->data[$this->char] + : false; + } + + private function character($s, $l = 0) + { + if ($s + $l < $this->EOF) { + if ($l === 0) { + return $this->data[$s]; + } else { + return substr($this->data, $s, $l); + } + } + } + + private function characters($char_class, $start) + { + return preg_replace('#^([' . $char_class . ']+).*#s', '\\1', substr($this->data, $start)); + } + + private function dataState() + { + // Consume the next input character + $this->char++; + $char = $this->char(); + + if ($char === '&' && ($this->content_model === self::PCDATA || $this->content_model === self::RCDATA)) { + /* U+0026 AMPERSAND (&) + When the content model flag is set to one of the PCDATA or RCDATA + states: switch to the entity data state. Otherwise: treat it as per + the "anything else" entry below. */ + $this->state = 'entityData'; + + } elseif ($char === '-') { + /* If the content model flag is set to either the RCDATA state or + the CDATA state, and the escape flag is false, and there are at + least three characters before this one in the input stream, and the + last four characters in the input stream, including this one, are + U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS, + and U+002D HYPHEN-MINUS (""), + set the escape flag to false. */ + if (($this->content_model === self::RCDATA || + $this->content_model === self::CDATA) && $this->escape === true && + $this->character($this->char, 3) === '-->' + ) { + $this->escape = false; + } + + /* In any case, emit the input character as a character token. + Stay in the data state. */ + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => $char + ) + ); + + } elseif ($this->char === $this->EOF) { + /* EOF + Emit an end-of-file token. */ + $this->EOF(); + + } elseif ($this->content_model === self::PLAINTEXT) { + /* When the content model flag is set to the PLAINTEXT state + THIS DIFFERS GREATLY FROM THE SPEC: Get the remaining characters of + the text and emit it as a character token. */ + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => substr($this->data, $this->char) + ) + ); + + $this->EOF(); + + } else { + /* Anything else + THIS DIFFERS GREATLY FROM THE SPEC: Get as many character that + otherwise would also be treated as a character token and emit it + as a single character token. Stay in the data state. */ + $len = strcspn($this->data, '<&', $this->char); + $char = substr($this->data, $this->char, $len); + $this->char += $len - 1; + + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => $char + ) + ); + + $this->state = 'data'; + } + } + + private function entityDataState() + { + // Attempt to consume an entity. + $entity = $this->entity(); + + // If nothing is returned, emit a U+0026 AMPERSAND character token. + // Otherwise, emit the character token that was returned. + $char = (!$entity) ? '&' : $entity; + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => $char + ) + ); + + // Finally, switch to the data state. + $this->state = 'data'; + } + + private function tagOpenState() + { + switch ($this->content_model) { + case self::RCDATA: + case self::CDATA: + /* If the next input character is a U+002F SOLIDUS (/) character, + consume it and switch to the close tag open state. If the next + input character is not a U+002F SOLIDUS (/) character, emit a + U+003C LESS-THAN SIGN character token and switch to the data + state to process the next input character. */ + if ($this->character($this->char + 1) === '/') { + $this->char++; + $this->state = 'closeTagOpen'; + + } else { + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => '<' + ) + ); + + $this->state = 'data'; + } + break; + + case self::PCDATA: + // If the content model flag is set to the PCDATA state + // Consume the next input character: + $this->char++; + $char = $this->char(); + + if ($char === '!') { + /* U+0021 EXCLAMATION MARK (!) + Switch to the markup declaration open state. */ + $this->state = 'markupDeclarationOpen'; + + } elseif ($char === '/') { + /* U+002F SOLIDUS (/) + Switch to the close tag open state. */ + $this->state = 'closeTagOpen'; + + } elseif (preg_match('/^[A-Za-z]$/', $char)) { + /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z + Create a new start tag token, set its tag name to the lowercase + version of the input character (add 0x0020 to the character's code + point), then switch to the tag name state. (Don't emit the token + yet; further details will be filled in before it is emitted.) */ + $this->token = array( + 'name' => strtolower($char), + 'type' => self::STARTTAG, + 'attr' => array() + ); + + $this->state = 'tagName'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Parse error. Emit a U+003C LESS-THAN SIGN character token and a + U+003E GREATER-THAN SIGN character token. Switch to the data state. */ + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => '<>' + ) + ); + + $this->state = 'data'; + + } elseif ($char === '?') { + /* U+003F QUESTION MARK (?) + Parse error. Switch to the bogus comment state. */ + $this->state = 'bogusComment'; + + } else { + /* Anything else + Parse error. Emit a U+003C LESS-THAN SIGN character token and + reconsume the current input character in the data state. */ + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => '<' + ) + ); + + $this->char--; + $this->state = 'data'; + } + break; + } + } + + private function closeTagOpenState() + { + $next_node = strtolower($this->characters('A-Za-z', $this->char + 1)); + $the_same = count($this->tree->stack) > 0 && $next_node === end($this->tree->stack)->nodeName; + + if (($this->content_model === self::RCDATA || $this->content_model === self::CDATA) && + (!$the_same || ($the_same && (!preg_match( + '/[\t\n\x0b\x0c >\/]/', + $this->character($this->char + 1 + strlen($next_node)) + ) || $this->EOF === $this->char))) + ) { + /* If the content model flag is set to the RCDATA or CDATA states then + examine the next few characters. If they do not match the tag name of + the last start tag token emitted (case insensitively), or if they do but + they are not immediately followed by one of the following characters: + * U+0009 CHARACTER TABULATION + * U+000A LINE FEED (LF) + * U+000B LINE TABULATION + * U+000C FORM FEED (FF) + * U+0020 SPACE + * U+003E GREATER-THAN SIGN (>) + * U+002F SOLIDUS (/) + * EOF + ...then there is a parse error. Emit a U+003C LESS-THAN SIGN character + token, a U+002F SOLIDUS character token, and switch to the data state + to process the next input character. */ + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => 'state = 'data'; + + } else { + /* Otherwise, if the content model flag is set to the PCDATA state, + or if the next few characters do match that tag name, consume the + next input character: */ + $this->char++; + $char = $this->char(); + + if (preg_match('/^[A-Za-z]$/', $char)) { + /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z + Create a new end tag token, set its tag name to the lowercase version + of the input character (add 0x0020 to the character's code point), then + switch to the tag name state. (Don't emit the token yet; further details + will be filled in before it is emitted.) */ + $this->token = array( + 'name' => strtolower($char), + 'type' => self::ENDTAG + ); + + $this->state = 'tagName'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Parse error. Switch to the data state. */ + $this->state = 'data'; + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F + SOLIDUS character token. Reconsume the EOF character in the data state. */ + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => 'char--; + $this->state = 'data'; + + } else { + /* Parse error. Switch to the bogus comment state. */ + $this->state = 'bogusComment'; + } + } + } + + private function tagNameState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } elseif ($char === '/') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Switch to the before + attribute name state. */ + $this->state = 'beforeAttributeName'; + + } else { + /* Anything else + Append the current input character to the current tag token's tag name. + Stay in the tag name state. */ + $this->token['name'] .= strtolower($char); + $this->state = 'tagName'; + } + } + + private function beforeAttributeNameState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($char === '/') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Stay in the before + attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Start a new attribute in the current tag token. Set that attribute's + name to the current input character, and its value to the empty string. + Switch to the attribute name state. */ + $this->token['attr'][] = array( + 'name' => strtolower($char), + 'value' => null + ); + + $this->state = 'attributeName'; + } + } + + private function attributeNameState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the before attribute name state. */ + $this->state = 'afterAttributeName'; + + } elseif ($char === '=') { + /* U+003D EQUALS SIGN (=) + Switch to the before attribute value state. */ + $this->state = 'beforeAttributeValue'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($char === '/' && $this->character($this->char + 1) !== '>') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Switch to the before + attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's name. + Stay in the attribute name state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['name'] .= strtolower($char); + + $this->state = 'attributeName'; + } + } + + private function afterAttributeNameState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the after attribute name state. */ + $this->state = 'afterAttributeName'; + + } elseif ($char === '=') { + /* U+003D EQUALS SIGN (=) + Switch to the before attribute value state. */ + $this->state = 'beforeAttributeValue'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($char === '/' && $this->character($this->char + 1) !== '>') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Switch to the + before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Start a new attribute in the current tag token. Set that attribute's + name to the current input character, and its value to the empty string. + Switch to the attribute name state. */ + $this->token['attr'][] = array( + 'name' => strtolower($char), + 'value' => null + ); + + $this->state = 'attributeName'; + } + } + + private function beforeAttributeValueState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the before attribute value state. */ + $this->state = 'beforeAttributeValue'; + + } elseif ($char === '"') { + /* U+0022 QUOTATION MARK (") + Switch to the attribute value (double-quoted) state. */ + $this->state = 'attributeValueDoubleQuoted'; + + } elseif ($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the attribute value (unquoted) state and reconsume + this input character. */ + $this->char--; + $this->state = 'attributeValueUnquoted'; + + } elseif ($char === '\'') { + /* U+0027 APOSTROPHE (') + Switch to the attribute value (single-quoted) state. */ + $this->state = 'attributeValueSingleQuoted'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Switch to the attribute value (unquoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueUnquoted'; + } + } + + private function attributeValueDoubleQuotedState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if ($char === '"') { + /* U+0022 QUOTATION MARK (") + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the entity in attribute value state. */ + $this->entityInAttributeValueState('double'); + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the character + in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Stay in the attribute value (double-quoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueDoubleQuoted'; + } + } + + private function attributeValueSingleQuotedState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if ($char === '\'') { + /* U+0022 QUOTATION MARK (') + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the entity in attribute value state. */ + $this->entityInAttributeValueState('single'); + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the character + in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Stay in the attribute value (single-quoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueSingleQuoted'; + } + } + + private function attributeValueUnquotedState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the entity in attribute value state. */ + $this->entityInAttributeValueState(); + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Stay in the attribute value (unquoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueUnquoted'; + } + } + + private function entityInAttributeValueState() + { + // Attempt to consume an entity. + $entity = $this->entity(); + + // If nothing is returned, append a U+0026 AMPERSAND character to the + // current attribute's value. Otherwise, emit the character token that + // was returned. + $char = (!$entity) + ? '&' + : $entity; + + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + } + + private function bogusCommentState() + { + /* Consume every character up to the first U+003E GREATER-THAN SIGN + character (>) or the end of the file (EOF), whichever comes first. Emit + a comment token whose data is the concatenation of all the characters + starting from and including the character that caused the state machine + to switch into the bogus comment state, up to and including the last + consumed character before the U+003E character, if any, or up to the + end of the file otherwise. (If the comment was started by the end of + the file (EOF), the token is empty.) */ + $data = $this->characters('^>', $this->char); + $this->emitToken( + array( + 'data' => $data, + 'type' => self::COMMENT + ) + ); + + $this->char += strlen($data); + + /* Switch to the data state. */ + $this->state = 'data'; + + /* If the end of the file was reached, reconsume the EOF character. */ + if ($this->char === $this->EOF) { + $this->char = $this->EOF - 1; + } + } + + private function markupDeclarationOpenState() + { + /* If the next two characters are both U+002D HYPHEN-MINUS (-) + characters, consume those two characters, create a comment token whose + data is the empty string, and switch to the comment state. */ + if ($this->character($this->char + 1, 2) === '--') { + $this->char += 2; + $this->state = 'comment'; + $this->token = array( + 'data' => null, + 'type' => self::COMMENT + ); + + /* Otherwise if the next seven chacacters are a case-insensitive match + for the word "DOCTYPE", then consume those characters and switch to the + DOCTYPE state. */ + } elseif (strtolower($this->character($this->char + 1, 7)) === 'doctype') { + $this->char += 7; + $this->state = 'doctype'; + + /* Otherwise, is is a parse error. Switch to the bogus comment state. + The next character that is consumed, if any, is the first character + that will be in the comment. */ + } else { + $this->char++; + $this->state = 'bogusComment'; + } + } + + private function commentState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + /* U+002D HYPHEN-MINUS (-) */ + if ($char === '-') { + /* Switch to the comment dash state */ + $this->state = 'commentDash'; + + /* EOF */ + } elseif ($this->char === $this->EOF) { + /* Parse error. Emit the comment token. Reconsume the EOF character + in the data state. */ + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + /* Anything else */ + } else { + /* Append the input character to the comment token's data. Stay in + the comment state. */ + $this->token['data'] .= $char; + } + } + + private function commentDashState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + /* U+002D HYPHEN-MINUS (-) */ + if ($char === '-') { + /* Switch to the comment end state */ + $this->state = 'commentEnd'; + + /* EOF */ + } elseif ($this->char === $this->EOF) { + /* Parse error. Emit the comment token. Reconsume the EOF character + in the data state. */ + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + /* Anything else */ + } else { + /* Append a U+002D HYPHEN-MINUS (-) character and the input + character to the comment token's data. Switch to the comment state. */ + $this->token['data'] .= '-' . $char; + $this->state = 'comment'; + } + } + + private function commentEndState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if ($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($char === '-') { + $this->token['data'] .= '-'; + + } elseif ($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + $this->token['data'] .= '--' . $char; + $this->state = 'comment'; + } + } + + private function doctypeState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + $this->state = 'beforeDoctypeName'; + + } else { + $this->char--; + $this->state = 'beforeDoctypeName'; + } + } + + private function beforeDoctypeNameState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + // Stay in the before DOCTYPE name state. + + } elseif (preg_match('/^[a-z]$/', $char)) { + $this->token = array( + 'name' => strtoupper($char), + 'type' => self::DOCTYPE, + 'error' => true + ); + + $this->state = 'doctypeName'; + + } elseif ($char === '>') { + $this->emitToken( + array( + 'name' => null, + 'type' => self::DOCTYPE, + 'error' => true + ) + ); + + $this->state = 'data'; + + } elseif ($this->char === $this->EOF) { + $this->emitToken( + array( + 'name' => null, + 'type' => self::DOCTYPE, + 'error' => true + ) + ); + + $this->char--; + $this->state = 'data'; + + } else { + $this->token = array( + 'name' => $char, + 'type' => self::DOCTYPE, + 'error' => true + ); + + $this->state = 'doctypeName'; + } + } + + private function doctypeNameState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + $this->state = 'AfterDoctypeName'; + + } elseif ($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif (preg_match('/^[a-z]$/', $char)) { + $this->token['name'] .= strtoupper($char); + + } elseif ($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + $this->token['name'] .= $char; + } + + $this->token['error'] = ($this->token['name'] === 'HTML') + ? false + : true; + } + + private function afterDoctypeNameState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + // Stay in the DOCTYPE name state. + + } elseif ($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + $this->token['error'] = true; + $this->state = 'bogusDoctype'; + } + } + + private function bogusDoctypeState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if ($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + // Stay in the bogus DOCTYPE state. + } + } + + private function entity() + { + $start = $this->char; + + // This section defines how to consume an entity. This definition is + // used when parsing entities in text and in attributes. + + // The behaviour depends on the identity of the next character (the + // one immediately after the U+0026 AMPERSAND character): + + switch ($this->character($this->char + 1)) { + // U+0023 NUMBER SIGN (#) + case '#': + + // The behaviour further depends on the character after the + // U+0023 NUMBER SIGN: + switch ($this->character($this->char + 1)) { + // U+0078 LATIN SMALL LETTER X + // U+0058 LATIN CAPITAL LETTER X + case 'x': + case 'X': + // Follow the steps below, but using the range of + // characters U+0030 DIGIT ZERO through to U+0039 DIGIT + // NINE, U+0061 LATIN SMALL LETTER A through to U+0066 + // LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER + // A, through to U+0046 LATIN CAPITAL LETTER F (in other + // words, 0-9, A-F, a-f). + $char = 1; + $char_class = '0-9A-Fa-f'; + break; + + // Anything else + default: + // Follow the steps below, but using the range of + // characters U+0030 DIGIT ZERO through to U+0039 DIGIT + // NINE (i.e. just 0-9). + $char = 0; + $char_class = '0-9'; + break; + } + + // Consume as many characters as match the range of characters + // given above. + $this->char++; + $e_name = $this->characters($char_class, $this->char + $char + 1); + $entity = $this->character($start, $this->char); + $cond = strlen($e_name) > 0; + + // The rest of the parsing happens bellow. + break; + + // Anything else + default: + // Consume the maximum number of characters possible, with the + // consumed characters case-sensitively matching one of the + // identifiers in the first column of the entities table. + $e_name = $this->characters('0-9A-Za-z;', $this->char + 1); + $len = strlen($e_name); + + for ($c = 1; $c <= $len; $c++) { + $id = substr($e_name, 0, $c); + $this->char++; + + if (in_array($id, $this->entities)) { + if ($e_name[$c - 1] !== ';') { + if ($c < $len && $e_name[$c] == ';') { + $this->char++; // consume extra semicolon + } + } + $entity = $id; + break; + } + } + + $cond = isset($entity); + // The rest of the parsing happens bellow. + break; + } + + if (!$cond) { + // If no match can be made, then this is a parse error. No + // characters are consumed, and nothing is returned. + $this->char = $start; + return false; + } + + // Return a character token for the character corresponding to the + // entity name (as given by the second column of the entities table). + return html_entity_decode('&' . $entity . ';', ENT_QUOTES, 'UTF-8'); + } + + private function emitToken($token) + { + $emit = $this->tree->emitToken($token); + + if (is_int($emit)) { + $this->content_model = $emit; + + } elseif ($token['type'] === self::ENDTAG) { + $this->content_model = self::PCDATA; + } + } + + private function EOF() + { + $this->state = null; + $this->tree->emitToken( + array( + 'type' => self::EOF + ) + ); + } +} + +class HTML5TreeConstructer +{ + public $stack = array(); + + private $phase; + private $mode; + private $dom; + private $foster_parent = null; + private $a_formatting = array(); + + private $head_pointer = null; + private $form_pointer = null; + + private $scoping = array('button', 'caption', 'html', 'marquee', 'object', 'table', 'td', 'th'); + private $formatting = array( + 'a', + 'b', + 'big', + 'em', + 'font', + 'i', + 'nobr', + 's', + 'small', + 'strike', + 'strong', + 'tt', + 'u' + ); + private $special = array( + 'address', + 'area', + 'base', + 'basefont', + 'bgsound', + 'blockquote', + 'body', + 'br', + 'center', + 'col', + 'colgroup', + 'dd', + 'dir', + 'div', + 'dl', + 'dt', + 'embed', + 'fieldset', + 'form', + 'frame', + 'frameset', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'head', + 'hr', + 'iframe', + 'image', + 'img', + 'input', + 'isindex', + 'li', + 'link', + 'listing', + 'menu', + 'meta', + 'noembed', + 'noframes', + 'noscript', + 'ol', + 'optgroup', + 'option', + 'p', + 'param', + 'plaintext', + 'pre', + 'script', + 'select', + 'spacer', + 'style', + 'tbody', + 'textarea', + 'tfoot', + 'thead', + 'title', + 'tr', + 'ul', + 'wbr' + ); + + // The different phases. + const INIT_PHASE = 0; + const ROOT_PHASE = 1; + const MAIN_PHASE = 2; + const END_PHASE = 3; + + // The different insertion modes for the main phase. + const BEFOR_HEAD = 0; + const IN_HEAD = 1; + const AFTER_HEAD = 2; + const IN_BODY = 3; + const IN_TABLE = 4; + const IN_CAPTION = 5; + const IN_CGROUP = 6; + const IN_TBODY = 7; + const IN_ROW = 8; + const IN_CELL = 9; + const IN_SELECT = 10; + const AFTER_BODY = 11; + const IN_FRAME = 12; + const AFTR_FRAME = 13; + + // The different types of elements. + const SPECIAL = 0; + const SCOPING = 1; + const FORMATTING = 2; + const PHRASING = 3; + + const MARKER = 0; + + public function __construct() + { + $this->phase = self::INIT_PHASE; + $this->mode = self::BEFOR_HEAD; + $this->dom = new DOMDocument; + + $this->dom->encoding = 'UTF-8'; + $this->dom->preserveWhiteSpace = true; + $this->dom->substituteEntities = true; + $this->dom->strictErrorChecking = false; + } + + // Process tag tokens + public function emitToken($token) + { + switch ($this->phase) { + case self::INIT_PHASE: + return $this->initPhase($token); + break; + case self::ROOT_PHASE: + return $this->rootElementPhase($token); + break; + case self::MAIN_PHASE: + return $this->mainPhase($token); + break; + case self::END_PHASE : + return $this->trailingEndPhase($token); + break; + } + } + + private function initPhase($token) + { + /* Initially, the tree construction stage must handle each token + emitted from the tokenisation stage as follows: */ + + /* A DOCTYPE token that is marked as being in error + A comment token + A start tag token + An end tag token + A character token that is not one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE + An end-of-file token */ + if ((isset($token['error']) && $token['error']) || + $token['type'] === HTML5::COMMENT || + $token['type'] === HTML5::STARTTAG || + $token['type'] === HTML5::ENDTAG || + $token['type'] === HTML5::EOF || + ($token['type'] === HTML5::CHARACTR && isset($token['data']) && + !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) + ) { + /* This specification does not define how to handle this case. In + particular, user agents may ignore the entirety of this specification + altogether for such documents, and instead invoke special parse modes + with a greater emphasis on backwards compatibility. */ + + $this->phase = self::ROOT_PHASE; + return $this->rootElementPhase($token); + + /* A DOCTYPE token marked as being correct */ + } elseif (isset($token['error']) && !$token['error']) { + /* Append a DocumentType node to the Document node, with the name + attribute set to the name given in the DOCTYPE token (which will be + "HTML"), and the other attributes specific to DocumentType objects + set to null, empty lists, or the empty string as appropriate. */ + $doctype = new DOMDocumentType(null, null, 'HTML'); + + /* Then, switch to the root element phase of the tree construction + stage. */ + $this->phase = self::ROOT_PHASE; + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + } elseif (isset($token['data']) && preg_match( + '/^[\t\n\x0b\x0c ]+$/', + $token['data'] + ) + ) { + /* Append that character to the Document node. */ + $text = $this->dom->createTextNode($token['data']); + $this->dom->appendChild($text); + } + } + + private function rootElementPhase($token) + { + /* After the initial phase, as each token is emitted from the tokenisation + stage, it must be processed as described in this section. */ + + /* A DOCTYPE token */ + if ($token['type'] === HTML5::DOCTYPE) { + // Parse error. Ignore the token. + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the Document object with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + $this->dom->appendChild($comment); + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + } elseif ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append that character to the Document node. */ + $text = $this->dom->createTextNode($token['data']); + $this->dom->appendChild($text); + + /* A character token that is not one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED + (FF), or U+0020 SPACE + A start tag token + An end tag token + An end-of-file token */ + } elseif (($token['type'] === HTML5::CHARACTR && + !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || + $token['type'] === HTML5::STARTTAG || + $token['type'] === HTML5::ENDTAG || + $token['type'] === HTML5::EOF + ) { + /* Create an HTMLElement node with the tag name html, in the HTML + namespace. Append it to the Document object. Switch to the main + phase and reprocess the current token. */ + $html = $this->dom->createElement('html'); + $this->dom->appendChild($html); + $this->stack[] = $html; + + $this->phase = self::MAIN_PHASE; + return $this->mainPhase($token); + } + } + + private function mainPhase($token) + { + /* Tokens in the main phase must be handled as follows: */ + + /* A DOCTYPE token */ + if ($token['type'] === HTML5::DOCTYPE) { + // Parse error. Ignore the token. + + /* A start tag token with the tag name "html" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'html') { + /* If this start tag token was not the first start tag token, then + it is a parse error. */ + + /* For each attribute on the token, check to see if the attribute + is already present on the top element of the stack of open elements. + If it is not, add the attribute and its corresponding value to that + element. */ + foreach ($token['attr'] as $attr) { + if (!$this->stack[0]->hasAttribute($attr['name'])) { + $this->stack[0]->setAttribute($attr['name'], $attr['value']); + } + } + + /* An end-of-file token */ + } elseif ($token['type'] === HTML5::EOF) { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* Anything else. */ + } else { + /* Depends on the insertion mode: */ + switch ($this->mode) { + case self::BEFOR_HEAD: + return $this->beforeHead($token); + break; + case self::IN_HEAD: + return $this->inHead($token); + break; + case self::AFTER_HEAD: + return $this->afterHead($token); + break; + case self::IN_BODY: + return $this->inBody($token); + break; + case self::IN_TABLE: + return $this->inTable($token); + break; + case self::IN_CAPTION: + return $this->inCaption($token); + break; + case self::IN_CGROUP: + return $this->inColumnGroup($token); + break; + case self::IN_TBODY: + return $this->inTableBody($token); + break; + case self::IN_ROW: + return $this->inRow($token); + break; + case self::IN_CELL: + return $this->inCell($token); + break; + case self::IN_SELECT: + return $this->inSelect($token); + break; + case self::AFTER_BODY: + return $this->afterBody($token); + break; + case self::IN_FRAME: + return $this->inFrameset($token); + break; + case self::AFTR_FRAME: + return $this->afterFrameset($token); + break; + case self::END_PHASE: + return $this->trailingEndPhase($token); + break; + } + } + } + + private function beforeHead($token) + { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data attribute + set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag token with the tag name "head" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') { + /* Create an element for the token, append the new element to the + current node and push it onto the stack of open elements. */ + $element = $this->insertElement($token); + + /* Set the head element pointer to this new element node. */ + $this->head_pointer = $element; + + /* Change the insertion mode to "in head". */ + $this->mode = self::IN_HEAD; + + /* A start tag token whose tag name is one of: "base", "link", "meta", + "script", "style", "title". Or an end tag with the tag name "html". + Or a character token that is not one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE. Or any other start tag token */ + } elseif ($token['type'] === HTML5::STARTTAG || + ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') || + ($token['type'] === HTML5::CHARACTR && !preg_match( + '/^[\t\n\x0b\x0c ]$/', + $token['data'] + )) + ) { + /* Act as if a start tag token with the tag name "head" and no + attributes had been seen, then reprocess the current token. */ + $this->beforeHead( + array( + 'name' => 'head', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + return $this->inHead($token); + + /* Any other end tag */ + } elseif ($token['type'] === HTML5::ENDTAG) { + /* Parse error. Ignore the token. */ + } + } + + private function inHead($token) + { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE. + + THIS DIFFERS FROM THE SPEC: If the current node is either a title, style + or script element, append the character to the current node regardless + of its content. */ + if (($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || ( + $token['type'] === HTML5::CHARACTR && in_array( + end($this->stack)->nodeName, + array('title', 'style', 'script') + )) + ) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data attribute + set to the data given in the comment token. */ + $this->insertComment($token['data']); + + } elseif ($token['type'] === HTML5::ENDTAG && + in_array($token['name'], array('title', 'style', 'script')) + ) { + array_pop($this->stack); + return HTML5::PCDATA; + + /* A start tag with the tag name "title" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'title') { + /* Create an element for the token and append the new element to the + node pointed to by the head element pointer, or, if that is null + (innerHTML case), to the current node. */ + if ($this->head_pointer !== null) { + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + + } else { + $element = $this->insertElement($token); + } + + /* Switch the tokeniser's content model flag to the RCDATA state. */ + return HTML5::RCDATA; + + /* A start tag with the tag name "style" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'style') { + /* Create an element for the token and append the new element to the + node pointed to by the head element pointer, or, if that is null + (innerHTML case), to the current node. */ + if ($this->head_pointer !== null) { + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + + } else { + $this->insertElement($token); + } + + /* Switch the tokeniser's content model flag to the CDATA state. */ + return HTML5::CDATA; + + /* A start tag with the tag name "script" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'script') { + /* Create an element for the token. */ + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + + /* Switch the tokeniser's content model flag to the CDATA state. */ + return HTML5::CDATA; + + /* A start tag with the tag name "base", "link", or "meta" */ + } elseif ($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array('base', 'link', 'meta') + ) + ) { + /* Create an element for the token and append the new element to the + node pointed to by the head element pointer, or, if that is null + (innerHTML case), to the current node. */ + if ($this->head_pointer !== null) { + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + array_pop($this->stack); + + } else { + $this->insertElement($token); + } + + /* An end tag with the tag name "head" */ + } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'head') { + /* If the current node is a head element, pop the current node off + the stack of open elements. */ + if ($this->head_pointer->isSameNode(end($this->stack))) { + array_pop($this->stack); + + /* Otherwise, this is a parse error. */ + } else { + // k + } + + /* Change the insertion mode to "after head". */ + $this->mode = self::AFTER_HEAD; + + /* A start tag with the tag name "head" or an end tag except "html". */ + } elseif (($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') || + ($token['type'] === HTML5::ENDTAG && $token['name'] !== 'html') + ) { + // Parse error. Ignore the token. + + /* Anything else */ + } else { + /* If the current node is a head element, act as if an end tag + token with the tag name "head" had been seen. */ + if ($this->head_pointer->isSameNode(end($this->stack))) { + $this->inHead( + array( + 'name' => 'head', + 'type' => HTML5::ENDTAG + ) + ); + + /* Otherwise, change the insertion mode to "after head". */ + } else { + $this->mode = self::AFTER_HEAD; + } + + /* Then, reprocess the current token. */ + return $this->afterHead($token); + } + } + + private function afterHead($token) + { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data attribute + set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag token with the tag name "body" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'body') { + /* Insert a body element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in body". */ + $this->mode = self::IN_BODY; + + /* A start tag token with the tag name "frameset" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'frameset') { + /* Insert a frameset element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in frameset". */ + $this->mode = self::IN_FRAME; + + /* A start tag token whose tag name is one of: "base", "link", "meta", + "script", "style", "title" */ + } elseif ($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array('base', 'link', 'meta', 'script', 'style', 'title') + ) + ) { + /* Parse error. Switch the insertion mode back to "in head" and + reprocess the token. */ + $this->mode = self::IN_HEAD; + return $this->inHead($token); + + /* Anything else */ + } else { + /* Act as if a start tag token with the tag name "body" and no + attributes had been seen, and then reprocess the current token. */ + $this->afterHead( + array( + 'name' => 'body', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + return $this->inBody($token); + } + } + + private function inBody($token) + { + /* Handle the token as follows: */ + + switch ($token['type']) { + /* A character token */ + case HTML5::CHARACTR: + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Append the token's character to the current node. */ + $this->insertText($token['data']); + break; + + /* A comment token */ + case HTML5::COMMENT: + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + break; + + case HTML5::STARTTAG: + switch ($token['name']) { + /* A start tag token whose tag name is one of: "script", + "style" */ + case 'script': + case 'style': + /* Process the token as if the insertion mode had been "in + head". */ + return $this->inHead($token); + break; + + /* A start tag token whose tag name is one of: "base", "link", + "meta", "title" */ + case 'base': + case 'link': + case 'meta': + case 'title': + /* Parse error. Process the token as if the insertion mode + had been "in head". */ + return $this->inHead($token); + break; + + /* A start tag token with the tag name "body" */ + case 'body': + /* Parse error. If the second element on the stack of open + elements is not a body element, or, if the stack of open + elements has only one node on it, then ignore the token. + (innerHTML case) */ + if (count($this->stack) === 1 || $this->stack[1]->nodeName !== 'body') { + // Ignore + + /* Otherwise, for each attribute on the token, check to see + if the attribute is already present on the body element (the + second element) on the stack of open elements. If it is not, + add the attribute and its corresponding value to that + element. */ + } else { + foreach ($token['attr'] as $attr) { + if (!$this->stack[1]->hasAttribute($attr['name'])) { + $this->stack[1]->setAttribute($attr['name'], $attr['value']); + } + } + } + break; + + /* A start tag whose tag name is one of: "address", + "blockquote", "center", "dir", "div", "dl", "fieldset", + "listing", "menu", "ol", "p", "ul" */ + case 'address': + case 'blockquote': + case 'center': + case 'dir': + case 'div': + case 'dl': + case 'fieldset': + case 'listing': + case 'menu': + case 'ol': + case 'p': + case 'ul': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been + seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + break; + + /* A start tag whose tag name is "form" */ + case 'form': + /* If the form element pointer is not null, ignore the + token with a parse error. */ + if ($this->form_pointer !== null) { + // Ignore. + + /* Otherwise: */ + } else { + /* If the stack of open elements has a p element in + scope, then act as if an end tag with the tag name p + had been seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token, and set the + form element pointer to point to the element created. */ + $element = $this->insertElement($token); + $this->form_pointer = $element; + } + break; + + /* A start tag whose tag name is "li", "dd" or "dt" */ + case 'li': + case 'dd': + case 'dt': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been + seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + $stack_length = count($this->stack) - 1; + + for ($n = $stack_length; 0 <= $n; $n--) { + /* 1. Initialise node to be the current node (the + bottommost node of the stack). */ + $stop = false; + $node = $this->stack[$n]; + $cat = $this->getElementCategory($node->tagName); + + /* 2. If node is an li, dd or dt element, then pop all + the nodes from the current node up to node, including + node, then stop this algorithm. */ + if ($token['name'] === $node->tagName || ($token['name'] !== 'li' + && ($node->tagName === 'dd' || $node->tagName === 'dt')) + ) { + for ($x = $stack_length; $x >= $n; $x--) { + array_pop($this->stack); + } + + break; + } + + /* 3. If node is not in the formatting category, and is + not in the phrasing category, and is not an address or + div element, then stop this algorithm. */ + if ($cat !== self::FORMATTING && $cat !== self::PHRASING && + $node->tagName !== 'address' && $node->tagName !== 'div' + ) { + break; + } + } + + /* Finally, insert an HTML element with the same tag + name as the token's. */ + $this->insertElement($token); + break; + + /* A start tag token whose tag name is "plaintext" */ + case 'plaintext': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been + seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + return HTML5::PLAINTEXT; + break; + + /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4", + "h5", "h6" */ + case 'h1': + case 'h2': + case 'h3': + case 'h4': + case 'h5': + case 'h6': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* If the stack of open elements has in scope an element whose + tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then + this is a parse error; pop elements from the stack until an + element with one of those tag names has been popped from the + stack. */ + while ($this->elementInScope(array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) { + array_pop($this->stack); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + break; + + /* A start tag whose tag name is "a" */ + case 'a': + /* If the list of active formatting elements contains + an element whose tag name is "a" between the end of the + list and the last marker on the list (or the start of + the list if there is no marker on the list), then this + is a parse error; act as if an end tag with the tag name + "a" had been seen, then remove that element from the list + of active formatting elements and the stack of open + elements if the end tag didn't already remove it (it + might not have if the element is not in table scope). */ + $leng = count($this->a_formatting); + + for ($n = $leng - 1; $n >= 0; $n--) { + if ($this->a_formatting[$n] === self::MARKER) { + break; + + } elseif ($this->a_formatting[$n]->nodeName === 'a') { + $this->emitToken( + array( + 'name' => 'a', + 'type' => HTML5::ENDTAG + ) + ); + break; + } + } + + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $el = $this->insertElement($token); + + /* Add that element to the list of active formatting + elements. */ + $this->a_formatting[] = $el; + break; + + /* A start tag whose tag name is one of: "b", "big", "em", "font", + "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ + case 'b': + case 'big': + case 'em': + case 'font': + case 'i': + case 'nobr': + case 's': + case 'small': + case 'strike': + case 'strong': + case 'tt': + case 'u': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $el = $this->insertElement($token); + + /* Add that element to the list of active formatting + elements. */ + $this->a_formatting[] = $el; + break; + + /* A start tag token whose tag name is "button" */ + case 'button': + /* If the stack of open elements has a button element in scope, + then this is a parse error; act as if an end tag with the tag + name "button" had been seen, then reprocess the token. (We don't + do that. Unnecessary.) */ + if ($this->elementInScope('button')) { + $this->inBody( + array( + 'name' => 'button', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Insert a marker at the end of the list of active + formatting elements. */ + $this->a_formatting[] = self::MARKER; + break; + + /* A start tag token whose tag name is one of: "marquee", "object" */ + case 'marquee': + case 'object': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Insert a marker at the end of the list of active + formatting elements. */ + $this->a_formatting[] = self::MARKER; + break; + + /* A start tag token whose tag name is "xmp" */ + case 'xmp': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Switch the content model flag to the CDATA state. */ + return HTML5::CDATA; + break; + + /* A start tag whose tag name is "table" */ + case 'table': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in table". */ + $this->mode = self::IN_TABLE; + break; + + /* A start tag whose tag name is one of: "area", "basefont", + "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */ + case 'area': + case 'basefont': + case 'bgsound': + case 'br': + case 'embed': + case 'img': + case 'param': + case 'spacer': + case 'wbr': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Immediately pop the current node off the stack of open elements. */ + array_pop($this->stack); + break; + + /* A start tag whose tag name is "hr" */ + case 'hr': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Immediately pop the current node off the stack of open elements. */ + array_pop($this->stack); + break; + + /* A start tag whose tag name is "image" */ + case 'image': + /* Parse error. Change the token's tag name to "img" and + reprocess it. (Don't ask.) */ + $token['name'] = 'img'; + return $this->inBody($token); + break; + + /* A start tag whose tag name is "input" */ + case 'input': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an input element for the token. */ + $element = $this->insertElement($token, false); + + /* If the form element pointer is not null, then associate the + input element with the form element pointed to by the form + element pointer. */ + $this->form_pointer !== null + ? $this->form_pointer->appendChild($element) + : end($this->stack)->appendChild($element); + + /* Pop that input element off the stack of open elements. */ + array_pop($this->stack); + break; + + /* A start tag whose tag name is "isindex" */ + case 'isindex': + /* Parse error. */ + // w/e + + /* If the form element pointer is not null, + then ignore the token. */ + if ($this->form_pointer === null) { + /* Act as if a start tag token with the tag name "form" had + been seen. */ + $this->inBody( + array( + 'name' => 'body', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + /* Act as if a start tag token with the tag name "hr" had + been seen. */ + $this->inBody( + array( + 'name' => 'hr', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + /* Act as if a start tag token with the tag name "p" had + been seen. */ + $this->inBody( + array( + 'name' => 'p', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + /* Act as if a start tag token with the tag name "label" + had been seen. */ + $this->inBody( + array( + 'name' => 'label', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + /* Act as if a stream of character tokens had been seen. */ + $this->insertText( + 'This is a searchable index. ' . + 'Insert your search keywords here: ' + ); + + /* Act as if a start tag token with the tag name "input" + had been seen, with all the attributes from the "isindex" + token, except with the "name" attribute set to the value + "isindex" (ignoring any explicit "name" attribute). */ + $attr = $token['attr']; + $attr[] = array('name' => 'name', 'value' => 'isindex'); + + $this->inBody( + array( + 'name' => 'input', + 'type' => HTML5::STARTTAG, + 'attr' => $attr + ) + ); + + /* Act as if a stream of character tokens had been seen + (see below for what they should say). */ + $this->insertText( + 'This is a searchable index. ' . + 'Insert your search keywords here: ' + ); + + /* Act as if an end tag token with the tag name "label" + had been seen. */ + $this->inBody( + array( + 'name' => 'label', + 'type' => HTML5::ENDTAG + ) + ); + + /* Act as if an end tag token with the tag name "p" had + been seen. */ + $this->inBody( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + + /* Act as if a start tag token with the tag name "hr" had + been seen. */ + $this->inBody( + array( + 'name' => 'hr', + 'type' => HTML5::ENDTAG + ) + ); + + /* Act as if an end tag token with the tag name "form" had + been seen. */ + $this->inBody( + array( + 'name' => 'form', + 'type' => HTML5::ENDTAG + ) + ); + } + break; + + /* A start tag whose tag name is "textarea" */ + case 'textarea': + $this->insertElement($token); + + /* Switch the tokeniser's content model flag to the + RCDATA state. */ + return HTML5::RCDATA; + break; + + /* A start tag whose tag name is one of: "iframe", "noembed", + "noframes" */ + case 'iframe': + case 'noembed': + case 'noframes': + $this->insertElement($token); + + /* Switch the tokeniser's content model flag to the CDATA state. */ + return HTML5::CDATA; + break; + + /* A start tag whose tag name is "select" */ + case 'select': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in select". */ + $this->mode = self::IN_SELECT; + break; + + /* A start or end tag whose tag name is one of: "caption", "col", + "colgroup", "frame", "frameset", "head", "option", "optgroup", + "tbody", "td", "tfoot", "th", "thead", "tr". */ + case 'caption': + case 'col': + case 'colgroup': + case 'frame': + case 'frameset': + case 'head': + case 'option': + case 'optgroup': + case 'tbody': + case 'td': + case 'tfoot': + case 'th': + case 'thead': + case 'tr': + // Parse error. Ignore the token. + break; + + /* A start or end tag whose tag name is one of: "event-source", + "section", "nav", "article", "aside", "header", "footer", + "datagrid", "command" */ + case 'event-source': + case 'section': + case 'nav': + case 'article': + case 'aside': + case 'header': + case 'footer': + case 'datagrid': + case 'command': + // Work in progress! + break; + + /* A start tag token not covered by the previous entries */ + default: + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + $this->insertElement($token, true, true); + break; + } + break; + + case HTML5::ENDTAG: + switch ($token['name']) { + /* An end tag with the tag name "body" */ + case 'body': + /* If the second element in the stack of open elements is + not a body element, this is a parse error. Ignore the token. + (innerHTML case) */ + if (count($this->stack) < 2 || $this->stack[1]->nodeName !== 'body') { + // Ignore. + + /* If the current node is not the body element, then this + is a parse error. */ + } elseif (end($this->stack)->nodeName !== 'body') { + // Parse error. + } + + /* Change the insertion mode to "after body". */ + $this->mode = self::AFTER_BODY; + break; + + /* An end tag with the tag name "html" */ + case 'html': + /* Act as if an end tag with tag name "body" had been seen, + then, if that token wasn't ignored, reprocess the current + token. */ + $this->inBody( + array( + 'name' => 'body', + 'type' => HTML5::ENDTAG + ) + ); + + return $this->afterBody($token); + break; + + /* An end tag whose tag name is one of: "address", "blockquote", + "center", "dir", "div", "dl", "fieldset", "listing", "menu", + "ol", "pre", "ul" */ + case 'address': + case 'blockquote': + case 'center': + case 'dir': + case 'div': + case 'dl': + case 'fieldset': + case 'listing': + case 'menu': + case 'ol': + case 'pre': + case 'ul': + /* If the stack of open elements has an element in scope + with the same tag name as that of the token, then generate + implied end tags. */ + if ($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(); + + /* Now, if the current node is not an element with + the same tag name as that of the token, then this + is a parse error. */ + // w/e + + /* If the stack of open elements has an element in + scope with the same tag name as that of the token, + then pop elements from this stack until an element + with that tag name has been popped from the stack. */ + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + if ($this->stack[$n]->nodeName === $token['name']) { + $n = -1; + } + + array_pop($this->stack); + } + } + break; + + /* An end tag whose tag name is "form" */ + case 'form': + /* If the stack of open elements has an element in scope + with the same tag name as that of the token, then generate + implied end tags. */ + if ($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(); + + } + + if (end($this->stack)->nodeName !== $token['name']) { + /* Now, if the current node is not an element with the + same tag name as that of the token, then this is a parse + error. */ + // w/e + + } else { + /* Otherwise, if the current node is an element with + the same tag name as that of the token pop that element + from the stack. */ + array_pop($this->stack); + } + + /* In any case, set the form element pointer to null. */ + $this->form_pointer = null; + break; + + /* An end tag whose tag name is "p" */ + case 'p': + /* If the stack of open elements has a p element in scope, + then generate implied end tags, except for p elements. */ + if ($this->elementInScope('p')) { + $this->generateImpliedEndTags(array('p')); + + /* If the current node is not a p element, then this is + a parse error. */ + // k + + /* If the stack of open elements has a p element in + scope, then pop elements from this stack until the stack + no longer has a p element in scope. */ + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + if ($this->elementInScope('p')) { + array_pop($this->stack); + + } else { + break; + } + } + } + break; + + /* An end tag whose tag name is "dd", "dt", or "li" */ + case 'dd': + case 'dt': + case 'li': + /* If the stack of open elements has an element in scope + whose tag name matches the tag name of the token, then + generate implied end tags, except for elements with the + same tag name as the token. */ + if ($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(array($token['name'])); + + /* If the current node is not an element with the same + tag name as the token, then this is a parse error. */ + // w/e + + /* If the stack of open elements has an element in scope + whose tag name matches the tag name of the token, then + pop elements from this stack until an element with that + tag name has been popped from the stack. */ + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + if ($this->stack[$n]->nodeName === $token['name']) { + $n = -1; + } + + array_pop($this->stack); + } + } + break; + + /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4", + "h5", "h6" */ + case 'h1': + case 'h2': + case 'h3': + case 'h4': + case 'h5': + case 'h6': + $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'); + + /* If the stack of open elements has in scope an element whose + tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then + generate implied end tags. */ + if ($this->elementInScope($elements)) { + $this->generateImpliedEndTags(); + + /* Now, if the current node is not an element with the same + tag name as that of the token, then this is a parse error. */ + // w/e + + /* If the stack of open elements has in scope an element + whose tag name is one of "h1", "h2", "h3", "h4", "h5", or + "h6", then pop elements from the stack until an element + with one of those tag names has been popped from the stack. */ + while ($this->elementInScope($elements)) { + array_pop($this->stack); + } + } + break; + + /* An end tag whose tag name is one of: "a", "b", "big", "em", + "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ + case 'a': + case 'b': + case 'big': + case 'em': + case 'font': + case 'i': + case 'nobr': + case 's': + case 'small': + case 'strike': + case 'strong': + case 'tt': + case 'u': + /* 1. Let the formatting element be the last element in + the list of active formatting elements that: + * is between the end of the list and the last scope + marker in the list, if any, or the start of the list + otherwise, and + * has the same tag name as the token. + */ + while (true) { + for ($a = count($this->a_formatting) - 1; $a >= 0; $a--) { + if ($this->a_formatting[$a] === self::MARKER) { + break; + + } elseif ($this->a_formatting[$a]->tagName === $token['name']) { + $formatting_element = $this->a_formatting[$a]; + $in_stack = in_array($formatting_element, $this->stack, true); + $fe_af_pos = $a; + break; + } + } + + /* If there is no such node, or, if that node is + also in the stack of open elements but the element + is not in scope, then this is a parse error. Abort + these steps. The token is ignored. */ + if (!isset($formatting_element) || ($in_stack && + !$this->elementInScope($token['name'])) + ) { + break; + + /* Otherwise, if there is such a node, but that node + is not in the stack of open elements, then this is a + parse error; remove the element from the list, and + abort these steps. */ + } elseif (isset($formatting_element) && !$in_stack) { + unset($this->a_formatting[$fe_af_pos]); + $this->a_formatting = array_merge($this->a_formatting); + break; + } + + /* 2. Let the furthest block be the topmost node in the + stack of open elements that is lower in the stack + than the formatting element, and is not an element in + the phrasing or formatting categories. There might + not be one. */ + $fe_s_pos = array_search($formatting_element, $this->stack, true); + $length = count($this->stack); + + for ($s = $fe_s_pos + 1; $s < $length; $s++) { + $category = $this->getElementCategory($this->stack[$s]->nodeName); + + if ($category !== self::PHRASING && $category !== self::FORMATTING) { + $furthest_block = $this->stack[$s]; + } + } + + /* 3. If there is no furthest block, then the UA must + skip the subsequent steps and instead just pop all + the nodes from the bottom of the stack of open + elements, from the current node up to the formatting + element, and remove the formatting element from the + list of active formatting elements. */ + if (!isset($furthest_block)) { + for ($n = $length - 1; $n >= $fe_s_pos; $n--) { + array_pop($this->stack); + } + + unset($this->a_formatting[$fe_af_pos]); + $this->a_formatting = array_merge($this->a_formatting); + break; + } + + /* 4. Let the common ancestor be the element + immediately above the formatting element in the stack + of open elements. */ + $common_ancestor = $this->stack[$fe_s_pos - 1]; + + /* 5. If the furthest block has a parent node, then + remove the furthest block from its parent node. */ + if ($furthest_block->parentNode !== null) { + $furthest_block->parentNode->removeChild($furthest_block); + } + + /* 6. Let a bookmark note the position of the + formatting element in the list of active formatting + elements relative to the elements on either side + of it in the list. */ + $bookmark = $fe_af_pos; + + /* 7. Let node and last node be the furthest block. + Follow these steps: */ + $node = $furthest_block; + $last_node = $furthest_block; + + while (true) { + for ($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) { + /* 7.1 Let node be the element immediately + prior to node in the stack of open elements. */ + $node = $this->stack[$n]; + + /* 7.2 If node is not in the list of active + formatting elements, then remove node from + the stack of open elements and then go back + to step 1. */ + if (!in_array($node, $this->a_formatting, true)) { + unset($this->stack[$n]); + $this->stack = array_merge($this->stack); + + } else { + break; + } + } + + /* 7.3 Otherwise, if node is the formatting + element, then go to the next step in the overall + algorithm. */ + if ($node === $formatting_element) { + break; + + /* 7.4 Otherwise, if last node is the furthest + block, then move the aforementioned bookmark to + be immediately after the node in the list of + active formatting elements. */ + } elseif ($last_node === $furthest_block) { + $bookmark = array_search($node, $this->a_formatting, true) + 1; + } + + /* 7.5 If node has any children, perform a + shallow clone of node, replace the entry for + node in the list of active formatting elements + with an entry for the clone, replace the entry + for node in the stack of open elements with an + entry for the clone, and let node be the clone. */ + if ($node->hasChildNodes()) { + $clone = $node->cloneNode(); + $s_pos = array_search($node, $this->stack, true); + $a_pos = array_search($node, $this->a_formatting, true); + + $this->stack[$s_pos] = $clone; + $this->a_formatting[$a_pos] = $clone; + $node = $clone; + } + + /* 7.6 Insert last node into node, first removing + it from its previous parent node if any. */ + if ($last_node->parentNode !== null) { + $last_node->parentNode->removeChild($last_node); + } + + $node->appendChild($last_node); + + /* 7.7 Let last node be node. */ + $last_node = $node; + } + + /* 8. Insert whatever last node ended up being in + the previous step into the common ancestor node, + first removing it from its previous parent node if + any. */ + if ($last_node->parentNode !== null) { + $last_node->parentNode->removeChild($last_node); + } + + $common_ancestor->appendChild($last_node); + + /* 9. Perform a shallow clone of the formatting + element. */ + $clone = $formatting_element->cloneNode(); + + /* 10. Take all of the child nodes of the furthest + block and append them to the clone created in the + last step. */ + while ($furthest_block->hasChildNodes()) { + $child = $furthest_block->firstChild; + $furthest_block->removeChild($child); + $clone->appendChild($child); + } + + /* 11. Append that clone to the furthest block. */ + $furthest_block->appendChild($clone); + + /* 12. Remove the formatting element from the list + of active formatting elements, and insert the clone + into the list of active formatting elements at the + position of the aforementioned bookmark. */ + $fe_af_pos = array_search($formatting_element, $this->a_formatting, true); + unset($this->a_formatting[$fe_af_pos]); + $this->a_formatting = array_merge($this->a_formatting); + + $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1); + $af_part2 = array_slice($this->a_formatting, $bookmark, count($this->a_formatting)); + $this->a_formatting = array_merge($af_part1, array($clone), $af_part2); + + /* 13. Remove the formatting element from the stack + of open elements, and insert the clone into the stack + of open elements immediately after (i.e. in a more + deeply nested position than) the position of the + furthest block in that stack. */ + $fe_s_pos = array_search($formatting_element, $this->stack, true); + $fb_s_pos = array_search($furthest_block, $this->stack, true); + unset($this->stack[$fe_s_pos]); + + $s_part1 = array_slice($this->stack, 0, $fb_s_pos); + $s_part2 = array_slice($this->stack, $fb_s_pos + 1, count($this->stack)); + $this->stack = array_merge($s_part1, array($clone), $s_part2); + + /* 14. Jump back to step 1 in this series of steps. */ + unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block); + } + break; + + /* An end tag token whose tag name is one of: "button", + "marquee", "object" */ + case 'button': + case 'marquee': + case 'object': + /* If the stack of open elements has an element in scope whose + tag name matches the tag name of the token, then generate implied + tags. */ + if ($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(); + + /* Now, if the current node is not an element with the same + tag name as the token, then this is a parse error. */ + // k + + /* Now, if the stack of open elements has an element in scope + whose tag name matches the tag name of the token, then pop + elements from the stack until that element has been popped from + the stack, and clear the list of active formatting elements up + to the last marker. */ + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + if ($this->stack[$n]->nodeName === $token['name']) { + $n = -1; + } + + array_pop($this->stack); + } + + $marker = end(array_keys($this->a_formatting, self::MARKER, true)); + + for ($n = count($this->a_formatting) - 1; $n > $marker; $n--) { + array_pop($this->a_formatting); + } + } + break; + + /* Or an end tag whose tag name is one of: "area", "basefont", + "bgsound", "br", "embed", "hr", "iframe", "image", "img", + "input", "isindex", "noembed", "noframes", "param", "select", + "spacer", "table", "textarea", "wbr" */ + case 'area': + case 'basefont': + case 'bgsound': + case 'br': + case 'embed': + case 'hr': + case 'iframe': + case 'image': + case 'img': + case 'input': + case 'isindex': + case 'noembed': + case 'noframes': + case 'param': + case 'select': + case 'spacer': + case 'table': + case 'textarea': + case 'wbr': + // Parse error. Ignore the token. + break; + + /* An end tag token not covered by the previous entries */ + default: + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + /* Initialise node to be the current node (the bottommost + node of the stack). */ + $node = end($this->stack); + + /* If node has the same tag name as the end tag token, + then: */ + if ($token['name'] === $node->nodeName) { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* If the tag name of the end tag token does not + match the tag name of the current node, this is a + parse error. */ + // k + + /* Pop all the nodes from the current node up to + node, including node, then stop this algorithm. */ + for ($x = count($this->stack) - $n; $x >= $n; $x--) { + array_pop($this->stack); + } + + } else { + $category = $this->getElementCategory($node); + + if ($category !== self::SPECIAL && $category !== self::SCOPING) { + /* Otherwise, if node is in neither the formatting + category nor the phrasing category, then this is a + parse error. Stop this algorithm. The end tag token + is ignored. */ + return false; + } + } + } + break; + } + break; + } + } + + private function inTable($token) + { + $clear = array('html', 'table'); + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append the character to the current node. */ + $text = $this->dom->createTextNode($token['data']); + end($this->stack)->appendChild($text); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + end($this->stack)->appendChild($comment); + + /* A start tag whose tag name is "caption" */ + } elseif ($token['type'] === HTML5::STARTTAG && + $token['name'] === 'caption' + ) { + /* Clear the stack back to a table context. */ + $this->clearStackToTableContext($clear); + + /* Insert a marker at the end of the list of active + formatting elements. */ + $this->a_formatting[] = self::MARKER; + + /* Insert an HTML element for the token, then switch the + insertion mode to "in caption". */ + $this->insertElement($token); + $this->mode = self::IN_CAPTION; + + /* A start tag whose tag name is "colgroup" */ + } elseif ($token['type'] === HTML5::STARTTAG && + $token['name'] === 'colgroup' + ) { + /* Clear the stack back to a table context. */ + $this->clearStackToTableContext($clear); + + /* Insert an HTML element for the token, then switch the + insertion mode to "in column group". */ + $this->insertElement($token); + $this->mode = self::IN_CGROUP; + + /* A start tag whose tag name is "col" */ + } elseif ($token['type'] === HTML5::STARTTAG && + $token['name'] === 'col' + ) { + $this->inTable( + array( + 'name' => 'colgroup', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + $this->inColumnGroup($token); + + /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */ + } elseif ($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array('tbody', 'tfoot', 'thead') + ) + ) { + /* Clear the stack back to a table context. */ + $this->clearStackToTableContext($clear); + + /* Insert an HTML element for the token, then switch the insertion + mode to "in table body". */ + $this->insertElement($token); + $this->mode = self::IN_TBODY; + + /* A start tag whose tag name is one of: "td", "th", "tr" */ + } elseif ($token['type'] === HTML5::STARTTAG && + in_array($token['name'], array('td', 'th', 'tr')) + ) { + /* Act as if a start tag token with the tag name "tbody" had been + seen, then reprocess the current token. */ + $this->inTable( + array( + 'name' => 'tbody', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + return $this->inTableBody($token); + + /* A start tag whose tag name is "table" */ + } elseif ($token['type'] === HTML5::STARTTAG && + $token['name'] === 'table' + ) { + /* Parse error. Act as if an end tag token with the tag name "table" + had been seen, then, if that token wasn't ignored, reprocess the + current token. */ + $this->inTable( + array( + 'name' => 'table', + 'type' => HTML5::ENDTAG + ) + ); + + return $this->mainPhase($token); + + /* An end tag whose tag name is "table" */ + } elseif ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'table' + ) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if (!$this->elementInScope($token['name'], true)) { + return false; + + /* Otherwise: */ + } else { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* Now, if the current node is not a table element, then this + is a parse error. */ + // w/e + + /* Pop elements from this stack until a table element has been + popped from the stack. */ + while (true) { + $current = end($this->stack)->nodeName; + array_pop($this->stack); + + if ($current === 'table') { + break; + } + } + + /* Reset the insertion mode appropriately. */ + $this->resetInsertionMode(); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif ($token['type'] === HTML5::ENDTAG && in_array( + $token['name'], + array( + 'body', + 'caption', + 'col', + 'colgroup', + 'html', + 'tbody', + 'td', + 'tfoot', + 'th', + 'thead', + 'tr' + ) + ) + ) { + // Parse error. Ignore the token. + + /* Anything else */ + } else { + /* Parse error. Process the token as if the insertion mode was "in + body", with the following exception: */ + + /* If the current node is a table, tbody, tfoot, thead, or tr + element, then, whenever a node would be inserted into the current + node, it must instead be inserted into the foster parent element. */ + if (in_array( + end($this->stack)->nodeName, + array('table', 'tbody', 'tfoot', 'thead', 'tr') + ) + ) { + /* The foster parent element is the parent element of the last + table element in the stack of open elements, if there is a + table element and it has such a parent element. If there is no + table element in the stack of open elements (innerHTML case), + then the foster parent element is the first element in the + stack of open elements (the html element). Otherwise, if there + is a table element in the stack of open elements, but the last + table element in the stack of open elements has no parent, or + its parent node is not an element, then the foster parent + element is the element before the last table element in the + stack of open elements. */ + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + if ($this->stack[$n]->nodeName === 'table') { + $table = $this->stack[$n]; + break; + } + } + + if (isset($table) && $table->parentNode !== null) { + $this->foster_parent = $table->parentNode; + + } elseif (!isset($table)) { + $this->foster_parent = $this->stack[0]; + + } elseif (isset($table) && ($table->parentNode === null || + $table->parentNode->nodeType !== XML_ELEMENT_NODE) + ) { + $this->foster_parent = $this->stack[$n - 1]; + } + } + + $this->inBody($token); + } + } + + private function inCaption($token) + { + /* An end tag whose tag name is "caption" */ + if ($token['type'] === HTML5::ENDTAG && $token['name'] === 'caption') { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if (!$this->elementInScope($token['name'], true)) { + // Ignore + + /* Otherwise: */ + } else { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* Now, if the current node is not a caption element, then this + is a parse error. */ + // w/e + + /* Pop elements from this stack until a caption element has + been popped from the stack. */ + while (true) { + $node = end($this->stack)->nodeName; + array_pop($this->stack); + + if ($node === 'caption') { + break; + } + } + + /* Clear the list of active formatting elements up to the last + marker. */ + $this->clearTheActiveFormattingElementsUpToTheLastMarker(); + + /* Switch the insertion mode to "in table". */ + $this->mode = self::IN_TABLE; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag + name is "table" */ + } elseif (($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array( + 'caption', + 'col', + 'colgroup', + 'tbody', + 'td', + 'tfoot', + 'th', + 'thead', + 'tr' + ) + )) || ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'table') + ) { + /* Parse error. Act as if an end tag with the tag name "caption" + had been seen, then, if that token wasn't ignored, reprocess the + current token. */ + $this->inCaption( + array( + 'name' => 'caption', + 'type' => HTML5::ENDTAG + ) + ); + + return $this->inTable($token); + + /* An end tag whose tag name is one of: "body", "col", "colgroup", + "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif ($token['type'] === HTML5::ENDTAG && in_array( + $token['name'], + array( + 'body', + 'col', + 'colgroup', + 'html', + 'tbody', + 'tfoot', + 'th', + 'thead', + 'tr' + ) + ) + ) { + // Parse error. Ignore the token. + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in body". */ + $this->inBody($token); + } + } + + private function inColumnGroup($token) + { + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append the character to the current node. */ + $text = $this->dom->createTextNode($token['data']); + end($this->stack)->appendChild($text); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + end($this->stack)->appendChild($comment); + + /* A start tag whose tag name is "col" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'col') { + /* Insert a col element for the token. Immediately pop the current + node off the stack of open elements. */ + $this->insertElement($token); + array_pop($this->stack); + + /* An end tag whose tag name is "colgroup" */ + } elseif ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'colgroup' + ) { + /* If the current node is the root html element, then this is a + parse error, ignore the token. (innerHTML case) */ + if (end($this->stack)->nodeName === 'html') { + // Ignore + + /* Otherwise, pop the current node (which will be a colgroup + element) from the stack of open elements. Switch the insertion + mode to "in table". */ + } else { + array_pop($this->stack); + $this->mode = self::IN_TABLE; + } + + /* An end tag whose tag name is "col" */ + } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'col') { + /* Parse error. Ignore the token. */ + + /* Anything else */ + } else { + /* Act as if an end tag with the tag name "colgroup" had been seen, + and then, if that token wasn't ignored, reprocess the current token. */ + $this->inColumnGroup( + array( + 'name' => 'colgroup', + 'type' => HTML5::ENDTAG + ) + ); + + return $this->inTable($token); + } + } + + private function inTableBody($token) + { + $clear = array('tbody', 'tfoot', 'thead', 'html'); + + /* A start tag whose tag name is "tr" */ + if ($token['type'] === HTML5::STARTTAG && $token['name'] === 'tr') { + /* Clear the stack back to a table body context. */ + $this->clearStackToTableContext($clear); + + /* Insert a tr element for the token, then switch the insertion + mode to "in row". */ + $this->insertElement($token); + $this->mode = self::IN_ROW; + + /* A start tag whose tag name is one of: "th", "td" */ + } elseif ($token['type'] === HTML5::STARTTAG && + ($token['name'] === 'th' || $token['name'] === 'td') + ) { + /* Parse error. Act as if a start tag with the tag name "tr" had + been seen, then reprocess the current token. */ + $this->inTableBody( + array( + 'name' => 'tr', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + return $this->inRow($token); + + /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ + } elseif ($token['type'] === HTML5::ENDTAG && + in_array($token['name'], array('tbody', 'tfoot', 'thead')) + ) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. */ + if (!$this->elementInScope($token['name'], true)) { + // Ignore + + /* Otherwise: */ + } else { + /* Clear the stack back to a table body context. */ + $this->clearStackToTableContext($clear); + + /* Pop the current node from the stack of open elements. Switch + the insertion mode to "in table". */ + array_pop($this->stack); + $this->mode = self::IN_TABLE; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */ + } elseif (($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array('caption', 'col', 'colgroup', 'tbody', 'tfoor', 'thead') + )) || + ($token['type'] === HTML5::STARTTAG && $token['name'] === 'table') + ) { + /* If the stack of open elements does not have a tbody, thead, or + tfoot element in table scope, this is a parse error. Ignore the + token. (innerHTML case) */ + if (!$this->elementInScope(array('tbody', 'thead', 'tfoot'), true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Clear the stack back to a table body context. */ + $this->clearStackToTableContext($clear); + + /* Act as if an end tag with the same tag name as the current + node ("tbody", "tfoot", or "thead") had been seen, then + reprocess the current token. */ + $this->inTableBody( + array( + 'name' => end($this->stack)->nodeName, + 'type' => HTML5::ENDTAG + ) + ); + + return $this->mainPhase($token); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html", "td", "th", "tr" */ + } elseif ($token['type'] === HTML5::ENDTAG && in_array( + $token['name'], + array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr') + ) + ) { + /* Parse error. Ignore the token. */ + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in table". */ + $this->inTable($token); + } + } + + private function inRow($token) + { + $clear = array('tr', 'html'); + + /* A start tag whose tag name is one of: "th", "td" */ + if ($token['type'] === HTML5::STARTTAG && + ($token['name'] === 'th' || $token['name'] === 'td') + ) { + /* Clear the stack back to a table row context. */ + $this->clearStackToTableContext($clear); + + /* Insert an HTML element for the token, then switch the insertion + mode to "in cell". */ + $this->insertElement($token); + $this->mode = self::IN_CELL; + + /* Insert a marker at the end of the list of active formatting + elements. */ + $this->a_formatting[] = self::MARKER; + + /* An end tag whose tag name is "tr" */ + } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'tr') { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if (!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Clear the stack back to a table row context. */ + $this->clearStackToTableContext($clear); + + /* Pop the current node (which will be a tr element) from the + stack of open elements. Switch the insertion mode to "in table + body". */ + array_pop($this->stack); + $this->mode = self::IN_TBODY; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */ + } elseif ($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr') + ) + ) { + /* Act as if an end tag with the tag name "tr" had been seen, then, + if that token wasn't ignored, reprocess the current token. */ + $this->inRow( + array( + 'name' => 'tr', + 'type' => HTML5::ENDTAG + ) + ); + + return $this->inCell($token); + + /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ + } elseif ($token['type'] === HTML5::ENDTAG && + in_array($token['name'], array('tbody', 'tfoot', 'thead')) + ) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. */ + if (!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Otherwise, act as if an end tag with the tag name "tr" had + been seen, then reprocess the current token. */ + $this->inRow( + array( + 'name' => 'tr', + 'type' => HTML5::ENDTAG + ) + ); + + return $this->inCell($token); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html", "td", "th" */ + } elseif ($token['type'] === HTML5::ENDTAG && in_array( + $token['name'], + array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr') + ) + ) { + /* Parse error. Ignore the token. */ + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in table". */ + $this->inTable($token); + } + } + + private function inCell($token) + { + /* An end tag whose tag name is one of: "td", "th" */ + if ($token['type'] === HTML5::ENDTAG && + ($token['name'] === 'td' || $token['name'] === 'th') + ) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as that of the token, then this is a + parse error and the token must be ignored. */ + if (!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Generate implied end tags, except for elements with the same + tag name as the token. */ + $this->generateImpliedEndTags(array($token['name'])); + + /* Now, if the current node is not an element with the same tag + name as the token, then this is a parse error. */ + // k + + /* Pop elements from this stack until an element with the same + tag name as the token has been popped from the stack. */ + while (true) { + $node = end($this->stack)->nodeName; + array_pop($this->stack); + + if ($node === $token['name']) { + break; + } + } + + /* Clear the list of active formatting elements up to the last + marker. */ + $this->clearTheActiveFormattingElementsUpToTheLastMarker(); + + /* Switch the insertion mode to "in row". (The current node + will be a tr element at this point.) */ + $this->mode = self::IN_ROW; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif ($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array( + 'caption', + 'col', + 'colgroup', + 'tbody', + 'td', + 'tfoot', + 'th', + 'thead', + 'tr' + ) + ) + ) { + /* If the stack of open elements does not have a td or th element + in table scope, then this is a parse error; ignore the token. + (innerHTML case) */ + if (!$this->elementInScope(array('td', 'th'), true)) { + // Ignore. + + /* Otherwise, close the cell (see below) and reprocess the current + token. */ + } else { + $this->closeCell(); + return $this->inRow($token); + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif ($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array( + 'caption', + 'col', + 'colgroup', + 'tbody', + 'td', + 'tfoot', + 'th', + 'thead', + 'tr' + ) + ) + ) { + /* If the stack of open elements does not have a td or th element + in table scope, then this is a parse error; ignore the token. + (innerHTML case) */ + if (!$this->elementInScope(array('td', 'th'), true)) { + // Ignore. + + /* Otherwise, close the cell (see below) and reprocess the current + token. */ + } else { + $this->closeCell(); + return $this->inRow($token); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html" */ + } elseif ($token['type'] === HTML5::ENDTAG && in_array( + $token['name'], + array('body', 'caption', 'col', 'colgroup', 'html') + ) + ) { + /* Parse error. Ignore the token. */ + + /* An end tag whose tag name is one of: "table", "tbody", "tfoot", + "thead", "tr" */ + } elseif ($token['type'] === HTML5::ENDTAG && in_array( + $token['name'], + array('table', 'tbody', 'tfoot', 'thead', 'tr') + ) + ) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as that of the token (which can only + happen for "tbody", "tfoot" and "thead", or, in the innerHTML case), + then this is a parse error and the token must be ignored. */ + if (!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise, close the cell (see below) and reprocess the current + token. */ + } else { + $this->closeCell(); + return $this->inRow($token); + } + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in body". */ + $this->inBody($token); + } + } + + private function inSelect($token) + { + /* Handle the token as follows: */ + + /* A character token */ + if ($token['type'] === HTML5::CHARACTR) { + /* Append the token's character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag token whose tag name is "option" */ + } elseif ($token['type'] === HTML5::STARTTAG && + $token['name'] === 'option' + ) { + /* If the current node is an option element, act as if an end tag + with the tag name "option" had been seen. */ + if (end($this->stack)->nodeName === 'option') { + $this->inSelect( + array( + 'name' => 'option', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* A start tag token whose tag name is "optgroup" */ + } elseif ($token['type'] === HTML5::STARTTAG && + $token['name'] === 'optgroup' + ) { + /* If the current node is an option element, act as if an end tag + with the tag name "option" had been seen. */ + if (end($this->stack)->nodeName === 'option') { + $this->inSelect( + array( + 'name' => 'option', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* If the current node is an optgroup element, act as if an end tag + with the tag name "optgroup" had been seen. */ + if (end($this->stack)->nodeName === 'optgroup') { + $this->inSelect( + array( + 'name' => 'optgroup', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* An end tag token whose tag name is "optgroup" */ + } elseif ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'optgroup' + ) { + /* First, if the current node is an option element, and the node + immediately before it in the stack of open elements is an optgroup + element, then act as if an end tag with the tag name "option" had + been seen. */ + $elements_in_stack = count($this->stack); + + if ($this->stack[$elements_in_stack - 1]->nodeName === 'option' && + $this->stack[$elements_in_stack - 2]->nodeName === 'optgroup' + ) { + $this->inSelect( + array( + 'name' => 'option', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* If the current node is an optgroup element, then pop that node + from the stack of open elements. Otherwise, this is a parse error, + ignore the token. */ + if ($this->stack[$elements_in_stack - 1] === 'optgroup') { + array_pop($this->stack); + } + + /* An end tag token whose tag name is "option" */ + } elseif ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'option' + ) { + /* If the current node is an option element, then pop that node + from the stack of open elements. Otherwise, this is a parse error, + ignore the token. */ + if (end($this->stack)->nodeName === 'option') { + array_pop($this->stack); + } + + /* An end tag whose tag name is "select" */ + } elseif ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'select' + ) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if (!$this->elementInScope($token['name'], true)) { + // w/e + + /* Otherwise: */ + } else { + /* Pop elements from the stack of open elements until a select + element has been popped from the stack. */ + while (true) { + $current = end($this->stack)->nodeName; + array_pop($this->stack); + + if ($current === 'select') { + break; + } + } + + /* Reset the insertion mode appropriately. */ + $this->resetInsertionMode(); + } + + /* A start tag whose tag name is "select" */ + } elseif ($token['name'] === 'select' && + $token['type'] === HTML5::STARTTAG + ) { + /* Parse error. Act as if the token had been an end tag with the + tag name "select" instead. */ + $this->inSelect( + array( + 'name' => 'select', + 'type' => HTML5::ENDTAG + ) + ); + + /* An end tag whose tag name is one of: "caption", "table", "tbody", + "tfoot", "thead", "tr", "td", "th" */ + } elseif (in_array( + $token['name'], + array( + 'caption', + 'table', + 'tbody', + 'tfoot', + 'thead', + 'tr', + 'td', + 'th' + ) + ) && $token['type'] === HTML5::ENDTAG + ) { + /* Parse error. */ + // w/e + + /* If the stack of open elements has an element in table scope with + the same tag name as that of the token, then act as if an end tag + with the tag name "select" had been seen, and reprocess the token. + Otherwise, ignore the token. */ + if ($this->elementInScope($token['name'], true)) { + $this->inSelect( + array( + 'name' => 'select', + 'type' => HTML5::ENDTAG + ) + ); + + $this->mainPhase($token); + } + + /* Anything else */ + } else { + /* Parse error. Ignore the token. */ + } + } + + private function afterBody($token) + { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Process the token as it would be processed if the insertion mode + was "in body". */ + $this->inBody($token); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the first element in the stack of open + elements (the html element), with the data attribute set to the + data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + $this->stack[0]->appendChild($comment); + + /* An end tag with the tag name "html" */ + } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') { + /* If the parser was originally created in order to handle the + setting of an element's innerHTML attribute, this is a parse error; + ignore the token. (The element will be an html element in this + case.) (innerHTML case) */ + + /* Otherwise, switch to the trailing end phase. */ + $this->phase = self::END_PHASE; + + /* Anything else */ + } else { + /* Parse error. Set the insertion mode to "in body" and reprocess + the token. */ + $this->mode = self::IN_BODY; + return $this->inBody($token); + } + } + + private function inFrameset($token) + { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag with the tag name "frameset" */ + } elseif ($token['name'] === 'frameset' && + $token['type'] === HTML5::STARTTAG + ) { + $this->insertElement($token); + + /* An end tag with the tag name "frameset" */ + } elseif ($token['name'] === 'frameset' && + $token['type'] === HTML5::ENDTAG + ) { + /* If the current node is the root html element, then this is a + parse error; ignore the token. (innerHTML case) */ + if (end($this->stack)->nodeName === 'html') { + // Ignore + + } else { + /* Otherwise, pop the current node from the stack of open + elements. */ + array_pop($this->stack); + + /* If the parser was not originally created in order to handle + the setting of an element's innerHTML attribute (innerHTML case), + and the current node is no longer a frameset element, then change + the insertion mode to "after frameset". */ + $this->mode = self::AFTR_FRAME; + } + + /* A start tag with the tag name "frame" */ + } elseif ($token['name'] === 'frame' && + $token['type'] === HTML5::STARTTAG + ) { + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Immediately pop the current node off the stack of open elements. */ + array_pop($this->stack); + + /* A start tag with the tag name "noframes" */ + } elseif ($token['name'] === 'noframes' && + $token['type'] === HTML5::STARTTAG + ) { + /* Process the token as if the insertion mode had been "in body". */ + $this->inBody($token); + + /* Anything else */ + } else { + /* Parse error. Ignore the token. */ + } + } + + private function afterFrameset($token) + { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* An end tag with the tag name "html" */ + } elseif ($token['name'] === 'html' && + $token['type'] === HTML5::ENDTAG + ) { + /* Switch to the trailing end phase. */ + $this->phase = self::END_PHASE; + + /* A start tag with the tag name "noframes" */ + } elseif ($token['name'] === 'noframes' && + $token['type'] === HTML5::STARTTAG + ) { + /* Process the token as if the insertion mode had been "in body". */ + $this->inBody($token); + + /* Anything else */ + } else { + /* Parse error. Ignore the token. */ + } + } + + private function trailingEndPhase($token) + { + /* After the main phase, as each token is emitted from the tokenisation + stage, it must be processed as described in this section. */ + + /* A DOCTYPE token */ + if ($token['type'] === HTML5::DOCTYPE) { + // Parse error. Ignore the token. + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the Document object with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + $this->dom->appendChild($comment); + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + } elseif ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Process the token as it would be processed in the main phase. */ + $this->mainPhase($token); + + /* A character token that is not one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE. Or a start tag token. Or an end tag token. */ + } elseif (($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || + $token['type'] === HTML5::STARTTAG || $token['type'] === HTML5::ENDTAG + ) { + /* Parse error. Switch back to the main phase and reprocess the + token. */ + $this->phase = self::MAIN_PHASE; + return $this->mainPhase($token); + + /* An end-of-file token */ + } elseif ($token['type'] === HTML5::EOF) { + /* OMG DONE!! */ + } + } + + private function insertElement($token, $append = true, $check = false) + { + // Proprietary workaround for libxml2's limitations with tag names + if ($check) { + // Slightly modified HTML5 tag-name modification, + // removing anything that's not an ASCII letter, digit, or hyphen + $token['name'] = preg_replace('/[^a-z0-9-]/i', '', $token['name']); + // Remove leading hyphens and numbers + $token['name'] = ltrim($token['name'], '-0..9'); + // In theory, this should ever be needed, but just in case + if ($token['name'] === '') { + $token['name'] = 'span'; + } // arbitrary generic choice + } + + $el = $this->dom->createElement($token['name']); + + foreach ($token['attr'] as $attr) { + if (!$el->hasAttribute($attr['name'])) { + $el->setAttribute($attr['name'], $attr['value']); + } + } + + $this->appendToRealParent($el); + $this->stack[] = $el; + + return $el; + } + + private function insertText($data) + { + $text = $this->dom->createTextNode($data); + $this->appendToRealParent($text); + } + + private function insertComment($data) + { + $comment = $this->dom->createComment($data); + $this->appendToRealParent($comment); + } + + private function appendToRealParent($node) + { + if ($this->foster_parent === null) { + end($this->stack)->appendChild($node); + + } elseif ($this->foster_parent !== null) { + /* If the foster parent element is the parent element of the + last table element in the stack of open elements, then the new + node must be inserted immediately before the last table element + in the stack of open elements in the foster parent element; + otherwise, the new node must be appended to the foster parent + element. */ + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + if ($this->stack[$n]->nodeName === 'table' && + $this->stack[$n]->parentNode !== null + ) { + $table = $this->stack[$n]; + break; + } + } + + if (isset($table) && $this->foster_parent->isSameNode($table->parentNode)) { + $this->foster_parent->insertBefore($node, $table); + } else { + $this->foster_parent->appendChild($node); + } + + $this->foster_parent = null; + } + } + + private function elementInScope($el, $table = false) + { + if (is_array($el)) { + foreach ($el as $element) { + if ($this->elementInScope($element, $table)) { + return true; + } + } + + return false; + } + + $leng = count($this->stack); + + for ($n = 0; $n < $leng; $n++) { + /* 1. Initialise node to be the current node (the bottommost node of + the stack). */ + $node = $this->stack[$leng - 1 - $n]; + + if ($node->tagName === $el) { + /* 2. If node is the target node, terminate in a match state. */ + return true; + + } elseif ($node->tagName === 'table') { + /* 3. Otherwise, if node is a table element, terminate in a failure + state. */ + return false; + + } elseif ($table === true && in_array( + $node->tagName, + array( + 'caption', + 'td', + 'th', + 'button', + 'marquee', + 'object' + ) + ) + ) { + /* 4. Otherwise, if the algorithm is the "has an element in scope" + variant (rather than the "has an element in table scope" variant), + and node is one of the following, terminate in a failure state. */ + return false; + + } elseif ($node === $node->ownerDocument->documentElement) { + /* 5. Otherwise, if node is an html element (root element), terminate + in a failure state. (This can only happen if the node is the topmost + node of the stack of open elements, and prevents the next step from + being invoked if there are no more elements in the stack.) */ + return false; + } + + /* Otherwise, set node to the previous entry in the stack of open + elements and return to step 2. (This will never fail, since the loop + will always terminate in the previous step if the top of the stack + is reached.) */ + } + } + + private function reconstructActiveFormattingElements() + { + /* 1. If there are no entries in the list of active formatting elements, + then there is nothing to reconstruct; stop this algorithm. */ + $formatting_elements = count($this->a_formatting); + + if ($formatting_elements === 0) { + return false; + } + + /* 3. Let entry be the last (most recently added) element in the list + of active formatting elements. */ + $entry = end($this->a_formatting); + + /* 2. If the last (most recently added) entry in the list of active + formatting elements is a marker, or if it is an element that is in the + stack of open elements, then there is nothing to reconstruct; stop this + algorithm. */ + if ($entry === self::MARKER || in_array($entry, $this->stack, true)) { + return false; + } + + for ($a = $formatting_elements - 1; $a >= 0; true) { + /* 4. If there are no entries before entry in the list of active + formatting elements, then jump to step 8. */ + if ($a === 0) { + $step_seven = false; + break; + } + + /* 5. Let entry be the entry one earlier than entry in the list of + active formatting elements. */ + $a--; + $entry = $this->a_formatting[$a]; + + /* 6. If entry is neither a marker nor an element that is also in + thetack of open elements, go to step 4. */ + if ($entry === self::MARKER || in_array($entry, $this->stack, true)) { + break; + } + } + + while (true) { + /* 7. Let entry be the element one later than entry in the list of + active formatting elements. */ + if (isset($step_seven) && $step_seven === true) { + $a++; + $entry = $this->a_formatting[$a]; + } + + /* 8. Perform a shallow clone of the element entry to obtain clone. */ + $clone = $entry->cloneNode(); + + /* 9. Append clone to the current node and push it onto the stack + of open elements so that it is the new current node. */ + end($this->stack)->appendChild($clone); + $this->stack[] = $clone; + + /* 10. Replace the entry for entry in the list with an entry for + clone. */ + $this->a_formatting[$a] = $clone; + + /* 11. If the entry for clone in the list of active formatting + elements is not the last entry in the list, return to step 7. */ + if (end($this->a_formatting) !== $clone) { + $step_seven = true; + } else { + break; + } + } + } + + private function clearTheActiveFormattingElementsUpToTheLastMarker() + { + /* When the steps below require the UA to clear the list of active + formatting elements up to the last marker, the UA must perform the + following steps: */ + + while (true) { + /* 1. Let entry be the last (most recently added) entry in the list + of active formatting elements. */ + $entry = end($this->a_formatting); + + /* 2. Remove entry from the list of active formatting elements. */ + array_pop($this->a_formatting); + + /* 3. If entry was a marker, then stop the algorithm at this point. + The list has been cleared up to the last marker. */ + if ($entry === self::MARKER) { + break; + } + } + } + + private function generateImpliedEndTags($exclude = array()) + { + /* When the steps below require the UA to generate implied end tags, + then, if the current node is a dd element, a dt element, an li element, + a p element, a td element, a th element, or a tr element, the UA must + act as if an end tag with the respective tag name had been seen and + then generate implied end tags again. */ + $node = end($this->stack); + $elements = array_diff(array('dd', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude); + + while (in_array(end($this->stack)->nodeName, $elements)) { + array_pop($this->stack); + } + } + + private function getElementCategory($node) + { + $name = $node->tagName; + if (in_array($name, $this->special)) { + return self::SPECIAL; + } elseif (in_array($name, $this->scoping)) { + return self::SCOPING; + } elseif (in_array($name, $this->formatting)) { + return self::FORMATTING; + } else { + return self::PHRASING; + } + } + + private function clearStackToTableContext($elements) + { + /* When the steps above require the UA to clear the stack back to a + table context, it means that the UA must, while the current node is not + a table element or an html element, pop elements from the stack of open + elements. If this causes any elements to be popped from the stack, then + this is a parse error. */ + while (true) { + $node = end($this->stack)->nodeName; + + if (in_array($node, $elements)) { + break; + } else { + array_pop($this->stack); + } + } + } + + private function resetInsertionMode() + { + /* 1. Let last be false. */ + $last = false; + $leng = count($this->stack); + + for ($n = $leng - 1; $n >= 0; $n--) { + /* 2. Let node be the last node in the stack of open elements. */ + $node = $this->stack[$n]; + + /* 3. If node is the first node in the stack of open elements, then + set last to true. If the element whose innerHTML attribute is being + set is neither a td element nor a th element, then set node to the + element whose innerHTML attribute is being set. (innerHTML case) */ + if ($this->stack[0]->isSameNode($node)) { + $last = true; + } + + /* 4. If node is a select element, then switch the insertion mode to + "in select" and abort these steps. (innerHTML case) */ + if ($node->nodeName === 'select') { + $this->mode = self::IN_SELECT; + break; + + /* 5. If node is a td or th element, then switch the insertion mode + to "in cell" and abort these steps. */ + } elseif ($node->nodeName === 'td' || $node->nodeName === 'th') { + $this->mode = self::IN_CELL; + break; + + /* 6. If node is a tr element, then switch the insertion mode to + "in row" and abort these steps. */ + } elseif ($node->nodeName === 'tr') { + $this->mode = self::IN_ROW; + break; + + /* 7. If node is a tbody, thead, or tfoot element, then switch the + insertion mode to "in table body" and abort these steps. */ + } elseif (in_array($node->nodeName, array('tbody', 'thead', 'tfoot'))) { + $this->mode = self::IN_TBODY; + break; + + /* 8. If node is a caption element, then switch the insertion mode + to "in caption" and abort these steps. */ + } elseif ($node->nodeName === 'caption') { + $this->mode = self::IN_CAPTION; + break; + + /* 9. If node is a colgroup element, then switch the insertion mode + to "in column group" and abort these steps. (innerHTML case) */ + } elseif ($node->nodeName === 'colgroup') { + $this->mode = self::IN_CGROUP; + break; + + /* 10. If node is a table element, then switch the insertion mode + to "in table" and abort these steps. */ + } elseif ($node->nodeName === 'table') { + $this->mode = self::IN_TABLE; + break; + + /* 11. If node is a head element, then switch the insertion mode + to "in body" ("in body"! not "in head"!) and abort these steps. + (innerHTML case) */ + } elseif ($node->nodeName === 'head') { + $this->mode = self::IN_BODY; + break; + + /* 12. If node is a body element, then switch the insertion mode to + "in body" and abort these steps. */ + } elseif ($node->nodeName === 'body') { + $this->mode = self::IN_BODY; + break; + + /* 13. If node is a frameset element, then switch the insertion + mode to "in frameset" and abort these steps. (innerHTML case) */ + } elseif ($node->nodeName === 'frameset') { + $this->mode = self::IN_FRAME; + break; + + /* 14. If node is an html element, then: if the head element + pointer is null, switch the insertion mode to "before head", + otherwise, switch the insertion mode to "after head". In either + case, abort these steps. (innerHTML case) */ + } elseif ($node->nodeName === 'html') { + $this->mode = ($this->head_pointer === null) + ? self::BEFOR_HEAD + : self::AFTER_HEAD; + + break; + + /* 15. If last is true, then set the insertion mode to "in body" + and abort these steps. (innerHTML case) */ + } elseif ($last) { + $this->mode = self::IN_BODY; + break; + } + } + } + + private function closeCell() + { + /* If the stack of open elements has a td or th element in table scope, + then act as if an end tag token with that tag name had been seen. */ + foreach (array('td', 'th') as $cell) { + if ($this->elementInScope($cell, true)) { + $this->inCell( + array( + 'name' => $cell, + 'type' => HTML5::ENDTAG + ) + ); + + break; + } + } + } + + public function save() + { + return $this->dom; + } +} diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Node.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Node.php new file mode 100644 index 000000000..3995fec9f --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Node.php @@ -0,0 +1,49 @@ +data = $data; + $this->line = $line; + $this->col = $col; + } + + public function toTokenPair() { + return array(new HTMLPurifier_Token_Comment($this->data, $this->line, $this->col), null); + } +} diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Node/Element.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Node/Element.php new file mode 100644 index 000000000..6cbf56dad --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Node/Element.php @@ -0,0 +1,59 @@ + form or the form, i.e. + * is it a pair of start/end tokens or an empty token. + * @bool + */ + public $empty = false; + + public $endCol = null, $endLine = null, $endArmor = array(); + + public function __construct($name, $attr = array(), $line = null, $col = null, $armor = array()) { + $this->name = $name; + $this->attr = $attr; + $this->line = $line; + $this->col = $col; + $this->armor = $armor; + } + + public function toTokenPair() { + // XXX inefficiency here, normalization is not necessary + if ($this->empty) { + return array(new HTMLPurifier_Token_Empty($this->name, $this->attr, $this->line, $this->col, $this->armor), null); + } else { + $start = new HTMLPurifier_Token_Start($this->name, $this->attr, $this->line, $this->col, $this->armor); + $end = new HTMLPurifier_Token_End($this->name, array(), $this->endLine, $this->endCol, $this->endArmor); + //$end->start = $start; + return array($start, $end); + } + } +} + diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Node/Text.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Node/Text.php new file mode 100644 index 000000000..aec916647 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Node/Text.php @@ -0,0 +1,54 @@ +data = $data; + $this->is_whitespace = $is_whitespace; + $this->line = $line; + $this->col = $col; + } + + public function toTokenPair() { + return array(new HTMLPurifier_Token_Text($this->data, $this->line, $this->col), null); + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/PercentEncoder.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/PercentEncoder.php similarity index 78% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/PercentEncoder.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/PercentEncoder.php index a43c44f4c..18c8bbb00 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/PercentEncoder.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/PercentEncoder.php @@ -13,17 +13,26 @@ class HTMLPurifier_PercentEncoder /** * Reserved characters to preserve when using encode(). + * @type array */ protected $preserve = array(); /** * String of characters that should be preserved while using encode(). + * @param bool $preserve */ - public function __construct($preserve = false) { + public function __construct($preserve = false) + { // unreserved letters, ought to const-ify - for ($i = 48; $i <= 57; $i++) $this->preserve[$i] = true; // digits - for ($i = 65; $i <= 90; $i++) $this->preserve[$i] = true; // upper-case - for ($i = 97; $i <= 122; $i++) $this->preserve[$i] = true; // lower-case + for ($i = 48; $i <= 57; $i++) { // digits + $this->preserve[$i] = true; + } + for ($i = 65; $i <= 90; $i++) { // upper-case + $this->preserve[$i] = true; + } + for ($i = 97; $i <= 122; $i++) { // lower-case + $this->preserve[$i] = true; + } $this->preserve[45] = true; // Dash - $this->preserve[46] = true; // Period . $this->preserve[95] = true; // Underscore _ @@ -44,13 +53,14 @@ class HTMLPurifier_PercentEncoder * Assumes that the string has already been normalized, making any * and all percent escape sequences valid. Percents will not be * re-escaped, regardless of their status in $preserve - * @param $string String to be encoded - * @return Encoded string. + * @param string $string String to be encoded + * @return string Encoded string. */ - public function encode($string) { + public function encode($string) + { $ret = ''; for ($i = 0, $c = strlen($string); $i < $c; $i++) { - if ($string[$i] !== '%' && !isset($this->preserve[$int = ord($string[$i])]) ) { + if ($string[$i] !== '%' && !isset($this->preserve[$int = ord($string[$i])])) { $ret .= '%' . sprintf('%02X', $int); } else { $ret .= $string[$i]; @@ -64,10 +74,14 @@ class HTMLPurifier_PercentEncoder * @warning This function is affected by $preserve, even though the * usual desired behavior is for this not to preserve those * characters. Be careful when reusing instances of PercentEncoder! - * @param $string String to normalize + * @param string $string String to normalize + * @return string */ - public function normalize($string) { - if ($string == '') return ''; + public function normalize($string) + { + if ($string == '') { + return ''; + } $parts = explode('%', $string); $ret = array_shift($parts); foreach ($parts as $part) { @@ -92,7 +106,6 @@ class HTMLPurifier_PercentEncoder } return $ret; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Printer.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Printer.php similarity index 54% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Printer.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Printer.php index e7eb82e83..549e4cea1 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Printer.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Printer.php @@ -7,25 +7,30 @@ class HTMLPurifier_Printer { /** - * Instance of HTMLPurifier_Generator for HTML generation convenience funcs + * For HTML generation convenience funcs. + * @type HTMLPurifier_Generator */ protected $generator; /** - * Instance of HTMLPurifier_Config, for easy access + * For easy access. + * @type HTMLPurifier_Config */ protected $config; /** * Initialize $generator. */ - public function __construct() { + public function __construct() + { } /** * Give generator necessary configuration if possible + * @param HTMLPurifier_Config $config */ - public function prepareGenerator($config) { + public function prepareGenerator($config) + { $all = $config->getAll(); $context = new HTMLPurifier_Context(); $this->generator = new HTMLPurifier_Generator($config, $context); @@ -39,45 +44,62 @@ class HTMLPurifier_Printer /** * Returns a start tag - * @param $tag Tag name - * @param $attr Attribute array + * @param string $tag Tag name + * @param array $attr Attribute array + * @return string */ - protected function start($tag, $attr = array()) { + protected function start($tag, $attr = array()) + { return $this->generator->generateFromToken( - new HTMLPurifier_Token_Start($tag, $attr ? $attr : array()) - ); + new HTMLPurifier_Token_Start($tag, $attr ? $attr : array()) + ); } /** - * Returns an end teg - * @param $tag Tag name + * Returns an end tag + * @param string $tag Tag name + * @return string */ - protected function end($tag) { + protected function end($tag) + { return $this->generator->generateFromToken( - new HTMLPurifier_Token_End($tag) - ); + new HTMLPurifier_Token_End($tag) + ); } /** * Prints a complete element with content inside - * @param $tag Tag name - * @param $contents Element contents - * @param $attr Tag attributes - * @param $escape Bool whether or not to escape contents + * @param string $tag Tag name + * @param string $contents Element contents + * @param array $attr Tag attributes + * @param bool $escape whether or not to escape contents + * @return string */ - protected function element($tag, $contents, $attr = array(), $escape = true) { + protected function element($tag, $contents, $attr = array(), $escape = true) + { return $this->start($tag, $attr) . - ($escape ? $this->escape($contents) : $contents) . - $this->end($tag); + ($escape ? $this->escape($contents) : $contents) . + $this->end($tag); } - protected function elementEmpty($tag, $attr = array()) { + /** + * @param string $tag + * @param array $attr + * @return string + */ + protected function elementEmpty($tag, $attr = array()) + { return $this->generator->generateFromToken( new HTMLPurifier_Token_Empty($tag, $attr) ); } - protected function text($text) { + /** + * @param string $text + * @return string + */ + protected function text($text) + { return $this->generator->generateFromToken( new HTMLPurifier_Token_Text($text) ); @@ -85,24 +107,29 @@ class HTMLPurifier_Printer /** * Prints a simple key/value row in a table. - * @param $name Key - * @param $value Value + * @param string $name Key + * @param mixed $value Value + * @return string */ - protected function row($name, $value) { - if (is_bool($value)) $value = $value ? 'On' : 'Off'; + protected function row($name, $value) + { + if (is_bool($value)) { + $value = $value ? 'On' : 'Off'; + } return $this->start('tr') . "\n" . - $this->element('th', $name) . "\n" . - $this->element('td', $value) . "\n" . - $this->end('tr') - ; + $this->element('th', $name) . "\n" . + $this->element('td', $value) . "\n" . + $this->end('tr'); } /** * Escapes a string for HTML output. - * @param $string String to escape + * @param string $string String to escape + * @return string */ - protected function escape($string) { + protected function escape($string) + { $string = HTMLPurifier_Encoder::cleanUTF8($string); $string = htmlspecialchars($string, ENT_COMPAT, 'UTF-8'); return $string; @@ -110,32 +137,46 @@ class HTMLPurifier_Printer /** * Takes a list of strings and turns them into a single list - * @param $array List of strings - * @param $polite Bool whether or not to add an end before the last + * @param string[] $array List of strings + * @param bool $polite Bool whether or not to add an end before the last + * @return string */ - protected function listify($array, $polite = false) { - if (empty($array)) return 'None'; + protected function listify($array, $polite = false) + { + if (empty($array)) { + return 'None'; + } $ret = ''; $i = count($array); foreach ($array as $value) { $i--; $ret .= $value; - if ($i > 0 && !($polite && $i == 1)) $ret .= ', '; - if ($polite && $i == 1) $ret .= 'and '; + if ($i > 0 && !($polite && $i == 1)) { + $ret .= ', '; + } + if ($polite && $i == 1) { + $ret .= 'and '; + } } return $ret; } /** * Retrieves the class of an object without prefixes, as well as metadata - * @param $obj Object to determine class of - * @param $prefix Further prefix to remove + * @param object $obj Object to determine class of + * @param string $sec_prefix Further prefix to remove + * @return string */ - protected function getClass($obj, $sec_prefix = '') { + protected function getClass($obj, $sec_prefix = '') + { static $five = null; - if ($five === null) $five = version_compare(PHP_VERSION, '5', '>='); + if ($five === null) { + $five = version_compare(PHP_VERSION, '5', '>='); + } $prefix = 'HTMLPurifier_' . $sec_prefix; - if (!$five) $prefix = strtolower($prefix); + if (!$five) { + $prefix = strtolower($prefix); + } $class = str_replace($prefix, '', get_class($obj)); $lclass = strtolower($class); $class .= '('; @@ -164,13 +205,14 @@ class HTMLPurifier_Printer break; case 'css_importantdecorator': $class .= $this->getClass($obj->def, $sec_prefix); - if ($obj->allow) $class .= ', !important'; + if ($obj->allow) { + $class .= ', !important'; + } break; } $class .= ')'; return $class; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Printer/CSSDefinition.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Printer/CSSDefinition.php similarity index 85% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Printer/CSSDefinition.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Printer/CSSDefinition.php index 81f986590..29505fe12 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Printer/CSSDefinition.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Printer/CSSDefinition.php @@ -2,10 +2,17 @@ class HTMLPurifier_Printer_CSSDefinition extends HTMLPurifier_Printer { - + /** + * @type HTMLPurifier_CSSDefinition + */ protected $def; - public function render($config) { + /** + * @param HTMLPurifier_Config $config + * @return string + */ + public function render($config) + { $this->def = $config->getCSSDefinition(); $ret = ''; @@ -32,7 +39,6 @@ class HTMLPurifier_Printer_CSSDefinition extends HTMLPurifier_Printer return $ret; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Printer/ConfigForm.css b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Printer/ConfigForm.css similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Printer/ConfigForm.css rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Printer/ConfigForm.css diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Printer/ConfigForm.js b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Printer/ConfigForm.js similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Printer/ConfigForm.js rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Printer/ConfigForm.js diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Printer/ConfigForm.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Printer/ConfigForm.php similarity index 60% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Printer/ConfigForm.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Printer/ConfigForm.php index 02aa65689..36100ce73 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Printer/ConfigForm.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Printer/ConfigForm.php @@ -7,17 +7,20 @@ class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer { /** - * Printers for specific fields + * Printers for specific fields. + * @type HTMLPurifier_Printer[] */ protected $fields = array(); /** - * Documentation URL, can have fragment tagged on end + * Documentation URL, can have fragment tagged on end. + * @type string */ protected $docURL; /** - * Name of form element to stuff config in + * Name of form element to stuff config in. + * @type string */ protected $name; @@ -25,24 +28,27 @@ class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer * Whether or not to compress directive names, clipping them off * after a certain amount of letters. False to disable or integer letters * before clipping. + * @type bool */ protected $compress = false; /** - * @param $name Form element name for directives to be stuffed into - * @param $doc_url String documentation URL, will have fragment tagged on - * @param $compress Integer max length before compressing a directive name, set to false to turn off + * @param string $name Form element name for directives to be stuffed into + * @param string $doc_url String documentation URL, will have fragment tagged on + * @param bool $compress Integer max length before compressing a directive name, set to false to turn off */ public function __construct( - $name, $doc_url = null, $compress = false + $name, + $doc_url = null, + $compress = false ) { parent::__construct(); $this->docURL = $doc_url; - $this->name = $name; + $this->name = $name; $this->compress = $compress; // initialize sub-printers - $this->fields[0] = new HTMLPurifier_Printer_ConfigForm_default(); - $this->fields[HTMLPurifier_VarParser::BOOL] = new HTMLPurifier_Printer_ConfigForm_bool(); + $this->fields[0] = new HTMLPurifier_Printer_ConfigForm_default(); + $this->fields[HTMLPurifier_VarParser::BOOL] = new HTMLPurifier_Printer_ConfigForm_bool(); } /** @@ -50,32 +56,42 @@ class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer * @param $cols Integer columns of textarea, null to use default * @param $rows Integer rows of textarea, null to use default */ - public function setTextareaDimensions($cols = null, $rows = null) { - if ($cols) $this->fields['default']->cols = $cols; - if ($rows) $this->fields['default']->rows = $rows; + public function setTextareaDimensions($cols = null, $rows = null) + { + if ($cols) { + $this->fields['default']->cols = $cols; + } + if ($rows) { + $this->fields['default']->rows = $rows; + } } /** * Retrieves styling, in case it is not accessible by webserver */ - public static function getCSS() { + public static function getCSS() + { return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css'); } /** * Retrieves JavaScript, in case it is not accessible by webserver */ - public static function getJavaScript() { + public static function getJavaScript() + { return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js'); } /** * Returns HTML output for a configuration form - * @param $config Configuration object of current form state, or an array + * @param HTMLPurifier_Config|array $config Configuration object of current form state, or an array * where [0] has an HTML namespace and [1] is being rendered. - * @param $allowed Optional namespace(s) and directives to restrict form to. + * @param array|bool $allowed Optional namespace(s) and directives to restrict form to. + * @param bool $render_controls + * @return string */ - public function render($config, $allowed = true, $render_controls = true) { + public function render($config, $allowed = true, $render_controls = true) + { if (is_array($config) && isset($config[0])) { $gen_config = $config[0]; $config = $config[1]; @@ -91,29 +107,29 @@ class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer $all = array(); foreach ($allowed as $key) { list($ns, $directive) = $key; - $all[$ns][$directive] = $config->get($ns .'.'. $directive); + $all[$ns][$directive] = $config->get($ns . '.' . $directive); } $ret = ''; $ret .= $this->start('table', array('class' => 'hp-config')); $ret .= $this->start('thead'); $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Directive', array('class' => 'hp-directive')); - $ret .= $this->element('th', 'Value', array('class' => 'hp-value')); + $ret .= $this->element('th', 'Directive', array('class' => 'hp-directive')); + $ret .= $this->element('th', 'Value', array('class' => 'hp-value')); $ret .= $this->end('tr'); $ret .= $this->end('thead'); foreach ($all as $ns => $directives) { $ret .= $this->renderNamespace($ns, $directives); } if ($render_controls) { - $ret .= $this->start('tbody'); - $ret .= $this->start('tr'); - $ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls')); - $ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit')); - $ret .= '[Reset]'; - $ret .= $this->end('td'); - $ret .= $this->end('tr'); - $ret .= $this->end('tbody'); + $ret .= $this->start('tbody'); + $ret .= $this->start('tr'); + $ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls')); + $ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit')); + $ret .= '[Reset]'; + $ret .= $this->end('td'); + $ret .= $this->end('tr'); + $ret .= $this->end('tbody'); } $ret .= $this->end('table'); return $ret; @@ -122,13 +138,15 @@ class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer /** * Renders a single namespace * @param $ns String namespace name - * @param $directive Associative array of directives to values + * @param array $directives array of directives to values + * @return string */ - protected function renderNamespace($ns, $directives) { + protected function renderNamespace($ns, $directives) + { $ret = ''; $ret .= $this->start('tbody', array('class' => 'namespace')); $ret .= $this->start('tr'); - $ret .= $this->element('th', $ns, array('colspan' => 2)); + $ret .= $this->element('th', $ns, array('colspan' => 2)); $ret .= $this->end('tr'); $ret .= $this->end('tbody'); $ret .= $this->start('tbody'); @@ -139,40 +157,44 @@ class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer $url = str_replace('%s', urlencode("$ns.$directive"), $this->docURL); $ret .= $this->start('a', array('href' => $url)); } - $attr = array('for' => "{$this->name}:$ns.$directive"); + $attr = array('for' => "{$this->name}:$ns.$directive"); - // crop directive name if it's too long - if (!$this->compress || (strlen($directive) < $this->compress)) { - $directive_disp = $directive; - } else { - $directive_disp = substr($directive, 0, $this->compress - 2) . '...'; - $attr['title'] = $directive; - } + // crop directive name if it's too long + if (!$this->compress || (strlen($directive) < $this->compress)) { + $directive_disp = $directive; + } else { + $directive_disp = substr($directive, 0, $this->compress - 2) . '...'; + $attr['title'] = $directive; + } - $ret .= $this->element( - 'label', - $directive_disp, - // component printers must create an element with this id - $attr - ); - if ($this->docURL) $ret .= $this->end('a'); + $ret .= $this->element( + 'label', + $directive_disp, + // component printers must create an element with this id + $attr + ); + if ($this->docURL) { + $ret .= $this->end('a'); + } $ret .= $this->end('th'); $ret .= $this->start('td'); - $def = $this->config->def->info["$ns.$directive"]; - if (is_int($def)) { - $allow_null = $def < 0; - $type = abs($def); - } else { - $type = $def->type; - $allow_null = isset($def->allow_null); - } - if (!isset($this->fields[$type])) $type = 0; // default - $type_obj = $this->fields[$type]; - if ($allow_null) { - $type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj); - } - $ret .= $type_obj->render($ns, $directive, $value, $this->name, array($this->genConfig, $this->config)); + $def = $this->config->def->info["$ns.$directive"]; + if (is_int($def)) { + $allow_null = $def < 0; + $type = abs($def); + } else { + $type = $def->type; + $allow_null = isset($def->allow_null); + } + if (!isset($this->fields[$type])) { + $type = 0; + } // default + $type_obj = $this->fields[$type]; + if ($allow_null) { + $type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj); + } + $ret .= $type_obj->render($ns, $directive, $value, $this->name, array($this->genConfig, $this->config)); $ret .= $this->end('td'); $ret .= $this->end('tr'); } @@ -185,19 +207,33 @@ class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer /** * Printer decorator for directives that accept null */ -class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer { +class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer +{ /** * Printer being decorated + * @type HTMLPurifier_Printer */ protected $obj; + /** - * @param $obj Printer to decorate + * @param HTMLPurifier_Printer $obj Printer to decorate */ - public function __construct($obj) { + public function __construct($obj) + { parent::__construct(); $this->obj = $obj; } - public function render($ns, $directive, $value, $name, $config) { + + /** + * @param string $ns + * @param string $directive + * @param string $value + * @param string $name + * @param HTMLPurifier_Config|array $config + * @return string + */ + public function render($ns, $directive, $value, $name, $config) + { if (is_array($config) && isset($config[0])) { $gen_config = $config[0]; $config = $config[1]; @@ -215,15 +251,19 @@ class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer 'type' => 'checkbox', 'value' => '1', 'class' => 'null-toggle', - 'name' => "$name"."[Null_$ns.$directive]", + 'name' => "$name" . "[Null_$ns.$directive]", 'id' => "$name:Null_$ns.$directive", 'onclick' => "toggleWriteability('$name:$ns.$directive',checked)" // INLINE JAVASCRIPT!!!! ); if ($this->obj instanceof HTMLPurifier_Printer_ConfigForm_bool) { // modify inline javascript slightly - $attr['onclick'] = "toggleWriteability('$name:Yes_$ns.$directive',checked);toggleWriteability('$name:No_$ns.$directive',checked)"; + $attr['onclick'] = + "toggleWriteability('$name:Yes_$ns.$directive',checked);" . + "toggleWriteability('$name:No_$ns.$directive',checked)"; + } + if ($value === null) { + $attr['checked'] = 'checked'; } - if ($value === null) $attr['checked'] = 'checked'; $ret .= $this->elementEmpty('input', $attr); $ret .= $this->text(' or '); $ret .= $this->elementEmpty('br'); @@ -235,10 +275,28 @@ class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer /** * Swiss-army knife configuration form field printer */ -class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer { +class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer +{ + /** + * @type int + */ public $cols = 18; + + /** + * @type int + */ public $rows = 5; - public function render($ns, $directive, $value, $name, $config) { + + /** + * @param string $ns + * @param string $directive + * @param string $value + * @param string $name + * @param HTMLPurifier_Config|array $config + * @return string + */ + public function render($ns, $directive, $value, $name, $config) + { if (is_array($config) && isset($config[0])) { $gen_config = $config[0]; $config = $config[1]; @@ -262,6 +320,7 @@ class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer { foreach ($array as $val => $b) { $value[] = $val; } + //TODO does this need a break? case HTMLPurifier_VarParser::ALIST: $value = implode(PHP_EOL, $value); break; @@ -281,25 +340,27 @@ class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer { $value = serialize($value); } $attr = array( - 'name' => "$name"."[$ns.$directive]", + 'name' => "$name" . "[$ns.$directive]", 'id' => "$name:$ns.$directive" ); - if ($value === null) $attr['disabled'] = 'disabled'; + if ($value === null) { + $attr['disabled'] = 'disabled'; + } if (isset($def->allowed)) { $ret .= $this->start('select', $attr); foreach ($def->allowed as $val => $b) { $attr = array(); - if ($value == $val) $attr['selected'] = 'selected'; + if ($value == $val) { + $attr['selected'] = 'selected'; + } $ret .= $this->element('option', $val, $attr); } $ret .= $this->end('select'); - } elseif ( - $type === HTMLPurifier_VarParser::TEXT || - $type === HTMLPurifier_VarParser::ITEXT || - $type === HTMLPurifier_VarParser::ALIST || - $type === HTMLPurifier_VarParser::HASH || - $type === HTMLPurifier_VarParser::LOOKUP - ) { + } elseif ($type === HTMLPurifier_VarParser::TEXT || + $type === HTMLPurifier_VarParser::ITEXT || + $type === HTMLPurifier_VarParser::ALIST || + $type === HTMLPurifier_VarParser::HASH || + $type === HTMLPurifier_VarParser::LOOKUP) { $attr['cols'] = $this->cols; $attr['rows'] = $this->rows; $ret .= $this->start('textarea', $attr); @@ -317,8 +378,18 @@ class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer { /** * Bool form field printer */ -class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer { - public function render($ns, $directive, $value, $name, $config) { +class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer +{ + /** + * @param string $ns + * @param string $directive + * @param string $value + * @param string $name + * @param HTMLPurifier_Config|array $config + * @return string + */ + public function render($ns, $directive, $value, $name, $config) + { if (is_array($config) && isset($config[0])) { $gen_config = $config[0]; $config = $config[1]; @@ -336,12 +407,16 @@ class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer { $attr = array( 'type' => 'radio', - 'name' => "$name"."[$ns.$directive]", + 'name' => "$name" . "[$ns.$directive]", 'id' => "$name:Yes_$ns.$directive", 'value' => '1' ); - if ($value === true) $attr['checked'] = 'checked'; - if ($value === null) $attr['disabled'] = 'disabled'; + if ($value === true) { + $attr['checked'] = 'checked'; + } + if ($value === null) { + $attr['disabled'] = 'disabled'; + } $ret .= $this->elementEmpty('input', $attr); $ret .= $this->start('label', array('for' => "$name:No_$ns.$directive")); @@ -351,12 +426,16 @@ class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer { $attr = array( 'type' => 'radio', - 'name' => "$name"."[$ns.$directive]", + 'name' => "$name" . "[$ns.$directive]", 'id' => "$name:No_$ns.$directive", 'value' => '0' ); - if ($value === false) $attr['checked'] = 'checked'; - if ($value === null) $attr['disabled'] = 'disabled'; + if ($value === false) { + $attr['checked'] = 'checked'; + } + if ($value === null) { + $attr['disabled'] = 'disabled'; + } $ret .= $this->elementEmpty('input', $attr); $ret .= $this->end('div'); diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Printer/HTMLDefinition.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Printer/HTMLDefinition.php similarity index 53% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Printer/HTMLDefinition.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Printer/HTMLDefinition.php index 8a8f126b8..5f2f2f8a7 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Printer/HTMLDefinition.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Printer/HTMLDefinition.php @@ -4,11 +4,16 @@ class HTMLPurifier_Printer_HTMLDefinition extends HTMLPurifier_Printer { /** - * Instance of HTMLPurifier_HTMLDefinition, for easy access + * @type HTMLPurifier_HTMLDefinition, for easy access */ protected $def; - public function render($config) { + /** + * @param HTMLPurifier_Config $config + * @return string + */ + public function render($config) + { $ret = ''; $this->config =& $config; @@ -28,8 +33,10 @@ class HTMLPurifier_Printer_HTMLDefinition extends HTMLPurifier_Printer /** * Renders the Doctype table + * @return string */ - protected function renderDoctype() { + protected function renderDoctype() + { $doctype = $this->def->doctype; $ret = ''; $ret .= $this->start('table'); @@ -45,8 +52,10 @@ class HTMLPurifier_Printer_HTMLDefinition extends HTMLPurifier_Printer /** * Renders environment table, which is miscellaneous info + * @return string */ - protected function renderEnvironment() { + protected function renderEnvironment() + { $def = $this->def; $ret = ''; @@ -59,28 +68,28 @@ class HTMLPurifier_Printer_HTMLDefinition extends HTMLPurifier_Printer $ret .= $this->row('Block wrap name', $def->info_block_wrapper); $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Global attributes'); - $ret .= $this->element('td', $this->listifyAttr($def->info_global_attr),0,0); + $ret .= $this->element('th', 'Global attributes'); + $ret .= $this->element('td', $this->listifyAttr($def->info_global_attr), null, 0); $ret .= $this->end('tr'); $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Tag transforms'); - $list = array(); - foreach ($def->info_tag_transform as $old => $new) { - $new = $this->getClass($new, 'TagTransform_'); - $list[] = "<$old> with $new"; - } - $ret .= $this->element('td', $this->listify($list)); + $ret .= $this->element('th', 'Tag transforms'); + $list = array(); + foreach ($def->info_tag_transform as $old => $new) { + $new = $this->getClass($new, 'TagTransform_'); + $list[] = "<$old> with $new"; + } + $ret .= $this->element('td', $this->listify($list)); $ret .= $this->end('tr'); $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Pre-AttrTransform'); - $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_pre)); + $ret .= $this->element('th', 'Pre-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_pre)); $ret .= $this->end('tr'); $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Post-AttrTransform'); - $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_post)); + $ret .= $this->element('th', 'Post-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_post)); $ret .= $this->end('tr'); $ret .= $this->end('table'); @@ -89,8 +98,10 @@ class HTMLPurifier_Printer_HTMLDefinition extends HTMLPurifier_Printer /** * Renders the Content Sets table + * @return string */ - protected function renderContentSets() { + protected function renderContentSets() + { $ret = ''; $ret .= $this->start('table'); $ret .= $this->element('caption', 'Content Sets'); @@ -106,8 +117,10 @@ class HTMLPurifier_Printer_HTMLDefinition extends HTMLPurifier_Printer /** * Renders the Elements ($info) table + * @return string */ - protected function renderInfo() { + protected function renderInfo() + { $ret = ''; $ret .= $this->start('table'); $ret .= $this->element('caption', 'Elements ($info)'); @@ -118,39 +131,39 @@ class HTMLPurifier_Printer_HTMLDefinition extends HTMLPurifier_Printer $ret .= $this->end('tr'); foreach ($this->def->info as $name => $def) { $ret .= $this->start('tr'); - $ret .= $this->element('th', "<$name>", array('class'=>'heavy', 'colspan' => 2)); + $ret .= $this->element('th', "<$name>", array('class' => 'heavy', 'colspan' => 2)); $ret .= $this->end('tr'); $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Inline content'); - $ret .= $this->element('td', $def->descendants_are_inline ? 'Yes' : 'No'); + $ret .= $this->element('th', 'Inline content'); + $ret .= $this->element('td', $def->descendants_are_inline ? 'Yes' : 'No'); $ret .= $this->end('tr'); if (!empty($def->excludes)) { $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Excludes'); - $ret .= $this->element('td', $this->listifyTagLookup($def->excludes)); + $ret .= $this->element('th', 'Excludes'); + $ret .= $this->element('td', $this->listifyTagLookup($def->excludes)); $ret .= $this->end('tr'); } if (!empty($def->attr_transform_pre)) { $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Pre-AttrTransform'); - $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_pre)); + $ret .= $this->element('th', 'Pre-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_pre)); $ret .= $this->end('tr'); } if (!empty($def->attr_transform_post)) { $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Post-AttrTransform'); - $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_post)); + $ret .= $this->element('th', 'Post-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_post)); $ret .= $this->end('tr'); } if (!empty($def->auto_close)) { $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Auto closed by'); - $ret .= $this->element('td', $this->listifyTagLookup($def->auto_close)); + $ret .= $this->element('th', 'Auto closed by'); + $ret .= $this->element('td', $this->listifyTagLookup($def->auto_close)); $ret .= $this->end('tr'); } $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Allowed attributes'); - $ret .= $this->element('td',$this->listifyAttr($def->attr), array(), 0); + $ret .= $this->element('th', 'Allowed attributes'); + $ret .= $this->element('td', $this->listifyAttr($def->attr), array(), 0); $ret .= $this->end('tr'); if (!empty($def->required_attr)) { @@ -165,64 +178,94 @@ class HTMLPurifier_Printer_HTMLDefinition extends HTMLPurifier_Printer /** * Renders a row describing the allowed children of an element - * @param $def HTMLPurifier_ChildDef of pertinent element + * @param HTMLPurifier_ChildDef $def HTMLPurifier_ChildDef of pertinent element + * @return string */ - protected function renderChildren($def) { + protected function renderChildren($def) + { $context = new HTMLPurifier_Context(); $ret = ''; $ret .= $this->start('tr'); + $elements = array(); + $attr = array(); + if (isset($def->elements)) { + if ($def->type == 'strictblockquote') { + $def->validateChildren(array(), $this->config, $context); + } + $elements = $def->elements; + } + if ($def->type == 'chameleon') { + $attr['rowspan'] = 2; + } elseif ($def->type == 'empty') { $elements = array(); - $attr = array(); - if (isset($def->elements)) { - if ($def->type == 'strictblockquote') { - $def->validateChildren(array(), $this->config, $context); - } - $elements = $def->elements; - } - if ($def->type == 'chameleon') { - $attr['rowspan'] = 2; - } elseif ($def->type == 'empty') { - $elements = array(); - } elseif ($def->type == 'table') { - $elements = array_flip(array('col', 'caption', 'colgroup', 'thead', - 'tfoot', 'tbody', 'tr')); - } - $ret .= $this->element('th', 'Allowed children', $attr); + } elseif ($def->type == 'table') { + $elements = array_flip( + array( + 'col', + 'caption', + 'colgroup', + 'thead', + 'tfoot', + 'tbody', + 'tr' + ) + ); + } + $ret .= $this->element('th', 'Allowed children', $attr); - if ($def->type == 'chameleon') { + if ($def->type == 'chameleon') { - $ret .= $this->element('td', - 'Block: ' . - $this->escape($this->listifyTagLookup($def->block->elements)),0,0); - $ret .= $this->end('tr'); - $ret .= $this->start('tr'); - $ret .= $this->element('td', - 'Inline: ' . - $this->escape($this->listifyTagLookup($def->inline->elements)),0,0); + $ret .= $this->element( + 'td', + 'Block: ' . + $this->escape($this->listifyTagLookup($def->block->elements)), + null, + 0 + ); + $ret .= $this->end('tr'); + $ret .= $this->start('tr'); + $ret .= $this->element( + 'td', + 'Inline: ' . + $this->escape($this->listifyTagLookup($def->inline->elements)), + null, + 0 + ); - } elseif ($def->type == 'custom') { + } elseif ($def->type == 'custom') { - $ret .= $this->element('td', ''.ucfirst($def->type).': ' . - $def->dtd_regex); + $ret .= $this->element( + 'td', + '' . ucfirst($def->type) . ': ' . + $def->dtd_regex + ); - } else { - $ret .= $this->element('td', - ''.ucfirst($def->type).': ' . - $this->escape($this->listifyTagLookup($elements)),0,0); - } + } else { + $ret .= $this->element( + 'td', + '' . ucfirst($def->type) . ': ' . + $this->escape($this->listifyTagLookup($elements)), + null, + 0 + ); + } $ret .= $this->end('tr'); return $ret; } /** * Listifies a tag lookup table. - * @param $array Tag lookup array in form of array('tagname' => true) + * @param array $array Tag lookup array in form of array('tagname' => true) + * @return string */ - protected function listifyTagLookup($array) { + protected function listifyTagLookup($array) + { ksort($array); $list = array(); foreach ($array as $name => $discard) { - if ($name !== '#PCDATA' && !isset($this->def->info[$name])) continue; + if ($name !== '#PCDATA' && !isset($this->def->info[$name])) { + continue; + } $list[] = $name; } return $this->listify($list); @@ -230,13 +273,15 @@ class HTMLPurifier_Printer_HTMLDefinition extends HTMLPurifier_Printer /** * Listifies a list of objects by retrieving class names and internal state - * @param $array List of objects + * @param array $array List of objects + * @return string * @todo Also add information about internal state */ - protected function listifyObjectList($array) { + protected function listifyObjectList($array) + { ksort($array); $list = array(); - foreach ($array as $discard => $obj) { + foreach ($array as $obj) { $list[] = $this->getClass($obj, 'AttrTransform_'); } return $this->listify($list); @@ -244,13 +289,17 @@ class HTMLPurifier_Printer_HTMLDefinition extends HTMLPurifier_Printer /** * Listifies a hash of attributes to AttrDef classes - * @param $array Array hash in form of array('attrname' => HTMLPurifier_AttrDef) + * @param array $array Array hash in form of array('attrname' => HTMLPurifier_AttrDef) + * @return string */ - protected function listifyAttr($array) { + protected function listifyAttr($array) + { ksort($array); $list = array(); foreach ($array as $name => $obj) { - if ($obj === false) continue; + if ($obj === false) { + continue; + } $list[] = "$name = " . $this->getClass($obj, 'AttrDef_') . ''; } return $this->listify($list); @@ -258,15 +307,18 @@ class HTMLPurifier_Printer_HTMLDefinition extends HTMLPurifier_Printer /** * Creates a heavy header row + * @param string $text + * @param int $num + * @return string */ - protected function heavyHeader($text, $num = 1) { + protected function heavyHeader($text, $num = 1) + { $ret = ''; $ret .= $this->start('tr'); $ret .= $this->element('th', $text, array('colspan' => $num, 'class' => 'heavy')); $ret .= $this->end('tr'); return $ret; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/PropertyList.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/PropertyList.php similarity index 50% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/PropertyList.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/PropertyList.php index 2b99fb7bc..189348fd9 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/PropertyList.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/PropertyList.php @@ -6,61 +6,93 @@ class HTMLPurifier_PropertyList { /** - * Internal data-structure for properties + * Internal data-structure for properties. + * @type array */ protected $data = array(); /** - * Parent plist + * Parent plist. + * @type HTMLPurifier_PropertyList */ protected $parent; + /** + * Cache. + * @type array + */ protected $cache; - public function __construct($parent = null) { + /** + * @param HTMLPurifier_PropertyList $parent Parent plist + */ + public function __construct($parent = null) + { $this->parent = $parent; } /** * Recursively retrieves the value for a key + * @param string $name + * @throws HTMLPurifier_Exception */ - public function get($name) { - if ($this->has($name)) return $this->data[$name]; + public function get($name) + { + if ($this->has($name)) { + return $this->data[$name]; + } // possible performance bottleneck, convert to iterative if necessary - if ($this->parent) return $this->parent->get($name); + if ($this->parent) { + return $this->parent->get($name); + } throw new HTMLPurifier_Exception("Key '$name' not found"); } /** * Sets the value of a key, for this plist + * @param string $name + * @param mixed $value */ - public function set($name, $value) { + public function set($name, $value) + { $this->data[$name] = $value; } /** * Returns true if a given key exists + * @param string $name + * @return bool */ - public function has($name) { + public function has($name) + { return array_key_exists($name, $this->data); } /** * Resets a value to the value of it's parent, usually the default. If * no value is specified, the entire plist is reset. + * @param string $name */ - public function reset($name = null) { - if ($name == null) $this->data = array(); - else unset($this->data[$name]); + public function reset($name = null) + { + if ($name == null) { + $this->data = array(); + } else { + unset($this->data[$name]); + } } /** * Squashes this property list and all of its property lists into a single * array, and returns the array. This value is cached by default. - * @param $force If true, ignores the cache and regenerates the array. + * @param bool $force If true, ignores the cache and regenerates the array. + * @return array */ - public function squash($force = false) { - if ($this->cache !== null && !$force) return $this->cache; + public function squash($force = false) + { + if ($this->cache !== null && !$force) { + return $this->cache; + } if ($this->parent) { return $this->cache = array_merge($this->parent->squash($force), $this->data); } else { @@ -70,15 +102,19 @@ class HTMLPurifier_PropertyList /** * Returns the parent plist. + * @return HTMLPurifier_PropertyList */ - public function getParent() { + public function getParent() + { return $this->parent; } /** * Sets the parent plist. + * @param HTMLPurifier_PropertyList $plist Parent plist */ - public function setParent($plist) { + public function setParent($plist) + { $this->parent = $plist; } } diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/PropertyListIterator.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/PropertyListIterator.php similarity index 60% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/PropertyListIterator.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/PropertyListIterator.php index 8f250443e..15b330ea3 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/PropertyListIterator.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/PropertyListIterator.php @@ -6,27 +6,37 @@ class HTMLPurifier_PropertyListIterator extends FilterIterator { + /** + * @type int + */ protected $l; + /** + * @type string + */ protected $filter; /** - * @param $data Array of data to iterate over - * @param $filter Optional prefix to only allow values of + * @param Iterator $iterator Array of data to iterate over + * @param string $filter Optional prefix to only allow values of */ - public function __construct(Iterator $iterator, $filter = null) { + public function __construct(Iterator $iterator, $filter = null) + { parent::__construct($iterator); $this->l = strlen($filter); $this->filter = $filter; } - public function accept() { + /** + * @return bool + */ + public function accept() + { $key = $this->getInnerIterator()->key(); - if( strncmp($key, $this->filter, $this->l) !== 0 ) { + if (strncmp($key, $this->filter, $this->l) !== 0) { return false; } return true; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Queue.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Queue.php new file mode 100644 index 000000000..f58db9042 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Queue.php @@ -0,0 +1,56 @@ +input = $input; + $this->output = array(); + } + + /** + * Shifts an element off the front of the queue. + */ + public function shift() { + if (empty($this->output)) { + $this->output = array_reverse($this->input); + $this->input = array(); + } + if (empty($this->output)) { + return NULL; + } + return array_pop($this->output); + } + + /** + * Pushes an element onto the front of the queue. + */ + public function push($x) { + array_push($this->input, $x); + } + + /** + * Checks if it's empty. + */ + public function isEmpty() { + return empty($this->input) && empty($this->output); + } +} diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy.php similarity index 66% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy.php index 246286521..e1ff3b72d 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy.php @@ -15,12 +15,12 @@ abstract class HTMLPurifier_Strategy /** * Executes the strategy on the tokens. * - * @param $tokens Array of HTMLPurifier_Token objects to be operated on. - * @param $config Configuration options - * @returns Processed array of token objects. + * @param HTMLPurifier_Token[] $tokens Array of HTMLPurifier_Token objects to be operated on. + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return HTMLPurifier_Token[] Processed array of token objects. */ abstract public function execute($tokens, $config, $context); - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy/Composite.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy/Composite.php similarity index 61% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy/Composite.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy/Composite.php index 92aefd33e..d7d35ce7d 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy/Composite.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy/Composite.php @@ -8,16 +8,23 @@ abstract class HTMLPurifier_Strategy_Composite extends HTMLPurifier_Strategy /** * List of strategies to run tokens through. + * @type HTMLPurifier_Strategy[] */ protected $strategies = array(); - public function execute($tokens, $config, $context) { + /** + * @param HTMLPurifier_Token[] $tokens + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return HTMLPurifier_Token[] + */ + public function execute($tokens, $config, $context) + { foreach ($this->strategies as $strategy) { $tokens = $strategy->execute($tokens, $config, $context); } return $tokens; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy/Core.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy/Core.php similarity index 92% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy/Core.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy/Core.php index d90e15860..4414c17d6 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy/Core.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy/Core.php @@ -5,14 +5,13 @@ */ class HTMLPurifier_Strategy_Core extends HTMLPurifier_Strategy_Composite { - - public function __construct() { + public function __construct() + { $this->strategies[] = new HTMLPurifier_Strategy_RemoveForeignElements(); $this->strategies[] = new HTMLPurifier_Strategy_MakeWellFormed(); $this->strategies[] = new HTMLPurifier_Strategy_FixNesting(); $this->strategies[] = new HTMLPurifier_Strategy_ValidateAttributes(); } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy/FixNesting.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy/FixNesting.php new file mode 100644 index 000000000..6fa673db9 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy/FixNesting.php @@ -0,0 +1,181 @@ +getHTMLDefinition(); + + $excludes_enabled = !$config->get('Core.DisableExcludes'); + + // setup the context variable 'IsInline', for chameleon processing + // is 'false' when we are not inline, 'true' when it must always + // be inline, and an integer when it is inline for a certain + // branch of the document tree + $is_inline = $definition->info_parent_def->descendants_are_inline; + $context->register('IsInline', $is_inline); + + // setup error collector + $e =& $context->get('ErrorCollector', true); + + //####################################################################// + // Loop initialization + + // stack that contains all elements that are excluded + // it is organized by parent elements, similar to $stack, + // but it is only populated when an element with exclusions is + // processed, i.e. there won't be empty exclusions. + $exclude_stack = array($definition->info_parent_def->excludes); + + // variable that contains the start token while we are processing + // nodes. This enables error reporting to do its job + $node = $top_node; + // dummy token + list($token, $d) = $node->toTokenPair(); + $context->register('CurrentNode', $node); + $context->register('CurrentToken', $token); + + //####################################################################// + // Loop + + // We need to implement a post-order traversal iteratively, to + // avoid running into stack space limits. This is pretty tricky + // to reason about, so we just manually stack-ify the recursive + // variant: + // + // function f($node) { + // foreach ($node->children as $child) { + // f($child); + // } + // validate($node); + // } + // + // Thus, we will represent a stack frame as array($node, + // $is_inline, stack of children) + // e.g. array_reverse($node->children) - already processed + // children. + + $parent_def = $definition->info_parent_def; + $stack = array( + array($top_node, + $parent_def->descendants_are_inline, + $parent_def->excludes, // exclusions + 0) + ); + + while (!empty($stack)) { + list($node, $is_inline, $excludes, $ix) = array_pop($stack); + // recursive call + $go = false; + $def = empty($stack) ? $definition->info_parent_def : $definition->info[$node->name]; + while (isset($node->children[$ix])) { + $child = $node->children[$ix++]; + if ($child instanceof HTMLPurifier_Node_Element) { + $go = true; + $stack[] = array($node, $is_inline, $excludes, $ix); + $stack[] = array($child, + // ToDo: I don't think it matters if it's def or + // child_def, but double check this... + $is_inline || $def->descendants_are_inline, + empty($def->excludes) ? $excludes + : array_merge($excludes, $def->excludes), + 0); + break; + } + }; + if ($go) continue; + list($token, $d) = $node->toTokenPair(); + // base case + if ($excludes_enabled && isset($excludes[$node->name])) { + $node->dead = true; + if ($e) $e->send(E_ERROR, 'Strategy_FixNesting: Node excluded'); + } else { + // XXX I suppose it would be slightly more efficient to + // avoid the allocation here and have children + // strategies handle it + $children = array(); + foreach ($node->children as $child) { + if (!$child->dead) $children[] = $child; + } + $result = $def->child->validateChildren($children, $config, $context); + if ($result === true) { + // nop + $node->children = $children; + } elseif ($result === false) { + $node->dead = true; + if ($e) $e->send(E_ERROR, 'Strategy_FixNesting: Node removed'); + } else { + $node->children = $result; + if ($e) { + // XXX This will miss mutations of internal nodes. Perhaps defer to the child validators + if (empty($result) && !empty($children)) { + $e->send(E_ERROR, 'Strategy_FixNesting: Node contents removed'); + } else if ($result != $children) { + $e->send(E_WARNING, 'Strategy_FixNesting: Node reorganized'); + } + } + } + } + } + + //####################################################################// + // Post-processing + + // remove context variables + $context->destroy('IsInline'); + $context->destroy('CurrentNode'); + $context->destroy('CurrentToken'); + + //####################################################################// + // Return + + return HTMLPurifier_Arborize::flatten($node, $config, $context); + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy/MakeWellFormed.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy/MakeWellFormed.php similarity index 69% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy/MakeWellFormed.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy/MakeWellFormed.php index 7402a4eea..e389e0011 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy/MakeWellFormed.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy/MakeWellFormed.php @@ -16,66 +16,83 @@ class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy /** * Array stream of tokens being processed. + * @type HTMLPurifier_Token[] */ protected $tokens; /** - * Current index in $tokens. + * Current token. + * @type HTMLPurifier_Token */ - protected $t; + protected $token; + + /** + * Zipper managing the true state. + * @type HTMLPurifier_Zipper + */ + protected $zipper; /** * Current nesting of elements. + * @type array */ protected $stack; /** * Injectors active in this stream processing. + * @type HTMLPurifier_Injector[] */ protected $injectors; /** * Current instance of HTMLPurifier_Config. + * @type HTMLPurifier_Config */ protected $config; /** * Current instance of HTMLPurifier_Context. + * @type HTMLPurifier_Context */ protected $context; - public function execute($tokens, $config, $context) { - + /** + * @param HTMLPurifier_Token[] $tokens + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return HTMLPurifier_Token[] + * @throws HTMLPurifier_Exception + */ + public function execute($tokens, $config, $context) + { $definition = $config->getHTMLDefinition(); // local variables $generator = new HTMLPurifier_Generator($config, $context); $escape_invalid_tags = $config->get('Core.EscapeInvalidTags'); // used for autoclose early abortion - $global_parent_allowed_elements = array(); - if (isset($definition->info[$definition->info_parent])) { - // may be unset under testing circumstances - $global_parent_allowed_elements = $definition->info[$definition->info_parent]->child->getAllowedElements($config); - } + $global_parent_allowed_elements = $definition->info_parent_def->child->getAllowedElements($config); $e = $context->get('ErrorCollector', true); - $t = false; // token index $i = false; // injector index - $token = false; // the current token - $reprocess = false; // whether or not to reprocess the same token + list($zipper, $token) = HTMLPurifier_Zipper::fromArray($tokens); + if ($token === NULL) { + return array(); + } + $reprocess = false; // whether or not to reprocess the same token $stack = array(); // member variables - $this->stack =& $stack; - $this->t =& $t; - $this->tokens =& $tokens; - $this->config = $config; + $this->stack =& $stack; + $this->tokens =& $tokens; + $this->token =& $token; + $this->zipper =& $zipper; + $this->config = $config; $this->context = $context; // context variables $context->register('CurrentNesting', $stack); - $context->register('InputIndex', $t); - $context->register('InputTokens', $tokens); - $context->register('CurrentToken', $token); + $context->register('InputZipper', $zipper); + $context->register('CurrentToken', $token); // -- begin INJECTOR -- @@ -87,9 +104,13 @@ class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy unset($injectors['Custom']); // special case foreach ($injectors as $injector => $b) { // XXX: Fix with a legitimate lookup table of enabled filters - if (strpos($injector, '.') !== false) continue; + if (strpos($injector, '.') !== false) { + continue; + } $injector = "HTMLPurifier_Injector_$injector"; - if (!$b) continue; + if (!$b) { + continue; + } $this->injectors[] = new $injector; } foreach ($def_injectors as $injector) { @@ -97,7 +118,9 @@ class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy $this->injectors[] = $injector; } foreach ($custom_injectors as $injector) { - if (!$injector) continue; + if (!$injector) { + continue; + } if (is_string($injector)) { $injector = "HTMLPurifier_Injector_$injector"; $injector = new $injector; @@ -109,7 +132,9 @@ class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy // variables for performance reasons foreach ($this->injectors as $ix => $injector) { $error = $injector->prepare($config, $context); - if (!$error) continue; + if (!$error) { + continue; + } array_splice($this->injectors, $ix, 1); // rm the injector trigger_error("Cannot enable {$injector->name} injector because $error is not allowed", E_USER_WARNING); } @@ -125,39 +150,40 @@ class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy // punt ($reprocess = true; continue;) and it does that for us. // isset is in loop because $tokens size changes during loop exec - for ( - $t = 0; - $t == 0 || isset($tokens[$t - 1]); - // only increment if we don't need to reprocess - $reprocess ? $reprocess = false : $t++ - ) { + for (;; + // only increment if we don't need to reprocess + $reprocess ? $reprocess = false : $token = $zipper->next($token)) { // check for a rewind - if (is_int($i) && $i >= 0) { + if (is_int($i)) { // possibility: disable rewinding if the current token has a // rewind set on it already. This would offer protection from // infinite loop, but might hinder some advanced rewinding. - $rewind_to = $this->injectors[$i]->getRewind(); - if (is_int($rewind_to) && $rewind_to < $t) { - if ($rewind_to < 0) $rewind_to = 0; - while ($t > $rewind_to) { - $t--; - $prev = $tokens[$t]; + $rewind_offset = $this->injectors[$i]->getRewindOffset(); + if (is_int($rewind_offset)) { + for ($j = 0; $j < $rewind_offset; $j++) { + if (empty($zipper->front)) break; + $token = $zipper->prev($token); // indicate that other injectors should not process this token, // but we need to reprocess it - unset($prev->skip[$i]); - $prev->rewind = $i; - if ($prev instanceof HTMLPurifier_Token_Start) array_pop($this->stack); - elseif ($prev instanceof HTMLPurifier_Token_End) $this->stack[] = $prev->start; + unset($token->skip[$i]); + $token->rewind = $i; + if ($token instanceof HTMLPurifier_Token_Start) { + array_pop($this->stack); + } elseif ($token instanceof HTMLPurifier_Token_End) { + $this->stack[] = $token->start; + } } } $i = false; } // handle case of document end - if (!isset($tokens[$t])) { + if ($token === NULL) { // kill processing if stack is empty - if (empty($this->stack)) break; + if (empty($this->stack)) { + break; + } // peek $top_nesting = array_pop($this->stack); @@ -169,26 +195,30 @@ class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy } // append, don't splice, since this is the end - $tokens[] = new HTMLPurifier_Token_End($top_nesting->name); + $token = new HTMLPurifier_Token_End($top_nesting->name); // punt! $reprocess = true; continue; } - $token = $tokens[$t]; - - //echo '
'; printTokens($tokens, $t); printTokens($this->stack); + //echo '
'; printZipper($zipper, $token);//printTokens($this->stack); //flush(); // quick-check: if it's not a tag, no need to process if (empty($token->is_tag)) { if ($token instanceof HTMLPurifier_Token_Text) { foreach ($this->injectors as $i => $injector) { - if (isset($token->skip[$i])) continue; - if ($token->rewind !== null && $token->rewind !== $i) continue; - $injector->handleText($token); - $this->processToken($token, $i); + if (isset($token->skip[$i])) { + continue; + } + if ($token->rewind !== null && $token->rewind !== $i) { + continue; + } + // XXX fuckup + $r = $token; + $injector->handleText($r); + $token = $this->processToken($r, $i); $reprocess = true; break; } @@ -207,12 +237,22 @@ class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy $ok = false; if ($type === 'empty' && $token instanceof HTMLPurifier_Token_Start) { // claims to be a start tag but is empty - $token = new HTMLPurifier_Token_Empty($token->name, $token->attr, $token->line, $token->col, $token->armor); + $token = new HTMLPurifier_Token_Empty( + $token->name, + $token->attr, + $token->line, + $token->col, + $token->armor + ); $ok = true; } elseif ($type && $type !== 'empty' && $token instanceof HTMLPurifier_Token_Empty) { // claims to be empty but really is a start tag - $this->swap(new HTMLPurifier_Token_End($token->name)); - $this->insertBefore(new HTMLPurifier_Token_Start($token->name, $token->attr, $token->line, $token->col, $token->armor)); + // NB: this assignment is required + $old_token = $token; + $token = new HTMLPurifier_Token_End($token->name); + $token = $this->insertBefore( + new HTMLPurifier_Token_Start($old_token->name, $old_token->attr, $old_token->line, $old_token->col, $old_token->armor) + ); // punt (since we had to modify the input stream in a non-trivial way) $reprocess = true; continue; @@ -241,11 +281,13 @@ class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy $parent = array_pop($this->stack); $this->stack[] = $parent; + $parent_def = null; + $parent_elements = null; + $autoclose = false; if (isset($definition->info[$parent->name])) { - $elements = $definition->info[$parent->name]->child->getAllowedElements($config); - $autoclose = !isset($elements[$token->name]); - } else { - $autoclose = false; + $parent_def = $definition->info[$parent->name]; + $parent_elements = $parent_def->child->getAllowedElements($config); + $autoclose = !isset($parent_elements[$token->name]); } if ($autoclose && $definition->info[$token->name]->wrap) { @@ -255,17 +297,16 @@ class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy $wrapname = $definition->info[$token->name]->wrap; $wrapdef = $definition->info[$wrapname]; $elements = $wrapdef->child->getAllowedElements($config); - $parent_elements = $definition->info[$parent->name]->child->getAllowedElements($config); if (isset($elements[$token->name]) && isset($parent_elements[$wrapname])) { $newtoken = new HTMLPurifier_Token_Start($wrapname); - $this->insertBefore($newtoken); + $token = $this->insertBefore($newtoken); $reprocess = true; continue; } } $carryover = false; - if ($autoclose && $definition->info[$parent->name]->formatting) { + if ($autoclose && $parent_def->formatting) { $carryover = true; } @@ -295,15 +336,6 @@ class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy // errors need to be updated $new_token = new HTMLPurifier_Token_End($parent->name); $new_token->start = $parent; - if ($carryover) { - $element = clone $parent; - // [TagClosedAuto] - $element->armor['MakeWellFormed_TagClosedError'] = true; - $element->carryover = true; - $this->processToken(array($new_token, $token, $element)); - } else { - $this->insertBefore($new_token); - } // [TagClosedSuppress] if ($e && !isset($parent->armor['MakeWellFormed_TagClosedError'])) { if (!$carryover) { @@ -312,8 +344,17 @@ class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag carryover', $parent); } } + if ($carryover) { + $element = clone $parent; + // [TagClosedAuto] + $element->armor['MakeWellFormed_TagClosedError'] = true; + $element->carryover = true; + $token = $this->processToken(array($new_token, $token, $element)); + } else { + $token = $this->insertBefore($new_token); + } } else { - $this->remove(); + $token = $this->remove(); } $reprocess = true; continue; @@ -325,20 +366,26 @@ class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy if ($ok) { foreach ($this->injectors as $i => $injector) { - if (isset($token->skip[$i])) continue; - if ($token->rewind !== null && $token->rewind !== $i) continue; - $injector->handleElement($token); - $this->processToken($token, $i); + if (isset($token->skip[$i])) { + continue; + } + if ($token->rewind !== null && $token->rewind !== $i) { + continue; + } + $r = $token; + $injector->handleElement($r); + $token = $this->processToken($r, $i); $reprocess = true; break; } if (!$reprocess) { // ah, nothing interesting happened; do normal processing - $this->swap($token); if ($token instanceof HTMLPurifier_Token_Start) { $this->stack[] = $token; } elseif ($token instanceof HTMLPurifier_Token_End) { - throw new HTMLPurifier_Exception('Improper handling of end tag in start code; possible error in MakeWellFormed'); + throw new HTMLPurifier_Exception( + 'Improper handling of end tag in start code; possible error in MakeWellFormed' + ); } } continue; @@ -352,13 +399,15 @@ class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy // make sure that we have something open if (empty($this->stack)) { if ($escape_invalid_tags) { - if ($e) $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag to text'); - $this->swap(new HTMLPurifier_Token_Text( - $generator->generateFromToken($token) - )); + if ($e) { + $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag to text'); + } + $token = new HTMLPurifier_Token_Text($generator->generateFromToken($token)); } else { - $this->remove(); - if ($e) $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag removed'); + if ($e) { + $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag removed'); + } + $token = $this->remove(); } $reprocess = true; continue; @@ -372,10 +421,15 @@ class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy if ($current_parent->name == $token->name) { $token->start = $current_parent; foreach ($this->injectors as $i => $injector) { - if (isset($token->skip[$i])) continue; - if ($token->rewind !== null && $token->rewind !== $i) continue; - $injector->handleEnd($token); - $this->processToken($token, $i); + if (isset($token->skip[$i])) { + continue; + } + if ($token->rewind !== null && $token->rewind !== $i) { + continue; + } + $r = $token; + $injector->handleEnd($r); + $token = $this->processToken($r, $i); $this->stack[] = $current_parent; $reprocess = true; break; @@ -403,13 +457,15 @@ class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy // we didn't find the tag, so remove if ($skipped_tags === false) { if ($escape_invalid_tags) { - $this->swap(new HTMLPurifier_Token_Text( - $generator->generateFromToken($token) - )); - if ($e) $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag to text'); + if ($e) { + $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag to text'); + } + $token = new HTMLPurifier_Token_Text($generator->generateFromToken($token)); } else { - $this->remove(); - if ($e) $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag removed'); + if ($e) { + $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag removed'); + } + $token = $this->remove(); } $reprocess = true; continue; @@ -442,18 +498,17 @@ class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy $replace[] = $element; } } - $this->processToken($replace); + $token = $this->processToken($replace); $reprocess = true; continue; } - $context->destroy('CurrentNesting'); - $context->destroy('InputTokens'); - $context->destroy('InputIndex'); $context->destroy('CurrentToken'); + $context->destroy('CurrentNesting'); + $context->destroy('InputZipper'); - unset($this->injectors, $this->stack, $this->tokens, $this->t); - return $tokens; + unset($this->injectors, $this->stack, $this->tokens); + return $zipper->toArray($token); } /** @@ -472,25 +527,38 @@ class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy * If $token is an integer, that number of tokens (with the first token * being the current one) will be deleted. * - * @param $token Token substitution value - * @param $injector Injector that performed the substitution; default is if + * @param HTMLPurifier_Token|array|int|bool $token Token substitution value + * @param HTMLPurifier_Injector|int $injector Injector that performed the substitution; default is if * this is not an injector related operation. + * @throws HTMLPurifier_Exception */ - protected function processToken($token, $injector = -1) { - + protected function processToken($token, $injector = -1) + { // normalize forms of token - if (is_object($token)) $token = array(1, $token); - if (is_int($token)) $token = array($token); - if ($token === false) $token = array(1); - if (!is_array($token)) throw new HTMLPurifier_Exception('Invalid token type from injector'); - if (!is_int($token[0])) array_unshift($token, 1); - if ($token[0] === 0) throw new HTMLPurifier_Exception('Deleting zero tokens is not valid'); + if (is_object($token)) { + $token = array(1, $token); + } + if (is_int($token)) { + $token = array($token); + } + if ($token === false) { + $token = array(1); + } + if (!is_array($token)) { + throw new HTMLPurifier_Exception('Invalid token type from injector'); + } + if (!is_int($token[0])) { + array_unshift($token, 1); + } + if ($token[0] === 0) { + throw new HTMLPurifier_Exception('Deleting zero tokens is not valid'); + } // $token is now an array with the following form: // array(number nodes to delete, new node 1, new node 2, ...) $delete = array_shift($token); - $old = array_splice($this->tokens, $this->t, $delete, $token); + list($old, $r) = $this->zipper->splice($this->token, $delete, $token); if ($injector > -1) { // determine appropriate skips @@ -501,32 +569,32 @@ class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy } } + return $r; + } /** * Inserts a token before the current token. Cursor now points to * this token. You must reprocess after this. + * @param HTMLPurifier_Token $token */ - private function insertBefore($token) { - array_splice($this->tokens, $this->t, 0, array($token)); + private function insertBefore($token) + { + // NB not $this->zipper->insertBefore(), due to positioning + // differences + $splice = $this->zipper->splice($this->token, 0, array($token)); + + return $splice[1]; } /** * Removes current token. Cursor now points to new token occupying previously * occupied space. You must reprocess after this. */ - private function remove() { - array_splice($this->tokens, $this->t, 1); + private function remove() + { + return $this->zipper->delete(); } - - /** - * Swap current token with new token. Cursor points to new token (no - * change). You must reprocess after this. - */ - private function swap($token) { - $this->tokens[$this->t] = $token; - } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy/RemoveForeignElements.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy/RemoveForeignElements.php similarity index 76% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy/RemoveForeignElements.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy/RemoveForeignElements.php index bccaf14d3..1a8149ecc 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy/RemoveForeignElements.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy/RemoveForeignElements.php @@ -11,13 +11,20 @@ class HTMLPurifier_Strategy_RemoveForeignElements extends HTMLPurifier_Strategy { - public function execute($tokens, $config, $context) { + /** + * @param HTMLPurifier_Token[] $tokens + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array|HTMLPurifier_Token[] + */ + public function execute($tokens, $config, $context) + { $definition = $config->getHTMLDefinition(); $generator = new HTMLPurifier_Generator($config, $context); $result = array(); $escape_invalid_tags = $config->get('Core.EscapeInvalidTags'); - $remove_invalid_img = $config->get('Core.RemoveInvalidImg'); + $remove_invalid_img = $config->get('Core.RemoveInvalidImg'); // currently only used to determine if comments should be kept $trusted = $config->get('HTML.Trusted'); @@ -26,7 +33,7 @@ class HTMLPurifier_Strategy_RemoveForeignElements extends HTMLPurifier_Strategy $check_comments = $comment_lookup !== array() || $comment_regexp !== null; $remove_script_contents = $config->get('Core.RemoveScriptContents'); - $hidden_elements = $config->get('Core.HiddenElements'); + $hidden_elements = $config->get('Core.HiddenElements'); // remove script contents compatibility if ($remove_script_contents === true) { @@ -51,34 +58,31 @@ class HTMLPurifier_Strategy_RemoveForeignElements extends HTMLPurifier_Strategy $e =& $context->get('ErrorCollector'); } - foreach($tokens as $token) { + foreach ($tokens as $token) { if ($remove_until) { if (empty($token->is_tag) || $token->name !== $remove_until) { continue; } } - if (!empty( $token->is_tag )) { + if (!empty($token->is_tag)) { // DEFINITION CALL // before any processing, try to transform the element - if ( - isset($definition->info_tag_transform[$token->name]) - ) { + if (isset($definition->info_tag_transform[$token->name])) { $original_name = $token->name; // there is a transformation for this tag // DEFINITION CALL $token = $definition-> - info_tag_transform[$token->name]-> - transform($token, $config, $context); - if ($e) $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Tag transform', $original_name); + info_tag_transform[$token->name]->transform($token, $config, $context); + if ($e) { + $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Tag transform', $original_name); + } } if (isset($definition->info[$token->name])) { - // mostly everything's good, but // we need to make sure required attributes are in order - if ( - ($token instanceof HTMLPurifier_Token_Start || $token instanceof HTMLPurifier_Token_Empty) && + if (($token instanceof HTMLPurifier_Token_Start || $token instanceof HTMLPurifier_Token_Empty) && $definition->info[$token->name]->required_attr && ($token->name != 'img' || $remove_invalid_img) // ensure config option still works ) { @@ -91,7 +95,13 @@ class HTMLPurifier_Strategy_RemoveForeignElements extends HTMLPurifier_Strategy } } if (!$ok) { - if ($e) $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Missing required attribute', $name); + if ($e) { + $e->send( + E_ERROR, + 'Strategy_RemoveForeignElements: Missing required attribute', + $name + ); + } continue; } $token->armor['ValidateAttributes'] = true; @@ -105,7 +115,9 @@ class HTMLPurifier_Strategy_RemoveForeignElements extends HTMLPurifier_Strategy } elseif ($escape_invalid_tags) { // invalid tag, generate HTML representation and insert in - if ($e) $e->send(E_WARNING, 'Strategy_RemoveForeignElements: Foreign element to text'); + if ($e) { + $e->send(E_WARNING, 'Strategy_RemoveForeignElements: Foreign element to text'); + } $token = new HTMLPurifier_Token_Text( $generator->generateFromToken($token) ); @@ -120,9 +132,13 @@ class HTMLPurifier_Strategy_RemoveForeignElements extends HTMLPurifier_Strategy } else { $remove_until = false; } - if ($e) $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign meta element removed'); + if ($e) { + $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign meta element removed'); + } } else { - if ($e) $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign element removed'); + if ($e) { + $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign element removed'); + } } continue; } @@ -146,11 +162,15 @@ class HTMLPurifier_Strategy_RemoveForeignElements extends HTMLPurifier_Strategy $found_double_hyphen = true; $token->data = str_replace('--', '-', $token->data); } - if ($trusted || !empty($comment_lookup[trim($token->data)]) || ($comment_regexp !== NULL && preg_match($comment_regexp, trim($token->data)))) { + if ($trusted || !empty($comment_lookup[trim($token->data)]) || + ($comment_regexp !== null && preg_match($comment_regexp, trim($token->data)))) { // OK good if ($e) { if ($trailing_hyphen) { - $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Trailing hyphen in comment removed'); + $e->send( + E_NOTICE, + 'Strategy_RemoveForeignElements: Trailing hyphen in comment removed' + ); } if ($found_double_hyphen) { $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Hyphens in comment collapsed'); @@ -164,7 +184,9 @@ class HTMLPurifier_Strategy_RemoveForeignElements extends HTMLPurifier_Strategy } } else { // strip comments - if ($e) $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Comment removed'); + if ($e) { + $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Comment removed'); + } continue; } } elseif ($token instanceof HTMLPurifier_Token_Text) { @@ -177,12 +199,9 @@ class HTMLPurifier_Strategy_RemoveForeignElements extends HTMLPurifier_Strategy // we removed tokens until the end, throw error $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Token removed to end', $remove_until); } - $context->destroy('CurrentToken'); - return $result; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy/ValidateAttributes.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy/ValidateAttributes.php similarity index 65% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy/ValidateAttributes.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy/ValidateAttributes.php index c3328a9d4..fbb3d27c8 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Strategy/ValidateAttributes.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Strategy/ValidateAttributes.php @@ -7,8 +7,14 @@ class HTMLPurifier_Strategy_ValidateAttributes extends HTMLPurifier_Strategy { - public function execute($tokens, $config, $context) { - + /** + * @param HTMLPurifier_Token[] $tokens + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return HTMLPurifier_Token[] + */ + public function execute($tokens, $config, $context) + { // setup validator $validator = new HTMLPurifier_AttrValidator(); @@ -19,21 +25,21 @@ class HTMLPurifier_Strategy_ValidateAttributes extends HTMLPurifier_Strategy // only process tokens that have attributes, // namely start and empty tags - if (!$token instanceof HTMLPurifier_Token_Start && !$token instanceof HTMLPurifier_Token_Empty) continue; + if (!$token instanceof HTMLPurifier_Token_Start && !$token instanceof HTMLPurifier_Token_Empty) { + continue; + } // skip tokens that are armored - if (!empty($token->armor['ValidateAttributes'])) continue; + if (!empty($token->armor['ValidateAttributes'])) { + continue; + } // note that we have no facilities here for removing tokens $validator->validateToken($token, $config, $context); - - $tokens[$key] = $token; // for PHP 4 } $context->destroy('CurrentToken'); - return $tokens; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/StringHash.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/StringHash.php similarity index 75% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/StringHash.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/StringHash.php index 62085c5c2..c07370197 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/StringHash.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/StringHash.php @@ -10,28 +10,36 @@ */ class HTMLPurifier_StringHash extends ArrayObject { + /** + * @type array + */ protected $accessed = array(); /** * Retrieves a value, and logs the access. + * @param mixed $index + * @return mixed */ - public function offsetGet($index) { + public function offsetGet($index) + { $this->accessed[$index] = true; return parent::offsetGet($index); } /** * Returns a lookup array of all array indexes that have been accessed. - * @return Array in form array($index => true). + * @return array in form array($index => true). */ - public function getAccessed() { + public function getAccessed() + { return $this->accessed; } /** * Resets the access array. */ - public function resetAccessed() { + public function resetAccessed() + { $this->accessed = array(); } } diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/StringHashParser.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/StringHashParser.php similarity index 73% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/StringHashParser.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/StringHashParser.php index f3e70c712..7c73f8083 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/StringHashParser.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/StringHashParser.php @@ -28,15 +28,25 @@ class HTMLPurifier_StringHashParser { + /** + * @type string + */ public $default = 'ID'; /** * Parses a file that contains a single string-hash. + * @param string $file + * @return array */ - public function parseFile($file) { - if (!file_exists($file)) return false; + public function parseFile($file) + { + if (!file_exists($file)) { + return false; + } $fh = fopen($file, 'r'); - if (!$fh) return false; + if (!$fh) { + return false; + } $ret = $this->parseHandle($fh); fclose($fh); return $ret; @@ -44,12 +54,19 @@ class HTMLPurifier_StringHashParser /** * Parses a file that contains multiple string-hashes delimited by '----' + * @param string $file + * @return array */ - public function parseMultiFile($file) { - if (!file_exists($file)) return false; + public function parseMultiFile($file) + { + if (!file_exists($file)) { + return false; + } $ret = array(); $fh = fopen($file, 'r'); - if (!$fh) return false; + if (!$fh) { + return false; + } while (!feof($fh)) { $ret[] = $this->parseHandle($fh); } @@ -62,26 +79,36 @@ class HTMLPurifier_StringHashParser * @note While it's possible to simulate in-memory parsing by using * custom stream wrappers, if such a use-case arises we should * factor out the file handle into its own class. - * @param $fh File handle with pointer at start of valid string-hash + * @param resource $fh File handle with pointer at start of valid string-hash * block. + * @return array */ - protected function parseHandle($fh) { + protected function parseHandle($fh) + { $state = false; $single = false; $ret = array(); do { $line = fgets($fh); - if ($line === false) break; + if ($line === false) { + break; + } $line = rtrim($line, "\n\r"); - if (!$state && $line === '') continue; - if ($line === '----') break; + if (!$state && $line === '') { + continue; + } + if ($line === '----') { + break; + } if (strncmp('--#', $line, 3) === 0) { // Comment continue; } elseif (strncmp('--', $line, 2) === 0) { // Multiline declaration $state = trim($line, '- '); - if (!isset($ret[$state])) $ret[$state] = ''; + if (!isset($ret[$state])) { + $ret[$state] = ''; + } continue; } elseif (!$state) { $single = true; @@ -104,7 +131,6 @@ class HTMLPurifier_StringHashParser } while (!feof($fh)); return $ret; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/TagTransform.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/TagTransform.php similarity index 62% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/TagTransform.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/TagTransform.php index 210a44721..7b8d83343 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/TagTransform.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/TagTransform.php @@ -8,14 +8,15 @@ abstract class HTMLPurifier_TagTransform /** * Tag name to transform the tag to. + * @type string */ public $transform_to; /** * Transforms the obsolete tag into the valid tag. - * @param $tag Tag to be transformed. - * @param $config Mandatory HTMLPurifier_Config object - * @param $context Mandatory HTMLPurifier_Context object + * @param HTMLPurifier_Token_Tag $tag Tag to be transformed. + * @param HTMLPurifier_Config $config Mandatory HTMLPurifier_Config object + * @param HTMLPurifier_Context $context Mandatory HTMLPurifier_Context object */ abstract public function transform($tag, $config, $context); @@ -23,14 +24,14 @@ abstract class HTMLPurifier_TagTransform * Prepends CSS properties to the style attribute, creating the * attribute if it doesn't exist. * @warning Copied over from AttrTransform, be sure to keep in sync - * @param $attr Attribute array to process (passed by reference) - * @param $css CSS to prepend + * @param array $attr Attribute array to process (passed by reference) + * @param string $css CSS to prepend */ - protected function prependCSS(&$attr, $css) { + protected function prependCSS(&$attr, $css) + { $attr['style'] = isset($attr['style']) ? $attr['style'] : ''; $attr['style'] = $css . $attr['style']; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/TagTransform/Font.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/TagTransform/Font.php similarity index 76% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/TagTransform/Font.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/TagTransform/Font.php index 9db2db795..7853d90bc 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/TagTransform/Font.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/TagTransform/Font.php @@ -17,9 +17,14 @@ */ class HTMLPurifier_TagTransform_Font extends HTMLPurifier_TagTransform { - + /** + * @type string + */ public $transform_to = 'span'; + /** + * @type array + */ protected $_size_lookup = array( '0' => 'xx-small', '1' => 'xx-small', @@ -37,8 +42,14 @@ class HTMLPurifier_TagTransform_Font extends HTMLPurifier_TagTransform '+4' => '300%' ); - public function transform($tag, $config, $context) { - + /** + * @param HTMLPurifier_Token_Tag $tag + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return HTMLPurifier_Token_End|string + */ + public function transform($tag, $config, $context) + { if ($tag instanceof HTMLPurifier_Token_End) { $new_tag = clone $tag; $new_tag->name = $this->transform_to; @@ -65,17 +76,23 @@ class HTMLPurifier_TagTransform_Font extends HTMLPurifier_TagTransform // normalize large numbers if ($attr['size'] !== '') { if ($attr['size']{0} == '+' || $attr['size']{0} == '-') { - $size = (int) $attr['size']; - if ($size < -2) $attr['size'] = '-2'; - if ($size > 4) $attr['size'] = '+4'; + $size = (int)$attr['size']; + if ($size < -2) { + $attr['size'] = '-2'; + } + if ($size > 4) { + $attr['size'] = '+4'; + } } else { - $size = (int) $attr['size']; - if ($size > 7) $attr['size'] = '7'; + $size = (int)$attr['size']; + if ($size > 7) { + $attr['size'] = '7'; + } } } if (isset($this->_size_lookup[$attr['size']])) { $prepend_style .= 'font-size:' . - $this->_size_lookup[$attr['size']] . ';'; + $this->_size_lookup[$attr['size']] . ';'; } unset($attr['size']); } @@ -91,7 +108,6 @@ class HTMLPurifier_TagTransform_Font extends HTMLPurifier_TagTransform $new_tag->attr = $attr; return $new_tag; - } } diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/TagTransform/Simple.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/TagTransform/Simple.php similarity index 61% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/TagTransform/Simple.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/TagTransform/Simple.php index 0e36130f2..71bf10b91 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/TagTransform/Simple.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/TagTransform/Simple.php @@ -7,19 +7,29 @@ */ class HTMLPurifier_TagTransform_Simple extends HTMLPurifier_TagTransform { - + /** + * @type string + */ protected $style; /** - * @param $transform_to Tag name to transform to. - * @param $style CSS style to add to the tag + * @param string $transform_to Tag name to transform to. + * @param string $style CSS style to add to the tag */ - public function __construct($transform_to, $style = null) { + public function __construct($transform_to, $style = null) + { $this->transform_to = $transform_to; $this->style = $style; } - public function transform($tag, $config, $context) { + /** + * @param HTMLPurifier_Token_Tag $tag + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string + */ + public function transform($tag, $config, $context) + { $new_tag = clone $tag; $new_tag->name = $this->transform_to; if (!is_null($this->style) && @@ -29,7 +39,6 @@ class HTMLPurifier_TagTransform_Simple extends HTMLPurifier_TagTransform } return $new_tag; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token.php new file mode 100644 index 000000000..85b85e072 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token.php @@ -0,0 +1,100 @@ +line = $l; + $this->col = $c; + } + + /** + * Convenience function for DirectLex settings line/col position. + * @param int $l + * @param int $c + */ + public function rawPosition($l, $c) + { + if ($c === -1) { + $l++; + } + $this->line = $l; + $this->col = $c; + } + + /** + * Converts a token into its corresponding node. + */ + abstract public function toNode(); +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token/Comment.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token/Comment.php new file mode 100644 index 000000000..23453c705 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token/Comment.php @@ -0,0 +1,38 @@ +data = $data; + $this->line = $line; + $this->col = $col; + } + + public function toNode() { + return new HTMLPurifier_Node_Comment($this->data, $this->line, $this->col); + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token/Empty.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token/Empty.php similarity index 54% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token/Empty.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token/Empty.php index 2a82b47ad..78a95f555 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token/Empty.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token/Empty.php @@ -5,7 +5,11 @@ */ class HTMLPurifier_Token_Empty extends HTMLPurifier_Token_Tag { - + public function toNode() { + $n = parent::toNode(); + $n->empty = true; + return $n; + } } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token/End.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token/End.php similarity index 58% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token/End.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token/End.php index 353e79daf..59b38fdc5 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token/End.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token/End.php @@ -10,10 +10,15 @@ class HTMLPurifier_Token_End extends HTMLPurifier_Token_Tag { /** - * Token that started this node. Added by MakeWellFormed. Please - * do not edit this! + * Token that started this node. + * Added by MakeWellFormed. Please do not edit this! + * @type HTMLPurifier_Token */ public $start; + + public function toNode() { + throw new Exception("HTMLPurifier_Token_End->toNode not supported!"); + } } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token/Start.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token/Start.php similarity index 99% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token/Start.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token/Start.php index e0e14fc62..019f317ad 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token/Start.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token/Start.php @@ -5,7 +5,6 @@ */ class HTMLPurifier_Token_Start extends HTMLPurifier_Token_Tag { - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token/Tag.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token/Tag.php similarity index 74% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token/Tag.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token/Tag.php index f4d8f640e..d643fa64e 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token/Tag.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token/Tag.php @@ -3,13 +3,14 @@ /** * Abstract class of a tag token (start, end or empty), and its behavior. */ -class HTMLPurifier_Token_Tag extends HTMLPurifier_Token +abstract class HTMLPurifier_Token_Tag extends HTMLPurifier_Token { /** * Static bool marker that indicates the class is a tag. * * This allows us to check objects with !empty($obj->is_tag) * without having to use a function call is_a(). + * @type bool */ public $is_tag = true; @@ -19,21 +20,27 @@ class HTMLPurifier_Token_Tag extends HTMLPurifier_Token * @note Strictly speaking, XML tags are case sensitive, so we shouldn't * be lower-casing them, but these tokens cater to HTML tags, which are * insensitive. + * @type string */ public $name; /** * Associative array of the tag's attributes. + * @type array */ public $attr = array(); /** * Non-overloaded constructor, which lower-cases passed tag name. * - * @param $name String name. - * @param $attr Associative array of attributes. + * @param string $name String name. + * @param array $attr Associative array of attributes. + * @param int $line + * @param int $col + * @param array $armor */ - public function __construct($name, $attr = array(), $line = null, $col = null, $armor = array()) { + public function __construct($name, $attr = array(), $line = null, $col = null, $armor = array()) + { $this->name = ctype_lower($name) ? $name : strtolower($name); foreach ($attr as $key => $value) { // normalization only necessary when key is not lowercase @@ -49,9 +56,13 @@ class HTMLPurifier_Token_Tag extends HTMLPurifier_Token } $this->attr = $attr; $this->line = $line; - $this->col = $col; + $this->col = $col; $this->armor = $armor; } + + public function toNode() { + return new HTMLPurifier_Node_Element($this->name, $this->attr, $this->line, $this->col, $this->armor); + } } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token/Text.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token/Text.php similarity index 54% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token/Text.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token/Text.php index 82efd823d..f26a1c211 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/Token/Text.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Token/Text.php @@ -12,22 +12,42 @@ class HTMLPurifier_Token_Text extends HTMLPurifier_Token { - public $name = '#PCDATA'; /**< PCDATA tag name compatible with DTD. */ - public $data; /**< Parsed character data of text. */ - public $is_whitespace; /**< Bool indicating if node is whitespace. */ + /** + * @type string + */ + public $name = '#PCDATA'; + /**< PCDATA tag name compatible with DTD. */ + + /** + * @type string + */ + public $data; + /**< Parsed character data of text. */ + + /** + * @type bool + */ + public $is_whitespace; + + /**< Bool indicating if node is whitespace. */ /** * Constructor, accepts data and determines if it is whitespace. - * - * @param $data String parsed character data. + * @param string $data String parsed character data. + * @param int $line + * @param int $col */ - public function __construct($data, $line = null, $col = null) { + public function __construct($data, $line = null, $col = null) + { $this->data = $data; $this->is_whitespace = ctype_space($data); $this->line = $line; - $this->col = $col; + $this->col = $col; } + public function toNode() { + return new HTMLPurifier_Node_Text($this->data, $this->is_whitespace, $this->line, $this->col); + } } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/TokenFactory.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/TokenFactory.php new file mode 100644 index 000000000..dea2446b9 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/TokenFactory.php @@ -0,0 +1,118 @@ +p_start = new HTMLPurifier_Token_Start('', array()); + $this->p_end = new HTMLPurifier_Token_End(''); + $this->p_empty = new HTMLPurifier_Token_Empty('', array()); + $this->p_text = new HTMLPurifier_Token_Text(''); + $this->p_comment = new HTMLPurifier_Token_Comment(''); + } + + /** + * Creates a HTMLPurifier_Token_Start. + * @param string $name Tag name + * @param array $attr Associative array of attributes + * @return HTMLPurifier_Token_Start Generated HTMLPurifier_Token_Start + */ + public function createStart($name, $attr = array()) + { + $p = clone $this->p_start; + $p->__construct($name, $attr); + return $p; + } + + /** + * Creates a HTMLPurifier_Token_End. + * @param string $name Tag name + * @return HTMLPurifier_Token_End Generated HTMLPurifier_Token_End + */ + public function createEnd($name) + { + $p = clone $this->p_end; + $p->__construct($name); + return $p; + } + + /** + * Creates a HTMLPurifier_Token_Empty. + * @param string $name Tag name + * @param array $attr Associative array of attributes + * @return HTMLPurifier_Token_Empty Generated HTMLPurifier_Token_Empty + */ + public function createEmpty($name, $attr = array()) + { + $p = clone $this->p_empty; + $p->__construct($name, $attr); + return $p; + } + + /** + * Creates a HTMLPurifier_Token_Text. + * @param string $data Data of text token + * @return HTMLPurifier_Token_Text Generated HTMLPurifier_Token_Text + */ + public function createText($data) + { + $p = clone $this->p_text; + $p->__construct($data); + return $p; + } + + /** + * Creates a HTMLPurifier_Token_Comment. + * @param string $data Data of comment token + * @return HTMLPurifier_Token_Comment Generated HTMLPurifier_Token_Comment + */ + public function createComment($data) + { + $p = clone $this->p_comment; + $p->__construct($data); + return $p; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URI.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URI.php similarity index 73% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URI.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URI.php index f158ef5e3..a5e7ae298 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URI.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URI.php @@ -10,17 +10,57 @@ */ class HTMLPurifier_URI { - - public $scheme, $userinfo, $host, $port, $path, $query, $fragment; + /** + * @type string + */ + public $scheme; /** + * @type string + */ + public $userinfo; + + /** + * @type string + */ + public $host; + + /** + * @type int + */ + public $port; + + /** + * @type string + */ + public $path; + + /** + * @type string + */ + public $query; + + /** + * @type string + */ + public $fragment; + + /** + * @param string $scheme + * @param string $userinfo + * @param string $host + * @param int $port + * @param string $path + * @param string $query + * @param string $fragment * @note Automatically normalizes scheme and port */ - public function __construct($scheme, $userinfo, $host, $port, $path, $query, $fragment) { + public function __construct($scheme, $userinfo, $host, $port, $path, $query, $fragment) + { $this->scheme = is_null($scheme) || ctype_lower($scheme) ? $scheme : strtolower($scheme); $this->userinfo = $userinfo; $this->host = $host; - $this->port = is_null($port) ? $port : (int) $port; + $this->port = is_null($port) ? $port : (int)$port; $this->path = $path; $this->query = $query; $this->fragment = $fragment; @@ -28,15 +68,18 @@ class HTMLPurifier_URI /** * Retrieves a scheme object corresponding to the URI's scheme/default - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - * @return Scheme object appropriate for validating this URI + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return HTMLPurifier_URIScheme Scheme object appropriate for validating this URI */ - public function getSchemeObj($config, $context) { + public function getSchemeObj($config, $context) + { $registry = HTMLPurifier_URISchemeRegistry::instance(); if ($this->scheme !== null) { $scheme_obj = $registry->getScheme($this->scheme, $config, $context); - if (!$scheme_obj) return false; // invalid scheme, clean it out + if (!$scheme_obj) { + return false; + } // invalid scheme, clean it out } else { // no scheme: retrieve the default one $def = $config->getDefinition('URI'); @@ -56,12 +99,12 @@ class HTMLPurifier_URI /** * Generic validation method applicable for all schemes. May modify * this URI in order to get it into a compliant form. - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - * @return True if validation/filtering succeeds, false if failure + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool True if validation/filtering succeeds, false if failure */ - public function validate($config, $context) { - + public function validate($config, $context) + { // ABNF definitions from RFC 3986 $chars_sub_delims = '!$&\'()*+,;='; $chars_gen_delims = ':/?#[]@'; @@ -71,7 +114,9 @@ class HTMLPurifier_URI if (!is_null($this->host)) { $host_def = new HTMLPurifier_AttrDef_URI_Host(); $this->host = $host_def->validate($this->host, $config, $context); - if ($this->host === false) $this->host = null; + if ($this->host === false) { + $this->host = null; + } } // validate scheme @@ -97,11 +142,12 @@ class HTMLPurifier_URI // validate port if (!is_null($this->port)) { - if ($this->port < 1 || $this->port > 65535) $this->port = null; + if ($this->port < 1 || $this->port > 65535) { + $this->port = null; + } } // validate path - $path_parts = array(); $segments_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/'); if (!is_null($this->host)) { // this catches $this->host === '' // path-abempty (hier and relative) @@ -161,16 +207,15 @@ class HTMLPurifier_URI if (!is_null($this->fragment)) { $this->fragment = $qf_encoder->encode($this->fragment); } - return true; - } /** * Convert URI back to string - * @return String URI appropriate for output + * @return string URI appropriate for output */ - public function toString() { + public function toString() + { // reconstruct authority $authority = null; // there is a rendering difference between a null authority @@ -178,9 +223,13 @@ class HTMLPurifier_URI // (http:///foo-bar). if (!is_null($this->host)) { $authority = ''; - if(!is_null($this->userinfo)) $authority .= $this->userinfo . '@'; + if (!is_null($this->userinfo)) { + $authority .= $this->userinfo . '@'; + } $authority .= $this->host; - if(!is_null($this->port)) $authority .= ':' . $this->port; + if (!is_null($this->port)) { + $authority .= ':' . $this->port; + } } // Reconstruct the result @@ -190,11 +239,19 @@ class HTMLPurifier_URI // differently than http:///foo), so unfortunately we have to // defer to the schemes to do the right thing. $result = ''; - if (!is_null($this->scheme)) $result .= $this->scheme . ':'; - if (!is_null($authority)) $result .= '//' . $authority; + if (!is_null($this->scheme)) { + $result .= $this->scheme . ':'; + } + if (!is_null($authority)) { + $result .= '//' . $authority; + } $result .= $this->path; - if (!is_null($this->query)) $result .= '?' . $this->query; - if (!is_null($this->fragment)) $result .= '#' . $this->fragment; + if (!is_null($this->query)) { + $result .= '?' . $this->query; + } + if (!is_null($this->fragment)) { + $result .= '#' . $this->fragment; + } return $result; } @@ -207,11 +264,19 @@ class HTMLPurifier_URI * Note that this does not do any scheme checking, so it is mostly * only appropriate for metadata that doesn't care about protocol * security. isBenign is probably what you actually want. + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool */ - public function isLocal($config, $context) { - if ($this->host === null) return true; + public function isLocal($config, $context) + { + if ($this->host === null) { + return true; + } $uri_def = $config->getDefinition('URI'); - if ($uri_def->host === $this->host) return true; + if ($uri_def->host === $this->host) { + return true; + } return false; } @@ -221,12 +286,20 @@ class HTMLPurifier_URI * * - It is a local URL (isLocal), and * - It has a equal or better level of security + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool */ - public function isBenign($config, $context) { - if (!$this->isLocal($config, $context)) return false; + public function isBenign($config, $context) + { + if (!$this->isLocal($config, $context)) { + return false; + } $scheme_obj = $this->getSchemeObj($config, $context); - if (!$scheme_obj) return false; // conservative approach + if (!$scheme_obj) { + return false; + } // conservative approach $current_scheme_obj = $config->getDefinition('URI')->getDefaultScheme($config, $context); if ($current_scheme_obj->secure) { @@ -236,7 +309,6 @@ class HTMLPurifier_URI } return true; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIDefinition.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIDefinition.php similarity index 85% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIDefinition.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIDefinition.php index 4dbde8062..e0bd8bcca 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIDefinition.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIDefinition.php @@ -23,7 +23,8 @@ class HTMLPurifier_URIDefinition extends HTMLPurifier_Definition */ public $defaultScheme; - public function __construct() { + public function __construct() + { $this->registerFilter(new HTMLPurifier_URIFilter_DisableExternal()); $this->registerFilter(new HTMLPurifier_URIFilter_DisableExternalResources()); $this->registerFilter(new HTMLPurifier_URIFilter_DisableResources()); @@ -33,11 +34,13 @@ class HTMLPurifier_URIDefinition extends HTMLPurifier_Definition $this->registerFilter(new HTMLPurifier_URIFilter_Munge()); } - public function registerFilter($filter) { + public function registerFilter($filter) + { $this->registeredFilters[$filter->name] = $filter; } - public function addFilter($filter, $config) { + public function addFilter($filter, $config) + { $r = $filter->prepare($config); if ($r === false) return; // null is ok, for backwards compat if ($filter->post) { @@ -47,12 +50,14 @@ class HTMLPurifier_URIDefinition extends HTMLPurifier_Definition } } - protected function doSetup($config) { + protected function doSetup($config) + { $this->setupMemberVariables($config); $this->setupFilters($config); } - protected function setupFilters($config) { + protected function setupFilters($config) + { foreach ($this->registeredFilters as $name => $filter) { if ($filter->always_load) { $this->addFilter($filter, $config); @@ -66,7 +71,8 @@ class HTMLPurifier_URIDefinition extends HTMLPurifier_Definition unset($this->registeredFilters); } - protected function setupMemberVariables($config) { + protected function setupMemberVariables($config) + { $this->host = $config->get('URI.Host'); $base_uri = $config->get('URI.Base'); if (!is_null($base_uri)) { @@ -78,11 +84,13 @@ class HTMLPurifier_URIDefinition extends HTMLPurifier_Definition if (is_null($this->defaultScheme)) $this->defaultScheme = $config->get('URI.DefaultScheme'); } - public function getDefaultScheme($config, $context) { + public function getDefaultScheme($config, $context) + { return HTMLPurifier_URISchemeRegistry::instance()->getScheme($this->defaultScheme, $config, $context); } - public function filter(&$uri, $config, $context) { + public function filter(&$uri, $config, $context) + { foreach ($this->filters as $name => $f) { $result = $f->filter($uri, $config, $context); if (!$result) return false; @@ -90,7 +98,8 @@ class HTMLPurifier_URIDefinition extends HTMLPurifier_Definition return true; } - public function postFilter(&$uri, $config, $context) { + public function postFilter(&$uri, $config, $context) + { foreach ($this->postFilters as $name => $f) { $result = $f->filter($uri, $config, $context); if (!$result) return false; diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter.php similarity index 77% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter.php index 6a1b0b08e..09724e9f4 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter.php @@ -29,39 +29,46 @@ abstract class HTMLPurifier_URIFilter { /** - * Unique identifier of filter + * Unique identifier of filter. + * @type string */ public $name; /** * True if this filter should be run after scheme validation. + * @type bool */ public $post = false; /** - * True if this filter should always be loaded (this permits - * a filter to be named Foo without the corresponding %URI.Foo - * directive existing.) + * True if this filter should always be loaded. + * This permits a filter to be named Foo without the corresponding + * %URI.Foo directive existing. + * @type bool */ public $always_load = false; /** * Performs initialization for the filter. If the filter returns * false, this means that it shouldn't be considered active. + * @param HTMLPurifier_Config $config + * @return bool */ - public function prepare($config) {return true;} + public function prepare($config) + { + return true; + } /** * Filter a URI object - * @param $uri Reference to URI object variable - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context + * @param HTMLPurifier_URI $uri Reference to URI object variable + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context * @return bool Whether or not to continue processing: false indicates * URL is no good, true indicates continue processing. Note that * all changes are committed directly on the URI object */ abstract public function filter(&$uri, $config, $context); - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/DisableExternal.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/DisableExternal.php new file mode 100644 index 000000000..ced1b1376 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/DisableExternal.php @@ -0,0 +1,54 @@ +getDefinition('URI')->host; + if ($our_host !== null) { + $this->ourHostParts = array_reverse(explode('.', $our_host)); + } + } + + /** + * @param HTMLPurifier_URI $uri Reference + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function filter(&$uri, $config, $context) + { + if (is_null($uri->host)) { + return true; + } + if ($this->ourHostParts === false) { + return false; + } + $host_parts = array_reverse(explode('.', $uri->host)); + foreach ($this->ourHostParts as $i => $x) { + if (!isset($host_parts[$i])) { + return false; + } + if ($host_parts[$i] != $this->ourHostParts[$i]) { + return false; + } + } + return true; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/DisableExternalResources.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/DisableExternalResources.php new file mode 100644 index 000000000..c6562169e --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/DisableExternalResources.php @@ -0,0 +1,25 @@ +get('EmbeddedURI', true)) { + return true; + } + return parent::filter($uri, $config, $context); + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/DisableResources.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/DisableResources.php new file mode 100644 index 000000000..d5c412c44 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/DisableResources.php @@ -0,0 +1,22 @@ +get('EmbeddedURI', true); + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/HostBlacklist.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/HostBlacklist.php similarity index 58% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/HostBlacklist.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/HostBlacklist.php index 55fde3bf4..a6645c17e 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/HostBlacklist.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/HostBlacklist.php @@ -6,14 +6,35 @@ // points are involved), but I'm not 100% sure class HTMLPurifier_URIFilter_HostBlacklist extends HTMLPurifier_URIFilter { + /** + * @type string + */ public $name = 'HostBlacklist'; + + /** + * @type array + */ protected $blacklist = array(); - public function prepare($config) { + + /** + * @param HTMLPurifier_Config $config + * @return bool + */ + public function prepare($config) + { $this->blacklist = $config->get('URI.HostBlacklist'); return true; } - public function filter(&$uri, $config, $context) { - foreach($this->blacklist as $blacklisted_host_fragment) { + + /** + * @param HTMLPurifier_URI $uri + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function filter(&$uri, $config, $context) + { + foreach ($this->blacklist as $blacklisted_host_fragment) { if (strpos($uri->host, $blacklisted_host_fragment) !== false) { return false; } diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/MakeAbsolute.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/MakeAbsolute.php similarity index 71% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/MakeAbsolute.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/MakeAbsolute.php index f46ab2630..c507bbff8 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIFilter/MakeAbsolute.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/MakeAbsolute.php @@ -4,14 +4,35 @@ class HTMLPurifier_URIFilter_MakeAbsolute extends HTMLPurifier_URIFilter { + /** + * @type string + */ public $name = 'MakeAbsolute'; + + /** + * @type + */ protected $base; + + /** + * @type array + */ protected $basePathStack = array(); - public function prepare($config) { + + /** + * @param HTMLPurifier_Config $config + * @return bool + */ + public function prepare($config) + { $def = $config->getDefinition('URI'); $this->base = $def->base; if (is_null($this->base)) { - trigger_error('URI.MakeAbsolute is being ignored due to lack of value for URI.Base configuration', E_USER_WARNING); + trigger_error( + 'URI.MakeAbsolute is being ignored due to lack of ' . + 'value for URI.Base configuration', + E_USER_WARNING + ); return false; } $this->base->fragment = null; // fragment is invalid for base URI @@ -21,19 +42,29 @@ class HTMLPurifier_URIFilter_MakeAbsolute extends HTMLPurifier_URIFilter $this->basePathStack = $stack; return true; } - public function filter(&$uri, $config, $context) { - if (is_null($this->base)) return true; // abort early - if ( - $uri->path === '' && is_null($uri->scheme) && - is_null($uri->host) && is_null($uri->query) && is_null($uri->fragment) - ) { + + /** + * @param HTMLPurifier_URI $uri + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function filter(&$uri, $config, $context) + { + if (is_null($this->base)) { + return true; + } // abort early + if ($uri->path === '' && is_null($uri->scheme) && + is_null($uri->host) && is_null($uri->query) && is_null($uri->fragment)) { // reference to current document $uri = clone $this->base; return true; } if (!is_null($uri->scheme)) { // absolute URI already: don't change - if (!is_null($uri->host)) return true; + if (!is_null($uri->host)) { + return true; + } $scheme_obj = $uri->getSchemeObj($config, $context); if (!$scheme_obj) { // scheme not recognized @@ -66,22 +97,33 @@ class HTMLPurifier_URIFilter_MakeAbsolute extends HTMLPurifier_URIFilter } // re-combine $uri->scheme = $this->base->scheme; - if (is_null($uri->userinfo)) $uri->userinfo = $this->base->userinfo; - if (is_null($uri->host)) $uri->host = $this->base->host; - if (is_null($uri->port)) $uri->port = $this->base->port; + if (is_null($uri->userinfo)) { + $uri->userinfo = $this->base->userinfo; + } + if (is_null($uri->host)) { + $uri->host = $this->base->host; + } + if (is_null($uri->port)) { + $uri->port = $this->base->port; + } return true; } /** * Resolve dots and double-dots in a path stack + * @param array $stack + * @return array */ - private function _collapseStack($stack) { + private function _collapseStack($stack) + { $result = array(); $is_folder = false; for ($i = 0; isset($stack[$i]); $i++) { $is_folder = false; // absorb an internally duplicated slash - if ($stack[$i] == '' && $i && isset($stack[$i+1])) continue; + if ($stack[$i] == '' && $i && isset($stack[$i + 1])) { + continue; + } if ($stack[$i] == '..') { if (!empty($result)) { $segment = array_pop($result); @@ -106,7 +148,9 @@ class HTMLPurifier_URIFilter_MakeAbsolute extends HTMLPurifier_URIFilter } $result[] = $stack[$i]; } - if ($is_folder) $result[] = ''; + if ($is_folder) { + $result[] = ''; + } return $result; } } diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/Munge.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/Munge.php new file mode 100644 index 000000000..6e03315a1 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/Munge.php @@ -0,0 +1,115 @@ +target = $config->get('URI.' . $this->name); + $this->parser = new HTMLPurifier_URIParser(); + $this->doEmbed = $config->get('URI.MungeResources'); + $this->secretKey = $config->get('URI.MungeSecretKey'); + if ($this->secretKey && !function_exists('hash_hmac')) { + throw new Exception("Cannot use %URI.MungeSecretKey without hash_hmac support."); + } + return true; + } + + /** + * @param HTMLPurifier_URI $uri + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function filter(&$uri, $config, $context) + { + if ($context->get('EmbeddedURI', true) && !$this->doEmbed) { + return true; + } + + $scheme_obj = $uri->getSchemeObj($config, $context); + if (!$scheme_obj) { + return true; + } // ignore unknown schemes, maybe another postfilter did it + if (!$scheme_obj->browsable) { + return true; + } // ignore non-browseable schemes, since we can't munge those in a reasonable way + if ($uri->isBenign($config, $context)) { + return true; + } // don't redirect if a benign URL + + $this->makeReplace($uri, $config, $context); + $this->replace = array_map('rawurlencode', $this->replace); + + $new_uri = strtr($this->target, $this->replace); + $new_uri = $this->parser->parse($new_uri); + // don't redirect if the target host is the same as the + // starting host + if ($uri->host === $new_uri->host) { + return true; + } + $uri = $new_uri; // overwrite + return true; + } + + /** + * @param HTMLPurifier_URI $uri + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + */ + protected function makeReplace($uri, $config, $context) + { + $string = $uri->toString(); + // always available + $this->replace['%s'] = $string; + $this->replace['%r'] = $context->get('EmbeddedURI', true); + $token = $context->get('CurrentToken', true); + $this->replace['%n'] = $token ? $token->name : null; + $this->replace['%m'] = $context->get('CurrentAttr', true); + $this->replace['%p'] = $context->get('CurrentCSSProperty', true); + // not always available + if ($this->secretKey) { + $this->replace['%t'] = hash_hmac("sha256", $string, $this->secretKey); + } + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/SafeIframe.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/SafeIframe.php new file mode 100644 index 000000000..f609c47a3 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIFilter/SafeIframe.php @@ -0,0 +1,68 @@ +regexp = $config->get('URI.SafeIframeRegexp'); + return true; + } + + /** + * @param HTMLPurifier_URI $uri + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function filter(&$uri, $config, $context) + { + // check if filter not applicable + if (!$config->get('HTML.SafeIframe')) { + return true; + } + // check if the filter should actually trigger + if (!$context->get('EmbeddedURI', true)) { + return true; + } + $token = $context->get('CurrentToken', true); + if (!($token && $token->name == 'iframe')) { + return true; + } + // check if we actually have some whitelists enabled + if ($this->regexp === null) { + return false; + } + // actually check the whitelists + return preg_match($this->regexp, $uri->toString()); + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIParser.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIParser.php similarity index 94% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIParser.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIParser.php index 7179e4ab8..0e7381a07 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIParser.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIParser.php @@ -12,7 +12,8 @@ class HTMLPurifier_URIParser */ protected $percentEncoder; - public function __construct() { + public function __construct() + { $this->percentEncoder = new HTMLPurifier_PercentEncoder(); } @@ -22,15 +23,15 @@ class HTMLPurifier_URIParser * @return HTMLPurifier_URI representation of URI. This representation has * not been validated yet and may not conform to RFC. */ - public function parse($uri) { - + public function parse($uri) + { $uri = $this->percentEncoder->normalize($uri); // Regexp is as per Appendix B. // Note that ["<>] are an addition to the RFC's recommended // characters, because they represent external delimeters. $r_URI = '!'. - '(([^:/?#"<>]+):)?'. // 2. Scheme + '(([a-zA-Z0-9\.\+\-]+):)?'. // 2. Scheme '(//([^/?#"<>]*))?'. // 4. Authority '([^?#"<>]*)'. // 5. Path '(\?([^#"<>]*))?'. // 7. Query diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme.php similarity index 74% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme.php index 7be958143..fe9e82cf2 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme.php @@ -7,27 +7,31 @@ abstract class HTMLPurifier_URIScheme { /** - * Scheme's default port (integer). If an explicit port number is + * Scheme's default port (integer). If an explicit port number is * specified that coincides with the default port, it will be * elided. + * @type int */ public $default_port = null; /** - * Whether or not URIs of this schem are locatable by a browser + * Whether or not URIs of this scheme are locatable by a browser * http and ftp are accessible, while mailto and news are not. + * @type bool */ public $browsable = false; /** * Whether or not data transmitted over this scheme is encrypted. * https is secure, http is not. + * @type bool */ public $secure = false; /** * Whether or not the URI always uses , resolves edge cases * with making relative URIs absolute + * @type bool */ public $hierarchical = false; @@ -35,28 +39,32 @@ abstract class HTMLPurifier_URIScheme * Whether or not the URI may omit a hostname when the scheme is * explicitly specified, ala file:///path/to/file. As of writing, * 'file' is the only scheme that browsers support his properly. + * @type bool */ public $may_omit_host = false; /** * Validates the components of a URI for a specific scheme. - * @param $uri Reference to a HTMLPurifier_URI object - * @param $config HTMLPurifier_Config object - * @param $context HTMLPurifier_Context object - * @return Bool success or failure + * @param HTMLPurifier_URI $uri Reference to a HTMLPurifier_URI object + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool success or failure */ - public abstract function doValidate(&$uri, $config, $context); + abstract public function doValidate(&$uri, $config, $context); /** * Public interface for validating components of a URI. Performs a * bunch of default actions. Don't overload this method. - * @param $uri Reference to a HTMLPurifier_URI object - * @param $config HTMLPurifier_Config object - * @param $context HTMLPurifier_Context object - * @return Bool success or failure + * @param HTMLPurifier_URI $uri Reference to a HTMLPurifier_URI object + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool success or failure */ - public function validate(&$uri, $config, $context) { - if ($this->default_port == $uri->port) $uri->port = null; + public function validate(&$uri, $config, $context) + { + if ($this->default_port == $uri->port) { + $uri->port = null; + } // kludge: browsers do funny things when the scheme but not the // authority is set if (!$this->may_omit_host && @@ -65,7 +73,7 @@ abstract class HTMLPurifier_URIScheme // if the scheme is not present, a *blank* host is in error, // since this translates into '///path' which most browsers // interpret as being 'http://path'. - (is_null($uri->scheme) && $uri->host === '') + (is_null($uri->scheme) && $uri->host === '') ) { do { if (is_null($uri->scheme)) { @@ -89,7 +97,6 @@ abstract class HTMLPurifier_URIScheme } return $this->doValidate($uri, $config, $context); } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/data.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/data.php similarity index 78% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/data.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/data.php index ab56a3e96..6ebca4984 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/data.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/data.php @@ -3,21 +3,38 @@ /** * Implements data: URI for base64 encoded images supported by GD. */ -class HTMLPurifier_URIScheme_data extends HTMLPurifier_URIScheme { - +class HTMLPurifier_URIScheme_data extends HTMLPurifier_URIScheme +{ + /** + * @type bool + */ public $browsable = true; + + /** + * @type array + */ public $allowed_types = array( // you better write validation code for other types if you // decide to allow them 'image/jpeg' => true, 'image/gif' => true, 'image/png' => true, - ); + ); // this is actually irrelevant since we only write out the path // component + /** + * @type bool + */ public $may_omit_host = true; - public function doValidate(&$uri, $config, $context) { + /** + * @param HTMLPurifier_URI $uri + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function doValidate(&$uri, $config, $context) + { $result = explode(',', $uri->path, 2); $is_base64 = false; $charset = null; @@ -26,7 +43,7 @@ class HTMLPurifier_URIScheme_data extends HTMLPurifier_URIScheme { list($metadata, $data) = $result; // do some legwork on the metadata $metas = explode(';', $metadata); - while(!empty($metas)) { + while (!empty($metas)) { $cur = array_shift($metas); if ($cur == 'base64') { $is_base64 = true; @@ -35,10 +52,14 @@ class HTMLPurifier_URIScheme_data extends HTMLPurifier_URIScheme { if (substr($cur, 0, 8) == 'charset=') { // doesn't match if there are arbitrary spaces, but // whatever dude - if ($charset !== null) continue; // garbage + if ($charset !== null) { + continue; + } // garbage $charset = substr($cur, 8); // not used } else { - if ($content_type !== null) continue; // garbage + if ($content_type !== null) { + continue; + } // garbage $content_type = $cur; } } @@ -70,7 +91,9 @@ class HTMLPurifier_URIScheme_data extends HTMLPurifier_URIScheme { $info = getimagesize($file); restore_error_handler(); unlink($file); - if ($info == false) return false; + if ($info == false) { + return false; + } $image_code = $info[2]; } else { trigger_error("could not find exif_imagetype or getimagesize functions", E_USER_ERROR); @@ -79,7 +102,9 @@ class HTMLPurifier_URIScheme_data extends HTMLPurifier_URIScheme { if ($real_content_type != $content_type) { // we're nice guys; if the content type is something else we // support, change it over - if (empty($this->allowed_types[$real_content_type])) return false; + if (empty($this->allowed_types[$real_content_type])) { + return false; + } $content_type = $real_content_type; } // ok, it's kosher, rewrite what we need @@ -92,7 +117,11 @@ class HTMLPurifier_URIScheme_data extends HTMLPurifier_URIScheme { return true; } - public function muteErrorHandler($errno, $errstr) {} - + /** + * @param int $errno + * @param string $errstr + */ + public function muteErrorHandler($errno, $errstr) + { + } } - diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/file.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/file.php new file mode 100644 index 000000000..215be4ba8 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/file.php @@ -0,0 +1,44 @@ +userinfo = null; + // file:// makes no provisions for accessing the resource + $uri->port = null; + // While it seems to work on Firefox, the querystring has + // no possible effect and is thus stripped. + $uri->query = null; + return true; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/ftp.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/ftp.php similarity index 74% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/ftp.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/ftp.php index 0fb2abf64..1eb43ee5c 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/ftp.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/ftp.php @@ -3,14 +3,32 @@ /** * Validates ftp (File Transfer Protocol) URIs as defined by generic RFC 1738. */ -class HTMLPurifier_URIScheme_ftp extends HTMLPurifier_URIScheme { - +class HTMLPurifier_URIScheme_ftp extends HTMLPurifier_URIScheme +{ + /** + * @type int + */ public $default_port = 21; + + /** + * @type bool + */ public $browsable = true; // usually + + /** + * @type bool + */ public $hierarchical = true; - public function doValidate(&$uri, $config, $context) { - $uri->query = null; + /** + * @param HTMLPurifier_URI $uri + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function doValidate(&$uri, $config, $context) + { + $uri->query = null; // typecode check $semicolon_pos = strrpos($uri->path, ';'); // reverse @@ -33,10 +51,8 @@ class HTMLPurifier_URIScheme_ftp extends HTMLPurifier_URIScheme { $uri->path = str_replace(';', '%3B', $uri->path); $uri->path .= $type_ret; } - return true; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/http.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/http.php similarity index 50% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/http.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/http.php index 959b8daff..ce69ec438 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/http.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/http.php @@ -3,17 +3,34 @@ /** * Validates http (HyperText Transfer Protocol) as defined by RFC 2616 */ -class HTMLPurifier_URIScheme_http extends HTMLPurifier_URIScheme { - +class HTMLPurifier_URIScheme_http extends HTMLPurifier_URIScheme +{ + /** + * @type int + */ public $default_port = 80; + + /** + * @type bool + */ public $browsable = true; + + /** + * @type bool + */ public $hierarchical = true; - public function doValidate(&$uri, $config, $context) { + /** + * @param HTMLPurifier_URI $uri + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function doValidate(&$uri, $config, $context) + { $uri->userinfo = null; return true; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/https.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/https.php similarity index 74% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/https.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/https.php index 159c2874e..0e96882db 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/https.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/https.php @@ -3,11 +3,16 @@ /** * Validates https (Secure HTTP) according to http scheme. */ -class HTMLPurifier_URIScheme_https extends HTMLPurifier_URIScheme_http { - +class HTMLPurifier_URIScheme_https extends HTMLPurifier_URIScheme_http +{ + /** + * @type int + */ public $default_port = 443; + /** + * @type bool + */ public $secure = true; - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/mailto.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/mailto.php similarity index 67% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/mailto.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/mailto.php index 9db4cb23f..c3a6b602a 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URIScheme/mailto.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/mailto.php @@ -9,19 +9,32 @@ * @todo Filter allowed query parameters */ -class HTMLPurifier_URIScheme_mailto extends HTMLPurifier_URIScheme { - +class HTMLPurifier_URIScheme_mailto extends HTMLPurifier_URIScheme +{ + /** + * @type bool + */ public $browsable = false; + + /** + * @type bool + */ public $may_omit_host = true; - public function doValidate(&$uri, $config, $context) { + /** + * @param HTMLPurifier_URI $uri + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function doValidate(&$uri, $config, $context) + { $uri->userinfo = null; $uri->host = null; $uri->port = null; // we need to validate path against RFC 2368's addr-spec return true; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/news.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/news.php new file mode 100644 index 000000000..7490927d6 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/news.php @@ -0,0 +1,35 @@ +userinfo = null; + $uri->host = null; + $uri->port = null; + $uri->query = null; + // typecode check needed on path + return true; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/nntp.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/nntp.php new file mode 100644 index 000000000..f211d715e --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URIScheme/nntp.php @@ -0,0 +1,32 @@ +userinfo = null; + $uri->query = null; + return true; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URISchemeRegistry.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URISchemeRegistry.php similarity index 58% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URISchemeRegistry.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URISchemeRegistry.php index 576bf7b6d..4ac8a0b76 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/URISchemeRegistry.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/URISchemeRegistry.php @@ -8,12 +8,14 @@ class HTMLPurifier_URISchemeRegistry /** * Retrieve sole instance of the registry. - * @param $prototype Optional prototype to overload sole instance with, + * @param HTMLPurifier_URISchemeRegistry $prototype Optional prototype to overload sole instance with, * or bool true to reset to default registry. + * @return HTMLPurifier_URISchemeRegistry * @note Pass a registry object $prototype with a compatible interface and * the function will copy it and return it all further times. */ - public static function instance($prototype = null) { + public static function instance($prototype = null) + { static $instance = null; if ($prototype !== null) { $instance = $prototype; @@ -25,17 +27,22 @@ class HTMLPurifier_URISchemeRegistry /** * Cache of retrieved schemes. + * @type HTMLPurifier_URIScheme[] */ protected $schemes = array(); /** * Retrieves a scheme validator object - * @param $scheme String scheme name like http or mailto - * @param $config HTMLPurifier_Config object - * @param $config HTMLPurifier_Context object + * @param string $scheme String scheme name like http or mailto + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return HTMLPurifier_URIScheme */ - public function getScheme($scheme, $config, $context) { - if (!$config) $config = HTMLPurifier_Config::createDefault(); + public function getScheme($scheme, $config, $context) + { + if (!$config) { + $config = HTMLPurifier_Config::createDefault(); + } // important, otherwise attacker could include arbitrary file $allowed_schemes = $config->get('URI.AllowedSchemes'); @@ -45,24 +52,30 @@ class HTMLPurifier_URISchemeRegistry return; } - if (isset($this->schemes[$scheme])) return $this->schemes[$scheme]; - if (!isset($allowed_schemes[$scheme])) return; + if (isset($this->schemes[$scheme])) { + return $this->schemes[$scheme]; + } + if (!isset($allowed_schemes[$scheme])) { + return; + } $class = 'HTMLPurifier_URIScheme_' . $scheme; - if (!class_exists($class)) return; + if (!class_exists($class)) { + return; + } $this->schemes[$scheme] = new $class(); return $this->schemes[$scheme]; } /** * Registers a custom scheme to the cache, bypassing reflection. - * @param $scheme Scheme name - * @param $scheme_obj HTMLPurifier_URIScheme object + * @param string $scheme Scheme name + * @param HTMLPurifier_URIScheme $scheme_obj */ - public function register($scheme, $scheme_obj) { + public function register($scheme, $scheme_obj) + { $this->schemes[$scheme] = $scheme_obj; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/UnitConverter.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/UnitConverter.php similarity index 75% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/UnitConverter.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/UnitConverter.php index 545d42622..166f3bf30 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/UnitConverter.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/UnitConverter.php @@ -37,20 +37,24 @@ class HTMLPurifier_UnitConverter /** * Minimum bcmath precision for output. + * @type int */ protected $outputPrecision; /** * Bcmath precision for internal calculations. + * @type int */ protected $internalPrecision; /** - * Whether or not BCMath is available + * Whether or not BCMath is available. + * @type bool */ private $bcmath; - public function __construct($output_precision = 4, $internal_precision = 10, $force_no_bcmath = false) { + public function __construct($output_precision = 4, $internal_precision = 10, $force_no_bcmath = false) + { $this->outputPrecision = $output_precision; $this->internalPrecision = $internal_precision; $this->bcmath = !$force_no_bcmath && function_exists('bcmul'); @@ -63,6 +67,7 @@ class HTMLPurifier_UnitConverter * it before passing it here! * @param string $to_unit * Unit to convert to. + * @return HTMLPurifier_Length|bool * @note * About precision: This conversion function pays very special * attention to the incoming precision of values and attempts @@ -74,11 +79,13 @@ class HTMLPurifier_UnitConverter * and this causes some decimals to be excluded, those * decimals will be added on. */ - public function convert($length, $to_unit) { + public function convert($length, $to_unit) + { + if (!$length->isValid()) { + return false; + } - if (!$length->isValid()) return false; - - $n = $length->getN(); + $n = $length->getN(); $unit = $length->getUnit(); if ($n === '0' || $unit === false) { @@ -87,21 +94,29 @@ class HTMLPurifier_UnitConverter $state = $dest_state = false; foreach (self::$units as $k => $x) { - if (isset($x[$unit])) $state = $k; - if (isset($x[$to_unit])) $dest_state = $k; + if (isset($x[$unit])) { + $state = $k; + } + if (isset($x[$to_unit])) { + $dest_state = $k; + } + } + if (!$state || !$dest_state) { + return false; } - if (!$state || !$dest_state) return false; // Some calculations about the initial precision of the number; // this will be useful when we need to do final rounding. $sigfigs = $this->getSigFigs($n); - if ($sigfigs < $this->outputPrecision) $sigfigs = $this->outputPrecision; + if ($sigfigs < $this->outputPrecision) { + $sigfigs = $this->outputPrecision; + } // BCMath's internal precision deals only with decimals. Use // our default if the initial number has no decimals, or increase // it by how ever many decimals, thus, the number of guard digits // will always be greater than or equal to internalPrecision. - $log = (int) floor(log(abs($n), 10)); + $log = (int)floor(log(abs($n), 10)); $cp = ($log < 0) ? $this->internalPrecision - $log : $this->internalPrecision; // internal precision for ($i = 0; $i < 2; $i++) { @@ -152,14 +167,18 @@ class HTMLPurifier_UnitConverter } // Post-condition: $unit == $to_unit - if ($unit !== $to_unit) return false; + if ($unit !== $to_unit) { + return false; + } // Useful for debugging: //echo "
n";
         //echo "$n\nsigfigs = $sigfigs\nnew_log = $new_log\nlog = $log\nrp = $rp\n
\n"; $n = $this->round($n, $sigfigs); - if (strpos($n, '.') !== false) $n = rtrim($n, '0'); + if (strpos($n, '.') !== false) { + $n = rtrim($n, '0'); + } $n = rtrim($n, '.'); return new HTMLPurifier_Length($n, $unit); @@ -170,53 +189,84 @@ class HTMLPurifier_UnitConverter * @param string $n Decimal number * @return int number of sigfigs */ - public function getSigFigs($n) { + public function getSigFigs($n) + { $n = ltrim($n, '0+-'); $dp = strpos($n, '.'); // decimal position if ($dp === false) { $sigfigs = strlen(rtrim($n, '0')); } else { $sigfigs = strlen(ltrim($n, '0.')); // eliminate extra decimal character - if ($dp !== 0) $sigfigs--; + if ($dp !== 0) { + $sigfigs--; + } } return $sigfigs; } /** * Adds two numbers, using arbitrary precision when available. + * @param string $s1 + * @param string $s2 + * @param int $scale + * @return string */ - private function add($s1, $s2, $scale) { - if ($this->bcmath) return bcadd($s1, $s2, $scale); - else return $this->scale($s1 + $s2, $scale); + private function add($s1, $s2, $scale) + { + if ($this->bcmath) { + return bcadd($s1, $s2, $scale); + } else { + return $this->scale((float)$s1 + (float)$s2, $scale); + } } /** * Multiples two numbers, using arbitrary precision when available. + * @param string $s1 + * @param string $s2 + * @param int $scale + * @return string */ - private function mul($s1, $s2, $scale) { - if ($this->bcmath) return bcmul($s1, $s2, $scale); - else return $this->scale($s1 * $s2, $scale); + private function mul($s1, $s2, $scale) + { + if ($this->bcmath) { + return bcmul($s1, $s2, $scale); + } else { + return $this->scale((float)$s1 * (float)$s2, $scale); + } } /** * Divides two numbers, using arbitrary precision when available. + * @param string $s1 + * @param string $s2 + * @param int $scale + * @return string */ - private function div($s1, $s2, $scale) { - if ($this->bcmath) return bcdiv($s1, $s2, $scale); - else return $this->scale($s1 / $s2, $scale); + private function div($s1, $s2, $scale) + { + if ($this->bcmath) { + return bcdiv($s1, $s2, $scale); + } else { + return $this->scale((float)$s1 / (float)$s2, $scale); + } } /** * Rounds a number according to the number of sigfigs it should have, * using arbitrary precision when available. + * @param float $n + * @param int $sigfigs + * @return string */ - private function round($n, $sigfigs) { - $new_log = (int) floor(log(abs($n), 10)); // Number of digits left of decimal - 1 + private function round($n, $sigfigs) + { + $new_log = (int)floor(log(abs($n), 10)); // Number of digits left of decimal - 1 $rp = $sigfigs - $new_log - 1; // Number of decimal places needed $neg = $n < 0 ? '-' : ''; // Negative sign if ($this->bcmath) { if ($rp >= 0) { - $n = bcadd($n, $neg . '0.' . str_repeat('0', $rp) . '5', $rp + 1); + $n = bcadd($n, $neg . '0.' . str_repeat('0', $rp) . '5', $rp + 1); $n = bcdiv($n, '1', $rp); } else { // This algorithm partially depends on the standardized @@ -232,23 +282,26 @@ class HTMLPurifier_UnitConverter /** * Scales a float to $scale digits right of decimal point, like BCMath. + * @param float $r + * @param int $scale + * @return string */ - private function scale($r, $scale) { + private function scale($r, $scale) + { if ($scale < 0) { // The f sprintf type doesn't support negative numbers, so we // need to cludge things manually. First get the string. - $r = sprintf('%.0f', (float) $r); + $r = sprintf('%.0f', (float)$r); // Due to floating point precision loss, $r will more than likely // look something like 4652999999999.9234. We grab one more digit // than we need to precise from $r and then use that to round // appropriately. - $precise = (string) round(substr($r, 0, strlen($r) + $scale), -1); + $precise = (string)round(substr($r, 0, strlen($r) + $scale), -1); // Now we return it, truncating the zero that was rounded off. return substr($precise, 0, -1) . str_repeat('0', -$scale + 1); } - return sprintf('%.' . $scale . 'f', (float) $r); + return sprintf('%.' . $scale . 'f', (float)$r); } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/VarParser.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/VarParser.php new file mode 100644 index 000000000..50cba6910 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/VarParser.php @@ -0,0 +1,198 @@ + self::STRING, + 'istring' => self::ISTRING, + 'text' => self::TEXT, + 'itext' => self::ITEXT, + 'int' => self::INT, + 'float' => self::FLOAT, + 'bool' => self::BOOL, + 'lookup' => self::LOOKUP, + 'list' => self::ALIST, + 'hash' => self::HASH, + 'mixed' => self::MIXED + ); + + /** + * Lookup table of types that are string, and can have aliases or + * allowed value lists. + */ + public static $stringTypes = array( + self::STRING => true, + self::ISTRING => true, + self::TEXT => true, + self::ITEXT => true, + ); + + /** + * Validate a variable according to type. + * It may return NULL as a valid type if $allow_null is true. + * + * @param mixed $var Variable to validate + * @param int $type Type of variable, see HTMLPurifier_VarParser->types + * @param bool $allow_null Whether or not to permit null as a value + * @return string Validated and type-coerced variable + * @throws HTMLPurifier_VarParserException + */ + final public function parse($var, $type, $allow_null = false) + { + if (is_string($type)) { + if (!isset(HTMLPurifier_VarParser::$types[$type])) { + throw new HTMLPurifier_VarParserException("Invalid type '$type'"); + } else { + $type = HTMLPurifier_VarParser::$types[$type]; + } + } + $var = $this->parseImplementation($var, $type, $allow_null); + if ($allow_null && $var === null) { + return null; + } + // These are basic checks, to make sure nothing horribly wrong + // happened in our implementations. + switch ($type) { + case (self::STRING): + case (self::ISTRING): + case (self::TEXT): + case (self::ITEXT): + if (!is_string($var)) { + break; + } + if ($type == self::ISTRING || $type == self::ITEXT) { + $var = strtolower($var); + } + return $var; + case (self::INT): + if (!is_int($var)) { + break; + } + return $var; + case (self::FLOAT): + if (!is_float($var)) { + break; + } + return $var; + case (self::BOOL): + if (!is_bool($var)) { + break; + } + return $var; + case (self::LOOKUP): + case (self::ALIST): + case (self::HASH): + if (!is_array($var)) { + break; + } + if ($type === self::LOOKUP) { + foreach ($var as $k) { + if ($k !== true) { + $this->error('Lookup table contains value other than true'); + } + } + } elseif ($type === self::ALIST) { + $keys = array_keys($var); + if (array_keys($keys) !== $keys) { + $this->error('Indices for list are not uniform'); + } + } + return $var; + case (self::MIXED): + return $var; + default: + $this->errorInconsistent(get_class($this), $type); + } + $this->errorGeneric($var, $type); + } + + /** + * Actually implements the parsing. Base implementation does not + * do anything to $var. Subclasses should overload this! + * @param mixed $var + * @param int $type + * @param bool $allow_null + * @return string + */ + protected function parseImplementation($var, $type, $allow_null) + { + return $var; + } + + /** + * Throws an exception. + * @throws HTMLPurifier_VarParserException + */ + protected function error($msg) + { + throw new HTMLPurifier_VarParserException($msg); + } + + /** + * Throws an inconsistency exception. + * @note This should not ever be called. It would be called if we + * extend the allowed values of HTMLPurifier_VarParser without + * updating subclasses. + * @param string $class + * @param int $type + * @throws HTMLPurifier_Exception + */ + protected function errorInconsistent($class, $type) + { + throw new HTMLPurifier_Exception( + "Inconsistency in $class: " . HTMLPurifier_VarParser::getTypeName($type) . + " not implemented" + ); + } + + /** + * Generic error for if a type didn't work. + * @param mixed $var + * @param int $type + */ + protected function errorGeneric($var, $type) + { + $vtype = gettype($var); + $this->error("Expected type " . HTMLPurifier_VarParser::getTypeName($type) . ", got $vtype"); + } + + /** + * @param int $type + * @return string + */ + public static function getTypeName($type) + { + static $lookup; + if (!$lookup) { + // Lazy load the alternative lookup table + $lookup = array_flip(HTMLPurifier_VarParser::$types); + } + if (!isset($lookup[$type])) { + return 'unknown'; + } + return $lookup[$type]; + } +} + +// vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/VarParser/Flexible.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/VarParser/Flexible.php similarity index 63% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/VarParser/Flexible.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/VarParser/Flexible.php index 21b87675a..b15016c5b 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/VarParser/Flexible.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/VarParser/Flexible.php @@ -7,28 +7,41 @@ */ class HTMLPurifier_VarParser_Flexible extends HTMLPurifier_VarParser { - - protected function parseImplementation($var, $type, $allow_null) { - if ($allow_null && $var === null) return null; + /** + * @param mixed $var + * @param int $type + * @param bool $allow_null + * @return array|bool|float|int|mixed|null|string + * @throws HTMLPurifier_VarParserException + */ + protected function parseImplementation($var, $type, $allow_null) + { + if ($allow_null && $var === null) { + return null; + } switch ($type) { // Note: if code "breaks" from the switch, it triggers a generic // exception to be thrown. Specific errors can be specifically // done here. - case self::MIXED : - case self::ISTRING : - case self::STRING : - case self::TEXT : - case self::ITEXT : + case self::MIXED: + case self::ISTRING: + case self::STRING: + case self::TEXT: + case self::ITEXT: return $var; - case self::INT : - if (is_string($var) && ctype_digit($var)) $var = (int) $var; + case self::INT: + if (is_string($var) && ctype_digit($var)) { + $var = (int)$var; + } return $var; - case self::FLOAT : - if ((is_string($var) && is_numeric($var)) || is_int($var)) $var = (float) $var; + case self::FLOAT: + if ((is_string($var) && is_numeric($var)) || is_int($var)) { + $var = (float)$var; + } return $var; - case self::BOOL : + case self::BOOL: if (is_int($var) && ($var === 0 || $var === 1)) { - $var = (bool) $var; + $var = (bool)$var; } elseif (is_string($var)) { if ($var == 'on' || $var == 'true' || $var == '1') { $var = true; @@ -39,45 +52,56 @@ class HTMLPurifier_VarParser_Flexible extends HTMLPurifier_VarParser } } return $var; - case self::ALIST : - case self::HASH : - case self::LOOKUP : + case self::ALIST: + case self::HASH: + case self::LOOKUP: if (is_string($var)) { // special case: technically, this is an array with // a single empty string item, but having an empty // array is more intuitive - if ($var == '') return array(); + if ($var == '') { + return array(); + } if (strpos($var, "\n") === false && strpos($var, "\r") === false) { // simplistic string to array method that only works // for simple lists of tag names or alphanumeric characters - $var = explode(',',$var); + $var = explode(',', $var); } else { $var = preg_split('/(,|[\n\r]+)/', $var); } // remove spaces - foreach ($var as $i => $j) $var[$i] = trim($j); + foreach ($var as $i => $j) { + $var[$i] = trim($j); + } if ($type === self::HASH) { // key:value,key2:value2 $nvar = array(); foreach ($var as $keypair) { $c = explode(':', $keypair, 2); - if (!isset($c[1])) continue; + if (!isset($c[1])) { + continue; + } $nvar[trim($c[0])] = trim($c[1]); } $var = $nvar; } } - if (!is_array($var)) break; + if (!is_array($var)) { + break; + } $keys = array_keys($var); if ($keys === array_keys($keys)) { - if ($type == self::ALIST) return $var; - elseif ($type == self::LOOKUP) { + if ($type == self::ALIST) { + return $var; + } elseif ($type == self::LOOKUP) { $new = array(); foreach ($var as $key) { $new[$key] = true; } return $new; - } else break; + } else { + break; + } } if ($type === self::ALIST) { trigger_error("Array list did not have consecutive integer indexes", E_USER_WARNING); @@ -86,7 +110,11 @@ class HTMLPurifier_VarParser_Flexible extends HTMLPurifier_VarParser if ($type === self::LOOKUP) { foreach ($var as $key => $value) { if ($value !== true) { - trigger_error("Lookup array has non-true value at key '$key'; maybe your input array was not indexed numerically", E_USER_WARNING); + trigger_error( + "Lookup array has non-true value at key '$key'; " . + "maybe your input array was not indexed numerically", + E_USER_WARNING + ); } $var[$key] = true; } @@ -97,7 +125,6 @@ class HTMLPurifier_VarParser_Flexible extends HTMLPurifier_VarParser } $this->errorGeneric($var, $type); } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/VarParser/Native.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/VarParser/Native.php similarity index 67% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/VarParser/Native.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/VarParser/Native.php index b02a6de54..f11c318ef 100644 --- a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/VarParser/Native.php +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/VarParser/Native.php @@ -8,11 +8,24 @@ class HTMLPurifier_VarParser_Native extends HTMLPurifier_VarParser { - protected function parseImplementation($var, $type, $allow_null) { + /** + * @param mixed $var + * @param int $type + * @param bool $allow_null + * @return null|string + */ + protected function parseImplementation($var, $type, $allow_null) + { return $this->evalExpression($var); } - protected function evalExpression($expr) { + /** + * @param string $expr + * @return mixed + * @throws HTMLPurifier_VarParserException + */ + protected function evalExpression($expr) + { $var = null; $result = eval("\$var = $expr;"); if ($result === false) { @@ -20,7 +33,6 @@ class HTMLPurifier_VarParser_Native extends HTMLPurifier_VarParser } return $var; } - } // vim: et sw=4 sts=4 diff --git a/library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/VarParserException.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/VarParserException.php similarity index 100% rename from library/vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier/VarParserException.php rename to library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/VarParserException.php diff --git a/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Zipper.php b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Zipper.php new file mode 100644 index 000000000..6e21ea070 --- /dev/null +++ b/library/vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier/Zipper.php @@ -0,0 +1,157 @@ +front = $front; + $this->back = $back; + } + + /** + * Creates a zipper from an array, with a hole in the + * 0-index position. + * @param Array to zipper-ify. + * @return Tuple of zipper and element of first position. + */ + static public function fromArray($array) { + $z = new self(array(), array_reverse($array)); + $t = $z->delete(); // delete the "dummy hole" + return array($z, $t); + } + + /** + * Convert zipper back into a normal array, optionally filling in + * the hole with a value. (Usually you should supply a $t, unless you + * are at the end of the array.) + */ + public function toArray($t = NULL) { + $a = $this->front; + if ($t !== NULL) $a[] = $t; + for ($i = count($this->back)-1; $i >= 0; $i--) { + $a[] = $this->back[$i]; + } + return $a; + } + + /** + * Move hole to the next element. + * @param $t Element to fill hole with + * @return Original contents of new hole. + */ + public function next($t) { + if ($t !== NULL) array_push($this->front, $t); + return empty($this->back) ? NULL : array_pop($this->back); + } + + /** + * Iterated hole advancement. + * @param $t Element to fill hole with + * @param $i How many forward to advance hole + * @return Original contents of new hole, i away + */ + public function advance($t, $n) { + for ($i = 0; $i < $n; $i++) { + $t = $this->next($t); + } + return $t; + } + + /** + * Move hole to the previous element + * @param $t Element to fill hole with + * @return Original contents of new hole. + */ + public function prev($t) { + if ($t !== NULL) array_push($this->back, $t); + return empty($this->front) ? NULL : array_pop($this->front); + } + + /** + * Delete contents of current hole, shifting hole to + * next element. + * @return Original contents of new hole. + */ + public function delete() { + return empty($this->back) ? NULL : array_pop($this->back); + } + + /** + * Returns true if we are at the end of the list. + * @return bool + */ + public function done() { + return empty($this->back); + } + + /** + * Insert element before hole. + * @param Element to insert + */ + public function insertBefore($t) { + if ($t !== NULL) array_push($this->front, $t); + } + + /** + * Insert element after hole. + * @param Element to insert + */ + public function insertAfter($t) { + if ($t !== NULL) array_push($this->back, $t); + } + + /** + * Splice in multiple elements at hole. Functional specification + * in terms of array_splice: + * + * $arr1 = $arr; + * $old1 = array_splice($arr1, $i, $delete, $replacement); + * + * list($z, $t) = HTMLPurifier_Zipper::fromArray($arr); + * $t = $z->advance($t, $i); + * list($old2, $t) = $z->splice($t, $delete, $replacement); + * $arr2 = $z->toArray($t); + * + * assert($old1 === $old2); + * assert($arr1 === $arr2); + * + * NB: the absolute index location after this operation is + * *unchanged!* + * + * @param Current contents of hole. + */ + public function splice($t, $delete, $replacement) { + // delete + $old = array(); + $r = $t; + for ($i = $delete; $i > 0; $i--) { + $old[] = $r; + $r = $this->delete(); + } + // insert + for ($i = count($replacement)-1; $i >= 0; $i--) { + $this->insertAfter($r); + $r = $replacement[$i]; + } + return array($old, $r); + } +} diff --git a/modules/monitoring/application/views/helpers/PluginOutput.php b/modules/monitoring/application/views/helpers/PluginOutput.php index 9ffb88bd4..e53e71352 100644 --- a/modules/monitoring/application/views/helpers/PluginOutput.php +++ b/modules/monitoring/application/views/helpers/PluginOutput.php @@ -70,8 +70,7 @@ class Zend_View_Helper_PluginOutput extends Zend_View_Helper_Abstract protected function getPurifier() { if (self::$purifier === null) { - // require_once 'vendor/htmlpurifier/library/HTMLPurifier.auto.php'; - require_once 'vendor/htmlpurifier-4.5.0-lite/library/HTMLPurifier.auto.php'; + require_once 'vendor/htmlpurifier-4.6.0-lite/library/HTMLPurifier.auto.php'; $config = HTMLPurifier_Config::createDefault(); $config->set('Core.EscapeNonASCIICharacters', true); $config->set('HTML.Allowed', 'p,br,b,a[href],i,table,tr,td[colspan],div[class]'); From dcf6b998bf9b4649e3f665462eff126ed51a7672 Mon Sep 17 00:00:00 2001 From: Thomas Gelf Date: Fri, 9 May 2014 10:53:54 +0000 Subject: [PATCH 05/14] Upgrade lessphp * Upgrade from 0.3.9 to 0.4.0 * Document package source * Remove overhead refs #6165 refs #6166 --- library/vendor/lessphp/README.md | 96 -- library/vendor/lessphp/SOURCE | 2 + library/vendor/lessphp/composer.json | 25 - library/vendor/lessphp/docs/docs.md | 1294 ----------------- library/vendor/lessphp/lessc.inc.php | 418 ++++-- library/vendor/lessphp/plessc | 250 ---- library/vendor/lessphp/tests/ApiTest.php | 189 --- library/vendor/lessphp/tests/InputTest.php | 71 - library/vendor/lessphp/tests/README.md | 13 - library/vendor/lessphp/tests/bootstrap.sh | 38 - .../tests/inputs/accessors.less.disable | 36 - .../vendor/lessphp/tests/inputs/arity.less | 77 - .../lessphp/tests/inputs/attributes.less | 41 - .../vendor/lessphp/tests/inputs/builtins.less | 73 - .../vendor/lessphp/tests/inputs/colors.less | 153 -- .../tests/inputs/compile_on_mixin.less | 39 - .../lessphp/tests/inputs/directives.less | 15 - .../vendor/lessphp/tests/inputs/escape.less | 20 - .../lessphp/tests/inputs/font_family.less | 28 - .../vendor/lessphp/tests/inputs/guards.less | 88 -- .../vendor/lessphp/tests/inputs/hacks.less | 6 - library/vendor/lessphp/tests/inputs/hi.less | 5 - library/vendor/lessphp/tests/inputs/ie.less | 12 - .../vendor/lessphp/tests/inputs/import.less | 56 - .../lessphp/tests/inputs/interpolation.less | 33 - .../lessphp/tests/inputs/keyframes.less | 52 - library/vendor/lessphp/tests/inputs/math.less | 121 -- .../vendor/lessphp/tests/inputs/media.less | 68 - library/vendor/lessphp/tests/inputs/misc.less | 93 -- .../lessphp/tests/inputs/mixin_functions.less | 40 - .../tests/inputs/mixin_merging.less.disable | 100 -- .../vendor/lessphp/tests/inputs/mixins.less | 159 -- .../vendor/lessphp/tests/inputs/nested.less | 60 - .../tests/inputs/pattern_matching.less | 167 --- .../vendor/lessphp/tests/inputs/scopes.less | 40 - .../tests/inputs/selector_expressions.less | 29 - .../lessphp/tests/inputs/site_demos.less | 120 -- .../lessphp/tests/inputs/test-imports/a.less | 6 - .../lessphp/tests/inputs/test-imports/b.less | 12 - .../tests/inputs/test-imports/file1.less | 16 - .../tests/inputs/test-imports/file2.less | 6 - .../tests/inputs/test-imports/file3.less | 7 - .../inputs/test-imports/inner/file1.less | 6 - .../inputs/test-imports/inner/file2.less | 4 - .../lessphp/tests/inputs/variables.less | 45 - .../lessphp/tests/outputs/accessors.css | 14 - .../vendor/lessphp/tests/outputs/arity.css | 25 - .../lessphp/tests/outputs/attributes.css | 105 -- .../vendor/lessphp/tests/outputs/builtins.css | 47 - .../vendor/lessphp/tests/outputs/colors.css | 102 -- .../tests/outputs/compile_on_mixin.css | 29 - .../lessphp/tests/outputs/directives.css | 15 - .../vendor/lessphp/tests/outputs/escape.css | 16 - .../lessphp/tests/outputs/font_family.css | 17 - .../vendor/lessphp/tests/outputs/guards.css | 27 - .../vendor/lessphp/tests/outputs/hacks.css | 4 - library/vendor/lessphp/tests/outputs/hi.css | 3 - library/vendor/lessphp/tests/outputs/ie.css | 9 - .../vendor/lessphp/tests/outputs/import.css | 61 - .../lessphp/tests/outputs/interpolation.css | 17 - .../lessphp/tests/outputs/keyframes.css | 48 - library/vendor/lessphp/tests/outputs/math.css | 69 - .../vendor/lessphp/tests/outputs/media.css | 70 - library/vendor/lessphp/tests/outputs/misc.css | 63 - .../lessphp/tests/outputs/mixin_functions.css | 14 - .../lessphp/tests/outputs/mixin_merging.css | 42 - .../vendor/lessphp/tests/outputs/mixins.css | 83 -- .../vendor/lessphp/tests/outputs/nested.css | 51 - .../vendor/lessphp/tests/outputs/nesting.css | 6 - .../tests/outputs/pattern_matching.css | 72 - .../vendor/lessphp/tests/outputs/scopes.css | 11 - .../tests/outputs/selector_expressions.css | 25 - .../lessphp/tests/outputs/site_demos.css | 76 - .../lessphp/tests/outputs/variables.css | 20 - library/vendor/lessphp/tests/sort.php | 57 - 75 files changed, 312 insertions(+), 5115 deletions(-) delete mode 100644 library/vendor/lessphp/README.md create mode 100644 library/vendor/lessphp/SOURCE delete mode 100644 library/vendor/lessphp/composer.json delete mode 100644 library/vendor/lessphp/docs/docs.md delete mode 100755 library/vendor/lessphp/plessc delete mode 100644 library/vendor/lessphp/tests/ApiTest.php delete mode 100644 library/vendor/lessphp/tests/InputTest.php delete mode 100644 library/vendor/lessphp/tests/README.md delete mode 100755 library/vendor/lessphp/tests/bootstrap.sh delete mode 100644 library/vendor/lessphp/tests/inputs/accessors.less.disable delete mode 100644 library/vendor/lessphp/tests/inputs/arity.less delete mode 100644 library/vendor/lessphp/tests/inputs/attributes.less delete mode 100644 library/vendor/lessphp/tests/inputs/builtins.less delete mode 100644 library/vendor/lessphp/tests/inputs/colors.less delete mode 100644 library/vendor/lessphp/tests/inputs/compile_on_mixin.less delete mode 100644 library/vendor/lessphp/tests/inputs/directives.less delete mode 100644 library/vendor/lessphp/tests/inputs/escape.less delete mode 100644 library/vendor/lessphp/tests/inputs/font_family.less delete mode 100644 library/vendor/lessphp/tests/inputs/guards.less delete mode 100644 library/vendor/lessphp/tests/inputs/hacks.less delete mode 100644 library/vendor/lessphp/tests/inputs/hi.less delete mode 100644 library/vendor/lessphp/tests/inputs/ie.less delete mode 100644 library/vendor/lessphp/tests/inputs/import.less delete mode 100644 library/vendor/lessphp/tests/inputs/interpolation.less delete mode 100644 library/vendor/lessphp/tests/inputs/keyframes.less delete mode 100644 library/vendor/lessphp/tests/inputs/math.less delete mode 100644 library/vendor/lessphp/tests/inputs/media.less delete mode 100644 library/vendor/lessphp/tests/inputs/misc.less delete mode 100644 library/vendor/lessphp/tests/inputs/mixin_functions.less delete mode 100644 library/vendor/lessphp/tests/inputs/mixin_merging.less.disable delete mode 100644 library/vendor/lessphp/tests/inputs/mixins.less delete mode 100644 library/vendor/lessphp/tests/inputs/nested.less delete mode 100644 library/vendor/lessphp/tests/inputs/pattern_matching.less delete mode 100644 library/vendor/lessphp/tests/inputs/scopes.less delete mode 100644 library/vendor/lessphp/tests/inputs/selector_expressions.less delete mode 100644 library/vendor/lessphp/tests/inputs/site_demos.less delete mode 100644 library/vendor/lessphp/tests/inputs/test-imports/a.less delete mode 100644 library/vendor/lessphp/tests/inputs/test-imports/b.less delete mode 100644 library/vendor/lessphp/tests/inputs/test-imports/file1.less delete mode 100644 library/vendor/lessphp/tests/inputs/test-imports/file2.less delete mode 100644 library/vendor/lessphp/tests/inputs/test-imports/file3.less delete mode 100644 library/vendor/lessphp/tests/inputs/test-imports/inner/file1.less delete mode 100644 library/vendor/lessphp/tests/inputs/test-imports/inner/file2.less delete mode 100644 library/vendor/lessphp/tests/inputs/variables.less delete mode 100644 library/vendor/lessphp/tests/outputs/accessors.css delete mode 100644 library/vendor/lessphp/tests/outputs/arity.css delete mode 100644 library/vendor/lessphp/tests/outputs/attributes.css delete mode 100644 library/vendor/lessphp/tests/outputs/builtins.css delete mode 100644 library/vendor/lessphp/tests/outputs/colors.css delete mode 100644 library/vendor/lessphp/tests/outputs/compile_on_mixin.css delete mode 100644 library/vendor/lessphp/tests/outputs/directives.css delete mode 100644 library/vendor/lessphp/tests/outputs/escape.css delete mode 100644 library/vendor/lessphp/tests/outputs/font_family.css delete mode 100644 library/vendor/lessphp/tests/outputs/guards.css delete mode 100644 library/vendor/lessphp/tests/outputs/hacks.css delete mode 100644 library/vendor/lessphp/tests/outputs/hi.css delete mode 100644 library/vendor/lessphp/tests/outputs/ie.css delete mode 100644 library/vendor/lessphp/tests/outputs/import.css delete mode 100644 library/vendor/lessphp/tests/outputs/interpolation.css delete mode 100644 library/vendor/lessphp/tests/outputs/keyframes.css delete mode 100644 library/vendor/lessphp/tests/outputs/math.css delete mode 100644 library/vendor/lessphp/tests/outputs/media.css delete mode 100644 library/vendor/lessphp/tests/outputs/misc.css delete mode 100644 library/vendor/lessphp/tests/outputs/mixin_functions.css delete mode 100644 library/vendor/lessphp/tests/outputs/mixin_merging.css delete mode 100644 library/vendor/lessphp/tests/outputs/mixins.css delete mode 100644 library/vendor/lessphp/tests/outputs/nested.css delete mode 100644 library/vendor/lessphp/tests/outputs/nesting.css delete mode 100644 library/vendor/lessphp/tests/outputs/pattern_matching.css delete mode 100644 library/vendor/lessphp/tests/outputs/scopes.css delete mode 100644 library/vendor/lessphp/tests/outputs/selector_expressions.css delete mode 100644 library/vendor/lessphp/tests/outputs/site_demos.css delete mode 100644 library/vendor/lessphp/tests/outputs/variables.css delete mode 100644 library/vendor/lessphp/tests/sort.php diff --git a/library/vendor/lessphp/README.md b/library/vendor/lessphp/README.md deleted file mode 100644 index 0085e19d9..000000000 --- a/library/vendor/lessphp/README.md +++ /dev/null @@ -1,96 +0,0 @@ -# lessphp v0.3.9 -### - -[![Build Status](https://secure.travis-ci.org/leafo/lessphp.png)](http://travis-ci.org/leafo/lessphp) - -`lessphp` is a compiler for LESS written in PHP. The documentation is great, -so check it out: . - -Here's a quick tutorial: - -### How to use in your PHP project - -The only file required is `lessc.inc.php`, so copy that to your include directory. - -The typical flow of **lessphp** is to create a new instance of `lessc`, -configure it how you like, then tell it to compile something using one built in -compile methods. - -The `compile` method compiles a string of LESS code to CSS. - -```php -compile(".block { padding: 3 + 4px }"); -``` - -The `compileFile` method reads and compiles a file. It will either return the -result or write it to the path specified by an optional second argument. - -```php -compileFile("input.less"); -``` - -The `compileChecked` method is like `compileFile`, but it only compiles if the output -file doesn't exist or it's older than the input file: - -```php -checkedCompile("input.less", "output.css"); -``` - -If there any problem compiling your code, an exception is thrown with a helpful message: - -```php -compile("invalid LESS } {"); -} catch (exception $e) { - echo "fatal error: " . $e->getMessage(); -} -``` - -The `lessc` object can be configured through an assortment of instance methods. -Some possible configuration options include [changing the output format][1], -[setting variables from PHP][2], and [controlling the preservation of -comments][3], writing [custom functions][4] and much more. It's all described -in [the documentation][0]. - - - [0]: http://leafo.net/lessphp/docs/ - [1]: http://leafo.net/lessphp/docs/#output_formatting - [2]: http://leafo.net/lessphp/docs/#setting_variables_from_php - [3]: http://leafo.net/lessphp/docs/#preserving_comments - [4]: http://leafo.net/lessphp/docs/#custom_functions - - -### How to use from the command line - -An additional script has been included to use the compiler from the command -line. In the simplest invocation, you specify an input file and the compiled -css is written to standard out: - - $ plessc input.less > output.css - -Using the -r flag, you can specify LESS code directly as an argument or, if -the argument is left off, from standard in: - - $ plessc -r "my less code here" - -Finally, by using the -w flag you can watch a specified input file and have it -compile as needed to the output file: - - $ plessc -w input-file output-file - -Errors from watch mode are written to standard out. - -The -f flag sets the [output formatter][1]. For example, to compress the -output run this: - - $ plessc -f=compressed myfile.less - -For more help, run `plessc --help` - diff --git a/library/vendor/lessphp/SOURCE b/library/vendor/lessphp/SOURCE new file mode 100644 index 000000000..3d4ddd72c --- /dev/null +++ b/library/vendor/lessphp/SOURCE @@ -0,0 +1,2 @@ +http://leafo.net/lessphp/src/lessphp-0.4.0.tar.gz +tar xfz lessphp-0.4.0.tar.gz lessphp/lessc.inc.php lessphp/LICENSE diff --git a/library/vendor/lessphp/composer.json b/library/vendor/lessphp/composer.json deleted file mode 100644 index 2b525a57c..000000000 --- a/library/vendor/lessphp/composer.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "leafo/lessphp", - "type": "library", - "description": "lessphp is a compiler for LESS written in PHP.", - "homepage": "http://leafo.net/lessphp/", - "license": [ - "MIT", - "GPL-3.0" - ], - "authors": [ - { - "name": "Leaf Corcoran", - "email": "leafot@gmail.com", - "homepage": "http://leafo.net" - } - ], - "autoload": { - "classmap": ["lessc.inc.php"] - }, - "extra": { - "branch-alias": { - "dev-master": "0.3-dev" - } - } -} diff --git a/library/vendor/lessphp/docs/docs.md b/library/vendor/lessphp/docs/docs.md deleted file mode 100644 index ce3a331f7..000000000 --- a/library/vendor/lessphp/docs/docs.md +++ /dev/null @@ -1,1294 +0,0 @@ - title: v0.3.9 documentation - link_to_home: true --- - -

Documentation v0.3.9

- -
$index
- -**lessphp** is a compiler that generates CSS from a superset language which -adds a collection of convenient features often seen in other languages. All CSS -is compatible with LESS, so you can start using new features with your existing CSS. - -It is designed to be compatible with [less.js](http://lesscss.org), and suitable -as a drop in replacement for PHP projects. - -## Getting Started - -The homepage for **lessphp** can be found at [http://leafo.net/lessphp/][1]. - -You can follow development at the project's [GitHub][2]. - -Including **lessphp** in your project is as simple as dropping the single -include file into your code base and running the appropriate compile method as -described in the [PHP Interface](#php_interface). - - [1]: http://leafo.net/lessphp "lessphp homepage" - [2]: https://github.com/leafo/lessphp "lessphp GitHub page" - -## Installation - -**lessphp** is distributed entirely in a single stand-alone file. Download the -latest version from either [the homepage][1] or [GitHub][2]. - -Development versions can also be downloading from GitHub. - -Place `lessphp.inc.php` in a location available to your PHP scripts, and -include it. That's it! you're ready to begin. - -## The Language - -**lessphp** is very easy to learn because it generally functions how you would -expect it to. If you feel something is challenging or missing, feel free to -open an issue on the [bug tracker](https://github.com/leafo/lessphp/issues). - -It is also easy to learn because any standards-compliant CSS code is valid LESS -code. You are free to gradually enhance your existing CSS code base with LESS -features without having to worry about rewriting anything. - -The following is a description of the new languages features provided by LESS. - -### Line Comments - -Simple but very useful; line comments are started with `//`: - - ```less - // this is a comment - body { - color: red; // as is this - /* block comments still work also */ - } - ``` - -### Variables -Variables are identified with a name that starts with `@`. To declare a -variable, you create an appropriately named CSS property and assign it a value: - - ```less - @family: "verdana"; - @color: red; - body { - @mycolor: red; - font-family: @family; - color: @color; - border-bottom: 1px solid @color; - } - ``` - -Variable declarations will not appear in the output. Variables can be declared -in the outer most scope of the file, or anywhere else a CSS property may -appear. They can hold any CSS property value. - -Variables are only visible for use from their current scope, or any enclosed -scopes. - -If you have a string or keyword in a variable, you can reference another -variable by that name by repeating the `@`: - - ```less - @value: 20px; - @value_name: "value"; - - width: @@value_name; - ``` - -### Expressions - -Expressions let you combine values and variables in meaningful ways. For -example you can add to a color to make it a different shade. Or divide up the -width of your layout logically. You can even concatenate strings. - -Use the mathematical operators to evaluate an expression: - - ```less - @width: 960px; - .nav { - width: @width / 3; - color: #001 + #abc; - } - .body { - width: 2 * @width / 3; - font-family: "hel" + "vetica"; - } - ``` - -Parentheses can be used to control the order of evaluation. They can also be -used to force an evaluation for cases where CSS's syntax makes the expression -ambiguous. - -The following property will produce two numbers, instead of doing the -subtraction: - - ```less - margin: 10px -5px; - ``` - -To force the subtraction: - - ```less - margin: (10px -5px); - ``` - -It is also safe to surround mathematical operators by spaces to ensure that -they are evaluated: - - ```less - margin: 10px - 5px; - ``` - -Division has a special quirk. There are certain CSS properties that use the `/` -operator as part of their value's syntax. Namely, the [font][4] shorthand and -[border-radius][3]. - - [3]: https://developer.mozilla.org/en/CSS/border-radius - [4]: https://developer.mozilla.org/en/CSS/font - - -Thus, **lessphp** will ignore any division in these properties unless it is -wrapped in parentheses. For example, no division will take place here: - - ```less - .font { - font: 20px/80px "Times New Roman"; - } - ``` - -In order to force division we must wrap the expression in parentheses: - - ```less - .font { - font: (20px/80px) "Times New Roman"; - } - ``` - -If you want to write a literal `/` expression without dividing in another -property (or a variable), you can use [string unquoting](#string_unquoting): - - ```less - .var { - @size: ~"20px/80px"; - font: @size sans-serif; - } - ``` - -### Nested Blocks - -By nesting blocks we can build up a chain of CSS selectors through scope -instead of repeating them. In addition to reducing repetition, this also helps -logically organize the structure of our CSS. - - ```less - ol.list { - li.special { - border: 1px solid red; - } - - li.plain { - font-weight: bold; - } - } - ``` - - -This will produce two blocks, a `ol.list li.special` and `ol.list li.plain`. - -Blocks can be nested as deep as required in order to build a hierarchy of -relationships. - -The `&` operator can be used in a selector to represent its parent's selector. -If the `&` operator is used, then the default action of appending the parent to -the front of the child selector separated by space is not performed. - - ```less - b { - a & { - color: red; - } - - // the following have the same effect - - & i { - color: blue; - } - - i { - color: blue; - } - } - ``` - - -Because the `&` operator respects the whitespace around it, we can use it to -control how the child blocks are joined. Consider the differences between the -following: - - ```less - div { - .child-class { color: purple; } - - &.isa-class { color: green; } - - #child-id { height: 200px; } - - &#div-id { height: 400px; } - - &:hover { color: red; } - - :link { color: blue; } - } - ``` - -The `&` operator also works with [mixins](#mixins), which produces interesting results: - - ```less - .within_box_style() { - .box & { - color: blue; - } - } - - #menu { - .within_box_style; - } - ``` - -### Mixins - -Any block can be mixed in just by naming it: - - ```less - .mymixin { - color: blue; - border: 1px solid red; - - .special { - font-weight: bold; - } - } - - - h1 { - font-size: 200px; - .mixin; - } - ``` - -All properties and child blocks are mixed in. - -Mixins can be made parametric, meaning they can take arguments, in order to -enhance their utility. A parametric mixin all by itself is not outputted when -compiled. Its properties will only appear when mixed into another block. - -The canonical example is to create a rounded corners mixin that works across -browsers: - - ```less - .rounded-corners(@radius: 5px) { - border-radius: @radius; - -webkit-border-radius: @radius; - -moz-border-radius: @radius; - } - - .header { - .rounded-corners(); - } - - .info { - background: red; - .rounded-corners(14px); - } - ``` - -If you have a mixin that doesn't have any arguments, but you don't want it to -show up in the output, give it a blank argument list: - - ```less - .secret() { - font-size: 6000px; - } - - .div { - .secret; - } - ``` - -If the mixin doesn't need any arguments, you can leave off the parentheses when -mixing it in, as seen above. - -You can also mixin a block that is nested inside other blocks. You can think of -the outer block as a way of making a scope for your mixins. You just list the -names of the mixins separated by spaces, which describes the path to the mixin -you want to include. Optionally you can separate them by `>`. - - ```less - .my_scope { - .some_color { - color: red; - .inner_block { - text-decoration: underline; - } - } - .bold { - font-weight: bold; - color: blue; - } - } - - .a_block { - .my_scope .some_color; - .my_scope .some_color .inner_block; - } - - .another_block { - // the alternative syntax - .my_scope > .bold; - } - ``` - -#### `@arguments` Variable - -Within an mixin there is a special variable named `@arguments` that contains -all the arguments passed to the mixin along with any remaining arguments that -have default values. The value of the variable has all the values separated by -spaces. - -This useful for quickly assigning all the arguments: - - ```less - .box-shadow(@x, @y, @blur, @color) { - box-shadow: @arguments; - -webkit-box-shadow: @arguments; - -moz-box-shadow: @arguments; - } - .menu { - .box-shadow(1px, 1px, 5px, #aaa); - } - ``` - -In addition to the arguments passed to the mixin, `@arguments` will also include -remaining default values assigned by the mixin: - - - ```less - .border-mixin(@width, @style: solid, @color: black) { - border: @arguments; - } - - pre { - .border-mixin(4px, dotted); - } - - ``` - - -#### Pattern Matching - -When you *mix in* a mixin, all the available mixins of that name in the current -scope are checked to see if they match based on what was passed to the mixin -and how it was declared. - -The simplest case is matching by number of arguments. Only the mixins that -match the number of arguments passed in are used. - - ```less - .simple() { // matches no arguments - height: 10px; - } - - .simple(@a, @b) { // matches two arguments - color: red; - } - - .simple(@a) { // matches one argument - color: blue; - } - - div { - .simple(10); - } - - span { - .simple(10, 20); - } - ``` - -Whether an argument has default values is also taken into account when matching -based on number of arguments: - - ```less - // matches one or two arguments - .hello(@a, @b: blue) { - height: @a; - color: @b; - } - - .hello(@a, @b) { // matches only two - width: @a; - border-color: @b; - } - - .hello(@a) { // matches only one - padding: 1em; - } - - div { - .hello(10px); - } - - pre { - .hello(10px, yellow); - } - ``` - -Additionally, a *vararg* value can be used to further control how things are -matched. A mixin's argument list can optionally end in the special argument -named `...`. The `...` may match any number of arguments, including 0. - - ```less - // this will match any number of arguments - .first(...) { - color: blue; - } - - // matches at least 1 argument - .second(@arg, ...) { - height: 200px + @arg; - } - - div { .first("some", "args"); } - pre { .second(10px); } - ``` - -If you want to capture the values that get captured by the *vararg* you can -give it a variable name by putting it directly before the `...`. This variable -must be the last argument defined. It's value is just like the special -[`@arguments` variable](#arguments_variable), a space separated list. - - - ```less - .hello(@first, @rest...) { - color: @first; - text-shadow: @rest; - } - - span { - .hello(red, 1px, 1px, 0px, white); - } - - ``` - -Another way of controlling whether a mixin matches is by specifying a value in -place of an argument name when declaring the mixin: - - ```less - .style(old, @size) { - font: @size serif; - } - - .style(new, @size) { - font: @size sans-serif; - } - - .style(@_, @size) { - letter-spacing: floor(@size / 6px); - } - - em { - @switch: old; - .style(@switch, 15px); - } - ``` - -Notice that two of the three mixins were matched. The mixin with a matching -first argument, and the generic mixin that matches two arguments. It's common -to use `@_` as the name of a variable we intend to not use. It has no special -meaning to LESS, just to the reader of the code. - -#### Guards - -Another way of restricting when a mixin is mixed in is by using guards. A guard -is a special expression that is associated with a mixin declaration that is -evaluated during the mixin process. It must evaluate to true before the mixin -can be used. - -We use the `when` keyword to begin describing a list of guard expressions. - -Here's a simple example: - - ```less - .guarded(@arg) when (@arg = hello) { - color: blue; - } - - div { - .guarded(hello); // match - } - - span { - .guarded(world); // no match - } - ``` -Only the `div`'s mixin will match in this case, because the guard expression -requires that `@arg` is equal to `hello`. - -We can include many different guard expressions by separating them by commas. -Only one of them needs to match to trigger the mixin: - - ```less - .x(@a, @b) when (@a = hello), (@b = world) { - width: 960px; - } - - div { - .x(hello, bar); // match - } - - span { - .x(foo, world); // match - } - - pre { - .x(foo, bar); // no match - } - ``` - -Instead of a comma, we can use `and` keyword to make it so all of the guards -must match in order to trigger the mixin. `and` has higher precedence than the -comma. - - ```less - .y(@a, @b) when (@a = hello) and (@b = world) { - height: 600px; - } - - div { - .y(hello, world); // match - } - - span { - .y(hello, bar); // no match - } - ``` - -Commas and `and`s can be mixed and matched. - -You can also negate a guard expression by using `not` in from of the parentheses: - - ```less - .x(@a) when not (@a = hello) { - color: blue; - } - - div { - .x(hello); // no match - } - ``` - -The `=` operator is used to check equality between any two values. For numbers -the following comparison operators are also defined: - -`<`, `>`, `=<`, `>=` - -There is also a collection of predicate functions that can be used to test the -type of a value. - -These are `isnumber`, `iscolor`, `iskeyword`, `isstring`, `ispixel`, -`ispercentage` and `isem`. - - ```less - .mix(@a) when (ispercentage(@a)) { - height: 500px * @a; - } - .mix(@a) when (ispixel(@a)) { - height: @a; - } - - div.a { - .mix(50%); - } - - div.a { - .mix(350px); - } - ``` - -#### !important - -If you want to apply the `!important` suffix to every property when mixing in a -mixin, just append `!important` to the end of the call to the mixin: - - ```less - .make_bright { - color: red; - font-weight: bold; - } - - .color { - color: green; - } - - body { - .make_bright() !important; - .color(); - } - - ``` - -### Selector Expressions - -Sometimes we want to dynamically generate the selector of a block based on some -variable or expression. We can do this by using *selector expressions*. Selector -expressions are CSS selectors that are evaluated in the current scope before -being written out. - -A simple example is a mixin that dynamically creates a selector named after the -mixin's argument: - - ```less - .create-selector(@name) { - (e(@name)) { - color: red; - } - } - - .create-selector("hello"); - .create-selector("world"); - ``` - -Any selector that is enclosed in `()` will have it's contents evaluated and -directly written to output. The value is not changed any way before being -outputted, thats why we use the `e` function. If you're not familiar, the `e` -function strips quotes off a string value. If we didn't have it, then the -selector would have quotes around it, and that's not valid CSS! - -Any value can be used in a selector expression, but it works best when using -strings and things like [String Interpolation](#string_interpolation). - -Here's an interesting example adapted from Twitter Bootstrap. A couple advanced -things are going on. We are using [Guards](#guards) along with a recursive -mixin to work like a loop to generate a series of CSS blocks. - - - ```less - // create our recursive mixin: - .spanX (@index) when (@index > 0) { - (~".span@{index}") { - width: @index * 100px; - } - .spanX(@index - 1); - } - .spanX (0) {} - - // mix it into the global scopee: - .spanX(4); - ``` - -### Import - -Multiple LESS files can be compiled into a single CSS file by using the -`@import` statement. Be careful, the LESS import statement shares syntax with -the CSS import statement. If the file being imported ends in a `.less` -extension, or no extension, then it is treated as a LESS import. Otherwise it -is left alone and outputted directly: - - ```less - // my_file.less - .some-mixin(@height) { - height: @height; - } - - // main.less - @import "main.less" // will import the file if it can be found - @import "main.css" // will be left alone - - body { - .some-mixin(400px); - } - ``` - -All of the following lines are valid ways to import the same file: - - ```less - @import "file"; - @import 'file.less'; - @import url("file"); - @import url('file'); - @import url(file); - ``` - -When importing, the `importDir` is searched for files. This can be configured, -see [PHP Interface](#php_interface). - -### String Interpolation - -String interpolation is a convenient way to insert the value of a variable -right into a string literal. Given some variable named `@var_name`, you just -need to write it as `@{var_name}` from within the string to have its value -inserted: - - ```less - @symbol: ">"; - h1:before { - content: "@{symbol}: "; - } - - h2:before { - content: "@{symbol}@{symbol}: "; - } - ``` - -There are two kinds of strings, implicit and explicit strings. Explicit strings -are wrapped by double quotes, `"hello I am a string"`, or single quotes `'I am -another string'`. Implicit strings only appear when using `url()`. The text -between the parentheses is considered a string and thus string interpolation is -possible: - - ```less - @path: "files/"; - body { - background: url(@{path}my_background.png); - } - ``` - -### String Format Function - -The `%` function can be used to insert values into strings using a *format -string*. It works similar to `printf` seen in other languages. It has the -same purpose as string interpolation above, but gives explicit control over -the output format. - - ```less - @symbol: ">"; - h1:before { - content: %("%s: ", @symbol); - } - ``` - -The `%` function takes as its first argument the format string, following any -number of addition arguments that are inserted in place of the format -directives. - -A format directive starts with a `%` and is followed by a single character that -is either `a`, `d`, or `s`: - - ```less - strings: %("%a %d %s %a", hi, 1, 'ok', 'cool'); - ``` - -`%a` and `%d` format the value the same way: they compile the argument to its -CSS value and insert it directly. When used with a string, the quotes are -included in the output. This typically isn't what we want, so we have the `%s` -format directive which strips quotes from strings before inserting them. - -The `%d` directive functions the same as `%a`, but is typically used for numbers -assuming the output format of numbers might change in the future. - -### String Unquoting - -Sometimes you will need to write proprietary CSS syntax that is unable to be -parsed. As a workaround you can place the code into a string and unquote it. -Unquoting is the process of outputting a string without its surrounding quotes. -There are two ways to unquote a string. - -The `~` operator in front of a string will unquote that string: - - ```less - .class { - // a made up, but problematic vendor specific CSS - filter: ~"Microsoft.AlphaImage(src='image.png')"; - } - ``` - -If you are working with other types, such as variables, there is a built in -function that let's you unquote any value. It is called `e`. - - ```less - @color: "red"; - .class { - color: e(@color); - } - ``` - -### Built In Functions - -**lessphp** has a collection of built in functions: - -* `e(str)` -- returns a string without the surrounding quotes. - See [String Unquoting](#string_unquoting) - -* `floor(number)` -- returns the floor of a numerical input -* `round(number)` -- returns the rounded value of numerical input - -* `lighten(color, percent)` -- lightens `color` by `percent` and returns it -* `darken(color, percent)` -- darkens `color` by `percent` and returns it - -* `saturate(color, percent)` -- saturates `color` by `percent` and returns it -* `desaturate(color, percent)` -- desaturates `color` by `percent` and returns it - -* `fadein(color, percent)` -- makes `color` less transparent by `percent` and returns it -* `fadeout(color, percent)` -- makes `color` more transparent by `percent` and returns it - -* `spin(color, amount)` -- returns a color with `amount` degrees added to hue - -* `fade(color, amount)` -- returns a color with the alpha set to `amount` - -* `hue(color)` -- returns the hue of `color` - -* `saturation(color)` -- returns the saturation of `color` - -* `lightness(color)` -- returns the lightness of `color` - -* `alpha(color)` -- returns the alpha value of `color` or 1.0 if it doesn't have an alpha - -* `percentage(number)` -- converts a floating point number to a percentage, e.g. `0.65` -> `65%` - -* `mix(color1, color1, percent)` -- mixes two colors by percentage where 100% - keeps all of `color1`, and 0% keeps all of `color2`. Will take into account - the alpha of the colors if it exists. See - . - -* `constrast(color, dark, light)` -- if `color` has a lightness value greater - than 50% then `dark` is returned, otherwise return `light`. - -* `rgbahex(color)` -- returns a string containing 4 part hex color. - - This is used to convert a CSS color into the hex format that IE's filter - method expects when working with an alpha component. - - ```less - .class { - @start: rgbahex(rgba(25, 34, 23, .5)); - @end: rgbahex(rgba(85, 74, 103, .6)); - // abridged example - -ms-filter: - e("gradient(start=@{start},end=@{end})"); - } - ``` - -## PHP Interface - -When working with **lessphp** from PHP, the typical flow is to create a new -instance of `lessc`, configure it how you like, then tell it to compile -something using one built in compile methods. - -Methods: - -* [`compile($string)`](#compiling[) -- Compile a string - -* [`compileFile($inFile, [$outFile])`](#compiling) -- Compile a file to another or return it - -* [`checkedCompile($inFile, $outFile)`](#compiling) -- Compile a file only if it's newer - -* [`cachedCompile($cacheOrFile, [$force])`](#compiling_automatically) -- Conditionally compile while tracking imports - -* [`setFormatter($formatterName)`](#output_formatting) -- Change how CSS output looks - -* [`setPreserveComments($keepComments)`](#preserving_comments) -- Change if comments are kept in output - -* [`registerFunction($name, $callable)`](#custom_functions) -- Add a custom function - -* [`unregisterFunction($name)`](#custom_functions) -- Remove a registered function - -* [`setVariables($vars)`](#setting_variables_from_php) -- Set a variable from PHP - -* [`unsetVariable($name)`](#setting_variables_from_php) -- Remove a PHP variable - -* [`setImportDir($dirs)`](#import_directory) -- Set the search path for imports - -* [`addImportDir($dir)`](#import_directory) -- Append directory to search path for imports - - -### Compiling - -The `compile` method compiles a string of LESS code to CSS. - - ```php - compile(".block { padding: 3 + 4px }"); - ``` - -The `compileFile` method reads and compiles a file. It will either return the -result or write it to the path specified by an optional second argument. - - ```php - echo $less->compileFile("input.less"); - ``` - -The `compileChecked` method is like `compileFile`, but it only compiles if the output -file doesn't exist or it's older than the input file: - - ```php - $less->checkedCompile("input.less", "output.css"); - ``` - -See [Compiling Automatically](#compiling_automatically) for a description of -the more advanced `cachedCompile` method. - -### Output Formatting - -Output formatting controls the indentation of the output CSS. Besides the -default formatter, two additional ones are included and it's also easy to make -your own. - -To use a formatter, the method `setFormatter` is used. Just -pass the name of the formatter: - - ```php - $less = new lessc; - - $less->setFormatter("compressed"); - echo $less->compile("div { color: lighten(blue, 10%) }"); - ``` - -In this example, the `compressed` formatter is used. The formatters are: - - * `lessjs` *(default)* -- Same style used in LESS for JavaScript - - * `compressed` -- Compresses all the unrequired whitespace - - * `classic` -- **lessphp**'s original formatter - -To revert to the default formatter, call `setFormatter` with a value of `null`. - -#### Custom Formatter - -The easiest way to customize the formatter is to create your own instance of an -existing formatter and alter its public properties before passing it off to -**lessphp**. The `setFormatter` method can also take an instance of a -formatter. - -Each of the formatter names corresponds to a class with `lessc_formatter_` -prepended in front of it. Here the classic formatter is customized to use tabs -instead of spaces: - - - ```php - $formatter = new lessc_formatter_classic; - $formatter->indentChar = "\t"; - - $less = new lessc; - $less->setFormatter($formatter); - echo $less->compileFile("myfile.less"); - ``` - -For more information about what can be configured with the formatter consult -the source code. - -### Preserving Comments - -By default, all comments in the source LESS file are stripped when compiling. -You might want to keep the `/* */` comments in the output though. For -example, bundling a license in the file. - -Enable or disable comment preservation by calling `setPreserveComments`: - - ```php - $less = new lessc; - $less->setPreserveComments(true); - echo $less->compile("/* hello! */"); - ``` - -Comments are disabled by default because there is additional overhead, and more -often than not they aren't needed. - - -### Compiling Automatically - -Often, you want to only compile a LESS file only if it has been modified since -last compile. This is very important because compiling is performance intensive -and you should avoid a recompile if it possible. - -The `checkedCompile` compile method will do just that. It will check if the -input file is newer than the output file, or if the output file doesn't exist -yet, and compile only then. - - ```php - $less->checkedCompile("input.less", "output.css"); - ``` - -There's a problem though. `checkedCompile` is very basic, it only checks the -input file's modification time. It is unaware of any files from `@import`. - - -For this reason we also have `cachedCompile`. It's slightly more complex, but -gives us the ability to check changes to all files including those imported. It -takes one argument, either the name of the file we want to compile, or an -existing *cache object*. Its return value is an updated cache object. - -If we don't have a cache object, then we call the function with the name of the -file to get the initial cache object. If we do have a cache object, then we -call the function with it. In both cases, an updated cache object is returned. - -The cache object keeps track of all the files that must be checked in order to -determine if a rebuild is required. - -The cache object is a plain PHP `array`. It stores the last time it compiled in -`$cache["updated"]` and output of the compile in `$cache["compiled"]`. - -Here we demonstrate creating an new cache object, then using it to see if we -have a recompiled version available to be written: - - - ```php - $inputFile = "myfile.less"; - $outputFile = "myfile.css"; - - $less = new lessc; - - // create a new cache object, and compile - $cache = $less->cachedCompile($inputFile); - - file_put_contents($outputFile, $cache["compiled"]); - - // the next time we run, write only if it has updated - $last_updated = $cache["updated"]; - $cache = $less->cachedCompile($cache); - if ($cache["updated"] > $last_updated) { - file_put_contents($outputFile, $cache["compiled"]); - } - - ``` - -In order for the system to fully work, we must save cache object between -requests. Because it's a plain PHP `array`, it's sufficient to -[`serialize`](http://php.net/serialize) it and save it the string somewhere -like a file or in persistent memory. - -An example with saving cache object to a file: - - ```php - function autoCompileLess($inputFile, $outputFile) { - // load the cache - $cacheFile = $inputFile.".cache"; - - if (file_exists($cacheFile)) { - $cache = unserialize(file_get_contents($cacheFile)); - } else { - $cache = $inputFile; - } - - $less = new lessc; - $newCache = $less->cachedCompile($cache); - - if (!is_array($cache) || $newCache["updated"] > $cache["updated"]) { - file_put_contents($cacheFile, serialize($newCache)); - file_put_contents($outputFile, $newCache['compiled']); - } - } - - autoCompileLess('myfile.less', 'myfile.css'); - ``` - -`cachedCompile` method takes an optional second argument, `$force`. Passing in -true will cause the input to always be recompiled. - -### Error Handling - -All of the compile methods will throw an `Exception` if the parsing fails or -there is a compile time error. Compile time errors include things like passing -incorrectly typed values for functions that expect specific things, like the -color manipulation functions. - - ```php - $less = new lessc; - try { - $less->compile("} invalid LESS }}}"); - } catch (Exception $ex) { - echo "lessphp fatal error: ".$ex->getMessage(); - } - ``` -### Setting Variables From PHP - -Before compiling any code you can set initial LESS variables from PHP. The -`setVariables` method lets us do this. It takes an associative array of names -to values. The values must be strings, and will be parsed into correct CSS -values. - - - ```php - $less = new lessc; - - $less->setVariables(array( - "color" => "red", - "base" => "960px" - )); - - echo $less->compile(".magic { color: @color; width: @base - 200; }"); - ``` - -If you need to unset a variable, the `unsetVariable` method is available. It -takes the name of the variable to unset. - - ```php - $less->unsetVariable("color"); - ``` - -Be aware that the value of the variable is a string containing a CSS value. So -if you want to pass a LESS string in, you're going to need two sets of quotes. -One for PHP and one for LESS. - - - ```php - $less->setVariables(array( - "url" => "'http://example.com.com/'" - )); - - echo $less->compile("body { background: url("@{url}/bg.png"); }"); - ``` - -### Import Directory - -When running the `@import` directive, an array of directories called the import -search path is searched through to find the file being asked for. - -By default, when using `compile`, the import search path just contains `""`, -which is equivalent to the current directory of the script. If `compileFile` is -used, then the directory of the file being compiled is used as the starting -import search path. - -Two methods are available for configuring the search path. - -`setImportDir` will overwrite the search path with its argument. If the value -isn't an array it will be converted to one. - - -In this example, `@import "colors";` will look for either -`assets/less/colors.less` or `assets/bootstrap/colors.less` in that order: - - ```php - $less->setImportDir(array("assets/less/", "assets/bootstrap"); - - echo $less->compile('@import "colors";'); - ``` - -`addImportDir` will append a single path to the import search path instead of -overwritting the whole thing. - - ```php - $less->addImportDir("public/stylesheets"); - ``` - -### Custom Functions - -**lessphp** has a simple extension interface where you can implement user -functions that will be exposed in LESS code during the compile. They can be a -little tricky though because you need to work with the **lessphp** type system. - -The two methods we are interested in are `registerFunction` and -`unregisterFunction`. `registerFunction` takes two arguments, a name and a -callable value. `unregisterFunction` just takes the name of an existing -function to remove. - -Here's an example that adds a function called `double` that doubles any numeric -argument: - - ```php - registerFunction("double", "lessphp_double"); - - // gives us a width of 800px - echo $less->compile("div { width: double(400px); }"); - ``` - -The second argument to `registerFunction` is any *callable value* that is -understood by [`call_user_func`](http://php.net/call_user_func). - -If we are using PHP 5.3 or above then we are free to pass a function literal -like so: - - ```php - $less->registerFunction("double", function($arg) { - list($type, $value, $unit) = $arg; - return array($type, $value*2, $unit); - }); - ``` - -Now let's talk about the `double` function itself. - -Although a little verbose, the implementation gives us some insight on the type -system. All values in **lessphp** are stored in an array where the 0th element -is a string representing the type, and the other elements make up the -associated data for that value. - -The best way to get an understanding of the system is to register is dummy -function which does a `var_dump` on the argument. Try passing the function -different values from LESS and see what the results are. - -The return value of the registered function must also be a **lessphp** type, -but if it is a string or numeric value, it will automatically be coerced into -an appropriate typed value. In our example, we reconstruct the value with our -modifications while making sure that we preserve the original type. - -The instance of **lessphp** itself is sent to the registered function as the -second argument in addition to the arguments array. - -## Command Line Interface - -**lessphp** comes with a command line script written in PHP that can be used to -invoke the compiler from the terminal. On Linux an OSX, all you need to do is -place `plessc` and `lessc.inc.php` somewhere in your PATH (or you can run it in -the current directory as well). On windows you'll need a copy of `php.exe` to -run the file. To compile a file, `input.less` to CSS, run: - - ```bash - $ plessc input.less - ``` - -To write to a file, redirect standard out: - - ```bash - $ plessc input.less > output.css - ``` - -To compile code directly on the command line: - - ```bash - $ plessc -r "@color: red; body { color: @color; }" - ``` - -To watch a file for changes, and compile it as needed, use the `-w` flag: - - ```bash - $ plessc -w input-file output-file - ``` - -Errors from watch mode are written to standard out. - - -## License - -Copyright (c) 2012 Leaf Corcoran, - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -*Also under GPL3 if required, see `LICENSE` file* - diff --git a/library/vendor/lessphp/lessc.inc.php b/library/vendor/lessphp/lessc.inc.php index 411ca2fab..0699de52f 100644 --- a/library/vendor/lessphp/lessc.inc.php +++ b/library/vendor/lessphp/lessc.inc.php @@ -1,7 +1,7 @@ findImport($url); + if ($realPath === null) return false; if ($this->importDisabled) { return array(false, "/* import disabled */"); } + if (isset($this->allParsedFiles[realpath($realPath)])) { + return array(false, null); + } + $this->addParsedFile($realPath); $parser = $this->makeParser($realPath); $root = $parser->parse(file_get_contents($realPath)); @@ -276,6 +283,8 @@ class lessc { foreach ($this->sortProps($block->props) as $prop) { $this->compileProp($prop, $block, $out); } + + $out->lines = array_values(array_unique($out->lines)); } protected function sortProps($props, $split = false) { @@ -450,7 +459,7 @@ class lessc { return $left == $right; } - protected function patternMatch($block, $callingArgs) { + protected function patternMatch($block, $orderedArgs, $keywordArgs) { // match the guards if it has them // any one of the groups must have all its guards pass for a match if (!empty($block->guards)) { @@ -458,7 +467,7 @@ class lessc { foreach ($block->guards as $guardGroup) { foreach ($guardGroup as $guard) { $this->pushEnv(); - $this->zipSetArgs($block->args, $callingArgs); + $this->zipSetArgs($block->args, $orderedArgs, $keywordArgs); $negate = false; if ($guard[0] == "negate") { @@ -487,24 +496,34 @@ class lessc { } } - $numCalling = count($callingArgs); - if (empty($block->args)) { - return $block->isVararg || $numCalling == 0; + return $block->isVararg || empty($orderedArgs) && empty($keywordArgs); + } + + $remainingArgs = $block->args; + if ($keywordArgs) { + $remainingArgs = array(); + foreach ($block->args as $arg) { + if ($arg[0] == "arg" && isset($keywordArgs[$arg[1]])) { + continue; + } + + $remainingArgs[] = $arg; + } } $i = -1; // no args // try to match by arity or by argument literal - foreach ($block->args as $i => $arg) { + foreach ($remainingArgs as $i => $arg) { switch ($arg[0]) { case "lit": - if (empty($callingArgs[$i]) || !$this->eq($arg[1], $callingArgs[$i])) { + if (empty($orderedArgs[$i]) || !$this->eq($arg[1], $orderedArgs[$i])) { return false; } break; case "arg": // no arg and no default value - if (!isset($callingArgs[$i]) && !isset($arg[2])) { + if (!isset($orderedArgs[$i]) && !isset($arg[2])) { return false; } break; @@ -519,14 +538,19 @@ class lessc { } else { $numMatched = $i + 1; // greater than becuase default values always match - return $numMatched >= $numCalling; + return $numMatched >= count($orderedArgs); } } - protected function patternMatchAll($blocks, $callingArgs) { + protected function patternMatchAll($blocks, $orderedArgs, $keywordArgs, $skip=array()) { $matches = null; foreach ($blocks as $block) { - if ($this->patternMatch($block, $callingArgs)) { + // skip seen blocks that don't have arguments + if (isset($skip[$block->id]) && !isset($block->args)) { + continue; + } + + if ($this->patternMatch($block, $orderedArgs, $keywordArgs)) { $matches[] = $block; } } @@ -535,7 +559,7 @@ class lessc { } // attempt to find blocks matched by path and args - protected function findBlocks($searchIn, $path, $args, $seen=array()) { + protected function findBlocks($searchIn, $path, $orderedArgs, $keywordArgs, $seen=array()) { if ($searchIn == null) return null; if (isset($seen[$searchIn->id])) return null; $seen[$searchIn->id] = true; @@ -545,7 +569,7 @@ class lessc { if (isset($searchIn->children[$name])) { $blocks = $searchIn->children[$name]; if (count($path) == 1) { - $matches = $this->patternMatchAll($blocks, $args); + $matches = $this->patternMatchAll($blocks, $orderedArgs, $keywordArgs, $seen); if (!empty($matches)) { // This will return all blocks that match in the closest // scope that has any matching block, like lessjs @@ -555,7 +579,7 @@ class lessc { $matches = array(); foreach ($blocks as $subBlock) { $subMatches = $this->findBlocks($subBlock, - array_slice($path, 1), $args, $seen); + array_slice($path, 1), $orderedArgs, $keywordArgs, $seen); if (!is_null($subMatches)) { foreach ($subMatches as $sm) { @@ -567,39 +591,51 @@ class lessc { return count($matches) > 0 ? $matches : null; } } - if ($searchIn->parent === $searchIn) return null; - return $this->findBlocks($searchIn->parent, $path, $args, $seen); + return $this->findBlocks($searchIn->parent, $path, $orderedArgs, $keywordArgs, $seen); } // sets all argument names in $args to either the default value // or the one passed in through $values - protected function zipSetArgs($args, $values) { - $i = 0; + protected function zipSetArgs($args, $orderedValues, $keywordValues) { $assignedValues = array(); - foreach ($args as $a) { + + $i = 0; + foreach ($args as $a) { if ($a[0] == "arg") { - if ($i < count($values) && !is_null($values[$i])) { - $value = $values[$i]; + if (isset($keywordValues[$a[1]])) { + // has keyword arg + $value = $keywordValues[$a[1]]; + } elseif (isset($orderedValues[$i])) { + // has ordered arg + $value = $orderedValues[$i]; + $i++; } elseif (isset($a[2])) { + // has default value $value = $a[2]; - } else $value = null; + } else { + $this->throwError("Failed to assign arg " . $a[1]); + $value = null; // :( + } $value = $this->reduce($value); $this->set($a[1], $value); $assignedValues[] = $value; + } else { + // a lit + $i++; } - $i++; } // check for a rest $last = end($args); if ($last[0] == "rest") { - $rest = array_slice($values, count($args) - 1); + $rest = array_slice($orderedValues, count($args) - 1); $this->set($last[1], $this->reduce(array("list", " ", $rest))); } - $this->env->arguments = $assignedValues; + // wow is this the only true use of PHP's + operator for arrays? + $this->env->arguments = $assignedValues + $orderedValues; } // compile a prop and update $lines or $blocks appropriately @@ -624,8 +660,28 @@ class lessc { case 'mixin': list(, $path, $args, $suffix) = $prop; - $args = array_map(array($this, "reduce"), (array)$args); - $mixins = $this->findBlocks($block, $path, $args); + $orderedArgs = array(); + $keywordArgs = array(); + foreach ((array)$args as $arg) { + $argval = null; + switch ($arg[0]) { + case "arg": + if (!isset($arg[2])) { + $orderedArgs[] = $this->reduce(array("variable", $arg[1])); + } else { + $keywordArgs[$arg[1]] = $this->reduce($arg[2]); + } + break; + + case "lit": + $orderedArgs[] = $this->reduce($arg[1]); + break; + default: + $this->throwError("Unknown arg type: " . $arg[0]); + } + } + + $mixins = $this->findBlocks($block, $path, $orderedArgs, $keywordArgs); if ($mixins === null) { // fwrite(STDERR,"failed to find block: ".implode(" > ", $path)."\n"); @@ -633,6 +689,10 @@ class lessc { } foreach ($mixins as $mixin) { + if ($mixin === $block && !$orderedArgs) { + continue; + } + $haveScope = false; if (isset($mixin->parent->scope)) { $haveScope = true; @@ -644,7 +704,7 @@ class lessc { if (isset($mixin->args)) { $haveArgs = true; $this->pushEnv(); - $this->zipSetArgs($mixin->args, $args); + $this->zipSetArgs($mixin->args, $orderedArgs, $keywordArgs); } $oldParent = $mixin->parent; @@ -701,7 +761,9 @@ class lessc { list(,$importId) = $prop; $import = $this->env->imports[$importId]; if ($import[0] === false) { - $out->lines[] = $import[1]; + if (isset($import[1])) { + $out->lines[] = $import[1]; + } } else { list(, $bottom, $parser, $importDir) = $import; $this->compileImportedProps($bottom, $block, $out, $parser, $importDir); @@ -789,6 +851,60 @@ class lessc { } } + protected function lib_pow($args) { + list($base, $exp) = $this->assertArgs($args, 2, "pow"); + return pow($this->assertNumber($base), $this->assertNumber($exp)); + } + + protected function lib_pi() { + return pi(); + } + + protected function lib_mod($args) { + list($a, $b) = $this->assertArgs($args, 2, "mod"); + return $this->assertNumber($a) % $this->assertNumber($b); + } + + protected function lib_tan($num) { + return tan($this->assertNumber($num)); + } + + protected function lib_sin($num) { + return sin($this->assertNumber($num)); + } + + protected function lib_cos($num) { + return cos($this->assertNumber($num)); + } + + protected function lib_atan($num) { + $num = atan($this->assertNumber($num)); + return array("number", $num, "rad"); + } + + protected function lib_asin($num) { + $num = asin($this->assertNumber($num)); + return array("number", $num, "rad"); + } + + protected function lib_acos($num) { + $num = acos($this->assertNumber($num)); + return array("number", $num, "rad"); + } + + protected function lib_sqrt($num) { + return sqrt($this->assertNumber($num)); + } + + protected function lib_extract($value) { + list($list, $idx) = $this->assertArgs($value, 2, "extract"); + $idx = $this->assertNumber($idx); + // 1 indexed + if ($list[0] == "list" && isset($list[2][$idx - 1])) { + return $list[2][$idx - 1]; + } + } + protected function lib_isnumber($value) { return $this->toBool($value[0] == "number"); } @@ -1013,19 +1129,24 @@ class lessc { } // mixes two colors by weight - // mix(@color1, @color2, @weight); + // mix(@color1, @color2, [@weight: 50%]); // http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html#mix-instance_method protected function lib_mix($args) { - if ($args[0] != "list" || count($args[2]) < 3) + if ($args[0] != "list" || count($args[2]) < 2) $this->throwError("mix expects (color1, color2, weight)"); - list($first, $second, $weight) = $args[2]; + list($first, $second) = $args[2]; $first = $this->assertColor($first); $second = $this->assertColor($second); $first_a = $this->lib_alpha($first); $second_a = $this->lib_alpha($second); - $weight = $weight[1] / 100.0; + + if (isset($args[2][2])) { + $weight = $args[2][2][1] / 100.0; + } else { + $weight = 0.5; + } $w = $weight * 2 - 1; $a = $first_a - $second_a; @@ -1076,6 +1197,25 @@ class lessc { $this->throwError($error); } + protected function assertArgs($value, $expectedArgs, $name="") { + if ($expectedArgs == 1) { + return $value; + } else { + if ($value[0] !== "list" || $value[1] != ",") $this->throwError("expecting list"); + $values = $value[2]; + $numValues = count($values); + if ($expectedArgs != $numValues) { + if ($name) { + $name = $name . ": "; + } + + $this->throwError("${name}expecting $expectedArgs arguments, got $numValues"); + } + + return $values; + } + } + protected function toHSL($color) { if ($color[0] == 'hsl') return $color; @@ -1220,6 +1360,10 @@ class lessc { $var = $this->compileValue($reduced); $res = $this->reduce(array("variable", $this->vPrefix . $var)); + if ($res[0] == "raw_color") { + $res = $this->coerceColor($res); + } + if (empty($value[2])) $res = $this->lib_e($res); return $res; @@ -1681,7 +1825,6 @@ class lessc { $this->importDir = (array)$this->importDir; $this->importDir[] = $pi['dirname'].'/'; - $this->allParsedFiles = array(); $this->addParsedFile($fname); $out = $this->compile(file_get_contents($fname), $fname); @@ -2065,7 +2208,7 @@ class lessc_parser { static protected $supressDivisionProps = array('/border-radius$/i', '/^font$/i'); - protected $blockDirectives = array("font-face", "keyframes", "page", "-moz-document"); + protected $blockDirectives = array("font-face", "keyframes", "page", "-moz-document", "viewport", "-moz-viewport", "-o-viewport", "-ms-viewport"); protected $lineDirectives = array("charset"); /** @@ -2304,7 +2447,7 @@ class lessc_parser { // mixin if ($this->mixinTags($tags) && - ($this->argumentValues($argv) || true) && + ($this->argumentDef($argv, $isVararg) || true) && ($this->keyword($suffix) || true) && $this->end()) { $tags = $this->fixTags($tags); @@ -2653,7 +2796,6 @@ class lessc_parser { } if (!empty($rejectStrs) && in_array($tok, $rejectStrs)) { - $ount = null; break; } @@ -2773,38 +2915,18 @@ class lessc_parser { return false; } - // consume a list of property values delimited by ; and wrapped in () - protected function argumentValues(&$args, $delim = ',') { - $s = $this->seek(); - if (!$this->literal('(')) return false; - - $values = array(); - while (true) { - if ($this->expressionList($value)) $values[] = $value; - if (!$this->literal($delim)) break; - else { - if ($value == null) $values[] = null; - $value = null; - } - } - - if (!$this->literal(')')) { - $this->seek($s); - return false; - } - - $args = $values; - return true; - } - // consume an argument definition list surrounded by () // each argument is a variable name with optional value // or at the end a ... or a variable named followed by ... - protected function argumentDef(&$args, &$isVararg, $delim = ',') { + // arguments are separated by , unless a ; is in the list, then ; is the + // delimiter. + protected function argumentDef(&$args, &$isVararg) { $s = $this->seek(); if (!$this->literal('(')) return false; $values = array(); + $delim = ","; + $method = "expressionList"; $isVararg = false; while (true) { @@ -2813,28 +2935,77 @@ class lessc_parser { break; } - if ($this->variable($vname)) { - $arg = array("arg", $vname); - $ss = $this->seek(); - if ($this->assign() && $this->expressionList($value)) { - $arg[] = $value; - } else { - $this->seek($ss); - if ($this->literal("...")) { - $arg[0] = "rest"; - $isVararg = true; + if ($this->$method($value)) { + if ($value[0] == "variable") { + $arg = array("arg", $value[1]); + $ss = $this->seek(); + + if ($this->assign() && $this->$method($rhs)) { + $arg[] = $rhs; + } else { + $this->seek($ss); + if ($this->literal("...")) { + $arg[0] = "rest"; + $isVararg = true; + } } + + $values[] = $arg; + if ($isVararg) break; + continue; + } else { + $values[] = array("lit", $value); } - $values[] = $arg; - if ($isVararg) break; - continue; } - if ($this->value($literal)) { - $values[] = array("lit", $literal); - } - if (!$this->literal($delim)) break; + if (!$this->literal($delim)) { + if ($delim == "," && $this->literal(";")) { + // found new delim, convert existing args + $delim = ";"; + $method = "propertyValue"; + + // transform arg list + if (isset($values[1])) { // 2 items + $newList = array(); + foreach ($values as $i => $arg) { + switch($arg[0]) { + case "arg": + if ($i) { + $this->throwError("Cannot mix ; and , as delimiter types"); + } + $newList[] = $arg[2]; + break; + case "lit": + $newList[] = $arg[1]; + break; + case "rest": + $this->throwError("Unexpected rest before semicolon"); + } + } + + $newList = array("list", ", ", $newList); + + switch ($values[0][0]) { + case "arg": + $newArg = array("arg", $values[0][1], $newList); + break; + case "lit": + $newArg = array("lit", $newList); + break; + } + + } elseif ($values) { // 1 item + $newArg = $values[0]; + } + + if ($newArg) { + $values = array($newArg); + } + } else { + break; + } + } } if (!$this->literal(')')) { @@ -2876,32 +3047,69 @@ class lessc_parser { } // a bracketed value (contained within in a tag definition) - protected function tagBracket(&$value) { + protected function tagBracket(&$parts, &$hasExpression) { // speed shortcut if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] != "[") { return false; } $s = $this->seek(); - if ($this->literal('[') && $this->to(']', $c, true) && $this->literal(']', false)) { - $value = '['.$c.']'; - // whitespace? - if ($this->whitespace()) $value .= " "; - // escape parent selector, (yuck) - $value = str_replace($this->lessc->parentSelector, "$&$", $value); - return true; - } + $hasInterpolation = false; - $this->seek($s); - return false; - } + if ($this->literal("[", false)) { + $attrParts = array("["); + // keyword, string, operator + while (true) { + if ($this->literal("]", false)) { + $this->count--; + break; // get out early + } - protected function tagExpression(&$value) { - $s = $this->seek(); - if ($this->literal("(") && $this->expression($exp) && $this->literal(")")) { - $value = array('exp', $exp); - return true; + if ($this->match('\s+', $m)) { + $attrParts[] = " "; + continue; + } + if ($this->string($str)) { + // escape parent selector, (yuck) + foreach ($str[2] as &$chunk) { + $chunk = str_replace($this->lessc->parentSelector, "$&$", $chunk); + } + + $attrParts[] = $str; + $hasInterpolation = true; + continue; + } + + if ($this->keyword($word)) { + $attrParts[] = $word; + continue; + } + + if ($this->interpolation($inter, false)) { + $attrParts[] = $inter; + $hasInterpolation = true; + continue; + } + + // operator, handles attr namespace too + if ($this->match('[|-~\$\*\^=]+', $m)) { + $attrParts[] = $m[0]; + continue; + } + + break; + } + + if ($this->literal("]", false)) { + $attrParts[] = "]"; + foreach ($attrParts as $part) { + $parts[] = $part; + } + $hasExpression = $hasExpression || $hasInterpolation; + return true; + } + $this->seek($s); } $this->seek($s); @@ -2917,13 +3125,9 @@ class lessc_parser { $s = $this->seek(); - if (!$simple && $this->tagExpression($tag)) { - return true; - } - $hasExpression = false; $parts = array(); - while ($this->tagBracket($first)) $parts[] = $first; + while ($this->tagBracket($parts, $hasExpression)); $oldWhite = $this->eatWhiteDefault; $this->eatWhiteDefault = false; @@ -2933,9 +3137,7 @@ class lessc_parser { $parts[] = $m[1]; if ($simple) break; - while ($this->tagBracket($brack)) { - $parts[] = $brack; - } + while ($this->tagBracket($parts, $hasExpression)); continue; } @@ -3062,7 +3264,7 @@ class lessc_parser { protected function end() { if ($this->literal(';')) { return true; - } elseif ($this->count == strlen($this->buffer) || $this->buffer{$this->count} == '}') { + } elseif ($this->count == strlen($this->buffer) || $this->buffer[$this->count] == '}') { // if there is end of file or a closing block next then we don't need a ; return true; } @@ -3326,7 +3528,7 @@ class lessc_parser { break; case '"': case "'": - if (preg_match('/'.$min[0].'.*?'.$min[0].'/', $text, $m, 0, $count)) + if (preg_match('/'.$min[0].'.*?(?, 2012 - -$exe = array_shift($argv); // remove filename - -$HELP = << 0 && preg_match('/^-([-hvrwncXT]$|[f]=)/', $argv[0])) { - array_shift($argv); -} - -function has() { - global $opts; - foreach (func_get_args() as $arg) { - if (isset($opts[$arg])) return true; - } - return false; -} - -if (has("h", "help")) { - exit($HELP); -} - -error_reporting(E_ALL); -$path = realpath(dirname(__FILE__)).'/'; - -require $path."lessc.inc.php"; - -$VERSION = lessc::$VERSION; - -$fa = "Fatal Error: "; -function err($msg) { - fwrite(STDERR, $msg."\n"); -} - -if (php_sapi_name() != "cli") { - err($fa.$argv[0]." must be run in the command line."); - exit(1); -} - -function make_less($fname = null) { - global $opts; - $l = new lessc($fname); - - if (has("f")) { - $format = $opts["f"]; - if ($format != "default") $l->setFormatter($format); - } - - if (has("c")) { - $l->setPreserveComments(true); - } - - return $l; -} - -function process($data, $import = null) { - global $fa; - - $l = make_less(); - if ($import) $l->importDir = $import; - - try { - echo $l->parse($data); - exit(0); - } catch (exception $ex) { - err($fa."\n".str_repeat('=', 20)."\n". - $ex->getMessage()); - exit(1); - } -} - -if (has("v")) { - exit($VERSION."\n"); -} - -if (has("r")) { - if (!empty($argv)) { - $data = $argv[0]; - } else { - $data = ""; - while (!feof(STDIN)) { - $data .= fread(STDIN, 8192); - } - } - exit(process($data)); -} - -if (has("w")) { - // need two files - if (!is_file($in = array_shift($argv)) || - null == $out = array_shift($argv)) - { - err($fa.$exe." -w infile outfile"); - exit(1); - } - - echo "Watching ".$in. - (has("n") ? ' with notifications' : ''). - ", press Ctrl + c to exit.\n"; - - $cache = $in; - $last_action = 0; - while (true) { - clearstatcache(); - - // check if anything has changed since last fail - $updated = false; - if (is_array($cache)) { - foreach ($cache['files'] as $fname=>$_) { - if (filemtime($fname) > $last_action) { - $updated = true; - break; - } - } - } else $updated = true; - - // try to compile it - if ($updated) { - $last_action = time(); - - try { - $cache = lessc::cexecute($cache); - echo "Writing updated file: ".$out."\n"; - if (!file_put_contents($out, $cache['compiled'])) { - err($fa."Could not write to file ".$out); - exit(1); - } - } catch (exception $ex) { - echo "\nFatal Error:\n".str_repeat('=', 20)."\n". - $ex->getMessage()."\n\n"; - - if (has("n")) { - `notify-send -u critical "compile failed" "{$ex->getMessage()}"`; - } - } - } - - sleep(1); - } - exit(0); -} - -if (!$fname = array_shift($argv)) { - echo $HELP; - exit(1); -} - -function dumpValue($node, $depth = 0) { - if (is_object($node)) { - $indent = str_repeat(" ", $depth); - $out = array(); - foreach ($node->props as $prop) { - $out[] = $indent . dumpValue($prop, $depth + 1); - } - $out = implode("\n", $out); - if (!empty($node->tags)) { - $out = "+ ".implode(", ", $node->tags)."\n".$out; - } - return $out; - } elseif (is_array($node)) { - if (empty($node)) return "[]"; - $type = $node[0]; - if ($type == "block") - return dumpValue($node[1], $depth); - - $out = array(); - foreach ($node as $value) { - $out[] = dumpValue($value, $depth); - } - return "{ ".implode(", ", $out)." }"; - } else { - if (is_string($node) && preg_match("/[\s,]/", $node)) { - return '"'.$node.'"'; - } - return $node; // normal value - } -} - - -function stripValue($o, $toStrip) { - if (is_array($o) || is_object($o)) { - $isObject = is_object($o); - $o = (array)$o; - foreach ($toStrip as $removeKey) { - if (!empty($o[$removeKey])) { - $o[$removeKey] = "*stripped*"; - } - } - - foreach ($o as $k => $v) { - $o[$k] = stripValue($v, $toStrip); - } - - if ($isObject) { - $o = (object)$o; - } - } - - return $o; -} - -function dumpWithoutParent($o, $alsoStrip=array()) { - $toStrip = array_merge(array("parent"), $alsoStrip); - print_r(stripValue($o, $toStrip)); -} - -try { - $less = make_less($fname); - if (has("T", "X")) { - $parser = new lessc_parser($less, $fname); - $tree = $parser->parse(file_get_contents($fname)); - if (has("X")) - $out = print_r($tree, 1); - else - $out = dumpValue($tree)."\n"; - } else { - $out = $less->parse(); - } - - if (!$fout = array_shift($argv)) { - echo $out; - } else { - file_put_contents($fout, $out); - } - -} catch (exception $ex) { - err($fa.$ex->getMessage()); - exit(1); -} - -?> diff --git a/library/vendor/lessphp/tests/ApiTest.php b/library/vendor/lessphp/tests/ApiTest.php deleted file mode 100644 index 3725dd56c..000000000 --- a/library/vendor/lessphp/tests/ApiTest.php +++ /dev/null @@ -1,189 +0,0 @@ -less = new lessc(); - $this->less->importDir = array(__DIR__ . "/inputs/test-imports"); - } - - public function testPreserveComments() { - $input = <<assertEquals($this->compile($input), trim($outputWithoutComments)); - $this->less->setPreserveComments(true); - $this->assertEquals($this->compile($input), trim($outputWithComments)); - } - - public function testOldInterface() { - $this->less = new lessc(__DIR__ . "/inputs/hi.less"); - $out = $this->less->parse(array("hello" => "10px")); - $this->assertEquals(trim($out), trim(' -div:before { - content: "hi!"; -}')); - - } - - public function testInjectVars() { - $out = $this->less->parse(".magic { color: @color; width: @base - 200; }", - array( - 'color' => 'red', - 'base' => '960px' - )); - - $this->assertEquals(trim($out), trim(" -.magic { - color: red; - width: 760px; -}")); - - } - - public function testDisableImport() { - $this->less->importDisabled = true; - $this->assertEquals( - "/* import disabled */", - $this->compile("@import 'file3';")); - } - - public function testUserFunction() { - $this->less->registerFunction("add-two", function($list) { - list($a, $b) = $list[2]; - return $a[1] + $b[1]; - }); - - $this->assertEquals( - $this->compile("result: add-two(10, 20);"), - "result: 30;"); - - return $this->less; - } - - /** - * @depends testUserFunction - */ - public function testUnregisterFunction($less) { - $less->unregisterFunction("add-two"); - - $this->assertEquals( - $this->compile("result: add-two(10, 20);"), - "result: add-two(10,20);"); - } - - - - public function testFormatters() { - $src = " - div, pre { - color: blue; - span, .big, hello.world { - height: 20px; - color:#ffffff + #000; - } - }"; - - $this->less->setFormatter("compressed"); - $this->assertEquals( - $this->compile($src), "div,pre{color:blue;}div span,div .big,div hello.world,pre span,pre .big,pre hello.world{height:20px;color:#fff;}"); - - // TODO: fix the output order of tags - $this->less->setFormatter("lessjs"); - $this->assertEquals( - $this->compile($src), -"div, -pre { - color: blue; -} -div span, -div .big, -div hello.world, -pre span, -pre .big, -pre hello.world { - height: 20px; - color: #ffffff; -}"); - - $this->less->setFormatter("classic"); - $this->assertEquals( - $this->compile($src), -trim("div, pre { color:blue; } -div span, div .big, div hello.world, pre span, pre .big, pre hello.world { - height:20px; - color:#ffffff; -} -")); - - } - - public function compile($str) { - return trim($this->less->parse($str)); - } - -} diff --git a/library/vendor/lessphp/tests/InputTest.php b/library/vendor/lessphp/tests/InputTest.php deleted file mode 100644 index cb0e82f09..000000000 --- a/library/vendor/lessphp/tests/InputTest.php +++ /dev/null @@ -1,71 +0,0 @@ -less = new lessc(); - $this->less->importDir = array(__DIR__ . "/" . self::$inputDir . "/test-imports"); - } - - /** - * @dataProvider fileNameProvider - */ - public function testInputFile($inFname) { - if ($pattern = getenv("BUILD")) { - return $this->buildInput($inFname); - } - - $outFname = self::outputNameFor($inFname); - - if (!is_readable($outFname)) { - $this->fail("$outFname is missing, ". - "consider building tests with BUILD=true"); - } - - $input = file_get_contents($inFname); - $output = file_get_contents($outFname); - - $this->assertEquals($output, $this->less->parse($input)); - } - - public function fileNameProvider() { - return array_map(function($a) { return array($a); }, - self::findInputNames()); - } - - // only run when env is set - public function buildInput($inFname) { - $css = $this->less->parse(file_get_contents($inFname)); - file_put_contents(self::outputNameFor($inFname), $css); - } - - static public function findInputNames($pattern="*.less") { - $files = glob(__DIR__ . "/" . self::$inputDir . "/" . $pattern); - return array_filter($files, "is_file"); - } - - static public function outputNameFor($input) { - $front = _quote(__DIR__ . "/"); - $out = preg_replace("/^$front/", "", $input); - - $in = _quote(self::$inputDir . "/"); - $out = preg_replace("/$in/", self::$outputDir . "/", $out); - $out = preg_replace("/.less$/", ".css", $out); - - return __DIR__ . "/" . $out; - } -} diff --git a/library/vendor/lessphp/tests/README.md b/library/vendor/lessphp/tests/README.md deleted file mode 100644 index 1f7e04301..000000000 --- a/library/vendor/lessphp/tests/README.md +++ /dev/null @@ -1,13 +0,0 @@ -lessphp uses [phpunit](https://github.com/sebastianbergmann/phpunit/) for it's tests - -`InputTest.php` iterates through all the less files in `inputs/`, compiles them, -then compares the result with the respective file in `outputs/`. - -From the root you can run `make` to run all the tests. - -## bootstrap.sh - -Clones twitter bootsrap, compiles it with lessc and lessphp, cleans up results -with sort.php, and outputs diff. To run it, you need to have git and lessc -installed. - diff --git a/library/vendor/lessphp/tests/bootstrap.sh b/library/vendor/lessphp/tests/bootstrap.sh deleted file mode 100755 index db0ae3a20..000000000 --- a/library/vendor/lessphp/tests/bootstrap.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/sh - -echo "This script clones Twitter Bootstrap, compiles it with lessc and lessphp," -echo "cleans up results with sort.php, and outputs diff. To run it, you need to" -echo "have git and lessc installed." -echo "" - -if [ -z "$input" ]; then - input="bootstrap/less/bootstrap.less" -fi -dest=$(basename "$input") -dest="${dest%.*}" - -if [ -z "$@" ]; then - diff_tool="diff -b -u -t -B" -else - diff_tool=$@ -fi - -mkdir -p tmp - -if [ ! -d 'bootstrap/' ]; then - echo ">> Cloning bootstrap to bootstrap/" - git clone https://github.com/twitter/bootstrap -fi - -echo ">> lessc compilation ($input)" -lessc "$input" "tmp/$dest.lessc.css" - -echo ">> lessphp compilation ($input)" -../plessc "$input" "tmp/$dest.lessphp.css" -echo ">> Cleanup and convert" - -php sort.php "tmp/$dest.lessc.css" > "tmp/$dest.lessc.clean.css" -php sort.php "tmp/$dest.lessphp.css" > "tmp/$dest.lessphp.clean.css" - -echo ">> Doing diff" -$diff_tool "tmp/$dest.lessc.clean.css" "tmp/$dest.lessphp.clean.css" diff --git a/library/vendor/lessphp/tests/inputs/accessors.less.disable b/library/vendor/lessphp/tests/inputs/accessors.less.disable deleted file mode 100644 index 37f5c8e8b..000000000 --- a/library/vendor/lessphp/tests/inputs/accessors.less.disable +++ /dev/null @@ -1,36 +0,0 @@ -/* accessors */ - -#defaults { - @width: 960px; - @color: black; - .something { - @space: 10px; - @hello { - color: green; - } - } -} - -.article { color: #294366; } - -.comment { - width: #defaults[@width]; - color: .article['color']; - padding: #defaults > .something[@space]; -} - -.wow { - height: .comment['width']; - background-color: .comment['color']; - color: #defaults > .something > @hello['color']; - - padding: #defaults > non-existant['padding']; - margin: #defaults > .something['non-existant']; -} - -.mix { - #defaults; - font-size: .something[@space]; -} - - diff --git a/library/vendor/lessphp/tests/inputs/arity.less b/library/vendor/lessphp/tests/inputs/arity.less deleted file mode 100644 index a3adad612..000000000 --- a/library/vendor/lessphp/tests/inputs/arity.less +++ /dev/null @@ -1,77 +0,0 @@ - -// simple arity - -.hello(@a) { - color: one; -} - -.hello(@a, @b) { - color: two; -} - -.hello(@a, @b, @c) { - color: three; -} - - -.world(@a, @b, @c) { - color: three; -} - -.world(@a, @b) { - color: two; -} - -.world(@a) { - color: one; -} - -.one { - .hello(1); - .world(1); -} - -.two { - .hello(1, 1); - .world(1, 1); -} - -.three { - .hello(1, 1, 1); - .world(1, 1, 1); -} - - -// arity with default values - -.foo(@a, @b: cool) { - color: two; -} - -.foo(@a, @b: cool, @c: yeah) { - color: three; -} - - -.baz(@a, @b, @c: yeah) { - color: three; -} - -.baz(@a, @b: cool) { - color: two; -} - - -.multi-foo { - .foo(1); - .foo(1, 1); - .foo(1,1,1); -} - -.multi-baz { - .baz(1); - .baz(1, 1); - .baz(1,1,1); -} - - diff --git a/library/vendor/lessphp/tests/inputs/attributes.less b/library/vendor/lessphp/tests/inputs/attributes.less deleted file mode 100644 index 7ede4fc4e..000000000 --- a/library/vendor/lessphp/tests/inputs/attributes.less +++ /dev/null @@ -1,41 +0,0 @@ -* { color: blue; } -E { color: blue; } -E[foo] { color: blue; } -[foo] { color: blue; } -[foo] .helloWorld { color: blue; } -[foo].helloWorld { color: blue; } -E[foo="barbar"] { color: blue; } -E[foo~="hello#$@%@$#^"] { color: blue; } -E[foo^="color: green;"] { color: blue; } -E[foo$="239023"] { color: blue; } -E[foo*="29302"] { color: blue; } -E[foo|="239032"] { color: blue; } -E:root { color: blue; } - -E:nth-child(odd) { color: blue; } -E:nth-child(2n+1) { color: blue; } -E:nth-child(5) { color: blue; } -E:nth-last-child(-n+2) { color: blue; } -E:nth-of-type(2n) { color: blue; } -E:nth-last-of-type(n) { color: blue; } - -E:first-child { color: blue; } -E:last-child { color: blue; } -E:first-of-type { color: blue; } -E:last-of-type { color: blue; } -E:only-child { color: blue; } -E:only-of-type { color: blue; } -E:empty { color: blue; } - -E:lang(en) { color: blue; } -E::first-line { color: blue; } -E::before { color: blue; } - -E#id { color: blue; } -E:not(:link) { color: blue; } - -E F { color: blue; } -E > F { color: blue; } -E + F { color: blue; } -E ~ F { color: blue; } - diff --git a/library/vendor/lessphp/tests/inputs/builtins.less b/library/vendor/lessphp/tests/inputs/builtins.less deleted file mode 100644 index f0ce68a7f..000000000 --- a/library/vendor/lessphp/tests/inputs/builtins.less +++ /dev/null @@ -1,73 +0,0 @@ -// builtin - -@something: "hello world"; -@color: #112233; -@color2: rgba(44,55,66, .6); - -body { - color: @something; - - @num: 7 / 6; - height: @num + 4; - height: floor(@num) + 4px; - height: ceil(@num) + 4px; - - @num2: 2 / 3; - width: @num2; - width: round(@num2); - width: floor(@num2); - width: ceil(@num2); - width: round(10px / 3); - - color: rgbahex(@color); - color: rgbahex(@color2); - color: argb(@color2); -} - - -format { - @r: 32; - format: %("rgb(%d, %d, %d)", @r, 128, 64); - format-string: %("hello %s", "world"); - format-multiple: %("hello %s %d", "earth", 2); - format-url-encode: %('red is %A', #ff0000); - eformat: e(%("rgb(%d, %d, %d)", @r, 128, 64)); -} - - -#functions { - str: isstring("hello"); - str: isstring(one, two); - - num: isnumber(2323px); - num: isnumber(2323); - num: isnumber(4/5); - num: isnumber("hello"); - - col: iscolor(red); - col: iscolor(hello); - col: iscolor(rgba(0,0,0,0.3)); - col: iscolor(#fff); - - key: iskeyword(hello); - key: iskeyword(3D); - - px: ispixel(10px); - px: ispixel(10); - - per: ispercentage(10%); - per: ispercentage(10); - - em: isem(10em); - em: isem(10); -} - - -#unit { - @unit: "em"; - height: unit(10px); - height: unit(10px, "s"); - height: unit(10px, @unit); - height: unit(0.07407s) * 100%; -} - diff --git a/library/vendor/lessphp/tests/inputs/colors.less b/library/vendor/lessphp/tests/inputs/colors.less deleted file mode 100644 index c9f3d14d3..000000000 --- a/library/vendor/lessphp/tests/inputs/colors.less +++ /dev/null @@ -1,153 +0,0 @@ - -body { - color:rgb(red(#f00), red(#0F0), red(#00f)); - color:rgb(red(#f00), green(#0F0), blue(#00f)); - color:rgb(red(#0ff), green(#f0f), blue(#ff0)); - - color: hsl(34, 50%, 40%); - color: hsla(34, 50%, 40%, 0.3); - - lighten: lighten(#efefef, 10%); - lighten: lighten(rgb(23, 53, 231), 22%); - lighten: lighten(rgba(212, 103, 88, 0.5), 10%); - - darken: darken(#efefef, 10%); - darken: darken(rgb(23, 53, 231), 22%); - darken: darken(rgba(23, 53, 231, 0.5), 10%); - - saturate: saturate(#efefef, 10%); - saturate: saturate(rgb(23, 53, 231), 22%); - saturate: saturate(rgba(23, 53, 231, 0.5), 10%); - - desaturate: desaturate(#efefef, 10%); - desaturate: desaturate(rgb(23, 53, 231), 22%); - desaturate: desaturate(rgba(23, 53, 231, 0.5), 10%); - - spin: spin(#efefef, 12); - spin: spin(rgb(23, 53, 231), 15); - spin: spin(rgba(23, 53, 231, 0.5), 19); - - spin: spin(#efefef, -12); - spin: spin(rgb(23, 53, 231), -15); - spin: spin(rgba(23, 53, 231, 0.5), -19); - - one: fadein(#abcdef, 10%); - one: fadeout(#abcdef, -10%); - - two: fadeout(#029f23, 10%); - two: fadein(#029f23, -10%); - - - three: fadein(rgba(1,2,3, 0.5), 10%); - three: fadeout(rgba(1,2,3, 0.5), -10%); - - four: fadeout(rgba(1,2,3, 0), 10%); - four: fadein(rgba(1,2,3, 0), -10%); - - hue: hue(rgb(34,20,40)); - sat: saturation(rgb(34,20,40)); - lit: lightness(rgb(34,20,40)); - - @old: #34fa03; - @new: hsl(hue(@old), 45%, 90%); - what: @new; - - zero: saturate(#123456, -100%); - zero: saturate(#123456, 100%); - zero: saturate(#000000, 100%); - zero: saturate(#ffffff, 100%); - - zero: lighten(#123456, -100%); - zero: lighten(#123456, 100%); - zero: lighten(#000000, 100%); - zero: lighten(#ffffff, 100%); - - zero: spin(#123456, -100); - zero: spin(#123456, 100); - zero: spin(#000000, 100); - zero: spin(#ffffff, 100); -} - - -alpha { - // g: alpha(red); - g: alpha(rgba(0,0,0,0)); - g: alpha(rgb(155,55,0)); -} - -fade { - f: fade(red, 50%); - f: fade(#fff, 20%); - f: fade(rgba(34,23,64,0.4), 50%); -} - -@a: rgb(255,255,255); -@b: rgb(0,0,0); - -.mix { - color: mix(@a, @b, 50%); - color: mix(rgba(5,3,1,0.3), rgba(6,3,2, 0.8), 50%); -} - -.contrast { - color: contrast(#000, red, blue); - color: contrast(#fff, red, blue); -} - -.percent { - per: percentage(0.5); -} - -// color keywords - -.colorz { - color: whitesmoke - 10; - color: spin(red, 34); - color: spin(blah); -} - - - -// purposfuly whacky to match less.js - -@color: #fcf8e3; - -body { - start: @color; - spin: spin(@color, -10); // #fcf4e3 - chained: darken(spin(@color, -10), 3%); // gives #fbeed5, should be #fbefd5 - direct: darken(#fcf4e3, 3%); // #fbefd5 -} - -// spin around -pre { - @errorBackground: #f2dede; - spin: spin(@errorBackground, -10); -} - -dd { - @white: #fff; - background-color: mix(@white, darken(@white, 10%), 60%); -} - -// math - -.ops { - c: red * 0.3; - c: green / 2; - c: purple % 7; - c: 4 * salmon; - c: 1 + salmon; - - c: 132 / red; - c: 132 - red; - c: 132- red; -} - -.transparent { - r: red(transparent); - g: green(transparent); - b: blue(transparent); - a: alpha(transparent); -} - diff --git a/library/vendor/lessphp/tests/inputs/compile_on_mixin.less b/library/vendor/lessphp/tests/inputs/compile_on_mixin.less deleted file mode 100644 index 79d628f49..000000000 --- a/library/vendor/lessphp/tests/inputs/compile_on_mixin.less +++ /dev/null @@ -1,39 +0,0 @@ - -@mixin { - height: 22px; - ul { - height: 20px; - li { - @color: red; - height: 10px; - div span, link { - margin: 10px; - color: @color; - } - } - - div, p { - border: 1px; - &.hello { - color: green; - } - - :what { - color: blue; - } - } - - - a { - b { - color: blue; - } - } - } -} - - - -body { - @mixin; -} diff --git a/library/vendor/lessphp/tests/inputs/directives.less b/library/vendor/lessphp/tests/inputs/directives.less deleted file mode 100644 index 27d29ae29..000000000 --- a/library/vendor/lessphp/tests/inputs/directives.less +++ /dev/null @@ -1,15 +0,0 @@ - -@hello: "utf-8"; -@charset @hello; - -@-moz-document url-prefix(){ - div { - color: red; - } -} - -@page :left { margin-left: 4cm; } -@page :right { margin-left: 3cm; } -@page { margin: 2cm } - - diff --git a/library/vendor/lessphp/tests/inputs/escape.less b/library/vendor/lessphp/tests/inputs/escape.less deleted file mode 100644 index 02d92d6f0..000000000 --- a/library/vendor/lessphp/tests/inputs/escape.less +++ /dev/null @@ -1,20 +0,0 @@ - -body { - @hello: "world"; - border: e("this is simple"); - border: e(this is simple); // bug in lessjs - border: e("this is simple", "cool lad"); - border: e(1232); - border: e(@hello); - border: e("one" + 'more'); // no string addition lessjs - border: e(); // syntax error lessjs - - line-height: ~"eating rice"; - line-height: ~"string cheese"; - line-height: a b c ~"string me" d e f; - line-height: ~"string @{hello}"; -} - -.class { - filter: ~"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image.png')"; -} diff --git a/library/vendor/lessphp/tests/inputs/font_family.less b/library/vendor/lessphp/tests/inputs/font_family.less deleted file mode 100644 index c7186b57b..000000000 --- a/library/vendor/lessphp/tests/inputs/font_family.less +++ /dev/null @@ -1,28 +0,0 @@ - -@font-directory: 'fonts/'; -@some-family: Gentium; - -@font-face: maroon; // won't collide with @font-face { } - -@font-face { - font-family: Graublau Sans Web; - src: url(@{font-directory}GraublauWeb.otf) format("opentype"); -} - -@font-face { - font-family: @some-family; - src: url('@{font-directory}Gentium.ttf'); -} - -@font-face { - font-family: @some-family; - src: url("@{font-directory}GentiumItalic.ttf"); - font-style: italic; -} - -h2 { - font-family: @some-family; - crazy: @font-face; -} - - diff --git a/library/vendor/lessphp/tests/inputs/guards.less b/library/vendor/lessphp/tests/inputs/guards.less deleted file mode 100644 index 20bdf240e..000000000 --- a/library/vendor/lessphp/tests/inputs/guards.less +++ /dev/null @@ -1,88 +0,0 @@ - -.simple(@hi) when (@hi) { - color: yellow; -} - - -.something(@hi) when (@hi = cool) { - color: red; -} - -.another(@x) when (@x > 10) { - color: green; -} - - -.flipped(@x) when (@x =< 10) { - color: teal; -} - -.yeah(@arg) when (isnumber(@arg)) { - color: purple; -} - - -.yeah(@arg) when (ispixel(@arg)) { - color: silver; -} - - -.hello(@arg) when not (@arg) { - color: orange; -} - -dd { - .simple(true); - .simple(2344px); -} - -b { - .something(cool); - .something(birthday); -} - -img { - .another(12); - .another(2); - - .flipped(12); - .flipped(2); -} - -body { - .yeah("world"); - .yeah(232px); - .yeah(232); - - .hello(true); -} - -.something(@x) when (@x) and (@y), not (@x = what) { - color: blue; -} - -div { - @y: true; - .something(true); - -} - -pre { - .something(what); -} - - -.coloras(@g) when (iscolor(@g)) { - color: true @g; -} - -link { - .coloras(red); - .coloras(10px); - .coloras(ffjref); - .coloras(#fff); - .coloras(#fffddd); - .coloras(rgb(0,0,0)); - .coloras(rgba(0,0,0, .34)); -} - diff --git a/library/vendor/lessphp/tests/inputs/hacks.less b/library/vendor/lessphp/tests/inputs/hacks.less deleted file mode 100644 index e69b7bf98..000000000 --- a/library/vendor/lessphp/tests/inputs/hacks.less +++ /dev/null @@ -1,6 +0,0 @@ -// css hacks - -:root .alert-message, :root .btn { - border-radius: 0 \0; -} - diff --git a/library/vendor/lessphp/tests/inputs/hi.less b/library/vendor/lessphp/tests/inputs/hi.less deleted file mode 100644 index 9a3d8198a..000000000 --- a/library/vendor/lessphp/tests/inputs/hi.less +++ /dev/null @@ -1,5 +0,0 @@ - -div:before { - content: "hi!"; -} - diff --git a/library/vendor/lessphp/tests/inputs/ie.less b/library/vendor/lessphp/tests/inputs/ie.less deleted file mode 100644 index fd069ecd1..000000000 --- a/library/vendor/lessphp/tests/inputs/ie.less +++ /dev/null @@ -1,12 +0,0 @@ - -foo { - filter: progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr=#c0ff3300, endColorstr=#ff000000); - filter:progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr=#c0ff3300, endColorstr=#ff000000); -} - - -foo { - filter: alpha(opacity=20); - filter: alpha(opacity=20, enabled=true); - filter: blaznicate(foo=bar, baz=bang bip, bart=#fa4600); -} diff --git a/library/vendor/lessphp/tests/inputs/import.less b/library/vendor/lessphp/tests/inputs/import.less deleted file mode 100644 index c3e178453..000000000 --- a/library/vendor/lessphp/tests/inputs/import.less +++ /dev/null @@ -1,56 +0,0 @@ - -@import 'file1.less'; // file found and imported - -@import "not-found"; - -@import "something.css" media; -@import url("something.css") media; -@import url(something.css) media, screen, print; - -@color: maroon; - -@import url(file2); // found and imported - -body { - line-height: 10em; - @colors; -} - -div { - @color: fuchsia; - @import "file2"; -} - - -.mixin-import() { - @import "file3"; -} - -.one { - .mixin-import(); - color: blue; -} - -.two { - .mixin-import(); -} - - -#merge-import-mixins { - @import "a"; - @import "b"; - div { .just-a-class; } -} - - -@import "inner/file1"; - - -// test bubbling variables up from imports, while preserving order - -pre { - color: @someValue; -} - -@import "file3"; - diff --git a/library/vendor/lessphp/tests/inputs/interpolation.less b/library/vendor/lessphp/tests/inputs/interpolation.less deleted file mode 100644 index 58ffa2fc5..000000000 --- a/library/vendor/lessphp/tests/inputs/interpolation.less +++ /dev/null @@ -1,33 +0,0 @@ - -@cool-hello: "yes"; -@cool-yes: "okay"; -@var: "hello"; - -div { - color: ~"@{cool-hello}"; - color: ~"@{cool-@{var}}"; - color: ~"@{cool-@{cool-@{var}}}"; -} - -// interpolation in selectors - -@hello: 10; -@world: "yeah"; - -@{hello}@{world} { - color: blue; -} - -@{hello} { - color: blue; -} - -hello world @{hello} { - color: red; -} - -#@{world} { - color: "hello @{hello}"; -} - - diff --git a/library/vendor/lessphp/tests/inputs/keyframes.less b/library/vendor/lessphp/tests/inputs/keyframes.less deleted file mode 100644 index e65a38b95..000000000 --- a/library/vendor/lessphp/tests/inputs/keyframes.less +++ /dev/null @@ -1,52 +0,0 @@ -@keyframes 'bounce' { - from { - top: 100px; - animation-timing-function: ease-out; - } - - 25% { - top: 50px; - animation-timing-function: ease-in; - } - - 50% { - top: 100px; - animation-timing-function: ease-out; - } - - 75% { - top: 75px; - animation-timing-function: ease-in; - } - - to { - top: 100px; - } -} - -@-webkit-keyframes flowouttoleft { - 0% { -webkit-transform: translateX(0) scale(1); } - 60%, 70% { -webkit-transform: translateX(0) scale(.7); } - 100% { -webkit-transform: translateX(-100%) scale(.7); } -} - -div { - animation-name: 'diagonal-slide'; - animation-duration: 5s; - animation-iteration-count: 10; -} - -@keyframes 'diagonal-slide' { - - from { - left: 0; - top: 0; - } - - to { - left: 100px; - top: 100px; - } - -} - diff --git a/library/vendor/lessphp/tests/inputs/math.less b/library/vendor/lessphp/tests/inputs/math.less deleted file mode 100644 index bcc383a8d..000000000 --- a/library/vendor/lessphp/tests/inputs/math.less +++ /dev/null @@ -1,121 +0,0 @@ - -.unary { - // all operators are parsable as unary operators, anything - // but - throws an error right now though, - - // this gives two numbers - sub: 10 -5; - // add: 10 +5; // error - // div: 10 /5; // error - // mul: 10 *5; // error -} - -.spaces { - // we can make the parser do math by leaving out the - // space after the first value, or putting spaces on both sides - - sub: 10-5; - sub: 10 - 5; - - add: 10+5; - add: 10 + 5; - - // div: 10/5; // this wont work, read on - div: 10 / 5; - - mul: 10*5; - mul: 10 * 5; -} - -// these properties have divison not in parenthases -.supress-division { - border-radius: 10px / 10px; - border-radius: 10px/10px; - border-radius: hello (10px/10px) world; - @x: 10px; - font: @x/30 sans-serif; - font: 10px / 20px sans-serif; - font: 10px/20px sans-serif; - border-radius:0 15px 15px 15px / 0 50% 50% 50%; -} - - -.parens { - // if you are unsure, then just wrap the expression in parentheses and it will - // always evaluate. - - // notice we no longer have unary operators, and these will evaluate - sub: (10 -5); - add: (10 +5); - div: (10 /5); - div: (10/5); // no longer interpreted as the shorthand - mul: (10 *5); -} - -.keyword-names { - // watch out when doing math with keywords, - is a valid keyword character - @a: 100; - @b: 25; - @a-: "hello"; - height: @a-@b; // here we get "hello" 25, not 75 -} - - -.negation { - hello: -(1px); - hello: 0-(1px); - - @something: 10; - hello: -@something; -} - - -// and now here are the tests - -.test { - single: (5); - single: 5+(5); - single: (5)+((5)); - - parens: (5 +(5)) -2; - // parens: ((5 +(5)) -2); // FAILS - fixme - - math: (5 + 5)*(2 / 1); - math: (5+5)*(2/1); - - width: 2 * (4 * (2 + (1 + 6))) - 1; - height: ((2+3)*(2+3) / (9-4)) + 1; - padding: (2px + 4px) 1em 2px 2; - - @var: (2 * 2); - padding: (2 * @var) 4 4 (@var * 1px); - width: (@var * @var) * 6; - height: (7 * 7) + (8 * 8); - margin: 4 * (5 + 5) / 2 - (@var * 2); -} - -.percents { - color: 100 * 10%; - color: 10% * 100; - color: 10% * 10%; - - color: 100px * 10%; // lessjs makes this px - color: 10% * 100px; // lessjs makes this % - - color: 20% + 10%; - color: 20% - 10%; - - color: 20% / 10%; -} - -.misc { - x: 10px * 4em; - y: 10 * 4em; -} - - -.cond { - y: 10 < 10; - y: 10 >= 10; -} - diff --git a/library/vendor/lessphp/tests/inputs/media.less b/library/vendor/lessphp/tests/inputs/media.less deleted file mode 100644 index 8c16a3cf6..000000000 --- a/library/vendor/lessphp/tests/inputs/media.less +++ /dev/null @@ -1,68 +0,0 @@ -@media screen, 3D { - P { color: green; } -} -@media print { - body { font-size: 10pt } -} -@media screen { - body { font-size: 13px } -} -@media screen, print { - body { line-height: 1.2 } -} - -@media all and (min-width: 0px) { - body { line-height: 1.2 } -} - -@media all and (min-width: 0) { - body { line-height: 1.2 } -} - -@media - screen and (min-width: 102.5em) and (max-width: 117.9375em), - screen and (min-width: 150em) { - body { color: blue } -} - - -@media screen and (min-height: 100px + 10px) { - body { color: red; } -} - -@cool: 100px; - -@media screen and (height: @cool) and (width: @cool + 10), (size: @cool + 20) { - body { color: red; } -} - - -// media bubbling - -@media test { - div { - height: 20px; - @media (hello) { - color: red; - - pre { - color: orange; - } - } - } -} - -// should not cross boundary -@media yeah { - @page { - @media cool { - color: red; - } - } -} - -// variable in query -@mobile: ~"(max-width: 599px)"; -@media @mobile { - .helloworld { color: blue } -} diff --git a/library/vendor/lessphp/tests/inputs/misc.less b/library/vendor/lessphp/tests/inputs/misc.less deleted file mode 100644 index f81eff4ba..000000000 --- a/library/vendor/lessphp/tests/inputs/misc.less +++ /dev/null @@ -1,93 +0,0 @@ - -@color: #fff; -@base_path: "/assets/images/"; -@images: @base_path + "test/"; -.topbar { background: url(@{images}topbar.png); } -.hello { test: empty-function(@images, 40%, to(@color)); } - -.css3 { - background-image: -webkit-gradient(linear, 0% 0%, 0% 90%, - from(#E9A000), to(#A37000)); -} - - -/** - -Here is a block comment - -**/ - - -// this is a comment - -.test, /*hello*/.world { - border: 1px solid red; // world - /* another property */ - color: url(http://mage-page.com); - string: "hello /* this is not a comment */"; - world: "// neither is this"; - string: 'hello /* this is not a comment */' /*what if this is a comment */; - world: '// neither is this' // hell world; - ; - what-/*something?*/ever: 100px; - background: url(/*no comment here*/); -} - - -.urls { - @var: "http://google.com"; - background: url(@var); - background: url(@{var}); - background: url("@{var}"); -} - -.mix(@arg) { color: @arg; } -@aaa: aaa; -@bbb: bbb; -// make sure the opening selector isn't too greedy -.cool {.mix("@{aaa}, @{bbb}")} -.cool(); - -.cool("{hello"); -.cool('{hello'); - - -// merging of mixins -.span-17 { float: left; } -.span-17 { width: 660px; } - -.x {.span-17;} - -.hi { - pre { - color: red; - } -} - -.hi { - pre { - color: blue; - } -} - -.rad { - .hi; -} - - -hello { - numbers: 1.0 0.1 .1 1.; - numbers: 1.0s 0.1s .1s 1.s; - numbers: -1.0s -0.1s -.1s -1.s; - numbers: -1.0 -0.1 -.1 -1.; -} - - -#string { - hello: 'what\'s going on here'; - hello: 'blah blag @{ blah blah'; - - join: 3434 + "hello"; - join: 3434 + hello; -} - diff --git a/library/vendor/lessphp/tests/inputs/mixin_functions.less b/library/vendor/lessphp/tests/inputs/mixin_functions.less deleted file mode 100644 index fc9d57901..000000000 --- a/library/vendor/lessphp/tests/inputs/mixin_functions.less +++ /dev/null @@ -1,40 +0,0 @@ - -@outer: 10px; -@class(@var:22px, @car: 400px + @outer) { - margin: @var; - height: @car; -} - -@group { - @f(@color) { - color: @color; - } - .cool { - border-bottom: 1px solid green; - } -} - -.class(@width:200px) { - padding: @width; -} - -body { - .class(2.0em); - @group > @f(red); - @class(10px, 10px + 2); - @group > .cool; -} - - -@lots(@a: 10px, @b: 20px, @c: 30px, @d: 40px, @e: 4px, @f:3px, @g:2px, @h: 1px) { - padding: @a @b @c @d; - margin: @e @f @g @h; -} - -.skip_args { - @class(,12px); - @lots(,,,88px,,12px); - @group > @f(red,,,,); - @group > @f(red); -} - diff --git a/library/vendor/lessphp/tests/inputs/mixin_merging.less.disable b/library/vendor/lessphp/tests/inputs/mixin_merging.less.disable deleted file mode 100644 index 6b25e421f..000000000 --- a/library/vendor/lessphp/tests/inputs/mixin_merging.less.disable +++ /dev/null @@ -1,100 +0,0 @@ - -@tester { - p, div { height: 10px; } -} - -#test1 { - div { color: red; } - @tester; -} - - -@cool { - a,b,i { width: 1px; } -} - -#test2 { - b { color: red; } - @cool; -} - -#test3 { - @cool; - b { color: red; } -} - -@cooler { - a { margin: 1px; } -} - -#test4 { - a, div, html { color: blue; } - @cooler; -} - -@hi { - img, strong { float: right; } -} - -#test5 { - img, strong { padding: 2px; } - @hi; -} - -@nested { - div, span { - a { - color: red; - } - } -} - -#test6 { - div, span { - a { - line-height: 10px; - } - } - @nested; -} - -@broken-nesting { - div, span { - strong, b { - color: red; - } - } - -} - -#test7 { - div { - strong { - margin: 1px; - } - } - @broken-nesting; -} - - -@another-nest { - a,b { - i { - color: red; - } - - s { - color: blue; - } - } -} - -#test8 { - a, b { - i,s { - background: red; - } - } - @another-nest; -} - diff --git a/library/vendor/lessphp/tests/inputs/mixins.less b/library/vendor/lessphp/tests/inputs/mixins.less deleted file mode 100644 index 166188a99..000000000 --- a/library/vendor/lessphp/tests/inputs/mixins.less +++ /dev/null @@ -1,159 +0,0 @@ - -@rounded-corners { - border-radius: 10px; -} - -.bold { - @font-size: 20px; - font-size: @font-size; - font-weight: bold; -} - -body #window { - @rounded-corners; - .bold; - line-height: @font-size * 1.5; -} - -#bundle { - .button { - display: block; - border: 1px solid black; - background-color: grey; - &:hover { background-color: white } - } -} -#header a { - color: orange; - #bundle > .button; // mixin the button class -} - -div { - @abstract { - hello: world; - b { - color: blue; - } - } - - @abstract > b; - @abstract; -} - -@poop { - big: baby; -} - -body { - div; -} - -// not using > to list mixins - -.hello { - .world { - color: blue; - } -} - -.foobar { - .hello .world; -} - - -.butter { - .this .one .isnt .found; -} - - -// arguments - -.spam(@something: 100, @dad: land) { - @wow: 23434; - foo: @arguments; - bar: @arguments; -} - -.eggs { - .spam(1px, 2px); - .spam(); -} - -.first(@one, @two, @three, @four: cool) { - cool: @arguments; -} - -#hello { - .first(one, two, three); -} - -#hello-important { - .first(one, two, three) !important; -} - -.rad(@name) { - cool: @arguments; -} - -#world { - @hello: "world"; - .rad("@{hello}"); -} - -.second(@x, @y:skip, @z: me) { - things: @arguments; -} - -#another { - .second(red, blue, green); - .second(red blue green); -} - - -.another(@x, @y:skip, @z:me) { - .cool { - color: @arguments; - } -} - -#day { - .another(one,two, three); - .another(one two three); -} - - -.to-be-important() { - color: red; - @color: red; - height: 20px; - - pre { - color: @color; - } -} - -.mix-suffix { - .to-be-important() !important; -} - - - - -#search-all { - .red() { - color:#f00 !important; - } -} - -#search-all { - .green() { - color: #0f0 !important; - } -} - -.search-test { - #search-all > .red(); - #search-all > .green(); -} - - diff --git a/library/vendor/lessphp/tests/inputs/nested.less b/library/vendor/lessphp/tests/inputs/nested.less deleted file mode 100644 index 0b62ea19b..000000000 --- a/library/vendor/lessphp/tests/inputs/nested.less +++ /dev/null @@ -1,60 +0,0 @@ -#header { - color: black; - - .navigation { - font-size: 12px; - .border { - .outside { - color: blue; - } - } - } - .logo { - width: 300px; - &:hover { text-decoration: none } - } -} - -a { b { ul { li { color: green; } } } } - -this { will { not { show { } } } } - -.cool { - div & { color: green; } - p & span { color: yellow; } -} - -another { - .cool; -} - -b { - & .something { - color: blue; - } - - &.something { - color: blue; - } -} - -.foo { - .bar, .baz { - & .qux { - display: block; - } - .qux & { - display: inline; - } - .qux & .biz { - display: none; - } - } -} - -b { - hello [x="&yeah"] { - color: red; - } -} - diff --git a/library/vendor/lessphp/tests/inputs/pattern_matching.less b/library/vendor/lessphp/tests/inputs/pattern_matching.less deleted file mode 100644 index e875473d3..000000000 --- a/library/vendor/lessphp/tests/inputs/pattern_matching.less +++ /dev/null @@ -1,167 +0,0 @@ - -.demo (light, @color) { - color: lighten(@color, 10%); -} -.demo (@_, @color) { - display: block; -} - -@switch: light; - -.class { - .demo(@switch, #888); -} - -// by arity - -.mixin () { - zero: 0; -} -.mixin (@a: 1px) { - one: 1; -} -.mixin (@a) { - one-req: 1; -} -.mixin (@a: 1px, @b: 2px) { - two: 2; -} - -.mixin (@a, @b, @c) { - three-req: 3; -} - -.mixin (@a: 1px, @b: 2px, @c: 3px) { - three: 3; -} - -.zero { - .mixin(); -} - -.one { - .mixin(1); -} - -.two { - .mixin(1, 2); -} - -.three { - .mixin(1, 2, 3); -} - -// - -.mixout ('left') { - left: 1; -} - -.mixout ('right') { - right: 1; -} - -.left { - .mixout('left'); -} -.right { - .mixout('right'); -} - -// - -.border (@side, @width) { - color: black; - .border-side(@side, @width); -} -.border-side (left, @w) { - border-left: @w; -} -.border-side (right, @w) { - border-right: @w; -} - -.border-right { - .border(right, 4px); -} -.border-left { - .border(left, 4px); -} - -// - - -.border-radius (@r) { - both: @r * 10; -} -.border-radius (@r, left) { - left: @r; -} -.border-radius (@r, right) { - right: @r; -} - -.only-right { - .border-radius(33, right); -} -.only-left { - .border-radius(33, left); -} -.left-right { - .border-radius(33); -} - -.hola(hello, @hello...) { - color: blue; -} - -#hola { - .hola(hello, world); - .hola(jello, world); -} - -.resty(@hello, @world, @the_rest...) { - padding: @hello @world; - rest: @the_rest; -} - -#nnn { - .body(10, 10, 10, 10, 10); - .body(10, 10, 10); - .body(10, 10); - .body(10); - .body(); -} - -.defaults(@aa, @bb:e343, @cc: "heah", ...) { - height: @aa; -} - -#defaults_1 { - .defaults(); - .defaults(one); - .defaults(two, one); - .defaults(three, two, one); - .defaults(four, three, two, one); -} - - -.thing() { color: green; } -.thing(...) { color: blue; } -.thing { color: red; } - -#aa { - .thing(); -} - -#bb { - .thing; -} - - -#cc { - .thing(1); -} - - - diff --git a/library/vendor/lessphp/tests/inputs/scopes.less b/library/vendor/lessphp/tests/inputs/scopes.less deleted file mode 100644 index 0ddbfac20..000000000 --- a/library/vendor/lessphp/tests/inputs/scopes.less +++ /dev/null @@ -1,40 +0,0 @@ - - -@a: 10; -@some { - @b: @a + 10; - div { - @c: @b + 10; - other { - @d: @c + 10; - world { - @e: @d + 10; - height: @e; - } - } - } -} - - -body { - @some; -} - -@some; - -.test(@x: 10) { - height: @x; - .test(@y: 11) { - height: @y; - .test(@z: 12) { - height: @z; - } - .test; - } - .test; -} - -pre { - .test; -} - diff --git a/library/vendor/lessphp/tests/inputs/selector_expressions.less b/library/vendor/lessphp/tests/inputs/selector_expressions.less deleted file mode 100644 index a16c1d23a..000000000 --- a/library/vendor/lessphp/tests/inputs/selector_expressions.less +++ /dev/null @@ -1,29 +0,0 @@ - -@color: blue; - -(~"something @{color}"), world { - color: blue; -} - -.div { - @color: red; - (3434) { - height: 100px; - } - - (~"cool @{color}") { - height: 4000px; - } -} - -.heck(@a) { color: @a+10 } - -.spanX (@index) when (@index > 0) { - (~".span@{index}") { .heck(@index) } - .spanX(@index - 1); -} -.spanX (0) {} - -.spanX (5); - - diff --git a/library/vendor/lessphp/tests/inputs/site_demos.less b/library/vendor/lessphp/tests/inputs/site_demos.less deleted file mode 100644 index 136a99ac8..000000000 --- a/library/vendor/lessphp/tests/inputs/site_demos.less +++ /dev/null @@ -1,120 +0,0 @@ -// these are the demos from the lessphp homepage - -default { - @base: 24px; - @border-color: #B2B; - - .underline { border-bottom: 1px solid green } - - #header { - color: black; - border: 1px solid @border-color + #222222; - - .navigation { - font-size: @base / 2; - a { - .underline; - } - } - .logo { - width: 300px; - &:hover { text-decoration: none } - } - } -} - -variables { - @a: 2; - @x: @a * @a; - @y: @x + 1; - @z: @x * 2 + @y; - - @nice-blue: #5B83AD; - @light-blue: @nice-blue + #111; - - @b: @a * 10; - @c: #888; - @fonts: "Trebuchet MS", Verdana, sans-serif; - - .variables { - width: @z + 1cm; // 14cm - height: @b + @x + 0px; // 24px - color: @c; - background: @light-blue; - font-family: @fonts; - } -} - -mixins { - .bordered { - border-top: dotted 1px black; - border-bottom: solid 2px black; - } - #menu a { - color: #111; - .bordered; - } - - .post a { - color: red; - .bordered; - } -} - -nested-rules { - #header { - color: black; - - .navigation { - font-size: 12px; - } - .logo { - width: 300px; - &:hover { text-decoration: none } - } - } -} - -namespaces { - #bundle { - .button { - display: block; - border: 1px solid black; - background-color: grey; - &:hover { background-color: white } - } - } - #header a { - color: orange; - #bundle > .button; // mixin the button class - } -} - -mixin-functions { - @outer: 10px; - @class(@var:22px, @car: 400px + @outer) { - margin: @var; - height: @car; - } - - @group { - @f(@color) { - color: @color; - } - .cool { - border-bottom: 1px solid green; - } - } - - .class(@width:200px) { - padding: @width; - } - - body { - .class(2.0em); - @group > @f(red); - @class(10px, 10px + 2); - @group > .cool; - } -} - diff --git a/library/vendor/lessphp/tests/inputs/test-imports/a.less b/library/vendor/lessphp/tests/inputs/test-imports/a.less deleted file mode 100644 index a00464dbb..000000000 --- a/library/vendor/lessphp/tests/inputs/test-imports/a.less +++ /dev/null @@ -1,6 +0,0 @@ -.just-a-class { background: red; } - -.some-mixin() { - height: 200px; -} - diff --git a/library/vendor/lessphp/tests/inputs/test-imports/b.less b/library/vendor/lessphp/tests/inputs/test-imports/b.less deleted file mode 100644 index 599ed3a46..000000000 --- a/library/vendor/lessphp/tests/inputs/test-imports/b.less +++ /dev/null @@ -1,12 +0,0 @@ -.just-a-class { background: blue; } - -.hello { - .some-mixin(); -} - - -@media cool { - color: red; - .some-mixin(); -} - diff --git a/library/vendor/lessphp/tests/inputs/test-imports/file1.less b/library/vendor/lessphp/tests/inputs/test-imports/file1.less deleted file mode 100644 index 658de0c53..000000000 --- a/library/vendor/lessphp/tests/inputs/test-imports/file1.less +++ /dev/null @@ -1,16 +0,0 @@ - - -/** - * This is a test import file - */ - -@colors { - div.bright { - color: red; - } - - div.sad { - color: blue; - } -} - diff --git a/library/vendor/lessphp/tests/inputs/test-imports/file2.less b/library/vendor/lessphp/tests/inputs/test-imports/file2.less deleted file mode 100644 index 2cae8dce0..000000000 --- a/library/vendor/lessphp/tests/inputs/test-imports/file2.less +++ /dev/null @@ -1,6 +0,0 @@ - -b { - color: @color; - padding: 16px; -} - diff --git a/library/vendor/lessphp/tests/inputs/test-imports/file3.less b/library/vendor/lessphp/tests/inputs/test-imports/file3.less deleted file mode 100644 index 28b643ea9..000000000 --- a/library/vendor/lessphp/tests/inputs/test-imports/file3.less +++ /dev/null @@ -1,7 +0,0 @@ - -h2 { - background: url("../images/logo.png") no-repeat; -} - -@someValue: hello-from-file-3; - diff --git a/library/vendor/lessphp/tests/inputs/test-imports/inner/file1.less b/library/vendor/lessphp/tests/inputs/test-imports/inner/file1.less deleted file mode 100644 index df654a7ee..000000000 --- a/library/vendor/lessphp/tests/inputs/test-imports/inner/file1.less +++ /dev/null @@ -1,6 +0,0 @@ - -.inner { - content: "inner/file1.less" -} - -@import "file2"; // should get the one in inner diff --git a/library/vendor/lessphp/tests/inputs/test-imports/inner/file2.less b/library/vendor/lessphp/tests/inputs/test-imports/inner/file2.less deleted file mode 100644 index f40d3c67b..000000000 --- a/library/vendor/lessphp/tests/inputs/test-imports/inner/file2.less +++ /dev/null @@ -1,4 +0,0 @@ - -.inner { - content: "inner/file2.less" -} diff --git a/library/vendor/lessphp/tests/inputs/variables.less b/library/vendor/lessphp/tests/inputs/variables.less deleted file mode 100644 index 6c4ef8fb4..000000000 --- a/library/vendor/lessphp/tests/inputs/variables.less +++ /dev/null @@ -1,45 +0,0 @@ -@a: 2; -@x: @a * @a; -@y: @x + 1; -@z: @y + @x * 2; -@m: @z % @y; - -@nice-blue: #5B83AD; -@light-blue: @nice-blue + #111; - -@rgb-color: rgb(20%, 15%, 80%); -@rgba-color: rgba(23,68,149,0.5); - -@b: @a * 10px; -@c: #888; -@fonts: "Trebuchet MS", Verdana, sans-serif; - -.variables { - width: @z + 1cm; // 14cm - height: @b + @x + 0px; // 24px - margin-top: -@b; // -20px - margin-bottom: 10 - -@b; // 30px - @d: @c + #001; - color: @d; - background: @light-blue; - font-family: @fonts; - margin: @m + 0px; // 3px - font: 10px/12px serif; - font: 120%/120% serif; -} - -.external { - color: @c; - border: 1px solid @rgb-color; - background: @rgba-color; - padding: @nonexistant + 4px; -} - -@hello: 44px; -@something: "hello"; -@cool: something; - -color: @@something; -color: @@@cool; - - diff --git a/library/vendor/lessphp/tests/outputs/accessors.css b/library/vendor/lessphp/tests/outputs/accessors.css deleted file mode 100644 index e6c01a72c..000000000 --- a/library/vendor/lessphp/tests/outputs/accessors.css +++ /dev/null @@ -1,14 +0,0 @@ -.article { color:#294366; } -.comment { - width:960px; - color:#294366; - padding:10px; -} -.wow { - height:960px; - background-color:#294366; - color:green; - padding:; - margin:; -} -.mix { font-size:10px; } \ No newline at end of file diff --git a/library/vendor/lessphp/tests/outputs/arity.css b/library/vendor/lessphp/tests/outputs/arity.css deleted file mode 100644 index 185df5cd1..000000000 --- a/library/vendor/lessphp/tests/outputs/arity.css +++ /dev/null @@ -1,25 +0,0 @@ -.one { - color: one; - color: one; -} -.two { - color: two; - color: two; -} -.three { - color: three; - color: three; -} -.multi-foo { - color: two; - color: three; - color: two; - color: three; - color: three; -} -.multi-baz { - color: two; - color: three; - color: two; - color: three; -} diff --git a/library/vendor/lessphp/tests/outputs/attributes.css b/library/vendor/lessphp/tests/outputs/attributes.css deleted file mode 100644 index fb0e176cf..000000000 --- a/library/vendor/lessphp/tests/outputs/attributes.css +++ /dev/null @@ -1,105 +0,0 @@ -* { - color: blue; -} -E { - color: blue; -} -E[foo] { - color: blue; -} -[foo] { - color: blue; -} -[foo] .helloWorld { - color: blue; -} -[foo].helloWorld { - color: blue; -} -E[foo="barbar"] { - color: blue; -} -E[foo~="hello#$@%@$#^"] { - color: blue; -} -E[foo^="color: green;"] { - color: blue; -} -E[foo$="239023"] { - color: blue; -} -E[foo*="29302"] { - color: blue; -} -E[foo|="239032"] { - color: blue; -} -E:root { - color: blue; -} -E:nth-child(odd) { - color: blue; -} -E:nth-child(2n+1) { - color: blue; -} -E:nth-child(5) { - color: blue; -} -E:nth-last-child(-n+2) { - color: blue; -} -E:nth-of-type(2n) { - color: blue; -} -E:nth-last-of-type(n) { - color: blue; -} -E:first-child { - color: blue; -} -E:last-child { - color: blue; -} -E:first-of-type { - color: blue; -} -E:last-of-type { - color: blue; -} -E:only-child { - color: blue; -} -E:only-of-type { - color: blue; -} -E:empty { - color: blue; -} -E:lang(en) { - color: blue; -} -E::first-line { - color: blue; -} -E::before { - color: blue; -} -E#id { - color: blue; -} -E:not(:link) { - color: blue; -} -E F { - color: blue; -} -E > F { - color: blue; -} -E + F { - color: blue; -} -E ~ F { - color: blue; -} diff --git a/library/vendor/lessphp/tests/outputs/builtins.css b/library/vendor/lessphp/tests/outputs/builtins.css deleted file mode 100644 index c8f74d609..000000000 --- a/library/vendor/lessphp/tests/outputs/builtins.css +++ /dev/null @@ -1,47 +0,0 @@ -body { - color: "hello world"; - height: 5.1666666666667; - height: 5px; - height: 6px; - width: 0.66666666666667; - width: 1; - width: 0; - width: 1; - width: 3px; - color: #ff112233; - color: #992c3742; - color: #992c3742; -} -format { - format: "rgb(32, 128, 64)"; - format-string: "hello world"; - format-multiple: "hello earth 2"; - format-url-encode: 'red is %A'; - eformat: rgb(32, 128, 64); -} -#functions { - str: true; - str: false; - num: true; - num: true; - num: true; - num: false; - col: true; - col: false; - col: true; - col: true; - key: true; - key: false; - px: true; - px: false; - per: true; - per: false; - em: true; - em: false; -} -#unit { - height: 10; - height: 10s; - height: 10em; - height: 7.407%; -} diff --git a/library/vendor/lessphp/tests/outputs/colors.css b/library/vendor/lessphp/tests/outputs/colors.css deleted file mode 100644 index 517f0da32..000000000 --- a/library/vendor/lessphp/tests/outputs/colors.css +++ /dev/null @@ -1,102 +0,0 @@ -body { - color: #ff0000; - color: #ffffff; - color: #000000; - color: #996d33; - color: rgba(153,109,51,0.3); - lighten: #ffffff; - lighten: #7c8df2; - lighten: rgba(222,140,129,0.5); - darken: #d6d6d6; - darken: #0d1e81; - darken: rgba(18,42,185,0.5); - saturate: #f1eded; - saturate: #0025fe; - saturate: rgba(10,44,244,0.5); - desaturate: #efefef; - desaturate: #3349cb; - desaturate: rgba(36,62,218,0.5); - spin: #efefef; - spin: #2d17e7; - spin: rgba(59,23,231,0.5); - spin: #efefef; - spin: #1769e7; - spin: rgba(23,119,231,0.5); - one: #abcdef; - one: #abcdef; - two: rgba(2,159,35,0.9); - two: rgba(2,159,35,0.9); - three: rgba(1,2,3,0.6); - three: rgba(1,2,3,0.6); - four: rgba(1,2,3,0); - four: rgba(1,2,3,0); - hue: 282; - sat: 33; - lit: 12; - what: #dff1da; - zero: #343434; - zero: #003468; - zero: #000000; - zero: #ffffff; - zero: #000000; - zero: #ffffff; - zero: #ffffff; - zero: #ffffff; - zero: #1d5612; - zero: #56124b; - zero: #000000; - zero: #ffffff; -} -alpha { - g: 0; - g: 1; -} -fade { - f: rgba(255,0,0,0.5); - f: rgba(255,255,255,0.2); - f: rgba(34,23,64,0.5); -} -.mix { - color: #808080; - color: rgba(6,3,2,-0.25); -} -.contrast { - color: #0000ff; - color: #ff0000; -} -.percent { - per: 50%; -} -.colorz { - color: #ebebeb; - color: #ff9100; - color: #000000; -} -body { - start: #fcf8e3; - spin: #fcf4e3; - chained: #fbeed5; - direct: #fbefd5; -} -pre { - spin: #f2dee1; -} -dd { - background-color: #f5f5f5; -} -.ops { - c: #4d0000; - c: #004000; - c: #020002; - c: #ffffff; - c: #fb8173; - c: 132 / #ff0000; - c: 132 - #ff0000; - c: 132- #ff0000; -} -.transparent { - r: 0; - g: 0; - b: 0; - a: 0; -} diff --git a/library/vendor/lessphp/tests/outputs/compile_on_mixin.css b/library/vendor/lessphp/tests/outputs/compile_on_mixin.css deleted file mode 100644 index 318526a5e..000000000 --- a/library/vendor/lessphp/tests/outputs/compile_on_mixin.css +++ /dev/null @@ -1,29 +0,0 @@ -body { - height: 22px; -} -body ul { - height: 20px; -} -body ul li { - height: 10px; -} -body ul li div span, -body ul li link { - margin: 10px; - color: red; -} -body ul div, -body ul p { - border: 1px; -} -body ul div.hello, -body ul p.hello { - color: green; -} -body ul div :what, -body ul p :what { - color: blue; -} -body ul a b { - color: blue; -} diff --git a/library/vendor/lessphp/tests/outputs/directives.css b/library/vendor/lessphp/tests/outputs/directives.css deleted file mode 100644 index 05a60a716..000000000 --- a/library/vendor/lessphp/tests/outputs/directives.css +++ /dev/null @@ -1,15 +0,0 @@ -@charset "utf-8"; -@-moz-document url-prefix() { - div { - color: red; - } -} -@page :left { - margin-left: 4cm; -} -@page :right { - margin-left: 3cm; -} -@page { - margin: 2cm; -} diff --git a/library/vendor/lessphp/tests/outputs/escape.css b/library/vendor/lessphp/tests/outputs/escape.css deleted file mode 100644 index a95cdf545..000000000 --- a/library/vendor/lessphp/tests/outputs/escape.css +++ /dev/null @@ -1,16 +0,0 @@ -body { - border: this is simple; - border: this; - border: this is simple; - border: 1232; - border: world; - border: onemore; - border: ; - line-height: eating rice; - line-height: string cheese; - line-height: a b c string me d e f; - line-height: string world; -} -.class { - filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image.png'); -} diff --git a/library/vendor/lessphp/tests/outputs/font_family.css b/library/vendor/lessphp/tests/outputs/font_family.css deleted file mode 100644 index fc260fd4d..000000000 --- a/library/vendor/lessphp/tests/outputs/font_family.css +++ /dev/null @@ -1,17 +0,0 @@ -@font-face { - font-family: Graublau Sans Web; - src: url(fonts/GraublauWeb.otf) format("opentype"); -} -@font-face { - font-family: Gentium; - src: url('fonts/Gentium.ttf'); -} -@font-face { - font-family: Gentium; - src: url("fonts/GentiumItalic.ttf"); - font-style: italic; -} -h2 { - font-family: Gentium; - crazy: maroon; -} diff --git a/library/vendor/lessphp/tests/outputs/guards.css b/library/vendor/lessphp/tests/outputs/guards.css deleted file mode 100644 index 5a453709e..000000000 --- a/library/vendor/lessphp/tests/outputs/guards.css +++ /dev/null @@ -1,27 +0,0 @@ -dd { - color: yellow; -} -b { - color: red; - color: blue; - color: blue; -} -img { - color: green; - color: teal; -} -body { - color: purple; - color: silver; - color: purple; -} -div { - color: blue; -} -link { - color: true red; - color: true #fff; - color: true #fffddd; - color: true #000000; - color: true rgba(0,0,0,0.34); -} diff --git a/library/vendor/lessphp/tests/outputs/hacks.css b/library/vendor/lessphp/tests/outputs/hacks.css deleted file mode 100644 index b8327eb51..000000000 --- a/library/vendor/lessphp/tests/outputs/hacks.css +++ /dev/null @@ -1,4 +0,0 @@ -:root .alert-message, -:root .btn { - border-radius: 0 \0; -} diff --git a/library/vendor/lessphp/tests/outputs/hi.css b/library/vendor/lessphp/tests/outputs/hi.css deleted file mode 100644 index 3bffcf0b0..000000000 --- a/library/vendor/lessphp/tests/outputs/hi.css +++ /dev/null @@ -1,3 +0,0 @@ -div:before { - content: "hi!"; -} diff --git a/library/vendor/lessphp/tests/outputs/ie.css b/library/vendor/lessphp/tests/outputs/ie.css deleted file mode 100644 index 4e005e55c..000000000 --- a/library/vendor/lessphp/tests/outputs/ie.css +++ /dev/null @@ -1,9 +0,0 @@ -foo { - filter: progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr=#c0ff3300,endColorstr=#ff000000); - filter: progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr=#c0ff3300,endColorstr=#ff000000); -} -foo { - filter: alpha(opacity=20); - filter: alpha(opacity=20,enabled=true); - filter: blaznicate(foo=bar,baz=bang bip,bart=#fa4600); -} diff --git a/library/vendor/lessphp/tests/outputs/import.css b/library/vendor/lessphp/tests/outputs/import.css deleted file mode 100644 index 1998692ee..000000000 --- a/library/vendor/lessphp/tests/outputs/import.css +++ /dev/null @@ -1,61 +0,0 @@ -@import "not-found"; -@import "something.css" media; -@import url("something.css") media; -@import url(something.css) media, screen, print; -b { - color: maroon; - padding: 16px; -} -body { - line-height: 10em; -} -body div.bright { - color: red; -} -body div.sad { - color: blue; -} -div b { - color: fuchsia; - padding: 16px; -} -.one { - color: blue; -} -.one h2 { - background: url("../images/logo.png") no-repeat; -} -.two h2 { - background: url("../images/logo.png") no-repeat; -} -#merge-import-mixins .just-a-class { - background: red; -} -#merge-import-mixins .just-a-class { - background: blue; -} -#merge-import-mixins .hello { - height: 200px; -} -@media cool { - #merge-import-mixins { - color: red; - height: 200px; - } -} -#merge-import-mixins div { - background: red; - background: blue; -} -.inner { - content: "inner/file1.less"; -} -.inner { - content: "inner/file2.less"; -} -pre { - color: hello-from-file-3; -} -h2 { - background: url("../images/logo.png") no-repeat; -} diff --git a/library/vendor/lessphp/tests/outputs/interpolation.css b/library/vendor/lessphp/tests/outputs/interpolation.css deleted file mode 100644 index 40873e01b..000000000 --- a/library/vendor/lessphp/tests/outputs/interpolation.css +++ /dev/null @@ -1,17 +0,0 @@ -div { - color: yes; - color: yes; - color: okay; -} -10"yeah" { - color: blue; -} -10 { - color: blue; -} -hello world 10 { - color: red; -} -#"yeah" { - color: "hello 10"; -} diff --git a/library/vendor/lessphp/tests/outputs/keyframes.css b/library/vendor/lessphp/tests/outputs/keyframes.css deleted file mode 100644 index cf62be113..000000000 --- a/library/vendor/lessphp/tests/outputs/keyframes.css +++ /dev/null @@ -1,48 +0,0 @@ -@keyframes 'bounce' { - from { - top: 100px; - animation-timing-function: ease-out; - } - 25% { - top: 50px; - animation-timing-function: ease-in; - } - 50% { - top: 100px; - animation-timing-function: ease-out; - } - 75% { - top: 75px; - animation-timing-function: ease-in; - } - to { - top: 100px; - } -} -@-webkit-keyframes flowouttoleft { - 0% { - -webkit-transform: translateX(0) scale(1); - } - 60%, - 70% { - -webkit-transform: translateX(0) scale(.7); - } - 100% { - -webkit-transform: translateX(-100%) scale(.7); - } -} -div { - animation-name: 'diagonal-slide'; - animation-duration: 5s; - animation-iteration-count: 10; -} -@keyframes 'diagonal-slide' { - from { - left: 0; - top: 0; - } - to { - left: 100px; - top: 100px; - } -} diff --git a/library/vendor/lessphp/tests/outputs/math.css b/library/vendor/lessphp/tests/outputs/math.css deleted file mode 100644 index ce5e7172c..000000000 --- a/library/vendor/lessphp/tests/outputs/math.css +++ /dev/null @@ -1,69 +0,0 @@ -.unary { - sub: 10 -5; -} -.spaces { - sub: 5; - sub: 5; - add: 15; - add: 15; - div: 2; - mul: 50; - mul: 50; -} -.supress-division { - border-radius: 10px/10px; - border-radius: 10px/10px; - border-radius: hello(10px/10px) world; - font: 10px/30 sans-serif; - font: 10px/20px sans-serif; - font: 10px/20px sans-serif; - border-radius: 0 15px 15px 15px/0 50% 50% 50%; -} -.parens { - sub: 5; - add: 15; - div: 2; - div: 2; - mul: 50; -} -.keyword-names { - height: "hello" 25; -} -.negation { - hello: -1px; - hello: -1px; - hello: -10; -} -.test { - single: 5; - single: 10; - single: 10; - parens: 10 -2; - math: 20; - math: 20; - width: 71; - height: 6; - padding: 6px 1em 2px 2; - padding: 8 4 4 4px; - width: 96; - height: 113; - margin: 12; -} -.percents { - color: 1000%; - color: 1000%; - color: 100%; - color: 1000px; - color: 1000%; - color: 30%; - color: 10%; - color: 2%; -} -.misc { - x: 40px; - y: 40em; -} -.cond { - y: false; - y: true; -} diff --git a/library/vendor/lessphp/tests/outputs/media.css b/library/vendor/lessphp/tests/outputs/media.css deleted file mode 100644 index 99da8c315..000000000 --- a/library/vendor/lessphp/tests/outputs/media.css +++ /dev/null @@ -1,70 +0,0 @@ -@media screen,3D { - P { - color: green; - } -} -@media print { - body { - font-size: 10pt; - } -} -@media screen { - body { - font-size: 13px; - } -} -@media screen,print { - body { - line-height: 1.2; - } -} -@media all and (min-width: 0px) { - body { - line-height: 1.2; - } -} -@media all and (min-width: 0) { - body { - line-height: 1.2; - } -} -@media screen and (min-width: 102.5em) and (max-width: 117.9375em),screen and (min-width: 150em) { - body { - color: blue; - } -} -@media screen and (min-height: 110px) { - body { - color: red; - } -} -@media screen and (height: 100px) and (width: 110px),(size: 120px) { - body { - color: red; - } -} -@media test { - div { - height: 20px; - } -} -@media test and (hello) { - div { - color: red; - } - div pre { - color: orange; - } -} -@media yeah { - @page { - @media cool { - color: red; - } - } -} -@media (max-width: 599px) { - .helloworld { - color: blue; - } -} diff --git a/library/vendor/lessphp/tests/outputs/misc.css b/library/vendor/lessphp/tests/outputs/misc.css deleted file mode 100644 index 94ec8ffe1..000000000 --- a/library/vendor/lessphp/tests/outputs/misc.css +++ /dev/null @@ -1,63 +0,0 @@ -color: "aaa, bbb"; -.topbar { - background: url(/assets/images/test/topbar.png); -} -.hello { - test: empty-function("/assets/images/test/",40%,to(#fff)); -} -.css3 { - background-image: -webkit-gradient(linear,0% 0%,0% 90%,from(#E9A000),to(#A37000)); -} -.test, -.world { - border: 1px solid red; - color: url(http://mage-page.com); - string: "hello /* this is not a comment */"; - world: "// neither is this"; - string: 'hello /* this is not a comment */'; - world: '// neither is this'; - what-ever: 100px; - background: url(/*no comment here*/); -} -.urls { - background: url("http://google.com"); - background: url(http://google.com); - background: url("http://google.com"); -} -.cool { - color: "aaa, bbb"; -} -.span-17 { - float: left; -} -.span-17 { - width: 660px; -} -.x { - float: left; - width: 660px; -} -.hi pre { - color: red; -} -.hi pre { - color: blue; -} -.rad pre { - color: red; -} -.rad pre { - color: blue; -} -hello { - numbers: 1.0 0.1 .1 1.; - numbers: 1.0s 0.1s .1s 1.s; - numbers: -1s -0.1s -0.1s -1s; - numbers: -1 -0.1 -0.1 -1; -} -#string { - hello: 'what\'s going on here'; - hello: 'blah blag @{ blah blah'; - join: "3434hello"; - join: 3434hello; -} diff --git a/library/vendor/lessphp/tests/outputs/mixin_functions.css b/library/vendor/lessphp/tests/outputs/mixin_functions.css deleted file mode 100644 index c7e584dc5..000000000 --- a/library/vendor/lessphp/tests/outputs/mixin_functions.css +++ /dev/null @@ -1,14 +0,0 @@ -body { - padding: 2.0em; - color: red; - margin: 10px; - height: 12px; - border-bottom: 1px solid green; -} -.skip_args { - margin: 22px; - height: 12px; - padding: 10px 20px 30px 88px; - margin: 4px 12px 2px 1px; - color: red; -} diff --git a/library/vendor/lessphp/tests/outputs/mixin_merging.css b/library/vendor/lessphp/tests/outputs/mixin_merging.css deleted file mode 100644 index 9ec360c21..000000000 --- a/library/vendor/lessphp/tests/outputs/mixin_merging.css +++ /dev/null @@ -1,42 +0,0 @@ -#test1 div { - color:red; - height:10px; -} -#test1 p { height:10px; } -#test2 b { - color:red; - width:1px; -} -#test2 a, #test2 i { width:1px; } -#test3 a, #test3 i { width:1px; } -#test3 b { - width:1px; - color:red; -} -#test4 a { - color:blue; - margin:1px; -} -#test4 div, #test4 html { color:blue; } -#test5 img, #test5 strong { - padding:2px; - float:right; -} -#test6 div a, #test6 span a { - line-height:10px; - color:red; -} -#test7 div strong { - margin:1px; - color:red; -} -#test7 div b { color:red; } -#test7 span strong, #test7 span b { color:red; } -#test8 a i, #test8 b i { - background:red; - color:red; -} -#test8 a s, #test8 b s { - background:red; - color:blue; -} \ No newline at end of file diff --git a/library/vendor/lessphp/tests/outputs/mixins.css b/library/vendor/lessphp/tests/outputs/mixins.css deleted file mode 100644 index 91e9bc421..000000000 --- a/library/vendor/lessphp/tests/outputs/mixins.css +++ /dev/null @@ -1,83 +0,0 @@ -.bold { - font-size: 20px; - font-weight: bold; -} -body #window { - border-radius: 10px; - font-size: 20px; - font-weight: bold; - line-height: 30px; -} -#bundle .button { - display: block; - border: 1px solid black; - background-color: grey; -} -#bundle .button:hover { - background-color: white; -} -#header a { - color: orange; - display: block; - border: 1px solid black; - background-color: grey; -} -#header a:hover { - background-color: white; -} -div { - color: blue; - hello: world; -} -div b { - color: blue; -} -body { - color: blue; - hello: world; -} -body b { - color: blue; -} -.hello .world { - color: blue; -} -.foobar { - color: blue; -} -.eggs { - foo: 1px 2px; - bar: 1px 2px; - foo: 100 land; - bar: 100 land; -} -#hello { - cool: one two three cool; -} -#hello-important { - cool: one two three cool !important; -} -#world { - cool: "world"; -} -#another { - things: red blue green; - things: red blue green skip me; -} -#day .cool { - color: one two three; -} -#day .cool { - color: one two three skip me; -} -.mix-suffix { - color: red !important; - height: 20px !important; -} -.mix-suffix pre { - color: red; -} -.search-test { - color: #f00 !important; - color: #0f0 !important; -} diff --git a/library/vendor/lessphp/tests/outputs/nested.css b/library/vendor/lessphp/tests/outputs/nested.css deleted file mode 100644 index 454dcfcc2..000000000 --- a/library/vendor/lessphp/tests/outputs/nested.css +++ /dev/null @@ -1,51 +0,0 @@ -#header { - color: black; -} -#header .navigation { - font-size: 12px; -} -#header .navigation .border .outside { - color: blue; -} -#header .logo { - width: 300px; -} -#header .logo:hover { - text-decoration: none; -} -a b ul li { - color: green; -} -div .cool { - color: green; -} -p .cool span { - color: yellow; -} -div another { - color: green; -} -p another span { - color: yellow; -} -b .something { - color: blue; -} -b.something { - color: blue; -} -.foo .bar .qux, -.foo .baz .qux { - display: block; -} -.qux .foo .bar, -.qux .foo .baz { - display: inline; -} -.qux .foo .bar .biz, -.qux .foo .baz .biz { - display: none; -} -b hello [x="&yeah"] { - color: red; -} diff --git a/library/vendor/lessphp/tests/outputs/nesting.css b/library/vendor/lessphp/tests/outputs/nesting.css deleted file mode 100644 index 908c1d814..000000000 --- a/library/vendor/lessphp/tests/outputs/nesting.css +++ /dev/null @@ -1,6 +0,0 @@ -#header .navigation .border .outside { color:blue; } -#header .navigation { font-size:12px; } -#header .logo:hover { text-decoration:none; } -#header .logo { width:300px; } -#header { color:black; } -a b ul li { color:green; } \ No newline at end of file diff --git a/library/vendor/lessphp/tests/outputs/pattern_matching.css b/library/vendor/lessphp/tests/outputs/pattern_matching.css deleted file mode 100644 index 215371b0a..000000000 --- a/library/vendor/lessphp/tests/outputs/pattern_matching.css +++ /dev/null @@ -1,72 +0,0 @@ -.class { - color: #a2a2a2; - display: block; -} -.zero { - zero: 0; - one: 1; - two: 2; - three: 3; -} -.one { - one: 1; - one-req: 1; - two: 2; - three: 3; -} -.two { - two: 2; - three: 3; -} -.three { - three-req: 3; - three: 3; -} -.left { - left: 1; -} -.right { - right: 1; -} -.border-right { - color: black; - border-right: 4px; -} -.border-left { - color: black; - border-left: 4px; -} -.only-right { - right: 33; -} -.only-left { - left: 33; -} -.left-right { - both: 330; -} -#hola { - color: blue; -} -#defaults_1 { - height: one; - height: two; - height: three; - height: four; -} -.thing { - color: red; -} -#aa { - color: green; - color: blue; - color: red; -} -#bb { - color: green; - color: blue; - color: red; -} -#cc { - color: blue; -} diff --git a/library/vendor/lessphp/tests/outputs/scopes.css b/library/vendor/lessphp/tests/outputs/scopes.css deleted file mode 100644 index ea2a45731..000000000 --- a/library/vendor/lessphp/tests/outputs/scopes.css +++ /dev/null @@ -1,11 +0,0 @@ -body div other world { - height: 50; -} -div other world { - height: 50; -} -pre { - height: 10; - height: 11; - height: 12; -} diff --git a/library/vendor/lessphp/tests/outputs/selector_expressions.css b/library/vendor/lessphp/tests/outputs/selector_expressions.css deleted file mode 100644 index 197c2d2ba..000000000 --- a/library/vendor/lessphp/tests/outputs/selector_expressions.css +++ /dev/null @@ -1,25 +0,0 @@ -something blue, -world { - color: blue; -} -.div 3434 { - height: 100px; -} -.div cool red { - height: 4000px; -} -.span5 { - color: 15; -} -.span4 { - color: 14; -} -.span3 { - color: 13; -} -.span2 { - color: 12; -} -.span1 { - color: 11; -} diff --git a/library/vendor/lessphp/tests/outputs/site_demos.css b/library/vendor/lessphp/tests/outputs/site_demos.css deleted file mode 100644 index 3428ad3aa..000000000 --- a/library/vendor/lessphp/tests/outputs/site_demos.css +++ /dev/null @@ -1,76 +0,0 @@ -default .underline { - border-bottom: 1px solid green; -} -default #header { - color: black; - border: 1px solid #dd44dd; -} -default #header .navigation { - font-size: 12px; -} -default #header .navigation a { - border-bottom: 1px solid green; -} -default #header .logo { - width: 300px; -} -default #header .logo:hover { - text-decoration: none; -} -variables .variables { - width: 14cm; - height: 24px; - color: #888; - background: #6c94be; - font-family: "Trebuchet MS", Verdana, sans-serif; -} -mixins .bordered { - border-top: dotted 1px black; - border-bottom: solid 2px black; -} -mixins #menu a { - color: #111; - border-top: dotted 1px black; - border-bottom: solid 2px black; -} -mixins .post a { - color: red; - border-top: dotted 1px black; - border-bottom: solid 2px black; -} -nested-rules #header { - color: black; -} -nested-rules #header .navigation { - font-size: 12px; -} -nested-rules #header .logo { - width: 300px; -} -nested-rules #header .logo:hover { - text-decoration: none; -} -namespaces #bundle .button { - display: block; - border: 1px solid black; - background-color: grey; -} -namespaces #bundle .button:hover { - background-color: white; -} -namespaces #header a { - color: orange; - display: block; - border: 1px solid black; - background-color: grey; -} -namespaces #header a:hover { - background-color: white; -} -mixin-functions body { - padding: 2.0em; - color: red; - margin: 10px; - height: 12px; - border-bottom: 1px solid green; -} diff --git a/library/vendor/lessphp/tests/outputs/variables.css b/library/vendor/lessphp/tests/outputs/variables.css deleted file mode 100644 index 70c0a30b2..000000000 --- a/library/vendor/lessphp/tests/outputs/variables.css +++ /dev/null @@ -1,20 +0,0 @@ -color: 44px; -color: 44px; -.variables { - width: 14cm; - height: 24px; - margin-top: -20px; - margin-bottom: 30px; - color: #888899; - background: #6c94be; - font-family: "Trebuchet MS", Verdana, sans-serif; - margin: 3px; - font: 10px/12px serif; - font: 120%/120% serif; -} -.external { - color: #888; - border: 1px solid #3326cc; - background: rgba(23,68,149,0.5); - padding: 4px; -} diff --git a/library/vendor/lessphp/tests/sort.php b/library/vendor/lessphp/tests/sort.php deleted file mode 100644 index 70b907eac..000000000 --- a/library/vendor/lessphp/tests/sort.php +++ /dev/null @@ -1,57 +0,0 @@ -coerceColor($value); - } - - return parent::compileValue($value); - } -} - -class SortingFormatter extends lessc_formatter_lessjs { - function sortKey($block) { - if (!isset($block->sortKey)) { - sort($block->selectors, SORT_STRING); - $block->sortKey = implode(",", $block->selectors); - } - - return $block->sortKey; - } - - function sortBlock($block) { - usort($block->children, function($a, $b) { - $sort = strcmp($this->sortKey($a), $this->sortKey($b)); - if ($sort == 0) { - // TODO - } - return $sort; - }); - - } - - function block($block) { - $this->sortBlock($block); - return parent::block($block); - } - -} - -$less = new lesscNormalized(); -$less->setFormatter(new SortingFormatter); -echo $less->parse(file_get_contents($fname)); - From c93564c7974a862ebd891d7c772ed24bb7652a7d Mon Sep 17 00:00:00 2001 From: Thomas Gelf Date: Fri, 9 May 2014 10:57:21 +0000 Subject: [PATCH 06/14] Put focus into search field on initial page load fixes #6170 --- application/layouts/scripts/parts/navigation.phtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/layouts/scripts/parts/navigation.phtml b/application/layouts/scripts/parts/navigation.phtml index 7a7e9fb89..391b4d1dd 100644 --- a/application/layouts/scripts/parts/navigation.phtml +++ b/application/layouts/scripts/parts/navigation.phtml @@ -14,7 +14,7 @@ $menu = Menu::fromConfig(); ?>