diff --git a/NEWS b/NEWS index 5481ccfc..7a1a06e9 100644 --- a/NEWS +++ b/NEWS @@ -68,7 +68,8 @@ NEWS ( CHANGELOG and HISTORY ) HTMLPurifier . Smoketests now cleanup after magic quotes . Generator now can output comments (however, comments are still stripped from HTML Purifier output) -. substr_count PHP4 compatibility cludge removed +. HTMLPurifier_ConfigSchema->validate() deprecated in favor of + HTMLPurifier_VarParser->parse() 3.0.0, released 2008-01-06 # HTML Purifier is PHP 5 only! The 2.1.x branch will be maintained diff --git a/library/HTMLPurifier.includes.php b/library/HTMLPurifier.includes.php index 5daef582..87adc0ad 100644 --- a/library/HTMLPurifier.includes.php +++ b/library/HTMLPurifier.includes.php @@ -66,6 +66,8 @@ require 'HTMLPurifier/URIFilter.php'; require 'HTMLPurifier/URIParser.php'; require 'HTMLPurifier/URIScheme.php'; require 'HTMLPurifier/URISchemeRegistry.php'; +require 'HTMLPurifier/VarParser.php'; +require 'HTMLPurifier/VarParserException.php'; require 'HTMLPurifier/AttrDef/CSS.php'; require 'HTMLPurifier/AttrDef/Enum.php'; require 'HTMLPurifier/AttrDef/Integer.php'; diff --git a/library/HTMLPurifier/Config.php b/library/HTMLPurifier/Config.php index 3e85c42a..c7424da4 100644 --- a/library/HTMLPurifier/Config.php +++ b/library/HTMLPurifier/Config.php @@ -46,6 +46,11 @@ class HTMLPurifier_Config */ protected $conf; + /** + * Parser for variables + */ + protected $parser; + /** * Reference HTMLPurifier_ConfigSchema for value checking * @note This is public for introspective purposes. Please don't @@ -70,6 +75,7 @@ class HTMLPurifier_Config public function __construct(&$definition) { $this->conf = $definition->defaults; // set up, copy in defaults $this->def = $definition; // keep a copy around for checking + $this->parser = new HTMLPurifier_VarParser(); } /** @@ -200,11 +206,16 @@ class HTMLPurifier_Config $value, true); return; } - $value = $this->def->validate( - $value, - $type = $this->def->info[$namespace][$key]->type, - $this->def->info[$namespace][$key]->allow_null - ); + try { + $value = $this->parser->parse( + $value, + $type = $this->def->info[$namespace][$key]->type, + $this->def->info[$namespace][$key]->allow_null + ); + } catch (HTMLPurifier_VarParserException $e) { + trigger_error('Value for ' . "$namespace.$key" . ' is of invalid type, should be ' . $type, E_USER_WARNING); + return; + } if (is_string($value)) { // resolve value alias if defined if (isset($this->def->info[$namespace][$key]->aliases[$value])) { @@ -219,10 +230,6 @@ class HTMLPurifier_Config } } } - if ($this->def->isError($value)) { - trigger_error('Value for ' . "$namespace.$key" . ' is of invalid type, should be ' . $type, E_USER_WARNING); - return; - } $this->conf[$namespace][$key] = $value; // reset definitions if the directives they depend on changed diff --git a/library/HTMLPurifier/ConfigSchema.php b/library/HTMLPurifier/ConfigSchema.php index 48177624..0c219e6b 100644 --- a/library/HTMLPurifier/ConfigSchema.php +++ b/library/HTMLPurifier/ConfigSchema.php @@ -28,6 +28,11 @@ class HTMLPurifier_ConfigSchema { */ static protected $singleton; + /** + * Variable parser. + */ + protected $parser; + /** * Lookup table of allowed types. */ @@ -45,6 +50,10 @@ class HTMLPurifier_ConfigSchema { 'mixed' => 'Mixed' ); + public function __construct() { + $this->parser = new HTMLPurifier_VarParser(); + } + /** * Unserializes the default ConfigSchema. */ @@ -127,8 +136,9 @@ class HTMLPurifier_ConfigSchema { E_USER_ERROR); return; } - $default = $this->validate($default, $type, $allow_null); - if ($this->isError($default)) { + try { + $default = $this->parser->parse($default, $type, $allow_null); + } catch (HTMLPurifier_VarParserException $e) { trigger_error('Default value does not match directive type', E_USER_ERROR); return; @@ -298,99 +308,6 @@ class HTMLPurifier_ConfigSchema { $this->info[$new_namespace][$new_name]->directiveAliases[] = "$namespace.$name"; } - /** - * Validate a variable according to type. Return null if invalid. - * @todo Consider making protected - */ - public function validate($var, $type, $allow_null = false) { - if (!isset($this->types[$type])) { - trigger_error('Invalid type', E_USER_ERROR); - return; - } - if ($allow_null && $var === null) return null; - switch ($type) { - case 'mixed': - //if (is_string($var)) $var = unserialize($var); - return $var; - case 'istring': - case 'string': - case 'text': // no difference, just is longer/multiple line string - case 'itext': - if (!is_string($var)) break; - if ($type === 'istring' || $type === 'itext') $var = strtolower($var); - return $var; - case 'int': - if (is_string($var) && ctype_digit($var)) $var = (int) $var; - elseif (!is_int($var)) break; - return $var; - case 'float': - if (is_string($var) && is_numeric($var)) $var = (float) $var; - elseif (!is_float($var)) break; - return $var; - case 'bool': - if (is_int($var) && ($var === 0 || $var === 1)) { - $var = (bool) $var; - } elseif (is_string($var)) { - if ($var == 'on' || $var == 'true' || $var == '1') { - $var = true; - } elseif ($var == 'off' || $var == 'false' || $var == '0') { - $var = false; - } else { - break; - } - } elseif (!is_bool($var)) break; - return $var; - case 'list': - case 'hash': - case '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 (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); - } else { - $var = preg_split('/(,|[\n\r]+)/', $var); - } - // remove spaces - foreach ($var as $i => $j) $var[$i] = trim($j); - if ($type === 'hash') { - // key:value,key2:value2 - $nvar = array(); - foreach ($var as $keypair) { - $c = explode(':', $keypair, 2); - if (!isset($c[1])) continue; - $nvar[$c[0]] = $c[1]; - } - $var = $nvar; - } - } - if (!is_array($var)) break; - $keys = array_keys($var); - if ($keys === array_keys($keys)) { - if ($type == 'list') return $var; - elseif ($type == 'lookup') { - $new = array(); - foreach ($var as $key) { - $new[$key] = true; - } - return $new; - } else break; - } - if ($type === 'lookup') { - foreach ($var as $key => $value) { - $var[$key] = true; - } - } - return $var; - } - $error = new HTMLPurifier_Error(); - return $error; - } - /** * Takes an absolute path and munges it into a more manageable relative path * @todo Consider making protected @@ -414,6 +331,13 @@ class HTMLPurifier_ConfigSchema { if (!($var instanceof HTMLPurifier_Error)) return false; return true; } + + /** @deprecated, use HTMLPurifier_VarParser->parse() */ + public function validate($a, $b, $c = false) { + trigger_error("HTMLPurifier_ConfigSchema->validate deprecated, use HTMLPurifier_VarParser->parse instead", E_USER_NOTICE); + return $this->parser->parse($a, $b, $c); + } + } diff --git a/library/HTMLPurifier/ConfigSchema/schema.ser b/library/HTMLPurifier/ConfigSchema/schema.ser index cc8baa26..1eaeeea9 100644 --- a/library/HTMLPurifier/ConfigSchema/schema.ser +++ b/library/HTMLPurifier/ConfigSchema/schema.ser @@ -1 +1 @@ -O:25:"HTMLPurifier_ConfigSchema":4:{s:8:"defaults";a:11:{s:4:"Attr";a:11:{s:19:"AllowedFrameTargets";a:0:{}s:10:"AllowedRel";a:0:{}s:10:"AllowedRev";a:0:{}s:19:"DefaultInvalidImage";s:0:"";s:22:"DefaultInvalidImageAlt";s:13:"Invalid image";s:14:"DefaultTextDir";s:3:"ltr";s:8:"EnableID";b:0;s:11:"IDBlacklist";a:0:{}s:17:"IDBlacklistRegexp";N;s:8:"IDPrefix";s:0:"";s:13:"IDPrefixLocal";s:0:"";}s:10:"AutoFormat";a:4:{s:13:"AutoParagraph";b:0;s:6:"Custom";a:0:{}s:7:"Linkify";b:0;s:15:"PurifierLinkify";b:0;}s:15:"AutoFormatParam";a:1:{s:21:"PurifierLinkifyDocURL";s:3:"#%s";}s:3:"CSS";a:4:{s:14:"AllowImportant";b:0;s:11:"AllowTricky";b:0;s:13:"DefinitionRev";i:1;s:11:"Proprietary";b:0;}s:5:"Cache";a:2:{s:14:"DefinitionImpl";s:10:"Serializer";s:14:"SerializerPath";N;}s:4:"Core";a:15:{s:17:"AggressivelyFixLt";b:0;s:13:"CollectErrors";b:0;s:13:"ColorKeywords";a:17:{s:6:"maroon";s:7:"#800000";s:3:"red";s:7:"#FF0000";s:6:"orange";s:7:"#FFA500";s:6:"yellow";s:7:"#FFFF00";s:5:"olive";s:7:"#808000";s:6:"purple";s:7:"#800080";s:7:"fuchsia";s:7:"#FF00FF";s:5:"white";s:7:"#FFFFFF";s:4:"lime";s:7:"#00FF00";s:5:"green";s:7:"#008000";s:4:"navy";s:7:"#000080";s:4:"blue";s:7:"#0000FF";s:4:"aqua";s:7:"#00FFFF";s:4:"teal";s:7:"#008080";s:5:"black";s:7:"#000000";s:6:"silver";s:7:"#C0C0C0";s:4:"gray";s:7:"#808080";}s:25:"ConvertDocumentToFragment";b:1;s:31:"DirectLexLineNumberSyncInterval";i:0;s:8:"Encoding";s:5:"utf-8";s:21:"EscapeInvalidChildren";b:0;s:17:"EscapeInvalidTags";b:0;s:24:"EscapeNonASCIICharacters";b:0;s:14:"HiddenElements";a:2:{s:6:"script";b:1;s:5:"style";b:1;}s:8:"Language";s:2:"en";s:9:"LexerImpl";N;s:19:"MaintainLineNumbers";N;s:16:"RemoveInvalidImg";b:1;s:20:"RemoveScriptContents";N;}s:6:"Filter";a:2:{s:26:"ExtractStyleBlocksEscaping";b:1;s:23:"ExtractStyleBlocksScope";N;}s:4:"HTML";a:18:{s:7:"Allowed";N;s:17:"AllowedAttributes";N;s:15:"AllowedElements";N;s:14:"AllowedModules";N;s:12:"BlockWrapper";s:1:"p";s:11:"CoreModules";a:7:{s:9:"Structure";b:1;s:4:"Text";b:1;s:9:"Hypertext";b:1;s:4:"List";b:1;s:22:"NonXMLCommonAttributes";b:1;s:19:"XMLCommonAttributes";b:1;s:16:"CommonAttributes";b:1;}s:13:"CustomDoctype";N;s:12:"DefinitionID";N;s:13:"DefinitionRev";i:1;s:7:"Doctype";s:0:"";s:6:"Parent";s:3:"div";s:11:"Proprietary";b:0;s:6:"Strict";b:0;s:7:"TidyAdd";a:0:{}s:9:"TidyLevel";s:6:"medium";s:10:"TidyRemove";a:0:{}s:7:"Trusted";b:0;s:5:"XHTML";b:1;}s:6:"Output";a:3:{s:21:"CommentScriptContents";b:1;s:7:"Newline";N;s:10:"TidyFormat";b:0;}s:4:"Test";a:1:{s:12:"ForceNoIconv";b:0;}s:3:"URI";a:14:{s:14:"AllowedSchemes";a:6:{s:4:"http";b:1;s:5:"https";b:1;s:6:"mailto";b:1;s:3:"ftp";b:1;s:4:"nntp";b:1;s:4:"news";b:1;}s:4:"Base";N;s:13:"DefaultScheme";s:4:"http";s:12:"DefinitionID";N;s:13:"DefinitionRev";i:1;s:7:"Disable";b:0;s:15:"DisableExternal";b:0;s:24:"DisableExternalResources";b:0;s:16:"DisableResources";b:0;s:4:"Host";N;s:13:"HostBlacklist";a:0:{}s:12:"MakeAbsolute";b:0;s:5:"Munge";N;s:22:"OverrideAllowedSchemes";b:1;}}s:4:"info";a:11:{s:4:"Attr";a:12:{s:19:"AllowedFrameTargets";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:10:"AllowedRel";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:10:"AllowedRev";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:19:"DefaultInvalidImage";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:22:"DefaultInvalidImageAlt";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:14:"DefaultTextDir";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";a:2:{s:3:"ltr";b:1;s:3:"rtl";b:1;}s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:8:"EnableID";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:1:{i:0;s:17:"HTML.EnableAttrID";}}s:11:"IDBlacklist";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"list";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:17:"IDBlacklistRegexp";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:8:"IDPrefix";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:13:"IDPrefixLocal";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:10:"DisableURI";O:37:"HTMLPurifier_ConfigDef_DirectiveAlias":3:{s:5:"class";s:5:"alias";s:9:"namespace";s:3:"URI";s:4:"name";s:7:"Disable";}}s:10:"AutoFormat";a:4:{s:13:"AutoParagraph";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:6:"Custom";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"list";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:7:"Linkify";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:15:"PurifierLinkify";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}}s:15:"AutoFormatParam";a:1:{s:21:"PurifierLinkifyDocURL";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}}s:3:"CSS";a:4:{s:14:"AllowImportant";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:11:"AllowTricky";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:13:"DefinitionRev";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:3:"int";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:11:"Proprietary";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}}s:5:"Cache";a:2:{s:14:"DefinitionImpl";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:1:{i:0;s:20:"Core.DefinitionCache";}}s:14:"SerializerPath";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}}s:4:"Core";a:20:{s:15:"DefinitionCache";O:37:"HTMLPurifier_ConfigDef_DirectiveAlias":3:{s:5:"class";s:5:"alias";s:9:"namespace";s:5:"Cache";s:4:"name";s:14:"DefinitionImpl";}s:17:"AggressivelyFixLt";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:13:"CollectErrors";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:13:"ColorKeywords";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"hash";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:25:"ConvertDocumentToFragment";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:1:{i:0;s:24:"Core.AcceptFullDocuments";}}s:19:"AcceptFullDocuments";O:37:"HTMLPurifier_ConfigDef_DirectiveAlias":3:{s:5:"class";s:5:"alias";s:9:"namespace";s:4:"Core";s:4:"name";s:25:"ConvertDocumentToFragment";}s:31:"DirectLexLineNumberSyncInterval";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:3:"int";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:8:"Encoding";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:7:"istring";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:21:"EscapeInvalidChildren";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:17:"EscapeInvalidTags";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:24:"EscapeNonASCIICharacters";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:14:"HiddenElements";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:8:"Language";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:9:"LexerImpl";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:5:"mixed";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:19:"MaintainLineNumbers";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:16:"RemoveInvalidImg";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:20:"RemoveScriptContents";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:5:"XHTML";O:37:"HTMLPurifier_ConfigDef_DirectiveAlias":3:{s:5:"class";s:5:"alias";s:9:"namespace";s:4:"HTML";s:4:"name";s:5:"XHTML";}s:21:"CommentScriptContents";O:37:"HTMLPurifier_ConfigDef_DirectiveAlias":3:{s:5:"class";s:5:"alias";s:9:"namespace";s:6:"Output";s:4:"name";s:21:"CommentScriptContents";}s:10:"TidyFormat";O:37:"HTMLPurifier_ConfigDef_DirectiveAlias":3:{s:5:"class";s:5:"alias";s:9:"namespace";s:6:"Output";s:4:"name";s:10:"TidyFormat";}}s:6:"Filter";a:2:{s:26:"ExtractStyleBlocksEscaping";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:23:"ExtractStyleBlocksScope";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}}s:4:"HTML";a:19:{s:12:"EnableAttrID";O:37:"HTMLPurifier_ConfigDef_DirectiveAlias":3:{s:5:"class";s:5:"alias";s:9:"namespace";s:4:"Attr";s:4:"name";s:8:"EnableID";}s:7:"Allowed";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:5:"itext";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:17:"AllowedAttributes";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:15:"AllowedElements";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:14:"AllowedModules";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:12:"BlockWrapper";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:11:"CoreModules";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:13:"CustomDoctype";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:12:"DefinitionID";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:13:"DefinitionRev";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:3:"int";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:7:"Doctype";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";a:6:{s:0:"";b:1;s:22:"HTML 4.01 Transitional";b:1;s:16:"HTML 4.01 Strict";b:1;s:22:"XHTML 1.0 Transitional";b:1;s:16:"XHTML 1.0 Strict";b:1;s:9:"XHTML 1.1";b:1;}s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:6:"Parent";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:11:"Proprietary";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:6:"Strict";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:7:"TidyAdd";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:9:"TidyLevel";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";a:4:{s:4:"none";b:1;s:5:"light";b:1;s:6:"medium";b:1;s:5:"heavy";b:1;}s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:10:"TidyRemove";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:7:"Trusted";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:5:"XHTML";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:1:{i:0;s:10:"Core.XHTML";}}}s:6:"Output";a:3:{s:21:"CommentScriptContents";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:1:{i:0;s:26:"Core.CommentScriptContents";}}s:7:"Newline";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:10:"TidyFormat";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:1:{i:0;s:15:"Core.TidyFormat";}}}s:4:"Test";a:1:{s:12:"ForceNoIconv";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}}s:3:"URI";a:14:{s:14:"AllowedSchemes";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:4:"Base";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:13:"DefaultScheme";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:12:"DefinitionID";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:13:"DefinitionRev";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:3:"int";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:7:"Disable";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:1:{i:0;s:15:"Attr.DisableURI";}}s:15:"DisableExternal";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:24:"DisableExternalResources";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:16:"DisableResources";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:4:"Host";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:13:"HostBlacklist";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"list";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:12:"MakeAbsolute";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:5:"Munge";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:22:"OverrideAllowedSchemes";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}}}s:14:"info_namespace";a:11:{s:4:"Attr";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:40:"Features regarding attribute validation.";}s:10:"AutoFormat";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:97:"Configuration for activating auto-formatting functionality (also known as Injectors)";}s:15:"AutoFormatParam";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:59:"Configuration for customizing auto-formatting functionality";}s:3:"CSS";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:36:"Configuration regarding allowed CSS.";}s:5:"Cache";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:57:"Configuration for DefinitionCache and related subclasses.";}s:4:"Core";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:40:"Core features that are always available.";}s:6:"Filter";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:25:"Configuration for filters";}s:4:"HTML";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:37:"Configuration regarding allowed HTML.";}s:6:"Output";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:52:"Configuration relating to the generation of (X)HTML.";}s:4:"Test";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:51:"Developer testing configuration for our unit tests.";}s:3:"URI";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:48:"Features regarding Uniform Resource Identifiers.";}}s:5:"types";a:11:{s:6:"string";s:6:"String";s:7:"istring";s:23:"Case-insensitive string";s:4:"text";s:4:"Text";s:5:"itext";s:21:"Case-insensitive text";s:3:"int";s:7:"Integer";s:5:"float";s:5:"Float";s:4:"bool";s:7:"Boolean";s:6:"lookup";s:12:"Lookup array";s:4:"list";s:10:"Array list";s:4:"hash";s:17:"Associative array";s:5:"mixed";s:5:"Mixed";}} \ No newline at end of file +O:25:"HTMLPurifier_ConfigSchema":5:{s:8:"defaults";a:11:{s:4:"Attr";a:11:{s:19:"AllowedFrameTargets";a:0:{}s:10:"AllowedRel";a:0:{}s:10:"AllowedRev";a:0:{}s:19:"DefaultInvalidImage";s:0:"";s:22:"DefaultInvalidImageAlt";s:13:"Invalid image";s:14:"DefaultTextDir";s:3:"ltr";s:8:"EnableID";b:0;s:11:"IDBlacklist";a:0:{}s:17:"IDBlacklistRegexp";N;s:8:"IDPrefix";s:0:"";s:13:"IDPrefixLocal";s:0:"";}s:10:"AutoFormat";a:4:{s:13:"AutoParagraph";b:0;s:6:"Custom";a:0:{}s:7:"Linkify";b:0;s:15:"PurifierLinkify";b:0;}s:15:"AutoFormatParam";a:1:{s:21:"PurifierLinkifyDocURL";s:3:"#%s";}s:3:"CSS";a:4:{s:14:"AllowImportant";b:0;s:11:"AllowTricky";b:0;s:13:"DefinitionRev";i:1;s:11:"Proprietary";b:0;}s:5:"Cache";a:2:{s:14:"DefinitionImpl";s:10:"Serializer";s:14:"SerializerPath";N;}s:4:"Core";a:15:{s:17:"AggressivelyFixLt";b:0;s:13:"CollectErrors";b:0;s:13:"ColorKeywords";a:17:{s:6:"maroon";s:7:"#800000";s:3:"red";s:7:"#FF0000";s:6:"orange";s:7:"#FFA500";s:6:"yellow";s:7:"#FFFF00";s:5:"olive";s:7:"#808000";s:6:"purple";s:7:"#800080";s:7:"fuchsia";s:7:"#FF00FF";s:5:"white";s:7:"#FFFFFF";s:4:"lime";s:7:"#00FF00";s:5:"green";s:7:"#008000";s:4:"navy";s:7:"#000080";s:4:"blue";s:7:"#0000FF";s:4:"aqua";s:7:"#00FFFF";s:4:"teal";s:7:"#008080";s:5:"black";s:7:"#000000";s:6:"silver";s:7:"#C0C0C0";s:4:"gray";s:7:"#808080";}s:25:"ConvertDocumentToFragment";b:1;s:31:"DirectLexLineNumberSyncInterval";i:0;s:8:"Encoding";s:5:"utf-8";s:21:"EscapeInvalidChildren";b:0;s:17:"EscapeInvalidTags";b:0;s:24:"EscapeNonASCIICharacters";b:0;s:14:"HiddenElements";a:2:{s:6:"script";b:1;s:5:"style";b:1;}s:8:"Language";s:2:"en";s:9:"LexerImpl";N;s:19:"MaintainLineNumbers";N;s:16:"RemoveInvalidImg";b:1;s:20:"RemoveScriptContents";N;}s:6:"Filter";a:2:{s:26:"ExtractStyleBlocksEscaping";b:1;s:23:"ExtractStyleBlocksScope";N;}s:4:"HTML";a:18:{s:7:"Allowed";N;s:17:"AllowedAttributes";N;s:15:"AllowedElements";N;s:14:"AllowedModules";N;s:12:"BlockWrapper";s:1:"p";s:11:"CoreModules";a:7:{s:9:"Structure";b:1;s:4:"Text";b:1;s:9:"Hypertext";b:1;s:4:"List";b:1;s:22:"NonXMLCommonAttributes";b:1;s:19:"XMLCommonAttributes";b:1;s:16:"CommonAttributes";b:1;}s:13:"CustomDoctype";N;s:12:"DefinitionID";N;s:13:"DefinitionRev";i:1;s:7:"Doctype";s:0:"";s:6:"Parent";s:3:"div";s:11:"Proprietary";b:0;s:6:"Strict";b:0;s:7:"TidyAdd";a:0:{}s:9:"TidyLevel";s:6:"medium";s:10:"TidyRemove";a:0:{}s:7:"Trusted";b:0;s:5:"XHTML";b:1;}s:6:"Output";a:3:{s:21:"CommentScriptContents";b:1;s:7:"Newline";N;s:10:"TidyFormat";b:0;}s:4:"Test";a:1:{s:12:"ForceNoIconv";b:0;}s:3:"URI";a:14:{s:14:"AllowedSchemes";a:6:{s:4:"http";b:1;s:5:"https";b:1;s:6:"mailto";b:1;s:3:"ftp";b:1;s:4:"nntp";b:1;s:4:"news";b:1;}s:4:"Base";N;s:13:"DefaultScheme";s:4:"http";s:12:"DefinitionID";N;s:13:"DefinitionRev";i:1;s:7:"Disable";b:0;s:15:"DisableExternal";b:0;s:24:"DisableExternalResources";b:0;s:16:"DisableResources";b:0;s:4:"Host";N;s:13:"HostBlacklist";a:0:{}s:12:"MakeAbsolute";b:0;s:5:"Munge";N;s:22:"OverrideAllowedSchemes";b:1;}}s:4:"info";a:11:{s:4:"Attr";a:12:{s:19:"AllowedFrameTargets";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:10:"AllowedRel";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:10:"AllowedRev";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:19:"DefaultInvalidImage";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:22:"DefaultInvalidImageAlt";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:14:"DefaultTextDir";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";a:2:{s:3:"ltr";b:1;s:3:"rtl";b:1;}s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:8:"EnableID";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:1:{i:0;s:17:"HTML.EnableAttrID";}}s:11:"IDBlacklist";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"list";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:17:"IDBlacklistRegexp";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:8:"IDPrefix";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:13:"IDPrefixLocal";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:10:"DisableURI";O:37:"HTMLPurifier_ConfigDef_DirectiveAlias":3:{s:5:"class";s:5:"alias";s:9:"namespace";s:3:"URI";s:4:"name";s:7:"Disable";}}s:10:"AutoFormat";a:4:{s:13:"AutoParagraph";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:6:"Custom";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"list";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:7:"Linkify";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:15:"PurifierLinkify";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}}s:15:"AutoFormatParam";a:1:{s:21:"PurifierLinkifyDocURL";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}}s:3:"CSS";a:4:{s:14:"AllowImportant";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:11:"AllowTricky";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:13:"DefinitionRev";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:3:"int";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:11:"Proprietary";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}}s:5:"Cache";a:2:{s:14:"DefinitionImpl";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:1:{i:0;s:20:"Core.DefinitionCache";}}s:14:"SerializerPath";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}}s:4:"Core";a:20:{s:15:"DefinitionCache";O:37:"HTMLPurifier_ConfigDef_DirectiveAlias":3:{s:5:"class";s:5:"alias";s:9:"namespace";s:5:"Cache";s:4:"name";s:14:"DefinitionImpl";}s:17:"AggressivelyFixLt";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:13:"CollectErrors";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:13:"ColorKeywords";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"hash";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:25:"ConvertDocumentToFragment";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:1:{i:0;s:24:"Core.AcceptFullDocuments";}}s:19:"AcceptFullDocuments";O:37:"HTMLPurifier_ConfigDef_DirectiveAlias":3:{s:5:"class";s:5:"alias";s:9:"namespace";s:4:"Core";s:4:"name";s:25:"ConvertDocumentToFragment";}s:31:"DirectLexLineNumberSyncInterval";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:3:"int";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:8:"Encoding";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:7:"istring";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:21:"EscapeInvalidChildren";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:17:"EscapeInvalidTags";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:24:"EscapeNonASCIICharacters";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:14:"HiddenElements";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:8:"Language";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:9:"LexerImpl";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:5:"mixed";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:19:"MaintainLineNumbers";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:16:"RemoveInvalidImg";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:20:"RemoveScriptContents";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:5:"XHTML";O:37:"HTMLPurifier_ConfigDef_DirectiveAlias":3:{s:5:"class";s:5:"alias";s:9:"namespace";s:4:"HTML";s:4:"name";s:5:"XHTML";}s:21:"CommentScriptContents";O:37:"HTMLPurifier_ConfigDef_DirectiveAlias":3:{s:5:"class";s:5:"alias";s:9:"namespace";s:6:"Output";s:4:"name";s:21:"CommentScriptContents";}s:10:"TidyFormat";O:37:"HTMLPurifier_ConfigDef_DirectiveAlias":3:{s:5:"class";s:5:"alias";s:9:"namespace";s:6:"Output";s:4:"name";s:10:"TidyFormat";}}s:6:"Filter";a:2:{s:26:"ExtractStyleBlocksEscaping";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:23:"ExtractStyleBlocksScope";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}}s:4:"HTML";a:19:{s:12:"EnableAttrID";O:37:"HTMLPurifier_ConfigDef_DirectiveAlias":3:{s:5:"class";s:5:"alias";s:9:"namespace";s:4:"Attr";s:4:"name";s:8:"EnableID";}s:7:"Allowed";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:5:"itext";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:17:"AllowedAttributes";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:15:"AllowedElements";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:14:"AllowedModules";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:12:"BlockWrapper";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:11:"CoreModules";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:13:"CustomDoctype";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:12:"DefinitionID";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:13:"DefinitionRev";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:3:"int";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:7:"Doctype";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";a:6:{s:0:"";b:1;s:22:"HTML 4.01 Transitional";b:1;s:16:"HTML 4.01 Strict";b:1;s:22:"XHTML 1.0 Transitional";b:1;s:16:"XHTML 1.0 Strict";b:1;s:9:"XHTML 1.1";b:1;}s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:6:"Parent";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:11:"Proprietary";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:6:"Strict";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:7:"TidyAdd";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:9:"TidyLevel";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";a:4:{s:4:"none";b:1;s:5:"light";b:1;s:6:"medium";b:1;s:5:"heavy";b:1;}s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:10:"TidyRemove";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:7:"Trusted";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:5:"XHTML";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:1:{i:0;s:10:"Core.XHTML";}}}s:6:"Output";a:3:{s:21:"CommentScriptContents";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:1:{i:0;s:26:"Core.CommentScriptContents";}}s:7:"Newline";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:10:"TidyFormat";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:1:{i:0;s:15:"Core.TidyFormat";}}}s:4:"Test";a:1:{s:12:"ForceNoIconv";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}}s:3:"URI";a:14:{s:14:"AllowedSchemes";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"lookup";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:4:"Base";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:13:"DefaultScheme";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:12:"DefinitionID";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:13:"DefinitionRev";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:3:"int";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:7:"Disable";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:1:{i:0;s:15:"Attr.DisableURI";}}s:15:"DisableExternal";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:24:"DisableExternalResources";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:16:"DisableResources";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:4:"Host";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:13:"HostBlacklist";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"list";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:12:"MakeAbsolute";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:5:"Munge";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:6:"string";s:11:"description";N;s:10:"allow_null";b:1;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}s:22:"OverrideAllowedSchemes";O:32:"HTMLPurifier_ConfigDef_Directive":7:{s:5:"class";s:9:"directive";s:4:"type";s:4:"bool";s:11:"description";N;s:10:"allow_null";b:0;s:7:"allowed";b:1;s:7:"aliases";a:0:{}s:16:"directiveAliases";a:0:{}}}}s:14:"info_namespace";a:11:{s:4:"Attr";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:40:"Features regarding attribute validation.";}s:10:"AutoFormat";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:97:"Configuration for activating auto-formatting functionality (also known as Injectors)";}s:15:"AutoFormatParam";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:59:"Configuration for customizing auto-formatting functionality";}s:3:"CSS";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:36:"Configuration regarding allowed CSS.";}s:5:"Cache";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:57:"Configuration for DefinitionCache and related subclasses.";}s:4:"Core";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:40:"Core features that are always available.";}s:6:"Filter";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:25:"Configuration for filters";}s:4:"HTML";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:37:"Configuration regarding allowed HTML.";}s:6:"Output";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:52:"Configuration relating to the generation of (X)HTML.";}s:4:"Test";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:51:"Developer testing configuration for our unit tests.";}s:3:"URI";O:32:"HTMLPurifier_ConfigDef_Namespace":2:{s:5:"class";s:9:"namespace";s:11:"description";s:48:"Features regarding Uniform Resource Identifiers.";}}s:9:"*parser";O:22:"HTMLPurifier_VarParser":1:{s:5:"types";a:11:{s:6:"string";b:1;s:7:"istring";b:1;s:4:"text";b:1;s:5:"itext";b:1;s:3:"int";b:1;s:5:"float";b:1;s:4:"bool";b:1;s:6:"lookup";b:1;s:4:"list";b:1;s:4:"hash";b:1;s:5:"mixed";b:1;}}s:5:"types";a:11:{s:6:"string";s:6:"String";s:7:"istring";s:23:"Case-insensitive string";s:4:"text";s:4:"Text";s:5:"itext";s:21:"Case-insensitive text";s:3:"int";s:7:"Integer";s:5:"float";s:5:"Float";s:4:"bool";s:7:"Boolean";s:6:"lookup";s:12:"Lookup array";s:4:"list";s:10:"Array list";s:4:"hash";s:17:"Associative array";s:5:"mixed";s:5:"Mixed";}} \ No newline at end of file diff --git a/library/HTMLPurifier/VarParser.php b/library/HTMLPurifier/VarParser.php new file mode 100644 index 00000000..f0235560 --- /dev/null +++ b/library/HTMLPurifier/VarParser.php @@ -0,0 +1,124 @@ + true, + 'istring' => true, + 'text' => true, + 'itext' => true, + 'int' => true, + 'float' => true, + 'bool' => true, + 'lookup' => true, + 'list' => true, + 'hash' => true, + 'mixed' => true + ); + + /** + * Validate a variable according to type. Throws exception if invalid. + * It may return NULL as a valid type. + */ + public function parse($var, $type, $allow_null = false) { + if (!isset($this->types[$type])) { + throw new HTMLPurifier_VarParserException("Invalid type $type"); + } + 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 'mixed': + //if (is_string($var)) $var = unserialize($var); + return $var; + case 'istring': + case 'string': + case 'text': // no difference, just is longer/multiple line string + case 'itext': + if (!is_string($var)) break; + if ($type === 'istring' || $type === 'itext') $var = strtolower($var); + return $var; + case 'int': + if (is_string($var) && ctype_digit($var)) $var = (int) $var; + elseif (!is_int($var)) break; + return $var; + case 'float': + if (is_string($var) && is_numeric($var)) $var = (float) $var; + elseif (!is_float($var)) break; + return $var; + case 'bool': + if (is_int($var) && ($var === 0 || $var === 1)) { + $var = (bool) $var; + } elseif (is_string($var)) { + if ($var == 'on' || $var == 'true' || $var == '1') { + $var = true; + } elseif ($var == 'off' || $var == 'false' || $var == '0') { + $var = false; + } else { + throw new HTMLPurifier_VarParserException("Unrecognized value '$var' for $type"); + } + } elseif (!is_bool($var)) break; + return $var; + case 'list': + case 'hash': + case '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 (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); + } else { + $var = preg_split('/(,|[\n\r]+)/', $var); + } + // remove spaces + foreach ($var as $i => $j) $var[$i] = trim($j); + if ($type === 'hash') { + // key:value,key2:value2 + $nvar = array(); + foreach ($var as $keypair) { + $c = explode(':', $keypair, 2); + if (!isset($c[1])) continue; + $nvar[$c[0]] = $c[1]; + } + $var = $nvar; + } + } + if (!is_array($var)) break; + $keys = array_keys($var); + if ($keys === array_keys($keys)) { + if ($type == 'list') return $var; + elseif ($type == 'lookup') { + $new = array(); + foreach ($var as $key) { + $new[$key] = true; + } + return $new; + } else break; + } + if ($type === 'lookup') { + foreach ($var as $key => $value) { + $var[$key] = true; + } + } + return $var; + default: + // This should not happen! + throw new HTMLPurifier_Exception("Inconsistency in HTMLPurifier_VarParser: $type is not implemented"); + } + throw new HTMLPurifier_VarParserException("Invalid input for type $type"); + } + +} diff --git a/library/HTMLPurifier/VarParserException.php b/library/HTMLPurifier/VarParserException.php new file mode 100644 index 00000000..fc415d46 --- /dev/null +++ b/library/HTMLPurifier/VarParserException.php @@ -0,0 +1,9 @@ +schema->addAlias('Home', 'Rug2', 'Home', 'Carpet'); } - function assertValid($var, $type, $ret = null) { - $ret = ($ret === null) ? $var : $ret; - $this->assertIdentical($this->schema->validate($var, $type), $ret); - } - - function assertInvalid($var, $type) { - $this->assertTrue( - $this->schema->isError( - $this->schema->validate($var, $type) - ) - ); - } - - function testValidate() { - - $this->assertValid('foobar', 'string'); - $this->assertValid('foobar', 'text'); // aliases, lstring = long string - $this->assertValid('FOOBAR', 'istring', 'foobar'); - $this->assertValid('FOOBAR', 'itext', 'foobar'); - - $this->assertValid(34, 'int'); - - $this->assertValid(3.34, 'float'); - - $this->assertValid(false, 'bool'); - $this->assertValid(0, 'bool', false); - $this->assertValid(1, 'bool', true); - $this->assertValid('true', 'bool', true); - $this->assertValid('false', 'bool', false); - $this->assertValid('1', 'bool', true); - $this->assertInvalid(34, 'bool'); - $this->assertInvalid(null, 'bool'); - - $this->assertValid(array('1', '2', '3'), 'list'); - $this->assertValid('foo,bar, cow', 'list', array('foo', 'bar', 'cow')); - $this->assertValid('', 'list', array()); - $this->assertValid("foo\nbar", 'list', array('foo', 'bar')); - $this->assertValid("foo\nbar,baz", 'list', array('foo', 'bar', 'baz')); - - $this->assertValid(array('1' => true, '2' => true), 'lookup'); - $this->assertValid(array('1', '2'), 'lookup', array('1' => true, '2' => true)); - $this->assertValid('foo,bar', 'lookup', array('foo' => true, 'bar' => true)); - $this->assertValid("foo\nbar", 'lookup', array('foo' => true, 'bar' => true)); - $this->assertValid("foo\nbar,baz", 'lookup', array('foo' => true, 'bar' => true, 'baz' => true)); - $this->assertValid('', 'lookup', array()); - $this->assertValid(array(), 'lookup'); - - $this->assertValid(array('foo' => 'bar'), 'hash'); - $this->assertValid(array(1 => 'moo'), 'hash'); - $this->assertInvalid(array(0 => 'moo'), 'hash'); - $this->assertValid('', 'hash', array()); - $this->assertValid('foo:bar,too:two', 'hash', array('foo' => 'bar', 'too' => 'two')); - $this->assertValid("foo:bar\ntoo:two,three:free", 'hash', array('foo' => 'bar', 'too' => 'two', 'three' => 'free')); - $this->assertValid('foo:bar,too', 'hash', array('foo' => 'bar')); - $this->assertValid('foo:bar,', 'hash', array('foo' => 'bar')); - $this->assertValid('foo:bar:baz', 'hash', array('foo' => 'bar:baz')); - - $this->assertValid(23, 'mixed'); - - } - - function testValidate_null() { - - $this->assertTrue( - $this->schema->isError( - $this->schema->validate(null, 'string', false) - ) - ); - - $this->assertFalse( - $this->schema->isError( - $this->schema->validate(null, 'string', true) - ) - ); - - } - } diff --git a/tests/HTMLPurifier/VarParserTest.php b/tests/HTMLPurifier/VarParserTest.php new file mode 100644 index 00000000..84137e34 --- /dev/null +++ b/tests/HTMLPurifier/VarParserTest.php @@ -0,0 +1,84 @@ +parser = new HTMLPurifier_VarParser(); + } + + function assertValid($var, $type, $ret = null) { + $ret = ($ret === null) ? $var : $ret; + $this->assertIdentical($this->parser->parse($var, $type), $ret); + } + + function assertInvalid($var, $type, $msg = null) { + $caught = false; + try { + $this->parser->parse($var, $type); + } catch (HTMLPurifier_VarParserException $e) { + $caught = true; + if ($msg !== null) $this->assertIdentical($e->getMessage(), $msg); + } + if (!$caught) { + $this->fail('Did not catch expected error'); + } + } + + function testValidate() { + + $this->assertValid('foobar', 'string'); + $this->assertValid('foobar', 'text'); // aliases, lstring = long string + $this->assertValid('FOOBAR', 'istring', 'foobar'); + $this->assertValid('FOOBAR', 'itext', 'foobar'); + + $this->assertValid(34, 'int'); + + $this->assertValid(3.34, 'float'); + + $this->assertValid(false, 'bool'); + $this->assertValid(0, 'bool', false); + $this->assertValid(1, 'bool', true); + $this->assertValid('true', 'bool', true); + $this->assertValid('false', 'bool', false); + $this->assertValid('1', 'bool', true); + $this->assertInvalid(34, 'bool'); + $this->assertInvalid(null, 'bool'); + + $this->assertValid(array('1', '2', '3'), 'list'); + $this->assertValid('foo,bar, cow', 'list', array('foo', 'bar', 'cow')); + $this->assertValid('', 'list', array()); + $this->assertValid("foo\nbar", 'list', array('foo', 'bar')); + $this->assertValid("foo\nbar,baz", 'list', array('foo', 'bar', 'baz')); + + $this->assertValid(array('1' => true, '2' => true), 'lookup'); + $this->assertValid(array('1', '2'), 'lookup', array('1' => true, '2' => true)); + $this->assertValid('foo,bar', 'lookup', array('foo' => true, 'bar' => true)); + $this->assertValid("foo\nbar", 'lookup', array('foo' => true, 'bar' => true)); + $this->assertValid("foo\nbar,baz", 'lookup', array('foo' => true, 'bar' => true, 'baz' => true)); + $this->assertValid('', 'lookup', array()); + $this->assertValid(array(), 'lookup'); + + $this->assertValid(array('foo' => 'bar'), 'hash'); + $this->assertValid(array(1 => 'moo'), 'hash'); + $this->assertInvalid(array(0 => 'moo'), 'hash'); + $this->assertValid('', 'hash', array()); + $this->assertValid('foo:bar,too:two', 'hash', array('foo' => 'bar', 'too' => 'two')); + $this->assertValid("foo:bar\ntoo:two,three:free", 'hash', array('foo' => 'bar', 'too' => 'two', 'three' => 'free')); + $this->assertValid('foo:bar,too', 'hash', array('foo' => 'bar')); + $this->assertValid('foo:bar,', 'hash', array('foo' => 'bar')); + $this->assertValid('foo:bar:baz', 'hash', array('foo' => 'bar:baz')); + + $this->assertValid(23, 'mixed'); + + } + + function testValidate_null() { + $this->assertIdentical($this->parser->parse(null, 'string', true), null); + $this->expectException('HTMLPurifier_VarParserException'); + $this->parser->parse(null, 'string', false); + } + +}