diff --git a/library/HTMLPurifier/CSSDefinition.php b/library/HTMLPurifier/CSSDefinition.php
index 12dc62b6..f1dfad63 100644
--- a/library/HTMLPurifier/CSSDefinition.php
+++ b/library/HTMLPurifier/CSSDefinition.php
@@ -9,11 +9,24 @@ require_once 'HTMLPurifier/AttrDef/Multiple.php';
require_once 'HTMLPurifier/AttrDef/TextDecoration.php';
require_once 'HTMLPurifier/AttrDef/FontFamily.php';
+/**
+ * Defines allowed CSS attributes and what their values are.
+ * @see HTMLPurifier_HTMLDefinition
+ */
class HTMLPurifier_CSSDefinition
{
+ /**
+ * Assoc array of attribute name to definition object.
+ */
var $info = array();
+ /**
+ * Returns sole instance of this definition.
+ * @param $prototype Optional prototype you may pass in to overload
+ * the sole instance. Good for replacing an instance of
+ * the object with your own, custom object.
+ */
function &instance($prototype = null) {
static $instance = null;
if ($prototype) {
@@ -25,8 +38,9 @@ class HTMLPurifier_CSSDefinition
return $instance;
}
- function HTMLPurifier_CSSDefinition() {}
-
+ /**
+ * Constructs the info array. The meat of this class.
+ */
function setup() {
$this->info['text-align'] = new HTMLPurifier_AttrDef_Enum(
diff --git a/library/HTMLPurifier/ChildDef.php b/library/HTMLPurifier/ChildDef.php
index 970de2f7..6df69846 100644
--- a/library/HTMLPurifier/ChildDef.php
+++ b/library/HTMLPurifier/ChildDef.php
@@ -22,27 +22,73 @@ HTMLPurifier_ConfigDef::define(
);
/**
- * Class that defines allowed child nodes and validates tokens against this.
+ * Defines allowed child nodes and validates tokens against it.
*/
class HTMLPurifier_ChildDef
{
+ /**
+ * Type of child definition, usually right-most part of class name lowercase
+ *
+ * Used occasionally in terms of context. Possible values include
+ * custom, required, optional and empty.
+ */
var $type;
+
+ /**
+ * Bool that indicates whether or not an empty array of children is okay
+ *
+ * This is necessary for redundant checking when changes affecting
+ * a child node may cause a parent node to now be disallowed.
+ */
var $allow_empty;
- function validateChildren($tokens_of_children) {
+
+ /**
+ * Validates nodes according to definition and returns modification.
+ *
+ * @warning $context is NOT HTMLPurifier_AttrContext
+ * @param $tokens_of_children Array of HTMLPurifier_Token
+ * @param $config HTMLPurifier_Config object
+ * @param $context String context indicating inline, block or unknown
+ * @return bool true to leave nodes as is
+ * @return bool false to remove parent node
+ * @return array of replacement child tokens
+ */
+ function validateChildren($tokens_of_children, $config, $context) {
trigger_error('Call to abstract function', E_USER_ERROR);
}
}
+/**
+ * Custom validation class, accepts DTD child definitions
+ *
+ * @warning Currently this class is an all or nothing proposition, that is,
+ * it will only give a bool return value. Table is the only
+ * child definition that uses this class, and we ought to give
+ * it a dedicated one.
+ */
class HTMLPurifier_ChildDef_Custom extends HTMLPurifier_ChildDef
{
var $type = 'custom';
var $allow_empty = false;
+ /**
+ * Allowed child pattern as defined by the DTD
+ */
var $dtd_regex;
+ /**
+ * PCRE regex derived from $dtd_regex
+ * @private
+ */
var $_pcre_regex;
+ /**
+ * @param $dtd_regex Allowed child pattern from the DTD
+ */
function HTMLPurifier_ChildDef_Custom($dtd_regex) {
$this->dtd_regex = $dtd_regex;
$this->_compileRegex();
}
+ /**
+ * Compiles the PCRE regex from a DTD regex ($dtd_regex to $_pcre_regex)
+ */
function _compileRegex() {
$raw = str_replace(' ', '', $this->dtd_regex);
if ($raw{0} != '(') {
@@ -82,9 +128,18 @@ class HTMLPurifier_ChildDef_Custom extends HTMLPurifier_ChildDef
}
}
+/**
+ * Definition that allows a set of elements, but disallows empty children.
+ */
class HTMLPurifier_ChildDef_Required extends HTMLPurifier_ChildDef
{
+ /**
+ * Lookup table of allowed elements.
+ */
var $elements = array();
+ /**
+ * @param $elements List of allowed element names (lowercase).
+ */
function HTMLPurifier_ChildDef_Required($elements) {
if (is_string($elements)) {
$elements = str_replace(' ', '', $elements);
@@ -168,8 +223,13 @@ class HTMLPurifier_ChildDef_Required extends HTMLPurifier_ChildDef
}
}
-// only altered behavior is that it returns an empty array
-// instead of a false (to delete the node)
+/**
+ * Definition that allows a set of elements, and allows no children.
+ * @note This is a hack to reuse code from HTMLPurifier_ChildDef_Required,
+ * really, one shouldn't inherit from the other. Only altered behavior
+ * is to overload a returned false with an array. Thus, it will never
+ * return false.
+ */
class HTMLPurifier_ChildDef_Optional extends HTMLPurifier_ChildDef_Required
{
var $allow_empty = true;
@@ -181,23 +241,48 @@ class HTMLPurifier_ChildDef_Optional extends HTMLPurifier_ChildDef_Required
}
}
-// placeholder
+/**
+ * Definition that disallows all elements.
+ * @warning validateChildren() in this class is actually never called, because
+ * empty elements are corrected in HTMLPurifier_Strategy_MakeWellFormed
+ * before child definitions are parsed in earnest by
+ * HTMLPurifier_Strategy_FixNesting.
+ */
class HTMLPurifier_ChildDef_Empty extends HTMLPurifier_ChildDef
{
var $allow_empty = true;
var $type = 'empty';
function HTMLPurifier_ChildDef_Empty() {}
function validateChildren($tokens_of_children, $config, $context) {
- return false;
+ return array();
}
}
+/**
+ * Definition that uses different definitions depending on context.
+ *
+ * The del and ins tags are notable because they allow different types of
+ * elements depending on whether or not they're in a block or inline context.
+ * Chameleon allows this behavior to happen by using two different
+ * definitions depending on context. While this somewhat generalized,
+ * it is specifically intended for those two tags.
+ */
class HTMLPurifier_ChildDef_Chameleon extends HTMLPurifier_ChildDef
{
+ /**
+ * Instance of the definition object to use when inline. Usually stricter.
+ */
var $inline;
+ /**
+ * Instance of the definition object to use when block.
+ */
var $block;
+ /**
+ * @param $inline List of elements to allow when inline.
+ * @param $block List of elements to allow when block.
+ */
function HTMLPurifier_ChildDef_Chameleon($inline, $block) {
$this->inline = new HTMLPurifier_ChildDef_Optional($inline);
$this->block = new HTMLPurifier_ChildDef_Optional($block);
diff --git a/library/HTMLPurifier/Config.php b/library/HTMLPurifier/Config.php
index e27978cd..01dd605e 100644
--- a/library/HTMLPurifier/Config.php
+++ b/library/HTMLPurifier/Config.php
@@ -1,7 +1,10 @@
conf = $definition->info; // set up the defaults
}
+ /**
+ * Convenience constructor that creates a default configuration object.
+ * @return Default HTMLPurifier_Config object.
+ */
function createDefault() {
$definition =& HTMLPurifier_ConfigDef::instance();
$config = new HTMLPurifier_Config($definition);
return $config;
}
+ /**
+ * Retreives a value from the configuration.
+ * @param $namespace String namespace
+ * @param $key String key
+ */
function get($namespace, $key) {
if (!isset($this->conf[$namespace][$key])) {
trigger_error('Cannot retrieve value of undefined directive',
@@ -33,6 +52,12 @@ class HTMLPurifier_Config
return $this->conf[$namespace][$key];
}
+ /**
+ * Sets a value to configuration.
+ * @param $namespace String namespace
+ * @param $key String key
+ * @param $value Mixed value
+ */
function set($namespace, $key, $value) {
if (!isset($this->conf[$namespace][$key])) {
trigger_error('Cannot set undefined directive to value',
diff --git a/library/HTMLPurifier/ConfigDef.php b/library/HTMLPurifier/ConfigDef.php
index 0c76ed70..d1f253f7 100644
--- a/library/HTMLPurifier/ConfigDef.php
+++ b/library/HTMLPurifier/ConfigDef.php
@@ -1,15 +1,29 @@
defineNamespace('Core', 'Core features that are always available.');
$this->defineNamespace('Attr', 'Features regarding attribute validation.');
$this->defineNamespace('URI', 'Features regarding Uniform Resource Identifiers.');
}
+ /**
+ * Retrieves an instance of the application-wide configuration definition.
+ */
function &instance($prototype = null) {
static $instance;
if ($prototype !== null) {
@@ -21,6 +35,17 @@ class HTMLPurifier_ConfigDef {
return $instance;
}
+ /**
+ * Defines a directive for configuration
+ * @warning Will fail of directive's namespace is defined
+ * @todo Collect information on description and allow redefinition
+ * so that multiple files can register a dependency on a
+ * configuration directive.
+ * @param $namespace Namespace the directive is in
+ * @param $name Key of directive
+ * @param $default Default value of directive
+ * @param $description Description of directive for documentation
+ */
function define($namespace, $name, $default, $description) {
$def =& HTMLPurifier_ConfigDef::instance();
if (!isset($def->info[$namespace])) {
@@ -36,6 +61,11 @@ class HTMLPurifier_ConfigDef {
$def->info[$namespace][$name] = $default;
}
+ /**
+ * Defines a namespace for directives to be put into.
+ * @param $namespace Namespace's name
+ * @param $description Description of the namespace
+ */
function defineNamespace($namespace, $description) {
$def =& HTMLPurifier_ConfigDef::instance();
if (isset($def->info[$namespace])) {
diff --git a/library/HTMLPurifier/EntityLookup.php b/library/HTMLPurifier/EntityLookup.php
index 7b5cfa7b..23ec8563 100644
--- a/library/HTMLPurifier/EntityLookup.php
+++ b/library/HTMLPurifier/EntityLookup.php
@@ -1,12 +1,22 @@
table = unserialize(file_get_contents($file));
}
+ /**
+ * Retrieves sole instance of the object.
+ * @param Optional prototype of custom lookup table to overload with.
+ */
function instance($prototype = false) {
// no references, since PHP doesn't copy unless modified
static $instance = null;