1: <?php
2:
3: /**
4: * Microsoft's proprietary filter: CSS property
5: * @note Currently supports the alpha filter. In the future, this will
6: * probably need an extensible framework
7: */
8: class HTMLPurifier_AttrDef_CSS_Filter extends HTMLPurifier_AttrDef
9: {
10: /**
11: * @type HTMLPurifier_AttrDef_Integer
12: */
13: protected $intValidator;
14:
15: public function __construct()
16: {
17: $this->intValidator = new HTMLPurifier_AttrDef_Integer();
18: }
19:
20: /**
21: * @param string $value
22: * @param HTMLPurifier_Config $config
23: * @param HTMLPurifier_Context $context
24: * @return bool|string
25: */
26: public function validate($value, $config, $context)
27: {
28: $value = $this->parseCDATA($value);
29: if ($value === 'none') {
30: return $value;
31: }
32: // if we looped this we could support multiple filters
33: $function_length = strcspn($value, '(');
34: $function = trim(substr($value, 0, $function_length));
35: if ($function !== 'alpha' &&
36: $function !== 'Alpha' &&
37: $function !== 'progid:DXImageTransform.Microsoft.Alpha'
38: ) {
39: return false;
40: }
41: $cursor = $function_length + 1;
42: $parameters_length = strcspn($value, ')', $cursor);
43: $parameters = substr($value, $cursor, $parameters_length);
44: $params = explode(',', $parameters);
45: $ret_params = array();
46: $lookup = array();
47: foreach ($params as $param) {
48: list($key, $value) = explode('=', $param);
49: $key = trim($key);
50: $value = trim($value);
51: if (isset($lookup[$key])) {
52: continue;
53: }
54: if ($key !== 'opacity') {
55: continue;
56: }
57: $value = $this->intValidator->validate($value, $config, $context);
58: if ($value === false) {
59: continue;
60: }
61: $int = (int)$value;
62: if ($int > 100) {
63: $value = '100';
64: }
65: if ($int < 0) {
66: $value = '0';
67: }
68: $ret_params[] = "$key=$value";
69: $lookup[$key] = true;
70: }
71: $ret_parameters = implode(',', $ret_params);
72: $ret_function = "$function($ret_parameters)";
73: return $ret_function;
74: }
75: }
76:
77: // vim: et sw=4 sts=4
78: