<s> import sublime <EOL> import sublime_plugin <EOL> import re <EOL> import string <EOL> class RgbToHslCommand ( sublime_plugin . TextCommand ) : <EOL> def run ( self , edit , convert_all = False , force_alpha = False ) : <EOL> self . edit = edit <EOL> if convert_all : <EOL> selection = self . view . find_all ( '<STR_LIT>' , sublime . IGNORECASE ) <EOL> selection = reversed ( selection ) <EOL> else : <EOL> selection = self . view . sel ( ) <EOL> for region in selection : <EOL> if not region . empty ( ) : <EOL> word = self . view . substr ( region ) <EOL> css_hsl = convert_to_hsl ( word , force_alpha ) <EOL> if isinstance ( css_hsl , str ) : <EOL> self . view . replace ( self . edit , region , css_hsl ) <EOL> def convert_to_hsl ( word , force_alpha = False ) : <EOL> hex_re = re . compile ( '<STR_LIT>' , re . IGNORECASE ) <EOL> rgb_re = re . compile ( '<STR_LIT>' , re . IGNORECASE ) <EOL> hex_match = hex_re . match ( word ) <EOL> rgb_match = rgb_re . match ( word ) <EOL> if hex_match : <EOL> hex_color = hex_match . group ( <NUM_LIT:1> ) <EOL> if len ( hex_color ) == <NUM_LIT:6> : <EOL> r , g , b = tuple ( int ( hex_color [ i : i + <NUM_LIT:2> ] , <NUM_LIT:16> ) for i in range ( <NUM_LIT:0> , <NUM_LIT:6> , <NUM_LIT:2> ) ) <EOL> else : <EOL> r , g , b = tuple ( int ( hex_color [ i : i + <NUM_LIT:1> ] , <NUM_LIT:16> ) * <NUM_LIT> for i in range ( <NUM_LIT:0> , <NUM_LIT:3> ) ) <EOL> if force_alpha : <EOL> return rgb_to_hsl ( r , g , b , <NUM_LIT:1> ) <EOL> else : <EOL> return rgb_to_hsl ( r , g , b ) <EOL> elif rgb_match : <EOL> rgb_list = rgb_match . group ( <NUM_LIT:1> ) . split ( "<STR_LIT:U+002C>" ) <EOL> rgb_list_len = len ( rgb_list ) <EOL> if <NUM_LIT:3> <= rgb_list_len <= <NUM_LIT:4> : <EOL> r , g , b = list ( map ( get_decimal , rgb_list [ <NUM_LIT:0> : <NUM_LIT:3> ] ) ) <EOL> if rgb_list_len == <NUM_LIT:4> : <EOL> a = rgb_list [ <NUM_LIT:3> ] . strip ( ) <EOL> elif force_alpha : <EOL> a = <NUM_LIT:1> <EOL> else : <EOL> a = None <EOL> return rgb_to_hsl ( r , g , b , a ) <EOL> def rgb_to_hsl ( r , g , b , a = None ) : <EOL> if not ( <NUM_LIT:0> <= r <= <NUM_LIT:255> ) : raise ValueError ( "<STR_LIT>" ) <EOL> if not ( <NUM_LIT:0> <= g <= <NUM_LIT:255> ) : raise ValueError ( "<STR_LIT>" ) <EOL> if not ( <NUM_LIT:0> <= b <= <NUM_LIT:255> ) : raise ValueError ( "<STR_LIT>" ) <EOL> var_R = r / <NUM_LIT> <EOL> var_G = g / <NUM_LIT> <EOL> var_B = b / <NUM_LIT> <EOL> var_Min = min ( var_R , var_G , var_B ) <EOL> var_Max = max ( var_R , var_G , var_B ) <EOL> del_Max = var_Max - var_Min <EOL> l = ( var_Max + var_Min ) / <NUM_LIT> <EOL> h = <NUM_LIT:0.0> <EOL> s = <NUM_LIT:0.0> <EOL> if del_Max != <NUM_LIT:0.0> : <EOL> if l < <NUM_LIT:0.5> : s = del_Max / ( var_Max + var_Min ) <EOL> else : s = del_Max / ( <NUM_LIT> - var_Max - var_Min ) <EOL> del_R = ( ( ( var_Max - var_R ) / <NUM_LIT> ) + ( del_Max / <NUM_LIT> ) ) / del_Max <EOL> del_G = ( ( ( var_Max - var_G ) / <NUM_LIT> ) + ( del_Max / <NUM_LIT> ) ) / del_Max <EOL> del_B = ( ( ( var_Max - var_B ) / <NUM_LIT> ) + ( del_Max / <NUM_LIT> ) ) / del_Max <EOL> if var_R == var_Max : h = del_B - del_G <EOL> elif var_G == var_Max : h = ( <NUM_LIT:1.0> / <NUM_LIT> ) + del_R - del_B <EOL> elif var_B == var_Max : h = ( <NUM_LIT> / <NUM_LIT> ) + del_G - del_R <EOL> while h < <NUM_LIT:0.0> : h += <NUM_LIT:1.0> <EOL> while h > <NUM_LIT:1.0> : h -= <NUM_LIT:1.0> <EOL> if a : <EOL> if float ( a ) > <NUM_LIT:1> : <EOL> a = <NUM_LIT:1> <EOL> elif float ( a ) < <NUM_LIT:0> : <EOL> a = <NUM_LIT:0> <EOL> return css_hsl ( h , s , l , a ) <EOL> else : <EOL> return css_hsl ( h , s , l ) <EOL> def percent_str ( val ) : <EOL> if val > <NUM_LIT:1> : <EOL> tmp_val = val <EOL> else : <EOL> tmp_val = round ( val * <NUM_LIT:100> ) <EOL> return str ( int ( tmp_val ) ) + "<STR_LIT:%>" <EOL> def css_hsl ( h , s , l , a = None ) : <EOL> hsl_str = str ( int ( round ( h * <NUM_LIT> ) ) ) + "<STR_LIT:U+002CU+0020>" + percent_str ( s ) + "<STR_LIT:U+002CU+0020>" + percent_str ( l ) <EOL> if a : <EOL> if ( <NUM_LIT:0> < float ( a ) < <NUM_LIT:1> ) : <EOL> a = round ( float ( a ) , <NUM_LIT:3> ) <EOL> return "<STR_LIT>" + hsl_str + "<STR_LIT:U+002CU+0020>" + str ( a ) + "<STR_LIT:)>" <EOL> else : <EOL> return "<STR_LIT>" + hsl_str + "<STR_LIT:)>" <EOL> def get_decimal ( val ) : <EOL> val_strip = val . strip ( ) <EOL> if isinstance ( val_strip , str ) and val_strip [ - <NUM_LIT:1> ] == "<STR_LIT:%>" : <EOL> return round ( int ( val_strip [ : - <NUM_LIT:1> ] ) * <NUM_LIT:255> / <NUM_LIT:100> ) <EOL> else : <EOL> return int ( val_strip ) </s>
