1: | <?php |
2: | |
3: | /** |
4: | * Validates an integer. |
5: | * @note While this class was modeled off the CSS definition, no currently |
6: | * allowed CSS uses this type. The properties that do are: widows, |
7: | * orphans, z-index, counter-increment, counter-reset. Some of the |
8: | * HTML attributes, however, find use for a non-negative version of this. |
9: | */ |
10: | class HTMLPurifier_AttrDef_Integer extends HTMLPurifier_AttrDef |
11: | { |
12: | |
13: | /** |
14: | * Whether or not negative values are allowed. |
15: | * @type bool |
16: | */ |
17: | protected $negative = true; |
18: | |
19: | /** |
20: | * Whether or not zero is allowed. |
21: | * @type bool |
22: | */ |
23: | protected $zero = true; |
24: | |
25: | /** |
26: | * Whether or not positive values are allowed. |
27: | * @type bool |
28: | */ |
29: | protected $positive = true; |
30: | |
31: | /** |
32: | * @param $negative Bool indicating whether or not negative values are allowed |
33: | * @param $zero Bool indicating whether or not zero is allowed |
34: | * @param $positive Bool indicating whether or not positive values are allowed |
35: | */ |
36: | public function __construct($negative = true, $zero = true, $positive = true) |
37: | { |
38: | $this->negative = $negative; |
39: | $this->zero = $zero; |
40: | $this->positive = $positive; |
41: | } |
42: | |
43: | /** |
44: | * @param string $integer |
45: | * @param HTMLPurifier_Config $config |
46: | * @param HTMLPurifier_Context $context |
47: | * @return bool|string |
48: | */ |
49: | public function validate($integer, $config, $context) |
50: | { |
51: | $integer = $this->parseCDATA($integer); |
52: | if ($integer === '') { |
53: | return false; |
54: | } |
55: | |
56: | // we could possibly simply typecast it to integer, but there are |
57: | // certain fringe cases that must not return an integer. |
58: | |
59: | // clip leading sign |
60: | if ($this->negative && $integer[0] === '-') { |
61: | $digits = substr($integer, 1); |
62: | if ($digits === '0') { |
63: | $integer = '0'; |
64: | } // rm minus sign for zero |
65: | } elseif ($this->positive && $integer[0] === '+') { |
66: | $digits = $integer = substr($integer, 1); // rm unnecessary plus |
67: | } else { |
68: | $digits = $integer; |
69: | } |
70: | |
71: | // test if it's numeric |
72: | if (!ctype_digit($digits)) { |
73: | return false; |
74: | } |
75: | |
76: | // perform scope tests |
77: | if (!$this->zero && $integer == 0) { |
78: | return false; |
79: | } |
80: | if (!$this->positive && $integer > 0) { |
81: | return false; |
82: | } |
83: | if (!$this->negative && $integer < 0) { |
84: | return false; |
85: | } |
86: | |
87: | return $integer; |
88: | } |
89: | } |
90: | |
91: | // vim: et sw=4 sts=4 |
92: |