| 1: | <?php
|
| 2: |
|
| 3: | |
| 4: | |
| 5: |
|
| 6: | class HTMLPurifier_AttrDef_CSS_Number extends HTMLPurifier_AttrDef
|
| 7: | {
|
| 8: |
|
| 9: | |
| 10: | |
| 11: | |
| 12: |
|
| 13: | protected $non_negative = false;
|
| 14: |
|
| 15: | |
| 16: | |
| 17: |
|
| 18: | public function __construct($non_negative = false)
|
| 19: | {
|
| 20: | $this->non_negative = $non_negative;
|
| 21: | }
|
| 22: |
|
| 23: | |
| 24: | |
| 25: | |
| 26: | |
| 27: | |
| 28: | |
| 29: | |
| 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: |
|
| 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: |
|
| 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: |
|
| 91: | |