0
0
mirror of https://github.com/ezyang/htmlpurifier.git synced 2024-12-22 16:31:53 +00:00
htmlpurifier/maintenance/generate-standalone.php
2008-04-03 22:39:50 +00:00

146 lines
4.0 KiB
PHP
Executable File

#!/usr/bin/php
<?php
chdir(dirname(__FILE__));
require_once 'common.php';
assertCli();
/**
* @file
* Compiles all of HTML Purifier's library files into one big file
* named HTMLPurifier.standalone.php. This is usually called during the
* release process.
*/
/**
* Global hash that tracks already loaded includes
*/
$GLOBALS['loaded'] = array();
/**
* Custom FSTools for this script that overloads some behavior
* @warning The overloading of copy() is not necessarily global for
* this script. Watch out!
*/
class MergeLibraryFSTools extends FSTools
{
function copyable($entry) {
// Skip hidden files
if ($entry[0] == '.') {
return false;
}
return true;
}
function copy($source, $dest) {
copy_and_remove_includes($source, $dest);
}
}
$FS = new MergeLibraryFSTools();
/**
* Replaces the includes inside PHP source code with the corresponding
* source.
* @param string $text PHP source code to replace includes from
*/
function replace_includes($text) {
return preg_replace_callback(
"/require(?:_once)? ['\"]([^'\"]+)['\"];/",
'replace_includes_callback',
$text
);
}
/**
* Removes leading PHP tags from included files. Assumes that there is
* no trailing tag.
* @note This is safe for files that have internal <?php
* @param string $text Text to have leading PHP tag from
*/
function remove_php_tags($text) {
return substr($text, 5);
}
/**
* Copies the contents of a directory to the standalone directory
* @param string $dir Directory to copy
*/
function make_dir_standalone($dir) {
global $FS;
return $FS->copyr($dir, 'standalone/' . $dir);
}
/**
* Copies the contents of a file to the standalone directory
* @param string $file File to copy
*/
function make_file_standalone($file) {
global $FS;
$FS->mkdirr('standalone/' . dirname($file));
copy_and_remove_includes($file, 'standalone/' . $file);
return true;
}
/**
* Copies a file to another location recursively, if it is a PHP file
* remove includes
* @param string $file Original file
* @param string $sfile New location of file
*/
function copy_and_remove_includes($file, $sfile) {
$contents = file_get_contents($file);
if (strrchr($file, '.') === '.php') $contents = replace_includes($contents);
return file_put_contents($sfile, $contents);
}
/**
* @param $matches preg_replace_callback matches array, where index 1
* is the filename to include
*/
function replace_includes_callback($matches) {
$file = $matches[1];
$preserve = array(
// PEAR (external)
'XML/HTMLSax3.php' => 1
);
if (isset($preserve[$file])) {
return $matches[0];
}
if (isset($GLOBALS['loaded'][$file])) return '';
$GLOBALS['loaded'][$file] = true;
return replace_includes(remove_php_tags(file_get_contents($file)));
}
echo 'Generating includes file... ';
shell_exec('php generate-includes.php');
echo "done!\n";
chdir(dirname(__FILE__) . '/../library/');
echo 'Creating full file...';
$contents = replace_includes(file_get_contents('HTMLPurifier.includes.php'));
$contents = str_replace(
// Note that bootstrap is now inside the standalone file
"define('HTMLPURIFIER_PREFIX', realpath(dirname(__FILE__) . '/..'));",
"define('HTMLPURIFIER_PREFIX', dirname(__FILE__) . '/standalone');
set_include_path(HTMLPURIFIER_PREFIX . PATH_SEPARATOR . get_include_path());",
$contents
);
file_put_contents('HTMLPurifier.standalone.php', $contents);
echo ' done!' . PHP_EOL;
echo 'Creating standalone directory...';
$FS->rmdirr('standalone'); // ensure a clean copy
// data files
$FS->mkdirr('standalone/HTMLPurifier/DefinitionCache/Serializer');
make_dir_standalone('HTMLPurifier/EntityLookup');
make_file_standalone('HTMLPurifier/ConfigSchema/schema.ser');
// non-standard inclusion setup
make_dir_standalone('HTMLPurifier/Language');
make_dir_standalone('HTMLPurifier/Filter');
make_file_standalone('HTMLPurifier/Lexer/PH5P.php');
make_file_standalone('HTMLPurifier/Lexer/PEARSax3.php');
echo ' done!' . PHP_EOL;