mirror of
https://github.com/ezyang/htmlpurifier.git
synced 2024-12-22 16:31:53 +00:00
[1.4.0] Implement 'background' shorthand CSS property.
git-svn-id: http://htmlpurifier.org/svnroot/htmlpurifier/trunk@663 48356398-32a2-884e-a903-53898d9a118a
This commit is contained in:
parent
c24916e1d6
commit
d693c4ea09
7
NEWS
7
NEWS
@ -12,13 +12,12 @@ NEWS ( CHANGELOG and HISTORY ) HTMLPurifier
|
|||||||
1.4.0, unknown release date
|
1.4.0, unknown release date
|
||||||
! Implemented list-style-image, URIs now allowed in list-style
|
! Implemented list-style-image, URIs now allowed in list-style
|
||||||
! Implemented background-image, background-repeat, background-attachment
|
! Implemented background-image, background-repeat, background-attachment
|
||||||
and background-position CSS properties. Background shorthand property is
|
and background-position CSS properties. Shorthand property background
|
||||||
currently equivalent to background-image and does not support the
|
supports all of these properties.
|
||||||
new properties.
|
|
||||||
! Configuration documentation looks nicer
|
! Configuration documentation looks nicer
|
||||||
! Added smoketest 'all.php', which loads all other smoketests via frames
|
|
||||||
! Added %Core.EscapeNonASCIICharacters to workaround loss of Unicode
|
! Added %Core.EscapeNonASCIICharacters to workaround loss of Unicode
|
||||||
characters while %Core.Encoding is set to a non-UTF-8 encoding.
|
characters while %Core.Encoding is set to a non-UTF-8 encoding.
|
||||||
|
. Added smoketest 'all.php', which loads all other smoketests via frames
|
||||||
. Implemented AttrDef_CSSURI for url(http://google.com) style declarations
|
. Implemented AttrDef_CSSURI for url(http://google.com) style declarations
|
||||||
. Added convenient single test selector form on test runner
|
. Added convenient single test selector form on test runner
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ thead th {text-align:left;padding:0.1em;background-color:#EEE;}
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr><th colspan="2">Standard</th></tr>
|
<tr><th colspan="2">Standard</th></tr>
|
||||||
<tr class="css1 impl-yes"><td>background-color</td><td>COMPOSITE(<color>, transparent)</td></tr>
|
<tr class="css1 impl-yes"><td>background-color</td><td>COMPOSITE(<color>, transparent)</td></tr>
|
||||||
<tr class="css1 impl-partial"><td>background</td><td>SHORTHAND, currently alias for background-color</td></tr>
|
<tr class="css1 impl-yes"><td>background</td><td>SHORTHAND, currently alias for background-color</td></tr>
|
||||||
<tr class="css1 impl-yes"><td>border</td><td>SHORTHAND, MULTIPLE</td></tr>
|
<tr class="css1 impl-yes"><td>border</td><td>SHORTHAND, MULTIPLE</td></tr>
|
||||||
<tr class="css1 impl-yes"><td>border-color</td><td>MULTIPLE</td></tr>
|
<tr class="css1 impl-yes"><td>border-color</td><td>MULTIPLE</td></tr>
|
||||||
<tr class="css1 impl-yes"><td>border-style</td><td>MULTIPLE</td></tr>
|
<tr class="css1 impl-yes"><td>border-style</td><td>MULTIPLE</td></tr>
|
||||||
@ -231,7 +231,7 @@ Mozilla on inside and needs -moz-outline, no IE support.</td></tr>
|
|||||||
|
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr><th colspan="3">CSS</th></tr>
|
<tr><th colspan="3">CSS</th></tr>
|
||||||
<tr class="impl-yes"><td>style</td><td>All</td><td>Not all properties may be implemented, parser is good though.</td></tr>
|
<tr class="impl-yes"><td>style</td><td>All</td><td>Parser is reasonably functional. Status here doesn't count individual properties.</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|
||||||
<tbody>
|
<tbody>
|
||||||
|
87
library/HTMLPurifier/AttrDef/Background.php
Normal file
87
library/HTMLPurifier/AttrDef/Background.php
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once 'HTMLPurifier/AttrDef.php';
|
||||||
|
require_once 'HTMLPurifier/CSSDefinition.php';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates shorthand CSS property background.
|
||||||
|
* @warning Does not support url tokens that have internal spaces.
|
||||||
|
*/
|
||||||
|
class HTMLPurifier_AttrDef_Background extends HTMLPurifier_AttrDef
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Local copy of component validators.
|
||||||
|
* @note See HTMLPurifier_AttrDef_Font::$info for a similar impl.
|
||||||
|
*/
|
||||||
|
var $info;
|
||||||
|
|
||||||
|
function HTMLPurifier_AttrDef_Background($config) {
|
||||||
|
$def = $config->getCSSDefinition();
|
||||||
|
$this->info['background-color'] = $def->info['background-color'];
|
||||||
|
$this->info['background-image'] = $def->info['background-image'];
|
||||||
|
$this->info['background-repeat'] = $def->info['background-repeat'];
|
||||||
|
$this->info['background-attachment'] = $def->info['background-attachment'];
|
||||||
|
$this->info['background-position'] = $def->info['background-position'];
|
||||||
|
}
|
||||||
|
|
||||||
|
function validate($string, $config, &$context) {
|
||||||
|
|
||||||
|
// regular pre-processing
|
||||||
|
$string = $this->parseCDATA($string);
|
||||||
|
if ($string === '') return false;
|
||||||
|
|
||||||
|
// assumes URI doesn't have spaces in it
|
||||||
|
$bits = explode(' ', strtolower($string)); // bits to process
|
||||||
|
|
||||||
|
$caught = array();
|
||||||
|
$caught['color'] = false;
|
||||||
|
$caught['image'] = false;
|
||||||
|
$caught['repeat'] = false;
|
||||||
|
$caught['attachment'] = false;
|
||||||
|
$caught['position'] = false;
|
||||||
|
|
||||||
|
$i = 0; // number of catches
|
||||||
|
$none = false;
|
||||||
|
|
||||||
|
foreach ($bits as $bit) {
|
||||||
|
if ($bit === '') continue;
|
||||||
|
foreach ($caught as $key => $status) {
|
||||||
|
if ($key != 'position') {
|
||||||
|
if ($status !== false) continue;
|
||||||
|
$r = $this->info['background-' . $key]->validate($bit, $config, $context);
|
||||||
|
} else {
|
||||||
|
$r = $bit;
|
||||||
|
}
|
||||||
|
if ($r === false) continue;
|
||||||
|
if ($key == 'position') {
|
||||||
|
if ($caught[$key] === false) $caught[$key] = '';
|
||||||
|
$caught[$key] .= $r . ' ';
|
||||||
|
} else {
|
||||||
|
$caught[$key] = $r;
|
||||||
|
}
|
||||||
|
$i++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$i) return false;
|
||||||
|
if ($caught['position'] !== false) {
|
||||||
|
$caught['position'] = $this->info['background-position']->
|
||||||
|
validate($caught['position'], $config, $context);
|
||||||
|
}
|
||||||
|
|
||||||
|
$ret = array();
|
||||||
|
foreach ($caught as $value) {
|
||||||
|
if ($value === false) continue;
|
||||||
|
$ret[] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($ret)) return false;
|
||||||
|
return implode(' ', $ret);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
@ -53,6 +53,7 @@ class HTMLPurifier_AttrDef_ListStyle extends HTMLPurifier_AttrDef
|
|||||||
}
|
}
|
||||||
$caught[$key] = $r;
|
$caught[$key] = $r;
|
||||||
$i++;
|
$i++;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,6 +12,8 @@ require_once 'HTMLPurifier/AttrDef/Font.php';
|
|||||||
require_once 'HTMLPurifier/AttrDef/Border.php';
|
require_once 'HTMLPurifier/AttrDef/Border.php';
|
||||||
require_once 'HTMLPurifier/AttrDef/ListStyle.php';
|
require_once 'HTMLPurifier/AttrDef/ListStyle.php';
|
||||||
require_once 'HTMLPurifier/AttrDef/CSSURI.php';
|
require_once 'HTMLPurifier/AttrDef/CSSURI.php';
|
||||||
|
require_once 'HTMLPurifier/AttrDef/BackgroundPosition.php';
|
||||||
|
require_once 'HTMLPurifier/AttrDef/Background.php';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines allowed CSS attributes and what their values are.
|
* Defines allowed CSS attributes and what their values are.
|
||||||
@ -81,9 +83,6 @@ class HTMLPurifier_CSSDefinition
|
|||||||
);
|
);
|
||||||
$this->info['background-position'] = new HTMLPurifier_AttrDef_BackgroundPosition();
|
$this->info['background-position'] = new HTMLPurifier_AttrDef_BackgroundPosition();
|
||||||
|
|
||||||
// pending its own validator as a shorthand
|
|
||||||
$this->info['background'] =
|
|
||||||
|
|
||||||
$border_color =
|
$border_color =
|
||||||
$this->info['border-top-color'] =
|
$this->info['border-top-color'] =
|
||||||
$this->info['border-bottom-color'] =
|
$this->info['border-bottom-color'] =
|
||||||
@ -94,6 +93,8 @@ class HTMLPurifier_CSSDefinition
|
|||||||
new HTMLPurifier_AttrDef_Color()
|
new HTMLPurifier_AttrDef_Color()
|
||||||
));
|
));
|
||||||
|
|
||||||
|
$this->info['background'] = new HTMLPurifier_AttrDef_Background($config);
|
||||||
|
|
||||||
$this->info['border-color'] = new HTMLPurifier_AttrDef_Multiple($border_color);
|
$this->info['border-color'] = new HTMLPurifier_AttrDef_Multiple($border_color);
|
||||||
|
|
||||||
$border_width =
|
$border_width =
|
||||||
|
21
tests/HTMLPurifier/AttrDef/BackgroundTest.php
Normal file
21
tests/HTMLPurifier/AttrDef/BackgroundTest.php
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once 'HTMLPurifier/AttrDefHarness.php';
|
||||||
|
require_once 'HTMLPurifier/AttrDef/Background.php';
|
||||||
|
|
||||||
|
class HTMLPurifier_AttrDef_BackgroundTest extends HTMLPurifier_AttrDefHarness
|
||||||
|
{
|
||||||
|
|
||||||
|
function test() {
|
||||||
|
|
||||||
|
$this->def = new HTMLPurifier_AttrDef_Background(HTMLPurifier_Config::createDefault());
|
||||||
|
|
||||||
|
$valid = '#333 url(chess.png) repeat fixed 50% top';
|
||||||
|
$this->assertDef($valid);
|
||||||
|
$this->assertDef('url("chess.png") #333 50% top repeat fixed', $valid);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
@ -25,7 +25,7 @@ class HTMLPurifier_AttrDef_CSSTest extends HTMLPurifier_AttrDefHarness
|
|||||||
$this->assertDef('text-transform:capitalize;');
|
$this->assertDef('text-transform:capitalize;');
|
||||||
$this->assertDef('background-color:rgb(0,0,255);');
|
$this->assertDef('background-color:rgb(0,0,255);');
|
||||||
$this->assertDef('background-color:transparent;');
|
$this->assertDef('background-color:transparent;');
|
||||||
$this->assertDef('background:#FF9;');
|
$this->assertDef('background:#333 url(chess.png) repeat fixed 50% top;');
|
||||||
$this->assertDef('color:#F00;');
|
$this->assertDef('color:#F00;');
|
||||||
$this->assertDef('border-top-color:#F00;');
|
$this->assertDef('border-top-color:#F00;');
|
||||||
$this->assertDef('border-color:#F00 #FF0;');
|
$this->assertDef('border-color:#F00 #FF0;');
|
||||||
|
@ -50,6 +50,7 @@ $test_files[] = 'AttrDef/ListStyleTest.php';
|
|||||||
$test_files[] = 'AttrDef/Email/SimpleCheckTest.php';
|
$test_files[] = 'AttrDef/Email/SimpleCheckTest.php';
|
||||||
$test_files[] = 'AttrDef/CSSURITest.php';
|
$test_files[] = 'AttrDef/CSSURITest.php';
|
||||||
$test_files[] = 'AttrDef/BackgroundPositionTest.php';
|
$test_files[] = 'AttrDef/BackgroundPositionTest.php';
|
||||||
|
$test_files[] = 'AttrDef/BackgroundTest.php';
|
||||||
$test_files[] = 'IDAccumulatorTest.php';
|
$test_files[] = 'IDAccumulatorTest.php';
|
||||||
$test_files[] = 'TagTransformTest.php';
|
$test_files[] = 'TagTransformTest.php';
|
||||||
$test_files[] = 'AttrTransform/LangTest.php';
|
$test_files[] = 'AttrTransform/LangTest.php';
|
||||||
|
Loading…
Reference in New Issue
Block a user