You are here

class Kint_Parsers_Color in Devel 8

Same name and namespace in other branches
  1. 8.2 kint/kint/parsers/custom/color.php \Kint_Parsers_Color

Hierarchy

Expanded class hierarchy of Kint_Parsers_Color

File

kint/kint/parsers/custom/color.php, line 2

View source
class Kint_Parsers_Color extends kintParser {
  private static $_css3Named = array(
    'aliceblue' => '#f0f8ff',
    'antiquewhite' => '#faebd7',
    'aqua' => '#00ffff',
    'aquamarine' => '#7fffd4',
    'azure' => '#f0ffff',
    'beige' => '#f5f5dc',
    'bisque' => '#ffe4c4',
    'black' => '#000000',
    'blanchedalmond' => '#ffebcd',
    'blue' => '#0000ff',
    'blueviolet' => '#8a2be2',
    'brown' => '#a52a2a',
    'burlywood' => '#deb887',
    'cadetblue' => '#5f9ea0',
    'chartreuse' => '#7fff00',
    'chocolate' => '#d2691e',
    'coral' => '#ff7f50',
    'cornflowerblue' => '#6495ed',
    'cornsilk' => '#fff8dc',
    'crimson' => '#dc143c',
    'cyan' => '#00ffff',
    'darkblue' => '#00008b',
    'darkcyan' => '#008b8b',
    'darkgoldenrod' => '#b8860b',
    'darkgray' => '#a9a9a9',
    'darkgrey' => '#a9a9a9',
    'darkgreen' => '#006400',
    'darkkhaki' => '#bdb76b',
    'darkmagenta' => '#8b008b',
    'darkolivegreen' => '#556b2f',
    'darkorange' => '#ff8c00',
    'darkorchid' => '#9932cc',
    'darkred' => '#8b0000',
    'darksalmon' => '#e9967a',
    'darkseagreen' => '#8fbc8f',
    'darkslateblue' => '#483d8b',
    'darkslategray' => '#2f4f4f',
    'darkslategrey' => '#2f4f4f',
    'darkturquoise' => '#00ced1',
    'darkviolet' => '#9400d3',
    'deeppink' => '#ff1493',
    'deepskyblue' => '#00bfff',
    'dimgray' => '#696969',
    'dimgrey' => '#696969',
    'dodgerblue' => '#1e90ff',
    'firebrick' => '#b22222',
    'floralwhite' => '#fffaf0',
    'forestgreen' => '#228b22',
    'fuchsia' => '#ff00ff',
    'gainsboro' => '#dcdcdc',
    'ghostwhite' => '#f8f8ff',
    'gold' => '#ffd700',
    'goldenrod' => '#daa520',
    'gray' => '#808080',
    'grey' => '#808080',
    'green' => '#008000',
    'greenyellow' => '#adff2f',
    'honeydew' => '#f0fff0',
    'hotpink' => '#ff69b4',
    'indianred' => '#cd5c5c',
    'indigo' => '#4b0082',
    'ivory' => '#fffff0',
    'khaki' => '#f0e68c',
    'lavender' => '#e6e6fa',
    'lavenderblush' => '#fff0f5',
    'lawngreen' => '#7cfc00',
    'lemonchiffon' => '#fffacd',
    'lightblue' => '#add8e6',
    'lightcoral' => '#f08080',
    'lightcyan' => '#e0ffff',
    'lightgoldenrodyellow' => '#fafad2',
    'lightgray' => '#d3d3d3',
    'lightgrey' => '#d3d3d3',
    'lightgreen' => '#90ee90',
    'lightpink' => '#ffb6c1',
    'lightsalmon' => '#ffa07a',
    'lightseagreen' => '#20b2aa',
    'lightskyblue' => '#87cefa',
    'lightslategray' => '#778899',
    'lightslategrey' => '#778899',
    'lightsteelblue' => '#b0c4de',
    'lightyellow' => '#ffffe0',
    'lime' => '#00ff00',
    'limegreen' => '#32cd32',
    'linen' => '#faf0e6',
    'magenta' => '#ff00ff',
    'maroon' => '#800000',
    'mediumaquamarine' => '#66cdaa',
    'mediumblue' => '#0000cd',
    'mediumorchid' => '#ba55d3',
    'mediumpurple' => '#9370d8',
    'mediumseagreen' => '#3cb371',
    'mediumslateblue' => '#7b68ee',
    'mediumspringgreen' => '#00fa9a',
    'mediumturquoise' => '#48d1cc',
    'mediumvioletred' => '#c71585',
    'midnightblue' => '#191970',
    'mintcream' => '#f5fffa',
    'mistyrose' => '#ffe4e1',
    'moccasin' => '#ffe4b5',
    'navajowhite' => '#ffdead',
    'navy' => '#000080',
    'oldlace' => '#fdf5e6',
    'olive' => '#808000',
    'olivedrab' => '#6b8e23',
    'orange' => '#ffa500',
    'orangered' => '#ff4500',
    'orchid' => '#da70d6',
    'palegoldenrod' => '#eee8aa',
    'palegreen' => '#98fb98',
    'paleturquoise' => '#afeeee',
    'palevioletred' => '#d87093',
    'papayawhip' => '#ffefd5',
    'peachpuff' => '#ffdab9',
    'peru' => '#cd853f',
    'pink' => '#ffc0cb',
    'plum' => '#dda0dd',
    'powderblue' => '#b0e0e6',
    'purple' => '#800080',
    'red' => '#ff0000',
    'rosybrown' => '#bc8f8f',
    'royalblue' => '#4169e1',
    'saddlebrown' => '#8b4513',
    'salmon' => '#fa8072',
    'sandybrown' => '#f4a460',
    'seagreen' => '#2e8b57',
    'seashell' => '#fff5ee',
    'sienna' => '#a0522d',
    'silver' => '#c0c0c0',
    'skyblue' => '#87ceeb',
    'slateblue' => '#6a5acd',
    'slategray' => '#708090',
    'slategrey' => '#708090',
    'snow' => '#fffafa',
    'springgreen' => '#00ff7f',
    'steelblue' => '#4682b4',
    'tan' => '#d2b48c',
    'teal' => '#008080',
    'thistle' => '#d8bfd8',
    'tomato' => '#ff6347',
    'turquoise' => '#40e0d0',
    'violet' => '#ee82ee',
    'wheat' => '#f5deb3',
    'white' => '#ffffff',
    'whitesmoke' => '#f5f5f5',
    'yellow' => '#ffff00',
    'yellowgreen' => '#9acd32',
  );
  protected function _parse(&$variable) {
    if (!self::_fits($variable)) {
      return false;
    }
    $this->type = 'CSS color';
    $variants = self::_convert($variable);
    $this->value = "<div style=\"background:{$variable}\" class=\"kint-color-preview\">{$variable}</div>" . "<strong>hex :</strong> {$variants['hex']}\n" . "<strong>rgb :</strong> {$variants['rgb']}\n" . (isset($variants['name']) ? "<strong>name:</strong> {$variants['name']}\n" : '') . "<strong>hsl :</strong> {$variants['hsl']}";
  }
  private static function _fits($variable) {
    if (!is_string($variable)) {
      return false;
    }
    $var = strtolower(trim($variable));
    return isset(self::$_css3Named[$var]) || preg_match('/^(?:#[0-9A-Fa-f]{3}|#[0-9A-Fa-f]{6}|(?:rgb|hsl)a?\\s*\\((?:\\s*[0-9.%]+\\s*,?){3,4}\\))$/', $var);
  }
  private static function _convert($color) {
    $color = strtolower($color);
    $decimalColors = array();
    $variants = array(
      'hex' => null,
      'rgb' => null,
      'name' => null,
      'hsl' => null,
    );
    if (isset(self::$_css3Named[$color])) {
      $variants['name'] = $color;
      $color = self::$_css3Named[$color];
    }
    if ($color[0] === '#') {
      $variants['hex'] = $color;
      $color = substr($color, 1);
      if (strlen($color) === 6) {
        $colors = str_split($color, 2);
      }
      else {
        $colors = array(
          $color[0] . $color[0],
          $color[1] . $color[1],
          $color[2] . $color[2],
        );
      }
      $decimalColors = array_map('hexdec', $colors);
    }
    elseif (substr($color, 0, 3) === 'rgb') {
      $variants['rgb'] = $color;
      preg_match_all('#([0-9.%]+)#', $color, $matches);
      $decimalColors = $matches[1];
      foreach ($decimalColors as &$color) {
        if (strpos($color, '%') !== false) {
          $color = str_replace('%', '', $color) * 2.55;
        }
      }
    }
    elseif (substr($color, 0, 3) === 'hsl') {
      $variants['hsl'] = $color;
      preg_match_all('#([0-9.%]+)#', $color, $matches);
      $colors = $matches[1];
      $colors[0] /= 360;
      $colors[1] = str_replace('%', '', $colors[1]) / 100;
      $colors[2] = str_replace('%', '', $colors[2]) / 100;
      $decimalColors = self::_HSLtoRGB($colors);
      if (isset($colors[3])) {
        $decimalColors[] = $colors[3];
      }
    }
    if (isset($decimalColors[3])) {
      $alpha = $decimalColors[3];
      unset($decimalColors[3]);
    }
    else {
      $alpha = null;
    }
    foreach ($variants as $type => &$variant) {
      if (isset($variant)) {
        continue;
      }
      switch ($type) {
        case 'hex':
          $variant = '#';
          foreach ($decimalColors as &$color) {
            $variant .= str_pad(dechex($color), 2, "0", STR_PAD_LEFT);
          }
          $variant .= isset($alpha) ? ' (alpha omitted)' : '';
          break;
        case 'rgb':
          $rgb = $decimalColors;
          if (isset($alpha)) {
            $rgb[] = $alpha;
            $a = 'a';
          }
          else {
            $a = '';
          }
          $variant = "rgb{$a}( " . implode(', ', $rgb) . " )";
          break;
        case 'hsl':
          $rgb = self::_RGBtoHSL($decimalColors);
          if ($rgb === null) {
            unset($variants[$type]);
            break;
          }
          if (isset($alpha)) {
            $rgb[] = $alpha;
            $a = 'a';
          }
          else {
            $a = '';
          }
          $variant = "hsl{$a}( " . implode(', ', $rgb) . " )";
          break;
        case 'name':

          // [!] name in initial variants array must go after hex
          if (($key = array_search($variants['hex'], self::$_css3Named, true)) !== false) {
            $variant = $key;
          }
          else {
            unset($variants[$type]);
          }
          break;
      }
    }
    return $variants;
  }
  private static function _HSLtoRGB(array $hsl) {
    list($h, $s, $l) = $hsl;
    $m2 = $l <= 0.5 ? $l * ($s + 1) : $l + $s - $l * $s;
    $m1 = $l * 2 - $m2;
    return array(
      round(self::_hue2rgb($m1, $m2, $h + 0.33333) * 255),
      round(self::_hue2rgb($m1, $m2, $h) * 255),
      round(self::_hue2rgb($m1, $m2, $h - 0.33333) * 255),
    );
  }

