diff --git a/library/HTMLPurifier.includes.php b/library/HTMLPurifier.includes.php
index 8039d459..5daef582 100644
--- a/library/HTMLPurifier.includes.php
+++ b/library/HTMLPurifier.includes.php
@@ -135,6 +135,7 @@ require 'HTMLPurifier/ConfigSchema/Validator/Alnum.php';
require 'HTMLPurifier/ConfigSchema/Validator/Exists.php';
require 'HTMLPurifier/ConfigSchema/Validator/NamespaceExists.php';
require 'HTMLPurifier/ConfigSchema/Validator/ParseId.php';
+require 'HTMLPurifier/ConfigSchema/Validator/ParseType.php';
require 'HTMLPurifier/ConfigSchema/Validator/Unique.php';
require 'HTMLPurifier/DefinitionCache/Decorator.php';
require 'HTMLPurifier/DefinitionCache/Null.php';
diff --git a/library/HTMLPurifier/ConfigSchema/Interchange.php b/library/HTMLPurifier/ConfigSchema/Interchange.php
index e2fc6c05..57b0c9cd 100644
--- a/library/HTMLPurifier/ConfigSchema/Interchange.php
+++ b/library/HTMLPurifier/ConfigSchema/Interchange.php
@@ -57,17 +57,28 @@ class HTMLPurifier_ConfigSchema_Interchange
$validator = new HTMLPurifier_ConfigSchema_InterchangeValidator($this);
// Validators should be defined in the order they are to be called.
+
+ // ID tests
$validator->addValidator($this->make('Exists', 'ID'));
$validator->addValidator($this->make('Unique'));
$validator->addNamespaceValidator($this->make('Alnum', 'ID'));
$validator->addValidator($this->make('ParseId'));
$validator->addValidator($this->make('Exists', '_NAMESPACE'));
$validator->addValidator($this->make('Alnum', '_NAMESPACE'));
+
+ // Directive tests
$validator->addDirectiveValidator($this->make('Exists', '_DIRECTIVE'));
$validator->addDirectiveValidator($this->make('Alnum', '_DIRECTIVE'));
- $validator->addDirectiveValidator($this->make('Exists', 'TYPE'));
- $validator->addDirectiveValidator($this->make('Exists', 'DEFAULT'));
$validator->addDirectiveValidator($this->make('NamespaceExists'));
+
+ // Directive: Type tests
+ $validator->addDirectiveValidator($this->make('Exists', 'TYPE'));
+ $validator->addDirectiveValidator($this->make('ParseType'));
+ $validator->addDirectiveValidator($this->make('Exists', '_TYPE'));
+ $validator->addDirectiveValidator($this->make('Exists', '_NULL'));
+ $validator->addDirectiveValidator($this->make('Exists', 'DEFAULT'));
+
+ // Common tests
$validator->addValidator($this->make('Exists', 'DESCRIPTION'));
return $validator;
diff --git a/library/HTMLPurifier/ConfigSchema/Validator/ParseType.php b/library/HTMLPurifier/ConfigSchema/Validator/ParseType.php
new file mode 100644
index 00000000..dc0a4dab
--- /dev/null
+++ b/library/HTMLPurifier/ConfigSchema/Validator/ParseType.php
@@ -0,0 +1,19 @@
+types[$r[0]])) {
+ $this->error('Invalid type ' . $r[0] . ' for configuration directive ' . $arr['ID']);
+ }
+ $arr['_TYPE'] = $r[0];
+ $arr['_NULL'] = (isset($r[1]) && $r[1] === 'null');
+
+ }
+
+}
diff --git a/tests/HTMLPurifier/ConfigSchema/Validator/ParseTypeTest.php b/tests/HTMLPurifier/ConfigSchema/Validator/ParseTypeTest.php
new file mode 100644
index 00000000..f84f7b71
--- /dev/null
+++ b/tests/HTMLPurifier/ConfigSchema/Validator/ParseTypeTest.php
@@ -0,0 +1,34 @@
+ 'N.D', 'TYPE' => 'string');
+ $this->validator->validate($arr, $this->interchange);
+ $this->assertIdentical($arr, array(
+ 'ID' => 'N.D',
+ 'TYPE' => 'string',
+ '_TYPE' => 'string',
+ '_NULL' => false,
+ ));
+ }
+
+ public function testValidateWithNull() {
+ $arr = array('ID' => 'N.D', 'TYPE' => 'int/null');
+ $this->validator->validate($arr, $this->interchange);
+ $this->assertIdentical($arr, array(
+ 'ID' => 'N.D',
+ 'TYPE' => 'int/null',
+ '_TYPE' => 'int',
+ '_NULL' => true,
+ ));
+ }
+
+ public function testValidateInvalidType() {
+ $arr = array('ID' => 'N.D', 'TYPE' => 'aint/null');
+ $this->expectSchemaException('Invalid type aint for configuration directive N.D');
+ $this->validator->validate($arr, $this->interchange);
+ }
+
+}