From fd35c43643915b5f82d16cef697508dfce0e1447 Mon Sep 17 00:00:00 2001 From: "Edward Z. Yang" Date: Sat, 5 May 2007 15:48:41 +0000 Subject: [PATCH] [1.6.1] Implement generic EnumToCSS attribute transformation, migrate text alignment to it git-svn-id: http://htmlpurifier.org/svnroot/htmlpurifier/trunk@1017 48356398-32a2-884e-a903-53898d9a118a --- NEWS | 3 + .../HTMLPurifier/AttrTransform/EnumToCSS.php | 60 +++++++++++++++++++ .../HTMLPurifier/AttrTransform/TextAlign.php | 35 ----------- .../HTMLModule/TransformToStrict.php | 9 ++- .../{TextAlignTest.php => EnumToCSSTest.php} | 52 +++++++++------- .../Strategy/ValidateAttributesTest.php | 18 ++++++ tests/test_files.php | 2 +- 7 files changed, 121 insertions(+), 58 deletions(-) create mode 100644 library/HTMLPurifier/AttrTransform/EnumToCSS.php delete mode 100644 library/HTMLPurifier/AttrTransform/TextAlign.php rename tests/HTMLPurifier/AttrTransform/{TextAlignTest.php => EnumToCSSTest.php} (56%) diff --git a/NEWS b/NEWS index bf7b744b..c3f602a6 100644 --- a/NEWS +++ b/NEWS @@ -35,6 +35,9 @@ NEWS ( CHANGELOG and HISTORY ) HTMLPurifier . Demo script removed: it has been added to the website's repository . Basic.php script modified to work out of the box . Refactor AttrTransform classes to reduce duplication +. AttrTransform_TextAlign axed in favor of a more general + AttrTransform_EnumToCSS, refer to HTMLModule/TransformToStrict.php to + see how the new equivalent is implemented 1.6.0, released 2007-04-01 ! Support for most common deprecated attributes via transformations: diff --git a/library/HTMLPurifier/AttrTransform/EnumToCSS.php b/library/HTMLPurifier/AttrTransform/EnumToCSS.php new file mode 100644 index 00000000..ed4dfc32 --- /dev/null +++ b/library/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/library/HTMLPurifier/AttrTransform/TextAlign.php b/library/HTMLPurifier/AttrTransform/TextAlign.php deleted file mode 100644 index de8dcb48..00000000 --- a/library/HTMLPurifier/AttrTransform/TextAlign.php +++ /dev/null @@ -1,35 +0,0 @@ -confiscateAttr($attr, 'align'); - $align = strtolower(trim($align)); - - $values = array('left' => 1, - 'right' => 1, - 'center' => 1, - 'justify' => 1); - - if (!isset($values[$align])) { - return $attr; - } - - $this->prependCSS($attr, "text-align:$align;"); - - return $attr; - - } - -} - -?> \ No newline at end of file diff --git a/library/HTMLPurifier/HTMLModule/TransformToStrict.php b/library/HTMLPurifier/HTMLModule/TransformToStrict.php index df3e38c7..47df2511 100644 --- a/library/HTMLPurifier/HTMLModule/TransformToStrict.php +++ b/library/HTMLPurifier/HTMLModule/TransformToStrict.php @@ -7,13 +7,13 @@ require_once 'HTMLPurifier/TagTransform/Center.php'; require_once 'HTMLPurifier/TagTransform/Font.php'; require_once 'HTMLPurifier/AttrTransform/Lang.php'; -require_once 'HTMLPurifier/AttrTransform/TextAlign.php'; require_once 'HTMLPurifier/AttrTransform/BgColor.php'; require_once 'HTMLPurifier/AttrTransform/BoolToCSS.php'; require_once 'HTMLPurifier/AttrTransform/Border.php'; require_once 'HTMLPurifier/AttrTransform/Name.php'; require_once 'HTMLPurifier/AttrTransform/Length.php'; require_once 'HTMLPurifier/AttrTransform/ImgSpace.php'; +require_once 'HTMLPurifier/AttrTransform/EnumToCSS.php'; /** * Proprietary module that transforms deprecated elements into Strict @@ -61,6 +61,11 @@ class HTMLPurifier_HTMLModule_TransformToStrict extends HTMLPurifier_HTMLModule } // deprecated attribute transforms + + // align battery + $align_lookup = array(); + $align_values = array('left', 'right', 'center', 'justify'); + foreach ($align_values as $v) $align_lookup[$v] = "text-align:$v;"; $this->info['h1']->attr_transform_pre['align'] = $this->info['h2']->attr_transform_pre['align'] = $this->info['h3']->attr_transform_pre['align'] = @@ -68,7 +73,7 @@ class HTMLPurifier_HTMLModule_TransformToStrict extends HTMLPurifier_HTMLModule $this->info['h5']->attr_transform_pre['align'] = $this->info['h6']->attr_transform_pre['align'] = $this->info['p'] ->attr_transform_pre['align'] = - new HTMLPurifier_AttrTransform_TextAlign(); + new HTMLPurifier_AttrTransform_EnumToCSS('align', $align_lookup); // xml:lang <=> lang mirroring, implement in TransformToStrict, // this is overridden in TransformToXHTML11 diff --git a/tests/HTMLPurifier/AttrTransform/TextAlignTest.php b/tests/HTMLPurifier/AttrTransform/EnumToCSSTest.php similarity index 56% rename from tests/HTMLPurifier/AttrTransform/TextAlignTest.php rename to tests/HTMLPurifier/AttrTransform/EnumToCSSTest.php index 55d6cb05..565cee45 100644 --- a/tests/HTMLPurifier/AttrTransform/TextAlignTest.php +++ b/tests/HTMLPurifier/AttrTransform/EnumToCSSTest.php @@ -1,17 +1,17 @@ obj = new HTMLPurifier_AttrTransform_TextAlign(); - } - - function test() { + function testRegular() { + + $this->obj = new HTMLPurifier_AttrTransform_EnumToCSS('align', array( + 'left' => 'text-align:left;', + 'right' => 'text-align:right;' + )); // leave empty arrays alone $this->assertResult( array() ); @@ -31,16 +31,6 @@ class HTMLPurifier_AttrTransform_TextAlignTest extends HTMLPurifier_AttrTransfor array('style' => 'text-align:right;') ); - $this->assertResult( - array('align' => 'center'), - array('style' => 'text-align:center;') - ); - - $this->assertResult( - array('align' => 'justify'), - array('style' => 'text-align:justify;') - ); - // drop garbage value $this->assertResult( array('align' => 'invalid'), @@ -53,10 +43,32 @@ class HTMLPurifier_AttrTransform_TextAlignTest extends HTMLPurifier_AttrTransfor array('style' => 'text-align:left;font-weight:bold;') ); + } + + function testCaseInsensitive() { + + $this->obj = new HTMLPurifier_AttrTransform_EnumToCSS('align', array( + 'right' => 'text-align:right;' + )); + // test case insensitivity $this->assertResult( - array('align' => 'CENTER'), - array('style' => 'text-align:center;') + array('align' => 'RIGHT'), + array('style' => 'text-align:right;') + ); + + } + + function testCaseSensitive() { + + $this->obj = new HTMLPurifier_AttrTransform_EnumToCSS('align', array( + 'right' => 'text-align:right;' + ), true); + + // test case insensitivity + $this->assertResult( + array('align' => 'RIGHT'), + array() ); } diff --git a/tests/HTMLPurifier/Strategy/ValidateAttributesTest.php b/tests/HTMLPurifier/Strategy/ValidateAttributesTest.php index 4871ea8f..57465d8e 100644 --- a/tests/HTMLPurifier/Strategy/ValidateAttributesTest.php +++ b/tests/HTMLPurifier/Strategy/ValidateAttributesTest.php @@ -95,6 +95,22 @@ class HTMLPurifier_Strategy_ValidateAttributesTest extends '