  /**
   * Helper function for _color_hsl2rgb().
   */
  private static function _hue2rgb($m1, $m2, $h) {
    $h = $h < 0 ? $h + 1 : ($h > 1 ? $h - 1 : $h);
    if ($h * 6 < 1) {
      return $m1 + ($m2 - $m1) * $h * 6;
    }
    if ($h * 2 < 1) {
      return $m2;
    }
    if ($h * 3 < 2) {
      return $m1 + ($m2 - $m1) * (0.66666 - $h) * 6;
    }
    return $m1;
  }
  private static function _RGBtoHSL(array $rgb) {
    list($clrR, $clrG, $clrB) = $rgb;
    $clrMin = min($clrR, $clrG, $clrB);
    $clrMax = max($clrR, $clrG, $clrB);
    $deltaMax = $clrMax - $clrMin;
    $L = ($clrMax + $clrMin) / 510;
    if (0 == $deltaMax) {
      $H = 0;
      $S = 0;
    }
    else {
      if (0.5 > $L) {
        $S = $deltaMax / ($clrMax + $clrMin);
      }
      else {
        $S = $deltaMax / (510 - $clrMax - $clrMin);
      }
      if ($clrMax == $clrR) {
        $H = ($clrG - $clrB) / (6.0 * $deltaMax);
      }
      else {
        if ($clrMax == $clrG) {
          $H = 1 / 3 + ($clrB - $clrR) / (6.0 * $deltaMax);
        }
        else {
          $H = 2 / 3 + ($clrR - $clrG) / (6.0 * $deltaMax);
        }
      }
      if (0 > $H) {
        $H += 1;
      }
      if (1 < $H) {
        $H -= 1;
      }
    }
    return array(
      round($H * 360),
      round($S * 100) . '%',
      round($L * 100) . '%',
    );
  }

}

