From ac50d333a5aa39b2507e424efdf6528967d5ab8a Mon Sep 17 00:00:00 2001 From: "Edward Z. Yang" Date: Mon, 7 May 2007 00:38:23 +0000 Subject: [PATCH] [1.7.0] Unit test for ElementDef created, ElementDef behavior modified to be more flexible git-svn-id: http://htmlpurifier.org/svnroot/htmlpurifier/trunk@1038 48356398-32a2-884e-a903-53898d9a118a --- NEWS | 2 + library/HTMLPurifier/ElementDef.php | 29 +++++-- tests/HTMLPurifier/ElementDefTest.php | 105 ++++++++++++++++++++++++++ tests/test_files.php | 1 + 4 files changed, 132 insertions(+), 5 deletions(-) create mode 100644 tests/HTMLPurifier/ElementDefTest.php diff --git a/NEWS b/NEWS index 204a559d..0988f7a9 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,8 @@ NEWS ( CHANGELOG and HISTORY ) HTMLPurifier ========================== 1.7.0, unknown release date +. Unit test for ElementDef created, ElementDef behavior modified to + be more flexible 1.6.1, released 2007-05-05 ! Support for more deprecated attributes via transformations: diff --git a/library/HTMLPurifier/ElementDef.php b/library/HTMLPurifier/ElementDef.php index 73c94abe..81e24338 100644 --- a/library/HTMLPurifier/ElementDef.php +++ b/library/HTMLPurifier/ElementDef.php @@ -99,16 +99,20 @@ class HTMLPurifier_ElementDef // merge in the includes // sorry, no way to override an include foreach ($v as $v2) { - $def->attr[0][] = $v2; + $this->attr[0][] = $v2; } continue; } + if ($v === false) { + if (isset($this->attr[$k])) unset($this->attr[$k]); + continue; + } $this->attr[$k] = $v; } - foreach($def->attr_transform_pre as $k => $v) $this->attr_transform_pre[$k] = $v; - foreach($def->attr_transform_post as $k => $v) $this->attr_transform_post[$k] = $v; - foreach($def->auto_close as $k => $v) $this->auto_close[$k] = $v; - foreach($def->excludes as $k => $v) $this->excludes[$k] = $v; + $this->_mergeAssocArray($this->attr_transform_pre, $def->attr_transform_pre); + $this->_mergeAssocArray($this->attr_transform_post, $def->attr_transform_post); + $this->_mergeAssocArray($this->auto_close, $def->auto_close); + $this->_mergeAssocArray($this->excludes, $def->excludes); if(!is_null($def->child)) $this->child = $def->child; if(!empty($def->content_model)) $this->content_model .= ' | ' . $def->content_model; @@ -117,6 +121,21 @@ class HTMLPurifier_ElementDef } + /** + * Merges one array into another, removes values which equal false + * @param $a1 Array by reference that is merged into + * @param $a2 Array that merges into $a1 + */ + function _mergeAssocArray(&$a1, $a2) { + foreach ($a2 as $k => $v) { + if ($v === false) { + if (isset($a1[$k])) unset($a1[$k]); + continue; + } + $a1[$k] = $v; + } + } + } ?> diff --git a/tests/HTMLPurifier/ElementDefTest.php b/tests/HTMLPurifier/ElementDefTest.php new file mode 100644 index 00000000..893e450f --- /dev/null +++ b/tests/HTMLPurifier/ElementDefTest.php @@ -0,0 +1,105 @@ +standalone = true; + $def1->attr = array( + 0 => array('old-include'), + 'old-attr' => $old, + 'overloaded-attr' => $overloaded_old, + 'removed-attr' => $removed, + ); + $def1->attr_transform_pre = + $def1->attr_transform_post = array( + 'old-transform' => $old, + 'overloaded-transform' => $overloaded_old, + 'removed-transform' => $removed, + ); + $def1->child = $overloaded_old; + $def1->content_model = 'old'; + $def1->content_model_type = $overloaded_old; + $def1->auto_close = array( + 'old' => true, + 'removed-old' => true + ); + $def1->descendants_are_inline = $overloaded_old; + $def1->excludes = array( + 'old' => true, + 'removed-old' => true + ); + + $def2->standalone = false; + $def2->attr = array( + 0 => array('new-include'), + 'new-attr' => $new, + 'overloaded-attr' => $overloaded_new, + 'removed-attr' => false, + ); + $def2->attr_transform_pre = + $def2->attr_transform_post = array( + 'new-transform' => $new, + 'overloaded-transform' => $overloaded_new, + 'removed-transform' => false, + ); + $def2->child = $new; + $def2->content_model = 'new'; + $def2->content_model_type = $overloaded_new; + $def2->auto_close = array( + 'new' => true, + 'removed-old' => false + ); + $def2->descendants_are_inline = $overloaded_new; + $def2->excludes = array( + 'new' => true, + 'removed-old' => false + ); + + $def1->mergeIn($def2); + $def1->mergeIn($def3); // empty, has no effect + + $this->assertIdentical($def1->standalone, true); + $this->assertIdentical($def1->attr, array( + 0 => array('old-include', 'new-include'), + 'old-attr' => $old, + 'overloaded-attr' => $overloaded_new, + 'new-attr' => $new, + )); + $this->assertIdentical($def1->attr_transform_pre, $def1->attr_transform_post); + $this->assertIdentical($def1->attr_transform_pre, array( + 'old-transform' => $old, + 'overloaded-transform' => $overloaded_new, + 'new-transform' => $new, + )); + $this->assertIdentical($def1->child, $new); + $this->assertIdentical($def1->content_model, 'old | new'); + $this->assertIdentical($def1->content_model_type, $overloaded_new); + $this->assertIdentical($def1->auto_close, array( + 'old' => true, + 'new' => true + )); + $this->assertIdentical($def1->descendants_are_inline, $overloaded_new); + $this->assertIdentical($def1->excludes, array( + 'old' => true, + 'new' => true + )); + + } + +} + +?> \ No newline at end of file diff --git a/tests/test_files.php b/tests/test_files.php index 191e3b88..1b59bc0e 100644 --- a/tests/test_files.php +++ b/tests/test_files.php @@ -55,6 +55,7 @@ $test_files[] = 'ChildDef/TableTest.php'; $test_files[] = 'ConfigSchemaTest.php'; $test_files[] = 'ConfigTest.php'; $test_files[] = 'ContextTest.php'; +$test_files[] = 'ElementDefTest.php'; $test_files[] = 'EncoderTest.php'; $test_files[] = 'EntityLookupTest.php'; $test_files[] = 'EntityParserTest.php';