mirror of
https://github.com/ezyang/htmlpurifier.git
synced 2024-12-22 16:31:53 +00:00
Make name="" and id="" play nicely together.
Signed-off-by: Edward Z. Yang <edwardzyang@thewritingpot.com>
This commit is contained in:
parent
92344cc83a
commit
fcbf724e6e
2
NEWS
2
NEWS
@ -10,7 +10,7 @@ NEWS ( CHANGELOG and HISTORY ) HTMLPurifier
|
|||||||
==========================
|
==========================
|
||||||
|
|
||||||
4.0.0, unknown release date
|
4.0.0, unknown release date
|
||||||
(no items yet)
|
! More robust support for name="" and id=""
|
||||||
|
|
||||||
3.3.0, released 2009-02-16
|
3.3.0, released 2009-02-16
|
||||||
! Implement CSS property 'overflow' when %CSS.AllowTricky is true.
|
! Implement CSS property 'overflow' when %CSS.AllowTricky is true.
|
||||||
|
1
TODO
1
TODO
@ -14,7 +14,6 @@ afraid to cast your vote for the next feature to be implemented!
|
|||||||
- Investigate how early internal structures can be accessed; this would
|
- Investigate how early internal structures can be accessed; this would
|
||||||
prevent structures from being parsed and serialized multiple times.
|
prevent structures from being parsed and serialized multiple times.
|
||||||
- Built-in support for target="_blank" on all external links
|
- Built-in support for target="_blank" on all external links
|
||||||
- Allow <a id="asdf" name="asdf">
|
|
||||||
- Convert configuration to allow an arbitrary number of namespaces;
|
- Convert configuration to allow an arbitrary number of namespaces;
|
||||||
then rename as appropriate.
|
then rename as appropriate.
|
||||||
|
|
||||||
|
@ -123,6 +123,7 @@ require 'HTMLPurifier/AttrTransform/Input.php';
|
|||||||
require 'HTMLPurifier/AttrTransform/Lang.php';
|
require 'HTMLPurifier/AttrTransform/Lang.php';
|
||||||
require 'HTMLPurifier/AttrTransform/Length.php';
|
require 'HTMLPurifier/AttrTransform/Length.php';
|
||||||
require 'HTMLPurifier/AttrTransform/Name.php';
|
require 'HTMLPurifier/AttrTransform/Name.php';
|
||||||
|
require 'HTMLPurifier/AttrTransform/NameSync.php';
|
||||||
require 'HTMLPurifier/AttrTransform/SafeEmbed.php';
|
require 'HTMLPurifier/AttrTransform/SafeEmbed.php';
|
||||||
require 'HTMLPurifier/AttrTransform/SafeObject.php';
|
require 'HTMLPurifier/AttrTransform/SafeObject.php';
|
||||||
require 'HTMLPurifier/AttrTransform/SafeParam.php';
|
require 'HTMLPurifier/AttrTransform/SafeParam.php';
|
||||||
|
@ -117,6 +117,7 @@ require_once $__dir . '/HTMLPurifier/AttrTransform/Input.php';
|
|||||||
require_once $__dir . '/HTMLPurifier/AttrTransform/Lang.php';
|
require_once $__dir . '/HTMLPurifier/AttrTransform/Lang.php';
|
||||||
require_once $__dir . '/HTMLPurifier/AttrTransform/Length.php';
|
require_once $__dir . '/HTMLPurifier/AttrTransform/Length.php';
|
||||||
require_once $__dir . '/HTMLPurifier/AttrTransform/Name.php';
|
require_once $__dir . '/HTMLPurifier/AttrTransform/Name.php';
|
||||||
|
require_once $__dir . '/HTMLPurifier/AttrTransform/NameSync.php';
|
||||||
require_once $__dir . '/HTMLPurifier/AttrTransform/SafeEmbed.php';
|
require_once $__dir . '/HTMLPurifier/AttrTransform/SafeEmbed.php';
|
||||||
require_once $__dir . '/HTMLPurifier/AttrTransform/SafeObject.php';
|
require_once $__dir . '/HTMLPurifier/AttrTransform/SafeObject.php';
|
||||||
require_once $__dir . '/HTMLPurifier/AttrTransform/SafeParam.php';
|
require_once $__dir . '/HTMLPurifier/AttrTransform/SafeParam.php';
|
||||||
|
27
library/HTMLPurifier/AttrTransform/NameSync.php
Normal file
27
library/HTMLPurifier/AttrTransform/NameSync.php
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Post-transform that performs validation to the name attribute; if
|
||||||
|
* it is present with an equivalent id attribute, it is passed through;
|
||||||
|
* otherwise validation is performed.
|
||||||
|
*/
|
||||||
|
class HTMLPurifier_AttrTransform_NameSync extends HTMLPurifier_AttrTransform
|
||||||
|
{
|
||||||
|
|
||||||
|
public function __construct() {
|
||||||
|
$this->idDef = new HTMLPurifier_AttrDef_HTML_ID();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function transform($attr, $config, $context) {
|
||||||
|
if (!isset($attr['name'])) return $attr;
|
||||||
|
$name = $attr['name'];
|
||||||
|
if (isset($attr['id']) && $attr['id'] === $name) return $attr;
|
||||||
|
$result = $this->idDef->validate($name, $config, $context);
|
||||||
|
if ($result === false) unset($attr['name']);
|
||||||
|
else $attr['name'] = $result;
|
||||||
|
return $attr;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// vim: et sw=4 sts=4
|
@ -9,7 +9,8 @@ class HTMLPurifier_HTMLModule_Name extends HTMLPurifier_HTMLModule
|
|||||||
$elements = array('a', 'applet', 'form', 'frame', 'iframe', 'img', 'map');
|
$elements = array('a', 'applet', 'form', 'frame', 'iframe', 'img', 'map');
|
||||||
foreach ($elements as $name) {
|
foreach ($elements as $name) {
|
||||||
$element = $this->addBlankElement($name);
|
$element = $this->addBlankElement($name);
|
||||||
$element->attr['name'] = 'ID';
|
$element->attr['name'] = 'CDATA';
|
||||||
|
$element->attr_transform_post['NameSync'] = new HTMLPurifier_AttrTransform_NameSync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
40
tests/HTMLPurifier/AttrTransform/NameSyncTest.php
Normal file
40
tests/HTMLPurifier/AttrTransform/NameSyncTest.php
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class HTMLPurifier_AttrTransform_NameSyncTest extends HTMLPurifier_AttrTransformHarness
|
||||||
|
{
|
||||||
|
|
||||||
|
function setUp() {
|
||||||
|
parent::setUp();
|
||||||
|
$this->obj = new HTMLPurifier_AttrTransform_NameSync();
|
||||||
|
$this->accumulator = new HTMLPurifier_IDAccumulator();
|
||||||
|
$this->context->register('IDAccumulator', $this->accumulator);
|
||||||
|
$this->config->set('Attr', 'EnableID', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testEmpty() {
|
||||||
|
$this->assertResult( array() );
|
||||||
|
}
|
||||||
|
|
||||||
|
function testAllowSame() {
|
||||||
|
$this->assertResult(
|
||||||
|
array('name' => 'free', 'id' => 'free')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testAllowDifferent() {
|
||||||
|
$this->assertResult(
|
||||||
|
array('name' => 'tryit', 'id' => 'thisgood')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testCheckName() {
|
||||||
|
$this->accumulator->add('notok');
|
||||||
|
$this->assertResult(
|
||||||
|
array('name' => 'notok', 'id' => 'ok'),
|
||||||
|
array('id' => 'ok')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// vim: et sw=4 sts=4
|
@ -81,7 +81,7 @@ class HTMLPurifier_ComplexHarness extends HTMLPurifier_Harness
|
|||||||
$this->assertIdentical($expect, $result);
|
$this->assertIdentical($expect, $result);
|
||||||
|
|
||||||
if ($expect !== $result) {
|
if ($expect !== $result) {
|
||||||
echo '<pre>' . htmlspecialchars($result) . '</pre>';
|
echo '<pre>' . var_dump($result) . '</pre>';
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
11
tests/HTMLPurifier/HTMLT/id-name-mix.htmlt
Normal file
11
tests/HTMLPurifier/HTMLT/id-name-mix.htmlt
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
--INI--
|
||||||
|
Attr.EnableID = true
|
||||||
|
--HTML--
|
||||||
|
<a name="foo" id="foo">Test</a>
|
||||||
|
<a name="foo">Test2</a>
|
||||||
|
<a name="bar" id="baz">Test3</a>
|
||||||
|
--EXPECT--
|
||||||
|
<a name="foo" id="foo">Test</a>
|
||||||
|
<a>Test2</a>
|
||||||
|
<a name="bar" id="baz">Test3</a>
|
||||||
|
--# vim: et sw=4 sts=4
|
Loading…
Reference in New Issue
Block a user