Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 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