1<?php
2
3/**
4 * Takes the contents of blockquote when in strict and reformats for validation.
5 */
6class 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
111