Centered Headline

', '

Centered Headline

' ); + $this->assertResult( + '

Right-aligned Headline

', + '

Right-aligned Headline

' + ); + $this->assertResult( + '

Left-aligned Headline

', + '

Left-aligned Headline

' + ); + $this->assertResult( + '

Justified Paragraph

', + '

Justified Paragraph

' + ); + $this->assertResult( + '

Invalid Headline

', + '

Invalid Headline

' + ); // test table $this->assertResult( @@ -237,6 +253,8 @@ class HTMLPurifier_Strategy_ValidateAttributesTest extends 'asdf', array('HTML.Doctype' => 'XHTML 1.1') ); + + } } diff --git a/tests/test_files.php b/tests/test_files.php index 14c4b756..191e3b88 100644 --- a/tests/test_files.php +++ b/tests/test_files.php @@ -40,12 +40,12 @@ $test_files[] = 'AttrTransform/BdoDirTest.php'; $test_files[] = 'AttrTransform/BgColorTest.php'; $test_files[] = 'AttrTransform/BoolToCSSTest.php'; $test_files[] = 'AttrTransform/BorderTest.php'; +$test_files[] = 'AttrTransform/EnumToCSSTest.php'; $test_files[] = 'AttrTransform/ImgRequiredTest.php'; $test_files[] = 'AttrTransform/ImgSpaceTest.php'; $test_files[] = 'AttrTransform/LangTest.php'; $test_files[] = 'AttrTransform/LengthTest.php'; $test_files[] = 'AttrTransform/NameTest.php'; -$test_files[] = 'AttrTransform/TextAlignTest.php'; $test_files[] = 'ChildDef/ChameleonTest.php'; $test_files[] = 'ChildDef/CustomTest.php'; $test_files[] = 'ChildDef/OptionalTest.php';