diff --git a/library/HTMLPurifier/AttrDef/ID.php b/library/HTMLPurifier/AttrDef/ID.php
new file mode 100644
index 00000000..a88386ba
--- /dev/null
+++ b/library/HTMLPurifier/AttrDef/ID.php
@@ -0,0 +1,37 @@
+ids[$id])) return false;
+
+ // we purposely avoid using regex, hopefully this is faster
+
+ if (ctype_alpha($id)) {
+ $result = true;
+ } else {
+ if (!ctype_alpha(@$id[0])) return false;
+ $trim = trim(
+ $id,
+ 'A..Za..z0..9:-._'
+ );
+ $result = ($trim === '');
+ }
+
+ if ($result) $accumulator->add($id);
+
+ return $result;
+
+ }
+
+}
+
+?>
\ No newline at end of file
diff --git a/library/HTMLPurifier/IDAccumulator.php b/library/HTMLPurifier/IDAccumulator.php
index eb6f512f..eb202ab7 100644
--- a/library/HTMLPurifier/IDAccumulator.php
+++ b/library/HTMLPurifier/IDAccumulator.php
@@ -10,6 +10,12 @@ class HTMLPurifier_IDAccumulator
return $this->ids[$id] = true;
}
+ function load($array_of_ids) {
+ foreach ($array_of_ids as $id) {
+ $this->ids[$id] = true;
+ }
+ }
+
}
?>
\ No newline at end of file
diff --git a/tests/HTMLPurifier/AttrDef/IDTest.php b/tests/HTMLPurifier/AttrDef/IDTest.php
new file mode 100644
index 00000000..0b7d8f5b
--- /dev/null
+++ b/tests/HTMLPurifier/AttrDef/IDTest.php
@@ -0,0 +1,33 @@
+assertTrue($def->validate('alpha', $acc));
+ $this->assertTrue($def->validate('al_ha', $acc));
+ $this->assertTrue($def->validate('a0-:.', $acc));
+ $this->assertTrue($def->validate('a' , $acc));
+
+ // invalid ID names
+ $this->assertFalse($def->validate('assertFalse($def->validate('0123', $acc));
+ $this->assertFalse($def->validate('.asa', $acc));
+
+ // test duplicate detection
+ $this->assertFalse($def->validate('a' , $acc));
+
+ }
+
+}
+
+?>
\ No newline at end of file
diff --git a/tests/HTMLPurifier/IDAccumulatorTest.php b/tests/HTMLPurifier/IDAccumulatorTest.php
index b5a82d3c..8ff04545 100644
--- a/tests/HTMLPurifier/IDAccumulatorTest.php
+++ b/tests/HTMLPurifier/IDAccumulatorTest.php
@@ -14,6 +14,20 @@ class HTMLPurifier_IDAccumulatorTest extends UnitTestCase
$this->assertTrue( $accumulator->add('id2'));
$this->assertFalse($accumulator->add('id1')); // repeated id
+ // you can also access the properties (they're public)
+ $this->assertTrue( isset($accumulator->ids['id2']) );
+
+ }
+
+ function testLoad() {
+
+ $accumulator = new HTMLPurifier_IDAccumulator();
+
+ $accumulator->load(array('id1', 'id2', 'id3'));
+
+ $this->assertFalse($accumulator->add('id1')); // repeated id
+ $this->assertTrue($accumulator->add('id4'));
+
}
}
diff --git a/tests/index.php b/tests/index.php
index 05ec1b4a..d87e2d0d 100644
--- a/tests/index.php
+++ b/tests/index.php
@@ -33,6 +33,7 @@ $test->addTestFile('HTMLPurifier/Strategy/FixNestingTest.php');
$test->addTestFile('HTMLPurifier/Strategy/CompositeTest.php');
$test->addTestFile('HTMLPurifier/Strategy/CoreTest.php');
$test->addTestFile('HTMLPurifier/AttrDef/EnumTest.php');
+$test->addTestFile('HTMLPurifier/AttrDef/IDTest.php');
$test->addTestFile('HTMLPurifier/IDAccumulatorTest.php');
$test->run( new HtmlReporter() );