mirror of
https://github.com/ezyang/htmlpurifier.git
synced 2025-08-06 22:26:31 +02:00
Forms implementation for %HTML.Trusted. Some backend changes:
* Added Charsets and Character attribute types * Fix a heavily recursive form of ContentSets, this allows a content-set to include another content-set which includes another content-set, and so forth. Signed-off-by: Edward Z. Yang <edwardzyang@thewritingpot.com>
This commit is contained in:
@@ -37,33 +37,35 @@ class HTMLPurifier_ContentSets
|
||||
// sorry, no way of overloading
|
||||
foreach ($modules as $module_i => $module) {
|
||||
foreach ($module->content_sets as $key => $value) {
|
||||
if (isset($this->info[$key])) {
|
||||
$temp = $this->convertToLookup($value);
|
||||
if (isset($this->lookup[$key])) {
|
||||
// add it into the existing content set
|
||||
$this->info[$key] = $this->info[$key] . ' | ' . $value;
|
||||
$this->lookup[$key] = array_merge($this->lookup[$key], $temp);
|
||||
} else {
|
||||
$this->info[$key] = $value;
|
||||
$this->lookup[$key] = $temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
// perform content_set expansions
|
||||
$this->keys = array_keys($this->info);
|
||||
foreach ($this->info as $i => $set) {
|
||||
// only performed once, so infinite recursion is not
|
||||
// a problem
|
||||
$this->info[$i] =
|
||||
str_replace(
|
||||
$this->keys,
|
||||
// must be recalculated each time due to
|
||||
// changing substitutions
|
||||
array_values($this->info),
|
||||
$set);
|
||||
$old_lookup = false;
|
||||
while ($old_lookup !== $this->lookup) {
|
||||
$old_lookup = $this->lookup;
|
||||
foreach ($this->lookup as $i => $set) {
|
||||
$add = array();
|
||||
foreach ($set as $element => $x) {
|
||||
if (isset($this->lookup[$element])) {
|
||||
$add += $this->lookup[$element];
|
||||
unset($this->lookup[$i][$element]);
|
||||
}
|
||||
}
|
||||
$this->lookup[$i] += $add;
|
||||
}
|
||||
}
|
||||
$this->values = array_values($this->info);
|
||||
|
||||
// generate lookup tables
|
||||
foreach ($this->info as $name => $set) {
|
||||
$this->lookup[$name] = $this->convertToLookup($set);
|
||||
foreach ($this->lookup as $key => $lookup) {
|
||||
$this->info[$key] = implode(' | ', array_keys($lookup));
|
||||
}
|
||||
$this->keys = array_keys($this->info);
|
||||
$this->values = array_values($this->info);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -75,12 +77,22 @@ class HTMLPurifier_ContentSets
|
||||
if (!empty($def->child)) return; // already done!
|
||||
$content_model = $def->content_model;
|
||||
if (is_string($content_model)) {
|
||||
$def->content_model = str_replace(
|
||||
$this->keys, $this->values, $content_model);
|
||||
// Assume that $this->keys is alphanumeric
|
||||
$def->content_model = preg_replace_callback(
|
||||
'/\b(' . implode('|', $this->keys) . ')\b/',
|
||||
array($this, 'generateChildDefCallback'),
|
||||
$content_model
|
||||
);
|
||||
//$def->content_model = str_replace(
|
||||
// $this->keys, $this->values, $content_model);
|
||||
}
|
||||
$def->child = $this->getChildDef($def, $module);
|
||||
}
|
||||
|
||||
public function generateChildDefCallback($matches) {
|
||||
return $this->info[$matches[0]];
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a ChildDef based on content_model and content_model_type
|
||||
* member variables in HTMLPurifier_ElementDef
|
||||
|
Reference in New Issue
Block a user