Members

Namesort descending Modifiers Type Description Overrides
kintParser::$_customDataTypes private static property
kintParser::$_dealingWithGlobals private static property
kintParser::$_level private static property
kintParser::$_marker private static property
kintParser::$_objectParsers private static property
kintParser::$_objects private static property
kintParser::$_placeFullStringInValue private static property
kintParser::$_skipAlternatives private static property
kintParser::escape public static function
kintParser::factory final public static function * the only public entry point to return a parsed representation of a variable * * @static * *
kintParser::reset public static function
kintParser::_checkDepth private static function
kintParser::_decorateCell private static function
kintParser::_init private static function
kintParser::_isArrayTabular private static function
kintParser::_parse_array private static function
kintParser::_parse_boolean private static function
kintParser::_parse_double private static function
kintParser::_parse_integer private static function
kintParser::_parse_null private static function
kintParser::_parse_object private static function
kintParser::_parse_resource private static function
kintParser::_parse_string private static function
kintParser::_parse_unknown private static function
kintVariableData::$access public property @var string
kintVariableData::$extendedValue public property * * the array is a separate possible representation of the dumped var
kintVariableData::$name public property @var string
kintVariableData::$operator public property @var string
kintVariableData::$size public property @var int
kintVariableData::$type public property @var string
kintVariableData::$value public property @var string inline value
kintVariableData::$_alternatives public property @var kintVariableData[] array of alternative representations for same variable, don't use in custom parsers
kintVariableData::$_supportedCharsets private static property
kintVariableData::_detectEncoding protected static function
kintVariableData::_isSequential protected static function * returns whether the array: * 1) is numeric and * 2) in sequence starting from zero * *
kintVariableData::_strlen protected static function
kintVariableData::_substr protected static function
Kint_Parsers_Color::$_css3Named private static property
Kint_Parsers_Color::_convert private static function
Kint_Parsers_Color::_fits private static function
Kint_Parsers_Color::_HSLtoRGB private static function
Kint_Parsers_Color::_hue2rgb private static function * Helper function for _color_hsl2rgb().
Kint_Parsers_Color::_parse protected function * main and usually single method a custom parser must implement * * Overrides kintParser::_parse
Kint_Parsers_Color::_RGBtoHSL private static function