1: <?php
2:
3: /**
4: * Validates a number as defined by the CSS spec.
5: */
6: class HTMLPurifier_AttrDef_CSS_Number extends HTMLPurifier_AttrDef
7: {
8:
9: /**
10: * Indicates whether or not only positive values are allowed.
11: * @type bool
12: */
13: protected $non_negative = false;
14:
15: /**
16: * @param bool $non_negative indicates whether negatives are forbidden
17: */
18: public function __construct($non_negative = false)
19: {
20: $this->non_negative = $non_negative;
21: }
22:
23: /**
24: * @param string $number
25: * @param HTMLPurifier_Config $config
26: * @param HTMLPurifier_Context $context
27: * @return string|bool
28: * @warning Some contexts do not pass $config, $context. These
29: * variables should not be used without checking HTMLPurifier_Length
30: */
31: public function validate($number, $config, $context)
32: {
33: $number = $this->parseCDATA($number);
34:
35: if ($number === '') {
36: return false;
37: }
38: if ($number === '0') {
39: return '0';
40: }
41:
42: $sign = '';
43: switch ($number[0]) {
44: case '-':
45: if ($this->non_negative) {
46: return false;
47: }
48: $sign = '-';
49: case '+':
50: $number = substr($number, 1);
51: }
52:
53: if (ctype_digit($number)) {
54: $number = ltrim($number, '0');
55: return $number ? $sign . $number : '0';
56: }
57:
58: // Period is the only non-numeric character allowed
59: if (strpos($number, '.') === false) {
60: return false;
61: }
62:
63: list($left, $right) = explode('.', $number, 2);
64:
65: if ($left === '' && $right === '') {
66: return false;
67: }
68: if ($left !== '' && !ctype_digit($left)) {
69: return false;
70: }
71:
72: // Remove leading zeros until positive number or a zero stays left
73: if (ltrim($left, '0') != '') {
74: $left = ltrim($left, '0');
75: } else {
76: $left = '0';
77: }
78:
79: $right = rtrim($right, '0');
80:
81: if ($right === '') {
82: return $left ? $sign . $left : '0';
83: } elseif (!ctype_digit($right)) {
84: return false;
85: }
86: return $sign . $left . '.' . $right;
87: }
88: }
89:
90: // vim: et sw=4 sts=4
91: