mirror of
https://github.com/ezyang/htmlpurifier.git
synced 2024-12-23 00:41:52 +00:00
[1.7.0] Wire in DoctypeRegistry to HTMLModuleManager, convert doctype declarations, migrate some related functionality to proper class
git-svn-id: http://htmlpurifier.org/svnroot/htmlpurifier/trunk@1060 48356398-32a2-884e-a903-53898d9a118a
This commit is contained in:
parent
6b9c5ec603
commit
65252d6fbd
@ -25,7 +25,7 @@ class HTMLPurifier_Doctype
|
||||
var $modulesForModes = array();
|
||||
|
||||
/**
|
||||
* List of aliases to doctype name
|
||||
* List of aliases for this doctype
|
||||
*/
|
||||
var $aliases = array();
|
||||
|
||||
@ -37,6 +37,15 @@ class HTMLPurifier_Doctype
|
||||
$this->modulesForModes = $modules_for_modes;
|
||||
$this->aliases = $aliases;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clones the doctype, use before resolving modes and the like
|
||||
*/
|
||||
function copy() {
|
||||
return new HTMLPurifier_Doctype(
|
||||
$this->name, $this->modules, $this->modulesForModes, $this->aliases
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
@ -52,6 +52,7 @@ class HTMLPurifier_DoctypeRegistry
|
||||
/**
|
||||
* Retrieves reference to a doctype of a certain name
|
||||
* @note This function resolves aliases
|
||||
* @note When possible, use the more fully-featured make()
|
||||
* @param $doctype Name of doctype
|
||||
* @return Reference to doctype object
|
||||
*/
|
||||
@ -64,6 +65,44 @@ class HTMLPurifier_DoctypeRegistry
|
||||
return $this->doctypes[$doctype];
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a doctype based on a configuration object,
|
||||
* will perform initialization on the doctype
|
||||
*/
|
||||
function make($config) {
|
||||
$original_doctype = $this->get($this->getDoctypeFromConfig($config));
|
||||
$doctype = $original_doctype->copy();
|
||||
// initialization goes here
|
||||
foreach ($doctype->modulesForModes as $mode => $mode_modules) {
|
||||
// TODO: test if $mode is active
|
||||
$doctype->modules = array_merge($doctype->modules, $mode_modules);
|
||||
}
|
||||
return $doctype;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the doctype from the configuration object
|
||||
*/
|
||||
function getDoctypeFromConfig($config) {
|
||||
// recommended test
|
||||
$doctype = $config->get('HTML', 'Doctype');
|
||||
if ($doctype !== null) {
|
||||
return $doctype;
|
||||
}
|
||||
// backwards-compatibility
|
||||
if ($config->get('Core', 'XHTML')) {
|
||||
$doctype = 'XHTML 1.0';
|
||||
} else {
|
||||
$doctype = 'HTML 4.01';
|
||||
}
|
||||
if ($config->get('HTML', 'Strict')) {
|
||||
$doctype .= ' Strict';
|
||||
} else {
|
||||
$doctype .= ' Transitional';
|
||||
}
|
||||
return $doctype;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
@ -3,6 +3,7 @@
|
||||
require_once 'HTMLPurifier/HTMLModule.php';
|
||||
require_once 'HTMLPurifier/ElementDef.php';
|
||||
require_once 'HTMLPurifier/Doctype.php';
|
||||
require_once 'HTMLPurifier/DoctypeRegistry.php';
|
||||
|
||||
require_once 'HTMLPurifier/ContentSets.php';
|
||||
require_once 'HTMLPurifier/AttrTypes.php';
|
||||
@ -44,12 +45,16 @@ class HTMLPurifier_HTMLModuleManager
|
||||
{
|
||||
|
||||
/**
|
||||
* Associative array of doctype names to doctype definitions.
|
||||
* @note This may be replaced by a DoctypeManager
|
||||
* Instance of HTMLPurifier_DoctypeRegistry
|
||||
* @public
|
||||
*/
|
||||
var $doctypes;
|
||||
var $doctype; /**< String doctype name to determine modules to load */
|
||||
var $doctypeAliases = array(); /**< Lookup array of strings to real doctypes */
|
||||
|
||||
/**
|
||||
* Instance of HTMLPurifier_AttrTypes
|
||||
* @public
|
||||
*/
|
||||
var $attrTypes;
|
||||
|
||||
/**
|
||||
* Active instances of modules for the specified doctype are
|
||||
@ -74,7 +79,6 @@ class HTMLPurifier_HTMLModuleManager
|
||||
var $prefixes = array('HTMLPurifier_HTMLModule_');
|
||||
|
||||
var $contentSets; /**< Instance of HTMLPurifier_ContentSets */
|
||||
var $attrTypes; /**< Instance of HTMLPurifier_AttrTypes */
|
||||
var $attrCollections; /**< Instance of HTMLPurifier_AttrCollections */
|
||||
|
||||
/** If set to true, unsafe elements and attributes will be allowed */
|
||||
@ -82,13 +86,13 @@ class HTMLPurifier_HTMLModuleManager
|
||||
|
||||
function HTMLPurifier_HTMLModuleManager() {
|
||||
|
||||
// the only editable internal object. The rest need to
|
||||
// be manipulated through modules
|
||||
// editable internal objects
|
||||
$this->attrTypes = new HTMLPurifier_AttrTypes();
|
||||
$this->doctypes = new HTMLPurifier_DoctypeRegistry();
|
||||
|
||||
// these doctype definitions should be placed somewhere else,
|
||||
// and instead, a DoctypeManager instantiated during construction
|
||||
// setup default HTML doctypes
|
||||
|
||||
// module reuse
|
||||
$common = array(
|
||||
'CommonAttributes', 'Text', 'Hypertext', 'List',
|
||||
'Presentation', 'Edit', 'Bdo', 'Tables', 'Image',
|
||||
@ -96,40 +100,38 @@ class HTMLPurifier_HTMLModuleManager
|
||||
);
|
||||
$transitional = array('Legacy', 'Target');
|
||||
|
||||
$d =& $this->addDoctype('HTML 4.01 Transitional');
|
||||
$d->modules = array_merge($common, $transitional);
|
||||
$d->modulesForMode['correctional'] = array('TransformToStrict');
|
||||
$this->doctypes->register(
|
||||
'HTML 4.01 Transitional',
|
||||
array_merge($common, $transitional),
|
||||
array('correctional' => array('TransformToStrict'))
|
||||
);
|
||||
|
||||
$d =& $this->addDoctype('XHTML 1.0 Transitional');
|
||||
$d->modules = array_merge($common, $transitional);
|
||||
$d->modulesForMode['correctional'] = array('TransformToStrict');
|
||||
$this->doctypes->register(
|
||||
'XHTML 1.0 Transitional',
|
||||
array_merge($common, $transitional),
|
||||
array('correctional' => array('TransformToStrict'))
|
||||
);
|
||||
|
||||
$d =& $this->addDoctype('HTML 4.01 Strict');
|
||||
$d->modules = array_merge($common);
|
||||
$d->modulesForMode['lenient'] = array('TransformToStrict');
|
||||
$this->doctypes->register(
|
||||
'HTML 4.01 Strict',
|
||||
array_merge($common),
|
||||
array('lenient' => array('TransformToStrict'))
|
||||
);
|
||||
|
||||
$d =& $this->addDoctype('XHTML 1.0 Strict');
|
||||
$d->modules = array_merge($common);
|
||||
$d->modulesForMode['lenient'] = array('TransformToStrict');
|
||||
$this->doctypes->register(
|
||||
'XHTML 1.0 Strict',
|
||||
array_merge($common),
|
||||
array('lenient' => array('TransformToStrict'))
|
||||
);
|
||||
|
||||
$d =& $this->addDoctype('XHTML 1.1');
|
||||
$d->modules = array_merge($common);
|
||||
$d->modulesForMode['lenient'] = array('TransformToStrict', 'TransformToXHTML11');
|
||||
$this->doctypes->register(
|
||||
'XHTML 1.1',
|
||||
array_merge($common),
|
||||
array('lenient' => array('TransformToStrict', 'TransformToXHTML11'))
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Temporary function that creates a new doctype and returns a
|
||||
* reference to it.
|
||||
* @note Real version should retrieve a fully formed instance of
|
||||
* the doctype and register its aliases
|
||||
*/
|
||||
function &addDoctype($name) {
|
||||
$this->doctypes[$name] = new HTMLPurifier_Doctype();
|
||||
$this->doctypes[$name]->name = $name;
|
||||
return $this->doctypes[$name];
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a module to the recognized module list, useful for
|
||||
* overloading pre-existing modules.
|
||||
@ -219,20 +221,9 @@ class HTMLPurifier_HTMLModuleManager
|
||||
*/
|
||||
function setup($config) {
|
||||
|
||||
// retrieve the doctype
|
||||
$this->doctype = $this->getDoctype($config);
|
||||
if (isset($this->doctypeAliases[$this->doctype])) {
|
||||
// resolve alias
|
||||
$this->doctype = $this->doctypeAliases[$this->doctype];
|
||||
}
|
||||
|
||||
// retrieve object instance of doctype
|
||||
$doctype = $this->doctypes[$this->doctype];
|
||||
// generate
|
||||
$doctype = $this->doctypes->make($config);
|
||||
$modules = $doctype->modules;
|
||||
foreach ($doctype->modulesForMode as $mode => $mode_modules) {
|
||||
// TODO: test if $mode is active
|
||||
$modules = array_merge($modules, $mode_modules);
|
||||
}
|
||||
|
||||
foreach ($modules as $module) {
|
||||
if (is_object($module)) {
|
||||
@ -272,29 +263,6 @@ class HTMLPurifier_HTMLModuleManager
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the doctype from the configuration object
|
||||
*/
|
||||
function getDoctype($config) {
|
||||
// simplistic test
|
||||
$doctype = $config->get('HTML', 'Doctype');
|
||||
if ($doctype !== null) {
|
||||
return $doctype;
|
||||
}
|
||||
// this is backwards-compatibility stuff
|
||||
if ($config->get('Core', 'XHTML')) {
|
||||
$doctype = 'XHTML 1.0';
|
||||
} else {
|
||||
$doctype = 'HTML 4.01';
|
||||
}
|
||||
if ($config->get('HTML', 'Strict')) {
|
||||
$doctype .= ' Strict';
|
||||
} else {
|
||||
$doctype .= ' Transitional';
|
||||
}
|
||||
return $doctype;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves merged element definitions.
|
||||
* @param $config Instance of HTMLPurifier_Config, for determining
|
||||
|
Loading…
Reference in New Issue
Block a user