mirror of
https://github.com/ezyang/htmlpurifier.git
synced 2024-12-22 16:31:53 +00:00
[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
This commit is contained in:
parent
0426985c81
commit
fd35c43643
3
NEWS
3
NEWS
@ -35,6 +35,9 @@ NEWS ( CHANGELOG and HISTORY ) HTMLPurifier
|
|||||||
. Demo script removed: it has been added to the website's repository
|
. Demo script removed: it has been added to the website's repository
|
||||||
. Basic.php script modified to work out of the box
|
. Basic.php script modified to work out of the box
|
||||||
. Refactor AttrTransform classes to reduce duplication
|
. 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
|
1.6.0, released 2007-04-01
|
||||||
! Support for most common deprecated attributes via transformations:
|
! Support for most common deprecated attributes via transformations:
|
||||||
|
60
library/HTMLPurifier/AttrTransform/EnumToCSS.php
Normal file
60
library/HTMLPurifier/AttrTransform/EnumToCSS.php
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once 'HTMLPurifier/AttrTransform.php';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generic pre-transform that converts an attribute with a fixed number of
|
||||||
|
* values (enumerated) to CSS.
|
||||||
|
*/
|
||||||
|
class HTMLPurifier_AttrTransform_EnumToCSS extends HTMLPurifier_AttrTransform {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of attribute to transform from
|
||||||
|
*/
|
||||||
|
var $attr;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lookup array of attribute values to CSS
|
||||||
|
*/
|
||||||
|
var $enumToCSS = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Case sensitivity of the matching
|
||||||
|
* @warning Currently can only be guaranteed to work with ASCII
|
||||||
|
* values.
|
||||||
|
*/
|
||||||
|
var $caseSensitive = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $attr String attribute name to transform from
|
||||||
|
* @param $enumToCSS Lookup array of attribute values to CSS
|
||||||
|
* @param $case_sensitive Boolean case sensitivity indicator, default false
|
||||||
|
*/
|
||||||
|
function HTMLPurifier_AttrTransform_EnumToCSS($attr, $enum_to_css, $case_sensitive = false) {
|
||||||
|
$this->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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
@ -1,35 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
require_once 'HTMLPurifier/AttrTransform.php';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pre-transform that changes deprecated align attribute to text-align.
|
|
||||||
*/
|
|
||||||
class HTMLPurifier_AttrTransform_TextAlign
|
|
||||||
extends HTMLPurifier_AttrTransform {
|
|
||||||
|
|
||||||
function transform($attr, $config, &$context) {
|
|
||||||
|
|
||||||
if (!isset($attr['align'])) return $attr;
|
|
||||||
|
|
||||||
$align = $this->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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
|
@ -7,13 +7,13 @@ require_once 'HTMLPurifier/TagTransform/Center.php';
|
|||||||
require_once 'HTMLPurifier/TagTransform/Font.php';
|
require_once 'HTMLPurifier/TagTransform/Font.php';
|
||||||
|
|
||||||
require_once 'HTMLPurifier/AttrTransform/Lang.php';
|
require_once 'HTMLPurifier/AttrTransform/Lang.php';
|
||||||
require_once 'HTMLPurifier/AttrTransform/TextAlign.php';
|
|
||||||
require_once 'HTMLPurifier/AttrTransform/BgColor.php';
|
require_once 'HTMLPurifier/AttrTransform/BgColor.php';
|
||||||
require_once 'HTMLPurifier/AttrTransform/BoolToCSS.php';
|
require_once 'HTMLPurifier/AttrTransform/BoolToCSS.php';
|
||||||
require_once 'HTMLPurifier/AttrTransform/Border.php';
|
require_once 'HTMLPurifier/AttrTransform/Border.php';
|
||||||
require_once 'HTMLPurifier/AttrTransform/Name.php';
|
require_once 'HTMLPurifier/AttrTransform/Name.php';
|
||||||
require_once 'HTMLPurifier/AttrTransform/Length.php';
|
require_once 'HTMLPurifier/AttrTransform/Length.php';
|
||||||
require_once 'HTMLPurifier/AttrTransform/ImgSpace.php';
|
require_once 'HTMLPurifier/AttrTransform/ImgSpace.php';
|
||||||
|
require_once 'HTMLPurifier/AttrTransform/EnumToCSS.php';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Proprietary module that transforms deprecated elements into Strict
|
* Proprietary module that transforms deprecated elements into Strict
|
||||||
@ -61,6 +61,11 @@ class HTMLPurifier_HTMLModule_TransformToStrict extends HTMLPurifier_HTMLModule
|
|||||||
}
|
}
|
||||||
|
|
||||||
// deprecated attribute transforms
|
// 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['h1']->attr_transform_pre['align'] =
|
||||||
$this->info['h2']->attr_transform_pre['align'] =
|
$this->info['h2']->attr_transform_pre['align'] =
|
||||||
$this->info['h3']->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['h5']->attr_transform_pre['align'] =
|
||||||
$this->info['h6']->attr_transform_pre['align'] =
|
$this->info['h6']->attr_transform_pre['align'] =
|
||||||
$this->info['p'] ->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,
|
// xml:lang <=> lang mirroring, implement in TransformToStrict,
|
||||||
// this is overridden in TransformToXHTML11
|
// this is overridden in TransformToXHTML11
|
||||||
|
@ -1,17 +1,17 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
require_once 'HTMLPurifier/AttrTransform/TextAlign.php';
|
require_once 'HTMLPurifier/AttrTransform/EnumToCSS.php';
|
||||||
require_once 'HTMLPurifier/AttrTransformHarness.php';
|
require_once 'HTMLPurifier/AttrTransformHarness.php';
|
||||||
|
|
||||||
class HTMLPurifier_AttrTransform_TextAlignTest extends HTMLPurifier_AttrTransformHarness
|
class HTMLPurifier_AttrTransform_EnumToCSSTest extends HTMLPurifier_AttrTransformHarness
|
||||||
{
|
{
|
||||||
|
|
||||||
function setUp() {
|
function testRegular() {
|
||||||
parent::setUp();
|
|
||||||
$this->obj = new HTMLPurifier_AttrTransform_TextAlign();
|
$this->obj = new HTMLPurifier_AttrTransform_EnumToCSS('align', array(
|
||||||
}
|
'left' => 'text-align:left;',
|
||||||
|
'right' => 'text-align:right;'
|
||||||
function test() {
|
));
|
||||||
|
|
||||||
// leave empty arrays alone
|
// leave empty arrays alone
|
||||||
$this->assertResult( array() );
|
$this->assertResult( array() );
|
||||||
@ -31,16 +31,6 @@ class HTMLPurifier_AttrTransform_TextAlignTest extends HTMLPurifier_AttrTransfor
|
|||||||
array('style' => 'text-align:right;')
|
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
|
// drop garbage value
|
||||||
$this->assertResult(
|
$this->assertResult(
|
||||||
array('align' => 'invalid'),
|
array('align' => 'invalid'),
|
||||||
@ -53,10 +43,32 @@ class HTMLPurifier_AttrTransform_TextAlignTest extends HTMLPurifier_AttrTransfor
|
|||||||
array('style' => 'text-align:left;font-weight:bold;')
|
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
|
// test case insensitivity
|
||||||
$this->assertResult(
|
$this->assertResult(
|
||||||
array('align' => 'CENTER'),
|
array('align' => 'RIGHT'),
|
||||||
array('style' => 'text-align:center;')
|
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()
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
@ -95,6 +95,22 @@ class HTMLPurifier_Strategy_ValidateAttributesTest extends
|
|||||||
'<h1 align="center">Centered Headline</h1>',
|
'<h1 align="center">Centered Headline</h1>',
|
||||||
'<h1 style="text-align:center;">Centered Headline</h1>'
|
'<h1 style="text-align:center;">Centered Headline</h1>'
|
||||||
);
|
);
|
||||||
|
$this->assertResult(
|
||||||
|
'<h1 align="right">Right-aligned Headline</h1>',
|
||||||
|
'<h1 style="text-align:right;">Right-aligned Headline</h1>'
|
||||||
|
);
|
||||||
|
$this->assertResult(
|
||||||
|
'<h1 align="left">Left-aligned Headline</h1>',
|
||||||
|
'<h1 style="text-align:left;">Left-aligned Headline</h1>'
|
||||||
|
);
|
||||||
|
$this->assertResult(
|
||||||
|
'<p align="justify">Justified Paragraph</p>',
|
||||||
|
'<p style="text-align:justify;">Justified Paragraph</p>'
|
||||||
|
);
|
||||||
|
$this->assertResult(
|
||||||
|
'<h1 align="invalid">Invalid Headline</h1>',
|
||||||
|
'<h1>Invalid Headline</h1>'
|
||||||
|
);
|
||||||
|
|
||||||
// test table
|
// test table
|
||||||
$this->assertResult(
|
$this->assertResult(
|
||||||
@ -237,6 +253,8 @@ class HTMLPurifier_Strategy_ValidateAttributesTest extends
|
|||||||
'<b xml:lang="en">asdf</b>', array('HTML.Doctype' => 'XHTML 1.1')
|
'<b xml:lang="en">asdf</b>', array('HTML.Doctype' => 'XHTML 1.1')
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -40,12 +40,12 @@ $test_files[] = 'AttrTransform/BdoDirTest.php';
|
|||||||
$test_files[] = 'AttrTransform/BgColorTest.php';
|
$test_files[] = 'AttrTransform/BgColorTest.php';
|
||||||
$test_files[] = 'AttrTransform/BoolToCSSTest.php';
|
$test_files[] = 'AttrTransform/BoolToCSSTest.php';
|
||||||
$test_files[] = 'AttrTransform/BorderTest.php';
|
$test_files[] = 'AttrTransform/BorderTest.php';
|
||||||
|
$test_files[] = 'AttrTransform/EnumToCSSTest.php';
|
||||||
$test_files[] = 'AttrTransform/ImgRequiredTest.php';
|
$test_files[] = 'AttrTransform/ImgRequiredTest.php';
|
||||||
$test_files[] = 'AttrTransform/ImgSpaceTest.php';
|
$test_files[] = 'AttrTransform/ImgSpaceTest.php';
|
||||||
$test_files[] = 'AttrTransform/LangTest.php';
|
$test_files[] = 'AttrTransform/LangTest.php';
|
||||||
$test_files[] = 'AttrTransform/LengthTest.php';
|
$test_files[] = 'AttrTransform/LengthTest.php';
|
||||||
$test_files[] = 'AttrTransform/NameTest.php';
|
$test_files[] = 'AttrTransform/NameTest.php';
|
||||||
$test_files[] = 'AttrTransform/TextAlignTest.php';
|
|
||||||
$test_files[] = 'ChildDef/ChameleonTest.php';
|
$test_files[] = 'ChildDef/ChameleonTest.php';
|
||||||
$test_files[] = 'ChildDef/CustomTest.php';
|
$test_files[] = 'ChildDef/CustomTest.php';
|
||||||
$test_files[] = 'ChildDef/OptionalTest.php';
|
$test_files[] = 'ChildDef/OptionalTest.php';
|
||||||
|
Loading…
Reference in New Issue
Block a user