From: skodak Date: Sun, 20 May 2007 05:35:43 +0000 (+0000) Subject: MDL-9855 upgrade HTML Purifier to v1.6.1 X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=89028eed59517f3eb3b1ce2c64fe987ab9ac3dc8;p=moodle.git MDL-9855 upgrade HTML Purifier to v1.6.1 --- diff --git a/lib/htmlpurifier/HTMLPurifier.php b/lib/htmlpurifier/HTMLPurifier.php index 5a0ce99d0b..3d538bca1a 100644 --- a/lib/htmlpurifier/HTMLPurifier.php +++ b/lib/htmlpurifier/HTMLPurifier.php @@ -22,7 +22,7 @@ */ /* - HTML Purifier 1.6.0 - Standards Compliant HTML Filtering + HTML Purifier 1.6.1 - Standards Compliant HTML Filtering Copyright (C) 2006 Edward Z. Yang This library is free software; you can redistribute it and/or @@ -64,7 +64,7 @@ require_once 'HTMLPurifier/Encoder.php'; class HTMLPurifier { - var $version = '1.6.0'; + var $version = '1.6.1'; var $config; var $filters; diff --git a/lib/htmlpurifier/HTMLPurifier/AttrDef/Enum.php b/lib/htmlpurifier/HTMLPurifier/AttrDef/Enum.php index 3246318f68..91a075f87a 100644 --- a/lib/htmlpurifier/HTMLPurifier/AttrDef/Enum.php +++ b/lib/htmlpurifier/HTMLPurifier/AttrDef/Enum.php @@ -5,6 +5,9 @@ require_once 'HTMLPurifier/AttrDef.php'; // Enum = Enumerated /** * Validates a keyword against a list of valid values. + * @warning The case-insensitive compare of this function uses PHP's + * built-in strtolower and ctype_lower functions, which may + * cause problems with international comparisons */ class HTMLPurifier_AttrDef_Enum extends HTMLPurifier_AttrDef { @@ -34,6 +37,7 @@ class HTMLPurifier_AttrDef_Enum extends HTMLPurifier_AttrDef function validate($string, $config, &$context) { $string = trim($string); if (!$this->case_sensitive) { + // we may want to do full case-insensitive libraries $string = ctype_lower($string) ? $string : strtolower($string); } $result = isset($this->valid_values[$string]); diff --git a/lib/htmlpurifier/HTMLPurifier/AttrDef/HTML/FrameTarget.php b/lib/htmlpurifier/HTMLPurifier/AttrDef/HTML/FrameTarget.php new file mode 100644 index 0000000000..5893bbfa0a --- /dev/null +++ b/lib/htmlpurifier/HTMLPurifier/AttrDef/HTML/FrameTarget.php @@ -0,0 +1,34 @@ +valid_values === false) $this->valid_values = $config->get('Attr', 'AllowedFrameTargets'); + return parent::validate($string, $config, $context); + } + +} + +?> \ No newline at end of file diff --git a/lib/htmlpurifier/HTMLPurifier/AttrTransform.php b/lib/htmlpurifier/HTMLPurifier/AttrTransform.php index 3513669ae1..2fa07b4755 100644 --- a/lib/htmlpurifier/HTMLPurifier/AttrTransform.php +++ b/lib/htmlpurifier/HTMLPurifier/AttrTransform.php @@ -29,6 +29,30 @@ class HTMLPurifier_AttrTransform function transform($attr, $config, &$context) { trigger_error('Cannot call abstract function', E_USER_ERROR); } + + /** + * 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 + */ + 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 + */ + function confiscateAttr(&$attr, $key) { + if (!isset($attr[$key])) return null; + $value = $attr[$key]; + unset($attr[$key]); + return $value; + } + } ?> \ No newline at end of file diff --git a/lib/htmlpurifier/HTMLPurifier/AttrTransform/BgColor.php b/lib/htmlpurifier/HTMLPurifier/AttrTransform/BgColor.php index abfd03427d..a7bb2b4564 100644 --- a/lib/htmlpurifier/HTMLPurifier/AttrTransform/BgColor.php +++ b/lib/htmlpurifier/HTMLPurifier/AttrTransform/BgColor.php @@ -12,12 +12,10 @@ extends HTMLPurifier_AttrTransform { if (!isset($attr['bgcolor'])) return $attr; - $bgcolor = $attr['bgcolor']; - unset($attr['bgcolor']); + $bgcolor = $this->confiscateAttr($attr, 'bgcolor'); // some validation should happen here - $attr['style'] = isset($attr['style']) ? $attr['style'] : ''; - $attr['style'] = "background-color:$bgcolor;" . $attr['style']; + $this->prependCSS($attr, "background-color:$bgcolor;"); return $attr; diff --git a/lib/htmlpurifier/HTMLPurifier/AttrTransform/BoolToCSS.php b/lib/htmlpurifier/HTMLPurifier/AttrTransform/BoolToCSS.php new file mode 100644 index 0000000000..f4a16a7f17 --- /dev/null +++ b/lib/htmlpurifier/HTMLPurifier/AttrTransform/BoolToCSS.php @@ -0,0 +1,39 @@ +attr = $attr; + $this->css = $css; + } + + function transform($attr, $config, &$context) { + if (!isset($attr[$this->attr])) return $attr; + unset($attr[$this->attr]); + $this->prependCSS($attr, $this->css); + return $attr; + } + +} + +?> \ No newline at end of file diff --git a/lib/htmlpurifier/HTMLPurifier/AttrTransform/Border.php b/lib/htmlpurifier/HTMLPurifier/AttrTransform/Border.php index 0b745d3045..10c62e3c5b 100644 --- a/lib/htmlpurifier/HTMLPurifier/AttrTransform/Border.php +++ b/lib/htmlpurifier/HTMLPurifier/AttrTransform/Border.php @@ -5,22 +5,14 @@ require_once 'HTMLPurifier/AttrTransform.php'; /** * Pre-transform that changes deprecated border attribute to CSS. */ -class HTMLPurifier_AttrTransform_Border -extends HTMLPurifier_AttrTransform { +class HTMLPurifier_AttrTransform_Border extends HTMLPurifier_AttrTransform { function transform($attr, $config, &$context) { - if (!isset($attr['border'])) return $attr; - - $border_width = $attr['border']; - unset($attr['border']); + $border_width = $this->confiscateAttr($attr, 'border'); // some validation should happen here - - $attr['style'] = isset($attr['style']) ? $attr['style'] : ''; - $attr['style'] = "border:{$border_width}px solid;" . $attr['style']; - + $this->prependCSS($attr, "border:{$border_width}px solid;"); return $attr; - } } diff --git a/lib/htmlpurifier/HTMLPurifier/AttrTransform/EnumToCSS.php b/lib/htmlpurifier/HTMLPurifier/AttrTransform/EnumToCSS.php new file mode 100644 index 0000000000..ed4dfc32dd --- /dev/null +++ b/lib/htmlpurifier/HTMLPurifier/AttrTransform/EnumToCSS.php @@ -0,0 +1,60 @@ +attr = $attr; + $this->enumToCSS = $enum_to_css; + $this->caseSensitive = (bool) $case_sensitive; + } + + 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; + + } + +} + +?> \ No newline at end of file diff --git a/lib/htmlpurifier/HTMLPurifier/AttrTransform/ImgSpace.php b/lib/htmlpurifier/HTMLPurifier/AttrTransform/ImgSpace.php new file mode 100644 index 0000000000..53c787e2c9 --- /dev/null +++ b/lib/htmlpurifier/HTMLPurifier/AttrTransform/ImgSpace.php @@ -0,0 +1,47 @@ + array('left', 'right'), + 'vspace' => array('top', 'bottom') + ); + + function HTMLPurifier_AttrTransform_ImgSpace($attr) { + $this->attr = $attr; + if (!isset($this->css[$attr])) { + trigger_error(htmlspecialchars($attr) . ' is not valid space attribute'); + } + } + + 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; + + $style = ''; + foreach ($this->css[$this->attr] as $suffix) { + $property = "margin-$suffix"; + $style .= "$property:{$width}px;"; + } + + $this->prependCSS($attr, $style); + + return $attr; + + } + +} + +?> \ No newline at end of file diff --git a/lib/htmlpurifier/HTMLPurifier/AttrTransform/Length.php b/lib/htmlpurifier/HTMLPurifier/AttrTransform/Length.php index 16d3d1d8ca..2292aa133e 100644 --- a/lib/htmlpurifier/HTMLPurifier/AttrTransform/Length.php +++ b/lib/htmlpurifier/HTMLPurifier/AttrTransform/Length.php @@ -18,13 +18,9 @@ class HTMLPurifier_AttrTransform_Length extends HTMLPurifier_AttrTransform function transform($attr, $config, &$context) { if (!isset($attr[$this->name])) return $attr; - $length = $attr[$this->name]; - unset($attr[$this->name]); + $length = $this->confiscateAttr($attr, $this->name); if(ctype_digit($length)) $length .= 'px'; - - $attr['style'] = isset($attr['style']) ? $attr['style'] : ''; - $attr['style'] = $this->cssName . ":$length;" . $attr['style']; - + $this->prependCSS($attr, $this->cssName . ":$length;"); return $attr; } diff --git a/lib/htmlpurifier/HTMLPurifier/AttrTransform/Name.php b/lib/htmlpurifier/HTMLPurifier/AttrTransform/Name.php index 0f815b69e3..f14c147989 100644 --- a/lib/htmlpurifier/HTMLPurifier/AttrTransform/Name.php +++ b/lib/htmlpurifier/HTMLPurifier/AttrTransform/Name.php @@ -9,21 +9,11 @@ class HTMLPurifier_AttrTransform_Name extends HTMLPurifier_AttrTransform { function transform($attr, $config, &$context) { - if (!isset($attr['name'])) return $attr; - - $name = $attr['name']; - unset($attr['name']); - - if (isset($attr['id'])) { - // ID already set, discard name - return $attr; - } - - $attr['id'] = $name; - + $id = $this->confiscateAttr($attr, 'name'); + if ( isset($attr['id'])) return $attr; + $attr['id'] = $id; return $attr; - } } diff --git a/lib/htmlpurifier/HTMLPurifier/CSSDefinition.php b/lib/htmlpurifier/HTMLPurifier/CSSDefinition.php index 5de49b69b3..23a66ab76a 100644 --- a/lib/htmlpurifier/HTMLPurifier/CSSDefinition.php +++ b/lib/htmlpurifier/HTMLPurifier/CSSDefinition.php @@ -206,6 +206,9 @@ class HTMLPurifier_CSSDefinition new HTMLPurifier_AttrDef_CSS_Percentage() )); + // partial support + $this->info['white-space'] = new HTMLPurifier_AttrDef_Enum(array('nowrap')); + } } diff --git a/lib/htmlpurifier/HTMLPurifier/ConfigSchema.php b/lib/htmlpurifier/HTMLPurifier/ConfigSchema.php index 9f1f3e3eb3..940e8e6199 100644 --- a/lib/htmlpurifier/HTMLPurifier/ConfigSchema.php +++ b/lib/htmlpurifier/HTMLPurifier/ConfigSchema.php @@ -334,6 +334,10 @@ class HTMLPurifier_ConfigSchema { 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(); // simplistic string to array method that only works // for simple lists of tag names or alphanumeric characters $var = explode(',',$var); diff --git a/lib/htmlpurifier/HTMLPurifier/ElementDef.php b/lib/htmlpurifier/HTMLPurifier/ElementDef.php index 21bc5f36a3..73c94abe13 100644 --- a/lib/htmlpurifier/HTMLPurifier/ElementDef.php +++ b/lib/htmlpurifier/HTMLPurifier/ElementDef.php @@ -95,7 +95,7 @@ class HTMLPurifier_ElementDef // later keys takes precedence foreach($def->attr as $k => $v) { - if ($k == 0) { + if ($k === 0) { // merge in the includes // sorry, no way to override an include foreach ($v as $v2) { diff --git a/lib/htmlpurifier/HTMLPurifier/HTMLDefinition.php b/lib/htmlpurifier/HTMLPurifier/HTMLDefinition.php index 3af445ceb0..c1dd6535c4 100644 --- a/lib/htmlpurifier/HTMLPurifier/HTMLDefinition.php +++ b/lib/htmlpurifier/HTMLPurifier/HTMLDefinition.php @@ -183,9 +183,18 @@ class HTMLPurifier_HTMLDefinition $this->manager->setup($this->config); foreach ($this->manager->activeModules as $module) { - foreach($module->info_tag_transform as $k => $v) $this->info_tag_transform[$k] = $v; - foreach($module->info_attr_transform_pre as $k => $v) $this->info_attr_transform_pre[$k] = $v; - foreach($module->info_attr_transform_post as $k => $v) $this->info_attr_transform_post[$k]= $v; + foreach($module->info_tag_transform as $k => $v) { + if ($v === false) unset($this->info_tag_transform[$k]); + else $this->info_tag_transform[$k] = $v; + } + foreach($module->info_attr_transform_pre as $k => $v) { + if ($v === false) unset($this->info_attr_transform_pre[$k]); + else $this->info_attr_transform_pre[$k] = $v; + } + foreach($module->info_attr_transform_post as $k => $v) { + if ($v === false) unset($this->info_attr_transform_post[$k]); + else $this->info_attr_transform_post[$k] = $v; + } } $this->info = $this->manager->getElements($this->config); diff --git a/lib/htmlpurifier/HTMLPurifier/HTMLModule/Bdo.php b/lib/htmlpurifier/HTMLPurifier/HTMLModule/Bdo.php index 17e5e987fd..6feae0050d 100644 --- a/lib/htmlpurifier/HTMLPurifier/HTMLModule/Bdo.php +++ b/lib/htmlpurifier/HTMLPurifier/HTMLModule/Bdo.php @@ -12,7 +12,6 @@ class HTMLPurifier_HTMLModule_Bdo extends HTMLPurifier_HTMLModule var $name = 'Bdo'; var $elements = array('bdo'); - var $info = array(); var $content_sets = array('Inline' => 'bdo'); var $attr_collections = array( 'I18N' => array('dir' => false) diff --git a/lib/htmlpurifier/HTMLPurifier/HTMLModule/Edit.php b/lib/htmlpurifier/HTMLPurifier/HTMLModule/Edit.php index 6a415906e6..c3dc019700 100644 --- a/lib/htmlpurifier/HTMLPurifier/HTMLModule/Edit.php +++ b/lib/htmlpurifier/HTMLPurifier/HTMLModule/Edit.php @@ -12,7 +12,6 @@ class HTMLPurifier_HTMLModule_Edit extends HTMLPurifier_HTMLModule var $name = 'Edit'; var $elements = array('del', 'ins'); - var $info = array(); var $content_sets = array('Inline' => 'del | ins'); function HTMLPurifier_HTMLModule_Edit() { diff --git a/lib/htmlpurifier/HTMLPurifier/HTMLModule/Hypertext.php b/lib/htmlpurifier/HTMLPurifier/HTMLModule/Hypertext.php index e285e8ba1f..baa20fd14b 100644 --- a/lib/htmlpurifier/HTMLPurifier/HTMLModule/Hypertext.php +++ b/lib/htmlpurifier/HTMLPurifier/HTMLModule/Hypertext.php @@ -11,7 +11,6 @@ class HTMLPurifier_HTMLModule_Hypertext extends HTMLPurifier_HTMLModule var $name = 'Hypertext'; var $elements = array('a'); - var $info = array(); var $content_sets = array('Inline' => 'a'); function HTMLPurifier_HTMLModule_Hypertext() { diff --git a/lib/htmlpurifier/HTMLPurifier/HTMLModule/Image.php b/lib/htmlpurifier/HTMLPurifier/HTMLModule/Image.php index 3852836de7..bf234b1372 100644 --- a/lib/htmlpurifier/HTMLPurifier/HTMLModule/Image.php +++ b/lib/htmlpurifier/HTMLPurifier/HTMLModule/Image.php @@ -15,7 +15,6 @@ class HTMLPurifier_HTMLModule_Image extends HTMLPurifier_HTMLModule var $name = 'Image'; var $elements = array('img'); - var $info = array(); var $content_sets = array('Inline' => 'img'); function HTMLPurifier_HTMLModule_Image() { diff --git a/lib/htmlpurifier/HTMLPurifier/HTMLModule/List.php b/lib/htmlpurifier/HTMLPurifier/HTMLModule/List.php index c74982df4e..f9f2c4e21f 100644 --- a/lib/htmlpurifier/HTMLPurifier/HTMLModule/List.php +++ b/lib/htmlpurifier/HTMLPurifier/HTMLModule/List.php @@ -10,7 +10,7 @@ class HTMLPurifier_HTMLModule_List extends HTMLPurifier_HTMLModule var $name = 'List'; var $elements = array('dl', 'dt', 'dd', 'ol', 'ul', 'li'); - var $info = array(); + // According to the abstract schema, the List content set is a fully formed // one or more expr, but it invariably occurs in an optional declaration // so we're not going to do that subtlety. It might cause trouble diff --git a/lib/htmlpurifier/HTMLPurifier/HTMLModule/Presentation.php b/lib/htmlpurifier/HTMLPurifier/HTMLModule/Presentation.php index 42d9c11e46..5c80db407b 100644 --- a/lib/htmlpurifier/HTMLPurifier/HTMLModule/Presentation.php +++ b/lib/htmlpurifier/HTMLPurifier/HTMLModule/Presentation.php @@ -17,7 +17,6 @@ class HTMLPurifier_HTMLModule_Presentation extends HTMLPurifier_HTMLModule var $name = 'Presentation'; var $elements = array('b', 'big', 'hr', 'i', 'small', 'sub', 'sup', 'tt'); - var $info = array(); var $content_sets = array( 'Block' => 'hr', 'Inline' => 'b | big | i | small | sub | sup | tt' diff --git a/lib/htmlpurifier/HTMLPurifier/HTMLModule/Scripting.php b/lib/htmlpurifier/HTMLPurifier/HTMLModule/Scripting.php new file mode 100644 index 0000000000..e3ef802bf4 --- /dev/null +++ b/lib/htmlpurifier/HTMLPurifier/HTMLModule/Scripting.php @@ -0,0 +1,67 @@ +getHTMLDefinition(true); // get the raw version +$def->manager->addModule('Scripting'); + +This must come before any other calls to getHTMLDefinition() + +*/ + +/** + * Implements required attribute stipulation for