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
111: