1: <?php
2:
3: /**
4: * Decorator which enables !important to be used in CSS values.
5: */
6: class HTMLPurifier_AttrDef_CSS_ImportantDecorator extends HTMLPurifier_AttrDef
7: {
8: /**
9: * @type HTMLPurifier_AttrDef
10: */
11: public $def;
12: /**
13: * @type bool
14: */
15: public $allow;
16:
17: /**
18: * @param HTMLPurifier_AttrDef $def Definition to wrap
19: * @param bool $allow Whether or not to allow !important
20: */
21: public function __construct($def, $allow = false)
22: {
23: $this->def = $def;
24: $this->allow = $allow;
25: }
26:
27: /**
28: * Intercepts and removes !important if necessary
29: * @param string $string
30: * @param HTMLPurifier_Config $config
31: * @param HTMLPurifier_Context $context
32: * @return bool|string
33: */
34: public function validate($string, $config, $context)
35: {
36: // test for ! and important tokens
37: $string = trim($string);
38: $is_important = false;
39: // :TODO: optimization: test directly for !important and ! important
40: if (strlen($string) >= 9 && substr($string, -9) === 'important') {
41: $temp = rtrim(substr($string, 0, -9));
42: // use a temp, because we might want to restore important
43: if (strlen($temp) >= 1 && substr($temp, -1) === '!') {
44: $string = rtrim(substr($temp, 0, -1));
45: $is_important = true;
46: }
47: }
48: $string = $this->def->validate($string, $config, $context);
49: if ($this->allow && $is_important) {
50: $string .= ' !important';
51: }
52: return $string;
53: }
54: }
55:
56: // vim: et sw=4 sts=4
57: