<?php
class HTMLPurifier_ChildDef_HTML5_Fieldset extends HTMLPurifier_ChildDef
{
public $type = 'fieldset';
public $elements = array(
'legend' => true,
);
protected $allowedElements;
/**
* @param HTMLPurifier_Config $config
* @return array
*/
public function getAllowedElements($config)
{
if (null === $this->allowedElements) {
// Add Flow content to allowed elements to prevent MakeWellFormed
// strategy moving them outside details element
$def = $config->getHTMLDefinition();
$this->allowedElements = array_merge(
$def->info_content_sets['Flow'],
$this->elements
);
}
return $this->allowedElements;
}
/**
* @param array $children
* @param HTMLPurifier_Config $config
* @param HTMLPurifier_Context $context
* @return array|bool
*/
public function validateChildren($children, $config, $context)
{
$children = (array) $children;
// Content model:
// An optional <legend> element, followed by flow content.
// Only one legend element should occur in the content and if present
// should only be preceded by whitespace.
// https://www.w3.org/TR/xhtml1/dtds.html
$legend = array();
$spaces = array();
$others = array();
while ($children) {
$child = reset($children);
if ($child instanceof HTMLPurifier_Node_Text && $child->is_whitespace) {
$spaces[] = array_shift($children);
} else {
break;
}
}
foreach ($children as $node) {
if (!$legend && $node->name === 'legend') {
$legend[] = $node;
continue;
}
if ($node->name === 'legend') {
// duplicated <legend>, add only its children
$others = array_merge($others, (array) $node->children);
} else {
$others[] = $node;
}
}
return array_merge($spaces, $legend, $others);
}
}