public static function buildFromDirectory($dir = null)
 {
     $parser = new HTMLPurifier_StringHashParser();
     $builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder();
     $interchange = new HTMLPurifier_ConfigSchema_Interchange();
     if (!$dir) {
         $dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema/';
     }
     $info = parse_ini_file($dir . 'info.ini');
     $interchange->name = $info['name'];
     $files = array();
     $dh = opendir($dir);
     while (false !== ($file = readdir($dh))) {
         if (!$file || $file[0] == '.' || strrchr($file, '.') !== '.txt') {
             continue;
         }
         $files[] = $file;
     }
     closedir($dh);
     sort($files);
     foreach ($files as $file) {
         $builder->build($interchange, new HTMLPurifier_StringHash($parser->parseFile($dir . $file)));
     }
     return $interchange;
 }
assertCli();
/**
 * @file
 * Generates a schema cache file, saving it to
 * library/HTMLPurifier/ConfigSchema/schema.ser.
 *
 * This should be run when new configuration options are added to
 * HTML Purifier. A cached version is available via the repository
 * so this does not normally have to be regenerated.
 *
 * If you have a directory containing custom configuration schema files,
 * you can simple add a path to that directory as a parameter to
 * this, and they will get included.
 */
$target = dirname(__FILE__) . '/../library/HTMLPurifier/ConfigSchema/schema.ser';
$builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder();
$interchange = new HTMLPurifier_ConfigSchema_Interchange();
$builder->buildDir($interchange);
$loader = dirname(__FILE__) . '/../config-schema.php';
if (file_exists($loader)) {
    include $loader;
}
foreach ($_SERVER['argv'] as $i => $dir) {
    if ($i === 0) {
        continue;
    }
    $builder->buildDir($interchange, realpath($dir));
}
$interchange->validate();
$schema_builder = new HTMLPurifier_ConfigSchema_Builder_ConfigSchema();
$schema = $schema_builder->build($interchange);
$old = $argv[1];
$new = $argv[2];
if (!file_exists("{$old}.txt")) {
    echo "Cannot move undefined configuration directive {$old}\n";
    exit(1);
}
if ($old === $new) {
    echo "Attempting to move to self, aborting\n";
    exit(1);
}
if (file_exists("{$new}.txt")) {
    echo "Cannot move to already defined directive {$new}\n";
    exit(1);
}
$file = "{$old}.txt";
$builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder();
$interchange = new HTMLPurifier_ConfigSchema_Interchange();
$builder->buildFile($interchange, $file);
$contents = file_get_contents($file);
if (strpos($contents, "\r\n") !== false) {
    $nl = "\r\n";
} elseif (strpos($contents, "\r") !== false) {
    $nl = "\r";
} else {
    $nl = "\n";
}
// replace name with new name
$contents = str_replace($old, $new, $contents);
if ($interchange->directives[$old]->aliases) {
    $pos_alias = strpos($contents, 'ALIASES:');
    $pos_ins = strpos($contents, $nl, $pos_alias);
<?php

require_once 'common.php';
// Setup environment
require_once '../extras/HTMLPurifierExtras.auto.php';
$interchange = HTMLPurifier_ConfigSchema_InterchangeBuilder::buildFromDirectory('test-schema/');
$interchange->validate();
if (isset($_GET['doc'])) {
    // Hijack page generation to supply documentation
    if (file_exists('test-schema.html') && !isset($_GET['purge'])) {
        echo file_get_contents('test-schema.html');
        exit;
    }
    $style = 'plain';
    $configdoc_xml = 'test-schema.xml';
    $xml_builder = new HTMLPurifier_ConfigSchema_Builder_Xml();
    $xml_builder->openURI($configdoc_xml);
    $xml_builder->build($interchange);
    unset($xml_builder);
    // free handle
    $xslt = new ConfigDoc_HTMLXSLTProcessor();
    $xslt->importStylesheet("../configdoc/styles/{$style}.xsl");
    $xslt->setParameters(array('css' => '../configdoc/styles/plain.css'));
    $html = $xslt->transformToHTML($configdoc_xml);
    unlink('test-schema.xml');
    file_put_contents('test-schema.html', $html);
    echo $html;
    exit;
}
?>
<!DOCTYPE html
- extend XSLT transformation (see the corresponding XSLT file)
- allow generation of packaged docs that can be easily moved
- multipage documentation
- determine how to multilingualize
- add blurbs to ToC
*/
if (version_compare(PHP_VERSION, '5.2', '<')) {
    exit('PHP 5.2+ required.');
}
error_reporting(E_ALL | E_STRICT);
// load dual-libraries
require_once dirname(__FILE__) . '/../extras/HTMLPurifierExtras.auto.php';
require_once dirname(__FILE__) . '/../library/HTMLPurifier.auto.php';
// setup HTML Purifier singleton
HTMLPurifier::getInstance(array('AutoFormat.PurifierLinkify' => true));
$builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder();
$interchange = new HTMLPurifier_ConfigSchema_Interchange();
$builder->buildDir($interchange);
$loader = dirname(__FILE__) . '/../config-schema.php';
if (file_exists($loader)) {
    include $loader;
}
$interchange->validate();
$style = 'plain';
// use $_GET in the future, careful to validate!
$configdoc_xml = dirname(__FILE__) . '/configdoc.xml';
$xml_builder = new HTMLPurifier_ConfigSchema_Builder_Xml();
$xml_builder->openURI($configdoc_xml);
$xml_builder->build($interchange);
unset($xml_builder);
// free handle
 public static function buildFromDirectory($dir = null)
 {
     $builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder();
     $interchange = new HTMLPurifier_ConfigSchema_Interchange();
     return $builder->buildDir($interchange, $dir);
 }