3270a46e1bf9a060dc0d8c0f446e3fa06c74ce39
[yaffs-website] / vendor / ezyang / htmlpurifier / library / HTMLPurifier / ChildDef / StrictBlockquote.php
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