1 <?php 2 3 /** 4 * Takes the contents of blockquote when in strict and reformats for validation. 5 */ 6 class HTMLPurifier_ChildDef_StrictBlockquote extends HTMLPurifier_ChildDef_Required 7 { 8 /** 9 * @type array 10 */ 11 protected $real_elements; 12 13 /** 14 * @type array 15 */ 16 protected $fake_elements; 17 18 /** 19 * @type bool 20 */ 21 public $allow_empty = true; 22 23 /** 24 * @type string 25 */ 26 public $type = 'strictblockquote'; 27 28 /** 29 * @type bool 30 */ 31 protected $init = false; 32 33 /** 34 * @param HTMLPurifier_Config $config 35 * @return array 36 * @note We don't want MakeWellFormed to auto-close inline elements since 37 * they might be allowed. 38 */ 39 public function getAllowedElements($config) 40 { 41 $this->init($config); 42 return $this->fake_elements; 43 } 44 45 /** 46 * @param array $children 47 * @param HTMLPurifier_Config $config 48 * @param HTMLPurifier_Context $context 49 * @return array 50 */ 51 public function validateChildren($children, $config, $context) 52 { 53 $this->init($config); 54 55 // trick the parent class into thinking it allows more 56 $this->elements = $this->fake_elements; 57 $result = parent::validateChildren($children, $config, $context); 58 $this->elements = $this->real_elements; 59 60 if ($result === false) { 61 return array(); 62 } 63 if ($result === true) { 64 $result = $children; 65 } 66 67 $def = $config->getHTMLDefinition(); 68 $block_wrap_name = $def->info_block_wrapper; 69 $block_wrap = false; 70 $ret = array(); 71 72 foreach ($result as $node) { 73 if ($block_wrap === false) { 74 if (($node instanceof HTMLPurifier_Node_Text && !$node->is_whitespace) || 75 ($node instanceof HTMLPurifier_Node_Element && !isset($this->elements[$node->name]))) { 76 $block_wrap = new HTMLPurifier_Node_Element($def->info_block_wrapper); 77 $ret[] = $block_wrap; 78 } 79 } else { 80 if ($node instanceof HTMLPurifier_Node_Element && isset($this->elements[$node->name])) { 81 $block_wrap = false; 82 83 } 84 } 85 if ($block_wrap) { 86 $block_wrap->children[] = $node; 87 } else { 88 $ret[] = $node; 89 } 90 } 91 return $ret; 92 } 93 94 /** 95 * @param HTMLPurifier_Config $config 96 */ 97 private function init($config) 98 { 99 if (!$this->init) { 100 $def = $config->getHTMLDefinition(); 101 // allow all inline elements 102 $this->real_elements = $this->elements; 103 $this->fake_elements = $def->info_content_sets['Flow']; 104 $this->fake_elements['#PCDATA'] = true; 105 $this->init = true; 106 } 107 } 108 } 109 110 // vim: et sw=4 sts=4
title
Description
Body
title
Description
Body
title
Description
Body
title
Body