From f45a286b8d62f710b519a98c7d4b75a0c34d5d10 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 22 Jun 2009 13:56:49 +0400 Subject: strip_tags_long: use htmlpurifier to properly reformat html content --- .../HTMLPurifier/AttrTransform/Background.php | 23 +++++++++ .../library/HTMLPurifier/AttrTransform/BdoDir.php | 19 +++++++ .../library/HTMLPurifier/AttrTransform/BgColor.php | 23 +++++++++ .../HTMLPurifier/AttrTransform/BoolToCSS.php | 36 ++++++++++++++ .../library/HTMLPurifier/AttrTransform/Border.php | 18 +++++++ .../HTMLPurifier/AttrTransform/EnumToCSS.php | 58 ++++++++++++++++++++++ .../HTMLPurifier/AttrTransform/ImgRequired.php | 42 ++++++++++++++++ .../HTMLPurifier/AttrTransform/ImgSpace.php | 44 ++++++++++++++++ .../library/HTMLPurifier/AttrTransform/Input.php | 40 +++++++++++++++ .../library/HTMLPurifier/AttrTransform/Lang.php | 28 +++++++++++ .../library/HTMLPurifier/AttrTransform/Length.php | 27 ++++++++++ .../library/HTMLPurifier/AttrTransform/Name.php | 19 +++++++ .../HTMLPurifier/AttrTransform/SafeEmbed.php | 15 ++++++ .../HTMLPurifier/AttrTransform/SafeObject.php | 16 ++++++ .../HTMLPurifier/AttrTransform/SafeParam.php | 50 +++++++++++++++++++ .../HTMLPurifier/AttrTransform/ScriptRequired.php | 16 ++++++ .../HTMLPurifier/AttrTransform/Textarea.php | 18 +++++++ 17 files changed, 492 insertions(+) create mode 100755 lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php create mode 100755 lib/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php create mode 100755 lib/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php create mode 100755 lib/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php create mode 100755 lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php create mode 100755 lib/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php create mode 100755 lib/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php create mode 100755 lib/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php create mode 100755 lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php create mode 100755 lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php create mode 100755 lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php create mode 100755 lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php create mode 100755 lib/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php create mode 100755 lib/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php create mode 100755 lib/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php create mode 100755 lib/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php create mode 100755 lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php (limited to 'lib/htmlpurifier/library/HTMLPurifier/AttrTransform') diff --git a/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php new file mode 100755 index 000000000..0e1ff24a3 --- /dev/null +++ b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php @@ -0,0 +1,23 @@ +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/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php new file mode 100755 index 000000000..40310b914 --- /dev/null +++ b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php @@ -0,0 +1,19 @@ +get('Attr', 'DefaultTextDir'); + return $attr; + } + +} + +// vim: et sw=4 sts=4 diff --git a/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php new file mode 100755 index 000000000..ad3916bb9 --- /dev/null +++ b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php @@ -0,0 +1,23 @@ +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/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php new file mode 100755 index 000000000..51159b671 --- /dev/null +++ b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php @@ -0,0 +1,36 @@ +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/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php new file mode 100755 index 000000000..476b0b079 --- /dev/null +++ b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php @@ -0,0 +1,18 @@ +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/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php new file mode 100755 index 000000000..2a5b4514a --- /dev/null +++ b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php @@ -0,0 +1,58 @@ +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/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php new file mode 100755 index 000000000..25c9403c2 --- /dev/null +++ b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php @@ -0,0 +1,42 @@ +get('Core', 'RemoveInvalidImg')) return $attr; + $attr['src'] = $config->get('Attr', 'DefaultInvalidImage'); + $src = false; + } + + if (!isset($attr['alt'])) { + if ($src) { + $alt = $config->get('Attr', 'DefaultImageAlt'); + if ($alt === null) { + $attr['alt'] = basename($attr['src']); + } else { + $attr['alt'] = $alt; + } + } else { + $attr['alt'] = $config->get('Attr', 'DefaultInvalidImageAlt'); + } + } + + return $attr; + + } + +} + +// vim: et sw=4 sts=4 diff --git a/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php new file mode 100755 index 000000000..fd84c10c3 --- /dev/null +++ b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php @@ -0,0 +1,44 @@ + array('left', 'right'), + 'vspace' => array('top', 'bottom') + ); + + 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; + + $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; + + } + +} + +// vim: et sw=4 sts=4 diff --git a/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php new file mode 100755 index 000000000..16829552d --- /dev/null +++ b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php @@ -0,0 +1,40 @@ +pixels = new HTMLPurifier_AttrDef_HTML_Pixels(); + } + + 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']); + } + if (isset($attr['maxlength']) && $t !== 'text' && $t !== 'password') { + unset($attr['maxlength']); + } + 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 (isset($attr['src']) && $t !== 'image') { + unset($attr['src']); + } + if (!isset($attr['value']) && ($t === 'radio' || $t === 'checkbox')) { + $attr['value'] = ''; + } + return $attr; + } + +} + +// vim: et sw=4 sts=4 diff --git a/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php new file mode 100755 index 000000000..5869e7f82 --- /dev/null +++ b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php @@ -0,0 +1,28 @@ +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/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php new file mode 100755 index 000000000..e6f93aee3 --- /dev/null +++ b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php @@ -0,0 +1,19 @@ +confiscateAttr($attr, 'name'); + if ( isset($attr['id'])) return $attr; + $attr['id'] = $id; + return $attr; + } + +} + +// vim: et sw=4 sts=4 diff --git a/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php new file mode 100755 index 000000000..4da449981 --- /dev/null +++ b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php @@ -0,0 +1,15 @@ +uri = new HTMLPurifier_AttrDef_URI(true); // embedded + } + + public function transform($attr, $config, $context) { + // If we add support for other objects, we'll need to alter the + // transforms. + switch ($attr['name']) { + // application/x-shockwave-flash + // Keep this synchronized with Injector/SafeObject.php + case 'allowScriptAccess': + $attr['value'] = 'never'; + break; + case 'allowNetworking': + $attr['value'] = 'internal'; + break; + case 'wmode': + $attr['value'] = 'window'; + break; + case 'movie': + $attr['value'] = $this->uri->validate($attr['value'], $config, $context); + break; + // add other cases to support other param name/value pairs + default: + $attr['name'] = $attr['value'] = null; + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php new file mode 100755 index 000000000..4499050a2 --- /dev/null +++ b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php @@ -0,0 +1,16 @@ + + */ +class HTMLPurifier_AttrTransform_ScriptRequired extends HTMLPurifier_AttrTransform +{ + public function transform($attr, $config, $context) { + if (!isset($attr['type'])) { + $attr['type'] = 'text/javascript'; + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php new file mode 100755 index 000000000..81ac3488b --- /dev/null +++ b/lib/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php @@ -0,0 +1,18 @@ + + */ +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 -- cgit v1.2.3-54-g00ecf