1: | <?php |
2: | |
3: | /** |
4: | * Framework class for strings that involve multiple values. |
5: | * |
6: | * Certain CSS properties such as border-width and margin allow multiple |
7: | * lengths to be specified. This class can take a vanilla border-width |
8: | * definition and multiply it, usually into a max of four. |
9: | * |
10: | * @note Even though the CSS specification isn't clear about it, inherit |
11: | * can only be used alone: it will never manifest as part of a multi |
12: | * shorthand declaration. Thus, this class does not allow inherit. |
13: | */ |
14: | class HTMLPurifier_AttrDef_CSS_Multiple extends HTMLPurifier_AttrDef |
15: | { |
16: | /** |
17: | * Instance of component definition to defer validation to. |
18: | * @type HTMLPurifier_AttrDef |
19: | * @todo Make protected |
20: | */ |
21: | public $single; |
22: | |
23: | /** |
24: | * Max number of values allowed. |
25: | * @todo Make protected |
26: | */ |
27: | public $max; |
28: | |
29: | /** |
30: | * @param HTMLPurifier_AttrDef $single HTMLPurifier_AttrDef to multiply |
31: | * @param int $max Max number of values allowed (usually four) |
32: | */ |
33: | public function __construct($single, $max = 4) |
34: | { |
35: | $this->single = $single; |
36: | $this->max = $max; |
37: | } |
38: | |
39: | /** |
40: | * @param string $string |
41: | * @param HTMLPurifier_Config $config |
42: | * @param HTMLPurifier_Context $context |
43: | * @return bool|string |
44: | */ |
45: | public function validate($string, $config, $context) |
46: | { |
47: | $string = $this->mungeRgb($this->parseCDATA($string)); |
48: | if ($string === '') { |
49: | return false; |
50: | } |
51: | $parts = explode(' ', $string); // parseCDATA replaced \r, \t and \n |
52: | $length = count($parts); |
53: | $final = ''; |
54: | for ($i = 0, $num = 0; $i < $length && $num < $this->max; $i++) { |
55: | if (ctype_space($parts[$i])) { |
56: | continue; |
57: | } |
58: | $result = $this->single->validate($parts[$i], $config, $context); |
59: | if ($result !== false) { |
60: | $final .= $result . ' '; |
61: | $num++; |
62: | } |
63: | } |
64: | if ($final === '') { |
65: | return false; |
66: | } |
67: | return rtrim($final); |
68: | } |
69: | } |
70: | |
71: | // vim: et sw=4 sts=4 |
72: |