You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
2.8 KiB
110 lines
2.8 KiB
<?php |
|
|
|
/** |
|
* Takes the contents of blockquote when in strict and reformats for validation. |
|
*/ |
|
class HTMLPurifier_ChildDef_StrictBlockquote extends HTMLPurifier_ChildDef_Required |
|
{ |
|
/** |
|
* @type array |
|
*/ |
|
protected $real_elements; |
|
|
|
/** |
|
* @type array |
|
*/ |
|
protected $fake_elements; |
|
|
|
/** |
|
* @type bool |
|
*/ |
|
public $allow_empty = true; |
|
|
|
/** |
|
* @type string |
|
*/ |
|
public $type = 'strictblockquote'; |
|
|
|
/** |
|
* @type bool |
|
*/ |
|
protected $init = false; |
|
|
|
/** |
|
* @param HTMLPurifier_Config $config |
|
* @return array |
|
* @note We don't want MakeWellFormed to auto-close inline elements since |
|
* they might be allowed. |
|
*/ |
|
public function getAllowedElements($config) |
|
{ |
|
$this->init($config); |
|
return $this->fake_elements; |
|
} |
|
|
|
/** |
|
* @param array $children |
|
* @param HTMLPurifier_Config $config |
|
* @param HTMLPurifier_Context $context |
|
* @return array |
|
*/ |
|
public function validateChildren($children, $config, $context) |
|
{ |
|
$this->init($config); |
|
|
|
// trick the parent class into thinking it allows more |
|
$this->elements = $this->fake_elements; |
|
$result = parent::validateChildren($children, $config, $context); |
|
$this->elements = $this->real_elements; |
|
|
|
if ($result === false) { |
|
return array(); |
|
} |
|
if ($result === true) { |
|
$result = $children; |
|
} |
|
|
|
$def = $config->getHTMLDefinition(); |
|
$block_wrap_name = $def->info_block_wrapper; |
|
$block_wrap = false; |
|
$ret = array(); |
|
|
|
foreach ($result as $node) { |
|
if ($block_wrap === false) { |
|
if (($node instanceof HTMLPurifier_Node_Text && !$node->is_whitespace) || |
|
($node instanceof HTMLPurifier_Node_Element && !isset($this->elements[$node->name]))) { |
|
$block_wrap = new HTMLPurifier_Node_Element($def->info_block_wrapper); |
|
$ret[] = $block_wrap; |
|
} |
|
} else { |
|
if ($node instanceof HTMLPurifier_Node_Element && isset($this->elements[$node->name])) { |
|
$block_wrap = false; |
|
|
|
} |
|
} |
|
if ($block_wrap) { |
|
$block_wrap->children[] = $node; |
|
} else { |
|
$ret[] = $node; |
|
} |
|
} |
|
return $ret; |
|
} |
|
|
|
/** |
|
* @param HTMLPurifier_Config $config |
|
*/ |
|
private function init($config) |
|
{ |
|
if (!$this->init) { |
|
$def = $config->getHTMLDefinition(); |
|
// allow all inline elements |
|
$this->real_elements = $this->elements; |
|
$this->fake_elements = $def->info_content_sets['Flow']; |
|
$this->fake_elements['#PCDATA'] = true; |
|
$this->init = true; |
|
} |
|
} |
|
} |
|
|
|
// vim: et sw=4 sts=4
|
|
|