0
0
mirror of https://github.com/ezyang/htmlpurifier.git synced 2024-12-22 16:31:53 +00:00

[3.1.0] Move ConfigSchema to HTMLPurifier core

git-svn-id: http://htmlpurifier.org/svnroot/htmlpurifier/trunk@1576 48356398-32a2-884e-a903-53898d9a118a
This commit is contained in:
Edward Z. Yang 2008-02-24 06:19:28 +00:00
parent d3c04de9dc
commit 002fe649f7
19 changed files with 43 additions and 55 deletions

16
TODO
View File

@ -17,8 +17,6 @@ UPCOMING RELEASE
IMPORTANT IMPORTANT
- Release candidate, because of the major changes - Release candidate, because of the major changes
- Move utility classes for ConfigSchema into HTML Purifier itself: they're
that important
DOCUMENTATION DOCUMENTATION
- Document new ConfigSchema setup and format; dev-includes.txt is a base - Document new ConfigSchema setup and format; dev-includes.txt is a base
@ -31,21 +29,21 @@ IMPORTANT FEATURES
- Factor generate-schema-cache.php into a class, so that the maintenance script - Factor generate-schema-cache.php into a class, so that the maintenance script
is as small as possible is as small as possible
- Factor out command line parser into its own class, and unit test it - Factor out command line parser into its own class, and unit test it
- Optimize ConfigSchema by only caching things necessary for runtime - Optimize ConfigSchema by making our runtime class only contain entries for
things necessary for operation (NOT descriptions).
CONFIGDOC CONFIGDOC
- Properly integrate new ConfigSchema system into configdoc (Configdoc - Properly integrate new ConfigSchema system into configdoc. DESCRIPTIONS
ARE CURRENTLY BROKEN AND NEED TO BE FIXED!!! (Configdoc
should directly read the configuration files, or at the very least should should directly read the configuration files, or at the very least should
not use static functions) not use static functions)
- Reduce code duplication between Serializer and Adapter/ReverseAdapter - Deprecate Serializer in favor of ReverseAdapter
(we probably want to use ReverseAdapter for the long haul)
- Have configdoc use version and deprecated information (hide deprecated - Have configdoc use version and deprecated information (hide deprecated
info, for example) info, for example)
- Implement file sniffing for configdoc, so we can easily figure out - Implement source code sniffing for configdoc, so we can easily figure out
which files use what configuration which files use what configuration (we'll rely on the $config convention)
IF IT AIN'T BROKE... IF IT AIN'T BROKE...
- Simplify merge library script by removing recursion? (or other things)
- Perhaps replace types with integer identifiers in ConfigSchema? (would be - Perhaps replace types with integer identifiers in ConfigSchema? (would be
smaller, but not by much). smaller, but not by much).

View File

@ -16,8 +16,7 @@ class HTMLPurifierExtras
public static function getPath($class) { public static function getPath($class) {
if ( if (
strncmp('FSTools', $class, 7) !== 0 && strncmp('FSTools', $class, 7) !== 0
strncmp('ConfigSchema', $class, 12) !== 0
) return false; ) return false;
// Custom implementations can go here // Custom implementations can go here
// Standard implementation: // Standard implementation:

View File

@ -28,12 +28,3 @@ the filesystem. It currently consists of two classes:
method imaginable one would need. method imaginable one would need.
Check the files themselves for more information. Check the files themselves for more information.
ConfigSchema
------------
ConfigSchema is the next-generation configuration validation system for
HTML Purifier, built off of the original HTMLPurifier_ConfigSchema. When
complete, it will be used to generate schema files which will then be used
to enforce values set to HTMLPurifier_Config.

View File

@ -121,6 +121,10 @@ require 'HTMLPurifier/ChildDef/Table.php';
require 'HTMLPurifier/ConfigDef/Directive.php'; require 'HTMLPurifier/ConfigDef/Directive.php';
require 'HTMLPurifier/ConfigDef/DirectiveAlias.php'; require 'HTMLPurifier/ConfigDef/DirectiveAlias.php';
require 'HTMLPurifier/ConfigDef/Namespace.php'; require 'HTMLPurifier/ConfigDef/Namespace.php';
require 'HTMLPurifier/ConfigSchema/StringHash.php';
require 'HTMLPurifier/ConfigSchema/StringHashAdapter.php';
require 'HTMLPurifier/ConfigSchema/StringHashParser.php';
require 'HTMLPurifier/ConfigSchema/StringHashReverseAdapter.php';
require 'HTMLPurifier/DefinitionCache/Decorator.php'; require 'HTMLPurifier/DefinitionCache/Decorator.php';
require 'HTMLPurifier/DefinitionCache/Null.php'; require 'HTMLPurifier/DefinitionCache/Null.php';
require 'HTMLPurifier/DefinitionCache/Serializer.php'; require 'HTMLPurifier/DefinitionCache/Serializer.php';

View File

@ -8,7 +8,7 @@
* of PHP 5, you must not use the $hash[$key] syntax; if you do * of PHP 5, you must not use the $hash[$key] syntax; if you do
* our version of offsetGet is never called. * our version of offsetGet is never called.
*/ */
class ConfigSchema_StringHash extends ArrayObject class HTMLPurifier_ConfigSchema_StringHash extends ArrayObject
{ {
protected $accessed = array(); protected $accessed = array();

View File

@ -2,9 +2,9 @@
/** /**
* Takes an array of keys to strings, probably generated by * Takes an array of keys to strings, probably generated by
* ConfigSchema_StringHashParser * HTMLPurifier_ConfigSchema_StringHashParser
*/ */
class ConfigSchema_StringHashAdapter class HTMLPurifier_ConfigSchema_StringHashAdapter
{ {
/** /**
@ -13,8 +13,8 @@ class ConfigSchema_StringHashAdapter
*/ */
public function adapt($hash, $schema) { public function adapt($hash, $schema) {
if (! $hash instanceof ConfigSchema_StringHash) { if (! $hash instanceof HTMLPurifier_ConfigSchema_StringHash) {
$hash = new ConfigSchema_StringHash($hash); $hash = new HTMLPurifier_ConfigSchema_StringHash($hash);
} }
if (!isset($hash['ID'])) { if (!isset($hash['ID'])) {

View File

@ -26,19 +26,18 @@
* Put this in its own class hierarchy or something; this class * Put this in its own class hierarchy or something; this class
* is usage agnostic. * is usage agnostic.
*/ */
class ConfigSchema_StringHashParser class HTMLPurifier_ConfigSchema_StringHashParser
{ {
public $default = 'ID'; public $default = 'ID';
public function parseFile($file) { public function parseFile($file) {
if (is_string($file)) $file = new FSTools_File($file); if (!file_exists($file)) throw new Exception('File does not exist');
if (!$file->exists()) throw new Exception('File does not exist'); $fh = fopen($file, 'r');
$file->open('r');
$state = false; $state = false;
$single = false; $single = false;
$ret = array(); $ret = array();
while (($line = $file->getLine()) !== false) { while (($line = fgets($fh)) !== false) {
$line = rtrim($line, "\n\r"); $line = rtrim($line, "\n\r");
if (!$state && $line === '') continue; if (!$state && $line === '') continue;
if (strncmp('--', $line, 2) === 0) { if (strncmp('--', $line, 2) === 0) {
@ -64,7 +63,7 @@ class ConfigSchema_StringHashParser
$ret[$state] .= "$line\n"; $ret[$state] .= "$line\n";
} }
} }
$file->close(); fclose($fh);
return $ret; return $ret;
} }

View File

@ -4,7 +4,7 @@
* Converts HTMLPurifier_ConfigSchema into a StringHash which can be * Converts HTMLPurifier_ConfigSchema into a StringHash which can be
* easily saved to a file. * easily saved to a file.
*/ */
class ConfigSchema_StringHashReverseAdapter class HTMLPurifier_ConfigSchema_StringHashReverseAdapter
{ {
protected $schema; protected $schema;

View File

@ -21,7 +21,7 @@ $namespaces = array();
$directives = array(); $directives = array();
// Generate string hashes // Generate string hashes
$parser = new ConfigSchema_StringHashParser(); $parser = new HTMLPurifier_ConfigSchema_StringHashParser();
foreach ($files as $file) { foreach ($files as $file) {
$hash = $parser->parseFile($file); $hash = $parser->parseFile($file);
if (strpos($hash['ID'], '.') === false) { if (strpos($hash['ID'], '.') === false) {
@ -31,7 +31,7 @@ foreach ($files as $file) {
} }
} }
$adapter = new ConfigSchema_StringHashAdapter(); $adapter = new HTMLPurifier_ConfigSchema_StringHashAdapter();
$schema = new HTMLPurifier_ConfigSchema(); $schema = new HTMLPurifier_ConfigSchema();
foreach ($namespaces as $hash) $adapter->adapt($hash, $schema); foreach ($namespaces as $hash) $adapter->adapt($hash, $schema);

View File

@ -58,7 +58,7 @@ function saveHash($hash) {
} }
$schema = HTMLPurifier_ConfigSchema::instance(); $schema = HTMLPurifier_ConfigSchema::instance();
$adapter = new ConfigSchema_StringHashReverseAdapter($schema); $adapter = new HTMLPurifier_ConfigSchema_StringHashReverseAdapter($schema);
foreach ($schema->info as $ns => $ns_array) { foreach ($schema->info as $ns => $ns_array) {
saveHash($adapter->get($ns)); saveHash($adapter->get($ns));

View File

@ -1,6 +1,6 @@
<?php <?php
class ConfigSchema_StringHashAdapterTest extends UnitTestCase class HTMLPurifier_ConfigSchema_StringHashAdapterTest extends UnitTestCase
{ {
function __construct() { function __construct() {
generate_mock_once('HTMLPurifier_ConfigSchema'); generate_mock_once('HTMLPurifier_ConfigSchema');
@ -15,7 +15,7 @@ class ConfigSchema_StringHashAdapterTest extends UnitTestCase
if (!isset($called[$func])) $called[$func] = 0; if (!isset($called[$func])) $called[$func] = 0;
$schema->expectAt($called[$func]++, $func, $params); $schema->expectAt($called[$func]++, $func, $params);
} }
$adapter = new ConfigSchema_StringHashAdapter(); $adapter = new HTMLPurifier_ConfigSchema_StringHashAdapter();
$adapter->adapt($input, $schema); $adapter->adapt($input, $schema);
} }

View File

@ -3,7 +3,7 @@
/** /**
* @note Sample input files are located in the StringHashParser/ directory. * @note Sample input files are located in the StringHashParser/ directory.
*/ */
class ConfigSchema_StringHashParserTest extends UnitTestCase class HTMLPurifier_ConfigSchema_StringHashParserTest extends UnitTestCase
{ {
/** /**
@ -12,7 +12,7 @@ class ConfigSchema_StringHashParserTest extends UnitTestCase
protected $parser; protected $parser;
function setup() { function setup() {
$this->parser = new ConfigSchema_StringHashParser(); $this->parser = new HTMLPurifier_ConfigSchema_StringHashParser();
} }
/** /**

View File

@ -1,6 +1,6 @@
<?php <?php
class ConfigSchema_StringHashReverseAdapterTest extends UnitTestCase class HTMLPurifier_ConfigSchema_StringHashReverseAdapterTest extends UnitTestCase
{ {
function makeSchema() { function makeSchema() {
@ -17,7 +17,7 @@ class ConfigSchema_StringHashReverseAdapterTest extends UnitTestCase
} }
function testNamespace() { function testNamespace() {
$adapter = new ConfigSchema_StringHashReverseAdapter($this->makeSchema()); $adapter = new HTMLPurifier_ConfigSchema_StringHashReverseAdapter($this->makeSchema());
$result = $adapter->get('Ns'); $result = $adapter->get('Ns');
$expect = array( $expect = array(
'ID' => 'Ns', 'ID' => 'Ns',
@ -27,14 +27,14 @@ class ConfigSchema_StringHashReverseAdapterTest extends UnitTestCase
} }
function testBadNamespace() { function testBadNamespace() {
$adapter = new ConfigSchema_StringHashReverseAdapter($this->makeSchema()); $adapter = new HTMLPurifier_ConfigSchema_StringHashReverseAdapter($this->makeSchema());
$this->expectError("Namespace 'BadNs' doesn't exist in schema"); $this->expectError("Namespace 'BadNs' doesn't exist in schema");
$adapter->get('BadNs'); $adapter->get('BadNs');
} }
function testDirective() { function testDirective() {
$adapter = new ConfigSchema_StringHashReverseAdapter($this->makeSchema()); $adapter = new HTMLPurifier_ConfigSchema_StringHashReverseAdapter($this->makeSchema());
$result = $adapter->get('Ns', 'Dir'); $result = $adapter->get('Ns', 'Dir');
$expect = array( $expect = array(
@ -53,13 +53,13 @@ class ConfigSchema_StringHashReverseAdapterTest extends UnitTestCase
} }
function testBadDirective() { function testBadDirective() {
$adapter = new ConfigSchema_StringHashReverseAdapter($this->makeSchema()); $adapter = new HTMLPurifier_ConfigSchema_StringHashReverseAdapter($this->makeSchema());
$this->expectError("Directive 'BadNs.BadDir' doesn't exist in schema"); $this->expectError("Directive 'BadNs.BadDir' doesn't exist in schema");
$adapter->get('BadNs', 'BadDir'); $adapter->get('BadNs', 'BadDir');
} }
function assertMethod($func, $input, $expect) { function assertMethod($func, $input, $expect) {
$adapter = new ConfigSchema_StringHashReverseAdapter($this->makeSchema()); $adapter = new HTMLPurifier_ConfigSchema_StringHashReverseAdapter($this->makeSchema());
$result = $adapter->$func($input); $result = $adapter->$func($input);
$this->assertIdentical($result, $expect); $this->assertIdentical($result, $expect);
} }
@ -85,7 +85,7 @@ class ConfigSchema_StringHashReverseAdapterTest extends UnitTestCase
} }
function assertExtraction($desc, $expect_desc, $expect_version) { function assertExtraction($desc, $expect_desc, $expect_version) {
$adapter = new ConfigSchema_StringHashReverseAdapter($this->makeSchema()); $adapter = new HTMLPurifier_ConfigSchema_StringHashReverseAdapter($this->makeSchema());
list($result_desc, $result_version) = $adapter->extractVersion($desc); list($result_desc, $result_version) = $adapter->extractVersion($desc);
$this->assertIdentical($result_desc, $expect_desc); $this->assertIdentical($result_desc, $expect_desc);
$this->assertIdentical($result_version, $expect_version); $this->assertIdentical($result_version, $expect_version);

View File

@ -1,10 +1,10 @@
<?php <?php
class ConfigSchema_StringHashTest extends UnitTestCase class HTMLPurifier_ConfigSchema_StringHashTest extends UnitTestCase
{ {
public function testUsed() { public function testUsed() {
$hash = new ConfigSchema_StringHash(array( $hash = new HTMLPurifier_ConfigSchema_StringHash(array(
'key' => 'value', 'key' => 'value',
'key2' => 'value2' 'key2' => 'value2'
)); ));

View File

@ -64,6 +64,10 @@ $test_files[] = 'HTMLPurifier/ChildDef/RequiredTest.php';
$test_files[] = 'HTMLPurifier/ChildDef/StrictBlockquoteTest.php'; $test_files[] = 'HTMLPurifier/ChildDef/StrictBlockquoteTest.php';
$test_files[] = 'HTMLPurifier/ChildDef/TableTest.php'; $test_files[] = 'HTMLPurifier/ChildDef/TableTest.php';
$test_files[] = 'HTMLPurifier/ConfigSchemaTest.php'; $test_files[] = 'HTMLPurifier/ConfigSchemaTest.php';
$test_files[] = 'HTMLPurifier/ConfigSchema/StringHashAdapterTest.php';
$test_files[] = 'HTMLPurifier/ConfigSchema/StringHashReverseAdapterTest.php';
$test_files[] = 'HTMLPurifier/ConfigSchema/StringHashParserTest.php';
$test_files[] = 'HTMLPurifier/ConfigSchema/StringHashTest.php';
$test_files[] = 'HTMLPurifier/ConfigTest.php'; $test_files[] = 'HTMLPurifier/ConfigTest.php';
$test_files[] = 'HTMLPurifier/ContextTest.php'; $test_files[] = 'HTMLPurifier/ContextTest.php';
$test_files[] = 'HTMLPurifier/DefinitionCacheFactoryTest.php'; $test_files[] = 'HTMLPurifier/DefinitionCacheFactoryTest.php';
@ -136,13 +140,6 @@ if ($csstidy_location) {
$test_files[] = 'FSTools/FileTest.php'; $test_files[] = 'FSTools/FileTest.php';
// ConfigSchema auxiliary library
$test_files[] = 'ConfigSchema/StringHashAdapterTest.php';
$test_files[] = 'ConfigSchema/StringHashReverseAdapterTest.php';
$test_files[] = 'ConfigSchema/StringHashParserTest.php';
$test_files[] = 'ConfigSchema/StringHashTest.php';
} // end if ($AC['only-phpt']) } // end if ($AC['only-phpt'])
// PHPT tests // PHPT tests