mirror of
https://github.com/ezyang/htmlpurifier.git
synced 2025-01-03 13:21:51 +00:00
[2.1.0] Standalone file now can be generated using maintenance/merge-library.php. Also:
- HTMLPURIFIER_PREFIX constant added, and relevant files transitioned over - Custom ChildDef added to default include list - Tester accepts ?standalone parameter git-svn-id: http://htmlpurifier.org/svnroot/htmlpurifier/trunk@1316 48356398-32a2-884e-a903-53898d9a118a
This commit is contained in:
parent
89622c964e
commit
349c4de75b
7
NEWS
7
NEWS
@ -14,6 +14,9 @@ NEWS ( CHANGELOG and HISTORY ) HTMLPurifier
|
|||||||
! With %Core.AggressivelyFixLt, <3 and similar emoticons no longer
|
! With %Core.AggressivelyFixLt, <3 and similar emoticons no longer
|
||||||
trigger HTML removal in PHP5 (DOMLex). This directive is not necessary
|
trigger HTML removal in PHP5 (DOMLex). This directive is not necessary
|
||||||
for PHP4 (DirectLex).
|
for PHP4 (DirectLex).
|
||||||
|
! Standalone file now available, which greatly reduces the amount of
|
||||||
|
includes (although there are still a few files that reside in the
|
||||||
|
standalone folder)
|
||||||
- AutoFormatters emit friendly error messages if tags or attributes they
|
- AutoFormatters emit friendly error messages if tags or attributes they
|
||||||
need are not allowed
|
need are not allowed
|
||||||
- ConfigForm's compactification of directive names is now configurable
|
- ConfigForm's compactification of directive names is now configurable
|
||||||
@ -34,6 +37,10 @@ NEWS ( CHANGELOG and HISTORY ) HTMLPurifier
|
|||||||
. Hidden element content removal genericized: %Core.HiddenElements can
|
. Hidden element content removal genericized: %Core.HiddenElements can
|
||||||
be used to customize this behavior, by default <script> and <style> are
|
be used to customize this behavior, by default <script> and <style> are
|
||||||
hidden
|
hidden
|
||||||
|
. Added HTMLPURIFIER_PREFIX constant, should be used instead of dirname(__FILE__)
|
||||||
|
. Custom ChildDef added to default include list
|
||||||
|
. URIScheme reflection improved: will not attempt to include file if class
|
||||||
|
already exists. May clobber autoload, so I need to keep an eye on it
|
||||||
|
|
||||||
2.0.1, released 2007-06-27
|
2.0.1, released 2007-06-27
|
||||||
! Tag auto-closing now based on a ChildDef heuristic rather than a
|
! Tag auto-closing now based on a ChildDef heuristic rather than a
|
||||||
|
@ -40,6 +40,9 @@
|
|||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// constants are slow, but we'll make one exception
|
||||||
|
define('HTMLPURIFIER_PREFIX', dirname(__FILE__));
|
||||||
|
|
||||||
// almost every class has an undocumented dependency to these, so make sure
|
// almost every class has an undocumented dependency to these, so make sure
|
||||||
// they get included
|
// they get included
|
||||||
require_once 'HTMLPurifier/ConfigSchema.php'; // important
|
require_once 'HTMLPurifier/ConfigSchema.php'; // important
|
||||||
|
@ -5,6 +5,7 @@ require_once 'HTMLPurifier/ChildDef.php';
|
|||||||
require_once 'HTMLPurifier/ChildDef/Empty.php';
|
require_once 'HTMLPurifier/ChildDef/Empty.php';
|
||||||
require_once 'HTMLPurifier/ChildDef/Required.php';
|
require_once 'HTMLPurifier/ChildDef/Required.php';
|
||||||
require_once 'HTMLPurifier/ChildDef/Optional.php';
|
require_once 'HTMLPurifier/ChildDef/Optional.php';
|
||||||
|
require_once 'HTMLPurifier/ChildDef/Custom.php';
|
||||||
|
|
||||||
// NOT UNIT TESTED!!!
|
// NOT UNIT TESTED!!!
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ class HTMLPurifier_DefinitionCache_Serializer extends
|
|||||||
*/
|
*/
|
||||||
function generateBaseDirectoryPath($config) {
|
function generateBaseDirectoryPath($config) {
|
||||||
$base = $config->get('Cache', 'SerializerPath');
|
$base = $config->get('Cache', 'SerializerPath');
|
||||||
$base = is_null($base) ? dirname(__FILE__) . '/Serializer' : $base;
|
$base = is_null($base) ? HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer' : $base;
|
||||||
return $base;
|
return $base;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ class HTMLPurifier_EntityLookup {
|
|||||||
*/
|
*/
|
||||||
function setup($file = false) {
|
function setup($file = false) {
|
||||||
if (!$file) {
|
if (!$file) {
|
||||||
$file = dirname(__FILE__) . '/EntityLookup/entities.ser';
|
$file = HTMLPURIFIER_PREFIX . '/HTMLPurifier/EntityLookup/entities.ser';
|
||||||
}
|
}
|
||||||
$this->table = unserialize(file_get_contents($file));
|
$this->table = unserialize(file_get_contents($file));
|
||||||
}
|
}
|
||||||
|
@ -82,7 +82,7 @@ class HTMLPurifier_LanguageFactory
|
|||||||
*/
|
*/
|
||||||
function setup() {
|
function setup() {
|
||||||
$this->validator = new HTMLPurifier_AttrDef_Lang();
|
$this->validator = new HTMLPurifier_AttrDef_Lang();
|
||||||
$this->dir = dirname(__FILE__);
|
$this->dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -59,14 +59,14 @@ class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer
|
|||||||
* available
|
* available
|
||||||
*/
|
*/
|
||||||
function getCSS() {
|
function getCSS() {
|
||||||
return file_get_contents(dirname(__FILE__) . '/ConfigForm.css');
|
return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves JavaScript, in case directory is not public
|
* Retrieves JavaScript, in case directory is not public
|
||||||
*/
|
*/
|
||||||
function getJavaScript() {
|
function getJavaScript() {
|
||||||
return file_get_contents(dirname(__FILE__) . '/ConfigForm.js');
|
return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -79,12 +79,14 @@ class HTMLPurifier_URISchemeRegistry
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isset($this->schemes[$scheme])) return $this->schemes[$scheme];
|
if (isset($this->schemes[$scheme])) return $this->schemes[$scheme];
|
||||||
if (empty($this->_dir)) $this->_dir = dirname(__FILE__) . '/URIScheme/';
|
if (empty($this->_dir)) $this->_dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier/URIScheme/';
|
||||||
|
|
||||||
if (!isset($allowed_schemes[$scheme])) return $null;
|
if (!isset($allowed_schemes[$scheme])) return $null;
|
||||||
|
|
||||||
@include_once $this->_dir . $scheme . '.php';
|
// this bit of reflection is not very efficient, and a bit
|
||||||
|
// hacky too
|
||||||
$class = 'HTMLPurifier_URIScheme_' . $scheme;
|
$class = 'HTMLPurifier_URIScheme_' . $scheme;
|
||||||
|
if (!class_exists($class)) include_once $this->_dir . $scheme . '.php';
|
||||||
if (!class_exists($class)) return $null;
|
if (!class_exists($class)) return $null;
|
||||||
$this->schemes[$scheme] = new $class();
|
$this->schemes[$scheme] = new $class();
|
||||||
return $this->schemes[$scheme];
|
return $this->schemes[$scheme];
|
||||||
|
190
maintenance/merge-library.php
Normal file
190
maintenance/merge-library.php
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
#!/usr/bin/php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compiles all of HTML Purifier's library files into one big file
|
||||||
|
* named HTMLPurifier.standalone.php. Operates recursively, and will
|
||||||
|
* barf if there are conditional includes.
|
||||||
|
*
|
||||||
|
* Details: also creates blank "include" files in the test/blank directory
|
||||||
|
* in order to simulate require_once's inside the test files.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Global array that tracks already loaded includes
|
||||||
|
*/
|
||||||
|
$GLOBALS['loaded'] = array('HTMLPurifier.php' => true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $text Text 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.
|
||||||
|
*/
|
||||||
|
function remove_php_tags($text) {
|
||||||
|
return substr($text, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an appropriate blank file, recursively generating directories
|
||||||
|
* if necessary
|
||||||
|
*/
|
||||||
|
function create_blank($file) {
|
||||||
|
$dir = dirname($file);
|
||||||
|
$base = realpath('../tests/blanks/') . DIRECTORY_SEPARATOR ;
|
||||||
|
if ($dir != '.') mkdir_deep($base . $dir);
|
||||||
|
file_put_contents($base . $file, '');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recursively creates a directory
|
||||||
|
* @note Adapted from the PHP manual comment 76612
|
||||||
|
*/
|
||||||
|
function mkdir_deep($folder) {
|
||||||
|
$folders = preg_split("#[\\\\/]#", $folder);
|
||||||
|
$base = '';
|
||||||
|
for($i = 0, $c = count($folders); $i < $c; $i++) {
|
||||||
|
if(empty($folders[$i])) continue;
|
||||||
|
$base .= $folders[$i];
|
||||||
|
if(!is_dir($base)){
|
||||||
|
mkdir($base);
|
||||||
|
}
|
||||||
|
$base .= DIRECTORY_SEPARATOR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy a file, or recursively copy a folder and its contents
|
||||||
|
*
|
||||||
|
* @author Aidan Lister <aidan@php.net>
|
||||||
|
* @version 1.0.1
|
||||||
|
* @link http://aidanlister.com/repos/v/function.copyr.php
|
||||||
|
* @param string $source Source path
|
||||||
|
* @param string $dest Destination path
|
||||||
|
* @return bool Returns TRUE on success, FALSE on failure
|
||||||
|
*/
|
||||||
|
function copyr($source, $dest) {
|
||||||
|
// Simple copy for a file
|
||||||
|
if (is_file($source)) {
|
||||||
|
return copy($source, $dest);
|
||||||
|
}
|
||||||
|
// Make destination directory
|
||||||
|
if (!is_dir($dest)) {
|
||||||
|
mkdir($dest);
|
||||||
|
}
|
||||||
|
// Loop through the folder
|
||||||
|
$dir = dir($source);
|
||||||
|
while (false !== $entry = $dir->read()) {
|
||||||
|
// Skip pointers
|
||||||
|
if ($entry == '.' || $entry == '..') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Skip hidden files
|
||||||
|
if ($entry[0] == '.') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Deep copy directories
|
||||||
|
if ($dest !== "$source/$entry") {
|
||||||
|
copyr("$source/$entry", "$dest/$entry");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Clean up
|
||||||
|
$dir->close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete a file, or a folder and its contents
|
||||||
|
*
|
||||||
|
* @author Aidan Lister <aidan@php.net>
|
||||||
|
* @version 1.0.3
|
||||||
|
* @link http://aidanlister.com/repos/v/function.rmdirr.php
|
||||||
|
* @param string $dirname Directory to delete
|
||||||
|
* @return bool Returns TRUE on success, FALSE on failure
|
||||||
|
*/
|
||||||
|
function rmdirr($dirname)
|
||||||
|
{
|
||||||
|
// Sanity check
|
||||||
|
if (!file_exists($dirname)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simple delete for a file
|
||||||
|
if (is_file($dirname) || is_link($dirname)) {
|
||||||
|
return unlink($dirname);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loop through the folder
|
||||||
|
$dir = dir($dirname);
|
||||||
|
while (false !== $entry = $dir->read()) {
|
||||||
|
// Skip pointers
|
||||||
|
if ($entry == '.' || $entry == '..') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Recurse
|
||||||
|
rmdirr($dirname . DIRECTORY_SEPARATOR . $entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean up
|
||||||
|
$dir->close();
|
||||||
|
return rmdir($dirname);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copies the contents of a directory to the standalone directory
|
||||||
|
*/
|
||||||
|
function make_dir_standalone($dir) {
|
||||||
|
return copyr($dir, 'standalone/' . $dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
function make_file_standalone($file) {
|
||||||
|
mkdir_deep('standalone/' . dirname($file));
|
||||||
|
return copy($file, 'standalone/' . $file);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $matches preg_replace_callback matches array, where index 1
|
||||||
|
* is the filename to include
|
||||||
|
*/
|
||||||
|
function replace_includes_callback($matches) {
|
||||||
|
$file = $matches[1];
|
||||||
|
if (isset($GLOBALS['loaded'][$file])) return '';
|
||||||
|
$GLOBALS['loaded'][$file] = true;
|
||||||
|
create_blank($file);
|
||||||
|
return replace_includes(remove_php_tags(file_get_contents($file)));
|
||||||
|
}
|
||||||
|
|
||||||
|
chdir(dirname(__FILE__) . '/../library/');
|
||||||
|
create_blank('HTMLPurifier.php');
|
||||||
|
|
||||||
|
echo 'Creating full file...';
|
||||||
|
$contents = replace_includes(file_get_contents('HTMLPurifier.php'));
|
||||||
|
file_put_contents('HTMLPurifier.standalone.php', $contents);
|
||||||
|
echo ' done!' . PHP_EOL;
|
||||||
|
|
||||||
|
echo 'Creating standalone directory...';
|
||||||
|
// rearrange things that can't be put in our standalone file
|
||||||
|
$contents = str_replace(
|
||||||
|
"define('HTMLPURIFIER_PREFIX', dirname(__FILE__));",
|
||||||
|
"define('HTMLPURIFIER_PREFIX', dirname(__FILE__) . '/standalone');",
|
||||||
|
$contents
|
||||||
|
);
|
||||||
|
rmdirr('standalone'); // ensure a clean copy
|
||||||
|
mkdir_deep('standalone/HTMLPurifier/DefinitionCache/Serializer');
|
||||||
|
make_dir_standalone('HTMLPurifier/EntityLookup');
|
||||||
|
make_dir_standalone('HTMLPurifier/Language');
|
||||||
|
make_file_standalone('HTMLPurifier/Printer/ConfigForm.js');
|
||||||
|
make_file_standalone('HTMLPurifier/Printer/ConfigForm.css');
|
||||||
|
make_dir_standalone('HTMLPurifier/URIScheme');
|
||||||
|
echo ' done!' . PHP_EOL;
|
||||||
|
|
@ -17,8 +17,7 @@ class HTMLPurifier_DefinitionCache_SerializerTest extends HTMLPurifier_Definitio
|
|||||||
$config_md5 = '1.0.0-serial-2';
|
$config_md5 = '1.0.0-serial-2';
|
||||||
|
|
||||||
$file = realpath(
|
$file = realpath(
|
||||||
$rel_file = dirname(__FILE__) .
|
$rel_file = HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer/Test/' .
|
||||||
'/../../../library/HTMLPurifier/DefinitionCache/Serializer/Test/' .
|
|
||||||
$config_md5 . '.ser'
|
$config_md5 . '.ser'
|
||||||
);
|
);
|
||||||
if($file && file_exists($file)) unlink($file); // prevent previous failures from causing problems
|
if($file && file_exists($file)) unlink($file); // prevent previous failures from causing problems
|
||||||
|
@ -38,7 +38,13 @@ if ( is_string($GLOBALS['HTMLPurifierTest']['PEAR']) ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// initialize and load HTML Purifier
|
// initialize and load HTML Purifier
|
||||||
require_once '../library/HTMLPurifier.auto.php';
|
// use ?standalone to load the alterative standalone stub
|
||||||
|
if (isset($_GET['standalone']) || (isset($argv[1]) && $argv[1] == 'standalone')) {
|
||||||
|
set_include_path(realpath('blanks') . PATH_SEPARATOR . get_include_path());
|
||||||
|
require_once '../library/HTMLPurifier.standalone.php';
|
||||||
|
} else {
|
||||||
|
require_once '../library/HTMLPurifier.auto.php';
|
||||||
|
}
|
||||||
|
|
||||||
// setup special DefinitionCacheFactory decorator
|
// setup special DefinitionCacheFactory decorator
|
||||||
$factory =& HTMLPurifier_DefinitionCacheFactory::instance();
|
$factory =& HTMLPurifier_DefinitionCacheFactory::instance();
|
||||||
|
Loading…
Reference in New Issue
Block a user