Yaffs site version 1.1
[yaffs-website] / vendor / ezyang / htmlpurifier / library / HTMLPurifier / AttrDef / Integer.php
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