Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 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