get('Core.ColorKeywords'); } $color = trim($color); if ($color === '') { return false; } $lower = strtolower($color); if (isset($colors[$lower])) { return $colors[$lower]; } if (strpos($color, 'rgb(') !== false) { // rgb literal handling $length = strlen($color); if (strpos($color, ')') !== $length - 1) { return false; } $triad = substr($color, 4, $length - 4 - 1); $parts = explode(',', $triad); if (count($parts) !== 3) { return false; } $type = false; // to ensure that they're all the same type $new_parts = array(); foreach ($parts as $part) { $part = trim($part); if ($part === '') { return false; } $length = strlen($part); if ($part[$length - 1] === '%') { // handle percents if (!$type) { $type = 'percentage'; } elseif ($type !== 'percentage') { return false; } $num = (float)substr($part, 0, $length - 1); if ($num < 0) { $num = 0; } if ($num > 100) { $num = 100; } $new_parts[] = "$num%"; } else { // handle integers if (!$type) { $type = 'integer'; } elseif ($type !== 'integer') { return false; } $num = (int)$part; if ($num < 0) { $num = 0; } if ($num > 255) { $num = 255; } $new_parts[] = (string)$num; } } $new_triad = implode(',', $new_parts); $color = "rgb($new_triad)"; } else { // hexadecimal handling if ($color[0] === '#') { $hex = substr($color, 1); } else { $hex = $color; $color = '#' . $color; } $length = strlen($hex); if ($length !== 3 && $length !== 6) { return false; } if (!ctype_xdigit($hex)) { return false; } } return $color; } } // vim: et sw=4 sts=4